diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/RunFormatterTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/RunFormatterTests.java
index 122a68e..4382806 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/RunFormatterTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/RunFormatterTests.java
@@ -9,6 +9,7 @@
  *     IBM Corporation - initial API and implementation
  *     Jesper S Moller - Contribution for bug 402173
  *                       Contribution for bug 402892
+ *     Mateusz Matela <mateusz.matela@gmail.com> - [formatter] follow up bug for comments - https://bugs.eclipse.org/458208
  *******************************************************************************/
 package org.eclipse.jdt.core.tests;
 
@@ -37,6 +38,7 @@
 		TEST_SUITES.add(FormatterCommentsClearBlankLinesTests.class);
 		TEST_SUITES.add(FormatterJavadocDontIndentTagsTests.class);
 		TEST_SUITES.add(FormatterJavadocDontIndentTagsDescriptionTests.class);
+		TEST_SUITES.add(FormatterOldBugsGistTests.class);
 	}
 
 	public static Class[] getTestClasses() {
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterBugs18Tests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterBugs18Tests.java
index f9dcb0a..d7cddc6 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterBugs18Tests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterBugs18Tests.java
@@ -7,6 +7,7 @@
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
+ *     Mateusz Matela <mateusz.matela@gmail.com> - [formatter] follow up bug for comments - https://bugs.eclipse.org/458208
  *******************************************************************************/
 package org.eclipse.jdt.core.tests.formatter;
 
@@ -185,7 +186,7 @@
 			"			// nothing\n" +
 			"			System.out.println(\"\");\n" +
 			"			return \"\";\n" +
-			"		} );\n" +
+			"		});\n" +
 			"	}\n" +
 			"\n" +
 			"	public Function<String, String> testBad() {\n" +
@@ -193,7 +194,7 @@
 			"			// nothing\n" +
 			"			System.out.println(\"\");\n" +
 			"			return \"\";\n" +
-			"		} );\n" +
+			"		});\n" +
 			"	}\n" +
 			"\n" +
 			"	public Function<String, String> foo(Function<String, String> f) {\n" +
@@ -230,7 +231,7 @@
 			"				}\n"+
 			"			}\n"+
 			"\n"+
-			"		} ).start();\n"+
+			"		}).start();\n"+
 			"	}\n"+
 			"}\n";
 
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterBugsTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterBugsTests.java
index 44b9b8b..0659687 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterBugsTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterBugsTests.java
@@ -11,6 +11,7 @@
  *     Robin Stocker - Bug 49619 - [formatting] comment formatter leaves whitespace in comments
  *     Mateusz Matela <mateusz.matela@gmail.com> - [formatter] Formatter does not format Java code correctly, especially when max line width is set - https://bugs.eclipse.org/303519
  *     Mateusz Matela <mateusz.matela@gmail.com> - [formatter] IndexOutOfBoundsException in TokenManager - https://bugs.eclipse.org/462945
+ *     Mateusz Matela <mateusz.matela@gmail.com> - [formatter] follow up bug for comments - https://bugs.eclipse.org/458208
  *******************************************************************************/
 package org.eclipse.jdt.core.tests.formatter;
 
@@ -1372,7 +1373,6 @@
 // see also bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=287462
 public void testBug198074_dup201022() throws JavaModelException {
 	this.formatterPrefs.join_wrapped_lines = false;
-	this.formatterPrefs.wrap_before_binary_operator = false;
 	String source =
 		"public class Test {\n" +
 		"\n" +
@@ -1399,7 +1399,6 @@
 // duplicate bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=213700
 public void testBug198074_dup213700() throws JavaModelException {
 	this.formatterPrefs.join_wrapped_lines = false;
-	this.formatterPrefs.wrap_before_binary_operator = false;
 	String source =
 		"public class Test {\n" +
 		"\n" +
@@ -1906,7 +1905,8 @@
 		"@MessageDriven(mappedName = \"filiality/SchedulerMQService\",\n" + 
 		"		activationConfig = {\n" + 
 		"				@ActivationConfigProperty(propertyName = \"cronTrigger\",\n" + 
-		"						propertyValue = \"0/10 * * * * ?\") })\n" + 
+		"						propertyValue = \"0/10 * * * * ?\")\n" + 
+		"		})\n" + 
 		"@RunAs(\"admin\")\n" + 
 		"@ResourceAdapter(\"quartz-ra.rar\")\n" + 
 		"@TransactionAttribute(TransactionAttributeType.NOT_SUPPORTED)\n" + 
@@ -8041,9 +8041,11 @@
 		"public class X07 {\n" + 
 		"\n" + 
 		"	static final long[] jjtoToken = {\n" + 
-		"			0x7fbfecffL, };\n" + 
+		"			0x7fbfecffL,\n" + 
+		"	};\n" + 
 		"	static final long[] jjtoSkip = {\n" + 
-		"			0x400000L, };\n" + 
+		"			0x400000L,\n" + 
+		"	};\n" + 
 		"\n" + 
 		"}\n"
 	);
@@ -8072,10 +8074,12 @@
 		"\n" + 
 		"	static final long[] jjtoToken =\n" + 
 		"	{\n" + 
-		"			0x7fbfecffL, };\n" + 
+		"			0x7fbfecffL,\n" + 
+		"	};\n" + 
 		"	static final long[] jjtoSkip =\n" + 
 		"	{\n" + 
-		"			0x400000L, };\n" +
+		"			0x400000L,\n" +
+		"	};\n" + 
 		"\n" + 
 		"}\n"
 	);
@@ -8124,7 +8128,8 @@
 		"public class X09 {\n" + 
 		"	public Class[] getAdapterList() {\n" + 
 		"		return new Class[] {\n" + 
-		"				IWorkbenchAdapter.class };\n" + 
+		"				IWorkbenchAdapter.class\n" + 
+		"		};\n" + 
 		"	}\n" + 
 		"}\n"
 	);
