diff --git a/tests/org.eclipse.core.tests.resources/.settings/org.eclipse.jdt.core.prefs b/tests/org.eclipse.core.tests.resources/.settings/org.eclipse.jdt.core.prefs
index 4299cdb..51ee78b 100644
--- a/tests/org.eclipse.core.tests.resources/.settings/org.eclipse.jdt.core.prefs
+++ b/tests/org.eclipse.core.tests.resources/.settings/org.eclipse.jdt.core.prefs
@@ -120,8 +120,10 @@
 org.eclipse.jdt.core.compiler.problem.unusedWarningToken=warning
 org.eclipse.jdt.core.compiler.problem.varargsArgumentNeedCast=warning
 org.eclipse.jdt.core.compiler.source=1.8
+org.eclipse.jdt.core.formatter.align_fields_grouping_blank_lines=2147483647
 org.eclipse.jdt.core.formatter.align_type_members_on_columns=false
 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_allocation_expression=16
+org.eclipse.jdt.core.formatter.alignment_for_arguments_in_annotation=0
 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_enum_constant=16
 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_explicit_constructor_call=16
 org.eclipse.jdt.core.formatter.alignment_for_arguments_in_method_invocation=16
@@ -132,15 +134,22 @@
 org.eclipse.jdt.core.formatter.alignment_for_conditional_expression=80
 org.eclipse.jdt.core.formatter.alignment_for_enum_constants=0
 org.eclipse.jdt.core.formatter.alignment_for_expressions_in_array_initializer=16
+org.eclipse.jdt.core.formatter.alignment_for_expressions_in_for_loop_header=0
+org.eclipse.jdt.core.formatter.alignment_for_method_declaration=0
 org.eclipse.jdt.core.formatter.alignment_for_multiple_fields=16
+org.eclipse.jdt.core.formatter.alignment_for_parameterized_type_references=0
 org.eclipse.jdt.core.formatter.alignment_for_parameters_in_constructor_declaration=16
 org.eclipse.jdt.core.formatter.alignment_for_parameters_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_resources_in_try=80
 org.eclipse.jdt.core.formatter.alignment_for_selector_in_method_invocation=16
 org.eclipse.jdt.core.formatter.alignment_for_superclass_in_type_declaration=16
 org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_enum_declaration=16
 org.eclipse.jdt.core.formatter.alignment_for_superinterfaces_in_type_declaration=16
 org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_constructor_declaration=16
 org.eclipse.jdt.core.formatter.alignment_for_throws_clause_in_method_declaration=16
+org.eclipse.jdt.core.formatter.alignment_for_type_arguments=0
+org.eclipse.jdt.core.formatter.alignment_for_type_parameters=0
+org.eclipse.jdt.core.formatter.alignment_for_union_type_in_multicatch=16
 org.eclipse.jdt.core.formatter.blank_lines_after_imports=1
 org.eclipse.jdt.core.formatter.blank_lines_after_package=1
 org.eclipse.jdt.core.formatter.blank_lines_before_field=0
@@ -160,11 +169,13 @@
 org.eclipse.jdt.core.formatter.brace_position_for_constructor_declaration=end_of_line
 org.eclipse.jdt.core.formatter.brace_position_for_enum_constant=end_of_line
 org.eclipse.jdt.core.formatter.brace_position_for_enum_declaration=end_of_line
+org.eclipse.jdt.core.formatter.brace_position_for_lambda_body=end_of_line
 org.eclipse.jdt.core.formatter.brace_position_for_method_declaration=end_of_line
 org.eclipse.jdt.core.formatter.brace_position_for_switch=end_of_line
 org.eclipse.jdt.core.formatter.brace_position_for_type_declaration=end_of_line
 org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_block_comment=false
 org.eclipse.jdt.core.formatter.comment.clear_blank_lines_in_javadoc_comment=false
+org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position=false
 org.eclipse.jdt.core.formatter.comment.format_block_comments=false
 org.eclipse.jdt.core.formatter.comment.format_header=false
 org.eclipse.jdt.core.formatter.comment.format_html=true
@@ -176,10 +187,16 @@
 org.eclipse.jdt.core.formatter.comment.insert_new_line_before_root_tags=insert
 org.eclipse.jdt.core.formatter.comment.insert_new_line_for_parameter=do not insert
 org.eclipse.jdt.core.formatter.comment.line_length=80
+org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries=true
+org.eclipse.jdt.core.formatter.comment.new_lines_at_javadoc_boundaries=true
+org.eclipse.jdt.core.formatter.comment.preserve_white_space_between_code_and_line_comments=false
 org.eclipse.jdt.core.formatter.compact_else_if=true
 org.eclipse.jdt.core.formatter.continuation_indentation=2
 org.eclipse.jdt.core.formatter.continuation_indentation_for_array_initializer=2
+org.eclipse.jdt.core.formatter.disabling_tag=@formatter\:off
+org.eclipse.jdt.core.formatter.enabling_tag=@formatter\:on
 org.eclipse.jdt.core.formatter.format_guardian_clause_on_one_line=false
+org.eclipse.jdt.core.formatter.format_line_comment_starting_on_first_column=true
 org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_annotation_declaration_header=true
 org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_constant_header=true
 org.eclipse.jdt.core.formatter.indent_body_declarations_compare_to_enum_declaration_header=true
@@ -191,13 +208,16 @@
 org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_cases=true
 org.eclipse.jdt.core.formatter.indent_switchstatements_compare_to_switch=true
 org.eclipse.jdt.core.formatter.indentation.size=4
+org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_enum_constant=insert
 org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_field=insert
 org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_local_variable=insert
 org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_method=insert
 org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_package=insert
 org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_parameter=insert
 org.eclipse.jdt.core.formatter.insert_new_line_after_annotation_on_type=insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_label=do not insert
 org.eclipse.jdt.core.formatter.insert_new_line_after_opening_brace_in_array_initializer=do not insert
+org.eclipse.jdt.core.formatter.insert_new_line_after_type_annotation=do not insert
 org.eclipse.jdt.core.formatter.insert_new_line_at_end_of_file_if_missing=do not insert
 org.eclipse.jdt.core.formatter.insert_new_line_before_catch_in_try_statement=do not insert
 org.eclipse.jdt.core.formatter.insert_new_line_before_closing_brace_in_array_initializer=do not insert
@@ -245,6 +265,7 @@
 org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_arguments=insert
 org.eclipse.jdt.core.formatter.insert_space_after_comma_in_type_parameters=insert
 org.eclipse.jdt.core.formatter.insert_space_after_ellipsis=insert
+org.eclipse.jdt.core.formatter.insert_space_after_lambda_arrow=insert
 org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_parameterized_type_reference=do not insert
 org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_arguments=do not insert
 org.eclipse.jdt.core.formatter.insert_space_after_opening_angle_bracket_in_type_parameters=do not insert
@@ -263,12 +284,14 @@
 org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_parenthesized_expression=do not insert
 org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_switch=do not insert
 org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_try=do not insert
 org.eclipse.jdt.core.formatter.insert_space_after_opening_paren_in_while=do not insert
 org.eclipse.jdt.core.formatter.insert_space_after_postfix_operator=do not insert
 org.eclipse.jdt.core.formatter.insert_space_after_prefix_operator=do not insert
 org.eclipse.jdt.core.formatter.insert_space_after_question_in_conditional=insert
 org.eclipse.jdt.core.formatter.insert_space_after_question_in_wildcard=do not insert
 org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_for=insert
+org.eclipse.jdt.core.formatter.insert_space_after_semicolon_in_try_resources=insert
 org.eclipse.jdt.core.formatter.insert_space_after_unary_operator=do not insert
 org.eclipse.jdt.core.formatter.insert_space_before_and_in_type_parameter=insert
 org.eclipse.jdt.core.formatter.insert_space_before_assignment_operator=insert
@@ -292,6 +315,7 @@
 org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_parenthesized_expression=do not insert
 org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_switch=do not insert
 org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_synchronized=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_try=do not insert
 org.eclipse.jdt.core.formatter.insert_space_before_closing_paren_in_while=do not insert
 org.eclipse.jdt.core.formatter.insert_space_before_colon_in_assert=insert
 org.eclipse.jdt.core.formatter.insert_space_before_colon_in_case=insert
@@ -319,6 +343,7 @@
 org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_arguments=do not insert
 org.eclipse.jdt.core.formatter.insert_space_before_comma_in_type_parameters=do not insert
 org.eclipse.jdt.core.formatter.insert_space_before_ellipsis=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_lambda_arrow=insert
 org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_parameterized_type_reference=do not insert
 org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_arguments=do not insert
 org.eclipse.jdt.core.formatter.insert_space_before_opening_angle_bracket_in_type_parameters=do not insert
@@ -347,6 +372,7 @@
 org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_parenthesized_expression=do not insert
 org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_switch=insert
 org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_synchronized=insert
+org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_try=insert
 org.eclipse.jdt.core.formatter.insert_space_before_opening_paren_in_while=insert
 org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_return=insert
 org.eclipse.jdt.core.formatter.insert_space_before_parenthesized_expression_in_throw=insert
@@ -356,6 +382,7 @@
 org.eclipse.jdt.core.formatter.insert_space_before_question_in_wildcard=do not insert
 org.eclipse.jdt.core.formatter.insert_space_before_semicolon=do not insert
 org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_for=do not insert
+org.eclipse.jdt.core.formatter.insert_space_before_semicolon_in_try_resources=do not insert
 org.eclipse.jdt.core.formatter.insert_space_before_unary_operator=do not insert
 org.eclipse.jdt.core.formatter.insert_space_between_brackets_in_array_type_reference=do not insert
 org.eclipse.jdt.core.formatter.insert_space_between_empty_braces_in_array_initializer=do not insert
@@ -365,16 +392,37 @@
 org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_enum_constant=do not insert
 org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_declaration=do not insert
 org.eclipse.jdt.core.formatter.insert_space_between_empty_parens_in_method_invocation=do not insert
+org.eclipse.jdt.core.formatter.join_lines_in_comments=true
+org.eclipse.jdt.core.formatter.join_wrapped_lines=true
 org.eclipse.jdt.core.formatter.keep_else_statement_on_same_line=false
 org.eclipse.jdt.core.formatter.keep_empty_array_initializer_on_one_line=false
 org.eclipse.jdt.core.formatter.keep_imple_if_on_one_line=false
 org.eclipse.jdt.core.formatter.keep_then_statement_on_same_line=false
 org.eclipse.jdt.core.formatter.lineSplit=800
+org.eclipse.jdt.core.formatter.never_indent_block_comments_on_first_column=false
+org.eclipse.jdt.core.formatter.never_indent_line_comments_on_first_column=false
 org.eclipse.jdt.core.formatter.number_of_blank_lines_at_beginning_of_method_body=0
 org.eclipse.jdt.core.formatter.number_of_empty_lines_to_preserve=1
+org.eclipse.jdt.core.formatter.parentheses_positions_in_annotation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_catch_clause=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_enum_constant_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_for_statment=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_if_while_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_lambda_declaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_delcaration=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_method_invocation=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_switch_statement=common_lines
+org.eclipse.jdt.core.formatter.parentheses_positions_in_try_clause=common_lines
 org.eclipse.jdt.core.formatter.put_empty_statement_on_new_line=false
 org.eclipse.jdt.core.formatter.tabulation.char=tab
 org.eclipse.jdt.core.formatter.tabulation.size=4
+org.eclipse.jdt.core.formatter.use_on_off_tags=false
 org.eclipse.jdt.core.formatter.use_tabs_only_for_leading_indentations=false
+org.eclipse.jdt.core.formatter.wrap_before_assignment_operator=false
+org.eclipse.jdt.core.formatter.wrap_before_binary_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_conditional_operator=true
+org.eclipse.jdt.core.formatter.wrap_before_or_operator_multicatch=true
+org.eclipse.jdt.core.formatter.wrap_outer_expressions_when_nested=true
 org.eclipse.jdt.core.incompatibleJDKLevel=ignore
 org.eclipse.jdt.core.incompleteClasspath=error
+org.eclipse.jdt.core.javaFormatter=org.eclipse.jdt.core.defaultJavaFormatter
diff --git a/tests/org.eclipse.core.tests.resources/.settings/org.eclipse.jdt.ui.prefs b/tests/org.eclipse.core.tests.resources/.settings/org.eclipse.jdt.ui.prefs
index afb820e..0e8f501 100644
--- a/tests/org.eclipse.core.tests.resources/.settings/org.eclipse.jdt.ui.prefs
+++ b/tests/org.eclipse.core.tests.resources/.settings/org.eclipse.jdt.ui.prefs
@@ -1,8 +1,7 @@
-#Mon Apr 20 16:51:24 EDT 2009
 eclipse.preferences.version=1
 editor_save_participant_org.eclipse.jdt.ui.postsavelistener.cleanup=true
 formatter_profile=_core
-formatter_settings_version=11
+formatter_settings_version=13
 internal.default.compliance=default
 org.eclipse.jdt.ui.ignorelowercasenames=true
 org.eclipse.jdt.ui.importorder=;
@@ -16,15 +15,18 @@
 sp_cleanup.add_missing_methods=false
 sp_cleanup.add_missing_nls_tags=false
 sp_cleanup.add_missing_override_annotations=true
+sp_cleanup.add_missing_override_annotations_interface_methods=false
 sp_cleanup.add_serial_version_id=false
 sp_cleanup.always_use_blocks=true
 sp_cleanup.always_use_parentheses_in_expressions=false
 sp_cleanup.always_use_this_for_non_static_field_access=false
 sp_cleanup.always_use_this_for_non_static_method_access=false
-sp_cleanup.convert_to_enhanced_for_loop=false
+sp_cleanup.convert_functional_interfaces=false
+sp_cleanup.convert_to_enhanced_for_loop=true
 sp_cleanup.correct_indentation=false
 sp_cleanup.format_source_code=true
-sp_cleanup.format_source_code_changes_only=false
+sp_cleanup.format_source_code_changes_only=true
+sp_cleanup.insert_inferred_type_arguments=false
 sp_cleanup.make_local_variable_final=false
 sp_cleanup.make_parameters_final=false
 sp_cleanup.make_private_fields_final=true
@@ -32,7 +34,7 @@
 sp_cleanup.make_variable_declarations_final=true
 sp_cleanup.never_use_blocks=false
 sp_cleanup.never_use_parentheses_in_expressions=true
-sp_cleanup.on_save_use_additional_actions=false
+sp_cleanup.on_save_use_additional_actions=true
 sp_cleanup.organize_imports=true
 sp_cleanup.qualify_static_field_accesses_with_declaring_class=false
 sp_cleanup.qualify_static_member_accesses_through_instances_with_declaring_class=true
@@ -40,12 +42,13 @@
 sp_cleanup.qualify_static_member_accesses_with_declaring_class=false
 sp_cleanup.qualify_static_method_accesses_with_declaring_class=false
 sp_cleanup.remove_private_constructors=true
-sp_cleanup.remove_trailing_whitespaces=false
+sp_cleanup.remove_redundant_type_arguments=false
+sp_cleanup.remove_trailing_whitespaces=true
 sp_cleanup.remove_trailing_whitespaces_all=true
 sp_cleanup.remove_trailing_whitespaces_ignore_empty=false
 sp_cleanup.remove_unnecessary_casts=true
 sp_cleanup.remove_unnecessary_nls_tags=false
-sp_cleanup.remove_unused_imports=false
+sp_cleanup.remove_unused_imports=true
 sp_cleanup.remove_unused_local_variables=false
 sp_cleanup.remove_unused_private_fields=true
 sp_cleanup.remove_unused_private_members=false
@@ -53,8 +56,10 @@
 sp_cleanup.remove_unused_private_types=true
 sp_cleanup.sort_members=false
 sp_cleanup.sort_members_all=false
-sp_cleanup.use_blocks=false
+sp_cleanup.use_anonymous_class_creation=false
+sp_cleanup.use_blocks=true
 sp_cleanup.use_blocks_only_for_return_and_throw=false
+sp_cleanup.use_lambda=false
 sp_cleanup.use_parentheses_in_expressions=false
 sp_cleanup.use_this_for_non_static_field_access=false
 sp_cleanup.use_this_for_non_static_field_access_only_if_necessary=true
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/filesystem/CreateDirectoryTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/filesystem/CreateDirectoryTest.java
index 8e31033..5480752 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/filesystem/CreateDirectoryTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/filesystem/CreateDirectoryTest.java
@@ -147,11 +147,13 @@
 	}
 
 	public void testParentDeviceNotExistsInLocalFile() {
-		if (!Platform.getOS().equals(Platform.OS_WIN32))
+		if (!Platform.getOS().equals(Platform.OS_WIN32)) {
 			return;
+		}
 		String device = findNonExistingDevice();
-		if (device == null)
+		if (device == null) {
 			return;
+		}
 
 		try {
 			IFileStore localFileTopDir = EFS.getStore(URI.create("file:/" + device + ":" + getUniqueString()));
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/filesystem/FileCacheTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/filesystem/FileCacheTest.java
index d9b5eab..079922d 100755
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/filesystem/FileCacheTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/filesystem/FileCacheTest.java
@@ -37,23 +37,29 @@
 	 * Overrides generic method from Assert to perform proper array equality test.
 	 */
 	public void assertEquals(String message, byte[] expected, byte[] actual) {
-		if (expected.length != actual.length)
+		if (expected.length != actual.length) {
 			fail(message + " arrays of different length");
+		}
 		assertEquals(message + " different length", expected.length, actual.length);
-		for (int i = 0; i < actual.length; i++)
-			if (expected[i] != actual[i])
+		for (int i = 0; i < actual.length; i++) {
+			if (expected[i] != actual[i]) {
 				fail(message + " arrays differ at position " + i + "; expected: " + expected[i] + " but was: " + actual[i]);
+			}
+		}
 	}
 
 	/**
 	 * Overrides generic method from Assert to perform proper array equality test.
 	 */
 	public void assertNotSame(String message, byte[] expected, byte[] actual) {
-		if (expected.length != actual.length)
+		if (expected.length != actual.length) {
 			return;
-		for (int i = 0; i < actual.length; i++)
-			if (expected[i] != actual[i])
+		}
+		for (int i = 0; i < actual.length; i++) {
+			if (expected[i] != actual[i]) {
 				return;
+			}
+		}
 		fail(message + " arrays should be different, but they are not: " + expected);
 	}
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/filesystem/FileStoreTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/filesystem/FileStoreTest.java
index 3f3431a..57f7471 100755
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/filesystem/FileStoreTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/filesystem/FileStoreTest.java
@@ -39,8 +39,9 @@
 	}
 
 	private IFileStore createDir(IFileStore store, boolean clear) throws CoreException {
-		if (clear && store.fetchInfo().exists())
+		if (clear && store.fetchInfo().exists()) {
 			store.delete(EFS.NONE, null);
+		}
 		store.mkdir(EFS.NONE, null);
 		IFileInfo info = store.fetchInfo();
 		assertTrue("createDir.1", info.exists());
@@ -114,8 +115,9 @@
 		IFileStore[] tempDirectories = getFileStoresOnTwoVolumes();
 
 		/* test if we are in the adequate environment */
-		if (tempDirectories == null || tempDirectories.length < 2 || tempDirectories[0] == null || tempDirectories[1] == null)
+		if (tempDirectories == null || tempDirectories.length < 2 || tempDirectories[0] == null || tempDirectories[1] == null) {
 			return;
+		}
 
 		/* build scenario */
 		// create source root folder
@@ -236,8 +238,9 @@
 
 		/* copy a big file to test progress monitor */
 		StringBuffer sb = new StringBuffer();
-		for (int i = 0; i < 1000; i++)
+		for (int i = 0; i < 1000; i++) {
 			sb.append("asdjhasldhaslkfjhasldkfjhasdlkfjhasdlfkjhasdflkjhsdaf");
+		}
 		IFileStore bigFile = temp.getChild("bigFile");
 		createFile(bigFile, sb.toString());
 		assertTrue("7.1", bigFile.fetchInfo().exists());
@@ -260,8 +263,9 @@
 		IFileStore[] tempDirectories = getFileStoresOnTwoVolumes();
 
 		/* test if we are in the adequate environment */
-		if (tempDirectories == null || tempDirectories.length < 2 || tempDirectories[0] == null || tempDirectories[1] == null)
+		if (tempDirectories == null || tempDirectories.length < 2 || tempDirectories[0] == null || tempDirectories[1] == null) {
 			return;
+		}
 
 		/* build scenario */
 		/* get the source folder */
@@ -433,8 +437,9 @@
 		IFileStore[] tempDirectories = getFileStoresOnTwoVolumes();
 
 		/* test if we are in the adequate environment */
-		if (tempDirectories == null || tempDirectories.length < 2 || tempDirectories[0] == null || tempDirectories[1] == null)
+		if (tempDirectories == null || tempDirectories.length < 2 || tempDirectories[0] == null || tempDirectories[1] == null) {
 			return;
+		}
 
 		/* build scenario */
 		/* get the source folder */
@@ -558,8 +563,9 @@
 	}
 
 	private void testAttribute(int attribute) throws CoreException {
-		if (!isAttributeSupported(attribute))
+		if (!isAttributeSupported(attribute)) {
 			return;
+		}
 
 		IPath root = getWorkspace().getRoot().getLocation().append("" + new Date().getTime());
 		IFileStore targetFolder = createDir(root.toString(), true);
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/filesystem/FileSystemTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/filesystem/FileSystemTest.java
index f80f57f..3f55287 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/filesystem/FileSystemTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/filesystem/FileSystemTest.java
@@ -54,9 +54,10 @@
 		//check that the parent knows about it
 		try {
 			IFileInfo[] children = store.getParent().childInfos(EFS.NONE, getMonitor());
-			for (int i = 0; i < children.length; i++) {
-				if (children[i].getName().equals(store.getName()))
+			for (IFileInfo element : children) {
+				if (element.getName().equals(store.getName())) {
 					return;
+				}
 			}
 			assertTrue(message, false);
 		} catch (CoreException e) {
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/filesystem/SymlinkTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/filesystem/SymlinkTest.java
index da68598..4615a10 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/filesystem/SymlinkTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/filesystem/SymlinkTest.java
@@ -106,8 +106,9 @@
 
 	public void testBrokenSymlinkAttributes() {
 		// Only activate this test if testing of symbolic links is possible.
-		if (!canCreateSymLinks())
+		if (!canCreateSymLinks()) {
 			return;
+		}
 		long testStartTime = System.currentTimeMillis();
 		makeLinkStructure();
 		//break links by removing actual dir and file
@@ -153,8 +154,9 @@
 	// Moving a broken symlink is possible.
 	public void testBrokenSymlinkMove() throws Exception {
 		// Only activate this test if testing of symbolic links is possible.
-		if (!canCreateSymLinks())
+		if (!canCreateSymLinks()) {
 			return;
+		}
 		makeLinkStructure();
 		ensureDoesNotExist(aFile);
 		ensureDoesNotExist(aDir);
@@ -185,10 +187,11 @@
 	}
 
 	private boolean containsSymlink(IFileInfo[] infos, String link) {
-		for (int i = 0; i < infos.length; i++) {
-			if (link.equals(infos[i].getName())) {
-				if (infos[i].getAttribute(EFS.ATTRIBUTE_SYMLINK))
+		for (IFileInfo info : infos) {
+			if (link.equals(info.getName())) {
+				if (info.getAttribute(EFS.ATTRIBUTE_SYMLINK)) {
 					return true;
+				}
 			}
 		}
 		return false;
@@ -197,8 +200,9 @@
 	// Removing a broken symlink is possible.
 	public void testBrokenSymlinkRemove() throws Exception {
 		// Only activate this test if testing of symbolic links is possible.
-		if (!canCreateSymLinks())
+		if (!canCreateSymLinks()) {
 			return;
+		}
 		makeLinkStructure();
 		ensureDoesNotExist(aFile);
 		ensureDoesNotExist(aDir);
@@ -216,8 +220,9 @@
 
 	public void testRecursiveSymlink() throws Exception {
 		// Only activate this test if testing of symbolic links is possible.
-		if (!canCreateSymLinks())
+		if (!canCreateSymLinks()) {
 			return;
+		}
 		mkLink(baseStore, "l1", "l2", false);
 		mkLink(baseStore, "l2", "l1", false);
 		IFileStore l1 = baseStore.getChild("l1");
@@ -266,8 +271,9 @@
 
 	public void testSymlinkAttributes() {
 		// Only activate this test if testing of symbolic links is possible.
-		if (!canCreateSymLinks())
+		if (!canCreateSymLinks()) {
 			return;
+		}
 		makeLinkStructure();
 		assertFalse(iFile.getAttribute(EFS.ATTRIBUTE_SYMLINK));
 		assertFalse(iDir.getAttribute(EFS.ATTRIBUTE_SYMLINK));
@@ -306,8 +312,9 @@
 	// Reading from a directory pointed to by a link is possible.
 	public void testSymlinkDirRead() throws Exception {
 		// Only activate this test if testing of symbolic links is possible.
-		if (!canCreateSymLinks())
+		if (!canCreateSymLinks()) {
 			return;
+		}
 		makeLinkStructure();
 		IFileStore childDir = aDir.getChild("subDir");
 		ensureExists(childDir, true);
@@ -323,8 +330,9 @@
 	// Writing to symlinked dir.
 	public void testSymlinkDirWrite() throws Exception {
 		// Only activate this test if testing of symbolic links is possible.
-		if (!canCreateSymLinks())
+		if (!canCreateSymLinks()) {
 			return;
+		}
 		makeLinkStructure();
 		IFileStore childFile = llDir.getChild("subFile");
 		ensureExists(childFile, false);
@@ -345,8 +353,9 @@
 		} catch (CoreException ce) {
 			exceptionThrown = true;
 		}
-		if (out != null)
+		if (out != null) {
 			out.close();
+		}
 		assertNull(out);
 		assertTrue(exceptionThrown);
 	}
@@ -366,8 +375,9 @@
 	 */
 	public void _testSymlinkExtendedChars() throws Exception {
 		// Only activate this test if testing of symbolic links is possible.
-		if (!canCreateSymLinks())
+		if (!canCreateSymLinks()) {
 			return;
+		}
 		IFileStore childDir = baseStore.getChild(specialCharName);
 		ensureExists(childDir, true);
 		IFileStore childFile = baseStore.getChild("ff" + specialCharName);
@@ -376,26 +386,27 @@
 		mkLink(baseStore, "lf" + specialCharName, "ff" + specialCharName, false);
 		IFileInfo[] infos = baseStore.childInfos(EFS.NONE, getMonitor());
 		assertEquals("0.1", infos.length, 4);
-		for (int i = 0; i < infos.length; i++) {
-			String infoName = infos[i].getName();
+		for (IFileInfo info : infos) {
+			String infoName = info.getName();
 			assertTrue("1." + infoName, infoName.endsWith(specialCharName));
-			assertTrue("2." + infoName, infos[i].exists());
-			if (infos[i].getName().charAt(1) == 'f') {
-				assertFalse("3." + infoName, infos[i].isDirectory());
+			assertTrue("2." + infoName, info.exists());
+			if (info.getName().charAt(1) == 'f') {
+				assertFalse("3." + infoName, info.isDirectory());
 			} else {
-				assertTrue("4." + infoName, infos[i].isDirectory());
+				assertTrue("4." + infoName, info.isDirectory());
 			}
-			if (infos[i].getName().charAt(0) == 'l') {
-				assertTrue("5." + infoName, infos[i].getAttribute(EFS.ATTRIBUTE_SYMLINK));
-				assertTrue("6." + infoName, infos[i].getStringAttribute(EFS.ATTRIBUTE_LINK_TARGET).endsWith(specialCharName));
+			if (info.getName().charAt(0) == 'l') {
+				assertTrue("5." + infoName, info.getAttribute(EFS.ATTRIBUTE_SYMLINK));
+				assertTrue("6." + infoName, info.getStringAttribute(EFS.ATTRIBUTE_LINK_TARGET).endsWith(specialCharName));
 			}
 		}
 	}
 
 	public void testSymlinkPutLastModified() throws Exception {
 		// Only activate this test if testing of symbolic links is possible.
-		if (!canCreateSymLinks())
+		if (!canCreateSymLinks()) {
 			return;
+		}
 		if (Platform.OS_MACOSX.equals(Platform.getOS())) {
 			// flag EFS.SET_LAST_MODIFIED is set by java.io and it fails on Mac OS
 			return;
@@ -428,8 +439,9 @@
 
 	public void testSymlinkPutReadOnly() throws Exception {
 		// Only activate this test if testing of symbolic links is possible.
-		if (!canCreateSymLinks())
+		if (!canCreateSymLinks()) {
 			return;
+		}
 		//check that putInfo() "writes through" the symlink
 		makeLinkStructure();
 		illFile.setAttribute(EFS.ATTRIBUTE_READ_ONLY, true);
@@ -462,13 +474,16 @@
 	}
 
 	public void testSymlinkPutExecutable() throws Exception {
-		if (!isAttributeSupported(EFS.ATTRIBUTE_EXECUTABLE))
+		if (!isAttributeSupported(EFS.ATTRIBUTE_EXECUTABLE)) {
 			return;
+		}
 		// Only activate this test if testing of symbolic links is possible.
 		if (!canCreateSymLinks())
+		 {
 			return;
 		// ATTRIBUTE_EXECUTABLE is not supported on Windows, so
 		// SYMLINKS_ARE_FIRST_CLASS_FILES_OR_DIRECTORIES is false in this context.
+		}
 
 		//check that putInfo() "writes through" the symlink
 		makeLinkStructure();
@@ -492,13 +507,16 @@
 	}
 
 	public void testSymlinkPutHidden() throws Exception {
-		if (!isAttributeSupported(EFS.ATTRIBUTE_HIDDEN))
+		if (!isAttributeSupported(EFS.ATTRIBUTE_HIDDEN)) {
 			return;
+		}
 		// Only activate this test if testing of symbolic links is possible.
 		if (!canCreateSymLinks())
+		 {
 			return;
 		// ATTRIBUTE_HIDDEN is supported only on Windows, so
 		// SYMLINKS_ARE_FIRST_CLASS_FILES_OR_DIRECTORIES is true in this context.
+		}
 
 		// Check that putInfo() applies the attribute to the symlink itself.
 		makeLinkStructure();
@@ -529,8 +547,9 @@
 	// Symlinks being broken due to remove are set to non-existent.
 	public void testSymlinkRemove() throws Exception {
 		// Only activate this test if testing of symbolic links is possible.
-		if (!canCreateSymLinks())
+		if (!canCreateSymLinks()) {
 			return;
+		}
 		makeLinkStructure();
 		lFile.delete(EFS.NONE, getMonitor());
 		illFile = lFile.fetchInfo();
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/alias/BasicAliasTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/alias/BasicAliasTest.java
index 9debae9..8d7eb2b 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/alias/BasicAliasTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/alias/BasicAliasTest.java
@@ -90,8 +90,9 @@
 	 * alphabetical order.
 	 */
 	private IResource[] getSortedChildren(IResource resource) throws CoreException {
-		if (!(resource instanceof IContainer))
+		if (!(resource instanceof IContainer)) {
 			return new IResource[0];
+		}
 		IResource[] children = ((IContainer) resource).members();
 		Arrays.sort(children, (arg0, arg1) -> arg0.getFullPath().toString().compareTo(arg1.getFullPath().toString()));
 		return children;
@@ -226,13 +227,15 @@
 	 * used in the locations map of AliasManager.
 	 */
 	public void testBug198571() {
-		if (!isWindows())
+		if (!isWindows()) {
 			return;
+		}
 
 		/* look for the adequate environment */
 		String[] devices = findAvailableDevices();
-		if (devices[0] == null || devices[1] == null)
+		if (devices[0] == null || devices[1] == null) {
 			return;
+		}
 
 		String location = getUniqueString();
 		IProject testProject1 = getWorkspace().getRoot().getProject(location + "1");
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/AbstractBuilderTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/AbstractBuilderTest.java
index 2b93aa1..2e097b0 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/AbstractBuilderTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/AbstractBuilderTest.java
@@ -69,8 +69,9 @@
 	 */
 	protected void setAutoBuilding(boolean value) throws CoreException {
 		IWorkspace workspace = getWorkspace();
-		if (workspace.isAutoBuilding() == value)
+		if (workspace.isAutoBuilding() == value) {
 			return;
+		}
 		IWorkspaceDescription desc = workspace.getDescription();
 		desc.setAutoBuilding(value);
 		workspace.setDescription(desc);
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/BuildConfigurationsTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/BuildConfigurationsTest.java
index 305b00a..ee6cb58 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/BuildConfigurationsTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/BuildConfigurationsTest.java
@@ -331,8 +331,9 @@
 			assertEquals(testId + ".2", 0, expectedCount);
 		} else {
 			assertEquals(testId + ".3", expectedCount, builder.buildCount);
-			if (shouldBuild)
+			if (shouldBuild) {
 				assertEquals(testId + ".4", expectedTrigger, builder.triggerForLastBuild);
+			}
 		}
 	}
 }
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/BuildDeltaVerificationTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/BuildDeltaVerificationTest.java
index c6aa5f8..ad978d4 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/BuildDeltaVerificationTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/BuildDeltaVerificationTest.java
@@ -162,8 +162,9 @@
 			file2.delete(true, getMonitor());
 			rebuild();
 			//builder for project1 may not even be called (empty delta)
-			if (verifier.wasFullBuild())
+			if (verifier.wasFullBuild()) {
 				verifier.emptyBuild();
+			}
 			assertTrue(verifier.getMessage(), verifier.isDeltaValid());
 		} catch (CoreException e) {
 			handleCoreException(e);
@@ -181,8 +182,9 @@
 			folder2.delete(true, getMonitor());
 			rebuild();
 			//builder for project1 may not even be called (empty delta)
-			if (verifier.wasFullBuild())
+			if (verifier.wasFullBuild()) {
 				verifier.emptyBuild();
+			}
 			assertTrue(verifier.getMessage(), verifier.isDeltaValid());
 		} catch (CoreException e) {
 			handleCoreException(e);
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/BuilderNatureTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/BuilderNatureTest.java
index 7d7c12a..3aa4391 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/BuilderNatureTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/BuilderNatureTest.java
@@ -151,9 +151,11 @@
 		//make sure the build spec doesn't include snow builder
 		try {
 			ICommand[] commands = project.getDescription().getBuildSpec();
-			for (int i = 0; i < commands.length; i++)
-				if (commands[i].getBuilderName().equals(SnowBuilder.BUILDER_NAME))
+			for (ICommand command : commands) {
+				if (command.getBuilderName().equals(SnowBuilder.BUILDER_NAME)) {
 					assertTrue("2.1", false);
+				}
+			}
 		} catch (CoreException e) {
 			fail("2.99", e);
 		}
@@ -190,9 +192,11 @@
 		//make sure the build spec doesn't include snow builder
 		try {
 			ICommand[] commands = project.getDescription().getBuildSpec();
-			for (int i = 0; i < commands.length; i++)
-				if (commands[i].getBuilderName().equals(SnowBuilder.BUILDER_NAME))
+			for (ICommand command : commands) {
+				if (command.getBuilderName().equals(SnowBuilder.BUILDER_NAME)) {
 					assertTrue("4.1", false);
+				}
+			}
 		} catch (CoreException e) {
 			fail("5.99", e);
 		}
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/BuilderTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/BuilderTest.java
index 86d280e..53c2dda 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/BuilderTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/BuilderTest.java
@@ -62,11 +62,13 @@
 		super.tearDown();
 		getWorkspace().getRoot().delete(true, null);
 		TestBuilder builder = SortBuilder.getInstance();
-		if (builder != null)
+		if (builder != null) {
 			builder.reset();
+		}
 		builder = DeltaVerifierBuilder.getInstance();
-		if (builder != null)
+		if (builder != null) {
 			builder.reset();
+		}
 	}
 
 	/**
@@ -1029,8 +1031,9 @@
 		byte[] result = out.toByteArray();
 		byte[] expected = new byte[] {1, 2, 3, 4, 5};
 		assertEquals("2.0", expected.length, result.length);
-		for (int i = 0; i < expected.length; i++)
+		for (int i = 0; i < expected.length; i++) {
 			assertEquals("2.1." + i, expected[i], result[i]);
+		}
 	}
 
 	/**
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/ClearMarkersBuilder.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/ClearMarkersBuilder.java
index ebbe3cb..b1a62d6 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/ClearMarkersBuilder.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/ClearMarkersBuilder.java
@@ -34,8 +34,9 @@
 		getProject().deleteMarkers(IMarker.PROBLEM, true, IResource.DEPTH_INFINITE);
 		//wait after build if requested
 		try {
-			if (pauseAfterBuild)
+			if (pauseAfterBuild) {
 				Thread.sleep(5000);
+			}
 		} catch (InterruptedException e) {
 			//ignore
 		}
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/ConfigurationBuilder.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/ConfigurationBuilder.java
index 8409708..37b69f2 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/ConfigurationBuilder.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/ConfigurationBuilder.java
@@ -44,8 +44,7 @@
 	}
 
 	public static void clearStats() {
-		for (Iterator<ConfigurationBuilder> it = builders.values().iterator(); it.hasNext();) {
-			ConfigurationBuilder builder = it.next();
+		for (ConfigurationBuilder builder : builders.values()) {
 			builder.buildCount = 0;
 			builder.triggerForLastBuild = 0;
 			builder.deltaForLastBuild = null;
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/ContextBuilder.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/ContextBuilder.java
index 0405f40..246552e 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/ContextBuilder.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/ContextBuilder.java
@@ -10,7 +10,8 @@
  *******************************************************************************/
 package org.eclipse.core.tests.internal.builders;
 
-import java.util.*;
+import java.util.HashMap;
+import java.util.Map;
 import org.eclipse.core.resources.*;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
@@ -43,25 +44,26 @@
 	}
 
 	public static IBuildContext getContext(IBuildConfiguration variant) {
-		if (!builders.containsKey(variant))
+		if (!builders.containsKey(variant)) {
 			return null;
+		}
 		return getBuilder(variant).contextForLastBuild;
 	}
 
 	public static boolean checkValid() {
-		for (Iterator<ContextBuilder> it = builders.values().iterator(); it.hasNext();) {
-			ContextBuilder builder = it.next();
-			if (builder.getRuleCalledForLastBuild && !builder.contextForLastBuild.equals(builder.contextForLastBuildInGetRule))
+		for (ContextBuilder builder : builders.values()) {
+			if (builder.getRuleCalledForLastBuild && !builder.contextForLastBuild.equals(builder.contextForLastBuildInGetRule)) {
 				return false;
-			if (builder.getRuleCalledForLastBuild && !builder.buildConfigurationForLastBuild.equals(builder.buildConfigurationForLastBuildInGetRule))
+			}
+			if (builder.getRuleCalledForLastBuild && !builder.buildConfigurationForLastBuild.equals(builder.buildConfigurationForLastBuildInGetRule)) {
 				return false;
+			}
 		}
 		return true;
 	}
 
 	public static void clearStats() {
-		for (Iterator<ContextBuilder> it = builders.values().iterator(); it.hasNext();) {
-			ContextBuilder builder = it.next();
+		for (ContextBuilder builder : builders.values()) {
 			builder.contextForLastBuild = null;
 			builder.contextForLastBuildInGetRule = null;
 			builder.buildConfigurationForLastBuild = null;
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/CycleBuilder.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/CycleBuilder.java
index dfd1339..b03b0b1 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/CycleBuilder.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/CycleBuilder.java
@@ -45,8 +45,8 @@
 	@Override
 	protected IProject[] build(int kind, Map<String, String> args, IProgressMonitor monitor) throws CoreException {
 		if (beforeProjects != null) {
-			for (int i = 0; i < beforeProjects.length; i++) {
-				Assert.assertTrue("Missing before project: " + beforeProjects[i], hasBeenBuilt(beforeProjects[i]));
+			for (IProject beforeProject : beforeProjects) {
+				Assert.assertTrue("Missing before project: " + beforeProject, hasBeenBuilt(beforeProject));
 			}
 		}
 		if (afterProjects != null) {
@@ -59,8 +59,9 @@
 			needRebuild();
 		}
 		//ensure that subsequent builds are always incremental
-		if (buildCount > 0)
+		if (buildCount > 0) {
 			Assert.assertTrue("Should be incremental build", kind == IncrementalProjectBuilder.INCREMENTAL_BUILD);
+		}
 		buildCount++;
 		return null;
 	}
@@ -79,8 +80,9 @@
 	private void changeAllFiles() throws CoreException {
 		IResourceVisitor visitor = resource -> {
 			if (resource.getType() == IResource.FILE) {
-				if (resource.getName().equals(IProjectDescription.DESCRIPTION_FILE_NAME))
+				if (resource.getName().equals(IProjectDescription.DESCRIPTION_FILE_NAME)) {
 					return false;
+				}
 				((IFile) resource).setContents(getRandomContents(), IResource.NONE, null);
 			}
 			return true;
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/DeltaVerifierBuilder.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/DeltaVerifierBuilder.java
index b68e613..d44d1d6 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/DeltaVerifierBuilder.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/DeltaVerifierBuilder.java
@@ -155,16 +155,17 @@
 	 * deltas were actually returned.
 	 */
 	protected void doCheckDeltas() {
-		if (checkDeltas == null)
+		if (checkDeltas == null) {
 			return;
+		}
 		receivedDeltas.clear();
-		for (int i = 0; i < checkDeltas.length; i++) {
-			IResourceDelta delta = getDelta(checkDeltas[i]);
+		for (IProject checkDelta : checkDeltas) {
+			IResourceDelta delta = getDelta(checkDelta);
 			if (delta != null) {
-				receivedDeltas.add(checkDeltas[i]);
+				receivedDeltas.add(checkDelta);
 				//check if the delta was empty
 				if (delta.getKind() == IResourceDelta.NO_CHANGE && delta.getAffectedChildren().length == 0) {
-					emptyDeltas.add(checkDeltas[i]);
+					emptyDeltas.add(checkDelta);
 				}
 				//regression test -- ensure delta resource is non null
 				Assert.assertTrue("Non-null delta", delta.getResource() != null);
@@ -245,8 +246,9 @@
 	public void reset() {
 		super.reset();
 		triggerForLastBuild = 0;
-		if (verifier != null)
+		if (verifier != null) {
 			verifier.reset();
+		}
 	}
 
 	public boolean wasAutoBuild() {
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/MultiProjectBuildTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/MultiProjectBuildTest.java
index ce08fe3..bc74f9c 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/MultiProjectBuildTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/MultiProjectBuildTest.java
@@ -62,8 +62,8 @@
 	 */
 	protected void dirty(final IProject[] projects) throws CoreException {
 		getWorkspace().run((IWorkspaceRunnable) monitor -> {
-			for (int i = 0; i < projects.length; i++) {
-				IResource[] members = projects[i].members();
+			for (IProject project : projects) {
+				IResource[] members = project.members();
 				for (int j = 0; j < members.length; j++) {
 					if (members[j].getType() == IResource.FILE && !members[j].getName().equals(IProjectDescription.DESCRIPTION_FILE_NAME)) {
 						((IFile) members[j]).setContents(getRandomContents(), true, true, null);
@@ -78,8 +78,9 @@
 	 * Returns an array reversed.
 	 */
 	Object[] reverse(Object[] input) {
-		if (input == null)
+		if (input == null) {
 			return null;
+		}
 		int len = input.length;
 		Object[] output = new Object[len];
 		for (int i = 0; i < len; i++) {
@@ -177,27 +178,29 @@
 				HashSet<IProject> modified = new HashSet<>(Arrays.asList((IProject[]) args[1]));
 				modified.addAll(previouslyModified);
 				HashSet<IProject> obtained = new HashSet<>();
-				if (!builder.getReceivedDeltas().isEmpty())
+				if (!builder.getReceivedDeltas().isEmpty()) {
 					obtained.addAll(builder.getReceivedDeltas());
+				}
 				ArrayList<IProject> emptyDeltas = builder.getEmptyDeltas();
 
 				//the builder's project is implicitly requested
 				requested.add(builder.getProject());
 
-				for (int i = 0; i < allProjects.length; i++) {
-					IProject project = allProjects[i];
+				for (IProject project : allProjects) {
 					boolean wasObtained = obtained.contains(project);
 					boolean wasRequested = requested.contains(project);
 					boolean wasModified = modified.contains(project);
 					boolean wasEmpty = emptyDeltas.contains(project);
 					if (wasObtained) {
 						//every delta we obtained should have been requested and (modified or empty)
-						if (!wasRequested || !(wasModified || wasEmpty))
+						if (!wasRequested || !(wasModified || wasEmpty)) {
 							return false;
+						}
 					} else {
 						//if delta was not obtained, then must be unchanged or not requested
-						if (wasRequested && wasModified)
+						if (wasRequested && wasModified) {
 							return false;
+						}
 					}
 				}
 				return true;
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/RefreshLocalJavaFileBuilder.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/RefreshLocalJavaFileBuilder.java
index b4afe0a..615ce59 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/RefreshLocalJavaFileBuilder.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/RefreshLocalJavaFileBuilder.java
@@ -33,8 +33,9 @@
 		IPath localLocation = project.getLocation().append(file.getName());
 		java.io.File localFile = localLocation.toFile();
 		try {
-			if (localFile.exists())
+			if (localFile.exists()) {
 				localFile.delete();
+			}
 			FileOutputStream out = new FileOutputStream(localFile);
 			out.write("public class A {}".getBytes());
 			out.close();
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/RelaxedSchedRuleBuilderTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/RelaxedSchedRuleBuilderTest.java
index 1af7ab8..3b3d952 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/RelaxedSchedRuleBuilderTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/RelaxedSchedRuleBuilderTest.java
@@ -51,14 +51,17 @@
 		super.tearDown();
 		getWorkspace().getRoot().delete(true, null);
 		TestBuilder builder = DeltaVerifierBuilder.getInstance();
-		if (builder != null)
+		if (builder != null) {
 			builder.reset();
+		}
 		builder = EmptyDeltaBuilder.getInstance();
-		if (builder != null)
+		if (builder != null) {
 			builder.reset();
+		}
 		builder = EmptyDeltaBuilder2.getInstance();
-		if (builder != null)
+		if (builder != null) {
 			builder.reset();
+		}
 	}
 
 	/**
@@ -89,12 +92,13 @@
 			public IProject[] build(int kind, Map<String, String> args, IProgressMonitor monitor) throws CoreException {
 				assertTrue(Job.getJobManager().currentRule() == null);
 				tb.setStatus(TestBarrier.STATUS_START);
-				while (!monitor.isCanceled())
+				while (!monitor.isCanceled()) {
 					try {
 						Thread.sleep(10);
 					} catch (InterruptedException e) {
 						// Don't care
 					}
+				}
 				tb.setStatus(TestBarrier.STATUS_DONE);
 				return super.build(kind, args, monitor);
 			}
@@ -218,12 +222,14 @@
 
 	HashSet<ISchedulingRule> getRulesAsSet(ISchedulingRule rule) {
 		HashSet<ISchedulingRule> rules = new HashSet<>();
-		if (rule == null)
+		if (rule == null) {
 			return rules;
-		if (rule instanceof MultiRule)
+		}
+		if (rule instanceof MultiRule) {
 			rules.addAll(Arrays.asList(((MultiRule) rule).getChildren()));
-		else
+		} else {
 			rules.add(rule);
+		}
 		return rules;
 	}
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/SortBuilder.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/SortBuilder.java
index 56a23fe..6bd0718 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/SortBuilder.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/SortBuilder.java
@@ -157,8 +157,9 @@
 			forgetLastBuiltState();
 		}
 		String project = arguments.get(INTERESTING_PROJECT);
-		if (project != null)
+		if (project != null) {
 			return new IProject[] {getProject().getWorkspace().getRoot().getProject(project)};
+		}
 		return new IProject[0];
 	}
 
@@ -223,8 +224,8 @@
 		if (type == IResource.FOLDER) {
 			IFolder folder = (IFolder) resource;
 			IResource[] members = folder.members();
-			for (int i = 0; i < members.length; i++) {
-				deleteResource(members[i]);
+			for (IResource member : members) {
+				deleteResource(member);
 			}
 			folder.delete(true, null);
 		} else if (type == IResource.FILE) {
@@ -247,8 +248,8 @@
 			if (sortedFolder.exists()) {
 				//delete all sorted files
 				IResource[] members = sortedFolder.members();
-				for (int i = 0; i < members.length; i++) {
-					deleteResource(members[i]);
+				for (IResource member : members) {
+					deleteResource(member);
 				}
 			}
 
@@ -270,8 +271,7 @@
 			build((IFile) unsortedResource);
 		} else {
 			IResource[] members = ((IFolder) unsortedResource).members();
-			for (int i = 0; i < members.length; i++) {
-				IResource member = members[i];
+			for (IResource member : members) {
 				fullBuild(member);
 			}
 		}
@@ -291,8 +291,9 @@
 	 */
 	private IFolder getSortedFolder() {
 		String sortedFolder = arguments.get(SORTED_FOLDER);
-		if (sortedFolder == null)
+		if (sortedFolder == null) {
 			sortedFolder = DEFAULT_SORTED_FOLDER;
+		}
 		return getProject().getFolder(sortedFolder);
 	}
 
@@ -302,8 +303,9 @@
 	 */
 	private IFolder getUnsortedFolder() {
 		String unsortedFolder = arguments.get(UNSORTED_FOLDER);
-		if (unsortedFolder == null)
+		if (unsortedFolder == null) {
 			unsortedFolder = DEFAULT_UNSORTED_FOLDER;
+		}
 		return getProject().getFolder(unsortedFolder);
 	}
 
@@ -344,8 +346,8 @@
 
 		if (isUnderUnsortedFolder || isOverUnsortedFolder) {
 			IResourceDelta[] affectedChildren = delta.getAffectedChildren();
-			for (int i = 0; i < affectedChildren.length; ++i) {
-				incrementalBuild(affectedChildren[i]);
+			for (IResourceDelta element : affectedChildren) {
+				incrementalBuild(element);
 			}
 		}
 	}
@@ -395,8 +397,9 @@
 	 */
 	private void recordChangedResources(IResourceDelta delta) throws CoreException {
 		changedResources.clear();
-		if (delta == null)
+		if (delta == null) {
 			return;
+		}
 		delta.accept(delta1 -> {
 			changedResources.add(delta1.getResource());
 			return true;
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/TestBuilder.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/TestBuilder.java
index ea1379d..b0fd1ad 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/TestBuilder.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/builders/TestBuilder.java
@@ -106,8 +106,9 @@
 	protected IProject[] build(int kind, Map<String, String> args, IProgressMonitor monitor) throws CoreException {
 		arguments = args == null ? new HashMap<>(1) : args;
 		logPluginLifecycleEvent(getBuildId());
-		if (ruleCallBack == null)
+		if (ruleCallBack == null) {
 			return new IProject[0];
+		}
 		ruleCallBack.builder = this;
 		return ruleCallBack.build(kind, args, monitor);
 	}
@@ -118,8 +119,9 @@
 	 */
 	@Override
 	public ISchedulingRule getRule(int trigger, Map<String, String> args) {
-		if (ruleCallBack == null)
+		if (ruleCallBack == null) {
 			return super.getRule(trigger, args);
+		}
 		ruleCallBack.builder = this;
 		return ruleCallBack.getRule(name, this, trigger, args);
 	}
@@ -136,8 +138,9 @@
 	 */
 	private String getBuildId() {
 		String buildId = arguments.get(BUILD_ID);
-		if (buildId == null)
+		if (buildId == null) {
 			buildId = DEFAULT_BUILD_ID;
+		}
 		return buildId;
 	}
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/bogus/BogusFileStore.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/bogus/BogusFileStore.java
index d64e973..50c478d 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/bogus/BogusFileStore.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/bogus/BogusFileStore.java
@@ -36,8 +36,9 @@
 	public java.io.File toLocalFile(int options, IProgressMonitor monitor) {
 		IPath parentPath = ResourcesPlugin.getWorkspace().getRoot().getLocation().append("bogus_fs");
 		File parent = new java.io.File(parentPath.toOSString());
-		if (!parent.exists())
+		if (!parent.exists()) {
 			parent.mkdirs();
+		}
 		return new java.io.File(parentPath.append(getName()).toOSString());
 	}
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/bogus/BogusFileSystem.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/bogus/BogusFileSystem.java
index 1d53349..66b5335 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/bogus/BogusFileSystem.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/bogus/BogusFileSystem.java
@@ -28,8 +28,9 @@
 
 	public static BogusFileSystem getInstance() {
 		BogusFileSystem tmpInstance = instance;
-		if (tmpInstance != null)
+		if (tmpInstance != null) {
 			return tmpInstance;
+		}
 		return instance = new BogusFileSystem();
 	}
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/broken/BrokenFileStore.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/broken/BrokenFileStore.java
index e287b51..0baaf7b 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/broken/BrokenFileStore.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/broken/BrokenFileStore.java
@@ -71,8 +71,9 @@
 	@Override
 	public IFileStore getParent() {
 		IPath path = getPath();
-		if (path.segmentCount() == 0)
+		if (path.segmentCount() == 0) {
 			return null;
+		}
 		return new BrokenFileStore(path.removeLastSegments(1));
 	}
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/broken/BrokenFileSystem.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/broken/BrokenFileSystem.java
index 2b359b9..378b399 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/broken/BrokenFileSystem.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/broken/BrokenFileSystem.java
@@ -27,8 +27,9 @@
 
 	public static BrokenFileSystem getInstance() {
 		BrokenFileSystem tmpInstance = instance;
-		if (tmpInstance != null)
+		if (tmpInstance != null) {
 			return tmpInstance;
+		}
 		return instance = new BrokenFileSystem();
 	}
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/bug440110/Bug440110FileStore.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/bug440110/Bug440110FileStore.java
index 5fef03f..d8ff2e8 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/bug440110/Bug440110FileStore.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/bug440110/Bug440110FileStore.java
@@ -34,8 +34,9 @@
 
 	@Override
 	public IFileStore getParent() {
-		if (path.segmentCount() == 0)
+		if (path.segmentCount() == 0) {
 			return null;
+		}
 		return new Bug440110FileStore(path.removeLastSegments(1));
 	}
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/ram/MemoryFileStore.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/ram/MemoryFileStore.java
index 776328b..0860356 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/ram/MemoryFileStore.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/ram/MemoryFileStore.java
@@ -59,8 +59,9 @@
 
 	@Override
 	public IFileStore getParent() {
-		if (path.segmentCount() == 0)
+		if (path.segmentCount() == 0) {
 			return null;
+		}
 		return new MemoryFileStore(path.removeLastSegments(1));
 	}
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/ram/MemoryTree.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/ram/MemoryTree.java
index f494f36..39ace07 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/ram/MemoryTree.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/ram/MemoryTree.java
@@ -50,8 +50,9 @@
 		Node getChild(String name) {
 			for (int i = 0, imax = children.size(); i < imax; i++) {
 				Node child = children.get(i);
-				if (child.getInfo(false).getName().equals(name))
+				if (child.getInfo(false).getName().equals(name)) {
 					return child;
+				}
 			}
 			return null;
 		}
@@ -69,8 +70,9 @@
 
 		void remove(String name) {
 			Node child = getChild(name);
-			if (child != null)
+			if (child != null) {
 				children.remove(child);
+			}
 		}
 
 		@Override
@@ -113,8 +115,9 @@
 				System.arraycopy(oldContents, 0, newContents, 0, oldContents.length);
 				System.arraycopy(bytes, 0, newContents, oldContents.length, bytes.length);
 				this.contents = newContents;
-			} else
+			} else {
 				this.contents = bytes;
+			}
 			info.setLastModified(System.currentTimeMillis());
 			((FileInfo) info).setLength(bytes.length);
 		}
@@ -124,8 +127,9 @@
 		protected IFileInfo info;
 
 		Node(Node parent, String name) {
-			if (parent != null)
+			if (parent != null) {
 				((DirNode) parent).add(this);
+			}
 			FileInfo fileInfo = new FileInfo(name);
 			initializeInfo(fileInfo);
 			this.info = fileInfo;
@@ -144,8 +148,9 @@
 
 		void putInfo(IFileInfo newInfo, int options) {
 			if ((options & EFS.SET_ATTRIBUTES) != 0) {
-				for (int i = 0; i < ALL_ATTRIBUTES.length; i++)
-					info.setAttribute(ALL_ATTRIBUTES[i], newInfo.getAttribute(ALL_ATTRIBUTES[i]));
+				for (int element : ALL_ATTRIBUTES) {
+					info.setAttribute(element, newInfo.getAttribute(element));
+				}
 			}
 			if ((options & EFS.SET_LAST_MODIFIED) != 0) {
 				info.setLastModified(newInfo.getLastModified());
@@ -177,18 +182,21 @@
 
 	public String[] childNames(IPath path) {
 		Node node = findNode(path);
-		if (node == null || node.isFile())
+		if (node == null || node.isFile()) {
 			return null;
+		}
 		return ((DirNode) node).childNames();
 	}
 
 	public void delete(IPath path) {
 		//cannot delete the root
-		if (path.segmentCount() == 0)
+		if (path.segmentCount() == 0) {
 			return;
+		}
 		Node parent = findNode(path.removeLastSegments(1));
-		if (parent == null || parent.isFile())
+		if (parent == null || parent.isFile()) {
 			return;
+		}
 		((DirNode) parent).remove(path.lastSegment());
 
 	}
@@ -207,8 +215,9 @@
 	 */
 	public synchronized IFileInfo fetchInfo(IPath path) {
 		Node node = findNode(path);
-		if (node == null)
+		if (node == null) {
 			return new FileInfo(path.lastSegment());
+		}
 		return node.getInfo(true);
 	}
 
@@ -221,8 +230,9 @@
 	private Node findNode(IPath path) {
 		Node current = root;
 		for (int i = 0, imax = path.segmentCount(); i < imax; i++) {
-			if (current == null || current.isFile())
+			if (current == null || current.isFile()) {
 				return null;
+			}
 			current = ((DirNode) current).getChild(path.segment(i));
 		}
 		return current;
@@ -231,18 +241,21 @@
 	public Node mkdir(IPath path, boolean deep) throws CoreException {
 		Node dir = findNode(path);
 		if (dir != null) {
-			if (dir.isFile())
+			if (dir.isFile()) {
 				Policy.error("A file exists with this name: " + path);
+			}
 			return dir;
 		}
 		final IPath parentPath = path.removeLastSegments(1);
 		Node parent = findNode(parentPath);
 		if (parent != null) {
-			if (parent.isFile())
+			if (parent.isFile()) {
 				Policy.error("Parent is a file: " + path);
+			}
 		} else {
-			if (!deep)
+			if (!deep) {
 				Policy.error("Parent does not exist: " + parentPath);
+			}
 			parent = mkdir(parentPath, deep);
 		}
 		//create the child directory
@@ -251,32 +264,38 @@
 
 	public InputStream openInputStream(IPath path) throws CoreException {
 		Node node = findNode(path);
-		if (node == null)
+		if (node == null) {
 			Policy.error("File not found: " + path);
-		if (!node.isFile())
+		}
+		if (!node.isFile()) {
 			Policy.error("Cannot open stream on directory: " + path);
+		}
 		return ((FileNode) node).openInputStream();
 	}
 
 	public OutputStream openOutputStream(IPath path, int options) throws CoreException {
 		Node node = findNode(path);
 		//if we already have such a file, just open a stream on it
-		if (node instanceof DirNode)
+		if (node instanceof DirNode) {
 			Policy.error("Could not create file: " + path);
-		if (node instanceof FileNode)
+		}
+		if (node instanceof FileNode) {
 			return ((FileNode) node).openOutputStream(options);
+		}
 		//if the parent exists we can create the file
 		Node parent = findNode(path.removeLastSegments(1));
-		if (!(parent instanceof DirNode))
+		if (!(parent instanceof DirNode)) {
 			Policy.error("Could not create file: " + path);
+		}
 		node = new FileNode(parent, path.lastSegment());
 		return ((FileNode) node).openOutputStream(options);
 	}
 
 	public void putInfo(IPath path, IFileInfo info, int options) throws CoreException {
 		Node node = findNode(path);
-		if (node == null)
+		if (node == null) {
 			Policy.error("File not found: " + path);
+		}
 		node.putInfo(info, options);
 	}
 }
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/remote/RemoteFileStore.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/remote/RemoteFileStore.java
index abbd221..a7c84f0 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/remote/RemoteFileStore.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/remote/RemoteFileStore.java
@@ -23,10 +23,12 @@
 public class RemoteFileStore extends MemoryFileStore {
 	private static String createAuthoritySegment(String userInfo, String host, int port) {
 		String authority = host;
-		if (userInfo != null)
+		if (userInfo != null) {
 			authority = userInfo + "___" + authority;
-		if (port != -1)
+		}
+		if (port != -1) {
 			authority += "___" + port;
+		}
 		return authority;
 	}
 
@@ -50,8 +52,9 @@
 
 	@Override
 	public IFileStore getParent() {
-		if (remotePath.segmentCount() == 0)
+		if (remotePath.segmentCount() == 0) {
 			return null;
+		}
 		return new RemoteFileStore(userInfo, host, port, remotePath.removeLastSegments(1));
 	}
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/wrapper/WrapperFileStore.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/wrapper/WrapperFileStore.java
index d80334e..da4c183 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/wrapper/WrapperFileStore.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/wrapper/WrapperFileStore.java
@@ -54,9 +54,10 @@
 	@Override
 	public IFileStore[] childStores(int options, IProgressMonitor monitor) throws CoreException {
 		IFileStore[] childStores = baseStore.childStores(options, monitor);
-		for (int i = 0; i < childStores.length; i++)
+		for (int i = 0; i < childStores.length; i++) {
 			// replace ordinary file store with wrapper version
 			childStores[i] = createNewWrappedStore(childStores[i]);
+		}
 		return childStores;
 	}
 
@@ -72,10 +73,12 @@
 
 	@Override
 	public boolean equals(Object obj) {
-		if (obj == this)
+		if (obj == this) {
 			return true;
-		if (!(obj instanceof WrapperFileStore))
+		}
+		if (!(obj instanceof WrapperFileStore)) {
 			return false;
+		}
 		return baseStore.equals(((WrapperFileStore) obj).baseStore);
 	}
 
@@ -132,8 +135,9 @@
 
 	@Override
 	public boolean isParentOf(IFileStore other) {
-		if (!(other instanceof WrapperFileStore))
+		if (!(other instanceof WrapperFileStore)) {
 			return false;
+		}
 		IFileStore otherBaseStore = ((WrapperFileStore) other).baseStore;
 		return baseStore.isParentOf(otherBaseStore);
 	}
@@ -146,8 +150,9 @@
 
 	@Override
 	public void move(IFileStore destination, int options, IProgressMonitor monitor) throws CoreException {
-		if (destination instanceof WrapperFileStore)
+		if (destination instanceof WrapperFileStore) {
 			destination = ((WrapperFileStore) destination).baseStore;
+		}
 		baseStore.move(destination, options, monitor);
 	}
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/wrapper/WrapperFileSystem.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/wrapper/WrapperFileSystem.java
index b8bb630..855e60b 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/wrapper/WrapperFileSystem.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/filesystem/wrapper/WrapperFileSystem.java
@@ -45,8 +45,9 @@
 	}
 
 	public static synchronized WrapperFileSystem getInstance() {
-		if (instance != null)
+		if (instance != null) {
 			return instance;
+		}
 		return instance = new WrapperFileSystem();
 	}
 
@@ -60,10 +61,11 @@
 	 *        based implementation.
 	 */
 	public static void setCustomFileStore(Class<? extends WrapperFileStore> fs) {
-		if (fs == null)
+		if (fs == null) {
 			customFS = WrapperFileStore.class;
-		else
+		} else {
 			customFS = fs;
+		}
 	}
 
 	public static URI getWrappedURI(URI baseURI) {
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/BucketTreeTests.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/BucketTreeTests.java
index e94ad92..5e3d65a 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/BucketTreeTests.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/BucketTreeTests.java
@@ -79,8 +79,9 @@
 		protected Object readEntryValue(DataInputStream source) throws IOException {
 			int length = source.readUnsignedShort();
 			Map<String, String> value = new HashMap<>(length);
-			for (int j = 0; j < length; j++)
+			for (int j = 0; j < length; j++) {
 				value.put(source.readUTF(), source.readUTF());
+			}
 			return value;
 		}
 
@@ -98,10 +99,12 @@
 			}
 			if (value == null) {
 				existing.remove(key);
-				if (existing.isEmpty())
+				if (existing.isEmpty()) {
 					existing = null;
-			} else
+				}
+			} else {
 				existing.put(key, value);
+			}
 			setEntryValue(pathAsString, existing);
 		}
 
@@ -197,8 +200,7 @@
 			fail(tag + ".3", e);
 		}
 		assertEquals(tag + ".4", expected.size(), visited.size());
-		for (Iterator<IPath> i = expected.iterator(); i.hasNext();) {
-			IPath path = i.next();
+		for (IPath path : expected) {
 			assertTrue(tag + ".5 " + path, visited.contains(path));
 		}
 	}
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/CaseSensitivityTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/CaseSensitivityTest.java
index aa65bc2..28eb081 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/CaseSensitivityTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/CaseSensitivityTest.java
@@ -52,8 +52,9 @@
 			project2.open(null);
 			assertTrue("2.0", isCaseSensitive);
 		} catch (CoreException e) {
-			if (isCaseSensitive)
+			if (isCaseSensitive) {
 				fail("2.1", e);
+			}
 		}
 	}
 
@@ -75,8 +76,9 @@
 			folder2.create(true, true, null);
 			assertTrue("2.0", isCaseSensitive);
 		} catch (CoreException e) {
-			if (isCaseSensitive)
+			if (isCaseSensitive) {
 				fail("2.1", e);
+			}
 		}
 
 		// create a file; should fail because has same name with different casing
@@ -107,8 +109,9 @@
 			file2.create(getRandomContents(), true, null);
 			assertTrue("2.0", isCaseSensitive);
 		} catch (CoreException e) {
-			if (isCaseSensitive)
+			if (isCaseSensitive) {
 				fail("2.1", e);
+			}
 		}
 
 		// create a folder; should fail because has same name with different casing
@@ -147,8 +150,9 @@
 			project1.move(Path.ROOT.append(project2.getName().toUpperCase()), true, null);
 			assertTrue("3.0", isCaseSensitive);
 		} catch (CoreException e) {
-			if (isCaseSensitive)
+			if (isCaseSensitive) {
 				fail("3.99", e);
+			}
 		}
 	}
 
@@ -178,8 +182,9 @@
 			folder1.move(folder3.getFullPath(), true, null);
 			assertTrue("3.1", isCaseSensitive);
 		} catch (CoreException e) {
-			if (isCaseSensitive)
+			if (isCaseSensitive) {
 				fail("3.2", e);
+			}
 		}
 	}
 
@@ -209,8 +214,9 @@
 			file1.move(file3.getFullPath(), true, null);
 			assertTrue("3.1", isCaseSensitive);
 		} catch (CoreException e) {
-			if (isCaseSensitive)
+			if (isCaseSensitive) {
 				fail("3.2", e);
+			}
 		}
 	}
 
@@ -279,8 +285,9 @@
 			file1.copy(destinationProject.getFullPath().append(file1.getName()), true, null);
 			assertTrue("1.2.1", isCaseSensitive);
 		} catch (CoreException e) {
-			if (isCaseSensitive)
+			if (isCaseSensitive) {
 				fail("1.2.2", e);
+			}
 		}
 
 		// try to move the file from source project to destination project.
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/FileSystemResourceManagerTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/FileSystemResourceManagerTest.java
index 96ed253..85ac831 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/FileSystemResourceManagerTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/FileSystemResourceManagerTest.java
@@ -190,8 +190,9 @@
 		final IFolder folder = project.getFolder("Folder1");
 		IWorkspaceRunnable operation = monitor -> {
 			IResource[] members = folder.members();
-			for (int i = 0; i < members.length; i++)
-				((Resource) members[i]).getResourceInfo(false, true).clear(M_LOCAL_EXISTS);
+			for (IResource member : members) {
+				((Resource) member).getResourceInfo(false, true).clear(M_LOCAL_EXISTS);
+			}
 		};
 		getWorkspace().run(operation, null);
 		assertTrue("2.0", project.isLocal(IResource.DEPTH_ONE));
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/HistoryStoreTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/HistoryStoreTest.java
index c6d8de7..c3e74a2 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/HistoryStoreTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/HistoryStoreTest.java
@@ -41,11 +41,13 @@
 		String dump() {
 			StringBuffer buffer = new StringBuffer();
 			buffer.append("Expected:\n");
-			for (Integer integer : expected)
+			for (Integer integer : expected) {
 				buffer.append("\t" + integer + "\n");
+			}
 			buffer.append("Actual:\n");
-			for (Integer integer : actual)
+			for (Integer integer : actual) {
 				buffer.append("\t" + integer + "\n");
+			}
 			return buffer.toString();
 		}
 
@@ -138,8 +140,9 @@
 		} catch (IOException e) {
 			i = 0;
 		}
-		if (c != -1)
+		if (c != -1) {
 			i = 0;
+		}
 		return i;
 	}
 
@@ -263,8 +266,9 @@
 		}
 
 		// assert that the most recent states were preserved
-		for (int i = 0; i < states.length; i++)
+		for (int i = 0; i < states.length; i++) {
 			assertEquals("1.4." + i, oldStates[i], states[i]);
+		}
 
 		/* test max file state size */
 		description.setMaxFileStates(15);
@@ -1032,8 +1036,9 @@
 		// Make sure we have ITERATIONS number of states
 		assertEquals("5.1", ITERATIONS, states.length);
 		// Make sure that each of these states really exists in the filesystem.
-		for (int i = 0; i < states.length; i++)
+		for (int i = 0; i < states.length; i++) {
 			assertTrue("5.2." + i, states[i].exists());
+		}
 	}
 
 	public void testFindDeleted() {
@@ -1398,8 +1403,9 @@
 			} catch (CoreException e) {
 				fail("3.1." + i, e);
 			}
-			if (!compareContent(inFile, inContents))
+			if (!compareContent(inFile, inContents)) {
 				fail("3.2." + i + " No match, files are not identical.");
+			}
 		}
 
 		stateArray = historyStore.getStates(secondValidFile.getFullPath(), getMonitor());
@@ -1410,8 +1416,9 @@
 			} catch (CoreException e) {
 				fail("4.1." + i, e);
 			}
-			if (!compareContent(inFile, inContents))
+			if (!compareContent(inFile, inContents)) {
 				fail("4.2." + i + " No match, files are not identical.");
+			}
 		}
 
 		/* Test getting an invalid file state. */
@@ -1977,8 +1984,9 @@
 
 		/* Set new contents on the file. Should add two entries to the store. */
 		try {
-			for (int i = 0; i < 2; i++)
+			for (int i = 0; i < 2; i++) {
 				file.setContents(getContents(contents[i + 1]), true, true, getMonitor());
+			}
 		} catch (CoreException e) {
 			fail("2.0", e);
 		}
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/LocalStoreTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/LocalStoreTest.java
index a9f0d55..8c26103 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/LocalStoreTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/LocalStoreTest.java
@@ -38,13 +38,15 @@
 
 	protected int countChildren(File root) {
 		String[] children = root.list();
-		if (children == null)
+		if (children == null) {
 			return 0;
+		}
 		int result = 0;
-		for (int i = 0; i < children.length; i++) {
-			File child = new File(root, children[i]);
-			if (child.isDirectory())
+		for (String element : children) {
+			File child = new File(root, element);
+			if (child.isDirectory()) {
 				result += countChildren(child);
+			}
 			result++;
 		}
 		return result;
@@ -53,11 +55,12 @@
 	public int countChildren(IFolder root) throws CoreException {
 		int total = 0;
 		IResource[] children = root.members();
-		for (int i = 0; i < children.length; i++) {
-			if (children[i].getType() == IResource.FILE)
+		for (IResource element : children) {
+			if (element.getType() == IResource.FILE) {
 				total++;
-			else
-				total += countChildren((IFolder) children[i]);
+			} else {
+				total += countChildren((IFolder) element);
+			}
 		}
 		return total;
 	}
@@ -87,9 +90,9 @@
 
 	protected void createNode(IFileStore node) throws CoreException {
 		char type = node.getName().charAt(0);
-		if (type == 'd')
+		if (type == 'd') {
 			node.mkdir(EFS.NONE, null);
-		else {
+		} else {
 			InputStream input = getRandomContents();
 			OutputStream output = node.openOutputStream(EFS.NONE, null);
 			transferData(input, output);
@@ -97,8 +100,9 @@
 	}
 
 	protected void createTree(IFileStore[] tree) throws CoreException {
-		for (int i = 0; i < tree.length; i++)
-			createNode(tree[i]);
+		for (IFileStore element : tree) {
+			createNode(element);
+		}
 	}
 
 	/**
@@ -113,8 +117,9 @@
 	 */
 	protected String getBigString(int size) {
 		StringBuffer sb = new StringBuffer();
-		while (sb.length() < size)
+		while (sb.length() < size) {
 			sb.append(getRandomString());
+		}
 		return sb.toString();
 	}
 
@@ -128,8 +133,9 @@
 
 	protected IFileStore[] getTree(IFileStore root, String[] elements) {
 		IFileStore[] tree = new IFileStore[elements.length];
-		for (int i = 0; i < elements.length; i++)
+		for (int i = 0; i < elements.length; i++) {
 			tree[i] = root.getChild(elements[i]);
+		}
 		return tree;
 	}
 
@@ -194,9 +200,11 @@
 	}
 
 	protected boolean verifyTree(IFileStore[] tree) {
-		for (int i = 0; i < tree.length; i++)
-			if (!verifyNode(tree[i]))
+		for (int i = 0; i < tree.length; i++) {
+			if (!verifyNode(tree[i])) {
 				return false;
+			}
+		}
 		return true;
 	}
 }
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/LocalSyncTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/LocalSyncTest.java
index 2367b9c..0352e9d 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/LocalSyncTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/LocalSyncTest.java
@@ -73,8 +73,9 @@
 		assertTrue("1.1", project.exists());
 
 		/* resources should not exist anymore */
-		for (int i = 1; i < resources.length; i++)
+		for (int i = 1; i < resources.length; i++) {
 			assertTrue("1.2", !resources[i].exists());
+		}
 	}
 
 	public void testProjectWithNoResources() {
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/MoveTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/MoveTest.java
index e08e667..cc1ed83 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/MoveTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/MoveTest.java
@@ -52,13 +52,15 @@
 	 * This test has Windows as the target OS. Drives C: and D: should be available.
 	 */
 	public void testMoveFileAcrossVolumes() {
-		if (!isWindows())
+		if (!isWindows()) {
 			return;
+		}
 
 		/* look for the adequate environment */
 		String[] devices = findAvailableDevices();
-		if (devices[0] == null || devices[1] == null)
+		if (devices[0] == null || devices[1] == null) {
 			return;
+		}
 
 		// create common objects
 		String location = getUniqueString();
@@ -182,13 +184,15 @@
 	 * This test has Windows as the target OS. Drives C: and D: should be available.
 	 */
 	public void testMoveFolderAcrossVolumes() {
-		if (!isWindows())
+		if (!isWindows()) {
 			return;
+		}
 
 		/* look for the adequate environment */
 		String[] devices = findAvailableDevices();
-		if (devices[0] == null || devices[1] == null)
+		if (devices[0] == null || devices[1] == null) {
 			return;
+		}
 
 		// create common objects
 		String location = getUniqueString();
@@ -332,8 +336,7 @@
 		for (int j = 0; j < numberOfProperties; j++) {
 			propNames[j] = "prop" + j;
 			propValues[j] = "value" + j;
-			for (int i = 0; i < resources.length; i++) {
-				IResource resource = resources[i];
+			for (IResource resource : resources) {
 				QualifiedName propName = new QualifiedName("test", resource.getName() + propNames[j]);
 				String propValue = resource.getName() + propValues[j];
 				resource.setPersistentProperty(propName, propValue);
@@ -403,8 +406,7 @@
 		for (int j = 0; j < numberOfProperties; j++) {
 			propNames[j] = "prop" + j;
 			propValues[j] = "value" + j;
-			for (int i = 0; i < resources.length; i++) {
-				IResource resource = resources[i];
+			for (IResource resource : resources) {
 				QualifiedName propName = new QualifiedName("test", resource.getName() + propNames[j]);
 				String propValue = resource.getName() + propValues[j];
 				resource.setPersistentProperty(propName, propValue);
@@ -704,8 +706,9 @@
 		}
 
 		// get new projects instances
-		for (int i = 0; i < numberOfProjects; i++)
+		for (int i = 0; i < numberOfProjects; i++) {
 			projects[i] = getWorkspace().getRoot().getProject(projectNames[i]);
+		}
 
 		// assert properties still exist (persistent and session)
 		for (int i = 0; i < numberOfProjects; i++) {
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/RefreshLocalPerformanceTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/RefreshLocalPerformanceTest.java
index c70b55f..ef45af3 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/RefreshLocalPerformanceTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/RefreshLocalPerformanceTest.java
@@ -40,13 +40,15 @@
 
 	protected int countChildren(File root) {
 		String[] children = root.list();
-		if (children == null)
+		if (children == null) {
 			return 0;
+		}
 		int result = 0;
-		for (int i = 0; i < children.length; i++) {
-			File child = new File(root, children[i]);
-			if (child.isDirectory())
+		for (String element : children) {
+			File child = new File(root, element);
+			if (child.isDirectory()) {
 				result += countChildren(child);
+			}
 			result++;
 		}
 		return result;
@@ -77,8 +79,9 @@
 	 */
 	public void testLocalRefreshPerformance() throws Exception {
 		// test if the test can be done in this machine
-		if (!bigSiteLocation.toFile().isDirectory())
+		if (!bigSiteLocation.toFile().isDirectory()) {
 			return;
+		}
 
 		// create common objects
 		int n = 10;
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/SafeChunkyInputOutputStreamTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/SafeChunkyInputOutputStreamTest.java
index 792c62f..1f6187a 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/SafeChunkyInputOutputStreamTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/SafeChunkyInputOutputStreamTest.java
@@ -29,20 +29,25 @@
 	}
 
 	protected boolean compare(byte[] source, byte[] target) {
-		if (source.length != target.length)
+		if (source.length != target.length) {
 			return false;
-		for (int i = 0; i < target.length; i++)
-			if (source[i] != target[i])
+		}
+		for (int i = 0; i < target.length; i++) {
+			if (source[i] != target[i]) {
 				return false;
+			}
+		}
 		return true;
 	}
 
 	protected byte[] merge(byte[] b1, byte[] b2) {
 		byte[] result = new byte[b1.length + b2.length];
-		for (int i = 0; i < b1.length; i++)
+		for (int i = 0; i < b1.length; i++) {
 			result[i] = b1[i];
-		for (int i = 0; i < b2.length; i++)
+		}
+		for (int i = 0; i < b2.length; i++) {
 			result[b1.length + i] = b2[i];
+		}
 		return result;
 	}
 
@@ -212,12 +217,13 @@
 		} catch (IOException e) {
 			fail("1.0", e);
 		} finally {
-			if (output != null)
+			if (output != null) {
 				try {
 					output.close();
 				} catch (IOException e) {
 					fail("1.1", e);
 				}
+			}
 		}
 
 		DataInputStream input = null;
@@ -230,12 +236,13 @@
 		} catch (IOException e) {
 			fail("2.1", e);
 		} finally {
-			if (input != null)
+			if (input != null) {
 				try {
 					input.close();
 				} catch (IOException e) {
 					fail("2.2", e);
 				}
+			}
 		}
 	}
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/SymlinkResourceTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/SymlinkResourceTest.java
index 06a9130..25e8073 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/SymlinkResourceTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/SymlinkResourceTest.java
@@ -83,8 +83,9 @@
 	 */
 	public void testBug232426() throws Exception {
 		// Only activate this test if testing of symbolic links is possible.
-		if (!canCreateSymLinks())
+		if (!canCreateSymLinks()) {
 			return;
+		}
 		/* Re-use projects which are cleaned up automatically */
 		final IProject project = projects[0];
 		getWorkspace().run((IWorkspaceRunnable) monitor -> {
@@ -113,8 +114,9 @@
 
 	public void testBug358830() throws Exception {
 		// Only activate this test if testing of symbolic links is possible.
-		if (!canCreateSymLinks())
+		if (!canCreateSymLinks()) {
 			return;
+		}
 		/* Re-use projects which are cleaned up automatically */
 		final IProject project = projects[0];
 		getWorkspace().run((IWorkspaceRunnable) monitor -> {
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/Test342968FileSystem.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/Test342968FileSystem.java
index b0ccbcc..1c250b2 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/Test342968FileSystem.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/Test342968FileSystem.java
@@ -14,8 +14,9 @@
 import java.net.URI;
 import java.net.URISyntaxException;
 import org.eclipse.core.filesystem.*;
-import org.eclipse.core.filesystem.provider.*;
+import org.eclipse.core.filesystem.provider.FileStore;
 import org.eclipse.core.filesystem.provider.FileSystem;
+import org.eclipse.core.filesystem.provider.FileTree;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IProgressMonitor;
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/UnifiedTreeTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/UnifiedTreeTest.java
index 1a97c1a..bd38aae 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/UnifiedTreeTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/localstore/UnifiedTreeTest.java
@@ -49,8 +49,9 @@
 				out.write("contents".getBytes());
 			} finally {
 				try {
-					if (out != null)
+					if (out != null) {
 						out.close();
+					}
 				} catch (IOException e) {
 					//ignore
 				}
@@ -78,8 +79,9 @@
 			IFileStore child = folder.getChild("fsFolder" + i);
 			child.mkdir(EFS.NONE, null);
 			set.put(child.toString(), "");
-			if (i < (limit / 2))
+			if (i < (limit / 2)) {
 				createFiles(child, set);
+			}
 		}
 	}
 
@@ -90,8 +92,9 @@
 			child.create(true, true, null);
 			String location = child.getLocation().toOSString();
 			set.put(location, "");
-			if (i < (limit / 2))
+			if (i < (limit / 2)) {
 				createFiles(child, set);
+			}
 		}
 	}
 
@@ -128,8 +131,9 @@
 			/* test the node.getLocalName() method */
 			final IResource resource = node.getResource();
 			final IFileStore store = ((Resource) resource).getStore();
-			if (node.existsInFileSystem())
+			if (node.existsInFileSystem()) {
 				assertEquals("1.0", store.fetchInfo().getName(), node.getLocalName());
+			}
 			assertEquals("1.1", store, node.getStore());
 
 			/* remove from the hash table the resource we're visiting */
@@ -173,16 +177,18 @@
 			final IResource resource = node.getResource();
 			IFileStore store = ((Resource) resource).getStore();
 			String key = store.fetchInfo().getName();
-			if (node.existsInFileSystem())
+			if (node.existsInFileSystem()) {
 				assertEquals("1.0", key, node.getLocalName());
+			}
 			assertEquals("1.1", store, node.getStore());
 
 			/* force children to be added to the queue */
 			node.getChildren();
 
 			/* skip some resources */
-			if (resource.getName().startsWith("fsFolder"))
+			if (resource.getName().startsWith("fsFolder")) {
 				return false;
+			}
 
 			/* remove from the hash table the resource we're visiting */
 			set.remove(resource.getLocation().toOSString());
@@ -225,8 +231,9 @@
 			/* test the node.getLocalName() method */
 			final IResource resource = node.getResource();
 			IFileStore store = ((Resource) resource).getStore();
-			if (node.existsInFileSystem())
+			if (node.existsInFileSystem()) {
 				assertEquals("1.0", store.fetchInfo().getName(), node.getLocalName());
+			}
 			assertEquals("1.1", store, node.getStore());
 			/* remove from the hash table the resource we're visiting */
 			set.remove(resource.getLocation().toOSString());
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/mapping/ChangeDescription.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/mapping/ChangeDescription.java
index 310e100..d3219d0 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/mapping/ChangeDescription.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/mapping/ChangeDescription.java
@@ -43,8 +43,7 @@
 	}
 
 	private void accumulateStatus(IResource[] resources, List<ModelStatus> result, String message) {
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
+		for (IResource resource : resources) {
 			result.add(new ModelStatus(IStatus.WARNING, "org.eclipse.core.tests.resources", TestModelProvider.ID, getMessageFor(message, resource)));
 		}
 	}
@@ -63,8 +62,9 @@
 			accumulateStatus(changedRoots.toArray(new IResource[changedRoots.size()]), result, CHANGED);
 			accumulateStatus(closedProjects.toArray(new IResource[closedProjects.size()]), result, CLOSED);
 			if (!result.isEmpty()) {
-				if (result.size() == 1)
+				if (result.size() == 1) {
 					return result.get(0);
+				}
 				return new MultiStatus("org.eclipse.core.tests.resources", 0, result.toArray(new IStatus[result.size()]), "Changes were validated", null);
 			}
 			return Status.OK_STATUS;
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/mapping/ChangeValidationTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/mapping/ChangeValidationTest.java
index 0b425d2..1a2548e 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/mapping/ChangeValidationTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/mapping/ChangeValidationTest.java
@@ -36,28 +36,30 @@
 		List<String> actualMessages = new ArrayList<>();
 		if (status.isMultiStatus()) {
 			IStatus[] children = status.getChildren();
-			for (int i = 0; i < children.length; i++) {
-				String message = getModelMessage(children[i]);
-				if (message != null)
+			for (IStatus element : children) {
+				String message = getModelMessage(element);
+				if (message != null) {
 					actualMessages.add(message);
+				}
 			}
 		} else {
 			String message = getModelMessage(status);
-			if (message != null)
+			if (message != null) {
 				actualMessages.add(message);
+			}
 		}
 		if (expectedMessages.length < actualMessages.size()) {
 			for (String actual : actualMessages) {
 				boolean found = false;
-				for (int i = 0; i < expectedMessages.length; i++) {
-					String expected = expectedMessages[i];
+				for (String expected : expectedMessages) {
 					if (actual.equals(expected)) {
 						found = true;
 						break;
 					}
 				}
-				if (!found)
+				if (!found) {
 					fail("Unexpected message returned: " + actual);
+				}
 			}
 		} else {
 			for (String expectedMessage : expectedMessages) {
@@ -80,8 +82,9 @@
 		if (status instanceof ModelStatus) {
 			ModelStatus ms = (ModelStatus) status;
 			String id = ms.getModelProviderId();
-			if (id.equals(TestModelProvider.ID))
+			if (id.equals(TestModelProvider.ID)) {
 				return status.getMessage();
+			}
 		}
 		return null;
 	}
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/mapping/TestModelProvider.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/mapping/TestModelProvider.java
index 916563e..efc1b82 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/mapping/TestModelProvider.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/mapping/TestModelProvider.java
@@ -34,8 +34,9 @@
 
 	@Override
 	public IStatus validateChange(IResourceDelta rootDelta, IProgressMonitor monitor) {
-		if (!enabled)
+		if (!enabled) {
 			return new ModelStatus(IStatus.OK, ResourcesPlugin.PI_RESOURCES, ID, Status.OK_STATUS.getMessage());
+		}
 		final ChangeDescription description = new ChangeDescription();
 		try {
 			rootDelta.accept(delta -> description.recordChange(delta));
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/properties/PropertyManagerTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/properties/PropertyManagerTest.java
index cf5b212..a207e97 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/properties/PropertyManagerTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/properties/PropertyManagerTest.java
@@ -11,7 +11,6 @@
  *******************************************************************************/
 package org.eclipse.core.tests.internal.properties;
 
-import java.util.Enumeration;
 import java.util.Vector;
 import junit.framework.Test;
 import junit.framework.TestSuite;
@@ -115,9 +114,9 @@
 
 	private void join(Thread[] threads) {
 		//wait for all threads to finish
-		for (int j = 0; j < threads.length; j++) {
+		for (Thread thread : threads) {
 			try {
-				threads[j].join();
+				thread.join();
 			} catch (InterruptedException e) {
 				fail("#join", e);
 			}
@@ -146,8 +145,9 @@
 		final CoreException[] errorPointer = new CoreException[1];
 		Thread[] threads = createThreads(target, names, values, errorPointer);
 		join(threads);
-		if (errorPointer[0] != null)
+		if (errorPointer[0] != null) {
 			fail("2.0", errorPointer[0]);
+		}
 
 		// remove trash
 		try {
@@ -191,8 +191,9 @@
 				fail("1.99." + i, e);
 			}
 			join(threads);
-			if (errorPointer[0] != null)
+			if (errorPointer[0] != null) {
 				fail("2.0." + i, errorPointer[0]);
+			}
 		}
 		// remove trash
 		try {
@@ -486,14 +487,12 @@
 		props.addElement(new StoredProperty(propName3, propValue3));
 
 		// set the properties individually and retrieve them
-		for (Enumeration<StoredProperty> e = props.elements(); e.hasMoreElements();) {
-			StoredProperty prop = e.nextElement();
+		for (StoredProperty prop : props) {
 			manager.setProperty(target, prop.getName(), prop.getStringValue());
 			assertEquals("1.0." + prop.getName(), prop.getStringValue(), manager.getProperty(target, prop.getName()));
 		}
 		// check properties are be appropriately deleted (when set to null)
-		for (Enumeration<StoredProperty> e = props.elements(); e.hasMoreElements();) {
-			StoredProperty prop = e.nextElement();
+		for (StoredProperty prop : props) {
 			manager.setProperty(target, prop.getName(), null);
 			assertEquals("2.0." + prop.getName(), null, manager.getProperty(target, prop.getName()));
 		}
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/ModelObjectReaderWriterTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/ModelObjectReaderWriterTest.java
index cf4da0b..c15f1db 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/ModelObjectReaderWriterTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/ModelObjectReaderWriterTest.java
@@ -175,10 +175,11 @@
 				String key = entry.getKey();
 				String value = entry.getValue();
 				String value2 = args2.get(key);
-				if (value == null)
+				if (value == null) {
 					assertNull(errorTag + ".2." + (i + 1) + x, value2);
-				else
+				} else {
 					assertTrue(errorTag + ".3." + (i + 1) + x, args.get(key).equals((args2.get(key))));
+				}
 				x++;
 			}
 		}
@@ -217,8 +218,9 @@
 			// The old reader previously returned null for an empty comment.  We
 			// are changing this so it now returns an empty string.
 			assertEquals(errorTag + ".1", 0, description2.getComment().length());
-		} else
+		} else {
 			assertTrue(errorTag + ".2", description.getComment().equals(description2.getComment()));
+		}
 
 		IProject[] projects = description.getReferencedProjects();
 		IProject[] projects2 = description2.getReferencedProjects();
@@ -246,9 +248,11 @@
 	}
 
 	protected boolean contains(Object key, Object[] array) {
-		for (int i = 0; i < array.length; i++)
-			if (key.equals(array[i]))
+		for (Object element : array) {
+			if (key.equals(element)) {
 				return true;
+			}
+		}
 		return false;
 	}
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/ProjectPreferenceModifyListener.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/ProjectPreferenceModifyListener.java
index 7a50bde..4ef0ddf 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/ProjectPreferenceModifyListener.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/ProjectPreferenceModifyListener.java
@@ -22,16 +22,19 @@
 	private static String getSegment(String path, int segment) {
 		int start = path.indexOf(IPath.SEPARATOR) == 0 ? 1 : 0;
 		int end = path.indexOf(IPath.SEPARATOR, start);
-		if (end == path.length() - 1)
+		if (end == path.length() - 1) {
 			end = -1;
+		}
 		for (int i = 0; i < segment; i++) {
-			if (end == -1)
+			if (end == -1) {
 				return null;
+			}
 			start = end + 1;
 			end = path.indexOf(IPath.SEPARATOR, start);
 		}
-		if (end == -1)
+		if (end == -1) {
 			end = path.length();
+		}
 		return path.substring(start, end);
 	}
 
@@ -41,8 +44,9 @@
 
 	@Override
 	public IEclipsePreferences preApply(IEclipsePreferences node) {
-		if (equalsQualifier(node, "test.load.is.import"))
+		if (equalsQualifier(node, "test.load.is.import")) {
 			return testLoadIsImport(node);
+		}
 		return super.preApply(node);
 	}
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/ProjectPreferencesTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/ProjectPreferencesTest.java
index 58a3b48..18fe632 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/ProjectPreferencesTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/ProjectPreferencesTest.java
@@ -212,12 +212,13 @@
 		} catch (IOException e) {
 			fail("1.0", e);
 		} finally {
-			if (input != null)
+			if (input != null) {
 				try {
 					input.close();
 				} catch (IOException e) {
 					// ignore
 				}
+			}
 		}
 
 		// change settings in the file
@@ -233,12 +234,13 @@
 		} catch (IOException e) {
 			fail("2.0", e);
 		} finally {
-			if (output != null)
+			if (output != null) {
 				try {
 					output.close();
 				} catch (IOException e) {
 					// ignore
 				}
+			}
 		}
 
 		IFile workspaceFile = getFileInWorkspace(project, qualifier);
@@ -425,12 +427,13 @@
 		} catch (IOException e) {
 			fail("1.3", e);
 		} finally {
-			if (contents != null)
+			if (contents != null) {
 				try {
 					contents.close();
 				} catch (IOException e) {
 					// ignore
 				}
+			}
 		}
 		assertEquals("2.0", value2, props.getProperty("subnode/" + key2));
 		assertEquals("2.1", value1, props.getProperty("subnode/" + key1));
@@ -573,8 +576,9 @@
 			fail("1.1", e);
 		} finally {
 			try {
-				if (output != null)
+				if (output != null) {
 					output.close();
+				}
 			} catch (IOException e) {
 				// ignore
 			}
@@ -585,10 +589,12 @@
 			@Override
 			public void logging(IStatus status, String plugin) {
 				Throwable exception = status.getException();
-				if (exception == null || !(exception instanceof CoreException))
+				if (exception == null || !(exception instanceof CoreException)) {
 					return;
-				if (IResourceStatus.WORKSPACE_LOCKED == ((CoreException) exception).getStatus().getCode())
+				}
+				if (IResourceStatus.WORKSPACE_LOCKED == ((CoreException) exception).getStatus().getCode()) {
 					fail("3.0");
+				}
 			}
 		};
 
@@ -874,8 +880,9 @@
 			List<String> lines = new ArrayList<>();
 			String line = br.readLine();
 			while (line != null) {
-				if ((!line.startsWith("#")) && (!line.startsWith("eclipse.preferences.version")))
+				if ((!line.startsWith("#")) && (!line.startsWith("eclipse.preferences.version"))) {
 					lines.add(line);
+				}
 				line = br.readLine();
 			}
 			br.close();
@@ -956,14 +963,16 @@
 			// don't delete the prefs file, it will be used in the next step
 
 			// remove preferences for the next step
-			if (oldInstanceValue == null)
+			if (oldInstanceValue == null) {
 				instanceNode.remove(Platform.PREF_LINE_SEPARATOR);
-			else
+			} else {
 				instanceNode.put(Platform.PREF_LINE_SEPARATOR, oldInstanceValue);
-			if (oldProjectValue == null)
+			}
+			if (oldProjectValue == null) {
 				projectNode.remove(Platform.PREF_LINE_SEPARATOR);
-			else
+			} else {
 				projectNode.put(Platform.PREF_LINE_SEPARATOR, oldProjectValue);
+			}
 			instanceNode.flush();
 			projectNode.flush();
 			node.put(key, getUniqueString());
@@ -972,10 +981,11 @@
 			assertEquals("4.0", recentlyUsedLineSeparator, getLineSeparatorFromFile(file));
 		} finally {
 			// revert instance preference to original value
-			if (oldInstanceValue == null)
+			if (oldInstanceValue == null) {
 				instanceNode.remove(Platform.PREF_LINE_SEPARATOR);
-			else
+			} else {
 				instanceNode.put(Platform.PREF_LINE_SEPARATOR, oldInstanceValue);
+			}
 			instanceNode.flush();
 			project.delete(true, getMonitor());
 		}
@@ -1081,12 +1091,13 @@
 		} catch (IOException e) {
 			fail("1.0", e);
 		} finally {
-			if (input != null)
+			if (input != null) {
 				try {
 					input.close();
 				} catch (IOException e) {
 					// ignore
 				}
+			}
 		}
 
 		// reset the listener
@@ -1222,15 +1233,17 @@
 	 */
 	private boolean isNodeCleared(Preferences node, String[] childrenNames) throws BackingStoreException {
 		// check if the node has associate values
-		if (node.keys().length != 0)
+		if (node.keys().length != 0) {
 			return false;
+		}
 
 		// perform a subsequent check for the node children
 		Preferences childNode = null;
-		for (int i = 0; i < childrenNames.length; i++) {
-			childNode = node.node(childrenNames[i]);
-			if (!isNodeCleared(childNode, childNode.childrenNames()))
+		for (String childrenName : childrenNames) {
+			childNode = node.node(childrenName);
+			if (!isNodeCleared(childNode, childNode.childrenNames())) {
 				return false;
+			}
 		}
 		return true;
 	}
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/ResourceInfoTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/ResourceInfoTest.java
index 77045f1..48b94fc 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/ResourceInfoTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/ResourceInfoTest.java
@@ -44,38 +44,46 @@
 	}
 
 	static public void assertEquals(String message, byte[] expected, byte[] actual) {
-		if (expected == null && actual == null)
+		if (expected == null && actual == null) {
 			return;
-		if (expected == null || actual == null)
+		}
+		if (expected == null || actual == null) {
 			assertTrue(message, false);
+		}
 		assertEquals(message, expected.length, actual.length);
-		for (int i = 0; i < expected.length; i++)
+		for (int i = 0; i < expected.length; i++) {
 			assertEquals(message, expected[i], actual[i]);
+		}
 	}
 
 	static public void assertEquals(String message, Map<?, ?> expected, Map<?, ?> actual) {
-		if (expected == null && actual == null)
+		if (expected == null && actual == null) {
 			return;
-		if (expected == null || actual == null)
+		}
+		if (expected == null || actual == null) {
 			assertTrue(message, false);
+		}
 		assertEquals(message, expected.size(), actual.size());
 		for (Map.Entry<?, ?> entry : expected.entrySet()) {
 			Object key = entry.getKey();
 			assertTrue(message, actual.containsKey(key));
 			Object expectedValue = entry.getValue();
 			Object actualValue = actual.get(key);
-			if (expectedValue instanceof byte[] && actualValue instanceof byte[])
+			if (expectedValue instanceof byte[] && actualValue instanceof byte[]) {
 				assertEquals(message, (byte[]) expectedValue, (byte[]) actualValue);
-			else
+			} else {
 				assertEquals(message, expectedValue, actualValue);
+			}
 		}
 	}
 
 	static public void assertEquals(String message, ResourceInfo expected, ResourceInfo actual) {
-		if (expected == null && actual == null)
+		if (expected == null && actual == null) {
 			return;
-		if (expected == null || actual == null)
+		}
+		if (expected == null || actual == null) {
 			assertTrue(message, false);
+		}
 		boolean different = false;
 		different &= expected.getFlags() == actual.getFlags();
 		different &= expected.getContentId() == actual.getContentId();
@@ -85,8 +93,9 @@
 		// TODO sync info isn't serialized by this class so don't expect it to be loaded
 		//	assertEquals(message, expected.getSyncInfo(false), actual.getSyncInfo(false));
 		different &= expected.getMarkerGenerationCount() == actual.getMarkerGenerationCount();
-		if (different)
+		if (different) {
 			assertTrue(message, false);
+		}
 	}
 
 	public void testSerialization() {
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/SimpleNature.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/SimpleNature.java
index 40c7983..ebd26b1 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/SimpleNature.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/SimpleNature.java
@@ -23,8 +23,9 @@
 	 * Returns the instance of this nature.
 	 */
 	public static SimpleNature getInstance() {
-		if (instance == null)
+		if (instance == null) {
 			new SimpleNature();
+		}
 		return instance;
 	}
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/TestWorkspaceJob.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/TestWorkspaceJob.java
index 0cea244..f61d489 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/TestWorkspaceJob.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/TestWorkspaceJob.java
@@ -29,8 +29,9 @@
 		super("TestWorkspaceJob");
 		this.duration = duration;
 		//only allow durations that are a multiple of the tick length for simplicity
-		if (duration % tickLength > 0)
+		if (duration % tickLength > 0) {
 			throw new IllegalArgumentException("Use a job duration that it is a multiple of " + tickLength);
+		}
 	}
 
 	@Override
@@ -39,15 +40,16 @@
 		monitor.beginTask(getName(), ticks <= 0 ? 1 : ticks);
 		if (touch) {
 			IProject[] projects = ResourcesPlugin.getWorkspace().getRoot().getProjects();
-			for (int i = 0; i < projects.length; i++) {
-				projects[i].touch(null);
+			for (IProject project : projects) {
+				project.touch(null);
 			}
 		}
 		try {
 			for (int i = 0; i < ticks; i++) {
 				monitor.subTask("Tick: " + i);
-				if (monitor.isCanceled())
+				if (monitor.isCanceled()) {
 					return Status.CANCEL_STATUS;
+				}
 				try {
 					Thread.sleep(tickLength);
 				} catch (InterruptedException e) {
@@ -55,8 +57,9 @@
 				}
 				monitor.worked(1);
 			}
-			if (ticks <= 0)
+			if (ticks <= 0) {
 				monitor.worked(1);
+			}
 		} finally {
 			monitor.done();
 		}
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/WorkspaceConcurrencyTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/WorkspaceConcurrencyTest.java
index e75071c..0d2c079 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/WorkspaceConcurrencyTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/WorkspaceConcurrencyTest.java
@@ -120,8 +120,9 @@
 			} catch (InterruptedException e1) {
 				//ignore
 			}
-			if (error[0] != null)
+			if (error[0] != null) {
 				fail("3.0", error[0]);
+			}
 		} finally {
 			getWorkspace().removeResourceChangeListener(listener);
 		}
@@ -261,17 +262,21 @@
 
 			//ensure no jobs failed
 			IStatus result = jobOne.getResult();
-			if (!result.isOK())
+			if (!result.isOK()) {
 				fail("1.0", new CoreException(result));
+			}
 			result = jobTwo.getResult();
-			if (!result.isOK())
+			if (!result.isOK()) {
 				fail("1.1", new CoreException(result));
+			}
 			result = jobThree.getResult();
-			if (!result.isOK())
+			if (!result.isOK()) {
 				fail("1.2", new CoreException(result));
+			}
 
-			if (failure[0] != null)
+			if (failure[0] != null) {
 				fail("1.3", failure[0]);
+			}
 		} finally {
 			//ensure listener is removed
 			workspace.removeResourceChangeListener(listener);
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/WorkspacePreferencesTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/WorkspacePreferencesTest.java
index 672e150..7647775 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/WorkspacePreferencesTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/resources/WorkspacePreferencesTest.java
@@ -64,8 +64,7 @@
 		// String default-default (ResourcesPlugin.PREF_BUILD_ORDER).
 		String[] descriptionProperties = {ResourcesPlugin.PREF_AUTO_BUILDING, ResourcesPlugin.PREF_DEFAULT_BUILD_ORDER, ResourcesPlugin.PREF_FILE_STATE_LONGEVITY, ResourcesPlugin.PREF_MAX_BUILD_ITERATIONS, ResourcesPlugin.PREF_MAX_FILE_STATE_SIZE, ResourcesPlugin.PREF_MAX_FILE_STATES, ResourcesPlugin.PREF_SNAPSHOT_INTERVAL};
 		List<String> defaultPropertiesList = Arrays.asList(preferences.defaultPropertyNames());
-		for (int i = 0; i < descriptionProperties.length; i++) {
-			String property = descriptionProperties[i];
+		for (String property : descriptionProperties) {
 			assertTrue("2.0 - Description property is not default: " + property, defaultPropertiesList.contains(property));
 		}
 	}
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/utils/ObjectMapTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/utils/ObjectMapTest.java
index 9a336fa..bfbf245 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/utils/ObjectMapTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/utils/ObjectMapTest.java
@@ -54,8 +54,9 @@
 		ObjectMap<Integer, Object> map = new ObjectMap<>();
 		int max = 100;
 		Object[] values = new Object[max];
-		for (int i = 0; i < max; i++)
+		for (int i = 0; i < max; i++) {
 			values[i] = new Long(System.currentTimeMillis());
+		}
 
 		// add each object to the map
 		for (int i = 0; i < values.length; i++) {
@@ -92,8 +93,9 @@
 			assertTrue("2.0." + i, !map.containsKey(key));
 			assertEquals("2.1," + i, i, map.size());
 			// check that the others still exist
-			for (int j = 0; j < i; j++)
+			for (int j = 0; j < i; j++) {
 				assertTrue("2.2." + j, map.containsKey(Integer.valueOf(j)));
+			}
 		}
 
 		// all gone?
@@ -118,8 +120,9 @@
 		ObjectMap<Integer, Object> map = populateMap(MAXIMUM);
 
 		Collection<Object> result = map.values();
-		for (int i = 0; i < MAXIMUM; i++)
+		for (int i = 0; i < MAXIMUM; i++) {
 			assertTrue("2.0." + i, result.contains(values[i]));
+		}
 	}
 
 	public void testKeySet() {
@@ -131,8 +134,9 @@
 	public void testEntrySet() {
 		ObjectMap<Integer, Object> map = populateMap(MAXIMUM);
 		Set<Map.Entry<Integer, Object>> entries = map.entrySet();
-		for (int i = 0; i < MAXIMUM; i++)
+		for (int i = 0; i < MAXIMUM; i++) {
 			assertTrue("1.0." + i, contains(entries, values[i]));
+		}
 	}
 
 	/**
@@ -140,8 +144,9 @@
 	 */
 	private boolean contains(Set<Map.Entry<Integer, Object>> set, Object value) {
 		for (Map.Entry<Integer, Object> entry : set) {
-			if (entry.getValue().equals(value))
+			if (entry.getValue().equals(value)) {
 				return true;
+			}
 		}
 		return false;
 	}
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/utils/QueueTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/utils/QueueTest.java
index 2d0c4e1..85d01a8 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/utils/QueueTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/utils/QueueTest.java
@@ -30,44 +30,54 @@
 	public void testElements() {
 		/* add elements without removing */
 		Queue<String> queue = new Queue<>(5, false);
-		for (int i = 0; i < 10; i++)
+		for (int i = 0; i < 10; i++) {
 			queue.add(String.valueOf(i));
+		}
 
 		/* assert elements are correct */
 		Iterator<String> elements = queue.iterator();
-		for (int i = 0; i < 10; i++)
+		for (int i = 0; i < 10; i++) {
 			assertTrue("1.0", elements.next().equals(String.valueOf(i)));
+		}
 
 		/* add and remove elements */
 		queue = new Queue<>(5, false);
-		for (int i = 0; i < 5; i++)
+		for (int i = 0; i < 5; i++) {
 			queue.add(String.valueOf(i));
-		for (int i = 0; i < 4; i++)
+		}
+		for (int i = 0; i < 4; i++) {
 			queue.remove();
-		for (int i = 0; i < 10; i++)
+		}
+		for (int i = 0; i < 10; i++) {
 			queue.add(String.valueOf(i));
+		}
 
 		/* assert elements are correct */
 		elements = queue.iterator();
-		for (int i = 4; i < 5; i++)
+		for (int i = 4; i < 5; i++) {
 			assertTrue("2.0", elements.next().equals(String.valueOf(i)));
-		for (int i = 0; i < 10; i++)
+		}
+		for (int i = 0; i < 10; i++) {
 			assertTrue("2.1", elements.next().equals(String.valueOf(i)));
+		}
 	}
 
 	public void testGrow() {
 		/* add elements without removing */
 		Queue<String> queue = new Queue<>(5, false);
-		for (int i = 0; i < 10; i++)
+		for (int i = 0; i < 10; i++) {
 			queue.add(String.valueOf(i));
+		}
 		assertTrue("1.0", queue.size() == 10);
 
 		/* add and remove elements */
 		queue = new Queue<>(5, false);
-		for (int i = 0; i < 5; i++)
+		for (int i = 0; i < 5; i++) {
 			queue.add(String.valueOf(i));
-		for (int i = 0; i < 4; i++)
+		}
+		for (int i = 0; i < 4; i++) {
 			queue.remove();
+		}
 		for (int i = 0; i < 10; i++) {
 			queue.add(String.valueOf(i));
 		}
@@ -77,18 +87,21 @@
 	public void testRemoveTail() {
 		/* head < tail */
 		Queue<String> queue = new Queue<>(10, false);
-		for (int i = 0; i < 8; i++)
+		for (int i = 0; i < 8; i++) {
 			queue.add(String.valueOf(i));
+		}
 		assertTrue("1.0", queue.peekTail().equals("7"));
 		assertTrue("1.1", queue.removeTail().equals("7"));
 		assertTrue("1.2", queue.peekTail().equals("6"));
 
 		/* head > tail */
 		queue = new Queue<>(5, false);
-		for (int i = 0; i < 5; i++)
+		for (int i = 0; i < 5; i++) {
 			queue.add(String.valueOf(i));
-		for (int i = 0; i < 4; i++)
+		}
+		for (int i = 0; i < 4; i++) {
 			queue.remove();
+		}
 		for (int i = 0; i < 10; i++) {
 			queue.add(String.valueOf(i));
 		}
@@ -109,8 +122,9 @@
 		}
 
 		/* remove elements */
-		for (int i = 0; i < 9; i++)
+		for (int i = 0; i < 9; i++) {
 			queue.remove();
+		}
 
 		/* add one more element to avoid null */
 		queue.add(new ReusableObject());
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/watson/ElementTreeIteratorTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/watson/ElementTreeIteratorTest.java
index c223db2..e2b5b8f 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/watson/ElementTreeIteratorTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/watson/ElementTreeIteratorTest.java
@@ -133,8 +133,8 @@
 	 */
 	void recursiveDelete(ElementTree tree, IPath path) {
 		IPath[] children = tree.getChildren(path);
-		for (int i = 0; i < children.length; i++) {
-			recursiveDelete(tree, children[i]);
+		for (IPath element : children) {
+			recursiveDelete(tree, element);
 		}
 		tree.deleteElement(path);
 	}
@@ -147,8 +147,8 @@
 			private static final long serialVersionUID = 1L;
 
 			public void pushAll(IPath[] array) {
-				for (int i = 0; i < array.length; i++) {
-					push(array[i]);
+				for (IPath element : array) {
+					push(element);
 				}
 			}
 		}
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/watson/ElementTreeSerializationTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/watson/ElementTreeSerializationTest.java
index 036635b..1c27f9c 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/watson/ElementTreeSerializationTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/watson/ElementTreeSerializationTest.java
@@ -104,9 +104,9 @@
 		IPath[] paths = TestUtil.getTreePaths();
 		int[] depths = getTreeDepths();
 
-		for (int p = 0; p < paths.length; p++) {
-			for (int d = 0; d < depths.length; d++) {
-				doTest(paths[p], depths[d]);
+		for (IPath path : paths) {
+			for (int depth : depths) {
+				doTest(path, depth);
 			}
 		}
 	}
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/watson/PhantomComparator.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/watson/PhantomComparator.java
index bf96f6d..35255f9 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/watson/PhantomComparator.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/watson/PhantomComparator.java
@@ -69,8 +69,9 @@
 				if (oldInfo.name == null && newInfo.name == null) {
 					return K_NO_CHANGE;
 				}
-				if (oldInfo.name == null || newInfo.name == null)
+				if (oldInfo.name == null || newInfo.name == null) {
 					return CHANGED;
+				}
 				if (oldInfo.name.equals(newInfo.name)) {
 					return K_NO_CHANGE;
 				} else {
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/watson/TestElementComparator.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/watson/TestElementComparator.java
index bbfc799..ae706af 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/watson/TestElementComparator.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/watson/TestElementComparator.java
@@ -41,12 +41,14 @@
 	@Override
 	public int compare(Object oldInfo, Object newInfo) {
 		if (oldInfo == null) {
-			if (newInfo == null)
+			if (newInfo == null) {
 				return CHANGED;
+			}
 			return ADDED;
 		}
-		if (newInfo == null)
+		if (newInfo == null) {
 			return REMOVED;
+		}
 		return testEquality(oldInfo, newInfo) ? K_NO_CHANGE : CHANGED;
 	}
 
@@ -64,10 +66,12 @@
 	 * Makes a comparison based on equality
 	 */
 	protected boolean testEquality(Object oldInfo, Object newInfo) {
-		if (oldInfo == null && newInfo == null)
+		if (oldInfo == null && newInfo == null) {
 			return true;
-		if (oldInfo == null || newInfo == null)
+		}
+		if (oldInfo == null || newInfo == null) {
 			return false;
+		}
 
 		return oldInfo.equals(newInfo);
 	}
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/watson/TestUtil.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/watson/TestUtil.java
index 7f2b1d3..57dd553 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/watson/TestUtil.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/internal/watson/TestUtil.java
@@ -221,9 +221,9 @@
 		/* create file elements */
 		tree = tree.newEmptyDelta();
 		IPath[] files = getFilePaths(path);
-		for (int i = 0; i < files.length; i++) {
-			Object data = files[i].toString();
-			tree.createElement(files[i], data);
+		for (IPath file : files) {
+			Object data = file.toString();
+			tree.createElement(file, data);
 
 			tree.immutable();
 			trees.addElement(tree);
@@ -233,8 +233,8 @@
 		/* modify the data of all file elements a few times */
 		for (int i = 0; i < repeat; i++) {
 			Object data = "data" + i;
-			for (int f = 0; f < files.length; f++) {
-				tree.setElementData(files[f], data);
+			for (IPath file : files) {
+				tree.setElementData(file, data);
 				tree.immutable();
 				trees.addElement(tree);
 				tree = tree.newEmptyDelta();
@@ -242,8 +242,8 @@
 		}
 
 		/* delete all file elements */
-		for (int i = 0; i < files.length; i++) {
-			tree.deleteElement(files[i]);
+		for (IPath file : files) {
+			tree.deleteElement(file);
 			tree.immutable();
 			trees.addElement(tree);
 			tree = tree.newEmptyDelta();
@@ -267,10 +267,10 @@
 		/* create file elements */
 		tree = tree.newEmptyDelta();
 		IPath[] files = getFilePaths(path);
-		for (int i = 0; i < files.length; i++) {
-			Object data = files[i].toString();
+		for (IPath file : files) {
+			Object data = file.toString();
 
-			tree.createElement(files[i], data);
+			tree.createElement(file, data);
 		}
 
 		tree.immutable();
@@ -280,8 +280,8 @@
 		/* modify the data of all file elements a few times */
 		for (int i = 0; i < repeat; i++) {
 			Object data = "data" + i;
-			for (int f = 0; f < files.length; f++) {
-				tree.setElementData(files[f], data);
+			for (IPath file : files) {
+				tree.setElementData(file, data);
 			}
 		}
 
@@ -290,8 +290,8 @@
 		tree = tree.newEmptyDelta();
 
 		/* delete all file elements */
-		for (int i = 0; i < files.length; i++) {
-			tree.deleteElement(files[i]);
+		for (IPath file : files) {
+			tree.deleteElement(file);
 		}
 
 		tree.immutable();
@@ -345,13 +345,15 @@
 		for (int i = 0; i < len * 100; i++) {
 			/* get any array offset */
 			int off1 = (int) (random.nextFloat() * len);
-			if (off1 == len)
+			if (off1 == len) {
 				continue;
+			}
 
 			/* get another array offset */
 			int off2 = (int) (random.nextFloat() * len);
-			if (off2 == len)
+			if (off2 == len) {
 				continue;
+			}
 
 			/* switch */
 			Object temp = first[off1];
@@ -372,13 +374,15 @@
 		for (int i = 0; i < len * 100; i++) {
 			/* get any array offset */
 			int off1 = (int) (random.nextFloat() * len);
-			if (off1 == len)
+			if (off1 == len) {
 				continue;
+			}
 
 			/* get another array offset */
 			int off2 = (int) (random.nextFloat() * len);
-			if (off2 == len)
+			if (off2 == len) {
 				continue;
+			}
 
 			/* switch */
 			Object temp = first[off1];
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/CharsetTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/CharsetTest.java
index d9f2697..214f170 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/CharsetTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/CharsetTest.java
@@ -40,8 +40,9 @@
 		void internalVerifyDelta(IResourceDelta delta) {
 			// do NOT ignore any changes to project preferences only to .project
 			IPath path = delta.getFullPath();
-			if (path.segmentCount() == 2 && path.segment(1).equals(".project"))
+			if (path.segmentCount() == 2 && path.segment(1).equals(".project")) {
 				return;
+			}
 			super.internalVerifyDelta(delta);
 		}
 
@@ -52,17 +53,20 @@
 		@Override
 		public synchronized void resourceChanged(IResourceChangeEvent e) {
 			// to make testing easier, we allow events from the main or other thread to be ignored
-			if (isSet(IGNORE_BACKGROUND_THREAD) && Thread.currentThread() != creationThread)
+			if (isSet(IGNORE_BACKGROUND_THREAD) && Thread.currentThread() != creationThread) {
 				return;
-			if (isSet(IGNORE_CREATION_THREAD) && Thread.currentThread() == creationThread)
+			}
+			if (isSet(IGNORE_CREATION_THREAD) && Thread.currentThread() == creationThread) {
 				return;
+			}
 			super.resourceChanged(e);
 			this.notify();
 		}
 
 		public synchronized boolean waitForEvent(long limit) {
-			if (hasBeenNotified())
+			if (hasBeenNotified()) {
 				return true;
+			}
 			try {
 				this.wait(limit);
 			} catch (InterruptedException e) {
@@ -136,9 +140,9 @@
 	 * Asserts that the given resources have the given [default] charset.
 	 */
 	private void assertCharsetIs(String tag, String encoding, IResource[] resources, boolean checkImplicit) throws CoreException {
-		for (int i = 0; i < resources.length; i++) {
-			String resourceCharset = resources[i] instanceof IFile ? ((IFile) resources[i]).getCharset(checkImplicit) : ((IContainer) resources[i]).getDefaultCharset(checkImplicit);
-			assertEquals(tag + " " + resources[i].getFullPath(), encoding, resourceCharset);
+		for (IResource resource : resources) {
+			String resourceCharset = resource instanceof IFile ? ((IFile) resource).getCharset(checkImplicit) : ((IContainer) resource).getDefaultCharset(checkImplicit);
+			assertEquals(tag + " " + resource.getFullPath(), encoding, resourceCharset);
 		}
 	}
 
@@ -177,11 +181,13 @@
 	//	}
 
 	private void clearAllEncodings(IResource root) throws CoreException {
-		if (root == null || !root.exists())
+		if (root == null || !root.exists()) {
 			return;
+		}
 		IResourceVisitor visitor = resource -> {
-			if (!resource.exists())
+			if (!resource.exists()) {
 				return false;
+			}
 			switch (resource.getType()) {
 				case IResource.FILE :
 					((IFile) resource).setCharset(null, getMonitor());
@@ -198,8 +204,9 @@
 	}
 
 	private IFile getResourcesPreferenceFile(IProject project, boolean forDerivedResources) {
-		if (forDerivedResources)
+		if (forDerivedResources) {
 			return project.getFolder(EclipsePreferences.DEFAULT_PREFERENCES_DIRNAME).getFile(ResourcesPlugin.PI_RESOURCES + ".derived." + EclipsePreferences.PREFS_FILE_EXTENSION);
+		}
 		return project.getFolder(EclipsePreferences.DEFAULT_PREFERENCES_DIRNAME).getFile(ResourcesPlugin.PI_RESOURCES + "." + EclipsePreferences.PREFS_FILE_EXTENSION);
 	}
 
@@ -211,11 +218,13 @@
 		org.osgi.service.prefs.Preferences node = Platform.getPreferencesService().getRootNode().node(ProjectScope.SCOPE);
 		String projectName = project.getName();
 		try {
-			if (!node.nodeExists(projectName))
+			if (!node.nodeExists(projectName)) {
 				return false;
+			}
 			node = node.node(projectName);
-			if (!node.nodeExists(ResourcesPlugin.PI_RESOURCES))
+			if (!node.nodeExists(ResourcesPlugin.PI_RESOURCES)) {
 				return false;
+			}
 			node = node.node(ResourcesPlugin.PI_RESOURCES);
 			return node.getBoolean(ResourcesPlugin.PREF_SEPARATE_DERIVED_ENCODINGS, false);
 		} catch (BackingStoreException e) {
@@ -226,10 +235,11 @@
 
 	private void setDerivedEncodingStoredSeparately(String tag, IProject project, boolean value) {
 		org.osgi.service.prefs.Preferences prefs = new ProjectScope(project).getNode(ResourcesPlugin.PI_RESOURCES);
-		if (!value)
+		if (!value) {
 			prefs.remove(ResourcesPlugin.PREF_SEPARATE_DERIVED_ENCODINGS);
-		else
+		} else {
 			prefs.putBoolean(ResourcesPlugin.PREF_SEPARATE_DERIVED_ENCODINGS, true);
+		}
 		try {
 			prefs.flush();
 		} catch (BackingStoreException e) {
@@ -337,8 +347,9 @@
 			root.setDefaultCharset(null);
 			assertNull("1.0", root.getDefaultCharset(false));
 		} finally {
-			if (originalUserCharset != null)
+			if (originalUserCharset != null) {
 				root.setDefaultCharset(originalUserCharset);
+			}
 		}
 	}
 
@@ -397,8 +408,9 @@
 		// test that we can get the charset, when the file is out-of-sync
 		ensureExistsInWorkspace(file, true);
 		try {
-			if (!file.getLocation().toFile().delete())
+			if (!file.getLocation().toFile().delete()) {
 				fail("2.0");
+			}
 			file.getCharset(true);
 		} catch (CoreException ex) {
 			fail("2.1");
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/Comparator.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/Comparator.java
index 66cb128..2134502 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/Comparator.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/Comparator.java
@@ -70,10 +70,10 @@
 				checkList[i] = false;
 			}
 
-			for (int i = 0; i < obj0.length; ++i) {
+			for (Object element : obj0) {
 				boolean found = false;
 				for (int j = 0; !found && j < obj1.length; ++j) {
-					if (!checkList[j] && equals(obj0[i], obj1[j])) {
+					if (!checkList[j] && equals(element, obj1[j])) {
 						checkList[j] = true;
 						found = true;
 					}
@@ -88,17 +88,22 @@
 	}
 
 	public static boolean equals(ICommand[] cs0, ICommand[] cs1) {
-		if (cs0 == cs1)
+		if (cs0 == cs1) {
 			return true;
-		if (cs0 == null || cs1 == null)
+		}
+		if (cs0 == null || cs1 == null) {
 			return false;
-		if (cs0.length != cs1.length)
+		}
+		if (cs0.length != cs1.length) {
 			return false;
+		}
 		for (int i = 0; i < cs0.length; ++i) {
-			if (!cs0[i].getBuilderName().equals(cs1[i].getBuilderName()))
+			if (!cs0[i].getBuilderName().equals(cs1[i].getBuilderName())) {
 				return false;
-			if (!equals(cs0[i].getArguments(), cs1[i].getArguments()))
+			}
+			if (!equals(cs0[i].getArguments(), cs1[i].getArguments())) {
 				return false;
+			}
 		}
 		return true;
 	}
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ContentDescriptionManagerTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ContentDescriptionManagerTest.java
index 53cdd97..9ddfc92 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ContentDescriptionManagerTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ContentDescriptionManagerTest.java
@@ -10,8 +10,6 @@
  *******************************************************************************/
 package org.eclipse.core.tests.resources;
 
-import org.eclipse.core.runtime.CoreException;
-
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 import junit.framework.Test;
@@ -65,8 +63,9 @@
 
 	protected InputStream projectDescriptionWithNatures(String project, String[] natures) {
 		StringBuffer contents = new StringBuffer("<?xml version=\"1.0\" encoding=\"UTF-8\"?><projectDescription><name>" + project + "</name><natures>");
-		for (int i = 0; i < natures.length; i++)
-			contents.append("<nature>" + natures[i] + "</nature>");
+		for (String nature : natures) {
+			contents.append("<nature>" + nature + "</nature>");
+		}
 		contents.append("</natures></projectDescription>");
 		return new ByteArrayInputStream(contents.toString().getBytes());
 	}
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/FilteredResourceTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/FilteredResourceTest.java
index bbd60c5..13c92ca 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/FilteredResourceTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/FilteredResourceTest.java
@@ -215,10 +215,10 @@
 			fail("1.9", e);
 		}
 		assertEquals("2.0", members.length, 3);
-		for (int i = 0; i < members.length; i++) {
-			if (members[i].getType() == IResource.FOLDER) {
-				assertEquals("2.1", members[i].getType(), IResource.FOLDER);
-				assertEquals("2.2", members[i].getName(), "foo");
+		for (IResource member : members) {
+			if (member.getType() == IResource.FOLDER) {
+				assertEquals("2.1", member.getType(), IResource.FOLDER);
+				assertEquals("2.2", member.getName(), "foo");
 			}
 		}
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/HiddenResourceTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/HiddenResourceTest.java
index d67a993..7b21826 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/HiddenResourceTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/HiddenResourceTest.java
@@ -682,10 +682,10 @@
 		IResource[] resources = new IResource[] {project, folder, file, subFile};
 
 		// trying to set the value on non-existing resources will fail
-		for (int i = 0; i < resources.length; i++) {
+		for (IResource resource : resources) {
 			try {
-				resources[i].setHidden(true);
-				fail("0.0." + resources[i].getFullPath());
+				resource.setHidden(true);
+				fail("0.0." + resource.getFullPath());
 			} catch (CoreException e) {
 				// expected
 			}
@@ -695,14 +695,13 @@
 		ensureExistsInWorkspace(resources, true);
 
 		// initial values should be false
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
+		for (IResource resource2 : resources) {
+			IResource resource = resource2;
 			assertTrue("1.0: " + resource.getFullPath(), !resource.isHidden());
 		}
 
 		// now set the values
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
+		for (IResource resource : resources) {
 			try {
 				resource.setHidden(true);
 			} catch (CoreException e) {
@@ -711,8 +710,8 @@
 		}
 
 		// the values should be true for projects only
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
+		for (IResource resource2 : resources) {
+			IResource resource = resource2;
 			switch (resource.getType()) {
 				case IResource.PROJECT :
 				case IResource.FOLDER :
@@ -726,8 +725,7 @@
 		}
 
 		// clear the values
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
+		for (IResource resource : resources) {
 			try {
 				resource.setHidden(false);
 			} catch (CoreException e) {
@@ -736,8 +734,8 @@
 		}
 
 		// values should be false again
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
+		for (IResource resource2 : resources) {
+			IResource resource = resource2;
 			assertTrue("5.0: " + resource.getFullPath(), !resource.isHidden());
 		}
 	}
@@ -781,8 +779,9 @@
 	protected void assertHidden(final String message, IResource root, final boolean value, int depth) {
 		IResourceVisitor visitor = resource -> {
 			boolean expected = false;
-			if (resource.getType() == IResource.PROJECT || resource.getType() == IResource.FILE || resource.getType() == IResource.FOLDER)
+			if (resource.getType() == IResource.PROJECT || resource.getType() == IResource.FILE || resource.getType() == IResource.FOLDER) {
 				expected = value;
+			}
 			assertEquals(message + resource.getFullPath(), expected, resource.isHidden());
 			return true;
 		};
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IFileTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IFileTest.java
index 769e5be..4c9eb71 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IFileTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IFileTest.java
@@ -65,8 +65,9 @@
 	 * if applicable.
 	 */
 	public boolean existsAndOpen(IContainer container) {
-		if (!container.exists())
+		if (!container.exists()) {
 			return false;
+		}
 		if (container instanceof IFolder) {
 			return true;
 		}
@@ -84,8 +85,7 @@
 	 */
 	protected void generateInterestingFiles() throws CoreException {
 		IProject[] interestingProjects = interestingProjects();
-		for (int i = 0; i < interestingProjects.length; i++) {
-			IProject project = interestingProjects[i];
+		for (IProject project : interestingProjects) {
 			//file in project
 			generateInterestingFiles(project);
 
@@ -243,8 +243,9 @@
 	 * Makes sure file requirements are met (out of sync, workspace only, etc).
 	 */
 	public void refreshFiles() {
-		for (IFile file : allFiles)
+		for (IFile file : allFiles) {
 			refreshFile(file);
+		}
 	}
 
 	@Override
@@ -404,11 +405,13 @@
 				InputStream stream = (InputStream) args[1];
 				boolean force = ((Boolean) args[2]).booleanValue();
 				IProgressMonitor monitor = (IProgressMonitor) args[3];
-				if (monitor instanceof FussyProgressMonitor)
+				if (monitor instanceof FussyProgressMonitor) {
 					((FussyProgressMonitor) monitor).prepare();
+				}
 				file.create(stream, force, monitor);
-				if (monitor instanceof FussyProgressMonitor)
+				if (monitor instanceof FussyProgressMonitor) {
 					((FussyProgressMonitor) monitor).sanityCheck();
+				}
 				return null;
 			}
 
@@ -421,12 +424,14 @@
 				boolean fileExistsInFS = fileLocation != null && fileLocation.toFile().exists();
 
 				// parent must be accessible
-				if (!file.getParent().isAccessible())
+				if (!file.getParent().isAccessible()) {
 					return true;
+				}
 
 				// should never fail if force is true
-				if (force && !fileExistsInWS)
+				if (force && !fileExistsInWS) {
 					return false;
+				}
 
 				// file must not exist in WS or on filesystem.
 				return fileExistsInWS || fileExistsInFS;
@@ -838,8 +843,9 @@
 			try {
 				content = target.getContents(false);
 			} finally {
-				if (content != null)
+				if (content != null) {
 					content.close();
+				}
 			}
 			fail("1.0");
 		} catch (CoreException e) {
@@ -851,8 +857,9 @@
 			try {
 				content = target.getContents(true);
 			} finally {
-				if (content != null)
+				if (content != null) {
 					content.close();
+				}
 			}
 		} catch (CoreException e) {
 			fail("2.1", e);
@@ -862,8 +869,9 @@
 			try {
 				content = target.getContents(false);
 			} finally {
-				if (content != null)
+				if (content != null) {
 					content.close();
+				}
 			}
 			fail("3.0");
 		} catch (CoreException e) {
@@ -912,16 +920,16 @@
 			//invalid names on non-windows platforms
 			names = new String[] {};
 		}
-		for (int i = 0; i < names.length; i++) {
-			IFile file = project.getFile(Path.fromPortableString(names[i]));
-			assertTrue("1.0 " + names[i], !file.exists());
+		for (String name : names) {
+			IFile file = project.getFile(Path.fromPortableString(name));
+			assertTrue("1.0 " + name, !file.exists());
 			try {
 				file.create(getRandomContents(), true, getMonitor());
-				fail("1.1 " + names[i]);
+				fail("1.1 " + name);
 			} catch (CoreException e) {
 				// expected
 			}
-			assertTrue("1.2 " + names[i], !file.exists());
+			assertTrue("1.2 " + name, !file.exists());
 		}
 
 		//do some tests with valid names that are *almost* invalid
@@ -932,15 +940,15 @@
 			//these names are valid on non-windows platforms
 			names = new String[] {"  a", "a  ", "foo:bar", "prn", "nul", "con", "aux", "clock$", "com1", "com2", "com3", "com4", "com5", "com6", "com7", "com8", "com9", "lpt1", "lpt2", "lpt3", "lpt4", "lpt5", "lpt6", "lpt7", "lpt8", "lpt9", "con.foo", "LPT4.txt", "*", "?", "\"", "<", ">", "|", "hello.prn.txt", "null", "con3", "foo.aux", "lpt0", "com0", "com10", "lpt10", ",", "'", ";"};
 		}
-		for (int i = 0; i < names.length; i++) {
-			IFile file = project.getFile(names[i]);
-			assertTrue("2.0 " + names[i], !file.exists());
+		for (String name : names) {
+			IFile file = project.getFile(name);
+			assertTrue("2.0 " + name, !file.exists());
 			try {
 				file.create(getRandomContents(), true, getMonitor());
 			} catch (CoreException e) {
-				fail("2.1 " + names[i], e);
+				fail("2.1 " + name, e);
 			}
-			assertTrue("2.2 " + names[i], file.exists());
+			assertTrue("2.2 " + name, file.exists());
 		}
 	}
 
@@ -968,11 +976,13 @@
 				InputStream stream = (InputStream) args[1];
 				boolean force = ((Boolean) args[2]).booleanValue();
 				IProgressMonitor monitor = (IProgressMonitor) args[3];
-				if (monitor instanceof FussyProgressMonitor)
+				if (monitor instanceof FussyProgressMonitor) {
 					((FussyProgressMonitor) monitor).prepare();
+				}
 				file.setContents(stream, force, false, monitor);
-				if (monitor instanceof FussyProgressMonitor)
+				if (monitor instanceof FussyProgressMonitor) {
 					((FussyProgressMonitor) monitor).sanityCheck();
+				}
 				return null;
 			}
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IFolderTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IFolderTest.java
index 2a9b213..4e24531 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IFolderTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IFolderTest.java
@@ -333,16 +333,16 @@
 			names = new String[] {};
 		}
 
-		for (int i = 0; i < names.length; i++) {
-			IFolder folder = project.getFolder(names[i]);
-			assertTrue("1.0 " + names[i], !folder.exists());
+		for (String name : names) {
+			IFolder folder = project.getFolder(name);
+			assertTrue("1.0 " + name, !folder.exists());
 			try {
 				folder.create(true, true, getMonitor());
-				fail("1.1 " + names[i]);
+				fail("1.1 " + name);
 			} catch (CoreException e) {
 				// expected
 			}
-			assertTrue("1.2 " + names[i], !folder.exists());
+			assertTrue("1.2 " + name, !folder.exists());
 		}
 
 		//do some tests with valid names that are *almost* invalid
@@ -353,15 +353,15 @@
 			//these names are valid on non-windows platforms
 			names = new String[] {"prn", "nul", "con", "aux", "clock$", "com1", "com2", "com3", "com4", "com5", "com6", "com7", "com8", "com9", "lpt1", "lpt2", "lpt3", "lpt4", "lpt5", "lpt6", "lpt7", "lpt8", "lpt9", "con.foo", "LPT4.txt", "*", "?", "\"", "<", ">", "|", "hello.prn.txt", "null", "con3", "foo.aux", "lpt0", "com0", "com10", "lpt10", ",", "'", ";"};
 		}
-		for (int i = 0; i < names.length; i++) {
-			IFolder folder = project.getFolder(names[i]);
-			assertTrue("2.0 " + names[i], !folder.exists());
+		for (String name : names) {
+			IFolder folder = project.getFolder(name);
+			assertTrue("2.0 " + name, !folder.exists());
 			try {
 				folder.create(true, true, getMonitor());
 			} catch (CoreException e) {
-				fail("2.1 " + names[i], e);
+				fail("2.1 " + name, e);
 			}
-			assertTrue("2.2 " + names[i], folder.exists());
+			assertTrue("2.2 " + name, folder.exists());
 		}
 	}
 
@@ -378,8 +378,9 @@
 	public void testReadOnlyFolderCopy() throws Exception {
 		// We need to know whether or not we can unset the read-only flag
 		// in order to perform this test.
-		if (!isReadOnlySupported())
+		if (!isReadOnlySupported()) {
 			return;
+		}
 		IProject project = getWorkspace().getRoot().getProject("Project");
 		IFolder source = project.getFolder("Folder1");
 		ensureExistsInWorkspace(source, true);
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IPathVariableTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IPathVariableTest.java
index b306d19..6f6e626 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IPathVariableTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IPathVariableTest.java
@@ -69,11 +69,13 @@
 
 			@Override
 			public boolean equals(Object obj) {
-				if (obj == null || !(obj instanceof Event))
+				if (obj == null || !(obj instanceof Event)) {
 					return false;
+				}
 				Event that = (Event) obj;
-				if (this.type != that.type || !this.name.equals(that.name))
+				if (this.type != that.type || !this.name.equals(that.name)) {
 					return false;
+				}
 				return this.value == null ? that.value == null : this.value.equals(that.value);
 			}
 
@@ -141,11 +143,13 @@
 		String dump() {
 			StringBuffer buffer = new StringBuffer();
 			buffer.append("Expected:\n");
-			for (Event event : expected)
+			for (Event event : expected) {
 				buffer.append("\t" + event + "\n");
+			}
 			buffer.append("Actual:\n");
-			for (Event event : actual)
+			for (Event event : actual) {
 				buffer.append("\t" + event + "\n");
+			}
 			return buffer.toString();
 		}
 	}
@@ -416,8 +420,9 @@
 
 	private IPath getVariableRelativePathLocation(IProject project, IPath location) {
 		URI variableRelativePathLocation = project.getPathVariableManager().getVariableRelativePathLocation(URIUtil.toURI(location));
-		if (variableRelativePathLocation != null)
+		if (variableRelativePathLocation != null) {
 			return URIUtil.toPath(variableRelativePathLocation);
+		}
 		return null;
 	}
 
@@ -714,9 +719,11 @@
 	}
 
 	boolean contains(Object[] array, Object obj) {
-		for (int i = 0; i < array.length; i++)
-			if (array[i].equals(obj))
+		for (Object element : array) {
+			if (element.equals(obj)) {
 				return true;
+			}
+		}
 		return false;
 	}
 
@@ -727,8 +734,8 @@
 	protected void tearDown() throws Exception {
 		super.tearDown();
 		String[] names = manager.getPathVariableNames();
-		for (int i = 0; i < names.length; i++) {
-			manager.setValue(names[i], (IPath) null);
+		for (String name : names) {
+			manager.setValue(name, (IPath) null);
 		}
 	}
 
@@ -783,9 +790,9 @@
 		IPathVariableManager pathVariableManager = existingProject.getPathVariableManager();
 		String[] varNames = pathVariableManager.getPathVariableNames();
 
-		for (int i = 0; i < varNames.length; i++) {
+		for (String varName : varNames) {
 			try {
-				pathVariableManager.getURIValue(varNames[i]);
+				pathVariableManager.getURIValue(varName);
 			} catch (Exception e) {
 				fail("3.99", e);
 			}
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IProjectTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IProjectTest.java
index 22a84db..103531a 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IProjectTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IProjectTest.java
@@ -44,8 +44,9 @@
 	}
 
 	public void ensureExistsInWorkspace(final IProject project, final IProjectDescription description) {
-		if (project == null)
+		if (project == null) {
 			return;
+		}
 		IWorkspaceRunnable body = monitor -> {
 			project.create(description, monitor);
 			project.open(monitor);
@@ -255,9 +256,9 @@
 
 		//should not be able to create a project with invalid path on any platform
 		String[] names = new String[] {"", "/"};
-		for (int i = 0; i < names.length; i++) {
+		for (String name : names) {
 			try {
-				root.getProject(names[i]);
+				root.getProject(name);
 				fail("0.99");
 			} catch (RuntimeException e) {
 				//should fail
@@ -272,18 +273,18 @@
 			//invalid names on non-windows platforms
 			names = new String[] {};
 		}
-		for (int i = 0; i < names.length; i++) {
-			IProject project = root.getProject(names[i]);
-			assertTrue("1.0 " + names[i], !project.exists());
+		for (String name : names) {
+			IProject project = root.getProject(name);
+			assertTrue("1.0 " + name, !project.exists());
 			try {
 				project.create(getMonitor());
 				project.open(getMonitor());
-				fail("1.1 " + names[i]);
+				fail("1.1 " + name);
 			} catch (CoreException e) {
 				// expected
 			}
-			assertTrue("1.2 " + names[i], !project.exists());
-			assertTrue("1.3 " + names[i], !project.isOpen());
+			assertTrue("1.2 " + name, !project.exists());
+			assertTrue("1.3 " + name, !project.isOpen());
 		}
 
 		//do some tests with valid names that are *almost* invalid
@@ -294,17 +295,17 @@
 			//these names are valid on non-windows platforms
 			names = new String[] {"foo:bar", "prn", "nul", "con", "aux", "clock$", "com1", "com2", "com3", "com4", "com5", "com6", "com7", "com8", "com9", "lpt1", "lpt2", "lpt3", "lpt4", "lpt5", "lpt6", "lpt7", "lpt8", "lpt9", "con.foo", "LPT4.txt", "*", "?", "\"", "<", ">", "|", "hello.prn.txt", "null", "con3", "foo.aux", "lpt0", "com0", "com10", "lpt10", ",", "'", ";"};
 		}
-		for (int i = 0; i < names.length; i++) {
-			IProject project = root.getProject(names[i]);
-			assertTrue("2.0 " + names[i], !project.exists());
+		for (String name : names) {
+			IProject project = root.getProject(name);
+			assertTrue("2.0 " + name, !project.exists());
 			try {
 				project.create(getMonitor());
 				project.open(getMonitor());
 			} catch (CoreException e) {
-				fail("2.1 " + names[i], e);
+				fail("2.1 " + name, e);
 			}
-			assertTrue("2.2 " + names[i], project.exists());
-			assertTrue("2.3 " + names[i], project.isOpen());
+			assertTrue("2.2 " + name, project.exists());
+			assertTrue("2.3 " + name, project.isOpen());
 		}
 	}
 
@@ -669,10 +670,11 @@
 			assertEquals("3.0", newInstanceValue, getLineSeparatorFromFile(file));
 
 			// remove preference for the next step
-			if (oldInstanceValue == null)
+			if (oldInstanceValue == null) {
 				instanceNode.remove(Platform.PREF_LINE_SEPARATOR);
-			else
+			} else {
 				instanceNode.put(Platform.PREF_LINE_SEPARATOR, oldInstanceValue);
+			}
 			instanceNode.flush();
 			description = project.getDescription();
 			description.setComment("some comment");
@@ -701,10 +703,11 @@
 			assertEquals("8.0", newProjectValue, getLineSeparatorFromFile(file));
 		} finally {
 			// revert instance preference to original value
-			if (oldInstanceValue == null)
+			if (oldInstanceValue == null) {
 				instanceNode.remove(Platform.PREF_LINE_SEPARATOR);
-			else
+			} else {
 				instanceNode.put(Platform.PREF_LINE_SEPARATOR, oldInstanceValue);
+			}
 			instanceNode.flush();
 			project.delete(true, getMonitor());
 		}
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IResourceChangeListenerTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IResourceChangeListenerTest.java
index 14797bd..397d89e 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IResourceChangeListenerTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IResourceChangeListenerTest.java
@@ -154,8 +154,8 @@
 				assertTrue(message, !deltaResource.equals(resources[i]));
 			}
 			IResourceDelta[] children = delta.getAffectedChildren();
-			for (int i = 0; i < children.length; i++) {
-				assertNotDeltaIncludes(message, children[i], resources);
+			for (IResourceDelta element : children) {
+				assertNotDeltaIncludes(message, element, resources);
 			}
 		} catch (RuntimeException e) {
 			fail(message, e);
@@ -194,8 +194,9 @@
 	 */
 	protected void setAutoBuilding(boolean value) {
 		IWorkspace workspace = getWorkspace();
-		if (workspace.isAutoBuilding() == value)
+		if (workspace.isAutoBuilding() == value) {
 			return;
+		}
 		IWorkspaceDescription desc = workspace.getDescription();
 		desc.setAutoBuilding(value);
 		try {
@@ -841,8 +842,9 @@
 					@Override
 					protected IStatus run(IProgressMonitor monitor) {
 						try {
-							if (event.getResource() != p)
+							if (event.getResource() != p) {
 								p.refreshLocal(IResource.DEPTH_INFINITE, null);
+							}
 							wasPerformed = true;
 						} catch (Exception e) {
 							fail("3.0", e);
@@ -860,8 +862,9 @@
 			@Override
 			public void resourceChanged(IResourceChangeEvent event) {
 				try {
-					if (event.getResource() != p)
+					if (event.getResource() != p) {
 						p.refreshLocal(IResource.DEPTH_INFINITE, null);
+					}
 					fail("4.0");
 				} catch (Exception e) {
 					// should fail
@@ -1624,8 +1627,9 @@
 		} catch (CoreException e) {
 			handleCoreException(e);
 		} finally {
-			if (path.toFile().exists())
+			if (path.toFile().exists()) {
 				path.toFile().delete();
+			}
 		}
 	}
 
@@ -1650,8 +1654,9 @@
 		} catch (CoreException e) {
 			handleCoreException(e);
 		} finally {
-			if (path.toFile().exists())
+			if (path.toFile().exists()) {
 				path.toFile().delete();
+			}
 		}
 	}
 
@@ -1672,8 +1677,9 @@
 		} catch (CoreException e) {
 			handleCoreException(e);
 		} finally {
-			if (path.toFile().exists())
+			if (path.toFile().exists()) {
 				path.toFile().delete();
+			}
 		}
 	}
 }
\ No newline at end of file
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IResourceTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IResourceTest.java
index 04c291e..3bdba91 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IResourceTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IResourceTest.java
@@ -82,8 +82,8 @@
 		Set<File> result = new HashSet<>(50);
 		String[] members = dir.list();
 		if (members != null) {
-			for (int i = 0; i < members.length; i++) {
-				File member = new File(dir, members[i]);
+			for (String member2 : members) {
+				File member = new File(dir, member2);
 				result.add(member);
 				if (member.isDirectory()) {
 					result.addAll(getAllFilesForDirectory(member));
@@ -114,8 +114,7 @@
 					if (resource.getType() != IResource.FILE) {
 						IContainer container = (IContainer) resource;
 						IResource[] children = container.members();
-						for (int i = 0; i < children.length; i++) {
-							IResource member = children[i];
+						for (IResource member : children) {
 							result.addAll(getAllFilesForResource(member, considerUnsyncLocalFiles));
 						}
 					}
@@ -136,8 +135,7 @@
 			if (resource.getType() != IResource.FILE && resource.isAccessible()) {
 				IContainer container = (IContainer) resource;
 				IResource[] children = container.members();
-				for (int i = 0; i < children.length; i++) {
-					IResource member = children[i];
+				for (IResource member : children) {
 					result.addAll(getAllResourcesForResource(member));
 				}
 			}
@@ -189,8 +187,8 @@
 
 		IResource[] deleted = buildResources(root, new String[] {"1/1/2/1/", "1/2/3/1"});
 		ensureDoesNotExistInWorkspace(deleted);
-		for (int i = 0; i < deleted.length; ++i) {
-			nonExistingResources.add(deleted[i]);
+		for (IResource element : deleted) {
+			nonExistingResources.add(element);
 		}
 		//out of sync
 		IResource[] unsynchronized = buildResources(root, new String[] {"1/2/3/3"});
@@ -255,8 +253,9 @@
 		IResource target = (IResource) args[1];
 		int state = ((Integer) args[2]).intValue();
 		int depth = ((Integer) args[3]).intValue();
-		if (!makesSense(receiver, target, state, depth))
+		if (!makesSense(receiver, target, state, depth)) {
 			return;
+		}
 		try {
 			getWorkspace().getRoot().refreshLocal(IResource.DEPTH_INFINITE, null);
 		} catch (CoreException e) {
@@ -264,8 +263,9 @@
 		}
 		//target may have changed gender
 		IResource changedTarget = getWorkspace().getRoot().findMember(target.getFullPath());
-		if (changedTarget != null && changedTarget.getType() != target.getType())
+		if (changedTarget != null && changedTarget.getType() != target.getType()) {
 			ensureDoesNotExistInWorkspace(changedTarget);
+		}
 		ensureExistsInWorkspace(interestingResources, true);
 	}
 
@@ -274,9 +274,9 @@
 	 */
 	protected IProject[] getProjects(IResource[] resources) {
 		ArrayList<IProject> list = new ArrayList<>();
-		for (int i = 0; i < resources.length; i++) {
-			if (resources[i].getType() == IResource.PROJECT) {
-				list.add((IProject) resources[i]);
+		for (IResource resource : resources) {
+			if (resource.getType() == IResource.PROJECT) {
+				list.add((IProject) resource);
 			}
 		}
 		return list.toArray(new IProject[list.size()]);
@@ -288,8 +288,9 @@
 	 * "depth" will hit resource1.
 	 */
 	protected boolean hasParent(IResource resource1, IResource resource2, int depth) {
-		if (depth == IResource.DEPTH_ZERO)
+		if (depth == IResource.DEPTH_ZERO) {
 			return false;
+		}
 		if (depth == IResource.DEPTH_ONE) {
 			return resource2.equals(resource1.getParent());
 		}
@@ -398,14 +399,14 @@
 
 			Vector<IResource> resources = new Vector<>();
 			resources.addElement(openProject);
-			for (int i = 0; i < resourcesInOpenProject.length; i++) {
-				resources.addElement(resourcesInOpenProject[i]);
+			for (IResource element : resourcesInOpenProject) {
+				resources.addElement(element);
 			}
 
 			resources.addElement(closedProject);
-			for (int i = 0; i < resourcesInClosedProject.length; i++) {
-				resources.addElement(resourcesInClosedProject[i]);
-				nonExistingResources.add(resourcesInClosedProject[i]);
+			for (IResource element : resourcesInClosedProject) {
+				resources.addElement(element);
+				nonExistingResources.add(element);
 			}
 
 			resources.addElement(nonExistingProject);
@@ -454,8 +455,9 @@
 					// we only get a delta if the receiver of refreshLocal
 					// is a parent of the changed resource, or they're the same
 					// resource.
-					if (hasParent(target, receiver, depth) || target.equals(receiver))
+					if (hasParent(target, receiver, depth) || target.equals(receiver)) {
 						verifier.addExpectedDeletion(target);
+					}
 				}
 				break;
 			case S_FILESYSTEM_ONLY :
@@ -466,14 +468,16 @@
 					// we only get a delta if the receiver of refreshLocal
 					// is a parent of the changed resource, or they're the same
 					// resource.
-					if (hasParent(target, receiver, depth) || target.equals(receiver))
+					if (hasParent(target, receiver, depth) || target.equals(receiver)) {
 						verifier.addExpectedChange(target, IResourceDelta.ADDED, 0);
+					}
 				}
 				break;
 			case S_UNCHANGED :
 				ensureExistsInWorkspace(target, true);
-				if (addVerifier)
+				if (addVerifier) {
 					verifier.reset();
+				}
 				break;
 			case S_CHANGED :
 				ensureExistsInWorkspace(target, true);
@@ -483,15 +487,17 @@
 					// we only get a delta if the receiver of refreshLocal
 					// is a parent of the changed resource, or they're the same
 					// resource.
-					if (hasParent(target, receiver, depth) || target.equals(receiver))
+					if (hasParent(target, receiver, depth) || target.equals(receiver)) {
 						verifier.addExpectedChange(target, IResourceDelta.CHANGED, IResourceDelta.CONTENT);
+					}
 				}
 				break;
 			case S_DOES_NOT_EXIST :
 				ensureDoesNotExistInWorkspace(target);
 				ensureDoesNotExistInFileSystem(target);
-				if (addVerifier)
+				if (addVerifier) {
 					verifier.reset();
+				}
 				break;
 			case S_FOLDER_TO_FILE :
 				ensureExistsInWorkspace(target, true);
@@ -502,8 +508,9 @@
 					// we only get a delta if the receiver of refreshLocal
 					// is a parent of the changed resource, or they're the same
 					// resource.
-					if (hasParent(target, receiver, depth) || target.equals(receiver))
+					if (hasParent(target, receiver, depth) || target.equals(receiver)) {
 						verifier.addExpectedChange(target, IResourceDelta.CHANGED, IResourceDelta.REPLACED | IResourceDelta.TYPE | IResourceDelta.CONTENT);
+					}
 				}
 				break;
 			case S_FILE_TO_FOLDER :
@@ -515,8 +522,9 @@
 					// we only get a delta if the receiver of refreshLocal
 					// is a parent of the changed resource, or they're the same
 					// resource.
-					if (hasParent(target, receiver, depth) || target.equals(receiver))
+					if (hasParent(target, receiver, depth) || target.equals(receiver)) {
 						verifier.addExpectedChange(target, IResourceDelta.CHANGED, IResourceDelta.REPLACED | IResourceDelta.TYPE | IResourceDelta.CONTENT);
+					}
 				}
 				break;
 		}
@@ -524,10 +532,12 @@
 
 	@Override
 	protected void tearDown() throws Exception {
-		if (noSideEffects)
+		if (noSideEffects) {
 			return;
-		if (verifier != null)
+		}
+		if (verifier != null) {
 			getWorkspace().removeResourceChangeListener(verifier);
+		}
 		getWorkspace().getRoot().refreshLocal(IResource.DEPTH_INFINITE, null);
 		ensureDoesNotExistInWorkspace(getWorkspace().getRoot());
 		interestingPaths = null;
@@ -792,8 +802,9 @@
 		//add markers to all resources ... markers should not be copied
 		try {
 			getWorkspace().getRoot().accept(resource -> {
-				if (resource.isAccessible())
+				if (resource.isAccessible()) {
 					resource.createMarker(IMarker.TASK);
+				}
 				return true;
 			});
 		} catch (CoreException e) {
@@ -814,11 +825,13 @@
 				IPath destination = (IPath) args[1];
 				Boolean force = (Boolean) args[2];
 				IProgressMonitor monitor = (IProgressMonitor) args[3];
-				if (monitor instanceof FussyProgressMonitor)
+				if (monitor instanceof FussyProgressMonitor) {
 					((FussyProgressMonitor) monitor).prepare();
+				}
 				resource.copy(destination, force.booleanValue(), monitor);
-				if (monitor instanceof FussyProgressMonitor)
+				if (monitor instanceof FussyProgressMonitor) {
 					((FussyProgressMonitor) monitor).sanityCheck();
+				}
 				return null;
 			}
 
@@ -827,10 +840,12 @@
 				IResource resource = (IResource) args[0];
 				IPath destination = (IPath) args[1];
 				//Boolean force = (Boolean) args[2];
-				if (!resource.isAccessible())
+				if (!resource.isAccessible()) {
 					return true;
-				if (isProject(resource) && destination.segmentCount() > 1 && !getWorkspace().validatePath(destination.toString(), IResource.FOLDER).isOK())
+				}
+				if (isProject(resource) && destination.segmentCount() > 1 && !getWorkspace().validatePath(destination.toString(), IResource.FOLDER).isOK()) {
 					return true;
+				}
 				java.io.File destinationParent = destination.isAbsolute() ? destination.removeLastSegments(1).toFile() : resource.getLocation().removeLastSegments(1).append(destination.removeLastSegments(1)).toFile();
 				java.io.File destinationFile = destination.isAbsolute() ? destination.toFile() : resource.getLocation().removeLastSegments(1).append(destination).removeTrailingSeparator().toFile();
 				return !destinationParent.exists() || !destinationParent.isDirectory() || destinationFile.exists() || destinationFile.toString().startsWith(resource.getLocation().toFile().toString());
@@ -845,13 +860,16 @@
 				// container of the resource being copied."
 				IPath path = destination.isAbsolute() ? destination : source.getParent().getFullPath().append(destination);
 				IResource copy = getWorkspace().getRoot().findMember(path);
-				if (copy == null)
+				if (copy == null) {
 					return false;
-				if (!copy.exists())
+				}
+				if (!copy.exists()) {
 					return false;
+				}
 				//markers are never copied, so ensure copy has none
-				if (copy.findMarkers(IMarker.TASK, true, IResource.DEPTH_INFINITE).length > 0)
+				if (copy.findMarkers(IMarker.TASK, true, IResource.DEPTH_INFINITE).length > 0) {
 					return false;
+				}
 				return true;
 			}
 		}.performTest(inputs);
@@ -879,15 +897,17 @@
 				Boolean force = (Boolean) args[0];
 				IProgressMonitor monitor = (IProgressMonitor) args[1];
 				IResource resource = (IResource) args[2];
-				if (monitor instanceof FussyProgressMonitor)
+				if (monitor instanceof FussyProgressMonitor) {
 					((FussyProgressMonitor) monitor).prepare();
+				}
 				try {
 					resource.delete(force.booleanValue(), monitor);
 				} catch (OperationCanceledException e) {
 					return CANCELED;
 				}
-				if (monitor instanceof FussyProgressMonitor)
+				if (monitor instanceof FussyProgressMonitor) {
 					((FussyProgressMonitor) monitor).sanityCheck();
+				}
 				return null;
 			}
 
@@ -896,20 +916,23 @@
 				Boolean force = (Boolean) args[0];
 				IProgressMonitor monitor = (IProgressMonitor) args[1];
 				IResource resource = (IResource) args[2];
-				if (monitor instanceof CancelingProgressMonitor)
+				if (monitor instanceof CancelingProgressMonitor) {
 					return false;
-				if (force.booleanValue() || !resource.exists())
+				}
+				if (force.booleanValue() || !resource.exists()) {
 					return false;
+				}
 				if (resource.getType() == IResource.PROJECT) {
 					IProject project = (IProject) resource;
 					try {
-						if (!project.isOpen())
+						if (!project.isOpen()) {
 							return false;
+						}
 						IResource[] children = project.members();
-						for (int i = 0; i < children.length; i++) {
-							IResource member = children[i];
-							if (shouldFail(new Object[] {args[0], args[1], member}, count))
+						for (IResource member : children) {
+							if (shouldFail(new Object[] {args[0], args[1], member}, count)) {
 								return true;
+							}
 						}
 					} catch (CoreException ex) {
 						ex.printStackTrace();
@@ -935,17 +958,20 @@
 								hasUnsynchronizedResources[0] = true;
 								return false;
 							}
-							if (target.isFile())
+							if (target.isFile()) {
 								return false;
+							}
 							String[] list = target.list();
-							if (list == null)
+							if (list == null) {
 								return true;
+							}
 							IContainer container = (IContainer) toVisit;
-							for (int i = 0; i < list.length; i++) {
-								File file = new File(target, list[i]);
-								IResource child = file.isFile() ? (IResource) container.getFile(new Path(list[i])) : container.getFolder(new Path(list[i]));
-								if (!child.exists())
+							for (String element : list) {
+								File file = new File(target, element);
+								IResource child = file.isFile() ? (IResource) container.getFile(new Path(element)) : container.getFolder(new Path(element));
+								if (!child.exists()) {
 									visit(child);
+								}
 							}
 							return true;
 						}
@@ -962,8 +988,9 @@
 				Boolean force = (Boolean) args[0];
 				IProgressMonitor monitor = (IProgressMonitor) args[1];
 				IResource resource = (IResource) args[2];
-				if (result == CANCELED)
+				if (result == CANCELED) {
 					return monitor instanceof CancelingProgressMonitor;
+				}
 				//oldState[0] : was resource accessible before the invocation?
 				//oldState[1] : all files that should have been deleted from
 				// the file system
@@ -973,26 +1000,28 @@
 					// check the parent's members, deleted resource should not
 					// be a member
 					IResource[] children = ((IContainer) getWorkspace().getRoot().findMember(resource.getFullPath().removeLastSegments(1))).members();
-					for (int i = 0; i < children.length; i++) {
-						if (resource == children[i])
+					for (IResource element : children) {
+						if (resource == element) {
 							return false;
+						}
 					}
 				}
-				if (!getAllFilesForResource(resource, force.booleanValue()).isEmpty())
+				if (!getAllFilesForResource(resource, force.booleanValue()).isEmpty()) {
 					return false;
+				}
 				@SuppressWarnings("unchecked")
 				Set<File> oldFiles = (Set<File>) oldState[1];
-				for (Iterator<File> i = oldFiles.iterator(); i.hasNext();) {
-					File oldFile = i.next();
-					if (oldFile.exists())
+				for (File oldFile : oldFiles) {
+					if (oldFile.exists()) {
 						return false;
+					}
 				}
 				@SuppressWarnings("unchecked")
 				Set<IResource> oldResources = (Set<IResource>) oldState[2];
-				for (Iterator<IResource> i = oldResources.iterator(); i.hasNext();) {
-					IResource oldResource = i.next();
-					if (oldResource.exists() || getWorkspace().getRoot().findMember(oldResource.getFullPath()) != null)
+				for (IResource oldResource : oldResources) {
+					if (oldResource.exists() || getWorkspace().getRoot().findMember(oldResource.getFullPath()) != null) {
 						return false;
+					}
 				}
 				return true;
 			}
@@ -1266,8 +1295,8 @@
 		ensureExistsInWorkspace(resources, true);
 
 		// initial values should be false
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
+		for (IResource resource2 : resources) {
+			IResource resource = resource2;
 			assertTrue("1.0: " + resource.getFullPath(), !resource.isDerived());
 		}
 
@@ -1324,8 +1353,8 @@
 		}
 
 		// values should be false again
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
+		for (IResource resource2 : resources) {
+			IResource resource = resource2;
 			assertTrue("7.0: " + resource.getFullPath(), !resource.isDerived());
 		}
 	}
@@ -1431,12 +1460,14 @@
 				IResource resource = (IResource) args[0];
 				IPath resultPath = (IPath) result;
 				if (resource.getType() == IResource.PROJECT) {
-					if (!resource.exists())
+					if (!resource.exists()) {
 						return resultPath == null;
+					}
 					return resultPath != null;
 				}
-				if (!resource.getProject().exists())
+				if (!resource.getProject().exists()) {
 					return resultPath == null;
+				}
 				return resultPath != null;
 			}
 		}.performTest(inputs);
@@ -1454,18 +1485,18 @@
 		IResource[] resources = buildResources(getWorkspace().getRoot(), new String[] {"/1/", "/1/1", "/1/2", "/1/3", "/2/", "/2/1"});
 		final Map<IPath, Long> table = new HashMap<>(resources.length);
 
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
-			if (resource.getType() != IResource.ROOT)
+		for (IResource resource : resources) {
+			if (resource.getType() != IResource.ROOT) {
 				assertEquals("1.0." + resource.getFullPath(), IResource.NULL_STAMP, resource.getModificationStamp());
+			}
 		}
 
 		// create the project(s). the resources should still have null
 		// modification stamp
 		IProject[] projects = getProjects(resources);
 		IProject project;
-		for (int i = 0; i < projects.length; i++) {
-			project = projects[i];
+		for (IProject project2 : projects) {
+			project = project2;
 			try {
 				project.create(getMonitor());
 			} catch (CoreException e) {
@@ -1476,8 +1507,8 @@
 
 		// open the project(s) and create the resources. none should have a
 		// null stamp anymore.
-		for (int i = 0; i < projects.length; i++) {
-			project = projects[i];
+		for (IProject project2 : projects) {
+			project = project2;
 			assertEquals("3.1." + project.getFullPath(), IResource.NULL_STAMP, project.getModificationStamp());
 			try {
 				project.open(getMonitor());
@@ -1488,8 +1519,7 @@
 			// cache the value for later use
 			table.put(project.getFullPath(), new Long(project.getModificationStamp()));
 		}
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
+		for (IResource resource : resources) {
 			if (resource.getType() != IResource.PROJECT) {
 				assertEquals("3.4." + resource.getFullPath(), IResource.NULL_STAMP, resource.getModificationStamp());
 				ensureExistsInWorkspace(resource, true);
@@ -1500,31 +1530,30 @@
 		}
 
 		// close the projects. now all resources should have a null stamp again
-		for (int i = 0; i < projects.length; i++) {
-			project = projects[i];
+		for (IProject project2 : projects) {
+			project = project2;
 			try {
 				project.close(getMonitor());
 			} catch (CoreException e) {
 				fail("4.0." + project.getFullPath(), e);
 			}
 		}
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
-			if (resource.getType() != IResource.ROOT)
+		for (IResource resource : resources) {
+			if (resource.getType() != IResource.ROOT) {
 				assertEquals("4.1." + resource.getFullPath(), IResource.NULL_STAMP, resource.getModificationStamp());
+			}
 		}
 
 		// re-open the projects. all resources should have the same stamps
-		for (int i = 0; i < projects.length; i++) {
-			project = projects[i];
+		for (IProject project2 : projects) {
+			project = project2;
 			try {
 				project.open(getMonitor());
 			} catch (CoreException e) {
 				fail("5.0." + project.getFullPath(), e);
 			}
 		}
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
+		for (IResource resource : resources) {
 			if (resource.getType() != IResource.PROJECT) {
 				Object v = table.get(resource.getFullPath());
 				assertNotNull("5.1." + resource.getFullPath(), v);
@@ -1535,8 +1564,7 @@
 
 		// touch all the resources. this will update the modification stamp
 		final Map<IPath, Long> tempTable = new HashMap<>(resources.length);
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
+		for (IResource resource : resources) {
 			if (resource.getType() != IResource.ROOT) {
 				try {
 					resource.touch(getMonitor());
@@ -1586,8 +1614,7 @@
 			fail("8.1", e);
 		}
 		tempTable.clear();
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
+		for (IResource resource : resources) {
 			if (resource.getType() != IResource.ROOT) {
 				long stamp = resource.getModificationStamp();
 				assertTrue("8.2." + resource.getFullPath(), stamp != IResource.NULL_STAMP);
@@ -1607,8 +1634,7 @@
 		} catch (CoreException e) {
 			fail("9.1", e);
 		}
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
+		for (IResource resource : resources) {
 			if (resource.getType() != IResource.ROOT) {
 				long newStamp = resource.getModificationStamp();
 				assertTrue("9.2." + resource.getFullPath(), newStamp != IResource.NULL_STAMP);
@@ -1628,16 +1654,15 @@
 
 		// none of the resources exist yet so all the modification stamps
 		// should be null
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
-			if (resource.getType() != IResource.ROOT)
+		for (IResource resource : resources) {
+			if (resource.getType() != IResource.ROOT) {
 				assertEquals("10.1" + resource.getFullPath(), IResource.NULL_STAMP, resource.getModificationStamp());
+			}
 		}
 
 		// create all the resources (non-local) and ensure all stamps are null
 		ensureExistsInWorkspace(resources, false);
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
+		for (IResource resource : resources) {
 			switch (resource.getType()) {
 				case IResource.ROOT :
 					break;
@@ -1656,8 +1681,9 @@
 			fail("12.0", e);
 		}
 		visitor = resource -> {
-			if (resource.getType() != IResource.ROOT)
+			if (resource.getType() != IResource.ROOT) {
 				assertTrue("12.1." + resource.getFullPath(), IResource.NULL_STAMP != resource.getModificationStamp());
+			}
 			return true;
 		};
 		try {
@@ -1904,8 +1930,9 @@
 				IResource target = (IResource) args[1];
 				int state = ((Integer) args[2]).intValue();
 				int depth = ((Integer) args[3]).intValue();
-				if (!makesSense(receiver, target, state, depth))
+				if (!makesSense(receiver, target, state, depth)) {
 					return null;
+				}
 				setupBeforeState(receiver, target, state, depth, false);
 				boolean result = receiver.isSynchronized(depth);
 				return result ? Boolean.TRUE : Boolean.FALSE;
@@ -1919,7 +1946,9 @@
 			@Override
 			public boolean wasSuccess(Object[] args, Object result, Object[] oldState) {
 				if (result == null)
+				 {
 					return true; //combination didn't make sense
+				}
 				boolean bResult = ((Boolean) result).booleanValue();
 				IResource receiver = (IResource) args[0];
 				IResource target = (IResource) args[1];
@@ -1927,8 +1956,9 @@
 				int depth = ((Integer) args[3]).intValue();
 
 				//only !synchronized if target is same as or child of receiver
-				if (!(receiver.equals(target) || hasParent(target, receiver, depth)))
+				if (!(receiver.equals(target) || hasParent(target, receiver, depth))) {
 					return bResult;
+				}
 				switch (state) {
 					case S_UNCHANGED :
 					case S_DOES_NOT_EXIST :
@@ -1968,11 +1998,13 @@
 				IPath destination = (IPath) args[1];
 				Boolean force = (Boolean) args[2];
 				IProgressMonitor monitor = (IProgressMonitor) args[3];
-				if (monitor instanceof FussyProgressMonitor)
+				if (monitor instanceof FussyProgressMonitor) {
 					((FussyProgressMonitor) monitor).prepare();
+				}
 				resource.move(destination, force.booleanValue(), monitor);
-				if (monitor instanceof FussyProgressMonitor)
+				if (monitor instanceof FussyProgressMonitor) {
 					((FussyProgressMonitor) monitor).sanityCheck();
+				}
 				return null;
 			}
 
@@ -1981,11 +2013,13 @@
 				IResource resource = (IResource) args[0];
 				IPath destination = (IPath) args[1];
 				//			Boolean force = (Boolean) args[2];
-				if (!resource.isAccessible())
+				if (!resource.isAccessible()) {
 					return true;
+				}
 				if (isProject(resource)) {
-					if (destination.isAbsolute() ? destination.segmentCount() != 2 : destination.segmentCount() != 1)
+					if (destination.isAbsolute() ? destination.segmentCount() != 2 : destination.segmentCount() != 1) {
 						return true;
+					}
 					return !getWorkspace().validateName(destination.segment(0), IResource.PROJECT).isOK();
 				}
 				File destinationParent = destination.isAbsolute() ? destination.removeLastSegments(1).toFile() : resource.getLocation().removeLastSegments(1).append(destination.removeLastSegments(1)).toFile();
@@ -2016,8 +2050,7 @@
 		assertExistsInWorkspace("1.3", project);
 		// define an operation which will create a bunch of resources including
 		// a project.
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
+		for (IResource resource : resources) {
 			try {
 				switch (resource.getType()) {
 					case IResource.FILE :
@@ -2142,8 +2175,9 @@
 	public void testReadOnly() {
 		// We need to know whether or not we can unset the read-only flag
 		// in order to perform this test.
-		if (!isReadOnlySupported())
+		if (!isReadOnlySupported()) {
 			return;
+		}
 		IProject project = getWorkspace().getRoot().getProject(getUniqueString());
 		IFile file = project.getFile("target");
 		try {
@@ -2201,8 +2235,9 @@
 				IResource target = (IResource) args[1];
 				int state = ((Integer) args[2]).intValue();
 				int depth = ((Integer) args[3]).intValue();
-				if (!makesSense(receiver, target, state, depth))
+				if (!makesSense(receiver, target, state, depth)) {
 					return null;
+				}
 				setupBeforeState(receiver, target, state, depth, true);
 				receiver.refreshLocal(depth, getMonitor());
 				return Boolean.TRUE;
@@ -2216,7 +2251,9 @@
 			@Override
 			public boolean wasSuccess(Object[] args, Object result, Object[] oldState) {
 				if (result == null)
+				 {
 					return true; //permutation didn't make sense
+				}
 				IResource receiver = (IResource) args[0];
 				IResource target = (IResource) args[1];
 				int state = ((Integer) args[2]).intValue();
@@ -2277,15 +2314,17 @@
 		//revert all existing resources
 		try {
 			getWorkspace().getRoot().accept(resource -> {
-				if (!resource.isAccessible())
+				if (!resource.isAccessible()) {
 					return false;
+				}
 				long oldStamp = resource.getModificationStamp();
 				resource.touch(null);
 				long newStamp = resource.getModificationStamp();
-				if (resource.getType() == IResource.ROOT)
+				if (resource.getType() == IResource.ROOT) {
 					assertTrue("1.0." + resource.getFullPath(), oldStamp == newStamp);
-				else
+				} else {
 					assertTrue("1.0." + resource.getFullPath(), oldStamp != newStamp);
+				}
 				resource.revertModificationStamp(oldStamp);
 				assertEquals("1.1." + resource.getFullPath(), oldStamp, resource.getModificationStamp());
 				return true;
@@ -2297,8 +2336,9 @@
 		IResource[] resources = buildInterestingResources();
 		long[] illegal = new long[] {-1, -10, -100};
 		for (int i = 0; i < resources.length; i++) {
-			if (!resources[i].isAccessible())
+			if (!resources[i].isAccessible()) {
 				continue;
+			}
 			for (int j = 0; j < illegal.length; j++) {
 				try {
 					resources[i].revertModificationStamp(illegal[j]);
@@ -2317,15 +2357,17 @@
 		} catch (CoreException e) {
 			fail("3.99", e);
 		}
-		for (int i = 0; i < resources.length; i++) {
+		for (IResource resource : resources) {
 			try {
-				resources[i].revertModificationStamp(1);
-				if (resources[i].getType() != IResource.ROOT)
-					fail("4." + resources[i].getFullPath());
+				resource.revertModificationStamp(1);
+				if (resource.getType() != IResource.ROOT) {
+					fail("4." + resource.getFullPath());
+				}
 			} catch (CoreException e) {
 				//should fail except for root
-				if (resources[i].getType() == IResource.ROOT)
+				if (resource.getType() == IResource.ROOT) {
 					fail("4.99");
+				}
 			}
 		}
 	}
@@ -2366,14 +2408,17 @@
 			@Override
 			public boolean wasSuccess(Object[] args, Object result, Object[] oldState) {
 				IResource receiver = (IResource) args[0];
-				if (receiver.getType() == IResource.ROOT)
+				if (receiver.getType() == IResource.ROOT) {
 					return true;
+				}
 				long time = ((Long) args[1]).longValue();
 				long actual = ((Long) result).longValue();
-				if (actual != receiver.getLocalTimeStamp())
+				if (actual != receiver.getLocalTimeStamp()) {
 					return false;
-				if (Math.abs(actual - time) > 2000)
+				}
+				if (Math.abs(actual - time) > 2000) {
 					return false;
+				}
 				return true;
 			}
 		}.performTest(inputs);
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ISynchronizerTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ISynchronizerTest.java
index ef50aef..0b500a2 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ISynchronizerTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ISynchronizerTest.java
@@ -36,8 +36,9 @@
 
 	protected void assertEquals(String message, byte[] b1, byte[] b2) {
 		assertTrue(message, b1.length == b2.length);
-		for (int i = 0; i < b1.length; i++)
+		for (int i = 0; i < b1.length; i++) {
 			assertTrue(message, b1[i] == b2[i]);
+		}
 	}
 
 	/**
@@ -60,8 +61,9 @@
 		final QualifiedName[] partners = synchronizer.getPartners();
 		IWorkspaceRunnable body = monitor -> {
 			IResourceVisitor visitor = resource -> {
-				for (int i = 0; i < partners.length; i++)
-					synchronizer.setSyncInfo(partners[i], resource, null);
+				for (QualifiedName partner : partners) {
+					synchronizer.setSyncInfo(partner, resource, null);
+				}
 				return true;
 			};
 			root.accept(visitor, IResource.DEPTH_INFINITE, true);
@@ -88,8 +90,9 @@
 		// remove all registered sync partners so we don't create
 		// phantoms when we delete
 		QualifiedName[] names = getWorkspace().getSynchronizer().getPartners();
-		for (int i = 0; i < names.length; i++)
-			getWorkspace().getSynchronizer().remove(names[i]);
+		for (QualifiedName name : names) {
+			getWorkspace().getSynchronizer().remove(name);
+		}
 
 		// delete the root and everything under it
 		super.tearDown();
@@ -105,8 +108,9 @@
 		// setup the sync bytes
 		final Hashtable<IPath, byte[]> table = new Hashtable<>(10);
 		IResourceVisitor visitor = resource -> {
-			if (resource.getType() == IResource.ROOT)
+			if (resource.getType() == IResource.ROOT) {
 				return true;
+			}
 			byte[] b = getRandomString().getBytes();
 			table.put(resource.getFullPath(), b);
 			synchronizer.setSyncInfo(qname, resource, b);
@@ -125,8 +129,9 @@
 				if (resource.getType() == IResource.ROOT) {
 					assertNull("1.0." + resource.getFullPath(), actual);
 					return true;
-				} else
+				} else {
 					assertNotNull("1.1." + resource.getFullPath(), actual);
+				}
 				byte[] expected = table.get(resource.getFullPath());
 				assertEquals("1.2." + resource.getFullPath(), expected, actual);
 			} catch (CoreException e) {
@@ -143,10 +148,11 @@
 		// delete all resources under the projects.
 		final IProject[] projects = getWorkspace().getRoot().getProjects();
 		IWorkspaceRunnable body = monitor -> {
-			for (int i = 0; i < projects.length; i++) {
-				IResource[] children = projects[i].members();
-				for (int j = 0; j < children.length; j++)
-					children[j].delete(false, getMonitor());
+			for (IProject project : projects) {
+				IResource[] children = project.members();
+				for (IResource element : children) {
+					element.delete(false, getMonitor());
+				}
 			}
 		};
 		try {
@@ -162,8 +168,9 @@
 				if (resource.getType() == IResource.ROOT) {
 					assertNull("3.0", actual);
 					return true;
-				} else
+				} else {
 					assertNotNull("3.1." + resource.getFullPath(), actual);
+				}
 				byte[] expected = table.get(resource.getFullPath());
 				assertEquals("3.2." + resource.getFullPath(), expected, actual);
 			} catch (CoreException e) {
@@ -178,9 +185,9 @@
 		}
 
 		// delete the projects
-		for (int i = 0; i < projects.length; i++) {
+		for (IProject project : projects) {
 			try {
-				projects[i].delete(false, getMonitor());
+				project.delete(false, getMonitor());
 			} catch (CoreException e) {
 				ResourcesPlugin.getPlugin().getLog().log(e.getStatus());
 				fail("4.0", e);
@@ -213,8 +220,9 @@
 		// setup the sync bytes
 		final Hashtable<IPath, byte[]> table = new Hashtable<>(10);
 		IResourceVisitor visitor = resource -> {
-			if (resource.getType() == IResource.ROOT)
+			if (resource.getType() == IResource.ROOT) {
 				return true;
+			}
 			byte[] b = getRandomString().getBytes();
 			table.put(resource.getFullPath(), b);
 			synchronizer.setSyncInfo(qname, resource, b);
@@ -233,8 +241,9 @@
 				if (resource.getType() == IResource.ROOT) {
 					assertNull("1.0." + resource.getFullPath(), actual);
 					return true;
-				} else
+				} else {
 					assertNotNull("1.1." + resource.getFullPath(), actual);
+				}
 				byte[] expected = table.get(resource.getFullPath());
 				assertEquals("1.2." + resource.getFullPath(), expected, actual);
 			} catch (CoreException e) {
@@ -251,11 +260,12 @@
 		// delete all resources under the projects.
 		final IProject[] projects = getWorkspace().getRoot().getProjects();
 		IWorkspaceRunnable body = monitor -> {
-			for (int i = 0; i < projects.length; i++) {
-				IResource[] children = projects[i].members();
+			for (IProject project : projects) {
+				IResource[] children = project.members();
 				for (int j = 0; j < children.length; j++) {
-					if (!children[j].getName().equals(IProjectDescription.DESCRIPTION_FILE_NAME))
+					if (!children[j].getName().equals(IProjectDescription.DESCRIPTION_FILE_NAME)) {
 						children[j].delete(false, getMonitor());
+					}
 				}
 			}
 		};
@@ -272,8 +282,9 @@
 				if (resource.getType() == IResource.ROOT) {
 					assertNull("3.0", actual);
 					return true;
-				} else
+				} else {
 					assertNotNull("3.1." + resource.getFullPath(), actual);
+				}
 				byte[] expected = table.get(resource.getFullPath());
 				assertEquals("3.2." + resource.getFullPath(), expected, actual);
 			} catch (CoreException e) {
@@ -289,10 +300,11 @@
 
 		// remove the sync info for the immediate children of the projects.
 		body = monitor -> {
-			for (int i = 0; i < projects.length; i++) {
-				IResource[] children = projects[i].members(true);
-				for (int j = 0; j < children.length; j++)
-					synchronizer.setSyncInfo(qname, children[j], null);
+			for (IProject project : projects) {
+				IResource[] children = project.members(true);
+				for (IResource element : children) {
+					synchronizer.setSyncInfo(qname, element, null);
+				}
 			}
 		};
 		try {
@@ -304,10 +316,12 @@
 		// there should be no sync info for any resources except the project
 		visitor = resource -> {
 			int type = resource.getType();
-			if (type == IResource.ROOT || type == IResource.PROJECT)
+			if (type == IResource.ROOT || type == IResource.PROJECT) {
 				return true;
-			if (type == IResource.FILE && resource.getParent().getType() == IResource.PROJECT && resource.getName().equals(IProjectDescription.DESCRIPTION_FILE_NAME))
+			}
+			if (type == IResource.FILE && resource.getParent().getType() == IResource.PROJECT && resource.getName().equals(IProjectDescription.DESCRIPTION_FILE_NAME)) {
 				return true;
+			}
 			assertNull("5.0." + resource.getFullPath(), synchronizer.getSyncInfo(qname, resource));
 			return true;
 		};
@@ -470,8 +484,9 @@
 		assertEquals("3.1", NUMBER_OF_PARTNERS, list.length);
 
 		// unregister all targets
-		for (int i = 0; i < NUMBER_OF_PARTNERS; i++)
+		for (int i = 0; i < NUMBER_OF_PARTNERS; i++) {
 			synchronizer.remove(partners[i]);
+		}
 		assertEquals("4.0", 0, synchronizer.getPartners().length);
 	}
 
@@ -483,8 +498,9 @@
 		// register the sync partner and set the sync info on the resources
 		synchronizer.add(qname);
 		IResourceVisitor visitor = resource -> {
-			if (resource.getType() == IResource.ROOT)
+			if (resource.getType() == IResource.ROOT) {
 				return true;
+			}
 			try {
 				byte[] b = getRandomString().getBytes();
 				synchronizer.setSyncInfo(qname, resource, b);
@@ -515,8 +531,9 @@
 		visitor = resource -> {
 			try {
 				ResourceInfo info = ((Resource) resource).getResourceInfo(false, false);
-				if (info == null)
+				if (info == null) {
 					return true;
+				}
 				IPathRequestor requestor = new IPathRequestor() {
 					@Override
 					public IPath requestPath() {
@@ -586,8 +603,9 @@
 			if (resource.getType() == IResource.ROOT) {
 				assertNull("4.0", actual);
 				return true;
-			} else
+			} else {
 				assertNotNull("4.1." + resource.getFullPath(), actual);
+			}
 			byte[] expected = table.get(resource.getFullPath());
 			assertEquals("4.2." + resource.getFullPath(), expected, actual);
 			return true;
@@ -735,8 +753,9 @@
 		// setup the sync bytes
 		final Hashtable<IPath, byte[]> table = new Hashtable<>(10);
 		IResourceVisitor visitor = resource -> {
-			if (resource.getType() == IResource.ROOT)
+			if (resource.getType() == IResource.ROOT) {
 				return true;
+			}
 			byte[] b = getRandomString().getBytes();
 			table.put(resource.getFullPath(), b);
 			return true;
@@ -749,8 +768,9 @@
 
 		// should not be able to set sync info before the target has been registered.
 		visitor = resource -> {
-			if (resource.getType() == IResource.ROOT)
+			if (resource.getType() == IResource.ROOT) {
 				return true;
+			}
 			try {
 				synchronizer.setSyncInfo(qname, resource, table.get(resource.getFullPath()));
 				assertTrue("1.0." + resource.getFullPath(), false);
@@ -820,8 +840,9 @@
 				if (resource.getType() == IResource.ROOT) {
 					assertNull("5.0", actual);
 					return true;
-				} else
+				} else {
 					assertNotNull("5.1." + resource.getFullPath(), actual);
+				}
 				byte[] expected = table.get(resource.getFullPath());
 				assertEquals("5.2." + resource.getFullPath(), expected, actual);
 			} catch (CoreException e) {
@@ -837,8 +858,9 @@
 
 		// change the info and then set it
 		visitor = resource -> {
-			if (resource.getType() == IResource.ROOT)
+			if (resource.getType() == IResource.ROOT) {
 				return true;
+			}
 			try {
 				byte[] b = getRandomString().getBytes();
 				synchronizer.setSyncInfo(qname, resource, b);
@@ -861,8 +883,9 @@
 				if (resource.getType() == IResource.ROOT) {
 					assertNull("7.0", actual);
 					return true;
-				} else
+				} else {
 					assertNotNull("7.1." + resource.getFullPath(), actual);
+				}
 				byte[] expected = table.get(resource.getFullPath());
 				assertEquals("7.2." + resource.getFullPath(), expected, actual);
 			} catch (CoreException e) {
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IWorkspaceRootTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IWorkspaceRootTest.java
index e5b0079..7c8c2bd 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IWorkspaceRootTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IWorkspaceRootTest.java
@@ -48,8 +48,9 @@
 	 */
 	public void testFindFilesNonCanonicalPath() {
 		// this test is for windows only
-		if (!isWindows())
+		if (!isWindows()) {
 			return;
+		}
 		IProject project = getWorkspace().getRoot().getProject("testFindFilesNonCanonicalPath");
 		ensureExistsInWorkspace(project, true);
 
@@ -275,12 +276,13 @@
 	 */
 	private void assertResources(String message, IResource expected0, IResource expected1, IResource[] actual) {
 		assertEquals(message, 2, actual.length);
-		if (actual[0].equals(expected0))
+		if (actual[0].equals(expected0)) {
 			assertEquals(message, expected1, actual[1]);
-		else if (actual[0].equals(expected1))
+		} else if (actual[0].equals(expected1)) {
 			assertEquals(message, expected0, actual[1]);
-		else
+		} else {
 			assertEquals(message, expected0, actual[0]);
+		}
 	}
 
 	/**
@@ -530,24 +532,24 @@
 		IFolder mFolderInFolder = createFolder(folder, updateFlags, false);
 		IFolder mLinkedFolderInFolder = createFolder(folder, updateFlags, true);
 
-		for (int i = 0; i < results.length; i++) {
-			checkFindContainers(hiddenFolder.getLocationURI(), results[i][0], results[i][1]);
-			checkFindFiles(mFileInHiddenFolder.getLocationURI(), results[i][0], results[i][4]);
-			checkFindFiles(mLinkedFileInHiddenFolder.getLocationURI(), results[i][0], results[i][5]);
-			checkFindContainers(mFolderInHiddenFolder.getLocationURI(), results[i][0], results[i][2]);
-			checkFindContainers(mLinkedFolderInHiddenFolder.getLocationURI(), results[i][0], results[i][3]);
+		for (int[] result : results) {
+			checkFindContainers(hiddenFolder.getLocationURI(), result[0], result[1]);
+			checkFindFiles(mFileInHiddenFolder.getLocationURI(), result[0], result[4]);
+			checkFindFiles(mLinkedFileInHiddenFolder.getLocationURI(), result[0], result[5]);
+			checkFindContainers(mFolderInHiddenFolder.getLocationURI(), result[0], result[2]);
+			checkFindContainers(mLinkedFolderInHiddenFolder.getLocationURI(), result[0], result[3]);
 
-			checkFindContainers(folder.getLocationURI(), results[i][0], results[i][6]);
-			checkFindFiles(mFileInFolder.getLocationURI(), results[i][0], results[i][7]);
-			checkFindFiles(mLinkedFileInFolder.getLocationURI(), results[i][0], results[i][8]);
-			checkFindContainers(mFolderInFolder.getLocationURI(), results[i][0], results[i][9]);
-			checkFindContainers(mLinkedFolderInFolder.getLocationURI(), results[i][0], results[i][10]);
+			checkFindContainers(folder.getLocationURI(), result[0], result[6]);
+			checkFindFiles(mFileInFolder.getLocationURI(), result[0], result[7]);
+			checkFindFiles(mLinkedFileInFolder.getLocationURI(), result[0], result[8]);
+			checkFindContainers(mFolderInFolder.getLocationURI(), result[0], result[9]);
+			checkFindContainers(mLinkedFolderInFolder.getLocationURI(), result[0], result[10]);
 
-			checkFindContainers(teamFolder.getLocationURI(), results[i][0], results[i][11]);
-			checkFindFiles(mFileInTeamFolder.getLocationURI(), results[i][0], results[i][12]);
-			checkFindFiles(mLinkedFileInTeamFolder.getLocationURI(), results[i][0], results[i][13]);
-			checkFindContainers(mFolderInTeamFolder.getLocationURI(), results[i][0], results[i][14]);
-			checkFindContainers(mLinkedFolderInTeamFolder.getLocationURI(), results[i][0], results[i][15]);
+			checkFindContainers(teamFolder.getLocationURI(), result[0], result[11]);
+			checkFindFiles(mFileInTeamFolder.getLocationURI(), result[0], result[12]);
+			checkFindFiles(mLinkedFileInTeamFolder.getLocationURI(), result[0], result[13]);
+			checkFindContainers(mFolderInTeamFolder.getLocationURI(), result[0], result[14]);
+			checkFindContainers(mLinkedFolderInTeamFolder.getLocationURI(), result[0], result[15]);
 		}
 	}
 
@@ -569,8 +571,9 @@
 					IPath path = getTempDir().append(getUniqueString());
 					path.toFile().createNewFile();
 					file.createLink(URIUtil.toURI(path), updateFlags, getMonitor());
-					if ((updateFlags & IResource.TEAM_PRIVATE) == IResource.TEAM_PRIVATE)
+					if ((updateFlags & IResource.TEAM_PRIVATE) == IResource.TEAM_PRIVATE) {
 						file.setTeamPrivateMember(true);
+					}
 				} catch (IOException e) {
 					fail("Can't create the file", e);
 				}
@@ -590,8 +593,9 @@
 				IPath path = getTempDir().append(getUniqueString());
 				path.toFile().mkdir();
 				folder.createLink(URIUtil.toURI(path), updateFlags, getMonitor());
-				if ((updateFlags & IResource.TEAM_PRIVATE) == IResource.TEAM_PRIVATE)
+				if ((updateFlags & IResource.TEAM_PRIVATE) == IResource.TEAM_PRIVATE) {
 					folder.setTeamPrivateMember(true);
+				}
 			} else {
 				folder.create(updateFlags, true, getMonitor());
 			}
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IWorkspaceTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IWorkspaceTest.java
index 199f1dd..fb042fe 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IWorkspaceTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/IWorkspaceTest.java
@@ -42,9 +42,11 @@
 	 * Returns the nature descriptor with the given Id, or null if not found
 	 */
 	protected IProjectNatureDescriptor findNature(IProjectNatureDescriptor[] descriptors, String id) {
-		for (int i = 0; i < descriptors.length; i++)
-			if (descriptors[i].getNatureId().equals(id))
-				return descriptors[i];
+		for (IProjectNatureDescriptor descriptor : descriptors) {
+			if (descriptor.getNatureId().equals(id)) {
+				return descriptor;
+			}
+		}
 		return null;
 	}
 
@@ -739,8 +741,7 @@
 			project.create(null);
 			project.open(null);
 			// define an operation which will create a bunch of resources including a project.
-			for (int i = 0; i < resources.length; i++) {
-				IResource resource = resources[i];
+			for (IResource resource : resources) {
 				switch (resource.getType()) {
 					case IResource.FILE :
 						((IFile) resource).create(null, false, getMonitor());
@@ -799,14 +800,15 @@
 			}, "Autobuild " + i);
 			threads[i].start();
 		}
-		for (int i = 0; i < threads.length; i++) {
+		for (Thread thread : threads) {
 			try {
-				threads[i].join();
+				thread.join();
 			} catch (InterruptedException e) {
 			}
 		}
-		if (errorPointer[0] != null)
+		if (errorPointer[0] != null) {
 			fail("1.0", errorPointer[0]);
+		}
 	}
 
 	/**
@@ -838,11 +840,11 @@
 
 		//invalid sets shouldn't fail
 		String[][] invalid = getInvalidNatureSets();
-		for (int i = 0; i < invalid.length; i++) {
-			String[] sorted = ws.sortNatureSet(invalid[i]);
+		for (String[] element : invalid) {
+			String[] sorted = ws.sortNatureSet(element);
 			assertTrue("0.0", sorted != null);
 			//set may grow if it contained duplicates
-			assertTrue("0.1", sorted.length <= invalid[i].length);
+			assertTrue("0.1", sorted.length <= element.length);
 		}
 		String[] sorted = ws.sortNatureSet(new String[] {});
 		assertEquals("1.0", 0, sorted.length);
@@ -868,8 +870,9 @@
 	public void testValidateEdit() {
 		// We need to know whether or not we can unset the read-only flag
 		// in order to perform this test.
-		if (!isReadOnlySupported())
+		if (!isReadOnlySupported()) {
 			return;
+		}
 		IProject project = getWorkspace().getRoot().getProject("MyProject");
 		IFile file = project.getFile("myfile.txt");
 		ensureExistsInWorkspace(new IResource[] {project, file}, true);
@@ -1060,8 +1063,9 @@
 		//can overlap platform directory on another device
 		IPath anotherDevice = platformLocation.setDevice("u:");
 		assertTrue("6.1", workspace.validateProjectLocation(project, new Path("u:", "/")).isOK());
-		if (WINDOWS)
+		if (WINDOWS) {
 			assertTrue("6.2", workspace.validateProjectLocation(project, new Path("u:", "\\")).isOK());
+		}
 		assertTrue("6.4", workspace.validateProjectLocation(project, anotherDevice).isOK());
 		assertTrue("6.5", workspace.validateProjectLocation(project, anotherDevice.append("foo")).isOK());
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/LinkedResourceTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/LinkedResourceTest.java
index 58d60eb..9f07ec7 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/LinkedResourceTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/LinkedResourceTest.java
@@ -145,8 +145,9 @@
 			desc.setLocation(Path.fromOSString(dir.getAbsolutePath()));
 			existingProjectInSubDirectory.create(desc, getMonitor());
 		}
-		if (!existingProjectInSubDirectory.isOpen())
+		if (!existingProjectInSubDirectory.isOpen()) {
 			existingProjectInSubDirectory.open(getMonitor());
+		}
 	}
 
 	@Override
@@ -196,10 +197,11 @@
 		}
 
 		//try to create with local path that can never exist
-		if (isWindows())
+		if (isWindows()) {
 			location = new Path("b:\\does\\not\\exist");
-		else
+		} else {
 			location = new Path("/dev/null/does/not/exist");
+		}
 		location = FileUtil.canonicalPath(location);
 		try {
 			folder.createLink(location, IResource.NONE, getMonitor());
@@ -349,16 +351,18 @@
 				IResource destination = (IResource) args[1];
 				boolean isDeep = ((Boolean) args[2]).booleanValue();
 				IProgressMonitor monitor = (IProgressMonitor) args[3];
-				if (monitor instanceof FussyProgressMonitor)
+				if (monitor instanceof FussyProgressMonitor) {
 					((FussyProgressMonitor) monitor).prepare();
+				}
 				try {
 					source.createLink(localFile, IResource.NONE, null);
 					source.copy(destination.getFullPath(), isDeep ? IResource.NONE : IResource.SHALLOW, monitor);
 				} catch (OperationCanceledException e) {
 					return CANCELED;
 				}
-				if (monitor instanceof FussyProgressMonitor)
+				if (monitor instanceof FussyProgressMonitor) {
 					((FussyProgressMonitor) monitor).sanityCheck();
+				}
 				return null;
 			}
 
@@ -368,17 +372,22 @@
 				IResource destination = (IResource) args[1];
 				boolean isDeep = ((Boolean) args[2]).booleanValue();
 				IProgressMonitor monitor = (IProgressMonitor) args[3];
-				if (monitor instanceof CancelingProgressMonitor)
+				if (monitor instanceof CancelingProgressMonitor) {
 					return false;
-				if (source.equals(destination))
+				}
+				if (source.equals(destination)) {
 					return true;
+				}
 				IResource parent = destination.getParent();
-				if (!isDeep && parent == null)
+				if (!isDeep && parent == null) {
 					return true;
-				if (!parent.isAccessible())
+				}
+				if (!parent.isAccessible()) {
 					return true;
-				if (destination.exists())
+				}
+				if (destination.exists()) {
 					return true;
+				}
 				//passed all failure cases so it should succeed
 				return false;
 			}
@@ -389,27 +398,36 @@
 				IResource destination = (IResource) args[1];
 				boolean isDeep = ((Boolean) args[2]).booleanValue();
 				IProgressMonitor monitor = (IProgressMonitor) args[3];
-				if (result == CANCELED)
+				if (result == CANCELED) {
 					return monitor instanceof CancelingProgressMonitor;
-				if (!destination.exists())
+				}
+				if (!destination.exists()) {
 					return false;
+				}
 				//destination should only be linked for a shallow copy
 				if (isDeep) {
-					if (destination.isLinked())
+					if (destination.isLinked()) {
 						return false;
-					if (source.getLocation().equals(destination.getLocation()))
+					}
+					if (source.getLocation().equals(destination.getLocation())) {
 						return false;
-					if (!destination.getProject().getLocation().isPrefixOf(destination.getLocation()))
+					}
+					if (!destination.getProject().getLocation().isPrefixOf(destination.getLocation())) {
 						return false;
+					}
 				} else {
-					if (!destination.isLinked())
+					if (!destination.isLinked()) {
 						return false;
-					if (!source.getLocation().equals(destination.getLocation()))
+					}
+					if (!source.getLocation().equals(destination.getLocation())) {
 						return false;
-					if (!source.getRawLocation().equals(destination.getRawLocation()))
+					}
+					if (!source.getRawLocation().equals(destination.getRawLocation())) {
 						return false;
-					if (!source.getLocationURI().equals(destination.getLocationURI()))
+					}
+					if (!source.getLocationURI().equals(destination.getLocationURI())) {
 						return false;
+					}
 				}
 				return true;
 			}
@@ -441,16 +459,18 @@
 				IResource destination = (IResource) args[1];
 				boolean isDeep = ((Boolean) args[2]).booleanValue();
 				IProgressMonitor monitor = (IProgressMonitor) args[3];
-				if (monitor instanceof FussyProgressMonitor)
+				if (monitor instanceof FussyProgressMonitor) {
 					((FussyProgressMonitor) monitor).prepare();
+				}
 				try {
 					source.createLink(localFolder, IResource.NONE, null);
 					source.copy(destination.getFullPath(), isDeep ? IResource.NONE : IResource.SHALLOW, monitor);
 				} catch (OperationCanceledException e) {
 					return CANCELED;
 				}
-				if (monitor instanceof FussyProgressMonitor)
+				if (monitor instanceof FussyProgressMonitor) {
 					((FussyProgressMonitor) monitor).sanityCheck();
+				}
 				return null;
 			}
 
@@ -460,19 +480,25 @@
 				IResource destination = (IResource) args[1];
 				boolean isDeep = ((Boolean) args[2]).booleanValue();
 				IProgressMonitor monitor = (IProgressMonitor) args[3];
-				if (monitor instanceof CancelingProgressMonitor)
+				if (monitor instanceof CancelingProgressMonitor) {
 					return false;
+				}
 				IResource parent = destination.getParent();
-				if (destination.getType() == IResource.PROJECT)
+				if (destination.getType() == IResource.PROJECT) {
 					return true;
-				if (source.equals(destination))
+				}
+				if (source.equals(destination)) {
 					return true;
-				if (!isDeep && parent == null)
+				}
+				if (!isDeep && parent == null) {
 					return true;
-				if (!parent.isAccessible())
+				}
+				if (!parent.isAccessible()) {
 					return true;
-				if (destination.exists())
+				}
+				if (destination.exists()) {
 					return true;
+				}
 				//passed all failure case so it should succeed
 				return false;
 			}
@@ -483,27 +509,36 @@
 				IResource destination = (IResource) args[1];
 				boolean isDeep = ((Boolean) args[2]).booleanValue();
 				IProgressMonitor monitor = (IProgressMonitor) args[3];
-				if (result == CANCELED)
+				if (result == CANCELED) {
 					return monitor instanceof CancelingProgressMonitor;
-				if (!destination.exists())
+				}
+				if (!destination.exists()) {
 					return false;
+				}
 				//destination should only be linked for a shallow copy
 				if (isDeep) {
-					if (destination.isLinked())
+					if (destination.isLinked()) {
 						return false;
-					if (source.getLocation().equals(destination.getLocation()))
+					}
+					if (source.getLocation().equals(destination.getLocation())) {
 						return false;
-					if (!destination.getProject().getLocation().isPrefixOf(destination.getLocation()))
+					}
+					if (!destination.getProject().getLocation().isPrefixOf(destination.getLocation())) {
 						return false;
+					}
 				} else {
-					if (!destination.isLinked())
+					if (!destination.isLinked()) {
 						return false;
-					if (!source.getLocation().equals(destination.getLocation()))
+					}
+					if (!source.getLocation().equals(destination.getLocation())) {
 						return false;
-					if (!source.getLocationURI().equals(destination.getLocationURI()))
+					}
+					if (!source.getLocationURI().equals(destination.getLocationURI())) {
 						return false;
-					if (!source.getRawLocation().equals(destination.getRawLocation()))
+					}
+					if (!source.getRawLocation().equals(destination.getRawLocation())) {
 						return false;
+					}
 				}
 				return true;
 			}
@@ -629,8 +664,9 @@
 			try {
 				IResource[] srcChildren = existingProject.members();
 				for (int i = 0; i < srcChildren.length; i++) {
-					if (!srcChildren[i].equals(linkedFile))
+					if (!srcChildren[i].equals(linkedFile)) {
 						assertNotNull("6.3." + i, destination.findMember(srcChildren[i].getProjectRelativePath()));
+					}
 				}
 			} catch (CoreException e) {
 				fail("6.4", e);
@@ -655,8 +691,9 @@
 			try {
 				IResource[] srcChildren = existingProject.members();
 				for (int i = 0; i < srcChildren.length; i++) {
-					if (!srcChildren[i].equals(linkedFile))
+					if (!srcChildren[i].equals(linkedFile)) {
 						assertNotNull("6.8." + i, destination.findMember(srcChildren[i].getProjectRelativePath()));
+					}
 				}
 			} catch (CoreException e) {
 				fail("6.99", e);
@@ -697,12 +734,14 @@
 		try {
 			link.createLink(localFolder, IResource.NONE, getMonitor());
 			//should fail on case insensitive platforms
-			if (!isCaseSensitive(variant))
+			if (!isCaseSensitive(variant)) {
 				fail("1.0");
+			}
 		} catch (CoreException e) {
 			//should not fail on case sensitive platforms
-			if (isCaseSensitive(variant))
+			if (isCaseSensitive(variant)) {
 				fail("1.1", e);
+			}
 		}
 
 	}
@@ -977,8 +1016,9 @@
 	 */
 	public void testFindFilesForLocationCaseVariant() {
 		//this test only applies to file systems with a device in the path
-		if (!isWindows())
+		if (!isWindows()) {
 			return;
+		}
 		IFolder link = nonExistingFolderInExistingProject;
 		IPath localLocation = resolve(localFolder);
 		IPath upperCase = localLocation.setDevice(localLocation.getDevice().toUpperCase());
@@ -1213,15 +1253,17 @@
 				IFile file = (IFile) args[0];
 				IPath location = (IPath) args[1];
 				IProgressMonitor monitor = (IProgressMonitor) args[2];
-				if (monitor instanceof FussyProgressMonitor)
+				if (monitor instanceof FussyProgressMonitor) {
 					((FussyProgressMonitor) monitor).prepare();
+				}
 				try {
 					file.createLink(location, IResource.NONE, monitor);
 				} catch (OperationCanceledException e) {
 					return CANCELED;
 				}
-				if (monitor instanceof FussyProgressMonitor)
+				if (monitor instanceof FussyProgressMonitor) {
 					((FussyProgressMonitor) monitor).sanityCheck();
+				}
 				return null;
 			}
 
@@ -1230,27 +1272,34 @@
 				IResource resource = (IResource) args[0];
 				IPath location = (IPath) args[1];
 				IProgressMonitor monitor = (IProgressMonitor) args[2];
-				if (monitor instanceof CancelingProgressMonitor)
+				if (monitor instanceof CancelingProgressMonitor) {
 					return false;
+				}
 				//This resource already exists in the workspace
-				if (resource.exists())
+				if (resource.exists()) {
 					return true;
+				}
 				IPath resolvedLocation = resolve(location);
 				//The corresponding location in the local file system does not exist.
-				if (!resolvedLocation.toFile().exists())
+				if (!resolvedLocation.toFile().exists()) {
 					return true;
+				}
 				//The workspace contains a resource of a different type at the same path as this resource
-				if (getWorkspace().getRoot().findMember(resource.getFullPath()) != null)
+				if (getWorkspace().getRoot().findMember(resource.getFullPath()) != null) {
 					return true;
+				}
 				//The parent of this resource does not exist.
-				if (!resource.getParent().isAccessible())
+				if (!resource.getParent().isAccessible()) {
 					return true;
+				}
 				//The name of this resource is not valid (according to IWorkspace.validateName)
-				if (!getWorkspace().validateName(resource.getName(), IResource.FOLDER).isOK())
+				if (!getWorkspace().validateName(resource.getName(), IResource.FOLDER).isOK()) {
 					return true;
+				}
 				//The corresponding location in the local file system is occupied by a directory (as opposed to a file)
-				if (resolvedLocation.toFile().isDirectory())
+				if (resolvedLocation.toFile().isDirectory()) {
 					return true;
+				}
 				//passed all failure case so it should succeed
 				return false;
 			}
@@ -1260,15 +1309,19 @@
 				IFile resource = (IFile) args[0];
 				IPath location = (IPath) args[1];
 				IProgressMonitor monitor = (IProgressMonitor) args[2];
-				if (result == CANCELED)
+				if (result == CANCELED) {
 					return monitor instanceof CancelingProgressMonitor;
+				}
 				IPath resolvedLocation = resolve(location);
-				if (!resource.exists() || !resolvedLocation.toFile().exists())
+				if (!resource.exists() || !resolvedLocation.toFile().exists()) {
 					return false;
-				if (!resource.getLocation().equals(resolvedLocation))
+				}
+				if (!resource.getLocation().equals(resolvedLocation)) {
 					return false;
-				if (!resource.isSynchronized(IResource.DEPTH_INFINITE))
+				}
+				if (!resource.isSynchronized(IResource.DEPTH_INFINITE)) {
 					return false;
+				}
 				return true;
 			}
 		}.performTest(inputs);
@@ -1300,15 +1353,17 @@
 				IFolder folder = (IFolder) args[0];
 				IPath location = (IPath) args[1];
 				IProgressMonitor monitor = (IProgressMonitor) args[2];
-				if (monitor instanceof FussyProgressMonitor)
+				if (monitor instanceof FussyProgressMonitor) {
 					((FussyProgressMonitor) monitor).prepare();
+				}
 				try {
 					folder.createLink(location, IResource.NONE, monitor);
 				} catch (OperationCanceledException e) {
 					return CANCELED;
 				}
-				if (monitor instanceof FussyProgressMonitor)
+				if (monitor instanceof FussyProgressMonitor) {
 					((FussyProgressMonitor) monitor).sanityCheck();
+				}
 				return null;
 			}
 
@@ -1317,26 +1372,33 @@
 				IResource resource = (IResource) args[0];
 				IPath location = (IPath) args[1];
 				IProgressMonitor monitor = (IProgressMonitor) args[2];
-				if (monitor instanceof CancelingProgressMonitor)
+				if (monitor instanceof CancelingProgressMonitor) {
 					return false;
+				}
 				//This resource already exists in the workspace
-				if (resource.exists())
+				if (resource.exists()) {
 					return true;
+				}
 				//The corresponding location in the local file system does not exist.
-				if (!resolve(location).toFile().exists())
+				if (!resolve(location).toFile().exists()) {
 					return true;
+				}
 				//The workspace contains a resource of a different type at the same path as this resource
-				if (getWorkspace().getRoot().findMember(resource.getFullPath()) != null)
+				if (getWorkspace().getRoot().findMember(resource.getFullPath()) != null) {
 					return true;
+				}
 				//The parent of this resource does not exist.
-				if (!resource.getParent().isAccessible())
+				if (!resource.getParent().isAccessible()) {
 					return true;
+				}
 				//The name of this resource is not valid (according to IWorkspace.validateName)
-				if (!getWorkspace().validateName(resource.getName(), IResource.FOLDER).isOK())
+				if (!getWorkspace().validateName(resource.getName(), IResource.FOLDER).isOK()) {
 					return true;
+				}
 				//The corresponding location in the local file system is occupied by a file (as opposed to a directory)
-				if (resolve(location).toFile().isFile())
+				if (resolve(location).toFile().isFile()) {
 					return true;
+				}
 				//passed all failure case so it should succeed
 				return false;
 			}
@@ -1346,16 +1408,20 @@
 				IFolder resource = (IFolder) args[0];
 				IPath location = (IPath) args[1];
 				IProgressMonitor monitor = (IProgressMonitor) args[2];
-				if (result == CANCELED)
+				if (result == CANCELED) {
 					return monitor instanceof CancelingProgressMonitor;
+				}
 				IPath resolvedLocation = resolve(location);
-				if (!resource.exists() || !resolvedLocation.toFile().exists())
+				if (!resource.exists() || !resolvedLocation.toFile().exists()) {
 					return false;
-				if (!resource.getLocation().equals(resolvedLocation))
+				}
+				if (!resource.getLocation().equals(resolvedLocation)) {
 					return false;
+				}
 				//ensure child exists
-				if (!resource.getFile(childName).exists())
+				if (!resource.getFile(childName).exists()) {
 					return false;
+				}
 				return true;
 			}
 		}.performTest(inputs);
@@ -1385,8 +1451,9 @@
 	 */
 	public void testLocationWithColon() {
 		//windows does not allow a location with colon in the name
-		if (isWindows())
+		if (isWindows()) {
 			return;
+		}
 		IFolder folder = nonExistingFolderInExistingProject;
 		try {
 			//Note that on *nix, "c:/temp" is a relative path with two segments
@@ -1462,16 +1529,18 @@
 				IResource destination = (IResource) args[1];
 				boolean isDeep = ((Boolean) args[2]).booleanValue();
 				IProgressMonitor monitor = (IProgressMonitor) args[3];
-				if (monitor instanceof FussyProgressMonitor)
+				if (monitor instanceof FussyProgressMonitor) {
 					((FussyProgressMonitor) monitor).prepare();
+				}
 				try {
 					source.createLink(localFile, IResource.NONE, null);
 					source.move(destination.getFullPath(), isDeep ? IResource.NONE : IResource.SHALLOW, monitor);
 				} catch (OperationCanceledException e) {
 					return CANCELED;
 				}
-				if (monitor instanceof FussyProgressMonitor)
+				if (monitor instanceof FussyProgressMonitor) {
 					((FussyProgressMonitor) monitor).sanityCheck();
+				}
 				return null;
 			}
 
@@ -1481,19 +1550,25 @@
 				IResource destination = (IResource) args[1];
 				boolean isDeep = ((Boolean) args[2]).booleanValue();
 				IProgressMonitor monitor = (IProgressMonitor) args[3];
-				if (monitor instanceof CancelingProgressMonitor)
+				if (monitor instanceof CancelingProgressMonitor) {
 					return false;
+				}
 				IResource parent = destination.getParent();
-				if (!isDeep && parent == null)
+				if (!isDeep && parent == null) {
 					return true;
-				if (!parent.isAccessible())
+				}
+				if (!parent.isAccessible()) {
 					return true;
-				if (source.equals(destination))
+				}
+				if (source.equals(destination)) {
 					return true;
-				if (source.getType() != destination.getType())
+				}
+				if (source.getType() != destination.getType()) {
 					return true;
-				if (destination.exists())
+				}
+				if (destination.exists()) {
 					return true;
+				}
 				//passed all failure case so it should succeed
 				return false;
 			}
@@ -1505,25 +1580,33 @@
 				IProgressMonitor monitor = (IProgressMonitor) args[3];
 				IPath sourceLocation = resolve(localFile);
 				URI sourceLocationURI = URIUtil.toURI(sourceLocation);
-				if (result == CANCELED)
+				if (result == CANCELED) {
 					return monitor instanceof CancelingProgressMonitor;
-				if (!destination.exists())
+				}
+				if (!destination.exists()) {
 					return false;
+				}
 				//destination should only be linked for a shallow move
 				if (isDeep) {
-					if (destination.isLinked())
+					if (destination.isLinked()) {
 						return false;
-					if (resolve(localFile).equals(destination.getLocation()))
+					}
+					if (resolve(localFile).equals(destination.getLocation())) {
 						return false;
-					if (!destination.getProject().getLocation().isPrefixOf(destination.getLocation()))
+					}
+					if (!destination.getProject().getLocation().isPrefixOf(destination.getLocation())) {
 						return false;
+					}
 				} else {
-					if (!destination.isLinked())
+					if (!destination.isLinked()) {
 						return false;
-					if (!sourceLocation.equals(destination.getLocation()))
+					}
+					if (!sourceLocation.equals(destination.getLocation())) {
 						return false;
-					if (!sourceLocationURI.equals(destination.getLocationURI()))
+					}
+					if (!sourceLocationURI.equals(destination.getLocationURI())) {
 						return false;
+					}
 				}
 				return true;
 			}
@@ -1553,16 +1636,18 @@
 				IFolder source = (IFolder) args[0];
 				IResource destination = (IResource) args[1];
 				IProgressMonitor monitor = (IProgressMonitor) args[2];
-				if (monitor instanceof FussyProgressMonitor)
+				if (monitor instanceof FussyProgressMonitor) {
 					((FussyProgressMonitor) monitor).prepare();
+				}
 				try {
 					source.createLink(localFolder, IResource.NONE, null);
 					source.move(destination.getFullPath(), IResource.SHALLOW, monitor);
 				} catch (OperationCanceledException e) {
 					return CANCELED;
 				}
-				if (monitor instanceof FussyProgressMonitor)
+				if (monitor instanceof FussyProgressMonitor) {
 					((FussyProgressMonitor) monitor).sanityCheck();
+				}
 				return null;
 			}
 
@@ -1571,19 +1656,25 @@
 				IFolder source = (IFolder) args[0];
 				IResource destination = (IResource) args[1];
 				IProgressMonitor monitor = (IProgressMonitor) args[2];
-				if (monitor instanceof CancelingProgressMonitor)
+				if (monitor instanceof CancelingProgressMonitor) {
 					return false;
+				}
 				IResource parent = destination.getParent();
-				if (parent == null)
+				if (parent == null) {
 					return true;
-				if (source.equals(destination))
+				}
+				if (source.equals(destination)) {
 					return true;
-				if (source.getType() != destination.getType())
+				}
+				if (source.getType() != destination.getType()) {
 					return true;
-				if (!parent.isAccessible())
+				}
+				if (!parent.isAccessible()) {
 					return true;
-				if (destination.exists())
+				}
+				if (destination.exists()) {
 					return true;
+				}
 				//passed all failure case so it should succeed
 				return false;
 			}
@@ -1592,14 +1683,18 @@
 			public boolean wasSuccess(Object[] args, Object result, Object[] oldState) throws Exception {
 				IResource destination = (IResource) args[1];
 				IProgressMonitor monitor = (IProgressMonitor) args[2];
-				if (result == CANCELED)
+				if (result == CANCELED) {
 					return monitor instanceof CancelingProgressMonitor;
-				if (!destination.exists())
+				}
+				if (!destination.exists()) {
 					return false;
-				if (!destination.isLinked())
+				}
+				if (!destination.isLinked()) {
 					return false;
-				if (!resolve(localFolder).equals(destination.getLocation()))
+				}
+				if (!resolve(localFolder).equals(destination.getLocation())) {
 					return false;
+				}
 				return true;
 			}
 		}.performTest(inputs);
@@ -1972,8 +2067,9 @@
 
 	public void testLinkedFolderWithSymlink_Bug338010() {
 		// Only activate this test if testing of symbolic links is possible.
-		if (!canCreateSymLinks())
+		if (!canCreateSymLinks()) {
 			return;
+		}
 		IPath baseLocation = getRandomLocation();
 		IPath resolvedBaseLocation = resolve(baseLocation);
 		deleteOnTearDown(resolvedBaseLocation);
@@ -2001,8 +2097,9 @@
 	 */
 	public void testDeleteLinkTarget_Bug507084() throws Exception {
 		// Only activate this test if testing of symbolic links is possible.
-		if (!canCreateSymLinks())
+		if (!canCreateSymLinks()) {
 			return;
+		}
 		IPath baseLocation = getRandomLocation();
 		IPath resolvedBaseLocation = resolve(baseLocation);
 		deleteOnTearDown(resolvedBaseLocation);
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/LinkedResourceWithPathVariableTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/LinkedResourceWithPathVariableTest.java
index 96fe117..5609551 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/LinkedResourceWithPathVariableTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/LinkedResourceWithPathVariableTest.java
@@ -78,8 +78,9 @@
 		getWorkspace().getPathVariableManager().setValue(VARIABLE_NAME, null);
 		IPath[] paths = toDelete.toArray(new IPath[toDelete.size()]);
 		toDelete.clear();
-		for (int i = 0; i < paths.length; i++)
-			Workspace.clear(paths[i].toFile());
+		for (IPath path : paths) {
+			Workspace.clear(path.toFile());
+		}
 		super.tearDown();
 	}
 
@@ -119,10 +120,12 @@
 				ib = is.read();
 			}
 		} finally {
-			if (is != null)
+			if (is != null) {
 				is.close();
-			if (os != null)
+			}
+			if (os != null) {
 				os.close();
+			}
 		}
 	}
 
@@ -451,9 +454,9 @@
 	public void testPROJECT_LOC_MoveFileToDifferentProject() {
 
 		String[] existingVariables = nonExistingFileInExistingFolder.getProject().getPathVariableManager().getPathVariableNames();
-		for (int i = 0; i < existingVariables.length; i++) {
+		for (String existingVariable : existingVariables) {
 			try {
-				nonExistingFileInExistingFolder.getProject().getPathVariableManager().setValue(existingVariables[i], null);
+				nonExistingFileInExistingFolder.getProject().getPathVariableManager().setValue(existingVariable, null);
 			} catch (CoreException e) {
 			}
 		}
@@ -823,8 +826,9 @@
 		}
 
 		// Don't run this test if we cannot set a file read-only
-		if ((projStore.getFileSystem().attributes() & EFS.ATTRIBUTE_READ_ONLY) == 0)
+		if ((projStore.getFileSystem().attributes() & EFS.ATTRIBUTE_READ_ONLY) == 0) {
 			return;
+		}
 
 		try {
 			// Create a linked resource with a non-existing path variable
@@ -1422,9 +1426,10 @@
 		String[] variables = manager.getPathVariableNames();
 		boolean found = false;
 
-		for (int i = 0; i < variables.length; i++) {
-			if (variables[i].equals("Test338185"))
+		for (String variable : variables) {
+			if (variable.equals("Test338185")) {
 				found = true;
+			}
 		}
 		assertTrue(found);
 	}
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/MarkerAttributeChangeListener.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/MarkerAttributeChangeListener.java
index 8894168..aa27b97 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/MarkerAttributeChangeListener.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/MarkerAttributeChangeListener.java
@@ -38,8 +38,8 @@
 		error = null;
 		attributeMap.clear();
 
-		for (int i = 0; i < markers.length; i++) {
-			attributeMap.put(Long.valueOf(markers[i].getId()), markers[i].getAttributes());
+		for (IMarker marker : markers) {
+			attributeMap.put(Long.valueOf(marker.getId()), marker.getAttributes());
 		}
 	}
 
@@ -58,9 +58,9 @@
 
 	private void checkDelta(IMarkerDelta[] deltas) throws AssertionFailedError {
 		assertEquals("wrong number of changes", attributeMap.size(), deltas.length);
-		for (int i = 0; i < deltas.length; i++) {
-			Map<String, Object> values = attributeMap.get(new Long(deltas[i].getId()));
-			assertEquals("Changes different from expecations", deltas[i].getAttributes(), values);
+		for (IMarkerDelta delta : deltas) {
+			Map<String, Object> values = attributeMap.get(new Long(delta.getId()));
+			assertEquals("Changes different from expecations", delta.getAttributes(), values);
 		}
 	}
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/MarkerSetTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/MarkerSetTest.java
index 2dcb950..3419bcb 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/MarkerSetTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/MarkerSetTest.java
@@ -46,14 +46,16 @@
 		java.util.Comparator<IMarkerSetElement> compare = (e1, e2) -> {
 			long id1 = e1.getId();
 			long id2 = e2.getId();
-			if (id1 == id2)
+			if (id1 == id2) {
 				return 0;
+			}
 			return id1 < id2 ? -1 : 1;
 		};
 		Arrays.sort(m1, compare);
 		Arrays.sort(m2, compare);
-		for (int i = 0; i < m1.length; i++)
+		for (int i = 0; i < m1.length; i++) {
 			assertEquals(message, m1[i].getId(), m2[i].getId());
+		}
 	}
 
 	/**
@@ -144,8 +146,9 @@
 			assertTrue("2.0." + i, !set.contains(info.getId()));
 			assertEquals("2.1," + i, i, set.size());
 			// check that the others still exist
-			for (int j = 0; j < i; j++)
+			for (int j = 0; j < i; j++) {
 				assertTrue("2.2." + j, set.contains(infos[j].getId()));
+			}
 		}
 
 		// all gone?
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/MarkerTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/MarkerTest.java
index 9c451c2..a0afcf1 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/MarkerTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/MarkerTest.java
@@ -132,8 +132,9 @@
 		// Create an array with a bunch of markers.
 		IWorkspaceRunnable body = monitor -> {
 			IResourceVisitor visitor = resource -> {
-				for (int i = 0; i < markersPerResource; i++)
+				for (int i = 0; i < markersPerResource; i++) {
 					resource.createMarker(IMarker.PROBLEM);
+				}
 				return true;
 			};
 			getWorkspace().getRoot().accept(visitor);
@@ -153,16 +154,18 @@
 		try {
 			IMarker[] temp = getWorkspace().getRoot().findMarkers(null, true, IResource.DEPTH_INFINITE);
 			assertEquals("0.1", numMarkers, temp.length);
-			for (int i = 0; i < temp.length; i++)
+			for (int i = 0; i < temp.length; i++) {
 				markers[i] = temp[i];
+			}
 		} catch (CoreException e) {
 			fail("0.2", e);
 		}
 
 		// create attributes on each marker
 		body = monitor -> {
-			for (int i = 0; i < markers.length; i++)
-				markers[i].setAttribute(IMarker.MESSAGE, getRandomString());
+			for (IMarker marker : markers) {
+				marker.setAttribute(IMarker.MESSAGE, getRandomString());
+			}
 		};
 		try {
 			start = System.currentTimeMillis();
@@ -176,8 +179,9 @@
 
 		// get the attribute from each marker
 		body = monitor -> {
-			for (int i = 0; i < markers.length; i++)
-				markers[i].getAttribute(IMarker.MESSAGE);
+			for (IMarker marker : markers) {
+				marker.getAttribute(IMarker.MESSAGE);
+			}
 		};
 		try {
 			start = System.currentTimeMillis();
@@ -220,8 +224,9 @@
 
 		// create attributes on each marker
 		body = monitor -> {
-			for (int i = 0; i < markers.length; i++)
-				markers[i].setAttribute(IMarker.MESSAGE, getRandomString());
+			for (IMarker marker : markers) {
+				marker.setAttribute(IMarker.MESSAGE, getRandomString());
+			}
 		};
 		try {
 			start = System.currentTimeMillis();
@@ -237,10 +242,12 @@
 			try {
 				String name1 = (String) o1.getAttribute(IMarker.MESSAGE);
 				String name2 = (String) o2.getAttribute(IMarker.MESSAGE);
-				if (name1 == null)
+				if (name1 == null) {
 					name1 = "";
-				if (name2 == null)
+				}
+				if (name2 == null) {
 					name2 = "";
+				}
 				int result = name1.compareToIgnoreCase(name2);
 				return result;
 			} catch (CoreException e) {
@@ -270,8 +277,9 @@
 	}
 
 	protected void assertDoesNotExist(String message, IMarker[] markers) {
-		for (int i = 0; i < markers.length; i++)
-			assertDoesNotExist(message, markers[i]);
+		for (IMarker marker : markers) {
+			assertDoesNotExist(message, marker);
+		}
 	}
 
 	protected void assertDoesNotExist(String message, IMarker marker) {
@@ -285,8 +293,9 @@
 	 */
 	protected void assertEquals(String message, IMarker[] expectedMarkers, IMarker[] actualMarkers) {
 		int n = expectedMarkers.length;
-		if (n != actualMarkers.length)
+		if (n != actualMarkers.length) {
 			fail(message);
+		}
 		boolean[] seen = new boolean[n];
 		for (int i = 0; i < n; ++i) {
 			boolean found = false;
@@ -313,18 +322,21 @@
 			for (int j = 0; !found && j < keys.length; j++) {
 				if (keys[j].equals(key)) {
 					found = true;
-					if (!values[j].equals(value))
+					if (!values[j].equals(value)) {
 						fail(message);
+					}
 				}
 			}
-			if (!found)
+			if (!found) {
 				assertTrue(message, false);
+			}
 		}
 	}
 
 	protected void assertExists(String message, IMarker[] markers) {
-		for (int i = 0; i < markers.length; i++)
-			assertExists(message, markers[i]);
+		for (IMarker marker : markers) {
+			assertExists(message, marker);
+		}
 	}
 
 	protected void assertExists(String message, IMarker marker) {
@@ -384,10 +396,12 @@
 	 */
 	public static boolean equals(IMarker a, IMarker b) {
 		try {
-			if (a.getType() != b.getType())
+			if (a.getType() != b.getType()) {
 				return false;
-			if (a.getId() != b.getId())
+			}
+			if (a.getId() != b.getId()) {
 				return false;
+			}
 			return true;
 		} catch (CoreException e) {
 			return false;
@@ -443,9 +457,8 @@
 		getWorkspace().addResourceChangeListener(listener);
 
 		// create markers on our hierarchy of resources
-		for (int i = 0; i < resources.length; i++) {
+		for (IResource resource : resources) {
 			listener.reset();
-			IResource resource = resources[i];
 			IMarker[] markers = new IMarker[3];
 			try {
 				markers[0] = resource.createMarker(IMarker.PROBLEM);
@@ -511,9 +524,7 @@
 		getWorkspace().addResourceChangeListener(listener);
 
 		// for each resource in the hierarchy do...
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
-
+		for (IResource resource : resources) {
 			// create the marker, assert that it exists, and then remove it
 			try {
 				listener.reset();
@@ -583,8 +594,9 @@
 		} catch (CoreException e) {
 			fail("1.0", e);
 		}
-		for (int i = 0; i < markers.length; i++)
+		for (int i = 0; i < markers.length; i++) {
 			assertTrue("1.1", !markers[i].exists());
+		}
 
 		// Check that an empty collection of markers can be removed.
 		try {
@@ -627,22 +639,25 @@
 
 		// add more markers and do a search on all marker types
 		Vector<IMarker> allMarkers = new Vector<>(markers.length * 3);
-		for (int i = 0; i < markers.length; i++)
-			allMarkers.add(markers[i]);
+		for (IMarker marker : markers) {
+			allMarkers.add(marker);
+		}
 		try {
 			markers = createMarkers(resources, IMarker.BOOKMARK);
 		} catch (CoreException e) {
 			fail("3.0", e);
 		}
-		for (int i = 0; i < markers.length; i++)
-			allMarkers.add(markers[i]);
+		for (IMarker marker : markers) {
+			allMarkers.add(marker);
+		}
 		try {
 			markers = createMarkers(resources, IMarker.TASK);
 		} catch (CoreException e) {
 			fail("3.1", e);
 		}
-		for (int i = 0; i < markers.length; i++)
-			allMarkers.add(markers[i]);
+		for (IMarker marker : markers) {
+			allMarkers.add(marker);
+		}
 		try {
 			IMarker[] found = getWorkspace().getRoot().findMarkers(null, false, IResource.DEPTH_INFINITE);
 			assertEquals("3.2", allMarkers.toArray(new IMarker[allMarkers.size()]), found);
@@ -856,8 +871,8 @@
 			IResource resource;
 			IMarker[] markers;
 			IMarker marker;
-			for (int i = 0; i < resources.length; i++) {
-				resource = resources[i];
+			for (IResource resource2 : resources) {
+				resource = resource2;
 				markers = new IMarker[3];
 
 				// ADD a marker
@@ -1057,8 +1072,9 @@
 			count[0] = 0;
 			IWorkspaceRunnable body = monitor -> {
 				IResourceVisitor visitor = resource -> {
-					if (resource.getType() == IResource.ROOT || resource.getType() == IResource.PROJECT)
+					if (resource.getType() == IResource.ROOT || resource.getType() == IResource.PROJECT) {
 						return true;
+					}
 					IMarker marker = resource.createMarker(IMarker.BOOKMARK);
 					table.put(resource, marker);
 					count[0]++;
@@ -1076,11 +1092,11 @@
 			// copy all non-project resources
 			try {
 				IProject[] projects = getWorkspace().getRoot().getProjects();
-				for (int i = 0; i < projects.length; i++) {
-					IResource[] children = projects[i].members();
-					for (int j = 0; j < children.length; j++) {
-						IPath destination = new Path(children[j].getName() + "copy");
-						children[j].copy(destination, true, getMonitor());
+				for (IProject project : projects) {
+					IResource[] children = project.members();
+					for (IResource element : children) {
+						IPath destination = new Path(element.getName() + "copy");
+						element.copy(destination, true, getMonitor());
 					}
 				}
 			} catch (CoreException e) {
@@ -1132,9 +1148,7 @@
 		getWorkspace().addResourceChangeListener(listener);
 
 		try {
-			for (int i = 0; i < resources.length; i++) {
-				final IResource resource = resources[i];
-
+			for (final IResource resource : resources) {
 				// ADD + REMOVE = nothing
 				try {
 					IWorkspaceRunnable body = monitor -> {
@@ -1397,8 +1411,9 @@
 			count[0] = 0;
 			IWorkspaceRunnable body = monitor -> {
 				IResourceVisitor visitor = resource -> {
-					if (resource.getType() == IResource.ROOT)
+					if (resource.getType() == IResource.ROOT) {
 						return true;
+					}
 					IMarker marker = resource.createMarker(IMarker.BOOKMARK);
 					table.put(resource, marker);
 					count[0]++;
@@ -1415,10 +1430,10 @@
 
 			// move all resources
 			IProject[] projects = getWorkspace().getRoot().getProjects();
-			for (int i = 0; i < projects.length; i++) {
-				IPath destination = new Path(projects[i].getName() + "move");
+			for (IProject project : projects) {
+				IPath destination = new Path(project.getName() + "move");
 				try {
-					projects[i].move(destination, true, getMonitor());
+					project.move(destination, true, getMonitor());
 				} catch (CoreException e) {
 					fail("1.99", e);
 				}
@@ -1426,8 +1441,9 @@
 
 			// verify marker deltas
 			IResourceVisitor visitor = resource -> {
-				if (resource.getType() == IResource.ROOT)
+				if (resource.getType() == IResource.ROOT) {
 					return true;
+				}
 				String name = resource.getFullPath().segment(0);
 				IPath path = new Path(name.substring(0, name.length() - 4)).makeAbsolute();
 				path = path.append(resource.getFullPath().removeFirstSegments(1));
@@ -1460,14 +1476,17 @@
 		try {
 			newMarkers = createMarkers(resources, IMarker.PROBLEM);
 			expected = new IMarker[newMarkers.length * 3];
-			for (int i = 0; i < newMarkers.length; i++)
+			for (int i = 0; i < newMarkers.length; i++) {
 				expected[i] = newMarkers[i];
+			}
 			newMarkers = createMarkers(resources, IMarker.BOOKMARK);
-			for (int i = 0; i < newMarkers.length; i++)
+			for (int i = 0; i < newMarkers.length; i++) {
 				expected[i + newMarkers.length] = newMarkers[i];
+			}
 			newMarkers = createMarkers(resources, IMarker.TASK);
-			for (int i = 0; i < newMarkers.length; i++)
+			for (int i = 0; i < newMarkers.length; i++) {
 				expected[i + (newMarkers.length * 2)] = newMarkers[i];
+			}
 		} catch (CoreException e) {
 			fail("1.0", e);
 		}
@@ -1489,8 +1508,9 @@
 		IResourceVisitor visitor = resource -> {
 			try {
 				ResourceInfo info = ((Resource) resource).getResourceInfo(false, false);
-				if (info == null)
+				if (info == null) {
 					return true;
+				}
 				IPathRequestor requestor = new IPathRequestor() {
 					@Override
 					public IPath requestPath() {
@@ -1617,8 +1637,9 @@
 		visitor = resource -> {
 			try {
 				ResourceInfo info = ((Resource) resource).getResourceInfo(false, false);
-				if (info == null)
+				if (info == null) {
 					return true;
+				}
 				IPathRequestor requestor = new IPathRequestor() {
 					@Override
 					public IPath requestPath() {
@@ -1747,8 +1768,7 @@
 	public void testSetGetAttribute() {
 		debug("testSetGetAttribute");
 
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
+		for (IResource resource : resources) {
 			IMarker marker = null;
 
 			// getting a non-existant attribute should return null
@@ -1881,8 +1901,7 @@
 	public void testSetGetAttribute2() {
 		debug("testSetGetAttribute2");
 
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
+		for (IResource resource : resources) {
 			IMarker marker = null;
 
 			// getting a non-existant attribute should return null or the specified default
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/MarkersChangeListener.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/MarkersChangeListener.java
index 53aac06..3a8c445 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/MarkersChangeListener.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/MarkersChangeListener.java
@@ -34,25 +34,30 @@
 	public boolean checkChanges(IResource resource, IMarker[] added, IMarker[] removed, IMarker[] changed) {
 		IPath path = resource == null ? Path.ROOT : resource.getFullPath();
 		Vector<IMarkerDelta> v = changes.get(path);
-		if (v == null)
+		if (v == null) {
 			v = new Vector<>();
+		}
 		int numChanges = (added == null ? 0 : added.length) + (removed == null ? 0 : removed.length) + (changed == null ? 0 : changed.length);
-		if (numChanges != v.size())
+		if (numChanges != v.size()) {
 			return false;
+		}
 		for (int i = 0; i < v.size(); ++i) {
 			IMarkerDelta delta = v.elementAt(i);
 			switch (delta.getKind()) {
 				case IResourceDelta.ADDED :
-					if (!contains(added, delta.getMarker()))
+					if (!contains(added, delta.getMarker())) {
 						return false;
+					}
 					break;
 				case IResourceDelta.REMOVED :
-					if (!contains(removed, delta.getMarker()))
+					if (!contains(removed, delta.getMarker())) {
 						return false;
+					}
 					break;
 				case IResourceDelta.CHANGED :
-					if (!contains(changed, delta.getMarker()))
+					if (!contains(changed, delta.getMarker())) {
 						return false;
+					}
 					break;
 				default :
 					throw new Error();
@@ -66,9 +71,10 @@
 	 */
 	protected boolean contains(IMarker[] markers, IMarker marker) {
 		if (markers != null) {
-			for (int i = 0; i < markers.length; ++i) {
-				if (markers[i].equals(marker))
+			for (IMarker marker2 : markers) {
+				if (marker2.equals(marker)) {
 					return true;
+				}
 			}
 		}
 		return false;
@@ -97,8 +103,9 @@
 	 * Recurse over the delta, extracting marker changes.
 	 */
 	protected void resourceChanged(IResourceDelta delta) {
-		if (delta == null)
+		if (delta == null) {
 			return;
+		}
 		if ((delta.getFlags() & IResourceDelta.MARKERS) != 0) {
 			IPath path = delta.getFullPath();
 			Vector<IMarkerDelta> v = changes.get(path);
@@ -107,13 +114,13 @@
 				changes.put(path, v);
 			}
 			IMarkerDelta[] markerDeltas = delta.getMarkerDeltas();
-			for (int i = 0; i < markerDeltas.length; ++i) {
-				v.addElement(markerDeltas[i]);
+			for (IMarkerDelta markerDelta : markerDeltas) {
+				v.addElement(markerDelta);
 			}
 		}
 		IResourceDelta[] children = delta.getAffectedChildren();
-		for (int i = 0; i < children.length; ++i) {
-			resourceChanged(children[i]);
+		for (IResourceDelta element : children) {
+			resourceChanged(element);
 		}
 	}
 }
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/NatureTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/NatureTest.java
index c7f12b6..faa135c 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/NatureTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/NatureTest.java
@@ -68,14 +68,17 @@
 			IProjectDescription desc = project.getDescription();
 			desc.setNatureIds(natures);
 			int flags = IResource.KEEP_HISTORY;
-			if (silent)
+			if (silent) {
 				flags |= IResource.AVOID_NATURE_CONFIG;
+			}
 			project.setDescription(desc, flags, getMonitor());
-			if (shouldFail)
+			if (shouldFail) {
 				fail(message);
+			}
 		} catch (CoreException e) {
-			if (!shouldFail)
+			if (!shouldFail) {
 				fail(message, e);
+			}
 		}
 	}
 
@@ -365,8 +368,9 @@
 			protected IStatus run(IProgressMonitor monitor) {
 				try {
 					if (finished[0] == false) {
-						if (project.exists() && project.isOpen())
+						if (project.exists() && project.isOpen()) {
 							project.isNatureEnabled(NATURE_SIMPLE);
+						}
 						schedule();
 					}
 				} catch (CoreException e) {
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/OldCorePerformanceTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/OldCorePerformanceTest.java
index 35e5919..999167f 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/OldCorePerformanceTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/OldCorePerformanceTest.java
@@ -66,10 +66,11 @@
 	 * Logs or writes string to console.
 	 */
 	public void perfLog(String s) {
-		if (logger != null)
+		if (logger != null) {
 			logger.log(s);
-		else
+		} else {
 			System.out.println(s);
+		}
 	}
 
 	/**
@@ -92,14 +93,16 @@
 	 */
 	public void run(PerformanceTestResult test) {
 		result = test;
-		if (test instanceof LoggingPerformanceTestResult)
+		if (test instanceof LoggingPerformanceTestResult) {
 			logger = (LoggingPerformanceTestResult) test;
+		}
 		super.run(test);
 	}
 
 	protected void startBench() {
-		for (int i = 0; i < 20; ++i)
+		for (int i = 0; i < 20; ++i) {
 			System.gc();
+		}
 		benchStart = System.currentTimeMillis();
 	}
 
@@ -116,11 +119,13 @@
 		long duration = System.currentTimeMillis() - benchStart;
 		double perOp = (double) duration / (double) numOperations;
 		String opString;
-		if (perOp > 100.0)
+		if (perOp > 100.0) {
 			opString = "(" + perOp + "ms per operation)"; //$NON-NLS-1$ //$NON-NLS-2$
-		else
+		}
+		else {
 			//Note us == microseconds
 			opString = "(" + (perOp * 1000.0) + "us per operation)"; //$NON-NLS-1$ //$NON-NLS-2$
+		}
 		System.out.println(benchName + " took " + duration + "ms " + opString); //$NON-NLS-1$ //$NON-NLS-2$
 	}
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ProjectSnapshotPerfManualTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ProjectSnapshotPerfManualTest.java
index 1cc1912..3a4cf0f 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ProjectSnapshotPerfManualTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ProjectSnapshotPerfManualTest.java
@@ -51,13 +51,15 @@
 
 	protected int countChildren(File root) {
 		String[] children = root.list();
-		if (children == null)
+		if (children == null) {
 			return 0;
+		}
 		int result = 0;
-		for (int i = 0; i < children.length; i++) {
-			File child = new File(root, children[i]);
-			if (child.isDirectory())
+		for (String element : children) {
+			File child = new File(root, element);
+			if (child.isDirectory()) {
 				result += countChildren(child);
+			}
 			result++;
 		}
 		return result;
@@ -77,8 +79,9 @@
 	 */
 	public void testSnapshotImportPerformance() throws Exception {
 		// test if the test can be done in this machine
-		if (!bigSiteLocation.toFile().isDirectory())
+		if (!bigSiteLocation.toFile().isDirectory()) {
 			return;
+		}
 
 		// create common objects
 		final IProject project = getWorkspace().getRoot().getProject("MyTestProject");
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ResourceAttributeTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ResourceAttributeTest.java
index 7bb30f8..d337fb2 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ResourceAttributeTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ResourceAttributeTest.java
@@ -67,8 +67,9 @@
 
 	public void testAttributeArchive() {
 		// only activate this test on platforms that support it
-		if (!isAttributeSupported(EFS.ATTRIBUTE_ARCHIVE))
+		if (!isAttributeSupported(EFS.ATTRIBUTE_ARCHIVE)) {
 			return;
+		}
 		IProject project = getWorkspace().getRoot().getProject("Project");
 		IFile file = project.getFile("target");
 		ensureExistsInWorkspace(file, getRandomContents());
@@ -101,8 +102,9 @@
 
 	public void testAttributeExecutable() {
 		// only activate this test on platforms that support it
-		if (!isAttributeSupported(EFS.ATTRIBUTE_EXECUTABLE))
+		if (!isAttributeSupported(EFS.ATTRIBUTE_EXECUTABLE)) {
 			return;
+		}
 		IProject project = getWorkspace().getRoot().getProject("Project");
 		IFile file = project.getFile("target");
 		ensureExistsInWorkspace(file, getRandomContents());
@@ -136,8 +138,9 @@
 
 	public void testAttributeHidden() {
 		// only activate this test on platforms that support it
-		if (!isAttributeSupported(EFS.ATTRIBUTE_HIDDEN))
+		if (!isAttributeSupported(EFS.ATTRIBUTE_HIDDEN)) {
 			return;
+		}
 		IProject project = getWorkspace().getRoot().getProject("Project");
 		IFile file = project.getFile("target");
 		ensureExistsInWorkspace(file, getRandomContents());
@@ -170,8 +173,9 @@
 
 	public void testAttributeReadOnly() {
 		// only activate this test on platforms that support it
-		if (!isAttributeSupported(EFS.ATTRIBUTE_READ_ONLY))
+		if (!isAttributeSupported(EFS.ATTRIBUTE_READ_ONLY)) {
 			return;
+		}
 		IProject project = getWorkspace().getRoot().getProject("Project");
 		IFile file = project.getFile("target");
 		ensureExistsInWorkspace(file, getRandomContents());
@@ -243,8 +247,9 @@
 	 */
 	public void _testRefreshExecutableOnFolder() {
 		// only test on platforms that implement the executable bit
-		if ((EFS.getLocalFileSystem().attributes() & EFS.ATTRIBUTE_EXECUTABLE) == 0)
+		if ((EFS.getLocalFileSystem().attributes() & EFS.ATTRIBUTE_EXECUTABLE) == 0) {
 			return;
+		}
 		IProject project = getWorkspace().getRoot().getProject("testRefreshExecutableOnFolder");
 		IFolder folder = project.getFolder("folder");
 		IFile file = folder.getFile("file");
@@ -281,8 +286,9 @@
 
 	public void testAttributeSymlink() {
 		// Only activate this test if testing of symbolic links is possible.
-		if (!canCreateSymLinks())
+		if (!canCreateSymLinks()) {
 			return;
+		}
 		IProject project = getWorkspace().getRoot().getProject("Project");
 		IFile link = project.getFile("link");
 		ensureExistsInWorkspace(link, getRandomContents());
@@ -351,8 +357,9 @@
 		try {
 			for (int attribute : attributes) {
 				// only activate this test on platforms that support it
-				if (!isAttributeSupported(attribute))
+				if (!isAttributeSupported(attribute)) {
 					continue;
+				}
 
 				// file
 				ResourceAttributes resAttr = file.getResourceAttributes();
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ResourceDeltaVerifier.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ResourceDeltaVerifier.java
index e840867..266e2f3 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ResourceDeltaVerifier.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ResourceDeltaVerifier.java
@@ -120,8 +120,9 @@
 	 * @see #addExpectedChange
 	 */
 	public void addExpectedChange(IResource[] resources, int status, int changeFlags) {
-		for (int i = 0; i < resources.length; i++)
-			addExpectedChange(resources[i], null, status, changeFlags, null, null);
+		for (IResource resource : resources) {
+			addExpectedChange(resource, null, status, changeFlags, null, null);
+		}
 	}
 
 	/**
@@ -132,8 +133,8 @@
 		if (resource instanceof IContainer) {
 			try {
 				IResource[] children = ((IContainer) resource).members(IContainer.INCLUDE_PHANTOMS | IContainer.INCLUDE_TEAM_PRIVATE_MEMBERS | IContainer.INCLUDE_HIDDEN);
-				for (int i = 0; i < children.length; i++) {
-					addExpectedDeletion(children[i]);
+				for (IResource element : children) {
+					addExpectedDeletion(element);
 				}
 			} catch (CoreException e) {
 				e.printStackTrace();
@@ -223,8 +224,9 @@
 		int status = delta.getKind();
 		int changeFlags = delta.getFlags();
 
-		if (status == IResourceDelta.NO_CHANGE)
+		if (status == IResourceDelta.NO_CHANGE) {
 			return;
+		}
 
 		if (expectedChange == null) {
 			recordMissingExpectedChange(status, changeFlags);
@@ -245,8 +247,7 @@
 
 		Hashtable<IResource, IResourceDelta> h = new Hashtable<>(affectedChildren.length + 1);
 
-		for (int i = 0; i < addedChildren.length; ++i) {
-			IResourceDelta childDelta1 = addedChildren[i];
+		for (IResourceDelta childDelta1 : addedChildren) {
 			IResource childResource = childDelta1.getResource();
 			IResourceDelta childDelta2 = h.get(childResource);
 			if (childDelta2 != null) {
@@ -259,8 +260,7 @@
 			}
 		}
 
-		for (int i = 0; i < changedChildren.length; ++i) {
-			IResourceDelta childDelta1 = changedChildren[i];
+		for (IResourceDelta childDelta1 : changedChildren) {
 			IResource childResource = childDelta1.getResource();
 			IResourceDelta childDelta2 = h.get(childResource);
 			if (childDelta2 != null) {
@@ -273,8 +273,7 @@
 			}
 		}
 
-		for (int i = 0; i < removedChildren.length; ++i) {
-			IResourceDelta childDelta1 = removedChildren[i];
+		for (IResourceDelta childDelta1 : removedChildren) {
 			IResource childResource = childDelta1.getResource();
 			IResourceDelta childDelta2 = h.get(childResource);
 			if (childDelta2 != null) {
@@ -287,8 +286,7 @@
 			}
 		}
 
-		for (int i = 0; i < affectedChildren.length; ++i) {
-			IResourceDelta childDelta1 = affectedChildren[i];
+		for (IResourceDelta childDelta1 : affectedChildren) {
 			IResource childResource = childDelta1.getResource();
 			IResourceDelta childDelta2 = h.remove(childResource);
 			if (childDelta2 == null) {
@@ -306,8 +304,8 @@
 			recordMissingChild(childResource.getFullPath(), childDelta.getKind(), true);
 		}
 
-		for (int i = 0; i < affectedChildren.length; ++i) {
-			internalVerifyDelta(affectedChildren[i]);
+		for (IResourceDelta element : affectedChildren) {
+			internalVerifyDelta(element);
 		}
 
 		for (IResourceDelta childDelta : h.values()) {
@@ -496,8 +494,9 @@
 	void internalVerifyDelta(IResourceDelta delta) {
 		try {
 			// FIXME: bogus
-			if (delta == null)
+			if (delta == null) {
 				return;
+			}
 			fMessage.append("Verifying delta for ");
 			fMessage.append(delta.getFullPath());
 			fMessage.append("\n");
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ResourceTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ResourceTest.java
index f704990..e8ce183 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ResourceTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ResourceTest.java
@@ -119,8 +119,9 @@
 				} catch (IOException e) {
 					fail("Failed to read during transferStreams", e);
 				}
-				if (bytesRead == -1)
+				if (bytesRead == -1) {
 					break;
+				}
 				try {
 					destination.write(buffer, 0, bytesRead);
 				} catch (IOException e) {
@@ -191,8 +192,9 @@
 	 * local store.
 	 */
 	public void assertDoesNotExistInFileSystem(String message, IResource[] resources) {
-		for (int i = 0; i < resources.length; i++)
-			assertDoesNotExistInFileSystem(message, resources[i]);
+		for (IResource resource : resources) {
+			assertDoesNotExistInFileSystem(message, resource);
+		}
 	}
 
 	/**
@@ -227,8 +229,8 @@
 	 * in the workspace resource info tree.
 	 */
 	public void assertDoesNotExistInWorkspace(String message, IResource[] resources) {
-		for (int i = 0; i < resources.length; i++) {
-			assertDoesNotExistInWorkspace(message, resources[i]);
+		for (IResource resource : resources) {
+			assertDoesNotExistInWorkspace(message, resource);
 		}
 	}
 
@@ -264,8 +266,9 @@
 	 * Assert that each element in the resource array  exists in the local store.
 	 */
 	public void assertExistsInFileSystem(String message, IResource[] resources) {
-		for (int i = 0; i < resources.length; i++)
-			assertExistsInFileSystem(message, resources[i]);
+		for (IResource resource : resources) {
+			assertExistsInFileSystem(message, resource);
+		}
 	}
 
 	/**
@@ -324,8 +327,9 @@
 	 * workspace resource info tree.
 	 */
 	public void assertExistsInWorkspace(String message, IResource[] resources) {
-		for (int i = 0; i < resources.length; i++)
-			assertExistsInWorkspace(message, resources[i], false);
+		for (IResource resource : resources) {
+			assertExistsInWorkspace(message, resource, false);
+		}
 	}
 
 	/**
@@ -333,8 +337,9 @@
 	 * workspace resource info tree.
 	 */
 	public void assertExistsInWorkspace(String message, IResource[] resources, boolean phantom) {
-		for (int i = 0; i < resources.length; i++)
-			assertExistsInWorkspace(message, resources[i], phantom);
+		for (IResource resource : resources) {
+			assertExistsInWorkspace(message, resource, phantom);
+		}
 	}
 
 	/**
@@ -361,10 +366,11 @@
 					result[i] = getWorkspace().getRoot().getProject(fullPath.segment(0));
 					break;
 				default :
-					if (hierarchy[i].charAt(hierarchy[i].length() - 1) == IPath.SEPARATOR)
+					if (hierarchy[i].charAt(hierarchy[i].length() - 1) == IPath.SEPARATOR) {
 						result[i] = root.getFolder(path);
-					else
+					} else {
 						result[i] = root.getFile(path);
+					}
 					break;
 			}
 		}
@@ -377,8 +383,9 @@
 		getWorkspace().run((IWorkspaceRunnable) monitor -> {
 			getWorkspace().getRoot().delete(IResource.FORCE | IResource.ALWAYS_DELETE_PROJECT_CONTENT, getMonitor());
 			//clear stores in workspace runnable to avoid interaction with resource jobs
-			for (int i = 0; i < toDelete.length; i++)
-				clear(toDelete[i]);
+			for (IFileStore element : toDelete) {
+				clear(element);
+			}
 		}, null);
 		getWorkspace().save(true, null);
 		//don't leak builder jobs, since they may affect subsequent tests
@@ -399,11 +406,13 @@
 	 */
 	public boolean compareContent(InputStream a, InputStream b) {
 		int c, d;
-		if (a == null && b == null)
+		if (a == null && b == null) {
 			return true;
+		}
 		try {
-			if (a == null || b == null)
+			if (a == null || b == null) {
 				return false;
+			}
 			while ((c = a.read()) == (d = b.read()) && (c != -1 && d != -1)) {
 				//body not needed
 			}
@@ -430,10 +439,12 @@
 	}
 
 	protected void create(final IResource resource, boolean local) throws CoreException {
-		if (resource == null || resource.exists())
+		if (resource == null || resource.exists()) {
 			return;
-		if (!resource.getParent().exists())
+		}
+		if (!resource.getParent().exists()) {
 			create(resource.getParent(), local);
+		}
 		switch (resource.getType()) {
 			case IResource.FILE :
 				((IFile) resource).create(local ? new ByteArrayInputStream(new byte[0]) : null, true, getMonitor());
@@ -516,16 +527,18 @@
 	 */
 	public void ensureDoesNotExistInFileSystem(IResource resource) {
 		IPath path = resource.getLocation();
-		if (path != null)
+		if (path != null) {
 			ensureDoesNotExistInFileSystem(path.toFile());
+		}
 	}
 
 	/**
 	 * Delete the resources in the array from the local store.
 	 */
 	public void ensureDoesNotExistInFileSystem(IResource[] resources) {
-		for (int i = 0; i < resources.length; i++)
-			ensureDoesNotExistInFileSystem(resources[i]);
+		for (IResource resource : resources) {
+			ensureDoesNotExistInFileSystem(resource);
+		}
 	}
 
 	/**
@@ -533,8 +546,9 @@
 	 */
 	public void ensureDoesNotExistInWorkspace(IResource resource) {
 		try {
-			if (resource.exists())
+			if (resource.exists()) {
 				resource.delete(true, null);
+			}
 		} catch (CoreException e) {
 			fail("#ensureDoesNotExistInWorkspace(IResource): " + resource.getFullPath(), e);
 		}
@@ -546,8 +560,9 @@
 	 */
 	public void ensureDoesNotExistInWorkspace(final IResource[] resources) {
 		IWorkspaceRunnable body = monitor -> {
-			for (int i = 0; i < resources.length; i++)
-				ensureDoesNotExistInWorkspace(resources[i]);
+			for (IResource resource : resources) {
+				ensureDoesNotExistInWorkspace(resource);
+			}
 		};
 		try {
 			getWorkspace().run(body, null);
@@ -569,9 +584,9 @@
 	 * manager to ensure that we have a correct Path -> File mapping.
 	 */
 	public void ensureExistsInFileSystem(IResource resource) {
-		if (resource instanceof IFile)
+		if (resource instanceof IFile) {
 			ensureExistsInFileSystem((IFile) resource);
-		else {
+		} else {
 			try {
 				((Resource) resource).getStore().mkdir(EFS.NONE, null);
 			} catch (CoreException e) {
@@ -584,16 +599,18 @@
 	 * Create the each resource of the array in the local store.
 	 */
 	public void ensureExistsInFileSystem(IResource[] resources) {
-		for (int i = 0; i < resources.length; i++)
-			ensureExistsInFileSystem(resources[i]);
+		for (IResource resource : resources) {
+			ensureExistsInFileSystem(resource);
+		}
 	}
 
 	/**
 	 * Create the given file in the workspace resource info tree.
 	 */
 	public void ensureExistsInWorkspace(final IFile resource, final InputStream contents) {
-		if (resource == null)
+		if (resource == null) {
 			return;
+		}
 		IWorkspaceRunnable body = monitor -> {
 			if (resource.exists()) {
 				resource.setContents(contents, true, false, null);
@@ -634,8 +651,9 @@
 	 */
 	public void ensureExistsInWorkspace(final IResource[] resources, final boolean local) {
 		IWorkspaceRunnable body = monitor -> {
-			for (int i = 0; i < resources.length; i++)
-				create(resources[i], local);
+			for (IResource resource : resources) {
+				create(resource, local);
+			}
 		};
 		try {
 			getWorkspace().run(body, null);
@@ -661,8 +679,9 @@
 	public void touchInFilesystem(IResource resource) {
 		// Ensure the resource exists in the filesystem
 		IPath location = resource.getLocation();
-		if (!location.toFile().exists())
+		if (!location.toFile().exists()) {
 			ensureExistsInFileSystem(resource);
+		}
 		// Manually check that the core.resource time-stamp is out-of-sync
 		// with the java.io.File last modified. #isSynchronized() will schedule
 		// out-of-sync resources for refresh, so we don't use that here.
@@ -689,8 +708,9 @@
 
 	private boolean existsInFileSystem(IResource resource) {
 		IPath path = resource.getLocation();
-		if (path == null)
+		if (path == null) {
 			path = computeDefaultLocation(resource);
+		}
 		return path.toFile().exists();
 	}
 
@@ -732,13 +752,18 @@
 			try {
 				input = file.getContents();
 				int c = input.read();
-				while (c != -1 && c != '\r' && c != '\n')
+				while (c != -1 && c != '\r' && c != '\n') {
 					c = input.read();
+				}
 				if (c == '\n')
+				 {
 					return "\n"; //$NON-NLS-1$
+				}
 				if (c == '\r') {
 					if (input.read() == '\n')
+					 {
 						return "\r\n"; //$NON-NLS-1$
+					}
 					return "\r"; //$NON-NLS-1$
 				}
 			} catch (CoreException e) {
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ResourceURLTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ResourceURLTest.java
index eba1e43..4db01fa 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ResourceURLTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ResourceURLTest.java
@@ -100,8 +100,8 @@
 	public void testBasicURLs() throws Throwable {
 		IResource[] resources = buildResources();
 		ensureExistsInWorkspace(resources, true);
-		for (int i = 0; i < resources.length; i++) {
-			checkURL(resources[i]);
+		for (IResource resource : resources) {
+			checkURL(resource);
 		}
 	}
 
@@ -113,8 +113,8 @@
 		project.open(null);
 		IResource[] resources = buildResources(project, defineHierarchy());
 		ensureExistsInWorkspace(resources, true);
-		for (int i = 0; i < resources.length; i++) {
-			checkURL(resources[i]);
+		for (IResource resource : resources) {
+			checkURL(resource);
 		}
 	}
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ResourceVisitorVerifier.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ResourceVisitorVerifier.java
index 4bace86..3839993 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ResourceVisitorVerifier.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/ResourceVisitorVerifier.java
@@ -33,8 +33,9 @@
 	}
 
 	public void addExpected(IResource[] resources) {
-		for (int i = 0; i < resources.length; i++)
-			expected.add(resources[i]);
+		for (IResource resource : resources) {
+			expected.add(resource);
+		}
 	}
 
 	@Override
@@ -52,8 +53,9 @@
 	}
 
 	private void verify() {
-		if (verified)
+		if (verified) {
 			return;
+		}
 		// Add messages for the resources which weren't visited but were expected.
 		for (IResource resource : expected) {
 			success = false;
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/TeamPrivateMemberTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/TeamPrivateMemberTest.java
index 9d23df3..2271969 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/TeamPrivateMemberTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/TeamPrivateMemberTest.java
@@ -734,10 +734,10 @@
 		IResource[] resources = new IResource[] {project, folder, file, subFile};
 
 		// Trying to set the value on non-existing resources will fail
-		for (int i = 0; i < resources.length; i++) {
+		for (IResource resource : resources) {
 			try {
-				resources[i].setTeamPrivateMember(true);
-				fail("0.0." + resources[i].getFullPath());
+				resource.setTeamPrivateMember(true);
+				fail("0.0." + resource.getFullPath());
 			} catch (CoreException e) {
 				// expected
 			}
@@ -747,14 +747,13 @@
 		ensureExistsInWorkspace(resources, true);
 
 		// Initial values should be false.
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
+		for (IResource resource2 : resources) {
+			IResource resource = resource2;
 			assertTrue("1.0: " + resource.getFullPath(), !resource.isTeamPrivateMember());
 		}
 
 		// Now set the values.
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
+		for (IResource resource : resources) {
 			try {
 				resource.setTeamPrivateMember(true);
 			} catch (CoreException e) {
@@ -763,8 +762,8 @@
 		}
 
 		// The values should be true for files and folders, false otherwise.
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
+		for (IResource resource2 : resources) {
+			IResource resource = resource2;
 			switch (resource.getType()) {
 				case IResource.FILE :
 				case IResource.FOLDER :
@@ -778,8 +777,7 @@
 		}
 
 		// Clear the values.
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
+		for (IResource resource : resources) {
 			try {
 				resource.setTeamPrivateMember(false);
 			} catch (CoreException e) {
@@ -788,8 +786,8 @@
 		}
 
 		// Values should be false again.
-		for (int i = 0; i < resources.length; i++) {
-			IResource resource = resources[i];
+		for (IResource resource2 : resources) {
+			IResource resource = resource2;
 			assertTrue("5.0: " + resource.getFullPath(), !resource.isTeamPrivateMember());
 		}
 	}
@@ -799,8 +797,9 @@
 			@Override
 			public boolean visit(IResource resource) {
 				boolean expected = false;
-				if (resource.getType() == IResource.FILE || resource.getType() == IResource.FOLDER)
+				if (resource.getType() == IResource.FILE || resource.getType() == IResource.FOLDER) {
 					expected = value;
+				}
 				assertEquals(message + resource.getFullPath(), expected, resource.isTeamPrivateMember());
 				return true;
 			}
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/TestPerformer.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/TestPerformer.java
index 3fd0f65..cc42953 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/TestPerformer.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/TestPerformer.java
@@ -45,10 +45,10 @@
 	final public void performTest(Object[][] inputs) {
 		// call helper method
 		int permutations = 1;
-		for (int i = 0; i < inputs.length; i++) {
-			permutations = permutations * inputs[i].length;
-			if (inputs[i].length > 2) {
-				scramble(inputs[i]);
+		for (Object[] input : inputs) {
+			permutations = permutations * input.length;
+			if (input.length > 2) {
+				scramble(input);
 			}
 		}
 		//	System.out.println("\nTesting " + permutations + " permutations of " + name);
@@ -71,8 +71,8 @@
 						invokeMethod(args, count);
 						StringBuffer buffer = new StringBuffer();
 						buffer.append("invocation " + count + " should fail, but it doesn't [");
-						for (int j = 0; j < args.length; j++) {
-							buffer.append(args[j]);
+						for (Object arg : args) {
+							buffer.append(arg);
 							buffer.append(',');
 						}
 						buffer.deleteCharAt(buffer.length() - 1);
@@ -123,13 +123,15 @@
 		for (int i = 0; i < len * 100; i++) {
 			/* get any array offset */
 			int off1 = (int) (random.nextFloat() * len);
-			if (off1 == len)
+			if (off1 == len) {
 				continue;
+			}
 
 			/* get another array offset */
 			int off2 = (int) (random.nextFloat() * len);
-			if (off2 == len)
+			if (off2 == len) {
 				continue;
+			}
 
 			/* switch */
 			Object temp = first[off1];
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/WorkspaceTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/WorkspaceTest.java
index e7881be..0cc07f8 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/WorkspaceTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/WorkspaceTest.java
@@ -254,13 +254,14 @@
 		final IProject project = getWorkspace().getRoot().getProject("bar");
 		final IResource[] resources = buildResources(project, new String[] {"a/", "a/b"});
 		IWorkspaceRunnable body = monitor -> {
-			if (!project.exists())
+			if (!project.exists()) {
 				project.create(null);
-			if (!project.isOpen())
+			}
+			if (!project.isOpen()) {
 				project.open(null);
+			}
 			// define an operation which will create a bunch of resources including a project.
-			for (int i = 0; i < resources.length; i++) {
-				IResource resource = resources[i];
+			for (IResource resource : resources) {
 				switch (resource.getType()) {
 					case IResource.FILE :
 						((IFile) resource).create(null, false, getMonitor());
@@ -328,8 +329,9 @@
 
 	public void testWorkingLocationDeletion_bug433061() throws Throwable {
 		// Only activate this test if testing of symbolic links is possible.
-		if (!canCreateSymLinks())
+		if (!canCreateSymLinks()) {
 			return;
+		}
 		IProject project = getTestProject();
 		project.create(null, getMonitor());
 		IPath workingLocation = project.getWorkingLocation("org.eclipse.core.tests.resources");
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/IContentTypeManagerTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/IContentTypeManagerTest.java
index a162f2c..1467d3f 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/IContentTypeManagerTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/IContentTypeManagerTest.java
@@ -104,9 +104,11 @@
 	}
 
 	boolean contains(Object[] array, Object element) {
-		for (int i = 0; i < array.length; i++)
-			if (array[i].equals(element))
+		for (Object element2 : array) {
+			if (element2.equals(element)) {
 				return true;
+			}
+		}
 		return false;
 	}
 
@@ -117,14 +119,17 @@
 	public InputStream getInputStream(byte[][] contents) {
 		int size = 0;
 		// computes final array size
-		for (int i = 0; i < contents.length; i++)
-			size += contents[i].length;
+		for (byte[] content : contents) {
+			size += content.length;
+		}
 		byte[] full = new byte[size];
 		int fullIndex = 0;
 		// concatenates all byte arrays
-		for (int i = 0; i < contents.length; i++)
-			for (int j = 0; j < contents[i].length; j++)
-				full[fullIndex++] = contents[i][j];
+		for (byte[] content : contents) {
+			for (int j = 0; j < content.length; j++) {
+				full[fullIndex++] = content[j];
+			}
+		}
 		return new ByteArrayInputStream(full);
 	}
 
@@ -1057,8 +1062,9 @@
 		assertNotNull("1.0", description);
 		assertEquals("1.1", myContent, description.getContentType());
 		assertNotSame("1.2", myContent.getDefaultDescription(), description);
-		for (int i = 0; i < MyContentDescriber.MY_OPTIONS.length; i++)
+		for (int i = 0; i < MyContentDescriber.MY_OPTIONS.length; i++) {
 			assertEquals("2." + i, MyContentDescriber.MY_OPTION_VALUES[i], description.getProperty(MyContentDescriber.MY_OPTIONS[i]));
+		}
 	}
 
 	public void testNoExtensionAssociation() {
@@ -1368,8 +1374,9 @@
 		int bufferLimit = ContentTypeManager.BLOCK_SIZE * 4;
 		// create a long XML comment as prefix
 		StringBuffer comment = new StringBuffer("<!--");
-		for (int i = 0; i < bufferLimit; i++)
+		for (int i = 0; i < bufferLimit; i++) {
 			comment.append('*');
+		}
 		comment.append("-->");
 		IContentTypeManager manager = Platform.getContentTypeManager();
 		IContentType rootElement = manager.getContentType(PI_RESOURCES_TESTS + ".root-element");
@@ -1404,8 +1411,9 @@
 			try {
 				text.removeFileSpec("mytext", IContentType.FILE_EXTENSION_SPEC);
 			} catch (CoreException e) {
-				if (!assertionFailed)
+				if (!assertionFailed) {
 					fail(" 2.0", e);
+				}
 			}
 		}
 		IContentType result = manager.findContentTypeFor("test.mytext");
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/LazyInputStreamTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/LazyInputStreamTest.java
index fd589f4..83a4e74 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/LazyInputStreamTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/LazyInputStreamTest.java
@@ -142,12 +142,14 @@
 
 	public void testVariedContent() throws IOException {
 		byte[] contents = new byte[VARIOUS_INTS.length];
-		for (int i = 0; i < contents.length; i++)
+		for (int i = 0; i < contents.length; i++) {
 			contents[i] = (byte) VARIOUS_INTS[i];
+		}
 		ByteArrayInputStream underlying = new ByteArrayInputStream(contents);
 		OpenLazyInputStream stream = new OpenLazyInputStream(underlying, 7);
-		for (int i = 0; i < VARIOUS_INTS.length; i++)
+		for (int i = 0; i < VARIOUS_INTS.length; i++) {
 			assertEquals("1.0." + i, VARIOUS_INTS[i], stream.read());
+		}
 		stream.close();
 	}
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/LocalSelectionPolicy.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/LocalSelectionPolicy.java
index 86e46fb..7e0575c 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/LocalSelectionPolicy.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/LocalSelectionPolicy.java
@@ -24,18 +24,20 @@
 	@Override
 	public IContentType[] select(IContentType[] candidates, boolean fileName, boolean content) {
 		List<IContentType> result = new ArrayList<>(candidates.length);
-		for (int i = 0; i < candidates.length; i++) {
-			String namespace = getNamespace(candidates[i].getId());
-			if (namespace.equals(ContentTypeTest.PI_RESOURCES_TESTS) || namespace.equals(Platform.PI_RUNTIME))
-				result.add(candidates[i]);
+		for (IContentType candidate : candidates) {
+			String namespace = getNamespace(candidate.getId());
+			if (namespace.equals(ContentTypeTest.PI_RESOURCES_TESTS) || namespace.equals(Platform.PI_RUNTIME)) {
+				result.add(candidate);
+			}
 		}
 		return result.toArray(new IContentType[result.size()]);
 	}
 
 	private static String getNamespace(String id) {
 		int lastDot = id.lastIndexOf('.');
-		if (lastDot <= 1)
+		if (lastDot <= 1) {
 			throw new IllegalArgumentException("lastDot ==" + lastDot);
+		}
 		return id.substring(0, lastDot);
 	}
 }
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/MyContentDescriber.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/MyContentDescriber.java
index 52c9716..0b0e17f 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/MyContentDescriber.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/MyContentDescriber.java
@@ -30,15 +30,20 @@
 	public int describe(InputStream contents, IContentDescription description) throws IOException {
 		byte[] signature = SIGNATURE.getBytes("US-ASCII");
 		byte[] buffer = new byte[signature.length];
-		if (contents.read(buffer) != buffer.length)
+		if (contents.read(buffer) != buffer.length) {
 			return INVALID;
-		for (int i = 0; i < signature.length; i++)
-			if (signature[i] != buffer[i])
+		}
+		for (int i = 0; i < signature.length; i++) {
+			if (signature[i] != buffer[i]) {
 				return INVALID;
-		if (description == null)
+			}
+		}
+		if (description == null) {
 			return VALID;
-		for (int i = 0; i < MY_OPTIONS.length; i++)
+		}
+		for (int i = 0; i < MY_OPTIONS.length; i++) {
 			setIfRequested(description, i);
+		}
 		return VALID;
 	}
 
@@ -48,7 +53,8 @@
 	}
 
 	private void setIfRequested(IContentDescription description, int option) {
-		if (description.isRequested(MY_OPTIONS[option]))
+		if (description.isRequested(MY_OPTIONS[option])) {
 			description.setProperty(MY_OPTIONS[option], MY_OPTION_VALUES[option]);
+		}
 	}
 }
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/SubsetSelectionPolicy.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/SubsetSelectionPolicy.java
index 67cfc9c..2a3f84c 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/SubsetSelectionPolicy.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/SubsetSelectionPolicy.java
@@ -24,9 +24,11 @@
 	@Override
 	public IContentType[] select(IContentType[] candidates, boolean fileName, boolean content) {
 		List<IContentType> result = new ArrayList<>(candidates.length);
-		for (int i = 0; i < candidates.length; i++)
-			if (subset.contains(candidates[i]))
-				result.add(candidates[i]);
+		for (IContentType candidate : candidates) {
+			if (subset.contains(candidate)) {
+				result.add(candidate);
+			}
+		}
 		return result.toArray(new IContentType[result.size()]);
 	}
 }
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/XMLContentDescriberTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/XMLContentDescriberTest.java
index 81700d4..7aece1e 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/XMLContentDescriberTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/content/XMLContentDescriberTest.java
@@ -58,25 +58,25 @@
 		boolean[][] flags = { {true, true, false}, {true, false, false}, {false, true, false}, {false, false, false}, {true, true, true}, {true, false, true}, {false, true, true}, {false, false, true}};
 
 		IContentDescription description = null;
-		for (int i = 0; i < flags.length; i++) {
-			description = Platform.getContentTypeManager().getDescriptionFor(getInputStream(ENCODING_INCORRECT, ENCODING_UTF8, flags[i][0], flags[i][1], flags[i][2]), "fake.xml", new QualifiedName[] {IContentDescription.CHARSET});
+		for (boolean[] flag : flags) {
+			description = Platform.getContentTypeManager().getDescriptionFor(getInputStream(ENCODING_INCORRECT, ENCODING_UTF8, flag[0], flag[1], flag[2]), "fake.xml", new QualifiedName[] {IContentDescription.CHARSET});
 			assertNull("1.0", description);
 
-			description = Platform.getContentTypeManager().getDescriptionFor(getInputStream(ENCODING_INCORRECT, ENCODING_UTF16, flags[i][0], flags[i][1], flags[i][2]), "fake.xml", new QualifiedName[] {IContentDescription.CHARSET});
+			description = Platform.getContentTypeManager().getDescriptionFor(getInputStream(ENCODING_INCORRECT, ENCODING_UTF16, flag[0], flag[1], flag[2]), "fake.xml", new QualifiedName[] {IContentDescription.CHARSET});
 			assertNull("2.0", description);
 
-			description = Platform.getContentTypeManager().getDescriptionFor(getReader(ENCODING_INCORRECT, flags[i][0], flags[i][1], flags[i][2]), "fake.xml", new QualifiedName[] {IContentDescription.CHARSET});
+			description = Platform.getContentTypeManager().getDescriptionFor(getReader(ENCODING_INCORRECT, flag[0], flag[1], flag[2]), "fake.xml", new QualifiedName[] {IContentDescription.CHARSET});
 			assertNull("3.0", description);
 		}
 
-		for (int i = 0; i < flags.length; i++) {
-			description = Platform.getContentTypeManager().getDescriptionFor(getInputStream(ENCODING_EMPTY, ENCODING_UTF8, flags[i][0], flags[i][1], flags[i][2]), "fake.xml", new QualifiedName[] {IContentDescription.CHARSET});
+		for (boolean[] flag : flags) {
+			description = Platform.getContentTypeManager().getDescriptionFor(getInputStream(ENCODING_EMPTY, ENCODING_UTF8, flag[0], flag[1], flag[2]), "fake.xml", new QualifiedName[] {IContentDescription.CHARSET});
 			assertNull("1.0", description);
 
-			description = Platform.getContentTypeManager().getDescriptionFor(getInputStream(ENCODING_EMPTY, ENCODING_UTF16, flags[i][0], flags[i][1], flags[i][2]), "fake.xml", new QualifiedName[] {IContentDescription.CHARSET});
+			description = Platform.getContentTypeManager().getDescriptionFor(getInputStream(ENCODING_EMPTY, ENCODING_UTF16, flag[0], flag[1], flag[2]), "fake.xml", new QualifiedName[] {IContentDescription.CHARSET});
 			assertNull("2.0", description);
 
-			description = Platform.getContentTypeManager().getDescriptionFor(getReader(ENCODING_EMPTY, flags[i][0], flags[i][1], flags[i][2]), "fake.xml", new QualifiedName[] {IContentDescription.CHARSET});
+			description = Platform.getContentTypeManager().getDescriptionFor(getReader(ENCODING_EMPTY, flag[0], flag[1], flag[2]), "fake.xml", new QualifiedName[] {IContentDescription.CHARSET});
 			assertNull("3.0", description);
 		}
 	}
@@ -93,11 +93,11 @@
 		boolean[][] flags = { {true, true, false}, {true, false, false}, {false, true, false}, {false, false, false}, {true, true, true}, {true, false, true}, {false, true, true}, {false, false, true}};
 
 		IContentDescription description = null;
-		for (int i = 0; i < flags.length; i++) {
-			description = Platform.getContentTypeManager().getDescriptionFor(getInputStream(encodingInContent, encoding, flags[i][0], flags[i][1], flags[i][2]), "fake.xml", new QualifiedName[] {IContentDescription.CHARSET});
-			assertNotNull("1.0: " + flags[i][0] + " " + flags[i][1] + " " + flags[i][2], description);
-			assertEquals("1.1: " + flags[i][0] + " " + flags[i][1] + " " + flags[i][2], Platform.PI_RUNTIME + ".xml", description.getContentType().getId());
-			assertEquals("1.2: " + flags[i][0] + " " + flags[i][1] + " " + flags[i][2], expectedEncoding, description.getProperty(IContentDescription.CHARSET));
+		for (boolean[] flag : flags) {
+			description = Platform.getContentTypeManager().getDescriptionFor(getInputStream(encodingInContent, encoding, flag[0], flag[1], flag[2]), "fake.xml", new QualifiedName[] {IContentDescription.CHARSET});
+			assertNotNull("1.0: " + flag[0] + " " + flag[1] + " " + flag[2], description);
+			assertEquals("1.1: " + flag[0] + " " + flag[1] + " " + flag[2], Platform.PI_RUNTIME + ".xml", description.getContentType().getId());
+			assertEquals("1.2: " + flag[0] + " " + flag[1] + " " + flag[2], expectedEncoding, description.getProperty(IContentDescription.CHARSET));
 		}
 	}
 
@@ -105,11 +105,11 @@
 		boolean[][] flags = { {true, true, false}, {true, false, false}, {false, true, false}, {false, false, false}, {true, true, true}, {true, false, true}, {false, true, true}, {false, false, true}};
 
 		IContentDescription description = null;
-		for (int i = 0; i < flags.length; i++) {
-			description = Platform.getContentTypeManager().getDescriptionFor(getReader(encodingInContent, flags[i][0], flags[i][1], flags[i][2]), "fake.xml", new QualifiedName[] {IContentDescription.CHARSET});
-			assertNotNull("1.0: " + flags[i][0] + " " + flags[i][1] + " " + flags[i][2], description);
-			assertEquals("1.1: " + flags[i], Platform.PI_RUNTIME + ".xml", description.getContentType().getId());
-			assertEquals("1.2: " + flags[i], expectedEncoding, description.getProperty(IContentDescription.CHARSET));
+		for (boolean[] flag : flags) {
+			description = Platform.getContentTypeManager().getDescriptionFor(getReader(encodingInContent, flag[0], flag[1], flag[2]), "fake.xml", new QualifiedName[] {IContentDescription.CHARSET});
+			assertNotNull("1.0: " + flag[0] + " " + flag[1] + " " + flag[2], description);
+			assertEquals("1.1: " + flag, Platform.PI_RUNTIME + ".xml", description.getContentType().getId());
+			assertEquals("1.2: " + flag, expectedEncoding, description.getProperty(IContentDescription.CHARSET));
 		}
 	}
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/BenchMiscWorkspace.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/BenchMiscWorkspace.java
index 4acae91..5837b10 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/BenchMiscWorkspace.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/BenchMiscWorkspace.java
@@ -68,8 +68,9 @@
 			@Override
 			protected void test() {
 				IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
-				for (int i = 0; i < 2000; i++)
+				for (int i = 0; i < 2000; i++) {
 					root.getProject(Integer.toString(i));
+				}
 			}
 		}.run(this, 10, 1000);
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/BenchWorkspace.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/BenchWorkspace.java
index dd4c2ec..de9ca09 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/BenchWorkspace.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/BenchWorkspace.java
@@ -99,8 +99,9 @@
 				IMarker[] markers = resource.findMarkers(IMarker.PROBLEM, true, IResource.DEPTH_ZERO);
 				for (IMarker marker : markers) {
 					int severity = marker.getAttribute(IMarker.SEVERITY, -1);
-					if (severity > maxSeverity)
+					if (severity > maxSeverity) {
 						maxSeverity = severity;
+					}
 				}
 				return true;
 			}
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/ContentDescriptionPerformanceTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/ContentDescriptionPerformanceTest.java
index 4a337f4..ab91f3b 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/ContentDescriptionPerformanceTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/ContentDescriptionPerformanceTest.java
@@ -50,12 +50,13 @@
 	}
 
 	void assertHasExpectedDescription(String fileName, IContentDescription description) {
-		if (fileName.endsWith(DEFAULT_DESCRIPTION_FILE_NAME))
+		if (fileName.endsWith(DEFAULT_DESCRIPTION_FILE_NAME)) {
 			assertTrue("description for " + fileName, description == description.getContentType().getDefaultDescription());
-		else if (fileName.endsWith(NON_DEFAULT_DESCRIPTION_FILE_NAME))
+		} else if (fileName.endsWith(NON_DEFAULT_DESCRIPTION_FILE_NAME)) {
 			assertTrue("description for " + fileName, description != description.getContentType().getDefaultDescription());
-		else
+		} else {
 			assertNull("description for " + fileName, description);
+		}
 	}
 
 	void createFiles() throws CoreException {
@@ -81,8 +82,9 @@
 			protected void test() {
 				try {
 					project.accept(resource -> {
-						if (resource.getType() == IResource.FILE && !resource.getName().equals(".project"))
+						if (resource.getType() == IResource.FILE && !resource.getName().equals(".project")) {
 							assertHasExpectedDescription(resource.getName(), ((IFile) resource).getContentDescription());
+						}
 						return true;
 					});
 				} catch (CoreException e) {
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/LocalHistoryPerformanceTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/LocalHistoryPerformanceTest.java
index 2d88494..01978da 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/LocalHistoryPerformanceTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/LocalHistoryPerformanceTest.java
@@ -60,17 +60,19 @@
 		try {
 			workspace.run((IWorkspaceRunnable) monitor -> {
 				ensureExistsInWorkspace(folders, true);
-				for (IFolder folder : folders)
+				for (IFolder folder : folders) {
 					for (int j = 0; j < filesPerFolder; j++) {
 						IFile file = folder.getFile("file" + j);
 						ensureExistsInWorkspace(file, getRandomContents());
 						try {
-							for (int k = 0; k < statesPerFile; k++)
+							for (int k = 0; k < statesPerFile; k++) {
 								file.setContents(getRandomContents(), IResource.KEEP_HISTORY, getMonitor());
+							}
 						} catch (CoreException ce) {
 							fail("0.5", ce);
 						}
 					}
+				}
 			}, workspace.getRuleFactory().modifyRule(workspace.getRoot()), IWorkspace.AVOID_UPDATE, getMonitor());
 		} catch (CoreException e) {
 			fail("#createTree at : " + base.getFullPath(), e);
@@ -201,8 +203,9 @@
 
 			@Override
 			protected void tearDown() throws CoreException {
-				if (original != null)
+				if (original != null) {
 					getWorkspace().setDescription(original);
+				}
 			}
 
 			@Override
@@ -297,8 +300,9 @@
 		final IFile file = project.getFile("file.txt");
 		ensureExistsInWorkspace(file, getRandomContents());
 		try {
-			for (int i = 0; i < 100; i++)
+			for (int i = 0; i < 100; i++) {
 				file.setContents(getRandomContents(), IResource.KEEP_HISTORY, getMonitor());
+			}
 		} catch (CoreException ce) {
 			fail("0.5", ce);
 		}
@@ -333,8 +337,9 @@
 
 			@Override
 			protected void tearDown() throws CoreException {
-				if (original != null)
+				if (original != null) {
 					getWorkspace().setDescription(original);
+				}
 			}
 
 			@Override
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/PropertyManagerPerformanceTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/PropertyManagerPerformanceTest.java
index 474fbe1..a76ec56 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/PropertyManagerPerformanceTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/PropertyManagerPerformanceTest.java
@@ -11,7 +11,8 @@
  *******************************************************************************/
 package org.eclipse.core.tests.resources.perf;
 
-import java.util.*;
+import java.util.ArrayList;
+import java.util.List;
 import junit.framework.Test;
 import junit.framework.TestSuite;
 import org.eclipse.core.internal.resources.Workspace;
@@ -25,8 +26,9 @@
 
 	public static String getPropertyValue(int size) {
 		StringBuffer value = new StringBuffer(size);
-		for (int i = 0; i < size; i++)
+		for (int i = 0; i < size; i++) {
 			value.append((char) (Math.random() * Character.MAX_VALUE));
+		}
 		return value.toString();
 	}
 
@@ -52,8 +54,9 @@
 		folders[3] = folders[2].getFolder("folder4");
 		folders[4] = folders[3].getFolder("folder5");
 		List<IResource> resources = new ArrayList<>(filesPerFolder * folders.length);
-		for (IFolder folder : folders)
+		for (IFolder folder : folders) {
 			resources.add(folder);
+		}
 		ensureExistsInWorkspace(folders, true);
 		for (IFolder folder : folders) {
 			for (int j = 0; j < filesPerFolder; j++) {
@@ -70,18 +73,19 @@
 		final IFolder folder1 = proj1.getFolder("folder1");
 		final List<IResource> allResources = createTree(folder1, filesPerFolder);
 		for (IResource resource : allResources) {
-			for (int j = 0; j < properties; j++)
+			for (int j = 0; j < properties; j++) {
 				try {
 					resource.setPersistentProperty(new QualifiedName(PI_RESOURCES_TESTS, "prop" + j), getPropertyValue(200));
 				} catch (CoreException ce) {
 					fail("0.2", ce);
 				}
+			}
 		}
 
 		new PerformanceTestRunner() {
 			@Override
 			protected void test() {
-				for (int j = 0; j < properties; j++)
+				for (int j = 0; j < properties; j++) {
 					for (IResource resource : allResources) {
 						try {
 							assertNotNull(resource.getPersistentProperty(new QualifiedName(PI_RESOURCES_TESTS, "prop" + j)));
@@ -89,6 +93,7 @@
 							fail("0.2", ce);
 						}
 					}
+				}
 			}
 		}.run(this, measurements, repetitions);
 		try {
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/WorkspacePerformanceTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/WorkspacePerformanceTest.java
index 3d1b5f0..285195a 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/WorkspacePerformanceTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/perf/WorkspacePerformanceTest.java
@@ -133,8 +133,9 @@
 			IFile file = parentFolder.getFile(createString(10));
 			file.create(new ByteArrayInputStream(createBytes(5000)), IResource.NONE, getMonitor());
 		}
-		if (depth <= 0)
+		if (depth <= 0) {
 			return;
+		}
 		//create TREE_WIDTH folders
 		for (int i = 0; i < TREE_WIDTH; i++) {
 			IFolder folder = parentFolder.getFolder(createString(6));
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/refresh/RefreshProviderTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/refresh/RefreshProviderTest.java
index e0e8364..c5733c6 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/refresh/RefreshProviderTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/refresh/RefreshProviderTest.java
@@ -89,8 +89,9 @@
 			assertEquals("1.3", 0, provider.getMonitoredResources().length);
 			//check provider for other errors
 			AssertionFailedError[] failures = provider.getFailures();
-			if (failures.length > 0)
+			if (failures.length > 0) {
 				fail("" + failures.length + " failures", failures[0]);
+			}
 		} catch (CoreException e) {
 			fail("1.99", e);
 		} finally {
@@ -124,8 +125,9 @@
 			assertEquals("1.3", 0, provider.getMonitoredResources().length);
 			//check provider for other errors
 			AssertionFailedError[] failures = provider.getFailures();
-			if (failures.length > 0)
+			if (failures.length > 0) {
 				fail("" + failures.length + " failures", failures[0]);
+			}
 		} catch (CoreException e) {
 			fail("1.99", e);
 		} finally {
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/refresh/TestRefreshProvider.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/refresh/TestRefreshProvider.java
index b2d3237..eb4d762 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/refresh/TestRefreshProvider.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/refresh/TestRefreshProvider.java
@@ -62,8 +62,9 @@
 	 */
 	@Override
 	public IRefreshMonitor installMonitor(IResource resource, IRefreshResult result) {
-		if (!monitoredResources.add(resource))
+		if (!monitoredResources.add(resource)) {
 			failures.add(new AssertionFailedError("installMonitor on resource that is already monitored: " + resource));
+		}
 		return this;
 	}
 
@@ -76,7 +77,8 @@
 			monitoredResources.clear();
 			return;
 		}
-		if (!monitoredResources.remove(resource))
+		if (!monitoredResources.remove(resource)) {
 			failures.add(new AssertionFailedError("Unmonitor on resource that is not monitored: " + resource));
+		}
 	}
 }
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_025457.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_025457.java
index 048ce8f..ac6d1f1 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_025457.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_025457.java
@@ -41,8 +41,9 @@
 
 	public void testFile() {
 		//this test only works on windows
-		if (!isWindows())
+		if (!isWindows()) {
 			return;
+		}
 		IProject source = getWorkspace().getRoot().getProject("project");
 		IFile sourceFile = source.getFile("file.txt");
 		IFile destFile = source.getFile("File.txt");
@@ -86,8 +87,9 @@
 	public void testFolder() {
 		//this test only works on windows
 		//native code must also be present so move can detect the case change
-		if (!isWindows() || !isReadOnlySupported())
+		if (!isWindows() || !isReadOnlySupported()) {
 			return;
+		}
 		IProject source = getWorkspace().getRoot().getProject("SourceProject");
 		IFolder sourceFolder = source.getFolder("folder");
 		IFile sourceFile = sourceFolder.getFile("Important.txt");
@@ -128,8 +130,9 @@
 
 	public void testProject() {
 		//this test only works on windows
-		if (!isWindows())
+		if (!isWindows()) {
 			return;
+		}
 		IProject source = getWorkspace().getRoot().getProject("project");
 		IProject destination = getWorkspace().getRoot().getProject("Project");
 		IFile sourceFile = source.getFile("Important.txt");
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_026294.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_026294.java
index 26e8dbc..af76b9c 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_026294.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_026294.java
@@ -37,8 +37,9 @@
 	 * Works only for Windows.
 	 */
 	public void testDeleteOpenProjectWindows() {
-		if (!(isWindows()))
+		if (!(isWindows())) {
 			return;
+		}
 
 		IProject project = null;
 		InputStream input = null;
@@ -125,8 +126,9 @@
 			try {
 				assertClose(input);
 			} finally {
-				if (projectRoot != null)
+				if (projectRoot != null) {
 					ensureDoesNotExistInFileSystem(projectRoot);
+				}
 			}
 		}
 	}
@@ -136,8 +138,9 @@
 	 * Works only for Linux with natives.
 	 */
 	public void testDeleteOpenProjectLinux() {
-		if (!(Platform.getOS().equals(Platform.OS_LINUX) && isReadOnlySupported()))
+		if (!(Platform.getOS().equals(Platform.OS_LINUX) && isReadOnlySupported())) {
 			return;
+		}
 
 		IProject project = null;
 		File projectRoot = null;
@@ -189,10 +192,12 @@
 
 			assertTrue("6.0", !projectRoot.exists());
 		} finally {
-			if (folder != null && folder.exists())
+			if (folder != null && folder.exists()) {
 				setReadOnly(folder, false);
-			if (projectRoot != null)
+			}
+			if (projectRoot != null) {
 				ensureDoesNotExistInFileSystem(projectRoot);
+			}
 		}
 	}
 
@@ -201,8 +206,9 @@
 	 * Works only for Windows.
 	 */
 	public void testDeleteClosedProjectWindows() {
-		if (!isWindows())
+		if (!isWindows()) {
 			return;
+		}
 
 		IProject project = null;
 		InputStream input = null;
@@ -260,13 +266,15 @@
 			assertDoesNotExistInFileSystem("7.0", projectFile);
 		} finally {
 			try {
-				if (input != null)
+				if (input != null) {
 					input.close();
+				}
 			} catch (IOException e) {
 				fail("8.0", e);
 			} finally {
-				if (projectRoot != null)
+				if (projectRoot != null) {
 					ensureDoesNotExistInFileSystem(projectRoot);
+				}
 			}
 		}
 	}
@@ -278,8 +286,9 @@
 	 * TODO: enable this test once bug 48321 is fixed.
 	 */
 	public void testDeleteClosedProjectLinux() {
-		if (!(Platform.getOS().equals(Platform.OS_LINUX)))
+		if (!(Platform.getOS().equals(Platform.OS_LINUX))) {
 			return;
+		}
 
 		IProject project = null;
 		File projectRoot = null;
@@ -335,10 +344,12 @@
 			assertTrue("6.2", !projectRoot.exists());
 			assertDoesNotExistInFileSystem("6.3", projectFile);
 		} finally {
-			if (folder != null && folder.exists())
+			if (folder != null && folder.exists()) {
 				setReadOnly(folder, false);
-			if (projectRoot != null)
+			}
+			if (projectRoot != null) {
 				ensureDoesNotExistInFileSystem(projectRoot);
+			}
 		}
 	}
 
@@ -347,8 +358,9 @@
 	 * Works only for Windows.
 	 */
 	public void testDeleteFolderWindows() {
-		if (!isWindows())
+		if (!isWindows()) {
 			return;
+		}
 
 		IProject project = null;
 		InputStream input = null;
@@ -399,8 +411,9 @@
 			try {
 				assertClose(input);
 			} finally {
-				if (projectRoot != null)
+				if (projectRoot != null) {
 					ensureDoesNotExistInFileSystem(projectRoot);
+				}
 			}
 		}
 	}
@@ -410,8 +423,9 @@
 	 * Works only for Linux with natives.
 	 */
 	public void testDeleteFolderLinux() {
-		if (!(Platform.getOS().equals(Platform.OS_LINUX)))
+		if (!(Platform.getOS().equals(Platform.OS_LINUX))) {
 			return;
+		}
 
 		IProject project = null;
 		File projectRoot = null;
@@ -457,10 +471,12 @@
 			assertTrue("5.4", file1.isSynchronized(IResource.DEPTH_INFINITE));
 			assertTrue("5.5", folder.isSynchronized(IResource.DEPTH_INFINITE));
 		} finally {
-			if (subFolder != null && subFolder.exists())
+			if (subFolder != null && subFolder.exists()) {
 				setReadOnly(subFolder, false);
-			if (projectRoot != null)
+			}
+			if (projectRoot != null) {
 				ensureDoesNotExistInFileSystem(projectRoot);
+			}
 		}
 	}
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_027271.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_027271.java
index 9862624..e4faaf6 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_027271.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_027271.java
@@ -48,9 +48,11 @@
 	private void clearPathVariablesProperties() {
 		// ensure we have no preferences related to path variables
 		String[] propertyNames = preferences.propertyNames();
-		for (int i = 0; i < propertyNames.length; i++)
-			if (propertyNames[i].startsWith(VARIABLE_PREFIX))
-				preferences.setToDefault(propertyNames[i]);
+		for (String propertyName : propertyNames) {
+			if (propertyName.startsWith(VARIABLE_PREFIX)) {
+				preferences.setToDefault(propertyName);
+			}
+		}
 	}
 
 	public static Test suite() {
@@ -59,8 +61,9 @@
 
 	public void testBug() {
 		//this bug is only relevant on Windows
-		if (!isWindows())
+		if (!isWindows()) {
 			return;
+		}
 		IPathVariableManager pvm = getWorkspace().getPathVariableManager();
 		Preferences prefs = ResourcesPlugin.getPlugin().getPluginPreferences();
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_029851.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_029851.java
index 1f7b050..f45d469 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_029851.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_029851.java
@@ -44,8 +44,9 @@
 		for (int i = 0; i < breadth; i++) {
 			IPath child = prefix.append(Integer.toString(i)).addTrailingSeparator();
 			result.add(child.toString());
-			if (depth > 0)
+			if (depth > 0) {
 				result.addAll(createChildren(breadth, depth - 1, child));
+			}
 		}
 		return result;
 	}
@@ -62,8 +63,9 @@
 
 	public void test() {
 		// disable for now.
-		if (DISABLED)
+		if (DISABLED) {
 			return;
+		}
 		createHierarchy();
 		final QualifiedName key = new QualifiedName("local", getUniqueString());
 		final String value = getUniqueString();
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_032076.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_032076.java
index ad19e5a..8e0cdce 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_032076.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_032076.java
@@ -40,8 +40,9 @@
 	}
 
 	public void testFileBugOnWindows() {
-		if (!isWindows())
+		if (!isWindows()) {
 			return;
+		}
 
 		InputStream input = null;
 		IProject project = null;
@@ -116,20 +117,23 @@
 
 		} finally {
 			try {
-				if (input != null)
+				if (input != null) {
 					input.close();
+				}
 			} catch (IOException e) {
 				fail("5.0", e);
 			} finally {
-				if (project != null)
+				if (project != null) {
 					ensureDoesNotExistInFileSystem(project);
+				}
 			}
 		}
 	}
 
 	public void testFolderBugOnWindows() {
-		if (!isWindows())
+		if (!isWindows()) {
 			return;
+		}
 
 		InputStream input = null;
 		IProject project = null;
@@ -213,20 +217,23 @@
 
 		} finally {
 			try {
-				if (input != null)
+				if (input != null) {
 					input.close();
+				}
 			} catch (IOException e) {
 				fail("5.0", e);
 			} finally {
-				if (project != null)
+				if (project != null) {
 					ensureDoesNotExistInFileSystem(project);
+				}
 			}
 		}
 	}
 
 	public void testProjectBugOnWindows() {
-		if (!isWindows())
+		if (!isWindows()) {
 			return;
+		}
 
 		IProject sourceProject = null;
 		IProject destinationProject = null;
@@ -293,15 +300,18 @@
 
 		} finally {
 			try {
-				if (input != null)
+				if (input != null) {
 					input.close();
+				}
 			} catch (IOException e) {
 				fail("6.0", e);
 			} finally {
-				if (sourceProject != null)
+				if (sourceProject != null) {
 					ensureDoesNotExistInFileSystem(sourceProject);
-				if (destinationProject != null)
+				}
+				if (destinationProject != null) {
 					ensureDoesNotExistInFileSystem(destinationProject);
+				}
 			}
 		}
 	}
@@ -310,8 +320,9 @@
 	 * TODO: This test is currently failing and needs further investigation (bug 203078)
 	 */
 	public void _testFileBugOnLinux() {
-		if (!(Platform.getOS().equals(Platform.OS_LINUX) && isReadOnlySupported()))
+		if (!(Platform.getOS().equals(Platform.OS_LINUX) && isReadOnlySupported())) {
 			return;
+		}
 
 		IFileStore roFolderStore = null;
 		IProject project = null;
@@ -382,10 +393,12 @@
 			assertTrue("4.7", sourceFile.exists());
 
 		} finally {
-			if (roFolderStore != null)
+			if (roFolderStore != null) {
 				setReadOnly(roFolderStore, false);
-			if (project != null)
+			}
+			if (project != null) {
 				ensureDoesNotExistInFileSystem(project);
+			}
 		}
 	}
 
@@ -393,8 +406,9 @@
 	 * TODO: This test is currently failing and needs further investigation (bug 203078)
 	 */
 	public void _testFolderBugOnLinux() {
-		if (!(Platform.getOS().equals(Platform.OS_LINUX) && isReadOnlySupported()))
+		if (!(Platform.getOS().equals(Platform.OS_LINUX) && isReadOnlySupported())) {
 			return;
+		}
 
 		IFileStore roFolderLocation = null, destinationROFolderLocation = null;
 		IProject project = null;
@@ -480,12 +494,15 @@
 			assertTrue("4.8", !file2.exists());
 
 		} finally {
-			if (roFolderLocation != null)
+			if (roFolderLocation != null) {
 				setReadOnly(roFolderLocation, false);
-			if (destinationROFolderLocation != null)
+			}
+			if (destinationROFolderLocation != null) {
 				setReadOnly(destinationROFolderLocation, false);
-			if (project != null)
+			}
+			if (project != null) {
 				ensureDoesNotExistInFileSystem(project);
+			}
 		}
 	}
 
@@ -493,8 +510,9 @@
 	 * TODO: This test is currently failing and needs further investigation (bug 203078)
 	 */
 	public void _testProjectBugOnLinux() {
-		if (!(Platform.getOS().equals(Platform.OS_LINUX) && isReadOnlySupported()))
+		if (!(Platform.getOS().equals(Platform.OS_LINUX) && isReadOnlySupported())) {
 			return;
+		}
 
 		IWorkspace workspace = getWorkspace();
 		IProject sourceProject = workspace.getRoot().getProject(getUniqueString() + ".source");
@@ -572,8 +590,9 @@
 		} finally {
 			setReadOnly(projectParentStore, false);
 			ensureDoesNotExistInFileSystem(sourceProject);
-			if (destinationProject != null)
+			if (destinationProject != null) {
 				ensureDoesNotExistInFileSystem(destinationProject);
+			}
 		}
 	}
 }
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_044106.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_044106.java
index 01a1735..0f57cc1 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_044106.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_044106.java
@@ -100,8 +100,9 @@
 	 * @param deleteFlags The flags to use on the resource deletion call
 	 */
 	public void doTestDeleteLinkedFolder(IFolder linkedFolder, boolean deleteParent, int deleteFlags) {
-		if (!Platform.getOS().equals(Platform.OS_LINUX))
+		if (!Platform.getOS().equals(Platform.OS_LINUX)) {
 			return;
+		}
 		IFileStore linkDestLocation = getTempStore();
 		IFileStore linkDestFile = linkDestLocation.getChild(getUniqueString());
 		createFileInFileSystem(linkDestFile);
@@ -130,10 +131,11 @@
 
 		// delete the folder or project
 		try {
-			if (deleteParent)
+			if (deleteParent) {
 				linkedFolder.getParent().delete(deleteFlags, getMonitor());
-			else
+			} else {
 				linkedFolder.delete(deleteFlags, getMonitor());
+			}
 		} catch (CoreException e) {
 			fail("3.0", e);
 		}
@@ -146,36 +148,41 @@
 	}
 
 	public void testDeleteLinkedFile() {
-		if (!Platform.getOS().equals(Platform.OS_LINUX))
+		if (!Platform.getOS().equals(Platform.OS_LINUX)) {
 			return;
+		}
 		doTestDeleteLinkedFile(IResource.NONE);
 	}
 
 	public void testDeleteLinkedFolder() {
-		if (!Platform.getOS().equals(Platform.OS_LINUX))
+		if (!Platform.getOS().equals(Platform.OS_LINUX)) {
 			return;
+		}
 		IProject project = getWorkspace().getRoot().getProject(getUniqueString());
 		IFolder linkedFolder = project.getFolder("linkedFolder");
 		doTestDeleteLinkedFolder(linkedFolder, false, IResource.NONE);
 	}
 
 	public void testDeleteLinkedResourceInProject() {
-		if (!Platform.getOS().equals(Platform.OS_LINUX))
+		if (!Platform.getOS().equals(Platform.OS_LINUX)) {
 			return;
+		}
 		IProject project = getWorkspace().getRoot().getProject(getUniqueString());
 		IFolder linkedFolder = project.getFolder("linkedFolder");
 		doTestDeleteLinkedFolder(linkedFolder, true, IResource.NONE);
 	}
 
 	public void testDeleteLinkedFileKeepHistory() {
-		if (!Platform.getOS().equals(Platform.OS_LINUX))
+		if (!Platform.getOS().equals(Platform.OS_LINUX)) {
 			return;
+		}
 		doTestDeleteLinkedFile(IResource.KEEP_HISTORY);
 	}
 
 	public void testDeleteLinkedFolderParentKeepHistory() {
-		if (!Platform.getOS().equals(Platform.OS_LINUX))
+		if (!Platform.getOS().equals(Platform.OS_LINUX)) {
 			return;
+		}
 		IProject project = getWorkspace().getRoot().getProject(getUniqueString());
 		IFolder parent = project.getFolder("parent");
 		IFolder linkedFolder = parent.getFolder("linkedFolder");
@@ -183,16 +190,18 @@
 	}
 
 	public void testDeleteLinkedFolderKeepHistory() {
-		if (!Platform.getOS().equals(Platform.OS_LINUX))
+		if (!Platform.getOS().equals(Platform.OS_LINUX)) {
 			return;
+		}
 		IProject project = getWorkspace().getRoot().getProject(getUniqueString());
 		IFolder linkedFolder = project.getFolder("linkedFolder");
 		doTestDeleteLinkedFolder(linkedFolder, false, IResource.KEEP_HISTORY);
 	}
 
 	public void testDeleteLinkedResourceInProjectKeepHistory() {
-		if (!Platform.getOS().equals(Platform.OS_LINUX))
+		if (!Platform.getOS().equals(Platform.OS_LINUX)) {
 			return;
+		}
 		IProject project = getWorkspace().getRoot().getProject(getUniqueString());
 		IFolder linkedFolder = project.getFolder("linkedFolder");
 		doTestDeleteLinkedFolder(linkedFolder, true, IResource.KEEP_HISTORY);
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_079398.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_079398.java
index 2af5c8d..b3d1a02 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_079398.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_079398.java
@@ -47,8 +47,9 @@
 		try {
 			ensureExistsInWorkspace(file1, getRandomContents());
 			try {
-				for (int i = 0; i < 10; i++)
+				for (int i = 0; i < 10; i++) {
 					file1.setContents(getRandomContents(), IResource.FORCE | IResource.KEEP_HISTORY, getMonitor());
+				}
 			} catch (CoreException e) {
 				fail("0.2", e);
 			}
@@ -89,8 +90,9 @@
 
 			// now cause the destination to have many more states
 			try {
-				for (int i = 0; i <= description.getMaxFileStates(); i++)
+				for (int i = 0; i <= description.getMaxFileStates(); i++) {
 					file2.setContents(getRandomContents(), IResource.FORCE | IResource.KEEP_HISTORY, getMonitor());
+				}
 			} catch (CoreException e) {
 				fail("1.5", e);
 			}
@@ -115,8 +117,9 @@
 			// the source should have any extra states removed as well,
 			// but the ones left should still exist
 			assertEquals("1.7", description.getMaxFileStates(), sourceStates.length);
-			for (int i = 0; i < sourceStates.length; i++)
+			for (int i = 0; i < sourceStates.length; i++) {
 				assertTrue("1.8." + i, sourceStates[i].exists());
+			}
 		} finally {
 			// restore the original description
 			try {
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_092108.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_092108.java
index f4bf85c..6051c3a 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_092108.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_092108.java
@@ -33,8 +33,9 @@
 	}
 
 	public void testBug() {
-		if (!isWindows())
+		if (!isWindows()) {
 			return;
+		}
 		IFileStore root;
 		try {
 			root = EFS.getStore(new java.io.File("c:\\").toURI());
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_134364.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_134364.java
index 07058ad..4e2dd96 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_134364.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_134364.java
@@ -107,7 +107,8 @@
 		writer.schedule();
 		writer.join();
 		done[0] = true;
-		if (failure[0] != null)
+		if (failure[0] != null) {
 			fail("1.0", failure[0]);
+		}
 	}
 }
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_147232.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_147232.java
index 8bd24d2..012b4fb 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_147232.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_147232.java
@@ -41,12 +41,14 @@
 	@Override
 	public void resourceChanged(IResourceChangeEvent event) {
 		//we are only concerned with seeing duplicate post change events
-		if (event.getType() != IResourceChangeEvent.POST_CHANGE)
+		if (event.getType() != IResourceChangeEvent.POST_CHANGE) {
 			return;
+		}
 		//record occurrence of the file creation delta if we find it
 		IResourceDelta delta = event.getDelta().findMember(file.getFullPath());
-		if (delta != null && delta.getKind() == IResourceDelta.ADDED)
+		if (delta != null && delta.getKind() == IResourceDelta.ADDED) {
 			deltaSeenCount++;
+		}
 	}
 
 	@Override
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_233939.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_233939.java
index 5cddb04..5bb3ef2 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_233939.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_233939.java
@@ -69,8 +69,9 @@
 
 	public void testBug() {
 		// Only activate this test if testing of symbolic links is possible.
-		if (!canCreateSymLinks())
+		if (!canCreateSymLinks()) {
 			return;
+		}
 		String fileName = "file.txt";
 
 		IWorkspaceRoot root = ResourcesPlugin.getWorkspace().getRoot();
@@ -105,8 +106,9 @@
 
 	public void testMultipleLinksToFolder() {
 		// Only activate this test if testing of symbolic links is possible.
-		if (!canCreateSymLinks())
+		if (!canCreateSymLinks()) {
 			return;
+		}
 		// create a folder: getTempStore() will be cleaned up in tearDown()
 		IFileStore tempStore = getTempStore();
 		createFileInFileSystem(tempStore.getChild("foo.txt"));
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_265810.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_265810.java
index 69694c0..3659907 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_265810.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_265810.java
@@ -57,8 +57,9 @@
 	protected void tearDown() throws Exception {
 		IPath[] paths = toDelete.toArray(new IPath[0]);
 		toDelete.clear();
-		for (int i = 0; i < paths.length; i++)
-			Workspace.clear(paths[i].toFile());
+		for (IPath path : paths) {
+			Workspace.clear(path.toFile());
+		}
 		super.tearDown();
 	}
 
@@ -184,10 +185,12 @@
 		try {
 			event.getDelta().accept(delta -> {
 				IResource resource = delta.getResource();
-				if (resource instanceof IFile && !resource.getName().equals(".project"))
+				if (resource instanceof IFile && !resource.getName().equals(".project")) {
 					addToResourceDelta(delta);
-				if (delta.getAffectedChildren().length > 0)
+				}
+				if (delta.getAffectedChildren().length > 0) {
 					return true;
+				}
 				return false;
 			});
 		} catch (CoreException e) {
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_329836.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_329836.java
index 1835130..5b026f1 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_329836.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_329836.java
@@ -31,8 +31,9 @@
 	}
 
 	public void testBug() {
-		if (!Platform.getOS().equals(Platform.OS_MACOSX))
+		if (!Platform.getOS().equals(Platform.OS_MACOSX)) {
 			return;
+		}
 
 		IFileStore fileStore = getTempStore().getChild(getUniqueString());
 		createFileInFileSystem(fileStore);
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_378156.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_378156.java
index 1dd3f47..617416a 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_378156.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/Bug_378156.java
@@ -40,8 +40,9 @@
 
 		@Override
 		public IStatus runInWorkspace(IProgressMonitor monitor) throws CoreException {
-			if (cancel)
+			if (cancel) {
 				throw new OperationCanceledException();
+			}
 			jobFile.setContents(getRandomContents(), IResource.NONE, null);
 			//wait for signal
 			try {
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/IFileTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/IFileTest.java
index 808bdae..97e39fb 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/IFileTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/IFileTest.java
@@ -49,17 +49,20 @@
 		// This test is no longer valid since the error code is dependent on whether
 		// or not the parent folder is marked as read-only. We need to write a different
 		// test to make the file.create fail.
-		if (DISABLED )
+		if (DISABLED ) {
 			return;
+		}
 
 		// We need to know whether or not we can unset the read-only flag
 		// in order to perform this test.
-		if (!isReadOnlySupported())
+		if (!isReadOnlySupported()) {
 			return;
+		}
 
 		// Don't test this on Windows
-		if (isWindows())
+		if (isWindows()) {
 			return;
+		}
 
 		IProject project = getWorkspace().getRoot().getProject("MyProject");
 		IFolder folder = project.getFolder("folder");
@@ -89,13 +92,15 @@
 
 		// We need to know whether or not we can unset the read-only flag
 		// in order to perform this test.
-		if (!isReadOnlySupported())
+		if (!isReadOnlySupported()) {
 			return;
+		}
 
 		// Only run this test on Linux for now since Windows lets you create
 		// a file within a read-only folder.
-		if (!Platform.getOS().equals(Platform.OS_LINUX))
+		if (!Platform.getOS().equals(Platform.OS_LINUX)) {
 			return;
+		}
 
 		IProject project = getWorkspace().getRoot().getProject("MyProject");
 		IFolder folder = project.getFolder("folder");
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/IFolderTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/IFolderTest.java
index ffef740..90184a1 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/IFolderTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/IFolderTest.java
@@ -48,13 +48,15 @@
 
 		// We need to know whether or not we can unset the read-only flag
 		// in order to perform this test.
-		if (!isReadOnlySupported())
+		if (!isReadOnlySupported()) {
 			return;
+		}
 
 		// Only run this test on Linux for now since Windows lets you create
 		// a file within a read-only folder.
-		if (!Platform.getOS().equals(Platform.OS_LINUX))
+		if (!Platform.getOS().equals(Platform.OS_LINUX)) {
 			return;
+		}
 
 		IProject project = getWorkspace().getRoot().getProject("MyProject");
 		IFolder parentFolder = project.getFolder("parentFolder");
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/IProjectTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/IProjectTest.java
index 1262895..fe3bbe0 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/IProjectTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/IProjectTest.java
@@ -38,8 +38,9 @@
 
 		/* define a visitor that renames all resources it visits */
 		IResourceVisitor renameVisitor = resource -> {
-			if (!resource.exists())
+			if (!resource.exists()) {
 				return false;
+			}
 			IPath path = resource.getFullPath();
 			path = path.removeLastSegments(1);
 			long timestamp = System.currentTimeMillis();
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/IResourceTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/IResourceTest.java
index 926b475..4b861ed 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/IResourceTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/IResourceTest.java
@@ -104,8 +104,9 @@
 
 	public void testBug28790() {
 		// only activate this test on platforms that support it
-		if (!isAttributeSupported(EFS.ATTRIBUTE_ARCHIVE))
+		if (!isAttributeSupported(EFS.ATTRIBUTE_ARCHIVE)) {
 			return;
+		}
 		IProject project = getWorkspace().getRoot().getProject("MyProject");
 		IFile file = project.getFile("a.txt");
 		ensureExistsInWorkspace(file, getRandomString());
@@ -170,15 +171,17 @@
 
 			@Override
 			public boolean visit(IResourceDelta aDelta) {
-				if (aDelta.getResource().equals(file))
+				if (aDelta.getResource().equals(file)) {
 					mySeen[0] = true;
+				}
 				return true;
 			}
 		}
 		IResourceChangeListener listener = event -> {
 			IResourceDelta delta = event.getDelta();
-			if (delta == null)
+			if (delta == null) {
 				return;
+			}
 			try {
 				delta.accept(new DeltaVisitor(seen));
 				delta.accept(new DeltaVisitor(phantomSeen), true);
@@ -229,8 +232,9 @@
 
 	public void testBug111821() {
 		//this test only makes sense on Windows
-		if (!isWindows())
+		if (!isWindows()) {
 			return;
+		}
 		IProject project = getWorkspace().getRoot().getProject("testBug111821");
 		IFolder folder = project.getFolder(new Path(null, "c:"));
 		ensureExistsInWorkspace(project, true);
@@ -312,11 +316,13 @@
 		IFile anotherFile = project.getFile("File");
 		try {
 			anotherFile.create(getRandomContents(), true, null);
-			if (!caseSensitive)
+			if (!caseSensitive) {
 				fail("2.1");
+			}
 		} catch (CoreException e) {
-			if (caseSensitive)
+			if (caseSensitive) {
 				fail("2.2", e);
+			}
 		}
 
 		// clean-up
@@ -329,21 +335,25 @@
 		// force = false
 		try {
 			anotherFile.create(getRandomContents(), false, null);
-			if (!caseSensitive)
+			if (!caseSensitive) {
 				fail("4.0");
+			}
 		} catch (CoreException e) {
-			if (caseSensitive)
+			if (caseSensitive) {
 				fail("4.1", e);
+			}
 		}
 
 		// test refreshLocal
 		try {
 			anotherFile.refreshLocal(IResource.DEPTH_ZERO, getMonitor());
-			if (!caseSensitive)
+			if (!caseSensitive) {
 				fail("5.0");
+			}
 		} catch (CoreException e) {
-			if (caseSensitive)
+			if (caseSensitive) {
 				fail("5.1", e);
+			}
 		}
 
 		// clean up
@@ -367,8 +377,9 @@
 		}
 
 		StringBuffer sb = new StringBuffer();
-		for (int i = 0; i < 260; i++)
+		for (int i = 0; i < 260; i++) {
 			sb.append('a');
+		}
 		sb.append('b');
 		IFolder folder = project.getFolder(sb.toString());
 		try {
@@ -439,8 +450,9 @@
 		// This test cannot be done automatically because we don't know in that
 		// file system we are running. Will leave test here in case it needs
 		// to be run it in a special environment.
-		if (DISABLED)
+		if (DISABLED) {
 			return;
+		}
 
 		IProject project = getWorkspace().getRoot().getProject("MyProject");
 		IFile file = project.getFile("MyFile");
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/NLTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/NLTest.java
index c35b82e..7533fa9 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/NLTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/regression/NLTest.java
@@ -53,8 +53,9 @@
 				name.append(((int) current) + "_");
 			}
 		}
-		if (name.length() > 0)
+		if (name.length() > 0) {
 			list.add(name.toString());
+		}
 	}
 
 	public String[] getFileNames(String language) {
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/session/ProjectPreferenceSessionTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/session/ProjectPreferenceSessionTest.java
index 6467a45..966caf0 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/session/ProjectPreferenceSessionTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/session/ProjectPreferenceSessionTest.java
@@ -70,13 +70,16 @@
 		ILogListener listener = new ILogListener() {
 			@Override
 			public void logging(IStatus status, String plugin) {
-				if (!Platform.PI_RUNTIME.equals(plugin))
+				if (!Platform.PI_RUNTIME.equals(plugin)) {
 					return;
+				}
 				Throwable t = status.getException();
-				if (t == null)
+				if (t == null) {
 					return;
-				if (t instanceof BackingStoreException)
+				}
+				if (t instanceof BackingStoreException) {
 					fail("1.0", t);
+				}
 			}
 		};
 		try {
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/session/TestBug323833.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/session/TestBug323833.java
index 30e9e43..8e84e7d 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/session/TestBug323833.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/session/TestBug323833.java
@@ -35,8 +35,9 @@
 	}
 
 	public void test1() {
-		if (!Platform.getOS().equals(Platform.OS_MACOSX))
+		if (!Platform.getOS().equals(Platform.OS_MACOSX)) {
 			return;
+		}
 
 		IFileStore fileStore = getTempStore().getChild(getUniqueString());
 		createFileInFileSystem(fileStore);
@@ -66,8 +67,9 @@
 	}
 
 	public void test2() {
-		if (!Platform.getOS().equals(Platform.OS_MACOSX))
+		if (!Platform.getOS().equals(Platform.OS_MACOSX)) {
 			return;
+		}
 
 		try {
 			FileCache.getCache();
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/session/TestCloseNoSave.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/session/TestCloseNoSave.java
index c3914f3..bea56b7 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/session/TestCloseNoSave.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/session/TestCloseNoSave.java
@@ -58,8 +58,9 @@
 		IFile file = folder.getFile(FILE);
 
 		//opening the project does an automatic local refresh
-		if (!project.isOpen())
+		if (!project.isOpen()) {
 			project.open(null);
+		}
 
 		assertEquals("2.0", 2, project.members().length);
 		assertTrue("2.1", folder.exists());
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/session/TestInterestingProjectPersistence.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/session/TestInterestingProjectPersistence.java
index 1b52bb9..1af4247 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/session/TestInterestingProjectPersistence.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/session/TestInterestingProjectPersistence.java
@@ -58,8 +58,9 @@
 	 */
 	protected void setAutoBuilding(boolean value) throws CoreException {
 		IWorkspace workspace = getWorkspace();
-		if (workspace.isAutoBuilding() == value)
+		if (workspace.isAutoBuilding() == value) {
 			return;
+		}
 		IWorkspaceDescription desc = workspace.getDescription();
 		desc.setAutoBuilding(value);
 		workspace.setDescription(desc);
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/session/TestMissingBuilder.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/session/TestMissingBuilder.java
index 4d9d94d..f2e2be4 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/session/TestMissingBuilder.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/session/TestMissingBuilder.java
@@ -47,9 +47,10 @@
 	protected boolean hasBuilder(IProject project, String builderId) {
 		try {
 			ICommand[] commands = project.getDescription().getBuildSpec();
-			for (int i = 0; i < commands.length; i++) {
-				if (commands[i].getBuilderName().equals(builderId))
+			for (ICommand command : commands) {
+				if (command.getBuilderName().equals(builderId)) {
 					return true;
+				}
 			}
 		} catch (CoreException e) {
 			fail("Failed in hasBuilder(" + project.getName() + ", " + builderId + ")", e);
@@ -67,8 +68,9 @@
 	 */
 	protected void setAutoBuilding(boolean value) throws CoreException {
 		IWorkspace workspace = getWorkspace();
-		if (workspace.isAutoBuilding() == value)
+		if (workspace.isAutoBuilding() == value) {
 			return;
+		}
 		IWorkspaceDescription desc = workspace.getDescription();
 		desc.setAutoBuilding(value);
 		workspace.setDescription(desc);
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/usecase/ConcurrentOperation.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/usecase/ConcurrentOperation.java
index de60ce6..f741f5d 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/usecase/ConcurrentOperation.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/usecase/ConcurrentOperation.java
@@ -94,10 +94,11 @@
 	}
 
 	protected void logException(Exception e) {
-		if (e instanceof CoreException)
+		if (e instanceof CoreException) {
 			status.add(((CoreException) e).getStatus());
-		else
+		} else {
 			status.add(new ResourceStatus(0, null, null, e));
+		}
 	}
 
 	/**
@@ -141,8 +142,9 @@
 			} catch (Exception e) {
 				logException(e);
 			}
-		} else
+		} else {
 			setHasStarted(false);
+		}
 
 	}
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/usecase/IWorkspaceRunnableUseCaseTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/usecase/IWorkspaceRunnableUseCaseTest.java
index 5609160..0540400 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/usecase/IWorkspaceRunnableUseCaseTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/usecase/IWorkspaceRunnableUseCaseTest.java
@@ -36,10 +36,12 @@
 				}
 				throw new IllegalArgumentException(exceptionToThrow);
 			}
-			if (triggerBuild)
+			if (triggerBuild) {
 				project.touch(getMonitor());
-			if (nestedOperation != null)
+			}
+			if (nestedOperation != null) {
 				getWorkspace().run(nestedOperation, getMonitor());
+			}
 		};
 	}
 
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/usecase/Snapshot2Test.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/usecase/Snapshot2Test.java
index 63423ac..4199c92 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/usecase/Snapshot2Test.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/usecase/Snapshot2Test.java
@@ -36,8 +36,9 @@
 	protected static String[] defineHierarchy1() {
 		List<String> result = new ArrayList<>();
 		String[] old = Snapshot1Test.defineHierarchy1();
-		for (int i = 0; i < old.length; i++)
-			result.add(old[i]);
+		for (String element : old) {
+			result.add(element);
+		}
 		result.add(new Path(PROJECT_1).append("added file").toString());
 		result.add(new Path(PROJECT_1).append("yet another file").toString());
 		result.add(new Path(PROJECT_1).append("a folder").addTrailingSeparator().toString());
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/usecase/Snapshot4Test.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/usecase/Snapshot4Test.java
index fb060fd..d3e9992 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/usecase/Snapshot4Test.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/usecase/Snapshot4Test.java
@@ -32,8 +32,9 @@
 	protected static String[] defineHierarchy1() {
 		List<String> result = new ArrayList<>();
 		String[] old = Snapshot3Test.defineHierarchy1();
-		for (int i = 0; i < old.length; i++)
-			result.add(old[i]);
+		for (String element : old) {
+			result.add(element);
+		}
 		result.remove(new Path(PROJECT_1).append("added file").toString());
 		result.remove(new Path(PROJECT_1).append("yet another file").toString());
 		result.remove(new Path(PROJECT_1).append("a folder").addTrailingSeparator().toString());
diff --git a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/usecase/SnapshotTest.java b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/usecase/SnapshotTest.java
index e64513c..ea0b8dd 100644
--- a/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/usecase/SnapshotTest.java
+++ b/tests/org.eclipse.core.tests.resources/src/org/eclipse/core/tests/resources/usecase/SnapshotTest.java
@@ -49,8 +49,9 @@
 	}
 
 	public void test1() {
-		if (skipTest())
+		if (skipTest()) {
 			return;
+		}
 		Snapshot1Test test = new Snapshot1Test();
 		test.testCreateMyProject();
 		test.testCreateProject2();
@@ -58,8 +59,9 @@
 	}
 
 	public void test2() {
-		if (skipTest())
+		if (skipTest()) {
 			return;
+		}
 		Snapshot2Test test = new Snapshot2Test();
 		test.testVerifyPreviousSession();
 		test.testChangeMyProject();
@@ -68,16 +70,18 @@
 	}
 
 	public void test3() {
-		if (skipTest())
+		if (skipTest()) {
 			return;
+		}
 		Snapshot3Test test = new Snapshot3Test();
 		test.testVerifyPreviousSession();
 		test.testSaveWorkspace();
 	}
 
 	public void test4() {
-		if (skipTest())
+		if (skipTest()) {
 			return;
+		}
 		Snapshot4Test test = new Snapshot4Test();
 		test.testVerifyPreviousSession();
 		test.testChangeMyProject();
@@ -85,8 +89,9 @@
 	}
 
 	public void test5() {
-		if (skipTest())
+		if (skipTest()) {
 			return;
+		}
 		Snapshot5Test test = new Snapshot5Test();
 		test.testVerifyPreviousSession();
 		test.cleanUp();
