362260 - [formatter] New feature: count comment width from starting position
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterRegressionTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterRegressionTests.java
index a7b2573..ba62f38 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterRegressionTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterRegressionTests.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2016 IBM Corporation and others.
+ * Copyright (c) 2000, 2017 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -13918,4 +13918,83 @@
 	String input = getCompilationUnit("Formatter", "", "test493296", "A_in.java").getSource();
 	formatSource(input, getCompilationUnit("Formatter", "", "test493296", "A_out.java").getSource());
 }
+/**
+ * https://bugs.eclipse.org/362260 - [formatter] New feature: count comment width from starting position
+ */
+public void testBug362260a() throws JavaModelException {
+	setPageWidth80();
+	this.formatterPrefs.comment_line_length = 40;
+	this.formatterPrefs.comment_format_header = true;
+	this.formatterPrefs.comment_count_line_length_from_starting_position = true;
+	String input = getCompilationUnit("Formatter", "", "test362260", "A_in.java").getSource();
+	formatSource(input, getCompilationUnit("Formatter", "", "test362260", "A_out.java").getSource());
+}
+/**
+ * https://bugs.eclipse.org/362260 - [formatter] New feature: count comment width from starting position
+ */
+public void testBug362260b() throws JavaModelException {
+	setPageWidth80();
+	this.formatterPrefs.comment_line_length = 40;
+	this.formatterPrefs.comment_format_header = true;
+	this.formatterPrefs.comment_count_line_length_from_starting_position = true;
+	String input = getCompilationUnit("Formatter", "", "test362260", "B_in.java").getSource();
+	formatSource(input, getCompilationUnit("Formatter", "", "test362260", "B_out.java").getSource());
+}
+/**
+ * https://bugs.eclipse.org/362260 - [formatter] New feature: count comment width from starting position
+ */
+public void testBug362260c() throws JavaModelException {
+	setPageWidth80();
+	this.formatterPrefs.comment_line_length = 40;
+	this.formatterPrefs.comment_format_header = true;
+	this.formatterPrefs.comment_count_line_length_from_starting_position = true;
+	this.formatterPrefs.comment_new_lines_at_block_boundaries = false;
+	String input = getCompilationUnit("Formatter", "", "test362260", "C_in.java").getSource();
+	formatSource(input, getCompilationUnit("Formatter", "", "test362260", "C_out.java").getSource());
+}
+/**
+ * https://bugs.eclipse.org/362260 - [formatter] New feature: count comment width from starting position
+ */
+public void testBug362260d() throws JavaModelException {
+	setPageWidth80();
+	this.formatterPrefs.comment_line_length = 40;
+	this.formatterPrefs.comment_format_header = true;
+	this.formatterPrefs.comment_count_line_length_from_starting_position = true;
+	String input = getCompilationUnit("Formatter", "", "test362260", "D_in.java").getSource();
+	formatSource(input, getCompilationUnit("Formatter", "", "test362260", "D_out.java").getSource());
+}
+/**
+ * https://bugs.eclipse.org/362260 - [formatter] New feature: count comment width from starting position
+ */
+public void testBug362260e() throws JavaModelException {
+	setPageWidth80();
+	this.formatterPrefs.comment_line_length = 40;
+	this.formatterPrefs.comment_format_header = true;
+	this.formatterPrefs.comment_count_line_length_from_starting_position = true;
+	this.formatterPrefs.comment_new_lines_at_javadoc_boundaries = false;
+	String input = getCompilationUnit("Formatter", "", "test362260", "E_in.java").getSource();
+	formatSource(input, getCompilationUnit("Formatter", "", "test362260", "E_out.java").getSource());
+}
+/**
+ * https://bugs.eclipse.org/362260 - [formatter] New feature: count comment width from starting position
+ */
+public void testBug362260f() throws JavaModelException {
+	setPageWidth80();
+	this.formatterPrefs.comment_line_length = 40;
+	this.formatterPrefs.comment_count_line_length_from_starting_position = true;
+	this.formatterPrefs.comment_preserve_white_space_between_code_and_line_comments = true;
+	String input = getCompilationUnit("Formatter", "", "test362260", "F_in.java").getSource();
+	formatSource(input, getCompilationUnit("Formatter", "", "test362260", "F_out.java").getSource());
+}
+/**
+ * https://bugs.eclipse.org/362260 - [formatter] New feature: count comment width from starting position
+ */
+public void testBug362260g() throws JavaModelException {
+	setPageWidth80();
+	this.formatterPrefs.comment_line_length = 40;
+	this.formatterPrefs.comment_format_header = true;
+	this.formatterPrefs.comment_count_line_length_from_starting_position = true;
+	String input = getCompilationUnit("Formatter", "", "test362260", "G_in.java").getSource();
+	formatSource(input, getCompilationUnit("Formatter", "", "test362260", "G_out.java").getSource());
+}
 }
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/A_in.java b/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/A_in.java
new file mode 100644
index 0000000..58b7139
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/A_in.java
@@ -0,0 +1,25 @@
+// 45678901234567890123456789 1234567890 2
+// 45678901234567890123456789 12345678901
+class A {
+	// 45678901234567890123456789 1234567890 2
+	// 45678901234567890123456789 12345678901
+	int f() {
+		// 45678901234567890123456789 1234567890 2
+		// 45678901234567890123456789 12345678901
+
+		int a; // 45678901234567890123456789 1234567890 2
+		int b; // 45678901234567890123456789 12345678901
+
+		String c; // 45678901234567890123456789 1234567890 2
+		String d; // 45678901234567890123456789 12345678901
+
+		String e = "aaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaa"; // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
+
+		String f = "aaaaaa"; // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
+		String g = "aaaaaa"; //$NON-NLS-1$ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
+		String h = "aaaaaaaaaaaa"; //$NON-NLS-1$ 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
+		String i = "aaaaaaaaaaaa"; // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 //$NON-NLS-1$
+
+		f(); // 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
+	}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/A_out.java b/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/A_out.java
new file mode 100644
index 0000000..5aac587
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/A_out.java
@@ -0,0 +1,43 @@
+// 45678901234567890123456789 1234567890
+// 2
+// 45678901234567890123456789
+// 12345678901
+class A {
+	// 45678901234567890123456789 1234567890
+	// 2
+	// 45678901234567890123456789
+	// 12345678901
+	int f() {
+		// 45678901234567890123456789 1234567890
+		// 2
+		// 45678901234567890123456789
+		// 12345678901
+
+		int a; // 45678901234567890123456789 1234567890
+				// 2
+		int b; // 45678901234567890123456789
+				// 12345678901
+
+		String c; // 45678901234567890123456789 1234567890
+					// 2
+		String d; // 45678901234567890123456789
+					// 12345678901
+
+		String e = "aaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaa"; // 1 2 3 4 5 6 7 8 9
+															// 10 11 12 13 14 15
+															// 16 17 18 19 20
+
+		String f = "aaaaaa"; // 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
+								// 16 17 18 19 20
+		String g = "aaaaaa"; //$NON-NLS-1$ 1 2 3 4 5 6 7 8 9 10 11
+								// 12 13 14 15 16 17 18 19 20
+		String h = "aaaaaaaaaaaa"; //$NON-NLS-1$ 1 2 3 4 5 6 7 8 9 10 11
+									// 12 13 14 15 16 17 18 19 20
+		String i = "aaaaaaaaaaaa"; // 1 2 3 4 5 6 7 8 9 10 11 //$NON-NLS-1$
+									// 12 13 14 15 16 17 18 19 20
+
+		f(); // 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
+				// 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8
+				// 9 0 1 2 3 4 5 6 7 8 9 0
+	}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/B_in.java b/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/B_in.java
new file mode 100644
index 0000000..7857bc7
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/B_in.java
@@ -0,0 +1,36 @@
+/* 45678901234567890123456789 1234567 */
+/* 45678901234567890123456789 12345678 */
+/* 45678901234567890123456789 1234567890 2 */
+/* 45678901234567890123456789 12345678901 */
+class A {
+	/* 45678901234567890123456789 1234567 */
+	/* 45678901234567890123456789 12345678 */
+	/* 45678901234567890123456789 1234567890 2 */
+	/* 45678901234567890123456789 12345678901 */
+	int f() {
+		/* 45678901234567890123456789 1234567 */
+		/* 45678901234567890123456789 12345678 */
+		/* 45678901234567890123456789 1234567890 2 */
+		/* 45678901234567890123456789 12345678901 */
+
+		int a; /* 45678901234567890123456789 1234567 */
+		int b; /* 45678901234567890123456789 12345678 */
+		int c; /* 45678901234567890123456789 1234567890 2 */
+		int d; /* 45678901234567890123456789 12345678901 */
+
+		String e; /* 45678901234567890123456789 1234567 */
+		Atring f; /* 45678901234567890123456789 12345678 */
+		String g; /* 45678901234567890123456789 1234567890 2 */
+		String h; /* 45678901234567890123456789 12345678901 */
+
+		String i = "aaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaa"; /* 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 */
+		String j = "aaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaa"; /* 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 */
+		String k = "aaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaa"; /* 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 */
+
+		String l = "aaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaa"; /* 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 */
+		String m = "aaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaa"; /* 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 */
+		String n = "aaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; /* 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 */
+
+		f(); /* 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 */
+	}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/B_out.java b/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/B_out.java
new file mode 100644
index 0000000..73f8374
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/B_out.java
@@ -0,0 +1,96 @@
+/* 45678901234567890123456789 1234567 */
+/*
+ * 45678901234567890123456789 12345678
+ */
+/*
+ * 45678901234567890123456789 1234567890
+ * 2
+ */
+/*
+ * 45678901234567890123456789
+ * 12345678901
+ */
+class A {
+	/* 45678901234567890123456789 1234567 */
+	/*
+	 * 45678901234567890123456789 12345678
+	 */
+	/*
+	 * 45678901234567890123456789 1234567890
+	 * 2
+	 */
+	/*
+	 * 45678901234567890123456789
+	 * 12345678901
+	 */
+	int f() {
+		/* 45678901234567890123456789 1234567 */
+		/*
+		 * 45678901234567890123456789 12345678
+		 */
+		/*
+		 * 45678901234567890123456789 1234567890
+		 * 2
+		 */
+		/*
+		 * 45678901234567890123456789
+		 * 12345678901
+		 */
+
+		int a; /* 45678901234567890123456789 1234567 */
+		int b; /*
+				 * 45678901234567890123456789 12345678
+				 */
+		int c; /*
+				 * 45678901234567890123456789 1234567890
+				 * 2
+				 */
+		int d; /*
+				 * 45678901234567890123456789
+				 * 12345678901
+				 */
+
+		String e; /* 45678901234567890123456789 1234567 */
+		Atring f; /*
+					 * 45678901234567890123456789 12345678
+					 */
+		String g; /*
+					 * 45678901234567890123456789 1234567890
+					 * 2
+					 */
+		String h; /*
+					 * 45678901234567890123456789
+					 * 12345678901
+					 */
+
+		String i = "aaaaaaaaaaaaaaaa"
+				+ "aaaaaaaaaaaaaaa"; /* 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 */
+		String j = "aaaaaaaaaaaaaaaa"
+				+ "aaaaaaaaaaaaaaa"; /*
+										 * 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8
+										 */
+		String k = "aaaaaaaaaaaaaaaa"
+				+ "aaaaaaaaaaaaaaa"; /*
+										 * 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
+										 * 0
+										 */
+
+		String l = "aaaaaaaaaaaaaaaa"
+				+ "aaaaaaaaaaaaaaaaaaa"; /* 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 */
+		String m = "aaaaaaaaaaaaaaaa"
+				+ "aaaaaaaaaaaaaaaaaaaa"; /*
+											 * 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7
+											 */
+		String n = "aaaaaaaaaaaaaaaa"
+				+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; /*
+														 * 1 2 3 4 5 6 7 8 9 0 1
+														 * 2 3 4 5 6 7
+														 */
+
+		f(); /*
+				 * 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
+				 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8
+				 * 9 0 1 2 3 4 5 6 7 8 9 0
+				 */
+	}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/C_in.java b/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/C_in.java
new file mode 100644
index 0000000..7857bc7
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/C_in.java
@@ -0,0 +1,36 @@
+/* 45678901234567890123456789 1234567 */
+/* 45678901234567890123456789 12345678 */
+/* 45678901234567890123456789 1234567890 2 */
+/* 45678901234567890123456789 12345678901 */
+class A {
+	/* 45678901234567890123456789 1234567 */
+	/* 45678901234567890123456789 12345678 */
+	/* 45678901234567890123456789 1234567890 2 */
+	/* 45678901234567890123456789 12345678901 */
+	int f() {
+		/* 45678901234567890123456789 1234567 */
+		/* 45678901234567890123456789 12345678 */
+		/* 45678901234567890123456789 1234567890 2 */
+		/* 45678901234567890123456789 12345678901 */
+
+		int a; /* 45678901234567890123456789 1234567 */
+		int b; /* 45678901234567890123456789 12345678 */
+		int c; /* 45678901234567890123456789 1234567890 2 */
+		int d; /* 45678901234567890123456789 12345678901 */
+
+		String e; /* 45678901234567890123456789 1234567 */
+		Atring f; /* 45678901234567890123456789 12345678 */
+		String g; /* 45678901234567890123456789 1234567890 2 */
+		String h; /* 45678901234567890123456789 12345678901 */
+
+		String i = "aaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaa"; /* 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 */
+		String j = "aaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaa"; /* 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 */
+		String k = "aaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaa"; /* 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 */
+
+		String l = "aaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaa"; /* 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 */
+		String m = "aaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaa"; /* 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 */
+		String n = "aaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; /* 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 */
+
+		f(); /* 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 */
+	}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/C_out.java b/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/C_out.java
new file mode 100644
index 0000000..d7bc0ca
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/C_out.java
@@ -0,0 +1,63 @@
+/* 45678901234567890123456789 1234567 */
+/* 45678901234567890123456789
+ * 12345678 */
+/* 45678901234567890123456789 1234567890
+ * 2 */
+/* 45678901234567890123456789
+ * 12345678901 */
+class A {
+	/* 45678901234567890123456789 1234567 */
+	/* 45678901234567890123456789
+	 * 12345678 */
+	/* 45678901234567890123456789 1234567890
+	 * 2 */
+	/* 45678901234567890123456789
+	 * 12345678901 */
+	int f() {
+		/* 45678901234567890123456789 1234567 */
+		/* 45678901234567890123456789
+		 * 12345678 */
+		/* 45678901234567890123456789 1234567890
+		 * 2 */
+		/* 45678901234567890123456789
+		 * 12345678901 */
+
+		int a; /* 45678901234567890123456789 1234567 */
+		int b; /* 45678901234567890123456789
+				 * 12345678 */
+		int c; /* 45678901234567890123456789 1234567890
+				 * 2 */
+		int d; /* 45678901234567890123456789
+				 * 12345678901 */
+
+		String e; /* 45678901234567890123456789 1234567 */
+		Atring f; /* 45678901234567890123456789
+					 * 12345678 */
+		String g; /* 45678901234567890123456789 1234567890
+					 * 2 */
+		String h; /* 45678901234567890123456789
+					 * 12345678901 */
+
+		String i = "aaaaaaaaaaaaaaaa"
+				+ "aaaaaaaaaaaaaaa"; /* 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 */
+		String j = "aaaaaaaaaaaaaaaa"
+				+ "aaaaaaaaaaaaaaa"; /* 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7
+										 * 8 */
+		String k = "aaaaaaaaaaaaaaaa"
+				+ "aaaaaaaaaaaaaaa"; /* 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
+										 * 0 */
+
+		String l = "aaaaaaaaaaaaaaaa"
+				+ "aaaaaaaaaaaaaaaaaaa"; /* 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 */
+		String m = "aaaaaaaaaaaaaaaa"
+				+ "aaaaaaaaaaaaaaaaaaaa"; /* 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6
+											 * 7 */
+		String n = "aaaaaaaaaaaaaaaa"
+				+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; /* 1 2 3 4 5 6 7 8 9 0 1
+														 * 2 3 4 5 6 7 */
+
+		f(); /* 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
+				 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8
+				 * 9 0 1 2 3 4 5 6 7 8 9 0 */
+	}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/D_in.java b/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/D_in.java
new file mode 100644
index 0000000..71c9b44
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/D_in.java
@@ -0,0 +1,36 @@
+/** 5678901234567890123456789 1234567 */
+/** 45678901234567890123456789 1234567 */
+/** 45678901234567890123456789 1234567890 2 */
+/** 45678901234567890123456789 12345678901 */
+class A {
+	/** 5678901234567890123456789 1234567 */
+	/** 45678901234567890123456789 1234567 */
+	/** 45678901234567890123456789 1234567890 2 */
+	/** 45678901234567890123456789 12345678901 */
+	int f() {
+		/** 5678901234567890123456789 1234567 */
+		/** 45678901234567890123456789 1234567 */
+		/** 45678901234567890123456789 1234567890 2 */
+		/** 45678901234567890123456789 12345678901 */
+
+		int a; /** 5678901234567890123456789 1234567 */
+		int b; /** 45678901234567890123456789 1234567 */
+		int c; /** 45678901234567890123456789 1234567890 2 */
+		int d; /** 45678901234567890123456789 12345678901 */
+
+		String e; /** 5678901234567890123456789 1234567 */
+		String f; /** 45678901234567890123456789 1234567 */
+		String g; /** 45678901234567890123456789 1234567890 2 */
+		String h; /** 45678901234567890123456789 12345678901 */
+
+		String i = "aaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaa"; /** 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 */
+		String j = "aaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaa"; /** 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 */
+		String k = "aaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaa"; /** 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 */
+
+		String l = "aaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaa"; /** 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 */
+		String m = "aaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaa"; /** 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 */
+		String n = "aaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; /** 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 */
+
+		f(); /** 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 */
+	}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/D_out.java b/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/D_out.java
new file mode 100644
index 0000000..7487134
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/D_out.java
@@ -0,0 +1,96 @@
+/** 5678901234567890123456789 1234567 */
+/**
+ * 45678901234567890123456789 1234567
+ */
+/**
+ * 45678901234567890123456789 1234567890
+ * 2
+ */
+/**
+ * 45678901234567890123456789
+ * 12345678901
+ */
+class A {
+	/** 5678901234567890123456789 1234567 */
+	/**
+	 * 45678901234567890123456789 1234567
+	 */
+	/**
+	 * 45678901234567890123456789 1234567890
+	 * 2
+	 */
+	/**
+	 * 45678901234567890123456789
+	 * 12345678901
+	 */
+	int f() {
+		/** 5678901234567890123456789 1234567 */
+		/**
+		 * 45678901234567890123456789 1234567
+		 */
+		/**
+		 * 45678901234567890123456789 1234567890
+		 * 2
+		 */
+		/**
+		 * 45678901234567890123456789
+		 * 12345678901
+		 */
+
+		int a; /** 5678901234567890123456789 1234567 */
+		int b; /**
+				 * 45678901234567890123456789 1234567
+				 */
+		int c; /**
+				 * 45678901234567890123456789 1234567890
+				 * 2
+				 */
+		int d; /**
+				 * 45678901234567890123456789
+				 * 12345678901
+				 */
+
+		String e; /** 5678901234567890123456789 1234567 */
+		String f; /**
+					 * 45678901234567890123456789 1234567
+					 */
+		String g; /**
+					 * 45678901234567890123456789 1234567890
+					 * 2
+					 */
+		String h; /**
+					 * 45678901234567890123456789
+					 * 12345678901
+					 */
+
+		String i = "aaaaaaaaaaaaaaaa"
+				+ "aaaaaaaaaaaaaa"; /** 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 */
+		String j = "aaaaaaaaaaaaaaaa"
+				+ "aaaaaaaaaaaaaa"; /**
+									 * 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8
+									 */
+		String k = "aaaaaaaaaaaaaaaa"
+				+ "aaaaaaaaaaaaaa"; /**
+									 * 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
+									 * 0
+									 */
+
+		String l = "aaaaaaaaaaaaaaaa"
+				+ "aaaaaaaaaaaaaaaaaa"; /** 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 */
+		String m = "aaaaaaaaaaaaaaaa"
+				+ "aaaaaaaaaaaaaaaaaaa"; /**
+											 * 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7
+											 */
+		String n = "aaaaaaaaaaaaaaaa"
+				+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; /**
+														 * 1 2 3 4 5 6 7 8 9 0 1
+														 * 2 3 4 5 6 7
+														 */
+
+		f(); /**
+				 * 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
+				 * 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8
+				 * 9 0 1 2 3 4 5 6 7 8 9 0
+				 */
+	}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/E_in.java b/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/E_in.java
new file mode 100644
index 0000000..b898959
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/E_in.java
@@ -0,0 +1,36 @@
+/** 5678901234567890123456789 1234567 */
+/** 5678901234567890123456789 12345678 */
+/** 5678901234567890123456789 1234567890 2 */
+/** 5678901234567890123456789 12345678901 */
+class A {
+	/** 5678901234567890123456789 1234567 */
+	/** 5678901234567890123456789 12345678 */
+	/** 5678901234567890123456789 1234567890 2 */
+	/** 5678901234567890123456789 12345678901 */
+	int f() {
+		/** 5678901234567890123456789 1234567 */
+		/** 5678901234567890123456789 12345678 */
+		/** 5678901234567890123456789 1234567890 2 */
+		/** 5678901234567890123456789 12345678901 */
+
+		int a; /** 5678901234567890123456789 1234567 */
+		int b; /** 5678901234567890123456789 12345678 */
+		int c; /** 5678901234567890123456789 1234567890 2 */
+		int d; /** 5678901234567890123456789 12345678901 */
+
+		String e; /** 5678901234567890123456789 1234567 */
+		String f; /** 5678901234567890123456789 12345678 */
+		String g; /** 5678901234567890123456789 1234567890 2 */
+		String h; /** 5678901234567890123456789 12345678901 */
+
+		String i = "aaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaa"; /** 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 */
+		String j = "aaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaa"; /** 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 */
+		String k = "aaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaa"; /** 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 */
+
+		String l = "aaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaa"; /** 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 */
+		String m = "aaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaa"; /** 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 */
+		String n = "aaaaaaaaaaaaaaaa" + "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; /** 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 */
+
+		f(); /** 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 */
+	}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/E_out.java b/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/E_out.java
new file mode 100644
index 0000000..9dabac9
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/E_out.java
@@ -0,0 +1,63 @@
+/** 5678901234567890123456789 1234567 */
+/** 5678901234567890123456789
+ * 12345678 */
+/** 5678901234567890123456789 1234567890
+ * 2 */
+/** 5678901234567890123456789
+ * 12345678901 */
+class A {
+	/** 5678901234567890123456789 1234567 */
+	/** 5678901234567890123456789
+	 * 12345678 */
+	/** 5678901234567890123456789 1234567890
+	 * 2 */
+	/** 5678901234567890123456789
+	 * 12345678901 */
+	int f() {
+		/** 5678901234567890123456789 1234567 */
+		/** 5678901234567890123456789
+		 * 12345678 */
+		/** 5678901234567890123456789 1234567890
+		 * 2 */
+		/** 5678901234567890123456789
+		 * 12345678901 */
+
+		int a; /** 5678901234567890123456789 1234567 */
+		int b; /** 5678901234567890123456789
+				 * 12345678 */
+		int c; /** 5678901234567890123456789 1234567890
+				 * 2 */
+		int d; /** 5678901234567890123456789
+				 * 12345678901 */
+
+		String e; /** 5678901234567890123456789 1234567 */
+		String f; /** 5678901234567890123456789
+					 * 12345678 */
+		String g; /** 5678901234567890123456789 1234567890
+					 * 2 */
+		String h; /** 5678901234567890123456789
+					 * 12345678901 */
+
+		String i = "aaaaaaaaaaaaaaaa"
+				+ "aaaaaaaaaaaaaa"; /** 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 */
+		String j = "aaaaaaaaaaaaaaaa"
+				+ "aaaaaaaaaaaaaa"; /** 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7
+									 * 8 */
+		String k = "aaaaaaaaaaaaaaaa"
+				+ "aaaaaaaaaaaaaa"; /** 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8
+									 * 9 0 */
+
+		String l = "aaaaaaaaaaaaaaaa"
+				+ "aaaaaaaaaaaaaaaaaa"; /** 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 */
+		String m = "aaaaaaaaaaaaaaaa"
+				+ "aaaaaaaaaaaaaaaaaaa"; /** 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6
+											 * 7 */
+		String n = "aaaaaaaaaaaaaaaa"
+				+ "aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"; /** 1 2 3 4 5 6 7 8 9 0 1
+														 * 2 3 4 5 6 7 */
+
+		f(); /** 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8
+				 * 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7
+				 * 8 9 0 1 2 3 4 5 6 7 8 9 0 */
+	}
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/F_in.java b/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/F_in.java
new file mode 100644
index 0000000..f03745c
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/F_in.java
@@ -0,0 +1,8 @@
+class A {
+	int a;                  // 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
+	int aaaaaaa;            // 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
+	int aaaaaaaaaaaaaaaa;   // 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
+	
+	int aa;    		          // 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
+	int aa;     		          // 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/F_out.java b/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/F_out.java
new file mode 100644
index 0000000..9842d13
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/F_out.java
@@ -0,0 +1,18 @@
+class A {
+	int a;                  // 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
+			                  // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8
+			                  // 9 0
+	int aaaaaaa;            // 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
+				            // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8
+				            // 9 0
+	int aaaaaaaaaaaaaaaa;   // 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
+							   // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8
+							   // 9 0
+
+	int aa;    		          // 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
+			    		          // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8
+			    		          // 9 0
+	int aa;     		          // 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9
+			     		          // 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8
+			     		          // 9 0
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/G_in.java b/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/G_in.java
new file mode 100644
index 0000000..42b5909
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/G_in.java
@@ -0,0 +1,41 @@
+/**
+ * One two three four five six seven eight nine ten eleven twelve thirteen fourteen.
+ * <pre>
+ * int a = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 0;
+ * </pre>
+ */
+class A {
+	class B {
+		class C {
+			class D {
+				class E {
+					class F {
+						class G {
+							/**
+							 * One two three four five six seven eight nine ten eleven twelve thirteen fourteen.
+							 * <pre>
+							 * int a = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 0;
+							 * </pre>
+							 */
+							class H {
+								class I {
+									class J {
+										class K {
+											/**
+											 * One two three four five six seven eight nine ten eleven twelve thirteen fourteen.
+											 * <pre>
+											 * int a = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 0;
+											 * </pre>
+											 */
+											int a;
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/G_out.java b/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/G_out.java
new file mode 100644
index 0000000..d6f35f3
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/Formatter/test362260/G_out.java
@@ -0,0 +1,53 @@
+/**
+ * One two three four five six seven
+ * eight nine ten eleven twelve thirteen
+ * fourteen.
+ * 
+ * <pre>
+ * int a = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8
+ * 		+ 9 + 0;
+ * </pre>
+ */
+class A {
+	class B {
+		class C {
+			class D {
+				class E {
+					class F {
+						class G {
+							/**
+							 * One two three four five six seven
+							 * eight nine ten eleven twelve thirteen
+							 * fourteen.
+							 * 
+							 * <pre>
+							 * int a = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8
+							 * 		+ 9 + 0;
+							 * </pre>
+							 */
+							class H {
+								class I {
+									class J {
+										class K {
+											/**
+											 * One two three four five six seven
+											 * eight nine ten eleven twelve
+											 * thirteen fourteen.
+											 * 
+											 * <pre>
+											 * int a = 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9 + 0 + 1 + 2 + 3 + 4 + 5 + 6 + 7 + 8
+											 * 		+ 9 + 0;
+											 * </pre>
+											 */
+											int a;
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+	}
+}
\ No newline at end of file
diff --git a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/core/formatter/DefaultCodeFormatterConstants.java b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/core/formatter/DefaultCodeFormatterConstants.java
index 987a744..9f9f186 100644
--- a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/core/formatter/DefaultCodeFormatterConstants.java
+++ b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/core/formatter/DefaultCodeFormatterConstants.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2016 IBM Corporation and others.
+ * Copyright (c) 2000, 2017 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -1067,6 +1067,17 @@
 
 	/**
 	 * <pre>
+	 * FORMATTER / Option to control whether comments' line length will be counted from their starting position
+	 *     - option id:         "org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position"
+	 *     - possible values:   { TRUE, FALSE }
+	 *     - default:           FALSE
+	 * </pre>
+	 * @since 3.13
+	 */
+	public final static String FORMATTER_COMMENT_COUNT_LINE_LENGTH_FROM_STARTING_POSITION = "org.eclipse.jdt.core.formatter.comment.count_line_length_from_starting_position"; //$NON-NLS-1$
+
+	/**
+	 * <pre>
 	 * FORMATTER / Option to control whether block comments will have new lines at boundaries
 	 *     - option id:         "org.eclipse.jdt.core.formatter.comment.new_lines_at_block_boundaries"
 	 *     - possible values:   { TRUE, FALSE }
diff --git a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/DefaultCodeFormatterOptions.java b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/DefaultCodeFormatterOptions.java
index 45a9848..d35679a 100644
--- a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/DefaultCodeFormatterOptions.java
+++ b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/DefaultCodeFormatterOptions.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2016 IBM Corporation and others.
+ * Copyright (c) 2000, 2017 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -200,6 +200,7 @@
 	public boolean comment_insert_new_line_for_parameter;
 	public boolean comment_preserve_white_space_between_code_and_line_comments;
 	public int comment_line_length;
+	public boolean comment_count_line_length_from_starting_position;
 
 	public boolean use_tags;
 	public char[] disabling_tag;
@@ -514,6 +515,7 @@
 		options.put(DefaultCodeFormatterConstants.FORMATTER_COMMENT_INSERT_NEW_LINE_FOR_PARAMETER, this.comment_insert_new_line_for_parameter ? JavaCore.INSERT : JavaCore.DO_NOT_INSERT);
 		options.put(DefaultCodeFormatterConstants.FORMATTER_COMMENT_PRESERVE_WHITE_SPACE_BETWEEN_CODE_AND_LINE_COMMENT, this.comment_preserve_white_space_between_code_and_line_comments ? DefaultCodeFormatterConstants.TRUE : DefaultCodeFormatterConstants.FALSE);
 		options.put(DefaultCodeFormatterConstants.FORMATTER_COMMENT_LINE_LENGTH, Integer.toString(this.comment_line_length));
+		options.put(DefaultCodeFormatterConstants.FORMATTER_COMMENT_COUNT_LINE_LENGTH_FROM_STARTING_POSITION, this.comment_count_line_length_from_starting_position ? DefaultCodeFormatterConstants.TRUE : DefaultCodeFormatterConstants.FALSE);
 		options.put(DefaultCodeFormatterConstants.FORMATTER_CONTINUATION_INDENTATION, Integer.toString(this.continuation_indentation));
 		options.put(DefaultCodeFormatterConstants.FORMATTER_CONTINUATION_INDENTATION_FOR_ARRAY_INITIALIZER, Integer.toString(this.continuation_indentation_for_array_initializer));
 		options.put(DefaultCodeFormatterConstants.FORMATTER_BLANK_LINES_AFTER_IMPORTS, Integer.toString(this.blank_lines_after_imports));
@@ -1372,6 +1374,10 @@
 				this.comment_line_length = 80;
 			}
 		}
+		final Object commentCountLineLengthFromStartingPositionOption = settings.get(DefaultCodeFormatterConstants.FORMATTER_COMMENT_COUNT_LINE_LENGTH_FROM_STARTING_POSITION);
+		if (commentCountLineLengthFromStartingPositionOption != null) {
+			this.comment_count_line_length_from_starting_position = DefaultCodeFormatterConstants.TRUE.equals(commentCountLineLengthFromStartingPositionOption);
+		}
 		final Object commentNewLinesAtBlockBoundariesOption = settings.get(DefaultCodeFormatterConstants.FORMATTER_COMMENT_NEW_LINES_AT_BLOCK_BOUNDARIES);
 		if (commentNewLinesAtBlockBoundariesOption != null) {
 			this.comment_new_lines_at_block_boundaries = DefaultCodeFormatterConstants.TRUE.equals(commentNewLinesAtBlockBoundariesOption);
@@ -2478,6 +2484,7 @@
 		this.comment_new_lines_at_block_boundaries = true;
 		this.comment_new_lines_at_javadoc_boundaries = true;
 		this.comment_line_length = 80;
+		this.comment_count_line_length_from_starting_position = false;
 		this.comment_preserve_white_space_between_code_and_line_comments= false; 
 		this.continuation_indentation = 2;
 		this.continuation_indentation_for_array_initializer = 2;
@@ -2787,6 +2794,7 @@
 		this.comment_new_lines_at_block_boundaries = true;
 		this.comment_new_lines_at_javadoc_boundaries = true;
 		this.comment_line_length = 80;
+		this.comment_count_line_length_from_starting_position = false;
 		this.comment_preserve_white_space_between_code_and_line_comments= false; 
 		this.continuation_indentation = 2;
 		this.continuation_indentation_for_array_initializer = 2;
diff --git a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/CommentWrapExecutor.java b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/CommentWrapExecutor.java
index 07333ee..3923553 100644
--- a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/CommentWrapExecutor.java
+++ b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/linewrap/CommentWrapExecutor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2014, 2015 Mateusz Matela and others.
+ * Copyright (c) 2014, 2017 Mateusz Matela and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -36,6 +36,7 @@
 	private final ArrayList<Token> nlsTags = new ArrayList<>();
 
 	private int lineStartPosition;
+	private int lineLimit;
 	private boolean simulation;
 	private boolean wrapDisabled;
 	private boolean newLinesAtBoundries;
@@ -63,6 +64,7 @@
 		this.counter = startPosition;
 		commentToken.setIndent(this.tm.toIndent(startPosition, true));
 		this.lineStartPosition = commentToken.getIndent();
+		this.lineLimit = getLineLimit(startPosition);
 		this.simulation = simulate;
 		this.wrapDisabled = noWrap;
 		this.potentialWrapToken = this.potentialWrapTokenSubstitute = null;
@@ -109,7 +111,7 @@
 			if (i > 1 && (policy == null || policy == WrapPolicy.SUBSTITUTE_ONLY))
 				hasWrapPotential = true;
 		}
-		if (position <= this.options.comment_line_length || noWrap || !hasWrapPotential)
+		if (position <= this.lineLimit || noWrap || !hasWrapPotential)
 			return position;
 		return -1;
 	}
@@ -136,6 +138,7 @@
 			this.lineCounter += lineBreaksBefore;
 			this.counter = positionIfNewLine;
 			this.potentialWrapToken = this.potentialWrapTokenSubstitute = null;
+			this.lineLimit = getLineLimit(this.lineStartPosition);
 
 			boolean isFormattedCode = token.getWrapPolicy() != null
 					&& token.getWrapPolicy() != WrapPolicy.SUBSTITUTE_ONLY;
@@ -177,6 +180,7 @@
 			this.counter = this.counterIfWrapped;
 			this.lineCounter++;
 			this.potentialWrapToken = this.potentialWrapTokenSubstitute = null;
+			this.lineLimit = getLineLimit(this.lineStartPosition);
 		}
 
 		if (isSpaceAfter()) {
@@ -188,8 +192,7 @@
 	}
 
 	private boolean shouldWrap() {
-		int lineLenght = this.options.comment_line_length;
-		if (this.wrapDisabled || this.counter <= lineLenght)
+		if (this.wrapDisabled || this.counter <= this.lineLimit)
 			return false;
 		if (getLineBreaksAfter() == 0 && getNext() != null && getNext().getWrapPolicy() == WrapPolicy.DISABLE_WRAP) {
 			// The next token cannot be wrapped, so there's no need to wrap now.
@@ -197,7 +200,7 @@
 			return false;
 		}
 		if (this.potentialWrapToken != null && this.potentialWrapTokenSubstitute != null
-				&& this.counterIfWrapped > lineLenght && this.counterIfWrappedSubstitute < this.counterIfWrapped) {
+				&& this.counterIfWrapped > this.lineLimit && this.counterIfWrappedSubstitute < this.counterIfWrapped) {
 			// there is a normal token to wrap, but the line would overflow anyway - better use substitute
 			this.potentialWrapToken = null;
 		}
@@ -222,6 +225,7 @@
 		int position = startPosition;
 		startPosition = this.tm.toIndent(startPosition, true);
 		int indent = startPosition;
+		int limit = getLineLimit(position);
 
 		for (Token token : structure) {
 			if (token.hasNLSTag()) {
@@ -261,6 +265,7 @@
 				position++;
 			if (token.getLineBreaksBefore() > 0) {
 				position = startPosition;
+				limit = getLineLimit(position);
 				lineStartIndex = whitespace == null ? i : i + 1;
 				if (whitespace != null && token != whitespace) {
 					token.clearLineBreaksBefore();
@@ -269,7 +274,9 @@
 				}
 			}
 			position += this.tm.getLength(token, position);
-			if (position > this.options.comment_line_length && i > lineStartIndex + 1) {
+			if (token.tokenType == TokenNameWHITESPACE)
+				limit = getLineLimit(position);
+			if (position > limit && i > lineStartIndex + 1) {
 				structure.add(i, prefix);
 				if (whitespace != null)
 					structure.add(i, whitespace);
@@ -282,4 +289,15 @@
 		}
 		this.nlsTags.clear();
 	}
+
+	private int getLineLimit(int startPosition) {
+		final int commentLength = this.options.comment_line_length;
+		if (!this.options.comment_count_line_length_from_starting_position)
+			return commentLength;
+		final int pageWidth = this.options.page_width;
+		int lineLength = startPosition + commentLength;
+		if (lineLength > pageWidth && commentLength <= pageWidth)
+			lineLength = pageWidth;
+		return lineLength;
+	}
 }