@@ -8796,7 +8801,6 @@
 }
 public void testBug330313_wksp1_25_njl() {
 	this.formatterPrefs.join_wrapped_lines = false;
-	this.formatterPrefs.wrap_before_binary_operator = false;
 	String source =
 		"package wksp1;\n" + 
 		"\n" + 
@@ -8811,7 +8815,6 @@
 }
 public void testBug330313_wksp1_26_njl() {
 	this.formatterPrefs.join_wrapped_lines = false;
-	this.formatterPrefs.wrap_before_binary_operator = false;
 	String source =
 		"package wksp1;\n" + 
 		"\n" + 
@@ -8962,7 +8965,6 @@
 }
 public void testBug330313_wksp1_30_njl() {
 	this.formatterPrefs.join_wrapped_lines = false;
-	this.formatterPrefs.wrap_before_binary_operator = false;
 	setPageWidth80();
 	String source =
 		"package wksp1;\n" + 
@@ -9083,7 +9085,6 @@
 }
 public void testBug330313_wksp1_33_njl() {
 	this.formatterPrefs.join_wrapped_lines = false;
-	this.formatterPrefs.wrap_before_binary_operator = false;
 	String source =
 		"package wksp1;\n" + 
 		"\n" + 
@@ -9106,8 +9107,8 @@
 		"	void foo() {\n" + 
 		"		if (inMetaTag &&\n" + 
 		"				(t1.image.equalsIgnoreCase(\"name\") ||\n" + 
-		"						t1.image.equalsIgnoreCase(\"HTTP-EQUIV\")) &&\n" + 
-		"				t2 != null) {\n" + 
+		"						t1.image.equalsIgnoreCase(\"HTTP-EQUIV\"))\n" + 
+		"				&& t2 != null) {\n" + 
 		"			currentMetaTag = t2.image.toLowerCase();\n" + 
 		"		}\n" + 
 		"	}\n" + 
@@ -9305,7 +9306,8 @@
 		"	 * 		\"GeneralPage.DoubleClick\", resName, 1,\n" + 
 		"	 * 		new String[][] {\n" + 
 		"	 * 				{ \"Open Browser\", \"open\" },\n" + 
-		"	 * 				{ \"Expand Tree\", \"expand\" } },\n" + 
+		"	 * 				{ \"Expand Tree\", \"expand\" }\n" + 
+		"	 * 		},\n" + 
 		"	 * 		parent);\n" + 
 		"	 * </pre>\n" + 
 		"	 */\n" + 
@@ -9337,7 +9339,8 @@
 		"			/* INACTIVE */ { \"INACTIVE\", \"PARTLY_ACTIVE\", \"PARTLY_ACTIVE\" },\n" + 
 		"			/* PARTLY_ACTIVE */ { \"PARTLY_ACTIVE\", \"PARTLY_ACTIVE\",\n" + 
 		"					\"PARTLY_ACTIVE\" },\n" + 
-		"			/* ACTIVE */ { \"PARTLY_ACTIVE\", \"PARTLY_ACTIVE\", \"ACTIVE\" } };\n" + 
+		"			/* ACTIVE */ { \"PARTLY_ACTIVE\", \"PARTLY_ACTIVE\", \"ACTIVE\" }\n" + 
+		"	};\n" + 
 		"}\n"
 	);
 }
@@ -9508,7 +9511,8 @@
 		"				user,\n" + 
 		"				revision,\n" + 
 		"				String.valueOf(delta),\n" + 
-		"				line });\n" + 
+		"				line\n" + 
+		"		});\n" + 
 		"	}\n" + 
 		"}\n"
 	);
@@ -9611,7 +9615,8 @@
 		"							IWorkbenchThemeConstants.INACTIVE_TAB_TEXT_COLOR),\n" + 
 		"					new Color[] {\n" + 
 		"							colorRegistry.get(\n" + 
-		"									IWorkbenchThemeConstants.INACTIVE_TAB_BG_START) },\n" + 
+		"									IWorkbenchThemeConstants.INACTIVE_TAB_BG_START)\n" + 
+		"					},\n" + 
 		"					new int[0],\n" + 
 		"					true);\n" + 
 		"		}\n" + 
@@ -9780,7 +9785,8 @@
 		"								public char[][] getCompoundName() {\n" + 
 		"									return EvaluationConstants.ROOT_COMPOUND_NAME;\n" + 
 		"								}\n" + 
-		"							} },\n" + 
+		"							}\n" + 
+		"					},\n" + 
 		"					null);\n" + 
 		"		}\n" + 
 		"	}\n" + 
@@ -9985,7 +9991,8 @@
 		"								return info.getLocal()\n" + 
 		"										.getType() == IResource.FILE;\n" + 
 		"							}\n" + 
-		"						} }),\n" + 
+		"						}\n" + 
+		"				}),\n" + 
 		"				// Conflicting changes of files will fail if the local is not\n" + 
 		"				// managed\n" + 
 		"				// or is an addition\n" + 
@@ -10012,7 +10019,8 @@
 		"								}\n" + 
 		"								return false;\n" + 
 		"							}\n" + 
-		"						} }),\n" + 
+		"						}\n" + 
+		"				}),\n" + 
 		"				// Conflicting changes involving a deletion on one side will\n" + 
 		"				// aways fail\n" + 
 		"				new AndSyncInfoFilter(new FastSyncInfoFilter[] {\n" + 
@@ -10031,7 +10039,8 @@
 		"											&& !base.equals(remote));\n" + 
 		"								}\n" + 
 		"							}\n" + 
-		"						} }),\n" + 
+		"						}\n" + 
+		"				}),\n" + 
 		"				// Conflicts where the file type is binary will work but are not\n" + 
 		"				// merged\n" + 
 		"				// so they should be skipped\n" + 
@@ -10060,9 +10069,11 @@
 		"								}\n" + 
 		"								return false;\n" + 
 		"							}\n" + 
-		"						} }),\n" + 
+		"						}\n" + 
+		"				}),\n" + 
 		"				// Outgoing changes may not fail but they are skipped as well\n" + 
-		"				new SyncInfoDirectionFilter(SyncInfo.OUTGOING) });\n" + 
+		"				new SyncInfoDirectionFilter(SyncInfo.OUTGOING)\n" + 
+		"		});\n" + 
 		"	}\n" + 
 		"}\n"
 	);
@@ -10113,7 +10124,8 @@
 		"					{ 104, 20 },\n" + 
 		"					{ 108, 21 },\n" + 
 		"					{ 12, 1856 },\n" + 
-		"					{ 13, 1920 } }, };\n" + 
+		"					{ 13, 1920 } },\n" + 
+		"	};\n" + 
 		"}\n"
 	);
 }
@@ -10254,7 +10266,8 @@
 		"					UNKNOWN,\n" + 
 		"					UNKNOWN,\n" + 
 		"					UNKNOWN,\n" + 
-		"					UNKNOWN } };\n" + 
+		"					UNKNOWN }\n" + 
+		"	};\n" + 
 		"\n" + 
 		"}\n"
 	);
@@ -10300,7 +10313,8 @@
 		"					\"READ_POTENTIAL\",\n" + 
 		"					\"UNKNOWN\",\n" + 
 		"					\"UNKNOWN\",\n" + 
-		"					\"UNKNOWN\" }, };\n" + 
+		"					\"UNKNOWN\" },\n" + 
+		"	};\n" + 
 		"\n" + 
 		"}\n"
 	);
@@ -10348,7 +10362,8 @@
 		"					\"READ_POTENTIAL\",\n" + 
 		"					\"UNKNOWN\",\n" + 
 		"					\"UNKNOWN\",\n" + 
-		"					\"UNKNOWN\" }, };\n" + 
+		"					\"UNKNOWN\" },\n" + 
+		"	};\n" + 
 		"\n" + 
 		"}\n"
 	);
@@ -10389,7 +10404,8 @@
 		"                    \"1234567890123456789012345678901234567890\" },\n" + 
 		"            /* Comment 3 */ {\n" + 
 		"                    \"ABCDEFGHIJKLMNOPQRSTUVWXYZ______________\",\n" + 
-		"                    \"ABCDEFGHIJKLMNOPQRSTUVWXYZ______________\" }, };\n" + 
+		"                    \"ABCDEFGHIJKLMNOPQRSTUVWXYZ______________\" },\n" + 
+		"    };\n" + 
 		"\n" + 
 		"}\n"
 	);
@@ -10720,5 +10736,157 @@
 	String source = "/**/int f;";
 	formatSource(source, source, CodeFormatter.K_STATEMENTS);
 }
-
+/**
+ * @bug 458208: [formatter] follow up bug for comments 
+ * @test test a space is not added after a lambda expression in parenthesis
+ * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=458208#c2"
+ */
+public void testBug458208() throws Exception {
+	String source =
+		"package p;\n" + 
+		"import java.util.function.IntConsumer;\n" + 
+		"class TestInlineLambda1 {\n" + 
+		"	{\n" + 
+		"		IntConsumer op = (x -> {}    );\n" + 
+		"	}\n" + 
+		"}\n";
+	formatSource(source,
+		"package p;\n" + 
+		"\n" + 
+		"import java.util.function.IntConsumer;\n" + 
+		"\n" + 
+		"class TestInlineLambda1 {\n" + 
+		"	{\n" + 
+		"		IntConsumer op = (x -> {\n" + 
+		"		});\n" + 
+		"	}\n" + 
+		"}\n"
+	);
+}
+/**
+ * @bug 458208: [formatter] follow up bug for comments 
+ * @test test that comments in switch statements are properly indented
+ * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=458208#c21"
+ */
+public void testBug458208b() throws Exception {
+	formatSource(
+		"package p;\n" + 
+		"\n" + 
+		"public class C1 {\n" + 
+		"	void foo(int x) {\n" + 
+		"		switch (x) {\n" + 
+		"		// case 1\n" + 
+		"		case 1:\n" + 
+		"			break;\n" + 
+		"		// case 2\n" + 
+		"		case 2:\n" + 
+		"			break;\n" + 
+		"		// no more cases\n" + 
+		"		}\n" + 
+		"	}\n" + 
+		"\n" + 
+		"	int bar(int x) {\n" + 
+		"		while (true) {\n" + 
+		"			int y = 9;\n" + 
+		"			switch (x) {\n" + 
+		"			// case 1\n" + 
+		"			case 1:\n" + 
+		"				// should return\n" + 
+		"				return y;\n" + 
+		"			// case 2\n" + 
+		"			case 2:\n" + 
+		"				// should break\n" + 
+		"				break;\n" + 
+		"			case 3:\n" + 
+		"				// TODO\n" + 
+		"			}\n" + 
+		"		}\n" + 
+		"	}\n" + 
+		"}\n"
+	);
+}
+/**
+ * @bug 458208: [formatter] follow up bug for comments 
+ * @test test that elements separated with empty lines are properly indented
+ * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=458208#c18"
+ */
+public void testBug458208c() throws Exception {
+	final int wrapAllOnColumn = Alignment.M_NEXT_PER_LINE_SPLIT + Alignment.M_INDENT_ON_COLUMN + Alignment.M_FORCE;
+	this.formatterPrefs.alignment_for_enum_constants = wrapAllOnColumn;
+	this.formatterPrefs.alignment_for_arguments_in_enum_constant = wrapAllOnColumn;
+	this.formatterPrefs.alignment_for_expressions_in_array_initializer = wrapAllOnColumn;
+	String source = 
+		"package p;\n" + 
+		"\n" + 
+		"public enum TestEnum {\n" + 
+		"	FIRST_ENUM(\"first type\",\n" + 
+		"	           new SomeClass(),\n" + 
+		"	           new OtherEnumType[] { OtherEnumType.FOO }),\n" + 
+		"\n" + 
+		"	SECOND_ENUM(\"second type\",\n" + 
+		"	            new SomeClassOtherClass(),\n" + 
+		"	            new OtherEnumType[] { OtherEnumType.BAR }),\n" + 
+		"\n" + 
+		"	THIRD_ENUM(\"third type\",\n" + 
+		"	            new YetAnotherClass(),\n" + 
+		"	            new OtherEnumType[] { OtherEnumType.FOOBAR,\n" + 
+		"	                                  OtherEnumType.FOOBARBAZ,\n" + 
+		"\n" + 
+		"	                                  OtherEnumType.LONGERFOOBARBAZ,\n" + 
+		"	                                  OtherEnumType.MORELETTERSINHERE });\n" + 
+		"\n" + 
+		"	/* data members and methods go here */\n" + 
+		"	TestEnum(String s, Cls s1, OtherEnumType[] e) {\n" + 
+		"	}\n" + 
+		"}";
+	formatSource(source,
+		"package p;\n" + 
+		"\n" + 
+		"public enum TestEnum {\n" + 
+		"						FIRST_ENUM(	\"first type\",\n" + 
+		"									new SomeClass(),\n" + 
+		"									new OtherEnumType[] { OtherEnumType.FOO }),\n" + 
+		"\n" + 
+		"						SECOND_ENUM(\"second type\",\n" + 
+		"									new SomeClassOtherClass(),\n" + 
+		"									new OtherEnumType[] { OtherEnumType.BAR }),\n" + 
+		"\n" + 
+		"						THIRD_ENUM(	\"third type\",\n" + 
+		"									new YetAnotherClass(),\n" + 
+		"									new OtherEnumType[] {	OtherEnumType.FOOBAR,\n" + 
+		"															OtherEnumType.FOOBARBAZ,\n" + 
+		"\n" + 
+		"															OtherEnumType.LONGERFOOBARBAZ,\n" + 
+		"															OtherEnumType.MORELETTERSINHERE });\n" + 
+		"\n" + 
+		"	/* data members and methods go here */\n" + 
+		"	TestEnum(String s, Cls s1, OtherEnumType[] e) {\n" + 
+		"	}\n" + 
+		"}"
+	);
+}
+/**
+ * @bug 458208: [formatter] follow up bug for comments 
+ * @test test that enum constants are not indented with spaces when "Use spaces to indent wrapped lines" is on
+ * @see "https://bugs.eclipse.org/bugs/show_bug.cgi?id=458208#c24"
+ */
+public void testBug458208d() throws Exception {
+	this.formatterPrefs.alignment_for_enum_constants = Alignment.M_COMPACT_SPLIT;
+	this.formatterPrefs.use_tabs_only_for_leading_indentations = true;
+	setPageWidth80();
+	String source = 
+		"package p;\n" + 
+		"\n" + 
+		"public enum TestEnum {\n" + 
+		"	ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, ELEVEN, TWELWE, THIRTEEN, FOURTEEN, FIFTEEN;\n" + 
+		"}";
+	formatSource(source,
+		"package p;\n" + 
+		"\n" + 
+		"public enum TestEnum {\n" + 
+		"	ONE, TWO, THREE, FOUR, FIVE, SIX, SEVEN, EIGHT, NINE, TEN, ELEVEN, TWELWE,\n" + 
+		"	THIRTEEN, FOURTEEN, FIFTEEN;\n" + 
+		"}"
+	);
+}
 }
diff --git a/org.eclipse.jdt.core/eclipse.jdt.ui.patch.txt b/org.eclipse.jdt.core/eclipse.jdt.ui.patch.txt
deleted file mode 100644
index 676563d..0000000
--- a/org.eclipse.jdt.core/eclipse.jdt.ui.patch.txt
+++ /dev/null
@@ -1,114 +0,0 @@
-### Eclipse Workspace Patch 1.0
-#P org.eclipse.jdt.ui
-diff --git ui/org/eclipse/jdt/internal/ui/preferences/formatter/IndentationTabPage.java ui/org/eclipse/jdt/internal/ui/preferences/formatter/IndentationTabPage.java
-index bbcb3bb..949bf62 100644
---- ui/org/eclipse/jdt/internal/ui/preferences/formatter/IndentationTabPage.java
-+++ ui/org/eclipse/jdt/internal/ui/preferences/formatter/IndentationTabPage.java
-@@ -19,8 +19,6 @@
- import org.eclipse.swt.widgets.Composite;
- import org.eclipse.swt.widgets.Group;
- 
--import org.eclipse.core.runtime.Assert;
--
- import org.eclipse.jdt.core.JavaCore;
- import org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants;
- 
-@@ -60,7 +58,6 @@
- 	"}";//$NON-NLS-1$
- 
- 	private CompilationUnitPreview fPreview;
--	private String fOldTabChar= null;
- 
- 	public IndentationTabPage(ModifyDialog modifyDialog, Map<String, String> workingValues) {
- 		super(modifyDialog, workingValues);
-@@ -79,21 +76,17 @@
- 		};
- 		final ComboPreference tabPolicy= createComboPref(generalGroup, numColumns, FormatterMessages.IndentationTabPage_general_group_option_tab_policy, DefaultCodeFormatterConstants.FORMATTER_TAB_CHAR, tabPolicyValues, tabPolicyLabels);
- 		final CheckboxPreference onlyForLeading= createCheckboxPref(generalGroup, numColumns, FormatterMessages.IndentationTabPage_use_tabs_only_for_leading_indentations, DefaultCodeFormatterConstants.FORMATTER_USE_TABS_ONLY_FOR_LEADING_INDENTATIONS, FALSE_TRUE);
--		final NumberPreference indentSize= createNumberPref(generalGroup, numColumns, FormatterMessages.IndentationTabPage_general_group_option_indent_size, DefaultCodeFormatterConstants.FORMATTER_TAB_SIZE, 0, 32);
-+		final NumberPreference indentSize= createNumberPref(generalGroup, numColumns, FormatterMessages.IndentationTabPage_general_group_option_indent_size, DefaultCodeFormatterConstants.FORMATTER_INDENTATION_SIZE, 0, 32);
- 		final NumberPreference tabSize= createNumberPref(generalGroup, numColumns, FormatterMessages.IndentationTabPage_general_group_option_tab_size, DefaultCodeFormatterConstants.FORMATTER_TAB_SIZE, 0, 32);
- 
--		String tabchar= fWorkingValues.get(DefaultCodeFormatterConstants.FORMATTER_TAB_CHAR);
--		updateTabPreferences(tabchar, tabSize, indentSize, onlyForLeading);
--		tabPolicy.addObserver(new Observer() {
-+		updateTabPreferences(indentSize, onlyForLeading);
-+		Observer tabObserver = new Observer() {
- 			public void update(Observable o, Object arg) {
--				updateTabPreferences((String) arg, tabSize, indentSize, onlyForLeading);
-+				updateTabPreferences(indentSize, onlyForLeading);
- 			}
--		});
--		tabSize.addObserver(new Observer() {
--			public void update(Observable o, Object arg) {
--				indentSize.updateWidget();
--			}
--		});
-+		};
-+		tabPolicy.addObserver(tabObserver);
-+		tabSize.addObserver(tabObserver);
- 
- 		final Group typeMemberGroup= createGroup(numColumns, composite, FormatterMessages.IndentationTabPage_field_alignment_group_title);
- 		createCheckboxPref(typeMemberGroup, numColumns, FormatterMessages.IndentationTabPage_field_alignment_group_align_fields_in_columns, DefaultCodeFormatterConstants.FORMATTER_ALIGN_TYPE_MEMBERS_ON_COLUMNS, FALSE_TRUE);
-@@ -141,50 +134,17 @@
-         fPreview.update();
-     }
- 
--	private void updateTabPreferences(String tabPolicy, NumberPreference tabPreference, NumberPreference indentPreference, CheckboxPreference onlyForLeading) {
--		/*
--		 * If the tab-char is SPACE (or TAB), INDENTATION_SIZE
--		 * preference is not used by the core formatter. We piggy back the
--		 * visual tab length setting in that preference in that case. If the
--		 * user selects MIXED, we use the previous TAB_SIZE preference as the
--		 * new INDENTATION_SIZE (as this is what it really is) and set the
--		 * visual tab size to the value piggy backed in the INDENTATION_SIZE
--		 * preference. See also CodeFormatterUtil.
--		 */
--		if (DefaultCodeFormatterConstants.MIXED.equals(tabPolicy)) {
--			if (JavaCore.SPACE.equals(fOldTabChar) || JavaCore.TAB.equals(fOldTabChar))
--				swapTabValues();
--			tabPreference.setEnabled(true);
--			tabPreference.setKey(DefaultCodeFormatterConstants.FORMATTER_TAB_SIZE);
--			indentPreference.setEnabled(true);
--			indentPreference.setKey(DefaultCodeFormatterConstants.FORMATTER_INDENTATION_SIZE);
--			onlyForLeading.setEnabled(true);
--		} else if (JavaCore.SPACE.equals(tabPolicy)) {
--			if (DefaultCodeFormatterConstants.MIXED.equals(fOldTabChar))
--				swapTabValues();
--			tabPreference.setEnabled(true);
--			tabPreference.setKey(DefaultCodeFormatterConstants.FORMATTER_INDENTATION_SIZE);
--			indentPreference.setEnabled(true);
--			indentPreference.setKey(DefaultCodeFormatterConstants.FORMATTER_TAB_SIZE);
--			onlyForLeading.setEnabled(false);
--		} else if (JavaCore.TAB.equals(tabPolicy)) {
--			if (DefaultCodeFormatterConstants.MIXED.equals(fOldTabChar))
--				swapTabValues();
--			tabPreference.setEnabled(true);
--			tabPreference.setKey(DefaultCodeFormatterConstants.FORMATTER_TAB_SIZE);
--			indentPreference.setEnabled(false);
--			indentPreference.setKey(DefaultCodeFormatterConstants.FORMATTER_TAB_SIZE);
--			onlyForLeading.setEnabled(true);
--		} else {
--			Assert.isTrue(false);
--		}
--		fOldTabChar= tabPolicy;
--	}
-+	private void updateTabPreferences(NumberPreference indentPreference, CheckboxPreference onlyForLeading) {
-+		String tabPolicy = fWorkingValues.get(DefaultCodeFormatterConstants.FORMATTER_TAB_CHAR);
-+		onlyForLeading.setEnabled(!JavaCore.SPACE.equals(tabPolicy));
- 
--	private void swapTabValues() {
--		String tabSize= fWorkingValues.get(DefaultCodeFormatterConstants.FORMATTER_TAB_SIZE);
--		String indentSize= fWorkingValues.get(DefaultCodeFormatterConstants.FORMATTER_INDENTATION_SIZE);
--		fWorkingValues.put(DefaultCodeFormatterConstants.FORMATTER_TAB_SIZE, indentSize);
--		fWorkingValues.put(DefaultCodeFormatterConstants.FORMATTER_INDENTATION_SIZE, tabSize);
-+		if (JavaCore.TAB.equals(tabPolicy)) {
-+			// indentation size preference must be disabled and show the same value as tab size 
-+			String tabSize= fWorkingValues.get(DefaultCodeFormatterConstants.FORMATTER_TAB_SIZE);
-+			fWorkingValues.put(DefaultCodeFormatterConstants.FORMATTER_INDENTATION_SIZE, tabSize);
-+			indentPreference.setEnabled(false);
-+		} else {
-+			indentPreference.setEnabled(true);
-+		}
- 	}
- }
\ No newline at end of file
diff --git a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/DefaultCodeFormatter.java b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/DefaultCodeFormatter.java
index 7cceb88..f7a3580 100644
--- a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/DefaultCodeFormatter.java
+++ b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/DefaultCodeFormatter.java
@@ -11,6 +11,7 @@
  *								bug 404146 - [1.7][compiler] nested try-catch-finally-blocks leads to unrunnable Java byte code
  *     Harry Terkelsen (het@google.com) - Bug 449262 - Allow the use of third-party Java formatters
  *     Mateusz Matela <mateusz.matela@gmail.com> - [formatter] Formatter does not format Java code correctly, especially when max line width is set - https://bugs.eclipse.org/303519
+ *     Mateusz Matela <mateusz.matela@gmail.com> - [formatter] follow up bug for comments - https://bugs.eclipse.org/458208
  *******************************************************************************/
 package org.eclipse.jdt.internal.formatter;
 
@@ -369,7 +370,7 @@
 	private void prepareWraps(int kind) {
 		WrapPreparator wrapPreparator = new WrapPreparator(this.tokenManager, this.workingOptions, kind);
 		this.astRoot.accept(wrapPreparator);
-		wrapPreparator.finishUp();
+		wrapPreparator.finishUp(this.astRoot);
 	}
 
 	/**
diff --git a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/LineBreaksPreparator.java b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/LineBreaksPreparator.java
index f7ff003..32640ec 100644
--- a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/LineBreaksPreparator.java
+++ b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/LineBreaksPreparator.java
@@ -8,6 +8,7 @@
  * Contributors:
  *     Mateusz Matela <mateusz.matela@gmail.com> - [formatter] Formatter does not format Java code correctly, especially when max line width is set - https://bugs.eclipse.org/303519
  *     Mateusz Matela <mateusz.matela@gmail.com> - [formatter] IndexOutOfBoundsException in TokenManager - https://bugs.eclipse.org/462945
+ *     Mateusz Matela <mateusz.matela@gmail.com> - [formatter] follow up bug for comments - https://bugs.eclipse.org/458208
  *******************************************************************************/
 package org.eclipse.jdt.internal.formatter;
 
@@ -54,6 +55,7 @@
 import org.eclipse.jdt.core.dom.Modifier;
 import org.eclipse.jdt.core.dom.NormalAnnotation;
 import org.eclipse.jdt.core.dom.PackageDeclaration;
+import org.eclipse.jdt.core.dom.ReturnStatement;
 import org.eclipse.jdt.core.dom.SingleMemberAnnotation;
 import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
 import org.eclipse.jdt.core.dom.Statement;
@@ -291,35 +293,41 @@
 		handleBracedCode(node, node.getExpression(), this.options.brace_position_for_switch,
 				this.options.indent_switchstatements_compare_to_switch, true);
 
+		List<Statement> statements = node.statements();
 		if (this.options.indent_switchstatements_compare_to_cases) {
-			int openBraceIndex = this.tm.firstIndexIn(node, TokenNameLBRACE);
-			this.tm.get(openBraceIndex + 1).indent();
-			int closeBraceIndex = this.tm.lastIndexIn(node, TokenNameRBRACE);
-			this.tm.get(closeBraceIndex).unindent();
+			int nonBreakStatementEnd = -1;
+			for (Statement statement : statements) {
+				if (statement instanceof SwitchCase) {
+					if (nonBreakStatementEnd >= 0) {
+						// indent only comments between previous and current statement
+						this.tm.get(nonBreakStatementEnd + 1).indent();
+						this.tm.firstTokenIn(statement, -1).unindent();
+					}
+				} else if (!(statement instanceof BreakStatement || statement instanceof Block)) {
+					indent(statement);
+				}
+				nonBreakStatementEnd = (statement instanceof BreakStatement || statement instanceof ReturnStatement)
+						? -1 : this.tm.lastIndexIn(statement, -1);
+			}
+			if (nonBreakStatementEnd >= 0) {
+				// indent comments between last statement and closing brace 
+				this.tm.get(nonBreakStatementEnd + 1).indent();
+				this.tm.lastTokenIn(node, TokenNameRBRACE).unindent();
+			}
+		}
+		if (this.options.indent_breaks_compare_to_cases) {
+			for (Statement statement : statements) {
+				if (statement instanceof BreakStatement)
+					indent(statement);
+			}
 		}
 
-		boolean isBreakStatement = false;
-		List<Statement> statements = node.statements();
 		for (Statement statement : statements) {
-			if (isBreakStatement) // actually, was break statement
-				this.tm.firstTokenIn(statement, -1).indent();
-			isBreakStatement = statement instanceof BreakStatement;
-			if (this.options.indent_switchstatements_compare_to_cases
-					&& (isBreakStatement || statement instanceof SwitchCase || statement instanceof Block)) {
-				unindent(statement);
-			}
 			if (statement instanceof Block)
 				continue; // will add break in visit(Block) if necessary
 			if (this.options.put_empty_statement_on_new_line || !(statement instanceof EmptyStatement))
 				breakLineBefore(statement);
-			if (isBreakStatement) {
-				if (this.options.indent_breaks_compare_to_cases)
-					indent(statement);
-				this.tm.firstTokenAfter(statement, -1).unindent();
-			}
 		}
-		if (isBreakStatement) // actually, was break statement
-			this.tm.lastTokenIn(node, -1).indent();
 
 		return true;
 	}
@@ -569,8 +577,7 @@
 
 	private void indent(ASTNode node) {
 		int startIndex = this.tm.firstIndexIn(node, -1);
-		while (startIndex > 0 && this.tm.get(startIndex - 1).isComment()
-				&& !(node.getParent() instanceof SwitchStatement))
+		while (startIndex > 0 && this.tm.get(startIndex - 1).isComment())
 			startIndex--;
 		this.tm.get(startIndex).indent();
 		int lastIndex = this.tm.lastIndexIn(node, -1);
@@ -578,16 +585,6 @@
 			this.tm.get(lastIndex + 1).unindent();
 	}
 
-	private void unindent(ASTNode node) {
-		int startIndex = this.tm.firstIndexIn(node, -1);
-		// no symmetry with indent(): unindent is only used in switch statement
-		// and should not include preceding comments
-		this.tm.get(startIndex).unindent();
-		int lastIndex = this.tm.lastIndexIn(node, -1);
-		if (lastIndex + 1 < this.tm.size())
-			this.tm.get(lastIndex + 1).indent();
-	}
-
 	public void finishUp() {
 		// the visits only noted where indents increase and decrease,
 		// now prepare actual indent values
diff --git a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/SpacePreparator.java b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/SpacePreparator.java
index da420e1..63a49a4 100644
--- a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/SpacePreparator.java
+++ b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/SpacePreparator.java
@@ -8,6 +8,7 @@
  * Contributors:
  *     Mateusz Matela <mateusz.matela@gmail.com> - [formatter] Formatter does not format Java code correctly, especially when max line width is set - https://bugs.eclipse.org/303519
  *     Mateusz Matela <mateusz.matela@gmail.com> - [formatter] IndexOutOfBoundsException in TokenManager - https://bugs.eclipse.org/462945
+ *     Mateusz Matela <mateusz.matela@gmail.com> - [formatter] follow up bug for comments - https://bugs.eclipse.org/458208
  *******************************************************************************/
 package org.eclipse.jdt.internal.formatter;
 
@@ -497,9 +498,11 @@
 		handleToken(node, TokenNameLBRACE, this.options.insert_space_before_opening_brace_in_block, false);
 		if (this.options.insert_space_after_closing_brace_in_block) {
 			int closeBraceIndex = this.tm.lastIndexIn(node, TokenNameRBRACE);
-			if (closeBraceIndex + 1 < this.tm.size()
-					&& this.tm.get(closeBraceIndex + 1).tokenType != TokenNameSEMICOLON)
-				this.tm.get(closeBraceIndex).spaceAfter();
+			if (closeBraceIndex + 1 < this.tm.size()) {
+				int nextToken = this.tm.get(closeBraceIndex + 1).tokenType;
+				if (nextToken != TokenNameSEMICOLON && nextToken != TokenNameRPAREN)
+					this.tm.get(closeBraceIndex).spaceAfter();
+			}
 		}
 		return true;
 	}
diff --git a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/WrapExecutor.java b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/WrapExecutor.java
index af9486b..c06dc48 100644
--- a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/WrapExecutor.java
+++ b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/WrapExecutor.java
@@ -7,6 +7,7 @@
  *
  * Contributors:
  *     Mateusz Matela <mateusz.matela@gmail.com> - [formatter] Formatter does not format Java code correctly, especially when max line width is set - https://bugs.eclipse.org/303519
+ *     Mateusz Matela <mateusz.matela@gmail.com> - [formatter] follow up bug for comments - https://bugs.eclipse.org/458208
  *******************************************************************************/
 package org.eclipse.jdt.internal.formatter.linewrap;
 
@@ -631,7 +632,7 @@
 
 	int getWrapIndent(Token token) {
 		WrapPolicy policy = token.getWrapPolicy();
-		if (policy == null || (token.getLineBreaksBefore() > 1 && !policy.isForced))
+		if (policy == null || (token.getLineBreaksBefore() > 1 && !policy.isForced && !policy.isTopPriority()))
 			return token.getIndent(); // no additional indentation after an empty line
 
 		if (this.options.never_indent_line_comments_on_first_column && token.tokenType == TokenNameCOMMENT_LINE
diff --git a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/WrapPreparator.java b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/WrapPreparator.java
index a49ce78..b973b6f 100644
--- a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/WrapPreparator.java
+++ b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/WrapPreparator.java
@@ -7,6 +7,7 @@
  *
  * Contributors:
  *     Mateusz Matela <mateusz.matela@gmail.com> - [formatter] Formatter does not format Java code correctly, especially when max line width is set - https://bugs.eclipse.org/303519
+ *     Mateusz Matela <mateusz.matela@gmail.com> - [formatter] follow up bug for comments - https://bugs.eclipse.org/458208
  *******************************************************************************/
 package org.eclipse.jdt.internal.formatter.linewrap;
 
@@ -20,10 +21,12 @@
 import static org.eclipse.jdt.internal.compiler.parser.TerminalTokens.TokenNameLPAREN;
 import static org.eclipse.jdt.internal.compiler.parser.TerminalTokens.TokenNameOR;
 import static org.eclipse.jdt.internal.compiler.parser.TerminalTokens.TokenNameQUESTION;
+import static org.eclipse.jdt.internal.compiler.parser.TerminalTokens.TokenNameRBRACE;
 import static org.eclipse.jdt.internal.compiler.parser.TerminalTokens.TokenNameRPAREN;
 import static org.eclipse.jdt.internal.compiler.parser.TerminalTokens.TokenNameStringLiteral;
 import static org.eclipse.jdt.internal.compiler.parser.TerminalTokens.TokenNameextends;
 import static org.eclipse.jdt.internal.compiler.parser.TerminalTokens.TokenNameimplements;
+import static org.eclipse.jdt.internal.compiler.parser.TerminalTokens.TokenNameIdentifier;
 import static org.eclipse.jdt.internal.compiler.parser.TerminalTokens.TokenNamenew;
 import static org.eclipse.jdt.internal.compiler.parser.TerminalTokens.TokenNamethrows;
 
@@ -358,14 +361,22 @@
 			if (operand instanceof InfixExpression && samePrecedence(node, (InfixExpression) operand)) {
 				findTokensToWrap((InfixExpression) operand, depth + 1);
 			}
-			if (this.options.wrap_before_binary_operator) {
-				int index = this.tm.firstIndexBefore(operand, -1);
-				while (this.tm.get(index).isComment())
-					index--;
-				assert node.getOperator().toString().equals(this.tm.toString(index));
-				this.wrapIndexes.add(index);
-			} else {
-				this.wrapIndexes.add(this.tm.firstIndexIn(operand, -1));
+			int indexBefore = this.tm.firstIndexBefore(operand, -1);
+			while (this.tm.get(indexBefore).isComment())
+				indexBefore--;
+			assert node.getOperator().toString().equals(this.tm.toString(indexBefore));
+			int indexAfter = this.tm.firstIndexIn(operand, -1);
+			this.wrapIndexes.add(this.options.wrap_before_binary_operator ? indexBefore : indexAfter);
+
+			if (!this.options.join_wrapped_lines) {
+				// TODO there should be an option for never joining wraps on opposite side of the operator
+				if (this.options.wrap_before_binary_operator) {
+					if (this.tm.countLineBreaksBetween(this.tm.get(indexAfter - 1), this.tm.get(indexAfter)) > 0)
+						this.wrapIndexes.add(indexAfter);
+				} else {
+					if (this.tm.countLineBreaksBetween(this.tm.get(indexBefore), this.tm.get(indexBefore - 1)) > 0)
+						this.wrapIndexes.add(indexBefore);
+				}
 			}
 		}
 	}
@@ -398,6 +409,17 @@
 			this.wrapGroupEnd = this.tm.lastIndexIn(node, -1);
 			handleWrap(this.options.alignment_for_expressions_in_array_initializer, node);
 		}
+		if (!this.options.join_wrapped_lines
+				&& !this.options.insert_new_line_before_closing_brace_in_array_initializer) {
+			// if there is a line break before the closing brace, formatter should treat it as a valid wrap to preserve
+			int closingBraceIndex = this.tm.lastIndexIn(node, TokenNameRBRACE);
+			Token closingBrace = this.tm.get(closingBraceIndex);
+			if (this.tm.countLineBreaksBetween(this.tm.get(closingBraceIndex - 1), closingBrace) == 1) {
+				int openingBraceIndex = this.tm.firstIndexIn(node, TokenNameLBRACE);
+				closingBrace.setWrapPolicy(
+						new WrapPolicy(0, openingBraceIndex, this.currentDepth, 1, true, false, -1, false));
+			}
+		}
 		return true;
 	}
 
@@ -679,12 +701,13 @@
 				indentOnColumn, topPriorityGroupEnd, false);
 	}
 
-	public void finishUp() {
+	public void finishUp(ASTNode astRoot) {
 		preserveExistingLineBreaks();
 		new WrapExecutor(this.tm, this.options).executeWraps();
 		if (this.fieldAligner != null)
 			this.fieldAligner.alignComments();
 		wrapComments();
+		fixEnumConstantIndents(astRoot);
 	}
 
 	private void preserveExistingLineBreaks() {
@@ -769,4 +792,18 @@
 			}
 		}
 	}
+
+	private void fixEnumConstantIndents(ASTNode astRoot) {
+		if (this.options.use_tabs_only_for_leading_indentations) {
+			// enum constants should be indented like other declarations, not like wrapped elements
+			astRoot.accept(new ASTVisitor() {
+
+				@Override
+				public boolean visit(EnumConstantDeclaration node) {
+					WrapPreparator.this.tm.firstTokenIn(node, TokenNameIdentifier).setWrapPolicy(null);
+					return true;
+				}
+			});
+		}
+	}
 }
