diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/CompletionParserTest2.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/CompletionParserTest2.java
index e316b20..0ebe2a9 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/CompletionParserTest2.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/parser/CompletionParserTest2.java
@@ -7713,4 +7713,73 @@
 			expectedReplacedSource,
 	"diet ast");
 }
+/*
+ * https://bugs.eclipse.org/bugs/show_bug.cgi?id=53624
+ */
+public void test0137(){
+	String str =
+		"public class X {\n" +
+		"	void foo(){\n" +
+		"		new Object(){\n" +
+		"			void bar(){\n" +
+		"				super.zzz();\n" +
+		"			}\n" +
+		"		};\n" +
+		"	}\n" +
+		"}\n";
+
+
+	String completeBehind = "zzz(";
+	int cursorLocation = str.indexOf("zzz(") + completeBehind.length() - 1;
+	String expectedCompletionNodeToString = "<NONE>";
+	String expectedParentNodeToString = "<NONE>";
+	String completionIdentifier = "<NONE>";
+	String expectedReplacedSource = "<NONE>";
+	String expectedUnitDisplayString =
+		"public class X {\n" + 
+		"  public X() {\n" + 
+		"  }\n" + 
+		"  void foo() {\n" + 
+		"  }\n" + 
+		"}\n";
+
+	checkDietParse(
+			str.toCharArray(),
+			cursorLocation,
+			expectedCompletionNodeToString,
+			expectedParentNodeToString,
+			expectedUnitDisplayString,
+			completionIdentifier,
+			expectedReplacedSource,
+	"diet ast");
+	
+	expectedCompletionNodeToString = "<CompleteOnMessageSend:super.zzz()>";
+	expectedParentNodeToString = "<NONE>";
+	completionIdentifier = "";
+	expectedReplacedSource = "zzz(";
+	expectedUnitDisplayString =
+		"public class X {\n" + 
+		"  public X() {\n" + 
+		"  }\n" + 
+		"  void foo() {\n" + 
+		"    new Object() {\n" + 
+		"      () {\n" + 
+		"      }\n" + 
+		"      void bar() {\n" + 
+		"        <CompleteOnMessageSend:super.zzz()>;\n" + 
+		"      }\n" + 
+		"    };\n" + 
+		"  }\n" + 
+		"}\n";
+
+	checkMethodParse(
+			str.toCharArray(),
+			cursorLocation,
+			expectedCompletionNodeToString,
+			expectedParentNodeToString,
+			expectedUnitDisplayString,
+			completionIdentifier,
+			expectedReplacedSource,
+			"full ast");
+}
 }
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTest.java
index 0688e77..23b656c 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTest.java
@@ -10,250 +10,405 @@
  *******************************************************************************/
 package org.eclipse.jdt.core.tests.compiler.regression;
 
+import java.lang.reflect.Constructor;
+import java.lang.reflect.InvocationTargetException;
+import java.lang.reflect.Method;
 import java.util.ArrayList;
 import java.util.Map;
+import java.util.StringTokenizer;
 
 import junit.framework.Test;
 import junit.framework.TestSuite;
 
+import org.eclipse.jdt.core.tests.util.AbstractCompilerTest;
+import org.eclipse.jdt.core.tests.util.CompilerTestSetup;
 import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 
 public abstract class JavadocTest extends AbstractRegressionTest {
+		
+	boolean useLibrary = false;
+	static String zipFile = "/TestJavadocVisibility.zip";
+	static final String LINE_SEPARATOR = System.getProperty("line.separator");
+	public static ArrayList allTestClasses = null;
+	static final String DOC_COMMENT_SUPPORT = System.getProperty("doc.support");
+//	String docCommentSupport;
+	boolean supportJavadoc;
+	static boolean debug = true;
+	static String[] testNames = null;
+	static int[] testNumbers = null;
+	static int[] testRange = null;
+
+	static {
+		allTestClasses = new ArrayList(6);
+		allTestClasses.add(JavadocTestForClass.class);
+		allTestClasses.add(JavadocTestForConstructor.class);
+		allTestClasses.add(JavadocTestForField.class);
+		allTestClasses.add(JavadocTestForInterface.class);
+		allTestClasses.add(JavadocTestForMethod.class);
+		allTestClasses.add(JavadocTestMixed.class);
+		allTestClasses.add(JavadocTestOptions.class);
+	}
 	
-boolean useLibrary = false;
-static String zipFile = "/TestJavadocVisibility.zip";
-static final String LINE_SEPARATOR = System.getProperty("line.separator");
-public static ArrayList allTestClasses = null;
-
-static {
-	allTestClasses = new ArrayList(6);
-	allTestClasses.add(JavadocTestForClass.class);
-	allTestClasses.add(JavadocTestForConstructor.class);
-	allTestClasses.add(JavadocTestForField.class);
-	allTestClasses.add(JavadocTestForInterface.class);
-	allTestClasses.add(JavadocTestForMethod.class);
-	allTestClasses.add(JavadocTestMixed.class);
-	allTestClasses.add(JavadocTestOptions.class);
-}
-
-
-public static void addTest(TestSuite suite, Class testClass) {
-	TestSuite innerSuite = new TestSuite(testClass);
-	suite.addTest(innerSuite);
-}
-public static Test suite() {
-	TestSuite suite = new TestSuite(JavadocTest.class.getName());
-	for (int i=0; i<allTestClasses.size(); i++) {
-		addTest(suite, (Class) allTestClasses.get(i));
+	
+	public static void addTest(TestSuite suite, Class testClass) {
+		TestSuite innerSuite = new TestSuite(testClass);
+		suite.addTest(innerSuite);
 	}
-	return new RegressionTestSetup(suite, COMPLIANCE_1_4);
-}
 
-public JavadocTest(String name) {
-	super(name);
-}
-
-public static boolean equals(String c, String s) {
-	if (c == null) {
-		if (s == null)
-			return true;
-		else
-			return false;
+	public static Test buildSuite(Class testClass) {
+		TestSuite suite = new TestSuite(testClass.getName());
+		int complianceLevels = AbstractCompilerTest.getPossibleComplianceLevels();
+		if ((complianceLevels & AbstractCompilerTest.F_1_3) != 0) {
+			suite.addTest(suiteForComplianceLevel(COMPLIANCE_1_3, testClass));
+		}
+		if ((complianceLevels & AbstractCompilerTest.F_1_4) != 0) {
+			suite.addTest(suiteForComplianceLevel(COMPLIANCE_1_4, testClass));
+		}
+		if ((complianceLevels & AbstractCompilerTest.F_1_5) != 0) {
+			suite.addTest(suiteForComplianceLevel(COMPLIANCE_1_5, testClass));
+		}
+		return suite;
 	}
-	return c.equals(s);
-}
+	
+	public static Test suiteForComplianceLevel(String level, Class testClass) {
+		TestSuite suite = new TestSuite(level);
+		try {
+//			Class[] paramTypes = new Class[] { String.class, String.class };
+			Class[] paramTypes = new Class[] { String.class };
+			Constructor constructor = testClass.getConstructor(paramTypes);
+			// Javadoc ENABLED
+			String support = CompilerOptions.DISABLED;
+			if (DOC_COMMENT_SUPPORT == null) {
+				suite.addTest(suiteForJavadocSupport(level, testClass, constructor, CompilerOptions.ENABLED));
+//				suiteForJavadocSupport(suite, testClass, constructor, CompilerOptions.ENABLED);
+			} else {
+				support =  DOC_COMMENT_SUPPORT;
+			}
 
-protected Map getCompilerOptions() {
-	Map options = super.getCompilerOptions();
-	options.put(CompilerOptions.OPTION_ReportFieldHiding, CompilerOptions.IGNORE);
-	options.put(CompilerOptions.OPTION_ReportSyntheticAccessEmulation, CompilerOptions.IGNORE);
-	return options;
-}
-
-protected String[] getDefaultClassPaths() {
-	if (useLibrary) {
-		String[] classLibs = super.getDefaultClassPaths();
-		final int length = classLibs.length;
-		String[] newClassPaths = new String[length + 1];
-		System.arraycopy(classLibs, 0, newClassPaths, 0, length);
-		newClassPaths[length] = getClass().getResource(zipFile).getPath();
-		return newClassPaths;
-	} else {
-		return super.getDefaultClassPaths();
+			// Javadoc DISABLED
+			suite.addTest(suiteForJavadocSupport(level, testClass, constructor, support));
+//			suiteForJavadocSupport(suite, testClass, constructor, support);
+		} catch (Exception e) {
+			throw new RuntimeException(e);
+		}
+//		return new RegressionTestSetup(suite, level);
+		return suite;
 	}
-}
 
-static String[] referencedClasses = null;
-static {
-	referencedClasses =
-		new String[] {
-			"test/AbstractVisibility.java",
-			"package test;\n"
-				+ "public abstract class AbstractVisibility {\n"
-				+ "	private class AvcPrivate {\n"
-				+ "		private int avf_private = 10;\n"
-				+ "		public int avf_public = avf_private;\n"
-				+ "		private int avm_private() {\n"
-				+ "			avf_private = (new AvcPrivate()).avf_private;\n"
-				+ "			return avf_private;\n"
-				+ "		}\n"
-				+ "		public int avm_public() {\n"
-				+ "			return avm_private();\n"
-				+ "		}\n"
-				+ "	}\n"
-				+ "	public class AvcPublic {\n"
-				+ "		private int avf_private = 10;\n"
-				+ "		public int avf_public = avf_private;\n"
-				+ "		private int avm_private() {\n"
-				+ "			avf_private = (new AvcPrivate()).avf_private;\n"
-				+ "			return avf_private;\n"
-				+ "		}\n"
-				+ "		public int avm_public() {\n"
-				+ "			return avm_private();\n"
-				+ "		}\n"
-				+ "	}\n"
-				+ "	private int avf_private = 100;\n"
-				+ "	public int avf_public = avf_private;\n"
-				+ "	\n"
-				+ "	private int avm_private() {\n"
-				+ "		avf_private = (new AvcPrivate()).avf_private;\n"
-				+ "		return avf_private;\n"
-				+ "	}\n"
-				+ "	public int avm_public() {\n"
-				+ "		return avm_private();\n"
-				+ "	}\n"
-				+ "}\n",
-			"test/Visibility.java",
-			"package test;\n"
-				+ "public class Visibility extends AbstractVisibility {\n"
-				+ "	private class VcPrivate {\n"
-				+ "		private int vf_private = 10;\n"
-				+ "		public int vf_public = vf_private;\n"
-				+ "		private int vm_private() {\n"
-				+ "			vf_private = (new VcPrivate()).vf_private;\n"
-				+ "			avf_private = vf_private;\n"
-				+ "			return vf_private+avf_private;\n"
-				+ "		}\n"
-				+ "		public int vm_public() {\n"
-				+ "			return vm_private();\n"
-				+ "		}\n"
-				+ "	};\n"
-				+ "	public class VcPublic {\n"
-				+ "		private int vf_private = 10;\n"
-				+ "		public int vf_public = vf_private;\n"
-				+ "		private int vm_private() {\n"
-				+ "			vf_private = (new VcPrivate()).vf_private;\n"
-				+ "			avf_private = vf_private;\n"
-				+ "			return vf_private+avf_private;\n"
-				+ "		}\n"
-				+ "		public int vm_public() {\n"
-				+ "			return vm_private();\n"
-				+ "		}\n"
-				+ "	};\n"
-				+ "	private int vf_private = 100;\n"
-				+ "	private int avf_private = 100;\n"
-				+ "	public int vf_public = vf_private;\n"
-				+ "	public int avf_public = vf_private;\n"
-				+ "	\n"
-				+ "	private int vm_private() {\n"
-				+ "		vf_private = (new VcPrivate()).vf_private;\n"
-				+ "		avf_private = vf_private;\n"
-				+ "		return vf_private+avf_private;\n"
-				+ "	}\n"
-				+ "	public int vm_public() {\n"
-				+ "		return vm_private();\n"
-				+ "	}\n"
-				+ "}\n",
-			"test/copy/VisibilityPackage.java",
-			"package test.copy;\n"
-				+ "class VisibilityPackage {\n"
-				+ "	private class VpPrivate {\n"
-				+ "		private int vf_private = 10;\n"
-				+ "		public int vf_public = vf_private;\n"
-				+ "		private int vm_private() {\n"
-				+ "			vf_private = (new VpPrivate()).vf_private;\n"
-				+ "			return vf_private;\n"
-				+ "		}\n"
-				+ "		public int vm_public() {\n"
-				+ "			return vm_private();\n"
-				+ "		}\n"
-				+ "	}\n"
-				+ "	public class VpPublic {\n"
-				+ "		private int vf_private = 10;\n"
-				+ "		public int vf_public = vf_private;\n"
-				+ "		private int vm_private() {\n"
-				+ "			vf_private = (new VpPrivate()).vf_private;\n"
-				+ "			return vf_private;\n"
-				+ "		}\n"
-				+ "		public int vm_public() {\n"
-				+ "			return vm_private();\n"
-				+ "		}\n"
-				+ "	}\n"
-				+ "	private int vf_private = 100;\n"
-				+ "	public int vf_public = vf_private;\n"
-				+ "	\n"
-				+ "	private int vm_private() {\n"
-				+ "		vf_private = (new VpPrivate()).vf_private;\n"
-				+ "		return vf_private;\n"
-				+ "	}\n"
-				+ "	public int vm_public() {\n"
-				+ "		return vm_private();\n"
-				+ "	}\n"
-				+ "}\n",
-			"test/copy/VisibilityPublic.java",
-			"package test.copy;\n"
-				+ "public class VisibilityPublic {\n"
-				+ "	private class VpPrivate {\n"
-				+ "		private int vf_private = 10;\n"
-				+ "		public int vf_public = vf_private;\n"
-				+ "		private int vm_private() {\n"
-				+ "			vf_private = (new VpPrivate()).vf_private;\n"
-				+ "			return vf_private;\n"
-				+ "		}\n"
-				+ "		public int vm_public() {\n"
-				+ "			return vm_private();\n"
-				+ "		}\n"
-				+ "	}\n"
-				+ "	public class VpPublic {\n"
-				+ "		private int vf_private = 10;\n"
-				+ "		public int vf_public = vf_private;\n"
-				+ "		private int vm_private() {\n"
-				+ "			vf_private = (new VpPrivate()).vf_private;\n"
-				+ "			return vf_private;\n"
-				+ "		}\n"
-				+ "		public int vm_public() {\n"
-				+ "			return vm_private();\n"
-				+ "		}\n"
-				+ "	}\n"
-				+ "	private int vf_private = 100;\n"
-				+ "	public int vf_public = vf_private;\n"
-				+ "	\n"
-				+ "	private int vm_private() {\n"
-				+ "		vf_private = (new VpPrivate()).vf_private;\n"
-				+ "		return vf_private;\n"
-				+ "	}\n"
-				+ "	public int vm_public() {\n"
-				+ "		return vm_private();\n"
-				+ "	}\n"
-				+ "}\n" };
-}
+	public static Test suiteForJavadocSupport(/*TestSuite suite,*/ String level, Class testClass, Constructor constructor, String support) throws InvocationTargetException, IllegalAccessException, InstantiationException {
+		TestSuite suite = new TestSuite("Doc "+support);
+		if (testNames != null) {
+			for (int i = 0; i < testNames.length; i++) {
+				String meth = "test" + testNames[i];
+//				Object[] params = {meth, support};
+				Object[] params = {meth};
+				suite.addTest((Test)constructor.newInstance(params));
+			}
+		}
+		else if (testNumbers != null) {
+			for (int i = 0; i < testNumbers.length; i++) {
+				String meth = "test";
+				int num = testNumbers[i];
+				if (num < 10) meth += "0";
+				if (num < 100) meth += "0";
+				meth += num;
+//				Object[] params = {meth, support};
+				Object[] params = {meth};
+				suite.addTest((Test)constructor.newInstance(params));
+			}
+		}
+		else if (testRange != null && testRange.length == 2 && testRange[0]>=0 && testRange[0]<=testRange[1]) {
+			for (int i=testRange[0]; i<=testRange[1]; i++) {
+				String meth = "test";
+				if (i<10) meth += "0";
+				if (i<100) meth += "0";
+				meth += i;
+//				Object[] params = {meth, support};
+				Object[] params = {meth};
+				suite.addTest((Test)constructor.newInstance(params));
+			}
+		} else {
+			// Run all tests
+			Method[] methods = testClass.getMethods();
+			for (int i = 0, max = methods.length; i < max; i++) {
+				if (methods[i].getModifiers() == 1 && methods[i].getName().startsWith("test")) { //$NON-NLS-1$
+//					Object[] params = {methods[i].getName(), support};
+					Object[] params = {methods[i].getName()};
+					suite.addTest((Test)constructor.newInstance(params));
+				}
+			}
+		}
+//		return suite;
+		return new RegressionTestSetup(suite, level, support);
+	}
 
-protected void runConformReferenceTest(String[] testFiles) {
-	String[] completedFiles = testFiles;
-	if (!useLibrary) {
-		completedFiles = new String[testFiles.length + referencedClasses.length];
-		System.arraycopy(referencedClasses, 0, completedFiles, 0, referencedClasses.length);
-		System.arraycopy(testFiles, 0, completedFiles, referencedClasses.length, testFiles.length);
+
+	public static Test suite() {
+		TestSuite suite = new TestSuite(JavadocTest.class.getName());
+		for (int i=0; i<allTestClasses.size(); i++) {
+			suite.addTest(buildSuite((Class) allTestClasses.get(i)));
+		}
+		return suite;
 	}
-	runConformTest(completedFiles);
-}
-protected void runNegativeReferenceTest(String[] testFiles, String expected) {
-	String[] completedFiles = testFiles;
-	if (!useLibrary) {
-		completedFiles = new String[testFiles.length + referencedClasses.length];
-		System.arraycopy(referencedClasses, 0, completedFiles, 0, referencedClasses.length);
-		System.arraycopy(testFiles, 0, completedFiles, referencedClasses.length, testFiles.length);
+	
+	public JavadocTest(String name) {
+		this(name, CompilerOptions.ENABLED);
 	}
-	runNegativeTest(completedFiles, expected);
-}
+	public JavadocTest(String name, String support) {
+		super(name);
+	}
+	/**
+	 * @return Returns the docCommentSupport.
+	 */
+	public String getNamePrefix() {
+		return "Doc "+(this.supportJavadoc?"on":"off")+" - ";
+	}
+	/* (non-Javadoc)
+	 * @see junit.framework.TestCase#getName()
+	 */
+	public String getName() {
+		if (this.docCommentSupport == null) {
+			return super.getName();
+		} else {
+			return getNamePrefix()+super.getName();
+		}
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jdt.core.tests.util.AbstractCompilerTest#initialize(org.eclipse.jdt.core.tests.util.CompilerTestSetup)
+	 */
+	public void initialize(CompilerTestSetup setUp) {
+		super.initialize(setUp);
+		this.supportJavadoc = !CompilerOptions.DISABLED.equals(this.docCommentSupport);
+	}
+	protected Map getCompilerOptions() {
+		Map options = super.getCompilerOptions();
+		options.put(CompilerOptions.OPTION_ReportFieldHiding, CompilerOptions.IGNORE);
+		options.put(CompilerOptions.OPTION_ReportSyntheticAccessEmulation, CompilerOptions.IGNORE);
+		options.put(CompilerOptions.OPTION_DocCommentSupport, this.docCommentSupport);
+		return options;
+	}
+	
+	protected String[] getDefaultClassPaths() {
+		if (useLibrary) {
+			String[] classLibs = super.getDefaultClassPaths();
+			final int length = classLibs.length;
+			String[] newClassPaths = new String[length + 1];
+			System.arraycopy(classLibs, 0, newClassPaths, 0, length);
+			newClassPaths[length] = getClass().getResource(zipFile).getPath();
+			return newClassPaths;
+		} else {
+			return super.getDefaultClassPaths();
+		}
+	}
+	
+	static String[] referencedClasses = null;
+	static {
+		referencedClasses =
+			new String[] {
+				"test/AbstractVisibility.java",
+				"package test;\n"
+					+ "public abstract class AbstractVisibility {\n"
+					+ "	private class AvcPrivate {\n"
+					+ "		private int avf_private = 10;\n"
+					+ "		public int avf_public = avf_private;\n"
+					+ "		private int avm_private() {\n"
+					+ "			avf_private = (new AvcPrivate()).avf_private;\n"
+					+ "			return avf_private;\n"
+					+ "		}\n"
+					+ "		public int avm_public() {\n"
+					+ "			return avm_private();\n"
+					+ "		}\n"
+					+ "	}\n"
+					+ "	public class AvcPublic {\n"
+					+ "		private int avf_private = 10;\n"
+					+ "		public int avf_public = avf_private;\n"
+					+ "		private int avm_private() {\n"
+					+ "			avf_private = (new AvcPrivate()).avf_private;\n"
+					+ "			return avf_private;\n"
+					+ "		}\n"
+					+ "		public int avm_public() {\n"
+					+ "			return avm_private();\n"
+					+ "		}\n"
+					+ "	}\n"
+					+ "	private int avf_private = 100;\n"
+					+ "	public int avf_public = avf_private;\n"
+					+ "	\n"
+					+ "	private int avm_private() {\n"
+					+ "		avf_private = (new AvcPrivate()).avf_private;\n"
+					+ "		return avf_private;\n"
+					+ "	}\n"
+					+ "	public int avm_public() {\n"
+					+ "		return avm_private();\n"
+					+ "	}\n"
+					+ "}\n",
+				"test/Visibility.java",
+				"package test;\n"
+					+ "public class Visibility extends AbstractVisibility {\n"
+					+ "	private class VcPrivate {\n"
+					+ "		private int vf_private = 10;\n"
+					+ "		public int vf_public = vf_private;\n"
+					+ "		private int vm_private() {\n"
+					+ "			vf_private = (new VcPrivate()).vf_private;\n"
+					+ "			avf_private = vf_private;\n"
+					+ "			return vf_private+avf_private;\n"
+					+ "		}\n"
+					+ "		public int vm_public() {\n"
+					+ "			return vm_private();\n"
+					+ "		}\n"
+					+ "	};\n"
+					+ "	public class VcPublic {\n"
+					+ "		private int vf_private = 10;\n"
+					+ "		public int vf_public = vf_private;\n"
+					+ "		private int vm_private() {\n"
+					+ "			vf_private = (new VcPrivate()).vf_private;\n"
+					+ "			avf_private = vf_private;\n"
+					+ "			return vf_private+avf_private;\n"
+					+ "		}\n"
+					+ "		public int vm_public() {\n"
+					+ "			return vm_private();\n"
+					+ "		}\n"
+					+ "	};\n"
+					+ "	private int vf_private = 100;\n"
+					+ "	private int avf_private = 100;\n"
+					+ "	public int vf_public = vf_private;\n"
+					+ "	public int avf_public = vf_private;\n"
+					+ "	\n"
+					+ "	private int vm_private() {\n"
+					+ "		vf_private = (new VcPrivate()).vf_private;\n"
+					+ "		avf_private = vf_private;\n"
+					+ "		return vf_private+avf_private;\n"
+					+ "	}\n"
+					+ "	public int vm_public() {\n"
+					+ "		return vm_private();\n"
+					+ "	}\n"
+					+ "}\n",
+				"test/copy/VisibilityPackage.java",
+				"package test.copy;\n"
+					+ "class VisibilityPackage {\n"
+					+ "	private class VpPrivate {\n"
+					+ "		private int vf_private = 10;\n"
+					+ "		public int vf_public = vf_private;\n"
+					+ "		private int vm_private() {\n"
+					+ "			vf_private = (new VpPrivate()).vf_private;\n"
+					+ "			return vf_private;\n"
+					+ "		}\n"
+					+ "		public int vm_public() {\n"
+					+ "			return vm_private();\n"
+					+ "		}\n"
+					+ "	}\n"
+					+ "	public class VpPublic {\n"
+					+ "		private int vf_private = 10;\n"
+					+ "		public int vf_public = vf_private;\n"
+					+ "		private int vm_private() {\n"
+					+ "			vf_private = (new VpPrivate()).vf_private;\n"
+					+ "			return vf_private;\n"
+					+ "		}\n"
+					+ "		public int vm_public() {\n"
+					+ "			return vm_private();\n"
+					+ "		}\n"
+					+ "	}\n"
+					+ "	private int vf_private = 100;\n"
+					+ "	public int vf_public = vf_private;\n"
+					+ "	\n"
+					+ "	private int vm_private() {\n"
+					+ "		vf_private = (new VpPrivate()).vf_private;\n"
+					+ "		return vf_private;\n"
+					+ "	}\n"
+					+ "	public int vm_public() {\n"
+					+ "		return vm_private();\n"
+					+ "	}\n"
+					+ "}\n",
+				"test/copy/VisibilityPublic.java",
+				"package test.copy;\n"
+					+ "public class VisibilityPublic {\n"
+					+ "	private class VpPrivate {\n"
+					+ "		private int vf_private = 10;\n"
+					+ "		public int vf_public = vf_private;\n"
+					+ "		private int vm_private() {\n"
+					+ "			vf_private = (new VpPrivate()).vf_private;\n"
+					+ "			return vf_private;\n"
+					+ "		}\n"
+					+ "		public int vm_public() {\n"
+					+ "			return vm_private();\n"
+					+ "		}\n"
+					+ "	}\n"
+					+ "	public class VpPublic {\n"
+					+ "		private int vf_private = 10;\n"
+					+ "		public int vf_public = vf_private;\n"
+					+ "		private int vm_private() {\n"
+					+ "			vf_private = (new VpPrivate()).vf_private;\n"
+					+ "			return vf_private;\n"
+					+ "		}\n"
+					+ "		public int vm_public() {\n"
+					+ "			return vm_private();\n"
+					+ "		}\n"
+					+ "	}\n"
+					+ "	private int vf_private = 100;\n"
+					+ "	public int vf_public = vf_private;\n"
+					+ "	\n"
+					+ "	private int vm_private() {\n"
+					+ "		vf_private = (new VpPrivate()).vf_private;\n"
+					+ "		return vf_private;\n"
+					+ "	}\n"
+					+ "	public int vm_public() {\n"
+					+ "		return vm_private();\n"
+					+ "	}\n"
+					+ "}\n" };
+	}
+	
+	protected void runConformReferenceTest(String[] testFiles) {
+		String[] completedFiles = testFiles;
+		if (!useLibrary) {
+			completedFiles = new String[testFiles.length + referencedClasses.length];
+			System.arraycopy(referencedClasses, 0, completedFiles, 0, referencedClasses.length);
+			System.arraycopy(testFiles, 0, completedFiles, referencedClasses.length, testFiles.length);
+		}
+		runConformTest(completedFiles);
+	}
+	protected void runNegativeReferenceTest(String[] testFiles, String expected) {
+		String[] completedFiles = testFiles;
+		if (!useLibrary) {
+			completedFiles = new String[testFiles.length + referencedClasses.length];
+			System.arraycopy(referencedClasses, 0, completedFiles, 0, referencedClasses.length);
+			System.arraycopy(testFiles, 0, completedFiles, referencedClasses.length, testFiles.length);
+		}
+		runNegativeTest(completedFiles, expected);
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.jdt.core.tests.compiler.regression.AbstractRegressionTest#runNegativeTest(java.lang.String[], java.lang.String)
+	 */
+	protected void runNegativeTest(String[] testFiles, String expectedProblemLog) {
+		if (this.supportJavadoc) {
+			super.runNegativeTest(testFiles, expectedProblemLog);
+		} else {
+			StringTokenizer tokenizer = new StringTokenizer(expectedProblemLog);
+			int errors=0, javadocs=0;
+			while (tokenizer.hasMoreTokens()) {
+				String token = tokenizer.nextToken();
+				if ("ERROR".equals(token) || "WARNING".equals(token)) {
+					errors++;
+				} else if ("Javadoc:".equals(token)) {
+					javadocs++;
+				}
+			}
+			if (errors == javadocs) {
+				super.runConformTest(testFiles);
+			} else if (javadocs == 0) {
+				super.runNegativeTest(testFiles, expectedProblemLog);
+			} else {
+				if (debug) System.out.println("Test "+getName()+" skipped due to non-javadoc compiler errors...");
+			}
+		}
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.jdt.core.tests.compiler.regression.AbstractRegressionTest#runConformTest(java.lang.String[])
+	 */
+	protected void runConformTest(String[] testFiles) {
+		if (this.supportJavadoc) {
+			super.runConformTest(testFiles);
+		} else {
+			if (debug) System.out.println("Test "+getName()+" skipped as identical when Javadoc is enabled...");
+		}
+	}
 }
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTestForClass.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTestForClass.java
index 372e695..98e18da 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTestForClass.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTestForClass.java
@@ -13,54 +13,21 @@
 import java.util.Map;
 
 import junit.framework.Test;
-import junit.framework.TestSuite;
 
 import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 
 public class JavadocTestForClass extends JavadocTest {
+
 	public static Test suite() {
-		if (false) {
-			TestSuite ts;
-			int[] numbers = { 10, 12 };
-			//some of the tests depend on the order of this suite.
-			ts = new TestSuite();
-			for (int i = 0; i < numbers.length; i++) {
-				String meth = "test";
-				int num = numbers[i];
-				if (num < 10) {
-					meth += "0";
-				}
-				if (num < 100) {
-					meth += "0";
-				}
-				meth += num;
-				ts.addTest(new JavadocTestForClass(meth));
-			}
-			return new RegressionTestSetup(ts, COMPLIANCE_1_4);
-		}
-		if (false) {
-			TestSuite ts;
-			//some of the tests depend on the order of this suite.
-			ts = new TestSuite();
-			for (int i=30; i<=30; i++) {
-				String meth = "test";
-				if (i<10) {
-					meth += "0";
-				}
-				if (i<100) {
-					meth += "0";
-				}
-				meth += i;
-				ts.addTest(new JavadocTestForClass(meth));
-			}
-			return new RegressionTestSetup(ts, COMPLIANCE_1_4);
-		}
-		return setupSuite(testClass());
+		return buildSuite(javadocTestClass());
 	}
 	public JavadocTestForClass(String name) {
 		super(name);
 	}
-	public static Class testClass() {
+	public JavadocTestForClass(String name, String support) {
+		super(name, support);
+	}
+	public static Class javadocTestClass() {
 		return JavadocTestForClass.class;
 	}
 
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTestForConstructor.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTestForConstructor.java
index b5077b0..e9c7450 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTestForConstructor.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTestForConstructor.java
@@ -18,52 +18,22 @@
 import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 
 public class JavadocTestForConstructor extends JavadocTest {
-	public static Test suite() {
-		if (false) {
-			TestSuite ts;
-			int[] numbers = { 3 };
-			//some of the tests depend on the order of this suite.
-			ts = new TestSuite();
-			for (int i = 0; i < numbers.length; i++) {
-				String meth = "test";
-				int num = numbers[i];
-				if (num < 10) {
-					meth += "0";
-				}
-				if (num < 100) {
-					meth += "0";
-				}
-				meth += num;
-				ts.addTest(new JavadocTestForConstructor(meth));
-			}
-			return new RegressionTestSetup(ts, COMPLIANCE_1_4);
-		}
-		if (false) {
-			TestSuite ts;
-			//some of the tests depend on the order of this suite.
-			ts = new TestSuite();
-			for (int i=1; i<=8; i++) {
-				String meth = "test";
-				if (i<10) {
-					meth += "0";
-				}
-				if (i<100) {
-					meth += "0";
-				}
-				meth += i;
-				ts.addTest(new JavadocTestForConstructor(meth));
-			}
-			return new RegressionTestSetup(ts, COMPLIANCE_1_4);
-		}
-		return setupSuite(testClass());
-	}
 	public JavadocTestForConstructor(String name) {
 		super(name);
 	}
-	public static Class testClass() {
+	public JavadocTestForConstructor(String name, String support) {
+		super(name, support);
+	}
+	public static Class javadocTestClass() {
 		return JavadocTestForConstructor.class;
 	}
 
+	public static Test suite() {
+		return buildSuite(javadocTestClass());
+	}
+	static { // Use this static to initialize testNames (String[]) , testRange (int[2]), testNumbers (int[])
+	}
+
 	protected Map getCompilerOptions() {
 		Map options = super.getCompilerOptions();
 		options.put(CompilerOptions.OPTION_ReportInvalidJavadoc, CompilerOptions.ERROR);
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTestForField.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTestForField.java
index 58aeea3..66e001b 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTestForField.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTestForField.java
@@ -18,32 +18,20 @@
 import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 
 public class JavadocTestForField extends JavadocTest {
-	public static Test suite() {
-		if (false) {
-			TestSuite ts;
-			//some of the tests depend on the order of this suite.
-			ts = new TestSuite();
-			for (int i=50; i<=80; i++) {
-				String meth = "test";
-				if (i<10) {
-					meth += "0";
-				}
-				if (i<100) {
-					meth += "0";
-				}
-				meth += i;
-				ts.addTest(new JavadocTestForField(meth));
-			}
-			return new RegressionTestSetup(ts, COMPLIANCE_1_4);
-		}
-		return setupSuite(testClass());
-	}
 	public JavadocTestForField(String name) {
 		super(name);
 	}
-	public static Class testClass() {
+	public JavadocTestForField(String name, String support) {
+		super(name, support);
+	}
+	public static Class javadocTestClass() {
 		return JavadocTestForField.class;
 	}
+	public static Test suite() {
+		return buildSuite(javadocTestClass());
+	}
+	static { // Use this static to initialize testNames (String[]) , testRange (int[2]), testNumbers (int[])
+	}
 
 	protected Map getCompilerOptions() {
 		Map options = super.getCompilerOptions();
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTestForInterface.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTestForInterface.java
index e744bcd..760a096 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTestForInterface.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTestForInterface.java
@@ -18,33 +18,22 @@
 import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 
 public class JavadocTestForInterface extends JavadocTest {
-	public static Test suite() {
-		if (false) {
-			TestSuite ts;
-			//some of the tests depend on the order of this suite.
-			ts = new TestSuite();
-			for (int i = 61; i <= 61; i++) {
-				String meth = "test";
-				if (i < 10) {
-					meth += "0";
-				}
-				if (i < 100) {
-					meth += "0";
-				}
-				meth += i;
-				ts.addTest(new JavadocTestForInterface(meth));
-			}
-			return new RegressionTestSetup(ts, COMPLIANCE_1_4);
-		}
-		return setupSuite(testClass());
-	}
 	public JavadocTestForInterface(String name) {
 		super(name);
 	}
-	public static Class testClass() {
+	public JavadocTestForInterface(String name, String support) {
+		super(name, support);
+	}
+	public static Class javadocTestClass() {
 		return JavadocTestForInterface.class;
 	}
 
+	public static Test suite() {
+		return buildSuite(javadocTestClass());
+	}
+	static { // Use this static to initialize testNames (String[]) , testRange (int[2]), testNumbers (int[])
+	}
+
 	protected Map getCompilerOptions() {
 		Map options = super.getCompilerOptions();
 		options.put(CompilerOptions.OPTION_ReportInvalidJavadoc, CompilerOptions.ERROR);
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTestForMethod.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTestForMethod.java
index ba0a5c1..96038a7 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTestForMethod.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTestForMethod.java
@@ -18,51 +18,20 @@
 import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 
 public class JavadocTestForMethod extends JavadocTest {
-	public static Test suite() {
-		if (false) {
-			TestSuite ts;
-			int[] numbers = { 80, 81, 85 };
-			//some of the tests depend on the order of this suite.
-			ts = new TestSuite();
-			for (int i = 0; i < numbers.length; i++) {
-				String meth = "test";
-				int num = numbers[i];
-				if (num < 10) {
-					meth += "0";
-				}
-				if (num < 100) {
-					meth += "0";
-				}
-				meth += num;
-				ts.addTest(new JavadocTestForMethod(meth));
-			}
-			return new RegressionTestSetup(ts, COMPLIANCE_1_4);
-		}
-		if (false) {
-			TestSuite ts;
-			//some of the tests depend on the order of this suite.
-			ts = new TestSuite();
-			for (int i=130; i<=138; i++) {
-				String meth = "test";
-				if (i<10) {
-					meth += "0";
-				}
-				if (i<100) {
-					meth += "0";
-				}
-				meth += i;
-				ts.addTest(new JavadocTestForMethod(meth));
-			}
-			return new RegressionTestSetup(ts, COMPLIANCE_1_4);
-		}
-		return setupSuite(testClass());
-	}
 	public JavadocTestForMethod(String name) {
 		super(name);
 	}
-	public static Class testClass() {
+	public JavadocTestForMethod(String name, String support) {
+		super(name, support);
+	}
+	public static Class javadocTestClass() {
 		return JavadocTestForMethod.class;
 	}
+	public static Test suite() {
+		return buildSuite(javadocTestClass());
+	}
+	static { // Use this static to initialize testNames (String[]) , testRange (int[2]), testNumbers (int[])
+	}
 
 	protected Map getCompilerOptions() {
 		Map options = super.getCompilerOptions();
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTestMixed.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTestMixed.java
index 040e394..8bb5948 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTestMixed.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTestMixed.java
@@ -13,55 +13,36 @@
 import java.util.Map;
 
 import junit.framework.Test;
-import junit.framework.TestSuite;
 
 import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 
 public class JavadocTestMixed extends JavadocTest {
 
+	String localDocCommentSupport = CompilerOptions.ENABLED;
 	String reportInvalidJavadoc = CompilerOptions.ERROR;
 	String reportMissingJavadocComments = null;
 
 	public JavadocTestMixed(String name) {
 		super(name);
 	}
+	public JavadocTestMixed(String name, String support) {
+		super(name, support);
+	}
 
-	public static Class testClass() {
+	public static Class javadocTestClass() {
 		return JavadocTestMixed.class;
 	}
 
 	public static Test suite() {
-		if (false) {
-			TestSuite ts;
-			int[] numbers = { 41 };
-			//some of the tests depend on the order of this suite.
-			ts = new TestSuite();
-			for (int i = 0; i < numbers.length; i++) {
-				String meth = "test";
-				int num = numbers[i];
-				if (num < 10) {
-					meth += "0";
-				}
-				if (num < 100) {
-					meth += "0";
-				}
-				meth += num;
-				ts.addTest(new JavadocTestMixed(meth));
-			}
-			return new RegressionTestSetup(ts, COMPLIANCE_1_4);
-		}
-		if (false) {
-			TestSuite ts = new TestSuite();
-			ts.addTest(new JavadocTestMixed("testBug52216"));
-			ts.addTest(new JavadocTestMixed("testBug52216a"));
-			ts.addTest(new JavadocTestMixed("testBug52216b"));
-			return new RegressionTestSetup(ts, COMPLIANCE_1_4);
-		}
-		return setupSuite(testClass());
+		return buildSuite(javadocTestClass());
+	}
+	static {
+//		testNames = new String[] { "Bug51529a", "Bug51529b" };
 	}
 
 	protected Map getCompilerOptions() {
 		Map options = super.getCompilerOptions();
+		options.put(CompilerOptions.OPTION_DocCommentSupport, this.localDocCommentSupport);
 		options.put(CompilerOptions.OPTION_ReportInvalidJavadoc, reportInvalidJavadoc);
 		if (reportMissingJavadocComments != null) 
 			options.put(CompilerOptions.OPTION_ReportMissingJavadocComments, reportMissingJavadocComments);
@@ -71,6 +52,7 @@
 		options.put(CompilerOptions.OPTION_ReportFieldHiding, CompilerOptions.IGNORE);
 		options.put(CompilerOptions.OPTION_ReportSyntheticAccessEmulation, CompilerOptions.IGNORE);
 		options.put(CompilerOptions.OPTION_ReportDeprecation, CompilerOptions.ERROR);
+		options.put(CompilerOptions.OPTION_ReportUnusedImport, CompilerOptions.ERROR);
 		return options;
 	}
 	/* (non-Javadoc)
@@ -78,6 +60,7 @@
 	 */
 	protected void setUp() throws Exception {
 		super.setUp();
+		this.localDocCommentSupport = this.docCommentSupport;
 		reportInvalidJavadoc = CompilerOptions.ERROR;
 		reportMissingJavadocComments = null;
 	}
@@ -2149,4 +2132,60 @@
 				"----------\n"
 		);
 	}
+
+	/**
+	 * Test fix for bug 51529.
+	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=51529">51529</a>
+	 */
+	public void testBug51529() {
+		reportMissingJavadocComments = CompilerOptions.IGNORE;
+		runConformTest(
+			new String[] {
+				"X.java",
+				"import java.util.Vector;\n" + 
+				"public class X {\n" + 
+				"	/**\n" + 
+				"	 * @see Vector\n" + 
+				"	 */\n" + 
+				"	void foo() {}\n" + 
+				"}\n"
+		 });
+	}
+	public void testBug51529a() {
+		reportInvalidJavadoc = CompilerOptions.IGNORE;
+		reportMissingJavadocComments = CompilerOptions.IGNORE;
+		runConformTest(
+			new String[] {
+				"X.java",
+				"import java.util.Vector;\n" + 
+				"public class X {\n" + 
+				"	/**\n" + 
+				"	 * @see Vector\n" + 
+				"	 */\n" + 
+				"	void foo() {}\n" + 
+				"}\n"
+			}
+		);
+	}
+	public void testBug51529b() {
+		this.localDocCommentSupport = CompilerOptions.DISABLED;
+		runNegativeTest(
+			new String[] {
+				"X.java",
+				"import java.util.Vector;\n" + 
+				"public class X {\n" + 
+				"	/**\n" + 
+				"	 * @see Vector\n" + 
+				"	 */\n" + 
+				"	void foo() {}\n" + 
+				"}\n"
+			},
+			"----------\n" + 
+				"1. ERROR in X.java (at line 1)\n" + 
+				"	import java.util.Vector;\n" + 
+				"	       ^^^^^^^^^^^^^^^^\n" + 
+				"The import java.util.Vector is never used\n" + 
+				"----------\n"
+		);
+	}
 }
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTestOptions.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTestOptions.java
index e46f868..57d53b1 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTestOptions.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/JavadocTestOptions.java
@@ -13,7 +13,6 @@
 import java.util.Map;
 
 import junit.framework.Test;
-import junit.framework.TestSuite;
 
 import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 
@@ -26,6 +25,7 @@
  */
 public class JavadocTestOptions extends JavadocTest {
 
+	String localDocCommentSupport = null;
 	String reportInvalidJavadoc = null;
 	String reportInvalidJavadocTagsVisibility = null;
 	String reportInvalidJavadocTags = null;
@@ -1513,24 +1513,34 @@
 	public JavadocTestOptions(String name) {
 		super(name);
 	}
-
-	public static Class testClass() {
+	public JavadocTestOptions(String name, String support) {
+		super(name, support);
+	}
+	public static Class javadocTestClass() {
 		return JavadocTestOptions.class;
 	}
-
 	public static Test suite() {
-		if (false) {
-			TestSuite ts = new TestSuite();
-			ts.addTest(new JavadocTestOptions("testMissingTagsErrorPrivate"));
-			ts.addTest(new JavadocTestOptions("testMissingCommentsErrorPrivate"));
-			return new RegressionTestSetup(ts, COMPLIANCE_1_4);
-		}
-		return setupSuite(testClass());
+		return buildSuite(javadocTestClass());
 	}
+	static { // Use this static to initialize testNames (String[]) , testRange (int[2]), testNumbers (int[])
+	}
+	/**
+	 * @return Returns the docCommentSupport.
+	 *
+	public String getNamePrefix() {
+		if (this.localDocCommentSupport == null) {
+			return super.getNamePrefix();
+		} else {
+			return this.localDocCommentSupport;
+		}
+	}
+	*/
 
 	protected Map getCompilerOptions() {
 		Map options = super.getCompilerOptions();
 		// Set javadoc options if non null
+		if (this.localDocCommentSupport != null) 
+			options.put(CompilerOptions.OPTION_DocCommentSupport, this.localDocCommentSupport);
 		if (reportInvalidJavadoc != null)
 			options.put(CompilerOptions.OPTION_ReportInvalidJavadoc, reportInvalidJavadoc);
 		if (reportInvalidJavadocTagsVisibility != null)
@@ -1881,4 +1891,34 @@
 		reportInvalidJavadocTagsVisibility = CompilerOptions.PRIVATE;
 		runConformTest(MissingTags);
 	}
+
+	/**
+	 * Test fix for bug 52264.
+	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=52264">52264</a>
+	 */
+	// Test invalid javadoc "error" with javadoc comment support disabled
+	public void testInvalidTagsReferencesJavadocSupportDisabled() {
+		this.localDocCommentSupport = CompilerOptions.DISABLED;
+		reportInvalidJavadoc = CompilerOptions.ERROR;
+		reportInvalidJavadocTags = CompilerOptions.ERROR;
+		runConformTest(InvalidReferencesClassJavadocComments);
+		runConformTest(InvalidReferencesFieldJavadocComments);
+		runConformTest(InvalidReferencesMethodJavadocComments);
+		runConformTest(InvalidReferencesConstructorJavadocComments);
+	}
+
+	// Test missing javadoc comments "error" with javadoc comment support disabled
+	public void testMissingCommentsJavadocSupportDisabled() {
+		this.localDocCommentSupport = CompilerOptions.DISABLED;
+		reportMissingJavadocComments = CompilerOptions.ERROR;
+		runConformReferenceTest(MissingComments);
+	}
+
+	// Test missing javadoc tags "error" with javadoc comment support disabled
+	public void testMissingTagsJavadocSupportDisabled() {
+		this.localDocCommentSupport = CompilerOptions.DISABLED;
+		reportMissingJavadocTags = CompilerOptions.ERROR;
+		runConformReferenceTest(MissingTags);
+	}
+
 }
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/RegressionTestSetup.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/RegressionTestSetup.java
index 015e0de..cefae5f 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/RegressionTestSetup.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/RegressionTestSetup.java
@@ -26,7 +26,10 @@
 	public RegressionTestSetup(Test test, String complianceLevel) {
 		super(test, complianceLevel);
 	}
-	
+	public RegressionTestSetup(Test test, String complianceLevel, String support) {
+		super(test, complianceLevel, support);
+	}
+
 	protected void setUp() {
 		if (this.javaClassLib == null) {
 			// Create name environment
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/TestAll.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/TestAll.java
index b23e25d..e05f68a 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/TestAll.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/TestAll.java
@@ -28,7 +28,7 @@
 }
 public static Test suite() {
 	ArrayList standardTests = new ArrayList();
-	standardTests.addAll(JavadocTest.allTestClasses);
+//	standardTests.addAll(JavadocTest.allTestClasses);
 	standardTests.add(ArrayTest.class);
 	standardTests.add(AssignmentTest.class);
 	standardTests.add(BatchCompilerTest.class);
@@ -66,6 +66,8 @@
 	    tests_1_5.add(GenericTypeTest.class);
 		all.addTest(AbstractCompilerTest.suiteForComplianceLevel(AbstractCompilerTest.COMPLIANCE_1_5, RegressionTestSetup.class, tests_1_5));
 	}
+	// Add Javadoc test suites
+	all.addTest(JavadocTest.suite());
 	return all;
 }
 }
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/util/AbstractCompilerTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/util/AbstractCompilerTest.java
index b7d3459..68f12ca 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/util/AbstractCompilerTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/util/AbstractCompilerTest.java
@@ -34,6 +34,7 @@
 	private static int possibleComplianceLevels = -1;
 
 	protected String complianceLevel;
+	protected String docCommentSupport;
 
 	/*
 	 * Returns the possible compliance levels this VM instance can run.
@@ -156,5 +157,6 @@
 
 	public void initialize(CompilerTestSetup setUp) {
 		this.complianceLevel = setUp.complianceLevel;
+		this.docCommentSupport = setUp.docCommentSupport;
 	}
 }
\ No newline at end of file
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/util/CompilerTestSetup.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/util/CompilerTestSetup.java
index 5efd8d2..6c9bc08 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/util/CompilerTestSetup.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/util/CompilerTestSetup.java
@@ -20,11 +20,17 @@
 public class CompilerTestSetup extends TestDecorator {
 
 	String complianceLevel;
+	String docCommentSupport;
 
 	public CompilerTestSetup(Test test, String complianceLevel) {
 		super(test);
 		this.complianceLevel = complianceLevel;
 	}
+	public CompilerTestSetup(Test test, String complianceLevel, String support) {
+		super(test);
+		this.complianceLevel = complianceLevel;
+		this.docCommentSupport = support;
+	}
 
 	protected void initTest(Object test) {
 		if (test instanceof AbstractCompilerTest) {
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterJavadocTest.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterJavadocTest.java
index 1f27e7a..304c3ea 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterJavadocTest.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterJavadocTest.java
@@ -15,7 +15,6 @@
 import java.util.ArrayList;
 import java.util.Iterator;
 import java.util.List;
-import java.util.Map;
 
 import junit.framework.Test;
 import junit.framework.TestSuite;
@@ -25,21 +24,19 @@
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jdt.core.compiler.IProblem;
+import org.eclipse.jdt.core.dom.AST;
 import org.eclipse.jdt.core.dom.ASTNode;
-import org.eclipse.jdt.core.dom.ASTVisitor;
+import org.eclipse.jdt.core.dom.ASTParser;
 import org.eclipse.jdt.core.dom.ArrayType;
-import org.eclipse.jdt.core.dom.BlockComment;
 import org.eclipse.jdt.core.dom.Comment;
 import org.eclipse.jdt.core.dom.CompilationUnit;
 import org.eclipse.jdt.core.dom.IBinding;
 import org.eclipse.jdt.core.dom.Javadoc;
-import org.eclipse.jdt.core.dom.LineComment;
 import org.eclipse.jdt.core.dom.MemberRef;
 import org.eclipse.jdt.core.dom.MethodDeclaration;
 import org.eclipse.jdt.core.dom.MethodRef;
 import org.eclipse.jdt.core.dom.MethodRefParameter;
 import org.eclipse.jdt.core.dom.Name;
-import org.eclipse.jdt.core.dom.PrimitiveType;
 import org.eclipse.jdt.core.dom.QualifiedName;
 import org.eclipse.jdt.core.dom.SimpleName;
 import org.eclipse.jdt.core.dom.SimpleType;
@@ -49,12 +46,18 @@
 
 public class ASTConverterJavadocTest extends ConverterTestSetup {
 
+	// Test counters
 	protected static int[] testCounters = { 0, 0, 0, 0 };
+	// Unicode tests
+	protected static boolean unicode = false;
+	// Doc Comment support
+	static final String DOC_COMMENT_SUPPORT = System.getProperty("doc.support");
+	final String docCommentSupport;
 
 	// List of comments read from source of test
-//	private final int LINE_COMMENT = 100;
-//	private final int BLOCK_COMMENT =200;
-//	private final int DOC_COMMENT = 300;
+	private final int LINE_COMMENT = 100;
+	private final int BLOCK_COMMENT =200;
+	private final int DOC_COMMENT = 300;
 	List comments = new ArrayList();
 	// List of tags contained in each comment read from test source.
 	List allTags = new ArrayList();
@@ -69,31 +72,59 @@
 	protected StringBuffer problems;
 	protected String compilerOption = JavaCore.IGNORE;
 	protected List failures;
+	protected IJavaProject currentProject;
 
-
+	/**
+	 * @param name
+	 * @param support
+	 */
+	public ASTConverterJavadocTest(String name, String support) {
+		super(name);
+		this.docCommentSupport = support;
+	}
 	/**
 	 * @param name
 	 */
 	public ASTConverterJavadocTest(String name) {
-		super(name);
+		this(name, JavaCore.ENABLED);
 	}
 
 	public static Test suite() {
 		TestSuite suite = new Suite(ASTConverterJavadocTest.class.getName());		
-
+//		String param = System.getProperty("unicode");
+//		if ("true".equals(param)) {
+//			unicode = true;
+//		}
 		if (true) {
-			Class c = ASTConverterJavadocTest.class;
-			Method[] methods = c.getMethods();
-			for (int i = 0, max = methods.length; i < max; i++) {
-				if (methods[i].getName().startsWith("test")) { //$NON-NLS-1$
-					suite.addTest(new ASTConverterJavadocTest(methods[i].getName()));
-				}
+			if (DOC_COMMENT_SUPPORT == null) {
+				buildSuite(suite, JavaCore.ENABLED);
+				buildSuite(suite, JavaCore.DISABLED);
+			} else {
+				String support = DOC_COMMENT_SUPPORT==null ? JavaCore.DISABLED : (DOC_COMMENT_SUPPORT.equals(JavaCore.DISABLED)?JavaCore.DISABLED:JavaCore.ENABLED);
+				buildSuite(suite, support);
 			}
 			return suite;
 		}
-		suite.addTest(new ASTConverterJavadocTest("test014"));
+		suite.addTest(new ASTConverterJavadocTest("testBug52908unicode"));
 		return suite;
 	}
+
+	public static void buildSuite(TestSuite suite, String support) {
+		Class c = ASTConverterJavadocTest.class;
+		Method[] methods = c.getMethods();
+		for (int i = 0, max = methods.length; i < max; i++) {
+			if (methods[i].getName().startsWith("test")) { //$NON-NLS-1$
+				suite.addTest(new ASTConverterJavadocTest(methods[i].getName(), support));
+			}
+		}
+	}
+	
+	/* (non-Javadoc)
+	 * @see junit.framework.TestCase#getName()
+	 */
+	public String getName() {
+		return "Doc "+this.docCommentSupport+" - "+super.getName();
+	}
 	/* (non-Javadoc)
 	 * @see junit.framework.TestCase#setUp()
 	 */
@@ -126,6 +157,8 @@
 			}
 		}
 		assertTrue(title, size==0 || problems.length() > 0);
+		// put default options on project
+		this.currentProject.setOptions(JavaCore.getOptions());
 	}
 	/* (non-Javadoc)
 	 * @see junit.framework.TestCase#tearDown()
@@ -144,226 +177,236 @@
 		}
 	}
 
-	class ASTConverterJavadocFlattener extends ASTVisitor {
-
-		/**
-		 * The string buffer into which the serialized representation of the AST is
-		 * written.
-		 */
-		private StringBuffer buffer;
-		
-		private String comment;
-		
-		/**
-		 * Creates a new AST printer.
-		 */
-		ASTConverterJavadocFlattener(String comment) {
-			this.buffer = new StringBuffer();
-			this.comment = comment;
-		}
-		
-		/**
-		 * Returns the string accumulated in the visit.
-		 *
-		 * @return the serialized 
-		 */
-		public String getResult() {
-			return this.buffer.toString();
-		}
-		
-		/**
-		 * Resets this printer so that it can be used again.
-		 */
-		public void reset() {
-			this.buffer.setLength(0);
-		}
-
-
-		/*
-		 * @see ASTVisitor#visit(ArrayType)
-		 */
-		public boolean visit(ArrayType node) {
-			node.getComponentType().accept(this);
-			this.buffer.append("[]");//$NON-NLS-1$
-			return false;
-		}
-	
-		/*
-		 * @see ASTVisitor#visit(BlockComment)
-		 * @since 3.0
-		 */
-		public boolean visit(BlockComment node) {
-			this.buffer.append(this.comment);
-			return false;
-		}
-	
-		/*
-		 * @see ASTVisitor#visit(Javadoc)
-		 */
-		public boolean visit(Javadoc node) {
-			// ignore deprecated node.getComment()
-			this.buffer.append("/**");//$NON-NLS-1$
-			ASTNode e = null;
-			int start = 3;
-			for (Iterator it = node.tags().iterator(); it.hasNext(); ) {
-				e = (ASTNode) it.next();
-				try {
-					this.buffer.append(this.comment.substring(start, e.getStartPosition()-node.getStartPosition()));
-					start = e.getStartPosition()-node.getStartPosition();
-				} catch (IndexOutOfBoundsException ex) {
-					// do nothing
-				}
-				e.accept(this);
-				start += e.getLength();
-			}
-			this.buffer.append(this.comment.substring(start, node.getLength()));
-			return false;
-		}
-	
-		/*
-		 * @see ASTVisitor#visit(LineComment)
-		 * @since 3.0
-		 */
-		public boolean visit(LineComment node) {
-			this.buffer.append(this.comment);
-			return false;
-		}
-	
-		/*
-		 * @see ASTVisitor#visit(MemberRef)
-		 * @since 3.0
-		 */
-		public boolean visit(MemberRef node) {
-			if (node.getQualifier() != null) {
-				node.getQualifier().accept(this);
-			}
-			this.buffer.append("#");//$NON-NLS-1$
-			node.getName().accept(this);
-			return false;
-		}
-		
-		/*
-		 * @see ASTVisitor#visit(MethodRef)
-		 * @since 3.0
-		 */
-		public boolean visit(MethodRef node) {
-			if (node.getQualifier() != null) {
-				node.getQualifier().accept(this);
-			}
-			this.buffer.append("#");//$NON-NLS-1$
-			node.getName().accept(this);
-			this.buffer.append("(");//$NON-NLS-1$
-			for (Iterator it = node.parameters().iterator(); it.hasNext(); ) {
-				MethodRefParameter e = (MethodRefParameter) it.next();
-				e.accept(this);
-				if (it.hasNext()) {
-					this.buffer.append(",");//$NON-NLS-1$
-				}
-			}
-			this.buffer.append(")");//$NON-NLS-1$
-			return false;
-		}
-		
-		/*
-		 * @see ASTVisitor#visit(MethodRefParameter)
-		 * @since 3.0
-		 */
-		public boolean visit(MethodRefParameter node) {
-			node.getType().accept(this);
-			if (node.getName() != null) {
-				this.buffer.append(" ");//$NON-NLS-1$
-				node.getName().accept(this);
-			}
-			return false;
-		}
-
-		/*
-		 * @see ASTVisitor#visit(TagElement)
-		 * @since 3.0
-		 */
-		public boolean visit(TagElement node) {
-			Javadoc javadoc = null;
-			int start = 0;
-			if (node.isNested()) {
-				// nested tags are always enclosed in braces
-				this.buffer.append("{");//$NON-NLS-1$
-				javadoc = (Javadoc) node.getParent().getParent();
-				start++;
-			} else {
-				javadoc = (Javadoc) node.getParent();
-			}
-			start += node.getStartPosition()-javadoc.getStartPosition();
-			if (node.getTagName() != null) {
-				this.buffer.append(node.getTagName());
-				start += node.getTagName().length();
-			}
-			for (Iterator it = node.fragments().iterator(); it.hasNext(); ) {
-				ASTNode e = (ASTNode) it.next();
-				try {
-					this.buffer.append(this.comment.substring(start, e.getStartPosition()-javadoc.getStartPosition()));
-					start = e.getStartPosition()-javadoc.getStartPosition();
-				} catch (IndexOutOfBoundsException ex) {
-					// do nothing
-				}
-				start += e.getLength();
-				e.accept(this);
-			}
-			if (node.isNested()) {
-				this.buffer.append("}");//$NON-NLS-1$
-			}
-			return false;
-		}
-		
-		/*
-		 * @see ASTVisitor#visit(TextElement)
-		 * @since 3.0
-		 */
-		public boolean visit(TextElement node) {
-			this.buffer.append(node.getText());
-			return false;
-		}
-
-		/*
-		 * @see ASTVisitor#visit(PrimitiveType)
-		 */
-		public boolean visit(PrimitiveType node) {
-			this.buffer.append(node.getPrimitiveTypeCode().toString());
-			return false;
-		}
-	
-		/*
-		 * @see ASTVisitor#visit(QualifiedName)
-		 */
-		public boolean visit(QualifiedName node) {
-			node.getQualifier().accept(this);
-			this.buffer.append(".");//$NON-NLS-1$
-			node.getName().accept(this);
-			return false;
-		}
-
-		/*
-		 * @see ASTVisitor#visit(SimpleName)
-		 */
-		public boolean visit(SimpleName node) {
-			this.buffer.append(node.getIdentifier());
-			return false;
-		}
-
-		/*
-		 * @see ASTVisitor#visit(SimpleName)
-		 */
-		public boolean visit(SimpleType node) {
-			node.getName().accept(this);
-			return false;
-		}
+	public ASTNode runConversion(char[] source, String unitName, IJavaProject project) {
+		ASTParser parser = ASTParser.newParser(AST.LEVEL_2_0);
+		parser.setSource(source);
+		parser.setUnitName(unitName);
+		parser.setProject(project);
+		parser.setResolveBindings(this.resolveBinding);
+		return parser.createAST(null);
 	}
 
+// NOT USED
+//	class ASTConverterJavadocFlattener extends ASTVisitor {
+//
+//		/**
+//		 * The string buffer into which the serialized representation of the AST is
+//		 * written.
+//		 */
+//		private StringBuffer buffer;
+//		
+//		private String comment;
+//		
+//		/**
+//		 * Creates a new AST printer.
+//		 */
+//		ASTConverterJavadocFlattener(String comment) {
+//			this.buffer = new StringBuffer();
+//			this.comment = comment;
+//		}
+//		
+//		/**
+//		 * Returns the string accumulated in the visit.
+//		 *
+//		 * @return the serialized 
+//		 */
+//		public String getResult() {
+//			return this.buffer.toString();
+//		}
+//		
+//		/**
+//		 * Resets this printer so that it can be used again.
+//		 */
+//		public void reset() {
+//			this.buffer.setLength(0);
+//		}
+//
+//		/*
+//		 * @see ASTVisitor#visit(ArrayType)
+//		 */
+//		public boolean visit(ArrayType node) {
+//			node.getComponentType().accept(this);
+//			this.buffer.append("[]");//$NON-NLS-1$
+//			return false;
+//		}
+//	
+//		/*
+//		 * @see ASTVisitor#visit(BlockComment)
+//		 * @since 3.0
+//		 */
+//		public boolean visit(BlockComment node) {
+//			this.buffer.append(this.comment);
+//			return false;
+//		}
+//	
+//		/*
+//		 * @see ASTVisitor#visit(Javadoc)
+//		 */
+//		public boolean visit(Javadoc node) {
+//			
+//			// ignore deprecated node.getComment()
+//			this.buffer.append("/**");//$NON-NLS-1$
+//			ASTNode e = null;
+//			int start = 3;
+//			for (Iterator it = node.tags().iterator(); it.hasNext(); ) {
+//				e = (ASTNode) it.next();
+//				try {
+//					this.buffer.append(this.comment.substring(start, e.getStartPosition()-node.getStartPosition()));
+//					start = e.getStartPosition()-node.getStartPosition();
+//				} catch (IndexOutOfBoundsException ex) {
+//					// do nothing
+//				}
+//				e.accept(this);
+//				start += e.getLength();
+//			}
+//			this.buffer.append(this.comment.substring(start, node.getLength()));
+//			return false;
+//		}
+//	
+//		/*
+//		 * @see ASTVisitor#visit(LineComment)
+//		 * @since 3.0
+//		 */
+//		public boolean visit(LineComment node) {
+//			this.buffer.append(this.comment);
+//			return false;
+//		}
+//	
+//		/*
+//		 * @see ASTVisitor#visit(MemberRef)
+//		 * @since 3.0
+//		 */
+//		public boolean visit(MemberRef node) {
+//			if (node.getQualifier() != null) {
+//				node.getQualifier().accept(this);
+//			}
+//			this.buffer.append("#");//$NON-NLS-1$
+//			node.getName().accept(this);
+//			return true;
+//		}
+//		
+//		/*
+//		 * @see ASTVisitor#visit(MethodRef)
+//		 * @since 3.0
+//		 */
+//		public boolean visit(MethodRef node) {
+//			if (node.getQualifier() != null) {
+//				node.getQualifier().accept(this);
+//			}
+//			this.buffer.append("#");//$NON-NLS-1$
+//			node.getName().accept(this);
+//			this.buffer.append("(");//$NON-NLS-1$
+//			for (Iterator it = node.parameters().iterator(); it.hasNext(); ) {
+//				MethodRefParameter e = (MethodRefParameter) it.next();
+//				e.accept(this);
+//				if (it.hasNext()) {
+//					this.buffer.append(",");//$NON-NLS-1$
+//				}
+//			}
+//			this.buffer.append(")");//$NON-NLS-1$
+//			return true;
+//		}
+//		
+//		/*
+//		 * @see ASTVisitor#visit(MethodRefParameter)
+//		 * @since 3.0
+//		 */
+//		public boolean visit(MethodRefParameter node) {
+//			node.getType().accept(this);
+//			if (node.getName() != null) {
+//				this.buffer.append(" ");//$NON-NLS-1$
+//				node.getName().accept(this);
+//			}
+//			return true;
+//		}
+//
+//		/*
+//		 * @see ASTVisitor#visit(TagElement)
+//		 * @since 3.0
+//		 */
+//		public boolean visit(TagElement node) {
+//			Javadoc javadoc = null;
+//			int start = 0;
+//			if (node.isNested()) {
+//				// nested tags are always enclosed in braces
+//				this.buffer.append("{");//$NON-NLS-1$
+//				javadoc = (Javadoc) node.getParent().getParent();
+//				start++;
+//			} else {
+//				javadoc = (Javadoc) node.getParent();
+//			}
+//			start += node.getStartPosition()-javadoc.getStartPosition();
+//			if (node.getTagName() != null) {
+//				this.buffer.append(node.getTagName());
+//				start += node.getTagName().length();
+//			}
+//			for (Iterator it = node.fragments().iterator(); it.hasNext(); ) {
+//				ASTNode e = (ASTNode) it.next();
+//				try {
+//					this.buffer.append(this.comment.substring(start, e.getStartPosition()-javadoc.getStartPosition()));
+//					start = e.getStartPosition()-javadoc.getStartPosition();
+//				} catch (IndexOutOfBoundsException ex) {
+//					// do nothing
+//				}
+//				start += e.getLength();
+//				e.accept(this);
+//			}
+//			if (node.isNested()) {
+//				this.buffer.append("}");//$NON-NLS-1$
+//			}
+//			return true;
+//		}
+//		
+//		/*
+//		 * @see ASTVisitor#visit(TextElement)
+//		 * @since 3.0
+//		 */
+//		public boolean visit(TextElement node) {
+//			this.buffer.append(node.getText());
+//			return false;
+//		}
+//
+//		/*
+//		 * @see ASTVisitor#visit(PrimitiveType)
+//		 */
+//		public boolean visit(PrimitiveType node) {
+//			this.buffer.append(node.getPrimitiveTypeCode().toString());
+//			return false;
+//		}
+//	
+//		/*
+//		 * @see ASTVisitor#visit(QualifiedName)
+//		 */
+//		public boolean visit(QualifiedName node) {
+//			node.getQualifier().accept(this);
+//			this.buffer.append(".");//$NON-NLS-1$
+//			node.getName().accept(this);
+//			return false;
+//		}
+//
+//		/*
+//		 * @see ASTVisitor#visit(SimpleName)
+//		 */
+//		public boolean visit(SimpleName node) {
+//			this.buffer.append(node.getIdentifier());
+//			return false;
+//		}
+//
+//		/*
+//		 * @see ASTVisitor#visit(SimpleName)
+//		 */
+//		public boolean visit(SimpleType node) {
+//			node.getName().accept(this);
+//			return false;
+//		}
+//	}
+
 	/*
 	 * Convert Javadoc source to match Javadoc.toString().
 	 * Store converted comments and their corresponding tags respectively
 	 * in this.comments and this.allTags fields
 	 */
-	void setSourceComment(char[] source) {
+	protected void setSourceComment(char[] source) {
 		this.comments = new ArrayList();
 		this.allTags = new ArrayList();
 		StringBuffer buffer = null;
@@ -372,71 +415,205 @@
 		String tag = null;
 		List tags = new ArrayList();
 		int length = source.length;
+		char previousChar=0, currentChar=0;
 		for (int i=0; i<length; i++) {
-			if (comment == 0) {
-				switch (source[i]) {
-					case '/':
-						switch (source[++i]) {
-							case '/':
-								comment = 1; // line comment
-								buffer = new StringBuffer("//");
-								i++;
-								break;
-							case '*':
-								if (source[++i] == '*') {
-									if (source[++i] == '/') { // empty block comment
-										this.comments.add("/**/");
-										this.allTags.add(new ArrayList());
+			previousChar = currentChar;
+			// get next char
+			currentChar = source[i];
+			int charLength = 1;
+			if (currentChar == '\\' && source[i+1] == 'u') {
+				//-------------unicode traitement ------------
+				int c1, c2, c3, c4;
+				charLength++;
+				while (source[i+charLength] == 'u') charLength++;
+				if (((c1 = Character.getNumericValue(source[i+charLength++])) > 15
+					|| c1 < 0)
+					|| ((c2 = Character.getNumericValue(source[i+charLength++])) > 15 || c2 < 0)
+					|| ((c3 = Character.getNumericValue(source[i+charLength++])) > 15 || c3 < 0)
+					|| ((c4 = Character.getNumericValue(source[i+charLength])) > 15 || c4 < 0)) {
+					throw new RuntimeException("Invalid unicode in source at "+i);
+				}
+				currentChar = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4);
+				i+=charLength;
+			}
+
+			// 
+			switch (comment) {
+				case 0: 
+					switch (currentChar) {
+						case '/':
+							comment = 1; // first char for comments...
+							buffer = new StringBuffer();
+							if (charLength == 1) {
+								buffer.append(currentChar);
+							} else  {
+								for (int k=i-charLength; k<=i; k++) buffer.append(source[k]);
+							}
+							break;
+						case '\'':
+							while (i<length) {
+								// get next char
+								currentChar = source[i];
+								if (currentChar == '\\' && source[i+1] == 'u') {
+									//-------------unicode traitement ------------
+									i++;
+									int c1, c2, c3, c4;
+									i++;
+									while (source[i] == 'u') i++;
+									if (((c1 = Character.getNumericValue(source[i++])) > 15
+										|| c1 < 0)
+										|| ((c2 = Character.getNumericValue(source[i++])) > 15 || c2 < 0)
+										|| ((c3 = Character.getNumericValue(source[i++])) > 15 || c3 < 0)
+										|| ((c4 = Character.getNumericValue(source[i++])) > 15 || c4 < 0)) {
+										throw new RuntimeException("Invalid unicode in source at "+i);
+									}
+									currentChar = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4);
+								}
+								if (currentChar == '\\') {
+									// get next char
+									currentChar = source[i];
+									if (currentChar == '\\' && source[i+1] == 'u') {
+										//-------------unicode traitement ------------
 										i++;
-									} else {
-										comment = 3; // javadoc
-										buffer = new StringBuffer("/**");
+										int c1, c2, c3, c4;
+										i++;
+										while (source[i] == 'u') i++;
+										if (((c1 = Character.getNumericValue(source[i++])) > 15
+											|| c1 < 0)
+											|| ((c2 = Character.getNumericValue(source[i++])) > 15 || c2 < 0)
+											|| ((c3 = Character.getNumericValue(source[i++])) > 15 || c3 < 0)
+											|| ((c4 = Character.getNumericValue(source[i++])) > 15 || c4 < 0)) {
+											throw new RuntimeException("Invalid unicode in source at "+i);
+										}
+										currentChar = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4);
 									}
 								} else {
-									comment = 2; // block comment
-									buffer = new StringBuffer("/*");
-								}
-								break;
-						}
-						break;
-					case '\'':
-						while (i<length) {
-							i++;
-							if (i==length) break;
-							if (source[i] == '\\') {
-								i++;
-							} else {
-								if (source[i] == '\'') {
-									break;
-								}
-							}
-						}
-						break;
-					case '"':
-						while (i<length) {
-							i++;
-							if (i==length) break;
-							if (source[i] == '\\') {
-								i++;
-							} else {
-								if (source[i] == '"') {
-									if ((i+1)==length) break;
-									if (source[i+1] == '"') {
-										i++;
-									} else {
+									if (currentChar == '\'') {
 										break;
 									}
 								}
 							}
-						}
-						break;
-				}
-			}
-			switch (comment) {
-				case 1: // line comment
-					if (source[i] == '\r' || source[i] == '\n') {
+							break;
+						case '"':
+							while (i<length) {
+								// get next char
+								currentChar = source[i];
+								if (currentChar == '\\' && source[i+1] == 'u') {
+									//-------------unicode traitement ------------
+									i++;
+									int c1, c2, c3, c4;
+									i++;
+									while (source[i] == 'u') i++;
+									if (((c1 = Character.getNumericValue(source[i++])) > 15
+										|| c1 < 0)
+										|| ((c2 = Character.getNumericValue(source[i++])) > 15 || c2 < 0)
+										|| ((c3 = Character.getNumericValue(source[i++])) > 15 || c3 < 0)
+										|| ((c4 = Character.getNumericValue(source[i++])) > 15 || c4 < 0)) {
+										throw new RuntimeException("Invalid unicode in source at "+i);
+									}
+									currentChar = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4);
+								}
+								if (currentChar == '\\') {
+									// get next char
+									currentChar = source[i];
+									if (currentChar == '\\' && source[i+1] == 'u') {
+										//-------------unicode traitement ------------
+										i++;
+										int c1, c2, c3, c4;
+										i++;
+										while (source[i] == 'u') i++;
+										if (((c1 = Character.getNumericValue(source[i++])) > 15
+											|| c1 < 0)
+											|| ((c2 = Character.getNumericValue(source[i++])) > 15 || c2 < 0)
+											|| ((c3 = Character.getNumericValue(source[i++])) > 15 || c3 < 0)
+											|| ((c4 = Character.getNumericValue(source[i++])) > 15 || c4 < 0)) {
+											throw new RuntimeException("Invalid unicode in source at "+i);
+										}
+										currentChar = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4);
+									}
+								} else {
+									if (currentChar == '"') {
+										int currentPos=i;
+										// get next char
+										currentChar = source[i];
+										if (currentChar == '\\' && source[i+1] == 'u') {
+											//-------------unicode traitement ------------
+											i++;
+											int c1, c2, c3, c4;
+											i++;
+											while (source[i] == 'u') i++;
+											if (((c1 = Character.getNumericValue(source[i++])) > 15
+												|| c1 < 0)
+												|| ((c2 = Character.getNumericValue(source[i++])) > 15 || c2 < 0)
+												|| ((c3 = Character.getNumericValue(source[i++])) > 15 || c3 < 0)
+												|| ((c4 = Character.getNumericValue(source[i++])) > 15 || c4 < 0)) {
+												throw new RuntimeException("Invalid unicode in source at "+i);
+											}
+											currentChar = (char) (((c1 * 16 + c2) * 16 + c3) * 16 + c4);
+										}
+										if (source[i+1] != '"') {
+											i=currentPos;
+											break;
+										}
+									}
+								}
+							}
+							break;
+					}
+					break;
+				case 1: // first '/' has been found...
+					switch (currentChar) {
+						case '/':
+							if (charLength == 1) {
+								buffer.append(currentChar);
+							} else  {
+								for (int k=i-charLength; k<=i; k++) buffer.append(source[k]);
+							}
+							comment = LINE_COMMENT;
+							break;
+						case '*':
+							if (charLength == 1) {
+								buffer.append(currentChar);
+							} else  {
+								for (int k=i-charLength; k<=i; k++) buffer.append(source[k]);
+							}
+							comment = 2; // next step
+							break;
+						default:
+							comment = 0;
+							break;
+					}
+					break;
+				case 2: // '/*' has been found...
+					if (currentChar == '*') {
+						comment = 3; // next step...
+					} else {
+						comment = BLOCK_COMMENT;
+					}
+					if (charLength == 1) {
+						buffer.append(currentChar);
+					} else  {
+							for (int k=i-charLength; k<=i; k++) buffer.append(source[k]);
+					}
+					break;
+				case 3: // '/**' has bee found, verify that's not an empty block comment
+					if (charLength == 1) {
+						buffer.append(currentChar);
+					} else  {
+						for (int k=i-charLength; k<=i; k++) buffer.append(source[k]);
+					}
+					if (currentChar == '/') { // empty block comment
+						this.comments.add(buffer.toString());
+						this.allTags.add(new ArrayList());
+						comment = 0;
+					} else {
+						comment = DOC_COMMENT;
+					}
+					break;
+				case LINE_COMMENT:
+					if (currentChar == '\r' || currentChar == '\n') {
 						/*
-						if (source[i] == '\r' && source[i+1] == '\n') {
+						if (currentChar == '\r' && source[i+1] == '\n') {
 							buffer.append(source[++i]);
 						}
 						*/
@@ -444,21 +621,25 @@
 						this.comments.add(buffer.toString());
 						this.allTags.add(tags);
 					} else {
-						buffer.append(source[i]);
+						if (charLength == 1) {
+							buffer.append(currentChar);
+						} else  {
+							for (int k=i-charLength; k<=i; k++) buffer.append(source[k]);
+						}
 					}
 					break;
-				case 3: // javadoc comment
+				case DOC_COMMENT:
 					if (tag != null) {
-						if (source[i] >= 'a' && source[i] <= 'z') {
-							tag += source[i];
+						if (currentChar >= 'a' && currentChar <= 'z') {
+							tag += currentChar;
 						} else {
 							tags.add(tag);
 							tag = null;
 						}
 					}
-					switch (source[i]) {
+					switch (currentChar) {
 						case '@':
-							if (!lineStarted || source[i-1] == '{') {
+							if (!lineStarted || previousChar == '{') {
 								tag = "";
 								lineStarted = true;
 							}
@@ -470,20 +651,24 @@
 						case '*':
 							break;
 						default:
-							if (!Character.isWhitespace(source[i])) {
+							if (!Character.isWhitespace(currentChar)) {
 								lineStarted = true;
 							}
 					}
-				case 2: // block comment
-					buffer.append(source[i]);
-					if (end && source[i] == '/') {
+				case BLOCK_COMMENT:
+					if (charLength == 1) {
+						buffer.append(currentChar);
+					} else  {
+						for (int k=i-charLength; k<=i; k++) buffer.append(source[k]);
+					}
+					if (end && currentChar == '/') {
 						comment = 0;
 						lineStarted = false;
 						this.comments.add(buffer.toString());
 						this.allTags.add(tags);
 						tags = new ArrayList();
 					}
-					end = source[i] == '*';
+					end = currentChar == '*';
 					break;
 				default:
 					// do nothing
@@ -491,6 +676,52 @@
 			}
 		}
 	}
+
+	/*
+	 * Convert Javadoc source to match Javadoc.toString().
+	 * Store converted comments and their corresponding tags respectively
+	 * in this.comments and this.allTags fields
+	 */
+	char[] getUnicodeSource(char[] source) {
+		int length = source.length;
+		int unicodeLength = length*6;
+		char[] unicodeSource = new char[unicodeLength];
+		int u=0;
+		for (int i=0; i<length; i++) {
+			// get next char
+			if (source[i] == '\\' && source[i+1] == 'u') {
+				//-------------unicode traitement ------------
+				int c1, c2, c3, c4;
+				unicodeSource[u++] = source[i];
+				unicodeSource[u++] = source[++i];
+				if (((c1 = Character.getNumericValue(source[i+1])) > 15
+					|| c1 < 0)
+					|| ((c2 = Character.getNumericValue(source[i+2])) > 15 || c2 < 0)
+					|| ((c3 = Character.getNumericValue(source[i+3])) > 15 || c3 < 0)
+					|| ((c4 = Character.getNumericValue(source[i+4])) > 15 || c4 < 0)) {
+					throw new RuntimeException("Invalid unicode in source at "+i);
+				}
+				for (int j=0; j<4; j++) unicodeSource[u++] = source[++i];
+			} else {
+				unicodeSource[u++] = '\\';
+				unicodeSource[u++] = 'u';
+				unicodeSource[u++] = '0';
+				unicodeSource[u++] = '0';
+				int val = source[i]/16;
+				unicodeSource[u++] = (char) (val<10 ? val+ 0x30 : val-10+0x61);
+				val = source[i]%16;
+				unicodeSource[u++] = (char) (val<10 ? val+ 0x30 : val-10+0x61);
+			}
+		}
+		// Return one well sized array
+		if (u != unicodeLength) {
+			char[] result = new char[u];
+			System.arraycopy(unicodeSource, 0, result, 0, u);
+			return result;
+		} else {
+			return unicodeSource;
+		}
+	}
 	
 	/*
 	 * Return all tags number for a given Javadoc
@@ -516,14 +747,11 @@
 	}
 
 	/*
-	 * Compare a string a subset of a char array.
+	 * Add a failure to the list. Use only one method as it easier to put breakpoint to
+	 * debug failure when it occurs...
 	 */
-	protected boolean compare(String str, int start, int length, char[] source) {
-		if (str.length() != length) return false;
-		for (int i=0; i<length; i++) {
-			if (str.charAt(i) != source[start+i]) return false;
-		}
-		return true;
+	private void addFailure(String msg) {
+		this.failures.add(msg);
 	}
 
 	/*
@@ -533,7 +761,7 @@
 	 */
 	protected void assumeTrue(String msg, boolean cond) {
 		if (!cond) {
-			this.failures.add(msg);
+			addFailure(msg);
 		}
 	}
 
@@ -544,7 +772,7 @@
 	 */
 	protected void assumeNull(String msg, Object obj) {
 		if (obj != null) {
-			this.failures.add(msg);
+			addFailure(msg);
 		}
 	}
 
@@ -555,7 +783,7 @@
 	 */
 	protected void assumeNotNull(String msg, Object obj) {
 		if (obj == null) {
-			this.failures.add(msg);
+			addFailure(msg);
 		}
 	}
 
@@ -566,7 +794,7 @@
 	 */
 	protected void assumeEquals(String msg, int expected, int actual) {
 		if (expected != actual) {
-			this.failures.add(msg+", expected="+expected+" actual="+actual);
+			addFailure(msg+", expected="+expected+" actual="+actual);
 		}
 	}
 
@@ -580,7 +808,7 @@
 			return;
 		if (expected != null && expected.equals(actual))
 			return;
-		this.failures.add(msg+", expected:<"+expected+"> actual:<"+actual+'>');
+		addFailure(msg+", expected:<"+expected+"> actual:<"+actual+'>');
 	}
 
 	/*
@@ -926,15 +1154,41 @@
 
 		// Create DOM AST nodes hierarchy
 		String sourceStr = this.sourceUnit.getSource();
-		IJavaProject project = this.sourceUnit.getJavaProject();
-		Map originalOptions = project.getOptions(true);
+		this.currentProject = this.sourceUnit.getJavaProject();
+
+		// set up java project options
+		this.currentProject.setOption(JavaCore.COMPILER_PB_INVALID_JAVADOC, this.compilerOption);
+		this.currentProject.setOption(JavaCore.COMPILER_PB_MISSING_JAVADOC_TAGS, this.compilerOption);
+		this.currentProject.setOption(JavaCore.COMPILER_PB_MISSING_JAVADOC_COMMENTS, this.compilerOption);
+		this.currentProject.setOption(JavaCore.COMPILER_PB_METHOD_WITH_CONSTRUCTOR_NAME, JavaCore.IGNORE);
+		this.currentProject.setOption(JavaCore.COMPILER_DOC_COMMENT_SUPPORT, this.docCommentSupport);
+
+		// Verify source regardings converted comments
+		char[] source = sourceStr.toCharArray();
+		String fileName = unit.getPath().toString();
+		verifyComments(fileName, source);
+	}
+	
+	protected void verifyComments(String fileName, char[] source) {
+
+		// Get comments infos from test file
+		setSourceComment(source);
+		
+		// Verify comments either in unicode or not
+		char[] testedSource = source;
+		if (unicode) {
+			testedSource = getUnicodeSource(source);
+		}
+//		Map originalOptions = this.currentProject.getOptions(true);
 		List unitComments = null;
-		try {
-			project.setOption(JavaCore.COMPILER_PB_INVALID_JAVADOC, this.compilerOption);
-			project.setOption(JavaCore.COMPILER_PB_MISSING_JAVADOC_TAGS, this.compilerOption);
-			project.setOption(JavaCore.COMPILER_PB_MISSING_JAVADOC_COMMENTS, this.compilerOption);
-			project.setOption(JavaCore.COMPILER_PB_METHOD_WITH_CONSTRUCTOR_NAME, JavaCore.IGNORE);
-			CompilationUnit compilUnit = (CompilationUnit) runConversion(this.sourceUnit, this.resolveBinding); // resolve bindings
+//		try {
+//			this.currentProject.setOption(JavaCore.COMPILER_PB_INVALID_JAVADOC, this.compilerOption);
+//			this.currentProject.setOption(JavaCore.COMPILER_PB_MISSING_JAVADOC_TAGS, this.compilerOption);
+//			this.currentProject.setOption(JavaCore.COMPILER_PB_MISSING_JAVADOC_COMMENTS, this.compilerOption);
+//			this.currentProject.setOption(JavaCore.COMPILER_PB_METHOD_WITH_CONSTRUCTOR_NAME, JavaCore.IGNORE);
+//			this.currentProject.setOption(JavaCore.COMPILER_DOC_COMMENT_SUPPORT, this.docCommentSupport);
+			CompilationUnit compilUnit = (CompilationUnit) runConversion(testedSource, fileName, this.currentProject);
+//			CompilationUnit compilUnit = (CompilationUnit) runConversion(this.sourceUnit, this.resolveBinding); // resolve bindings
 			if (this.compilerOption.equals(JavaCore.ERROR)) {
 				assumeEquals(this.prefix+"Unexpected problems", 0, compilUnit.getProblems().length); //$NON-NLS-1$
 			} else if (this.compilerOption.equals(JavaCore.WARNING)) {
@@ -948,47 +1202,42 @@
 				}
 			}
 			unitComments = compilUnit.getCommentList();
-		} finally {
-			project.setOptions(originalOptions);
-		}
+//		} finally {
+//			this.currentProject.setOptions(originalOptions);
+//		}
 		assumeNotNull(this.prefix+"Unexpected problems", unitComments);
 		
-		// Verify source regardings converted comments
-		char[] source = sourceStr.toCharArray();
-		verifyComments(sourceStr, source, unitComments);
-	}
-
-	/* (non-Javadoc)
-	 * @see junit.framework.TestCase#setUp()
-	 */
-	protected void verifyComments(String sourceStr, char[] source, List unitComments) {
-		// Get comments infos from test file
-		setSourceComment(source);
-		
 		// Basic comments verification
 		int size = unitComments.size();
-		assumeEquals(this.prefix+"Wrong number of comments in source:\n"+sourceStr+"\n", this.comments.size(), size);
 		
+		assumeEquals(this.prefix+"Wrong number of comments!", this.comments.size(), size);
+
 		// Verify comments positions and bindings
-		for (int i=0; i<size; i++) {
-			Comment comment = (Comment) unitComments.get(i);
-			List tags = (List) allTags.get(i);
-			// Verify flattened content
-			String stringComment = (String) this.comments.get(i);
-			ASTConverterJavadocFlattener printer = new ASTConverterJavadocFlattener(stringComment);
-			comment.accept(printer);
-			String text = new String(source, comment.getStartPosition(), comment.getLength());
-			assumeEquals(this.prefix+"Flattened comment does NOT match source!", stringComment, text);
-			// Verify javdoc tags positions and bindings
-			if (comment.isDocComment()) {
-				Javadoc docComment = (Javadoc)comment;
-				assumeEquals(this.prefix+"Invalid tags number in javadoc:\n"+docComment+"\n", tags.size(), allTags(docComment));
-				verifyPositions(docComment, source);
-				if (this.resolveBinding) {
-					verifyBindings(docComment);
+//		if (this.comments.size() == size) {
+			for (int i=0; i<size; i++) {
+				Comment comment = (Comment) unitComments.get(i);
+				List tags = (List) allTags.get(i);
+				// Verify flattened content
+				String stringComment = (String) this.comments.get(i);
+	//			ASTConverterJavadocFlattener printer = new ASTConverterJavadocFlattener(stringComment);
+	//			comment.accept(printer);
+				String text = new String(testedSource, comment.getStartPosition(), comment.getLength());
+				assumeEquals(this.prefix+"Flattened comment does NOT match source!", stringComment, text);
+				// Verify javdoc tags positions and bindings
+				if (comment.isDocComment()) {
+					Javadoc docComment = (Javadoc)comment;
+					if (this.docCommentSupport.equals(JavaCore.ENABLED)) {
+						assumeEquals(this.prefix+"Invalid tags number in javadoc:\n"+docComment+"\n", tags.size(), allTags(docComment));
+						verifyPositions(docComment, testedSource);
+						if (this.resolveBinding) {
+							verifyBindings(docComment);
+						}
+					} else {
+						assumeEquals("Javadoc should be flat!", 0, docComment.tags().size());
+					}
 				}
 			}
-		}
+//		}
 		
 		/* Verify each javadoc: not implemented yet
 		Iterator types = compilUnit.types().listIterator();
@@ -1333,9 +1582,12 @@
 	public void testBug52908() throws JavaModelException {
 		verifyComments("testBug52908");
 	}
+	public void testBug52908unicode() throws JavaModelException {
+		verifyComments("testBug52908unicode");
+	}
 
 	/**
-	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=5xxxA
+	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=53276
 	 */
 	public void testBug53276() throws JavaModelException {
 		verifyComments("testBug53276");
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterTest2.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterTest2.java
index d6246d4..284bacf 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterTest2.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverterTest2.java
@@ -96,7 +96,7 @@
 			return new Suite(ASTConverterTest2.class);		
 		}
 		TestSuite suite = new Suite(ASTConverterTest2.class.getName());
-		suite.addTest(new ASTConverterTest2("test0538d"));
+		suite.addTest(new ASTConverterTest2("test0539"));
 		return suite;
 	}
 	/**
@@ -4287,4 +4287,31 @@
 			sourceUnit.discardWorkingCopy();
 		}
 	}
+	/**
+	 * http://dev.eclipse.org/bugs/show_bug.cgi?id=53477
+	 */
+	public void test0539() throws JavaModelException {
+		ICompilationUnit sourceUnit = getCompilationUnit("Converter", "src", "test0539", "A.java"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
+		char[] source = sourceUnit.getSource().toCharArray();
+		ASTNode result = runConversion(sourceUnit, false);
+		final CompilationUnit unit = (CompilationUnit) result;
+		assertEquals("Wrong number of problems", 0, unit.getProblems().length); //$NON-NLS-1$
+		ASTNode node = getASTNode(unit, 0, 1, 0);
+		assertNotNull("No node", node);
+		assertTrue("not an expression statement", node.getNodeType() == ASTNode.EXPRESSION_STATEMENT);
+		ExpressionStatement expressionStatement = (ExpressionStatement) node;
+		Expression expression = expressionStatement.getExpression();
+		assertTrue("not a class instance creation", expression.getNodeType() == ASTNode.CLASS_INSTANCE_CREATION);
+		ClassInstanceCreation classInstanceCreation = (ClassInstanceCreation) expression;
+		checkSourceRange(classInstanceCreation, "new A(){}.new Inner(){/*x*/}", source);
+		AnonymousClassDeclaration anonymousClassDeclaration = classInstanceCreation.getAnonymousClassDeclaration();
+		Expression expression2 = classInstanceCreation.getExpression();
+		assertTrue("not a class instance creation", expression2.getNodeType() == ASTNode.CLASS_INSTANCE_CREATION);
+		ClassInstanceCreation classInstanceCreation2 = (ClassInstanceCreation) expression2;
+		AnonymousClassDeclaration anonymousClassDeclaration2 = classInstanceCreation2.getAnonymousClassDeclaration();
+		assertNotNull("No anonymous class declaration", anonymousClassDeclaration2);
+		checkSourceRange(anonymousClassDeclaration2, "{}", source);
+		assertNotNull("No anonymous class declaration", anonymousClassDeclaration);
+		checkSourceRange(anonymousClassDeclaration, "{/*x*/}", source);
+	}	
 }
\ No newline at end of file
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchJavadocTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchJavadocTests.java
index 3ad2103..0986df9 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchJavadocTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchJavadocTests.java
@@ -11,6 +11,7 @@
 package org.eclipse.jdt.core.tests.model;
 
 import java.util.Map;
+import java.util.StringTokenizer;
 
 import junit.framework.Test;
 import junit.framework.TestSuite;
@@ -28,18 +29,42 @@
 public class JavaSearchJavadocTests extends JavaSearchTests {
 
 	Map originalOptions;
+	final String docCommentSupport;
+	static final String DOC_COMMENT_SUPPORT = System.getProperty("doc.support");
 
 	/**
 	 * @param name
 	 */
-	public JavaSearchJavadocTests(String name) {
+	public JavaSearchJavadocTests(String name, String support) {
 		super(name);
+		this.docCommentSupport = support;
 	}
-	private void resetProjectOptions() {
+	public JavaSearchJavadocTests(String name) {
+		this(name, JavaCore.ENABLED);
+	}
+	
+	/* (non-Javadoc)
+	 * @see org.eclipse.jdt.core.tests.model.SuiteOfTestCases#setUpSuite()
+	 */
+	public void setUp() throws Exception {
+		super.setUp();
+		this.originalOptions = this.javaProject.getOptions(true);
+		this.javaProject.setOption(JavaCore.COMPILER_DOC_COMMENT_SUPPORT, this.docCommentSupport);
+	}
+	/* (non-Javadoc)
+	 * @see org.eclipse.jdt.core.tests.model.SuiteOfTestCases#tearDownSuite()
+	 */
+	public void tearDown() throws Exception {
+		super.tearDown();
 		this.javaProject.setOptions(originalOptions);
 	}
+	/* (non-Javadoc)
+	 * @see junit.framework.TestCase#getName()
+	 */
+	public String getName() {
+		return "Doc "+this.docCommentSupport+" - "+super.getName();
+	}
 	private void setJavadocOptions() {
-		this.originalOptions = this.javaProject.getOptions(true);
 		this.javaProject.setOption(JavaCore.COMPILER_PB_INVALID_JAVADOC, JavaCore.WARNING);
 		this.javaProject.setOption(JavaCore.COMPILER_PB_MISSING_JAVADOC_COMMENTS, JavaCore.ERROR);
 	}
@@ -47,69 +72,104 @@
 		// NOTE: cannot use 'new Suite(JavaSearchJavadocTests.class)' as this would include tests from super class
 		TestSuite suite = new Suite(JavaSearchJavadocTests.class.getName());
 
-		// Tests on type declarations
-		suite.addTest(new JavaSearchJavadocTests("testJavadocTypeDeclaration"));
-		suite.addTest(new JavaSearchJavadocTests("testJavadocTypeDeclarationWithJavadoc"));
-		suite.addTest(new JavaSearchJavadocTests("testJavadocTypeStringDeclaration"));
-		
-		// Tests on field declarations
-		suite.addTest(new JavaSearchJavadocTests("testJavadocFieldDeclaration"));
-		suite.addTest(new JavaSearchJavadocTests("testJavadocFieldDeclarationWithJavadoc"));
-		suite.addTest(new JavaSearchJavadocTests("testJavadocFieldStringDeclaration"));
-
-		// Tests on method declarations
-		suite.addTest(new JavaSearchJavadocTests("testJavadocMethodDeclaration"));
-		suite.addTest(new JavaSearchJavadocTests("testJavadocMethodArgDeclaration"));
-		suite.addTest(new JavaSearchJavadocTests("testJavadocMethodDeclarationWithJavadoc"));
-		suite.addTest(new JavaSearchJavadocTests("testJavadocMethodArgDeclarationWithJavadoc"));
-		suite.addTest(new JavaSearchJavadocTests("testJavadocMethodStringDeclaration"));
-
-		// Tests on type references
-		suite.addTest(new JavaSearchJavadocTests("testJavadocTypeReference"));
-		suite.addTest(new JavaSearchJavadocTests("testJavadocTypeReferenceWithJavadoc"));
-		suite.addTest(new JavaSearchJavadocTests("testJavadocTypeStringReference"));
-		suite.addTest(new JavaSearchJavadocTests("testJavadocTypeStringReferenceWithJavadoc"));
-
-		// Tests on field references
-		suite.addTest(new JavaSearchJavadocTests("testJavadocFieldReference"));
-		suite.addTest(new JavaSearchJavadocTests("testJavadocFieldReferenceWithJavadoc"));
-		suite.addTest(new JavaSearchJavadocTests("testJavadocFieldStringReference"));
-		suite.addTest(new JavaSearchJavadocTests("testJavadocFieldStringReferenceWithJavadoc"));
-
-		// Tests on method references
-		suite.addTest(new JavaSearchJavadocTests("testJavadocMethodReference"));
-		suite.addTest(new JavaSearchJavadocTests("testJavadocMethodArgReference"));
-		suite.addTest(new JavaSearchJavadocTests("testJavadocMethodReferenceWithJavadoc"));
-		suite.addTest(new JavaSearchJavadocTests("testJavadocMethodArgReferenceWithJavadoc"));
-		suite.addTest(new JavaSearchJavadocTests("testJavadocMethodStringReference"));
-		suite.addTest(new JavaSearchJavadocTests("testJavadocMethodStringReferenceWithJavadoc"));
-
-		// Tests on constructor references
-		suite.addTest(new JavaSearchJavadocTests("testJavadocConstructorReference"));
-		suite.addTest(new JavaSearchJavadocTests("testJavadocConstructorArgReference"));
-		suite.addTest(new JavaSearchJavadocTests("testJavadocConstructorReferenceWithJavadoc"));
-		suite.addTest(new JavaSearchJavadocTests("testJavadocConstructorArgReferenceWithJavadoc"));
-		suite.addTest(new JavaSearchJavadocTests("testJavadocConstructorStringReference"));
-		suite.addTest(new JavaSearchJavadocTests("testJavadocConstructorStringReferenceWithJavadoc"));
-
-		// Tests on bugs
-		suite.addTest(new JavaSearchJavadocTests("testBug47909"));
-		suite.addTest(new JavaSearchJavadocTests("testBug47968type"));
-		suite.addTest(new JavaSearchJavadocTests("testBug47968field"));
-		suite.addTest(new JavaSearchJavadocTests("testBug47968method"));
-		suite.addTest(new JavaSearchJavadocTests("testBug47968constructor"));
-		suite.addTest(new JavaSearchJavadocTests("testBug47209type"));
-		suite.addTest(new JavaSearchJavadocTests("testBug47209field"));
-		suite.addTest(new JavaSearchJavadocTests("testBug47209method"));
-		suite.addTest(new JavaSearchJavadocTests("testBug47209constructor"));
-		suite.addTest(new JavaSearchJavadocTests("testBug49994"));
-		suite.addTest(new JavaSearchJavadocTests("testBug49994field"));
-		suite.addTest(new JavaSearchJavadocTests("testBug49994method"));
-		suite.addTest(new JavaSearchJavadocTests("testBug49994constructor"));
+		if (DOC_COMMENT_SUPPORT == null) {
+			// Default is to test both Doc Comment Support ON and OFF
+			buildSuite(suite, JavaCore.ENABLED);
+			buildSuite(suite, JavaCore.DISABLED);
+		} else {
+			// Test specified with Doc Comment Support
+			String support = DOC_COMMENT_SUPPORT==null ? JavaCore.DISABLED : (DOC_COMMENT_SUPPORT.equals(JavaCore.DISABLED)?JavaCore.DISABLED:JavaCore.ENABLED);
+			buildSuite(suite, support);
+		}
 		
 		return suite;
 	}
 
+	public static void buildSuite(TestSuite suite, String support) {
+//		TestSuite suite = new Suite("Doc "+support);
+		// Tests on type declarations
+		suite.addTest(new JavaSearchJavadocTests("testJavadocTypeDeclaration", support));
+		suite.addTest(new JavaSearchJavadocTests("testJavadocTypeDeclarationWithJavadoc", support));
+		suite.addTest(new JavaSearchJavadocTests("testJavadocTypeStringDeclaration", support));
+		
+		// Tests on field declarations
+		suite.addTest(new JavaSearchJavadocTests("testJavadocFieldDeclaration", support));
+		suite.addTest(new JavaSearchJavadocTests("testJavadocFieldDeclarationWithJavadoc", support));
+		suite.addTest(new JavaSearchJavadocTests("testJavadocFieldStringDeclaration", support));
+
+		// Tests on method declarations
+		suite.addTest(new JavaSearchJavadocTests("testJavadocMethodDeclaration", support));
+		suite.addTest(new JavaSearchJavadocTests("testJavadocMethodArgDeclaration", support));
+		suite.addTest(new JavaSearchJavadocTests("testJavadocMethodDeclarationWithJavadoc", support));
+		suite.addTest(new JavaSearchJavadocTests("testJavadocMethodArgDeclarationWithJavadoc", support));
+		suite.addTest(new JavaSearchJavadocTests("testJavadocMethodStringDeclaration", support));
+
+		// Tests on type references
+		suite.addTest(new JavaSearchJavadocTests("testJavadocTypeReference", support));
+		suite.addTest(new JavaSearchJavadocTests("testJavadocTypeReferenceWithJavadoc", support));
+		suite.addTest(new JavaSearchJavadocTests("testJavadocTypeStringReference", support));
+		suite.addTest(new JavaSearchJavadocTests("testJavadocTypeStringReferenceWithJavadoc", support));
+
+		// Tests on field references
+		suite.addTest(new JavaSearchJavadocTests("testJavadocFieldReference", support));
+		suite.addTest(new JavaSearchJavadocTests("testJavadocFieldReferenceWithJavadoc", support));
+		suite.addTest(new JavaSearchJavadocTests("testJavadocFieldStringReference", support));
+		suite.addTest(new JavaSearchJavadocTests("testJavadocFieldStringReferenceWithJavadoc", support));
+
+		// Tests on method references
+		suite.addTest(new JavaSearchJavadocTests("testJavadocMethodReference", support));
+		suite.addTest(new JavaSearchJavadocTests("testJavadocMethodArgReference", support));
+		suite.addTest(new JavaSearchJavadocTests("testJavadocMethodReferenceWithJavadoc", support));
+		suite.addTest(new JavaSearchJavadocTests("testJavadocMethodArgReferenceWithJavadoc", support));
+		suite.addTest(new JavaSearchJavadocTests("testJavadocMethodStringReference", support));
+		suite.addTest(new JavaSearchJavadocTests("testJavadocMethodStringReferenceWithJavadoc", support));
+
+		// Tests on constructor references
+		suite.addTest(new JavaSearchJavadocTests("testJavadocConstructorReference", support));
+		suite.addTest(new JavaSearchJavadocTests("testJavadocConstructorArgReference", support));
+		suite.addTest(new JavaSearchJavadocTests("testJavadocConstructorReferenceWithJavadoc", support));
+		suite.addTest(new JavaSearchJavadocTests("testJavadocConstructorArgReferenceWithJavadoc", support));
+		suite.addTest(new JavaSearchJavadocTests("testJavadocConstructorStringReference", support));
+		suite.addTest(new JavaSearchJavadocTests("testJavadocConstructorStringReferenceWithJavadoc", support));
+
+		// Tests on bugs
+		suite.addTest(new JavaSearchJavadocTests("testBug47909", support));
+		suite.addTest(new JavaSearchJavadocTests("testBug47968type", support));
+		suite.addTest(new JavaSearchJavadocTests("testBug47968field", support));
+		suite.addTest(new JavaSearchJavadocTests("testBug47968method", support));
+		suite.addTest(new JavaSearchJavadocTests("testBug47968constructor", support));
+		suite.addTest(new JavaSearchJavadocTests("testBug47209type", support));
+		suite.addTest(new JavaSearchJavadocTests("testBug47209field", support));
+		suite.addTest(new JavaSearchJavadocTests("testBug47209method", support));
+		suite.addTest(new JavaSearchJavadocTests("testBug47209constructor", support));
+		suite.addTest(new JavaSearchJavadocTests("testBug49994", support));
+		suite.addTest(new JavaSearchJavadocTests("testBug49994field", support));
+		suite.addTest(new JavaSearchJavadocTests("testBug49994method", support));
+		suite.addTest(new JavaSearchJavadocTests("testBug49994constructor", support));
+		
+//		return suite;
+	}
+
+	/* (non-Javadoc)
+	 * @see org.eclipse.jdt.core.tests.model.AbstractJavaModelTests#assertSearchResults(java.lang.String, java.lang.Object)
+	 */
+	protected void assertSearchResults(String message, String expected, Object collector) {
+		if (JavaCore.ENABLED.equals(this.docCommentSupport)) {
+			super.assertSearchResults(message, expected, collector);
+		} else {
+			StringTokenizer tokenizer = new StringTokenizer(expected, "\n");
+			StringBuffer buffer = new StringBuffer(expected.length());
+			while (tokenizer.hasMoreTokens()) {
+				String token = tokenizer.nextToken();
+				if (token.startsWith("src/j1/JavadocSearched.java") || token.startsWith("test47909.jar")) {
+					if (buffer.length() > 0) buffer.append('\n');
+					buffer.append(token);
+				}
+			}
+//			System.out.println(getName()+" - Expected: "+buffer.toString());
+			super.assertSearchResults(message, buffer.toString(), collector);
+		}
+	}
 	/*
 	 * Test search of type declaration in javadoc comments
 	 * ===================================================
@@ -146,7 +206,7 @@
 	}
 	public void testJavadocTypeDeclarationWithJavadoc() throws CoreException {
 		IType type = getCompilationUnit("JavaSearch", "src", "j1", "JavadocSearched.java").getType("JavadocSearched");
-		try {
+//		try {
 			setJavadocOptions();
 			JavaSearchResultCollector result = new JavaSearchResultCollector();
 			result.showAccuracy = true;
@@ -160,9 +220,9 @@
 			assertSearchResults(
 					"src/j1/JavadocSearched.java j1.JavadocSearched [JavadocSearched] EXACT_MATCH",
 					result);
-		} finally {
-			resetProjectOptions();
-		}
+//		} finally {
+//			resetProjectOptions();
+//		}
 	}
 
 	/*
@@ -203,7 +263,7 @@
 	public void testJavadocFieldDeclarationWithJavadoc() throws CoreException {
 		IType type = getCompilationUnit("JavaSearch", "src", "j1", "JavadocSearched.java").getType("JavadocSearched");
 		IField field = type.getField("javadocSearchedVar");
-		try {
+//		try {
 			setJavadocOptions();
 			JavaSearchResultCollector result = new JavaSearchResultCollector();
 			result.showAccuracy = true;
@@ -217,9 +277,9 @@
 			assertSearchResults(
 					"src/j1/JavadocSearched.java j1.JavadocSearched.javadocSearchedVar [javadocSearchedVar] EXACT_MATCH",
 					result);
-		} finally {
-			resetProjectOptions();
-		}
+//		} finally {
+//			resetProjectOptions();
+//		}
 	}
 
 	/*
@@ -276,7 +336,7 @@
 	}
 	public void testJavadocMethodDeclarationWithJavadoc() throws CoreException {
 		IType type = getCompilationUnit("JavaSearch", "src", "j1", "JavadocSearched.java").getType("JavadocSearched");
-		try {
+//		try {
 			setJavadocOptions();
 			IMethod method = type.getMethod("javadocSearchedMethod", null);
 			JavaSearchResultCollector result = new JavaSearchResultCollector();
@@ -291,13 +351,13 @@
 			assertSearchResults(
 					"src/j1/JavadocSearched.java void j1.JavadocSearched.javadocSearchedMethod() [javadocSearchedMethod] EXACT_MATCH",
 					result);
-		} finally {
-			resetProjectOptions();
-		}
+//		} finally {
+//			resetProjectOptions();
+//		}
 	}
 	public void testJavadocMethodArgDeclarationWithJavadoc() throws CoreException {
 		IType type = getCompilationUnit("JavaSearch", "src", "j1", "JavadocSearched.java").getType("JavadocSearched");
-		try {
+//		try {
 			setJavadocOptions();
 			IMethod method = type.getMethod("javadocSearchedMethod", new String[] { "QString;" });
 			JavaSearchResultCollector result = new JavaSearchResultCollector();
@@ -312,9 +372,9 @@
 			assertSearchResults(
 					"src/j1/JavadocSearched.java void j1.JavadocSearched.javadocSearchedMethod(String) [javadocSearchedMethod] EXACT_MATCH",
 					result);
-		} finally {
-			resetProjectOptions();
-		}
+//		} finally {
+//			resetProjectOptions();
+//		}
 	}
 
 	/*
@@ -373,7 +433,7 @@
 	}
 	public void testJavadocTypeReferenceWithJavadoc() throws CoreException {
 		IType type = getCompilationUnit("JavaSearch", "src", "j1", "JavadocSearched.java").getType("JavadocSearched");
-		try {
+//		try {
 			setJavadocOptions();
 			JavaSearchResultCollector result = new JavaSearchResultCollector();
 			result.showAccuracy = true;
@@ -397,12 +457,12 @@
 				"src/j1/JavadocValidRef.java void j1.JavadocValidRef.valid() [JavadocSearched] EXACT_MATCH\n"+
 				"src/j1/JavadocValidRef.java void j1.JavadocValidRef.valid() [JavadocSearched] EXACT_MATCH",
 				result);
-		} finally {
-			resetProjectOptions();
-		}
+//		} finally {
+//			resetProjectOptions();
+//		}
 	}
 	public void testJavadocTypeStringReferenceWithJavadoc() throws CoreException {
-		try {
+//		try {
 			setJavadocOptions();
 			JavaSearchResultCollector result = new JavaSearchResultCollector();
 			result.showAccuracy = true;
@@ -427,9 +487,9 @@
 				"src/j1/JavadocValidRef.java void j1.JavadocValidRef.valid() [JavadocSearched] EXACT_MATCH\n"+
 				"src/j1/JavadocValidRef.java void j1.JavadocValidRef.valid() [JavadocSearched] EXACT_MATCH",
 				result);
-		} finally {
-			resetProjectOptions();
-		}
+//		} finally {
+//			resetProjectOptions();
+//		}
 	}
 
 	/*
@@ -473,7 +533,7 @@
 	public void testJavadocFieldReferenceWithJavadoc() throws CoreException {
 		IType type = getCompilationUnit("JavaSearch", "src", "j1", "JavadocSearched.java").getType("JavadocSearched");
 		IField field = type.getField("javadocSearchedVar");
-		try {
+//		try {
 			setJavadocOptions();
 			JavaSearchResultCollector result = new JavaSearchResultCollector();
 			result.showAccuracy = true;
@@ -488,12 +548,12 @@
 					"src/j1/JavadocInvalidRef.java void j1.JavadocInvalidRef.invalid() [javadocSearchedVar] POTENTIAL_MATCH\n" + 
 					"src/j1/JavadocValidRef.java void j1.JavadocValidRef.valid() [javadocSearchedVar] EXACT_MATCH",
 					result);
-		} finally {
-			resetProjectOptions();
-		}
+//		} finally {
+//			resetProjectOptions();
+//		}
 	}
 	public void testJavadocFieldStringReferenceWithJavadoc() throws CoreException {
-		try {
+//		try {
 			setJavadocOptions();
 			JavaSearchResultCollector result = new JavaSearchResultCollector();
 			result.showAccuracy = true;
@@ -510,9 +570,9 @@
 					"src/j1/JavadocInvalidRef.java void j1.JavadocInvalidRef.invalid() [javadocSearchedVar] POTENTIAL_MATCH\n" + 
 					"src/j1/JavadocValidRef.java void j1.JavadocValidRef.valid() [javadocSearchedVar] EXACT_MATCH",
 					result);
-		} finally {
-			resetProjectOptions();
-		}
+//		} finally {
+//			resetProjectOptions();
+//		}
 	}
 
 	/*
@@ -572,7 +632,7 @@
 	}
 	public void testJavadocMethodReferenceWithJavadoc() throws CoreException {
 		IType type = getCompilationUnit("JavaSearch", "src", "j1", "JavadocSearched.java").getType("JavadocSearched");
-		try {
+//		try {
 			setJavadocOptions();
 			IMethod method = type.getMethod("javadocSearchedMethod", null);
 			JavaSearchResultCollector result = new JavaSearchResultCollector();
@@ -588,13 +648,13 @@
 					"src/j1/JavadocInvalidRef.java void j1.JavadocInvalidRef.invalid() [javadocSearchedMethod] POTENTIAL_MATCH\n" + 
 					"src/j1/JavadocValidRef.java void j1.JavadocValidRef.valid() [javadocSearchedMethod] EXACT_MATCH",
 					result);
-		} finally {
-			resetProjectOptions();
-		}
+//		} finally {
+//			resetProjectOptions();
+//		}
 	}
 	public void testJavadocMethodArgReferenceWithJavadoc() throws CoreException {
 		IType type = getCompilationUnit("JavaSearch", "src", "j1", "JavadocSearched.java").getType("JavadocSearched");
-		try {
+//		try {
 			setJavadocOptions();
 			IMethod method = type.getMethod("javadocSearchedMethod", new String[] { "QString;" });
 			JavaSearchResultCollector result = new JavaSearchResultCollector();
@@ -609,12 +669,12 @@
 			assertSearchResults(
 					"src/j1/JavadocValidRef.java void j1.JavadocValidRef.valid() [javadocSearchedMethod] EXACT_MATCH",
 					result);
-		} finally {
-			resetProjectOptions();
-		}
+//		} finally {
+//			resetProjectOptions();
+//		}
 	}
 	public void testJavadocMethodStringReferenceWithJavadoc() throws CoreException {
-		try {
+//		try {
 			setJavadocOptions();
 			JavaSearchResultCollector result = new JavaSearchResultCollector();
 			result.showAccuracy = true;
@@ -632,9 +692,9 @@
 					"src/j1/JavadocValidRef.java void j1.JavadocValidRef.valid() [javadocSearchedMethod] EXACT_MATCH\n" + 
 					"src/j1/JavadocValidRef.java void j1.JavadocValidRef.valid() [javadocSearchedMethod] EXACT_MATCH",
 					result);
-		} finally {
-			resetProjectOptions();
-		}
+//		} finally {
+//			resetProjectOptions();
+//		}
 	}
 
 	/*
@@ -692,7 +752,7 @@
 	}
 	public void testJavadocConstructorReferenceWithJavadoc() throws CoreException {
 		IType type = getCompilationUnit("JavaSearch", "src", "j1", "JavadocSearched.java").getType("JavadocSearched");
-		try {
+//		try {
 			setJavadocOptions();
 			IMethod method = type.getMethod("JavadocSearched", null);
 			JavaSearchResultCollector result = new JavaSearchResultCollector();
@@ -707,13 +767,13 @@
 			assertSearchResults(
 					"src/j1/JavadocValidRef.java void j1.JavadocValidRef.valid() [JavadocSearched] EXACT_MATCH",
 					result);
-		} finally {
-			resetProjectOptions();
-		}
+//		} finally {
+//			resetProjectOptions();
+//		}
 	}
 	public void testJavadocConstructorArgReferenceWithJavadoc() throws CoreException {
 		IType type = getCompilationUnit("JavaSearch", "src", "j1", "JavadocSearched.java").getType("JavadocSearched");
-		try {
+//		try {
 			setJavadocOptions();
 			IMethod method = type.getMethod("JavadocSearched", new String[] { "QString;" });
 			JavaSearchResultCollector result = new JavaSearchResultCollector();
@@ -728,12 +788,12 @@
 			assertSearchResults(
 					"src/j1/JavadocValidRef.java void j1.JavadocValidRef.valid() [JavadocSearched] EXACT_MATCH",
 					result);
-		} finally {
-			resetProjectOptions();
-		}
+//		} finally {
+//			resetProjectOptions();
+//		}
 	}
 	public void testJavadocConstructorStringReferenceWithJavadoc() throws CoreException {
-		try {
+//		try {
 			setJavadocOptions();
 			JavaSearchResultCollector result = new JavaSearchResultCollector();
 			result.showAccuracy = true;
@@ -750,9 +810,9 @@
 				"src/j1/JavadocValidRef.java void j1.JavadocValidRef.valid() [JavadocSearched] EXACT_MATCH\n" + 
 				"src/j1/JavadocValidRef.java void j1.JavadocValidRef.valid() [JavadocSearched] EXACT_MATCH",
 				result);
-		} finally {
-			resetProjectOptions();
-		}
+//		} finally {
+//			resetProjectOptions();
+//		}
 	}
 
 	/**
@@ -762,7 +822,7 @@
 	 */
 	public void testBug47909() throws CoreException {
 		IType type = getCompilationUnit("JavaSearch", "src", "j3", "Y.java").getType("Y");
-		try {
+//		try {
 			setJavadocOptions();
 			IMethod method = type.getMethod("Y", new String[] { "I" });
 			JavaSearchResultCollector result = new JavaSearchResultCollector();
@@ -777,9 +837,9 @@
 			assertSearchResults(
 				"test47909.jar void j3.X.bar() EXACT_MATCH",
 				result);
-		} finally {
-			resetProjectOptions();
-		}
+//		} finally {
+//			resetProjectOptions();
+//		}
 	}
 	
 	/**
@@ -789,7 +849,7 @@
 	 */
 	public void testBug47968type() throws CoreException {
 		IType type = getCompilationUnit("JavaSearch", "src", "j2", "Bug47968.java").getType("Bug47968");
-		try {
+//		try {
 			setJavadocOptions();
 			JavaSearchResultCollector result = new JavaSearchResultCollector();
 			result.showAccuracy = true;
@@ -820,13 +880,13 @@
 				"src/j2/Bug47968s.java void j2.Bug47968s.bar() [Bug47968] EXACT_MATCH\n" + 
 				"src/j2/Bug47968s.java void j2.Bug47968s.bar() [Bug47968] EXACT_MATCH",
 				result);
-		} finally {
-			resetProjectOptions();
-		}
+//		} finally {
+//			resetProjectOptions();
+//		}
 	}
 	public void testBug47968field() throws CoreException {
 		IType type = getCompilationUnit("JavaSearch", "src", "j2", "Bug47968.java").getType("Bug47968");
-		try {
+//		try {
 			setJavadocOptions();
 			IField field = type.getField("x");
 			JavaSearchResultCollector result = new JavaSearchResultCollector();
@@ -844,13 +904,13 @@
 				"src/j2/Bug47968s.java j2.Bug47968s() [x] EXACT_MATCH\n" + 
 				"src/j2/Bug47968s.java void j2.Bug47968s.bar() [x] EXACT_MATCH",
 				result);
-		} finally {
-			resetProjectOptions();
-		}
+//		} finally {
+//			resetProjectOptions();
+//		}
 	}
 	public void testBug47968method() throws CoreException {
 		IType type = getCompilationUnit("JavaSearch", "src", "j2", "Bug47968.java").getType("Bug47968");
-		try {
+//		try {
 			setJavadocOptions();
 			IMethod method = type.getMethod("foo", new String[] { "I" });
 			JavaSearchResultCollector result = new JavaSearchResultCollector();
@@ -868,13 +928,13 @@
 				"src/j2/Bug47968s.java j2.Bug47968s() [foo] EXACT_MATCH\n" + 
 				"src/j2/Bug47968s.java void j2.Bug47968s.bar() [foo] EXACT_MATCH",
 				result);
-		} finally {
-			resetProjectOptions();
-		}
+//		} finally {
+//			resetProjectOptions();
+//		}
 	}
 	public void testBug47968constructor() throws CoreException {
 		IType type = getCompilationUnit("JavaSearch", "src", "j2", "Bug47968.java").getType("Bug47968");
-		try {
+//		try {
 			setJavadocOptions();
 			IMethod method = type.getMethod("Bug47968", new String[] { "QString;" });
 			JavaSearchResultCollector result = new JavaSearchResultCollector();
@@ -892,9 +952,9 @@
 				"src/j2/Bug47968s.java j2.Bug47968s() [Bug47968] EXACT_MATCH\n" + 
 				"src/j2/Bug47968s.java void j2.Bug47968s.bar() [Bug47968] EXACT_MATCH",
 				result);
-		} finally {
-			resetProjectOptions();
-		}
+//		} finally {
+//			resetProjectOptions();
+//		}
 	}
 
 	/**
@@ -903,7 +963,7 @@
 	 * @throws CoreException
 	 */
 	public void testBug47209type() throws CoreException {
-		try {
+//		try {
 			setJavadocOptions();
 			JavaSearchResultCollector result = new JavaSearchResultCollector();
 			result.showAccuracy = true;
@@ -921,12 +981,12 @@
 					"src/j4/TC47209.java j4.TC47209(String) [TC47209] EXACT_MATCH\n" +
 					"src/j4/TM47209.java void j4.TM47209.m47209(int) [TM47209] EXACT_MATCH",
 				result);
-		} finally {
-			resetProjectOptions();
-		}
+//		} finally {
+//			resetProjectOptions();
+//		}
 	}
 	public void testBug47209field() throws CoreException {
-		try {
+//		try {
 			setJavadocOptions();
 			JavaSearchResultCollector result = new JavaSearchResultCollector();
 			result.showAccuracy = true;
@@ -944,12 +1004,12 @@
 					"src/j4/FC47209.java j4.FC47209(String) [FC47209] EXACT_MATCH\n" +
 					"src/j4/FM47209.java void j4.FM47209.m47209(int) [FM47209] EXACT_MATCH",
 				result);
-		} finally {
-			resetProjectOptions();
-		}
+//		} finally {
+//			resetProjectOptions();
+//		}
 	}
 	public void testBug47209method() throws CoreException {
-		try {
+//		try {
 			setJavadocOptions();
 			JavaSearchResultCollector result = new JavaSearchResultCollector();
 			result.showAccuracy = true;
@@ -967,12 +1027,12 @@
 					"src/j4/MC47209.java j4.MC47209(String) [MC47209] EXACT_MATCH\n" +
 					"src/j4/MM47209.java void j4.MM47209.m47209(int) [MM47209] EXACT_MATCH",
 				result);
-		} finally {
-			resetProjectOptions();
-		}
+//		} finally {
+//			resetProjectOptions();
+//		}
 	}
 	public void testBug47209constructor() throws CoreException {
-		try {
+//		try {
 			setJavadocOptions();
 			JavaSearchResultCollector result = new JavaSearchResultCollector();
 			result.showAccuracy = true;
@@ -990,9 +1050,9 @@
 					"src/j4/CC47209.java j4.CC47209(String) [CC47209] EXACT_MATCH\n" +
 					"src/j4/CM47209.java void j4.CM47209.m47209(int) [CM47209] EXACT_MATCH",
 				result);
-		} finally {
-			resetProjectOptions();
-		}
+//		} finally {
+//			resetProjectOptions();
+//		}
 	}
 
 	/**
@@ -1001,19 +1061,19 @@
 	 * @throws CoreException
 	 */
 	public void testBug49994() throws CoreException {
-		try {
+//		try {
 			setJavadocOptions();
 			JavaSearchResultCollector result = new JavaSearchResultCollector();
 			result.showAccuracy = true;
 			IType type = getCompilationUnit("JavaSearch", "src", "j5", "Bug49994.java").getType("Bug49994");
 			new SearchEngine().search(getWorkspace(),  type, REFERENCES,  getJavaSearchScope(), result);
 			assertSearchResults("", result);
-		} finally {
-			resetProjectOptions();
-		}
+//		} finally {
+//			resetProjectOptions();
+//		}
 	}
 	public void testBug49994field() throws CoreException {
-		try {
+//		try {
 			setJavadocOptions();
 			JavaSearchResultCollector result = new JavaSearchResultCollector();
 			result.showAccuracy = true;
@@ -1021,12 +1081,12 @@
 			IField field = type.getField("field");
 			new SearchEngine().search(getWorkspace(), field, REFERENCES, getJavaSearchScope(), result);
 			assertSearchResults("src/j5/Bug49994.java void j5.Bug49994.foo() [field] EXACT_MATCH", result);
-		} finally {
-			resetProjectOptions();
-		}
+//		} finally {
+//			resetProjectOptions();
+//		}
 	}
 	public void testBug49994method() throws CoreException {
-		try {
+//		try {
 			setJavadocOptions();
 			JavaSearchResultCollector result = new JavaSearchResultCollector();
 			result.showAccuracy = true;
@@ -1034,12 +1094,12 @@
 			IMethod method = type.getMethod("bar", new String[0]);
 			new SearchEngine().search(getWorkspace(), method, REFERENCES, getJavaSearchScope(), result);
 			assertSearchResults("src/j5/Bug49994.java void j5.Bug49994.foo() [bar] EXACT_MATCH", result);
-		} finally {
-			resetProjectOptions();
-		}
+//		} finally {
+//			resetProjectOptions();
+//		}
 	}
 	public void testBug49994constructor() throws CoreException {
-		try {
+//		try {
 			setJavadocOptions();
 			JavaSearchResultCollector result = new JavaSearchResultCollector();
 			result.showAccuracy = true;
@@ -1047,8 +1107,8 @@
 			IMethod method = type.getMethod("Bug49994", new String[] { "QString;" });
 			new SearchEngine().search(getWorkspace(), method, REFERENCES, getJavaSearchScope(), result);
 			assertSearchResults("src/j5/Bug49994.java void j5.Bug49994.foo() [Bug49994] EXACT_MATCH", result);
-		} finally {
-			resetProjectOptions();
-		}
+//		} finally {
+//			resetProjectOptions();
+//		}
 	}
 }
diff --git a/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/Main.java b/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/Main.java
index 81177f2..a8229f2 100644
--- a/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/Main.java
+++ b/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/Main.java
@@ -842,39 +842,51 @@
 							isEnabling ? CompilerOptions.WARNING : CompilerOptions.IGNORE);
 					} else if (token.equals("javadoc")) {//$NON-NLS-1$ 
 						this.options.put(
-							CompilerOptions.OPTION_ReportInvalidJavadoc,
-							isEnabling ? CompilerOptions.WARNING : CompilerOptions.IGNORE);
-						this.options.put(
-							CompilerOptions.OPTION_ReportInvalidJavadocTags,
-							isEnabling ? CompilerOptions.ENABLED : CompilerOptions.DISABLED);
-						this.options.put(
-							CompilerOptions.OPTION_ReportInvalidJavadocTagsVisibility,
-							isEnabling ? CompilerOptions.PRIVATE : CompilerOptions.PUBLIC);
-						this.options.put(
-							CompilerOptions.OPTION_ReportMissingJavadocTags,
-							isEnabling ? CompilerOptions.WARNING : CompilerOptions.IGNORE);
-						this.options.put(
-							CompilerOptions.OPTION_ReportMissingJavadocTagsVisibility,
-							isEnabling ? CompilerOptions.PRIVATE : CompilerOptions.PUBLIC);
+							CompilerOptions.OPTION_DocCommentSupport,
+							isEnabling ? CompilerOptions.ENABLED: CompilerOptions.DISABLED);
+						// if disabling then it's not necessary to set other javadoc options
+						if (isEnabling) {
+							this.options.put(
+								CompilerOptions.OPTION_ReportInvalidJavadoc,
+								CompilerOptions.WARNING);
+							this.options.put(
+								CompilerOptions.OPTION_ReportInvalidJavadocTags,
+								CompilerOptions.ENABLED);
+							this.options.put(
+								CompilerOptions.OPTION_ReportInvalidJavadocTagsVisibility,
+								CompilerOptions.PRIVATE);
+							this.options.put(
+								CompilerOptions.OPTION_ReportMissingJavadocTags,
+								CompilerOptions.WARNING);
+							this.options.put(
+								CompilerOptions.OPTION_ReportMissingJavadocTagsVisibility,
+								CompilerOptions.PRIVATE);
+						}
 					} else if (token.equals("allJavadoc")) { //$NON-NLS-1$
 						this.options.put(
+							CompilerOptions.OPTION_DocCommentSupport,
+							isEnabling ? CompilerOptions.ENABLED: CompilerOptions.DISABLED);
+						// if disabling then it's not necessary to set other javadoc options
+						if (isEnabling) {
+							this.options.put(
 							CompilerOptions.OPTION_ReportInvalidJavadoc,
-							isEnabling ? CompilerOptions.WARNING : CompilerOptions.IGNORE);
-						this.options.put(
-							CompilerOptions.OPTION_ReportInvalidJavadocTags,
-							isEnabling ? CompilerOptions.ENABLED : CompilerOptions.DISABLED);
-						this.options.put(
-							CompilerOptions.OPTION_ReportInvalidJavadocTagsVisibility,
-							isEnabling ? CompilerOptions.PRIVATE : CompilerOptions.PUBLIC);
-						this.options.put(
-							CompilerOptions.OPTION_ReportMissingJavadocTags,
-							isEnabling ? CompilerOptions.WARNING : CompilerOptions.IGNORE);
-						this.options.put(
-							CompilerOptions.OPTION_ReportMissingJavadocTagsVisibility,
-							isEnabling ? CompilerOptions.PRIVATE : CompilerOptions.PUBLIC);
-						this.options.put(
-							CompilerOptions.OPTION_ReportMissingJavadocComments,
-							isEnabling ? CompilerOptions.WARNING : CompilerOptions.IGNORE);
+							CompilerOptions.WARNING);
+							this.options.put(
+								CompilerOptions.OPTION_ReportInvalidJavadocTags,
+								CompilerOptions.ENABLED);
+							this.options.put(
+								CompilerOptions.OPTION_ReportInvalidJavadocTagsVisibility,
+								CompilerOptions.PRIVATE);
+							this.options.put(
+								CompilerOptions.OPTION_ReportMissingJavadocTags,
+								CompilerOptions.WARNING);
+							this.options.put(
+								CompilerOptions.OPTION_ReportMissingJavadocTagsVisibility,
+								CompilerOptions.PRIVATE);
+							this.options.put(
+								CompilerOptions.OPTION_ReportMissingJavadocComments,
+								CompilerOptions.WARNING);
+						}
 					} else if (token.startsWith("tasks")) { //$NON-NLS-1$
 						String taskTags = ""; //$NON-NLS-1$
 						int start = token.indexOf('(');
diff --git a/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/messages.properties b/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/messages.properties
index f7ce4bd..510d4a7 100644
--- a/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/messages.properties
+++ b/org.eclipse.jdt.core/batch/org/eclipse/jdt/internal/compiler/batch/messages.properties
@@ -12,7 +12,7 @@
 
 ### compiler 
 compiler.name = Eclipse Java Compiler
-compiler.version = 0.411
+compiler.version = 0.412
 compiler.copyright = Copyright IBM Corp 2000, 2004. All rights reserved.
 
 ### scanning
diff --git a/org.eclipse.jdt.core/buildnotes_jdt-core.html b/org.eclipse.jdt.core/buildnotes_jdt-core.html
index e99c160..d50b2d2 100644
--- a/org.eclipse.jdt.core/buildnotes_jdt-core.html
+++ b/org.eclipse.jdt.core/buildnotes_jdt-core.html
@@ -54,6 +54,44 @@
 ArrayStoreException in 1.5 parser
 
 
+<a name="v_412"></a>
+<p><hr><h1>
+Eclipse Platform Build Notes&nbsp;<br>
+Java Development Tooling Core</h1>
+Eclipse SDK 3.0M8 Build - ?th March 2004
+<br>Project org.eclipse.jdt.core v_412
+(<a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jdt.core/?only_with_tag=v_412">cvs</a>).
+<h2>
+What's new in this drop</h2>
+<ul>
+<li>Added new global option for doc comment (Javadoc) support. By default, this option is enabled for backward compatibility.
+<pre>
+	 * COMPILER / Javadoc Comment Support
+	 *    When this support is disabled, the compiler will ignore all javadoc problems options settings
+	 *    and will not report any javadoc problem. It will also not find any reference in javadoc comment and
+	 *    DOM AST Javadoc node will be only a flat text instead of having structured tag elements.
+	 *     - option id:         "org.eclipse.jdt.core.compiler.doc.comment.support"
+	 *     - possible values:   { "enabled", "disabled" }
+	 *     - default:           "enabled"
+</pre>
+See bug <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=52264">52264</a>.
+</li>
+</ul>
+
+<h3>Problem Reports Fixed</h3>
+<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=53357">53357</a>
+Java AST creation error
+<br><a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=52264">52264</a>
+Need a global preference to enable Javadoc support
+<br><a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=51529">51529</a>
+"Organize imports" is confused by references inside Javadoc
+<br><a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=53477">53477</a>
+AnonymousClassDeclaration has wrong range
+<br><a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=53624">53624</a>
+StackOverFlow in Code assist 
+<br><a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=50433">50433</a>
+Rationalize signatures of AST.parse* methods 
+
 <a name="v_411"></a>
 <p><hr><h1>
 Eclipse Platform Build Notes&nbsp;<br>
diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java
index c1e0db0..74b8ce6 100644
--- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java
+++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java
@@ -1793,7 +1793,7 @@
 				pushOnElementStack(K_BETWEEN_CATCH_AND_RIGHT_PAREN);
 				break;
 			case TokenNameLPAREN:
-				if (this.invocationType == NO_RECEIVER || this.invocationType == NAME_RECEIVER) {
+				if (this.invocationType == NO_RECEIVER || this.invocationType == NAME_RECEIVER || this.invocationType == SUPER_RECEIVER) {
 					this.qualifier = this.expressionPtr; // remenber the last expression so that arguments are correctly computed
 				}
 				switch (previous) {
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java
index 54c28ca..d652a22 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/impl/CompilerOptions.java
@@ -31,6 +31,7 @@
 	public static final String OPTION_LineNumberAttribute = "org.eclipse.jdt.core.compiler.debug.lineNumber"; //$NON-NLS-1$
 	public static final String OPTION_SourceFileAttribute = "org.eclipse.jdt.core.compiler.debug.sourceFile"; //$NON-NLS-1$
 	public static final String OPTION_PreserveUnusedLocal = "org.eclipse.jdt.core.compiler.codegen.unusedLocal"; //$NON-NLS-1$
+	public static final String OPTION_DocCommentSupport= "org.eclipse.jdt.core.compiler.doc.comment.support"; //$NON-NLS-1$
 	public static final String OPTION_ReportMethodWithConstructorName = "org.eclipse.jdt.core.compiler.problem.methodWithConstructorName"; //$NON-NLS-1$
 	public static final String OPTION_ReportOverridingPackageDefaultMethod = "org.eclipse.jdt.core.compiler.problem.overridingPackageDefaultMethod"; //$NON-NLS-1$
 	public static final String OPTION_ReportDeprecation = "org.eclipse.jdt.core.compiler.problem.deprecation"; //$NON-NLS-1$
@@ -230,6 +231,9 @@
 	// JSR bytecode usage
 	public boolean useJsrBytecode = true;
 	
+	// javadoc comment support
+	public boolean docCommentSupport = false;
+	
 	
 	/** 
 	 * Initializing the compiler options with defaults
@@ -254,6 +258,7 @@
 		optionsMap.put(OPTION_LineNumberAttribute, (this.produceDebugAttributes & Lines) != 0 ? GENERATE : DO_NOT_GENERATE);
 		optionsMap.put(OPTION_SourceFileAttribute, (this.produceDebugAttributes & Source) != 0 ? GENERATE : DO_NOT_GENERATE);
 		optionsMap.put(OPTION_PreserveUnusedLocal, this.preserveAllLocalVariables ? PRESERVE : OPTIMIZE_OUT);
+		optionsMap.put(OPTION_DocCommentSupport, this.docCommentSupport ? ENABLED : DISABLED); 
 		optionsMap.put(OPTION_ReportMethodWithConstructorName, getSeverityString(MethodWithConstructorName)); 
 		optionsMap.put(OPTION_ReportOverridingPackageDefaultMethod, getSeverityString(OverriddenPackageDefaultMethod)); 
 		optionsMap.put(OPTION_ReportDeprecation, getSeverityString(UsingDeprecatedAPI)); 
@@ -497,6 +502,13 @@
 		if ((optionValue = optionsMap.get(OPTION_ReportNoEffectAssignment)) != null) updateSeverity(NoEffectAssignment, optionValue);
 
 		// Javadoc options
+		if ((optionValue = optionsMap.get(OPTION_DocCommentSupport)) != null) {
+			if (ENABLED.equals(optionValue)) {
+				this.docCommentSupport = true;
+			} else if (DISABLED.equals(optionValue)) {
+				this.docCommentSupport = false;
+			}
+		}
 		if ((optionValue = optionsMap.get(OPTION_ReportInvalidJavadoc)) != null) {
 			updateSeverity(InvalidJavadoc, optionValue);
 		}
@@ -589,15 +601,16 @@
 		buf.append("\n\t- superfluous semicolon: ").append(getSeverityString(SuperfluousSemicolon)); //$NON-NLS-1$
 		buf.append("\n\t- uncommented empty block: ").append(getSeverityString(UndocumentedEmptyBlock)); //$NON-NLS-1$
 		buf.append("\n\t- unnecessary type check: ").append(getSeverityString(UnnecessaryTypeCheck)); //$NON-NLS-1$
-		buf.append("\n\t- invalid javadoc: ").append(getSeverityString(InvalidJavadoc)); //$NON-NLS-1$
-		buf.append("\n\t- report invalid javadoc tags: ").append(this.reportInvalidJavadocTags ? ENABLED : DISABLED); //$NON-NLS-1$
-		buf.append("\n\t- visibility level to report invalid javadoc tags: ").append(getVisibilityString(this.reportInvalidJavadocTagsVisibility)); //$NON-NLS-1$
-		buf.append("\n\t- missing javadoc tags: ").append(getSeverityString(MissingJavadocTags)); //$NON-NLS-1$
-		buf.append("\n\t- visibility level to report missing javadoc tags: ").append(getVisibilityString(this.reportMissingJavadocTagsVisibility)); //$NON-NLS-1$
-		buf.append("\n\t- report missing javadoc tags in overriding methods: ").append(this.reportMissingJavadocTagsOverriding ? ENABLED : DISABLED); //$NON-NLS-1$
-		buf.append("\n\t- missing javadoc comments: ").append(getSeverityString(MissingJavadocComments)); //$NON-NLS-1$
-		buf.append("\n\t- visibility level to report missing javadoc comments: ").append(getVisibilityString(this.reportMissingJavadocCommentsVisibility)); //$NON-NLS-1$
-		buf.append("\n\t- report missing javadoc comments in overriding methods: ").append(this.reportMissingJavadocCommentsOverriding ? ENABLED : DISABLED); //$NON-NLS-1$
+		buf.append("\n\t- javadoc comment support: ").append(this.docCommentSupport ? "ON" : " OFF"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
+		buf.append("\n\t\t+ invalid javadoc: ").append(getSeverityString(InvalidJavadoc)); //$NON-NLS-1$
+		buf.append("\n\t\t+ report invalid javadoc tags: ").append(this.reportInvalidJavadocTags ? ENABLED : DISABLED); //$NON-NLS-1$
+		buf.append("\n\t\t+ visibility level to report invalid javadoc tags: ").append(getVisibilityString(this.reportInvalidJavadocTagsVisibility)); //$NON-NLS-1$
+		buf.append("\n\t\t+ missing javadoc tags: ").append(getSeverityString(MissingJavadocTags)); //$NON-NLS-1$
+		buf.append("\n\t\t+ visibility level to report missing javadoc tags: ").append(getVisibilityString(this.reportMissingJavadocTagsVisibility)); //$NON-NLS-1$
+		buf.append("\n\t\t+ report missing javadoc tags in overriding methods: ").append(this.reportMissingJavadocTagsOverriding ? ENABLED : DISABLED); //$NON-NLS-1$
+		buf.append("\n\t\t+ missing javadoc comments: ").append(getSeverityString(MissingJavadocComments)); //$NON-NLS-1$
+		buf.append("\n\t\t+ visibility level to report missing javadoc comments: ").append(getVisibilityString(this.reportMissingJavadocCommentsVisibility)); //$NON-NLS-1$
+		buf.append("\n\t\t+ report missing javadoc comments in overriding methods: ").append(this.reportMissingJavadocCommentsOverriding ? ENABLED : DISABLED); //$NON-NLS-1$
 		buf.append("\n\t- finally block not completing normally: ").append(getSeverityString(FinallyBlockNotCompleting)); //$NON-NLS-1$
 		buf.append("\n\t- unused declared thrown exception: ").append(getSeverityString(UnusedDeclaredThrownException)); //$NON-NLS-1$
 		buf.append("\n\t- unused declared thrown exception when overriding ").append(this.reportUnusedDeclaredThrownExceptionWhenOverriding ? ENABLED : DISABLED); //$NON-NLS-1$
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/AbstractCommentParser.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/AbstractCommentParser.java
index c118b0b..0bd6b1c 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/AbstractCommentParser.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/AbstractCommentParser.java
@@ -46,6 +46,7 @@
 	
 	// Public fields
 	public Scanner scanner;
+	public boolean checkDocComment = false;
 	
 	// Protected fields
 	protected boolean inherited, deprecated;
@@ -102,7 +103,8 @@
 			this.endComment = javadocEnd;
 			this.index = javadocStart;
 			readChar(); // starting '/'
-			int charPosition = this.index;
+			int previousPosition = this.index;
+			int endTextPosition = this.index;
 			readChar(); // first '*'
 			char nextCharacter= readChar(); // second '*'
 			
@@ -124,7 +126,7 @@
 			
 			// Loop on each comment character
 			while (this.index < this.endComment) {
-				int previousPosition = this.index;
+				previousPosition = this.index;
 				previousChar = nextCharacter;
 				
 				// Calculate line end (cannot use this.scanner.linePtr as scanner does not parse line ends again)
@@ -163,12 +165,12 @@
 							this.lineStarted = true;
 							if (this.inlineTagStarted) {
 								this.inlineTagStarted = false;
-								if (this.sourceParser != null) this.sourceParser.problemReporter().javadocInvalidTag(this.inlineTagStart, charPosition);
+								if (this.sourceParser != null) this.sourceParser.problemReporter().javadocInvalidTag(this.inlineTagStart, endTextPosition);
 								validComment = false;
 							} else {
 								if (previousChar == '{') {
-									if (this.textStart != -1 && this.textStart <= charPosition) {
-										pushText(this.textStart, charPosition);
+									if (this.textStart != -1 && this.textStart < endTextPosition) {
+										pushText(this.textStart, endTextPosition);
 									}
 									this.inlineTagStarted = true;
 								}
@@ -283,9 +285,8 @@
 						break;
 					case '\r':
 					case '\n':
-						int position = previousChar == '{' ? this.inlineTagStart : charPosition;
-						if (this.lineStarted && this.textStart <= position) {
-							pushText(this.textStart, position);
+						if (this.lineStarted && this.textStart < previousPosition) {
+							pushText(this.textStart, previousPosition);
 						}
 						this.lineStarted = false;
 						this.inlineTagStarted = false;
@@ -294,18 +295,18 @@
 						break;
 					case '}' :
 						if (this.inlineTagStarted) {
-							if (this.lineStarted && this.textStart != -1 && this.textStart <= charPosition) {
-								pushText(this.textStart, charPosition);
+							if (this.lineStarted && this.textStart != -1 && this.textStart < previousPosition) {
+								pushText(this.textStart, previousPosition);
 							}
 							if (this.kind == DOM_PARSER) refreshInlineTagPosition(previousPosition);
 							this.textStart = this.index;
 							this.inlineTagStarted = false;
-						} else /*if (this.index <= this.lineEnd)*/ {
+						} else {
 							if (!this.lineStarted) {
 								this.textStart = previousPosition;
 							}
 							this.lineStarted = true;
-							charPosition = previousPosition;
+							endTextPosition = previousPosition;
 						}
 						break;
 					case '{' :
@@ -321,10 +322,11 @@
 						}
 						break;
 					case '*' :
-						charPosition = previousPosition;
+						// do nothing for '*' character
+						endTextPosition = previousPosition;
 						break;
 					default :
-						charPosition = previousPosition;
+						endTextPosition = previousPosition;
 						if (!CharOperation.isWhitespace(nextCharacter)) {
 							if (!this.lineStarted) {
 								this.textStart = previousPosition;
@@ -333,8 +335,8 @@
 						}
 				}
 			}
-			if (this.lineStarted && this.textStart <= charPosition) {
-				pushText(this.textStart, charPosition);
+			if (this.lineStarted && this.textStart < previousPosition) {
+				pushText(this.textStart, previousPosition);
 			}
 			updateDocComment();
 		} catch (Exception ex) {
@@ -678,7 +680,7 @@
 							if (this.source[this.index] == '\r' || this.source[this.index] == '\n') {
 								if (this.kind == DOM_PARSER) {
 									parseTag();
-									pushText(previousPosition, this.index-1);
+									pushText(previousPosition, this.index);
 								}
 								return true;
 							}
@@ -698,7 +700,7 @@
 								if (this.source[this.index] == '\r' || this.source[this.index] == '\n') {
 									if (this.kind == DOM_PARSER) {
 										parseTag();
-										pushText(previousPosition, this.index-1);
+										pushText(previousPosition, this.index);
 									}
 									return true;
 								}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/JavadocParser.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/JavadocParser.java
index 7016c8f..4f7d12b 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/JavadocParser.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/parser/JavadocParser.java
@@ -38,12 +38,10 @@
 
 	// Public fields
 	public Javadoc docComment;
-	public boolean checkDocComment = false;
 
 	JavadocParser(Parser sourceParser) {
 		super(sourceParser);
-		this.checkDocComment = (this.sourceParser.options.getSeverity(CompilerOptions.InvalidJavadoc) != ProblemSeverities.Ignore) ||
-			(this.sourceParser.options.getSeverity(CompilerOptions.MissingJavadocTags) != ProblemSeverities.Ignore);
+		this.checkDocComment = this.sourceParser.options.docCommentSupport;
 		this.kind = COMPIL_PARSER;
 	}
 
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java
index 9e44d03..2d82112 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/ProblemReporter.java
@@ -501,7 +501,11 @@
 		case IProblem.JavadocInvalidSeeHref:
 		case IProblem.JavadocInvalidSeeArgs:
 		case IProblem.JavadocInvalidTag:
-			return this.options.getSeverity(CompilerOptions.InvalidJavadoc);
+			if (this.options.docCommentSupport) {
+				return this.options.getSeverity(CompilerOptions.InvalidJavadoc);
+			} else {
+				return ProblemSeverities.Ignore;
+			}
 
 		/*
 		 * Javadoc tags resolved references errors
@@ -533,10 +537,11 @@
 		case IProblem.JavadocInternalTypeNameProvided:
 		case IProblem.JavadocNoMessageSendOnArrayType:
 		case IProblem.JavadocNoMessageSendOnBaseType:
-			if (!this.options.reportInvalidJavadocTags)
-				return ProblemSeverities.Ignore;
-			else
+			if (this.options.docCommentSupport && this.options.reportInvalidJavadocTags) {
 				return this.options.getSeverity(CompilerOptions.InvalidJavadoc);
+			} else {
+				return ProblemSeverities.Ignore;
+			}
 
 		/*
 		 * Javadoc missing tags errors
@@ -544,13 +549,21 @@
 		case IProblem.JavadocMissingParamTag:
 		case IProblem.JavadocMissingReturnTag:
 		case IProblem.JavadocMissingThrowsTag:
-			return this.options.getSeverity(CompilerOptions.MissingJavadocTags);
+			if (this.options.docCommentSupport) {
+				return this.options.getSeverity(CompilerOptions.MissingJavadocTags);
+			} else {
+				return ProblemSeverities.Ignore;
+			}
 
 		/*
 		 * Missing Javadoc errors
 		 */
 		case IProblem.JavadocMissing:
-			return this.options.getSeverity(CompilerOptions.MissingJavadocComments);
+			if (this.options.docCommentSupport) {
+				return this.options.getSeverity(CompilerOptions.MissingJavadocComments);
+			} else {
+				return ProblemSeverities.Ignore;
+			}
 
 		// by default problems are errors.
 		default:
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AST.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AST.java
index 539e35b..1f5fac3 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AST.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AST.java
@@ -395,7 +395,7 @@
 		}
 		try {
 			this.disableEvents++;
-			this.eventHandler.preRemoveChildEvent(node, child, property);
+			this.eventHandler.postRemoveChildEvent(node, child, property);
 			// N.B. even if event handler blows up, the AST is not
 			// corrupted since node has not been changed yet
 		} finally {
@@ -469,7 +469,7 @@
 		}
 		try {
 			this.disableEvents++;
-			this.eventHandler.postAddChildEvent(node, child, property);
+			this.eventHandler.preAddChildEvent(node, child, property);
 			// N.B. even if event handler blows up, the AST is not
 			// corrupted since node has already been changed
 		} finally {
@@ -517,7 +517,7 @@
 		}
 		try {
 			this.disableEvents++;
-			this.eventHandler.postValueChangeEvent(node, property);
+			this.eventHandler.preValueChangeEvent(node, property);
 			// N.B. even if event handler blows up, the AST is not
 			// corrupted since node has already been changed
 		} finally {
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java
index 92e5238..7a292dd 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter.java
@@ -44,6 +44,7 @@
 	private IProgressMonitor monitor;
 	// comments
 	private boolean insideComments;
+	private DocCommentParser docParser;
 	private Comment[] commentsTable;
 
 	public ASTConverter(Map options, boolean resolveBindings, IProgressMonitor monitor) {
@@ -56,11 +57,12 @@
 					null /*taskTags*/,
 					null/*taskPriorities*/);
 		this.monitor = monitor;
-		this.insideComments = true;
+		this.insideComments = JavaCore.ENABLED.equals(options.get(JavaCore.COMPILER_DOC_COMMENT_SUPPORT));
 	}
 	
 	public void setAST(AST ast) {
 		this.ast = ast;
+		this.docParser = new DocCommentParser(this.ast, this.scanner, this.insideComments);
 	}
 
 	/*
@@ -132,7 +134,7 @@
 
 		// Parse comments
 		int[][] comments = unit.comments;
-		if (comments != null && this.insideComments) {
+		if (comments != null) {
 			buildCommentsTable(compilationUnit, comments);
 		}
 
@@ -1124,7 +1126,7 @@
 				}
 			}
 			AnonymousClassDeclaration anonymousClassDeclaration = this.ast.newAnonymousClassDeclaration();
-			int start = retrieveStartBlockPosition(declarationSourceStart, allocation.anonymousType.bodyEnd);
+			int start = retrieveStartBlockPosition(allocation.anonymousType.sourceEnd, allocation.anonymousType.bodyEnd);
 			anonymousClassDeclaration.setSourceRange(start, allocation.anonymousType.bodyEnd - start + 1);
 			classInstanceCreation.setAnonymousClassDeclaration(anonymousClassDeclaration);
 			buildBodyDeclarations(allocation.anonymousType, anonymousClassDeclaration);
@@ -3094,8 +3096,7 @@
 		int end = positions[1];
 		if (positions[1]>0) { // Javadoc comments have positive end position
 			this.ast.newJavadoc();
-			DocCommentParser docParser = new DocCommentParser(this.ast, this.scanner);
-			Javadoc docComment = docParser.parse(positions);
+			Javadoc docComment = this.docParser.parse(positions);
 			if (docComment == null) return null;
 			comment = docComment;
 		} else {
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter2.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter2.java
index 8514e9e..8a46fae 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter2.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTConverter2.java
@@ -44,6 +44,7 @@
 	private IProgressMonitor monitor;
 	// comments
 	private boolean insideComments;
+	private DocCommentParser docParser;
 	private Comment[] commentsTable;
 
 	public ASTConverter2(Map options, boolean resolveBindings, IProgressMonitor monitor) {
@@ -56,11 +57,12 @@
 					null /*taskTags*/,
 					null/*taskPriorities*/);
 		this.monitor = monitor;
-		this.insideComments = true;
+		this.insideComments = JavaCore.ENABLED.equals(options.get(JavaCore.COMPILER_DOC_COMMENT_SUPPORT));
 	}
 	
 	public void setAST(AST ast) {
 		this.ast = ast;
+		this.docParser = new DocCommentParser(this.ast, this.scanner, this.insideComments);
 	}
 
 	/*
@@ -132,7 +134,7 @@
 
 		// Parse comments
 		int[][] comments = unit.comments;
-		if (comments != null && this.insideComments) {
+		if (comments != null) {
 			buildCommentsTable(compilationUnit, comments);
 		}
 
@@ -1124,7 +1126,7 @@
 				}
 			}
 			AnonymousClassDeclaration anonymousClassDeclaration = this.ast.newAnonymousClassDeclaration();
-			int start = retrieveStartBlockPosition(declarationSourceStart, allocation.anonymousType.bodyEnd);
+			int start = retrieveStartBlockPosition(allocation.anonymousType.sourceEnd, allocation.anonymousType.bodyEnd);
 			anonymousClassDeclaration.setSourceRange(start, allocation.anonymousType.bodyEnd - start + 1);
 			classInstanceCreation.setAnonymousClassDeclaration(anonymousClassDeclaration);
 			buildBodyDeclarations(allocation.anonymousType, anonymousClassDeclaration);
@@ -3094,8 +3096,7 @@
 		int end = positions[1];
 		if (positions[1]>0) { // Javadoc comments have positive end position
 			this.ast.newJavadoc();
-			DocCommentParser docParser = new DocCommentParser(this.ast, this.scanner);
-			Javadoc docComment = docParser.parse(positions);
+			Javadoc docComment = this.docParser.parse(positions);
 			if (docComment == null) return null;
 			comment = docComment;
 		} else {
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultBindingResolver.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultBindingResolver.java
index 8eeca85..68839d3 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultBindingResolver.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DefaultBindingResolver.java
@@ -54,6 +54,7 @@
 import org.eclipse.jdt.internal.compiler.lookup.ProblemReasons;
 import org.eclipse.jdt.internal.compiler.lookup.ProblemReferenceBinding;
 import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
+import org.eclipse.jdt.internal.compiler.problem.AbortCompilation;
 
 /**
  * Internal class for resolving bindings using old ASTs.
@@ -132,10 +133,14 @@
 				// a extra lookup is required
 				BlockScope internalScope = (BlockScope) this.astNodesToBlockScope.get(name);
 				Binding binding = null;
-				if (internalScope == null) {
-					binding = this.scope.getTypeOrPackage(CharOperation.subarray(tokens, 0, indexInQualifiedName));
-				} else {
-					binding = internalScope.getTypeOrPackage(CharOperation.subarray(tokens, 0, indexInQualifiedName));
+				try {
+					if (internalScope == null) {
+						binding = this.scope.getTypeOrPackage(CharOperation.subarray(tokens, 0, indexInQualifiedName));
+					} else {
+						binding = internalScope.getTypeOrPackage(CharOperation.subarray(tokens, 0, indexInQualifiedName));
+					}
+				} catch (AbortCompilation e) {
+					// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=53357
 				}
 				if (binding instanceof org.eclipse.jdt.internal.compiler.lookup.PackageBinding) {
 					return this.getPackageBinding((org.eclipse.jdt.internal.compiler.lookup.PackageBinding)binding);
@@ -205,10 +210,14 @@
 				if (indexInQualifiedName >= 0) {
 					BlockScope internalScope = (BlockScope) this.astNodesToBlockScope.get(name);
 					Binding binding = null;
-					if (internalScope == null) {
-						binding = this.scope.getTypeOrPackage(CharOperation.subarray(qualifiedTypeReference.tokens, 0, indexInQualifiedName));
-					} else {
-						binding = internalScope.getTypeOrPackage(CharOperation.subarray(qualifiedTypeReference.tokens, 0, indexInQualifiedName));
+					try {
+						if (internalScope == null) {
+							binding = this.scope.getTypeOrPackage(CharOperation.subarray(qualifiedTypeReference.tokens, 0, indexInQualifiedName));
+						} else {
+							binding = internalScope.getTypeOrPackage(CharOperation.subarray(qualifiedTypeReference.tokens, 0, indexInQualifiedName));
+						}
+					} catch (AbortCompilation e) {
+						// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=53357
 					}
 					if (binding instanceof org.eclipse.jdt.internal.compiler.lookup.PackageBinding) {
 						return this.getPackageBinding((org.eclipse.jdt.internal.compiler.lookup.PackageBinding)binding);
@@ -225,7 +234,12 @@
 			int importReferenceLength = importReference.tokens.length;
 			int indexInImportReference = importReferenceLength - index; // one-based
 			if (indexInImportReference >= 0) {
-				Binding binding = this.scope.getTypeOrPackage(CharOperation.subarray(importReference.tokens, 0, indexInImportReference));
+				Binding binding = null;
+				try {
+					binding = this.scope.getTypeOrPackage(CharOperation.subarray(importReference.tokens, 0, indexInImportReference));
+				} catch (AbortCompilation e) {
+					// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=53357
+				}
 				if (binding != null) {
 					if (binding instanceof org.eclipse.jdt.internal.compiler.lookup.PackageBinding) {
 						return this.getPackageBinding((org.eclipse.jdt.internal.compiler.lookup.PackageBinding)binding);
@@ -709,34 +723,38 @@
 	 * @see BindingResolver#resolveImport(ImportDeclaration)
 	 */
 	IBinding resolveImport(ImportDeclaration importDeclaration) {
-		org.eclipse.jdt.internal.compiler.ast.ASTNode node = (org.eclipse.jdt.internal.compiler.ast.ASTNode) this.newAstToOldAst.get(importDeclaration);
-		if (node instanceof ImportReference) {
-			ImportReference importReference = (ImportReference) node;
-			if (importReference.onDemand) {
-				Binding binding = this.scope.getTypeOrPackage(CharOperation.subarray(importReference.tokens, 0, importReference.tokens.length));
-				if (binding != null) {
-					if (binding.bindingType() == BindingIds.PACKAGE) {
-						IPackageBinding packageBinding = this.getPackageBinding((org.eclipse.jdt.internal.compiler.lookup.PackageBinding) binding);
-						if (packageBinding == null) {
-							return null;
+		try {
+			org.eclipse.jdt.internal.compiler.ast.ASTNode node = (org.eclipse.jdt.internal.compiler.ast.ASTNode) this.newAstToOldAst.get(importDeclaration);
+			if (node instanceof ImportReference) {
+				ImportReference importReference = (ImportReference) node;
+				if (importReference.onDemand) {
+					Binding binding = this.scope.getTypeOrPackage(CharOperation.subarray(importReference.tokens, 0, importReference.tokens.length));
+					if (binding != null) {
+						if (binding.bindingType() == BindingIds.PACKAGE) {
+							IPackageBinding packageBinding = this.getPackageBinding((org.eclipse.jdt.internal.compiler.lookup.PackageBinding) binding);
+							if (packageBinding == null) {
+								return null;
+							}
+							return packageBinding;
+						} else {
+							// if it is not a package, it has to be a type
+							ITypeBinding typeBinding = this.getTypeBinding((org.eclipse.jdt.internal.compiler.lookup.TypeBinding) binding);
+							if (typeBinding == null) {
+								return null;
+							}
+							return typeBinding;
 						}
-						return packageBinding;
-					} else {
-						// if it is not a package, it has to be a type
+					}
+				} else {
+					Binding binding = this.scope.getTypeOrPackage(importReference.tokens);
+					if (binding != null && binding instanceof org.eclipse.jdt.internal.compiler.lookup.TypeBinding) {
 						ITypeBinding typeBinding = this.getTypeBinding((org.eclipse.jdt.internal.compiler.lookup.TypeBinding) binding);
-						if (typeBinding == null) {
-							return null;
-						}
-						return typeBinding;
+						return typeBinding == null ? null : typeBinding;
 					}
 				}
-			} else {
-				Binding binding = this.scope.getTypeOrPackage(importReference.tokens);
-				if (binding != null && binding instanceof org.eclipse.jdt.internal.compiler.lookup.TypeBinding) {
-					ITypeBinding typeBinding = this.getTypeBinding((org.eclipse.jdt.internal.compiler.lookup.TypeBinding) binding);
-					return typeBinding == null ? null : typeBinding;
-				}
 			}
+		} catch(AbortCompilation e) {
+			// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=53357
 		}
 		return null;
 	}
@@ -745,22 +763,26 @@
 	 * @see BindingResolver#resolvePackage(PackageDeclaration)
 	 */
 	IPackageBinding resolvePackage(PackageDeclaration pkg) {
-		org.eclipse.jdt.internal.compiler.ast.ASTNode node = (org.eclipse.jdt.internal.compiler.ast.ASTNode) this.newAstToOldAst.get(pkg);
-		if (node instanceof ImportReference) {
-			ImportReference importReference = (ImportReference) node;
-			Binding binding = this.scope.getTypeOrPackage(CharOperation.subarray(importReference.tokens, 0, importReference.tokens.length));
-			if ((binding != null) && (binding.isValidBinding())) {
-				IPackageBinding packageBinding = this.getPackageBinding((org.eclipse.jdt.internal.compiler.lookup.PackageBinding) binding);
-				if (packageBinding == null) {
-					return null;
+		try {
+			org.eclipse.jdt.internal.compiler.ast.ASTNode node = (org.eclipse.jdt.internal.compiler.ast.ASTNode) this.newAstToOldAst.get(pkg);
+			if (node instanceof ImportReference) {
+				ImportReference importReference = (ImportReference) node;
+				Binding binding = this.scope.getTypeOrPackage(CharOperation.subarray(importReference.tokens, 0, importReference.tokens.length));
+				if ((binding != null) && (binding.isValidBinding())) {
+					IPackageBinding packageBinding = this.getPackageBinding((org.eclipse.jdt.internal.compiler.lookup.PackageBinding) binding);
+					if (packageBinding == null) {
+						return null;
+					}
+					this.bindingsToAstNodes.put(packageBinding, pkg);
+					String key = packageBinding.getKey();
+					if (key != null) {
+						this.bindingKeysToAstNodes.put(key, pkg);				
+					}
+					return packageBinding;
 				}
-				this.bindingsToAstNodes.put(packageBinding, pkg);
-				String key = packageBinding.getKey();
-				if (key != null) {
-					this.bindingKeysToAstNodes.put(key, pkg);				
-				}
-				return packageBinding;
 			}
+		} catch (AbortCompilation e) {
+			// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=53357
 		}
 		return null;
 	}
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DocCommentParser.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DocCommentParser.java
index dec3fb0..1e3d3d3 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DocCommentParser.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DocCommentParser.java
@@ -26,15 +26,16 @@
 class DocCommentParser extends AbstractCommentParser {
 
 	// Public fields
-	private Javadoc docComment;
-	private AST ast;
 	
 	// Private fields
+	private Javadoc docComment;
+	private AST ast;
 
-	DocCommentParser(AST ast, Scanner scanner) {
+	DocCommentParser(AST ast, Scanner scanner, boolean check) {
 		super(null);
 		this.ast = ast;
 		this.scanner = scanner;
+		this.checkDocComment = check;
 		this.kind = DOM_PARSER;
 	}
 
@@ -55,7 +56,9 @@
 		this.docComment = this.ast.newJavadoc();
 		
 		// Parse
-		parseComment(start, start+length-1);
+		if (this.checkDocComment) {
+			parseComment(start, start+length-1);
+		}
 		this.docComment.setSourceRange(start, length);
 		setComment(start, length);  // backward compatibility
 		return this.docComment;
@@ -344,13 +347,13 @@
 	 */
 	protected void pushText(int start, int end) {
 		TextElement text = this.ast.newTextElement();
-		text.setText(new String( this.source, start, end-start+1));
-		text.setSourceRange(start, end-start+1);
+		text.setText(new String( this.source, start, end-start));
+		text.setSourceRange(start, end-start);
 		TagElement previousTag = null;
 		int previousStart = start;
 		if (this.astPtr == -1) {
 			previousTag = this.ast.newTagElement();
-			previousTag.setSourceRange(start, end-start+1);
+			previousTag.setSourceRange(start, end-start);
 			pushOnAstStack(previousTag, true);
 		} else {
 			previousTag = (TagElement) this.astStack[this.astPtr];
@@ -370,7 +373,7 @@
 			}
 		}
 		previousTag.fragments().add(text);
-		previousTag.setSourceRange(previousStart, end-previousStart+1);
+		previousTag.setSourceRange(previousStart, end-previousStart);
 		this.textStart = -1;
 	}
 	/* (non-Javadoc)
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/EnumDeclaration.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/EnumDeclaration.java
index 86d5539..77e417e 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/EnumDeclaration.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/EnumDeclaration.java
@@ -22,7 +22,7 @@
  *      [ Javadoc ] { ExtendedModifier } <b>enum</b> Identifier
  *			[ <b>implements</b> Type { <b>,</b> Type } ]
  *			<b>{</b>
- *               [ EnumConstantDeclaration { <b>,</b> EnumConstantDeclaration } ]
+ *               [ EnumConstantDeclaration { <b>,</b> EnumConstantDeclaration } ] [ <b>,</b> ]
  *               [ <b>;</b> { ClassBodyDeclaration | <b>;</b> } ]
  *          <b>}</b>
  * </pre>
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/core/ICompilationUnit.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/core/ICompilationUnit.java
index 0503c0c..b7c396c 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/core/ICompilationUnit.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/core/ICompilationUnit.java
@@ -537,6 +537,7 @@
  * if the working copy was already consistent.
  * </p>
  *
+ * @param createAST boolean indicating whether a compilation unit AST should be created.
  * @param forceProblemDetection boolean indicating whether problem should be recomputed
  *   even if the source hasn't changed.
  * @param owner the owner of working copies that take precedence over the original compilation units,
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaCore.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaCore.java
index e4e3a75..ac712ca 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaCore.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/core/JavaCore.java
@@ -152,6 +152,12 @@
 	/**
 	 * Possible  configurable option ID.
 	 * @see #getDefaultOptions()
+	 * @since 3.0
+	 */
+	public static final String COMPILER_DOC_COMMENT_SUPPORT = PLUGIN_ID + ".compiler.doc.comment.support"; //$NON-NLS-1$
+	/**
+	 * Possible  configurable option ID.
+	 * @see #getDefaultOptions()
 	 * @deprecated - discontinued since turning off would violate language specs
 	 */
 	public static final String COMPILER_PB_UNREACHABLE_CODE = PLUGIN_ID + ".compiler.problem.unreachableCode"; //$NON-NLS-1$
@@ -348,14 +354,6 @@
 	public static final String COMPILER_PB_INVALID_JAVADOC = PLUGIN_ID + ".compiler.problem.invalidJavadoc"; //$NON-NLS-1$
 	/**
 	 * Possible  configurable option ID.
-	 * @see #COMPILER_PB_INVALID_JAVADOC
-	 * @deprecated
-	 * TODO (frederic) remove after 3.0 M6
-	 */
-	public static final String COMPILER_PB_INVALID_ANNOTATION = COMPILER_PB_INVALID_JAVADOC;
-	public static final String OLD_COMPILER_PB_INVALID_ANNOTATION = PLUGIN_ID + ".compiler.problem.invalidAnnotation"; //$NON-NLS-1$
-	/**
-	 * Possible  configurable option ID.
 	 * @see #getDefaultOptions()
 	 * @since 3.0
 	 */
@@ -394,23 +392,6 @@
 	 * Possible  configurable option ID.
 	 * @see #getDefaultOptions()
 	 * @since 3.0
-	 * @deprecated
-	 * TODO (frederic) remove after 3.0 M7
-	 */
-	public static final String COMPILER_PB_MISSING_JAVADOC = COMPILER_PB_MISSING_JAVADOC_COMMENTS;
-	public static final String OLD_COMPILER_PB_MISSING_JAVADOC = PLUGIN_ID + ".compiler.problem.missingJavadoc"; //$NON-NLS-1$
-	/**
-	 * Possible  configurable option ID.
-	 * @see #COMPILER_PB_MISSING_JAVADOC
-	 * @deprecated
-	 * TODO (frederic) after 3.0 M6
-	 */
-	public static final String COMPILER_PB_MISSING_ANNOTATION = COMPILER_PB_MISSING_JAVADOC;
-	public static final String OLD_COMPILER_PB_MISSING_ANNOTATION = PLUGIN_ID + ".compiler.problem.missingAnnotation"; //$NON-NLS-1$
-	/**
-	 * Possible  configurable option ID.
-	 * @see #getDefaultOptions()
-	 * @since 3.0
 	 */
 	public static final String COMPILER_PB_MISSING_JAVADOC_COMMENTS_VISIBILITY = PLUGIN_ID + ".compiler.problem.missingJavadocCommentsVisibility"; //$NON-NLS-1$
 	/**
@@ -1420,6 +1401,14 @@
 	 *     - possible values:   { "1.1", "1.2", "1.3", "1.4" }
 	 *     - default:           "1.2"
 	 *
+	 * COMPILER / Javadoc Comment Support
+	 *    When this support is disabled, the compiler will ignore all javadoc problems options settings
+	 *    and will not report any javadoc problem. It will also not find any reference in javadoc comment and
+	 *    DOM AST Javadoc node will be only a flat text instead of having structured tag elements.
+	 *     - option id:         "org.eclipse.jdt.core.compiler.doc.comment.support"
+	 *     - possible values:   { "enabled", "disabled" }
+	 *     - default:           "enabled"
+	 *
 	 * COMPILER / Reporting Attempt to Override Package-Default Method
 	 *    A package default method is not visible in a different package, and thus 
 	 *    cannot be overridden. When enabling this option, the compiler will signal 
@@ -2098,31 +2087,6 @@
 				if (optionNames.contains(propertyName)){
 					options.put(propertyName, value);
 				}
-				// bug 45112 backward compatibility.
-				// TODO (frederic) remove after 3.0 M6
-				else if (CompilerOptions.OPTION_ReportInvalidAnnotation.equals(propertyName)) {
-					options.put(COMPILER_PB_INVALID_JAVADOC, value);
-				}
-				else if (CompilerOptions.OPTION_ReportMissingAnnotation.equals(propertyName)) {
-					if (ENABLED.equals(value)) {
-						value = preferences.getString(CompilerOptions.OPTION_ReportInvalidAnnotation);
-					} else {
-						value = IGNORE;
-					}
-					options.put(COMPILER_PB_MISSING_JAVADOC_COMMENTS, value);
-				}
-				// end bug 45112
-				// bug 46854 backward compatibility
-				// TODO (frederic) remove after 3.0 M7
-				else if (CompilerOptions.OPTION_ReportMissingJavadoc.equals(propertyName)) {
-					if (ENABLED.equals(value)) {
-						value = preferences.getString(COMPILER_PB_INVALID_JAVADOC);
-					} else {
-						value = IGNORE;
-					}
-					options.put(COMPILER_PB_MISSING_JAVADOC_COMMENTS, value);
-				}
-				// end bug 46854
 				// TODO (olivier) Remove after M7
 				else if (propertyName.startsWith(JavaCore.PLUGIN_ID + ".formatter")) {//$NON-NLS-1$
 					Util.convertFormatterDeprecatedOptions(propertyName, value, options);
@@ -2329,7 +2293,8 @@
 		preferences.setDefault(COMPILER_CODEGEN_UNUSED_LOCAL, PRESERVE);
 		preferences.setDefault(COMPILER_TASK_TAGS, DEFAULT_TASK_TAG);
 		preferences.setDefault(COMPILER_TASK_PRIORITIES, DEFAULT_TASK_PRIORITY);
-		
+		preferences.setDefault(COMPILER_DOC_COMMENT_SUPPORT, ENABLED);
+
 		// Builder settings
 		preferences.setDefault(CORE_JAVA_BUILD_RESOURCE_COPY_FILTER, ""); //$NON-NLS-1$
 		optionNames.add(CORE_JAVA_BUILD_RESOURCE_COPY_FILTER);
@@ -3490,24 +3455,16 @@
 			preferences.setValue(key, value);
 		}
 
-		// Backward compatibility
+		/* Test OPTION_DocCommentSupport
 		String[] propertyNames = preferences.propertyNames();
 		for (int i = 0; i < propertyNames.length; i++){
 			String propertyName = propertyNames[i];
-			// bug 45112
-			if (CompilerOptions.OPTION_ReportInvalidAnnotation.equals(propertyName)) {
-				preferences.setToDefault(OLD_COMPILER_PB_INVALID_ANNOTATION);
+			// set same value than missing javadoc comments overriding
+			if (CompilerOptions.OPTION_ReportMissingJavadocCommentsOverriding.equals(propertyName)) {
+				preferences.setValue(COMPILER_DOC_COMMENT_SUPPORT, preferences.getString(propertyName));
 			}
-			else if (CompilerOptions.OPTION_ReportMissingAnnotation.equals(propertyName)) {
-				preferences.setToDefault(OLD_COMPILER_PB_MISSING_ANNOTATION);
-			}
-			// end bug 45112
-			// bug 46854
-			else if (CompilerOptions.OPTION_ReportMissingJavadoc.equals(propertyName)) {
-				preferences.setToDefault(OLD_COMPILER_PB_MISSING_JAVADOC);
-			}
-			// end bug 46854
 		}
+		*/
 
 		// persist options
 		getPlugin().savePluginPreferences();
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaProject.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaProject.java
index 81451ad..1c603e7 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaProject.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaProject.java
@@ -69,7 +69,6 @@
 import org.eclipse.jdt.core.WorkingCopyOwner;
 import org.eclipse.jdt.core.eval.IEvaluationContext;
 import org.eclipse.jdt.internal.codeassist.ISearchableNameEnvironment;
-import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 import org.eclipse.jdt.internal.compiler.util.ObjectVector;
 import org.eclipse.jdt.internal.compiler.util.SuffixConstants;
 import org.eclipse.jdt.internal.core.eval.EvaluationContextWrapper;
@@ -1432,31 +1431,6 @@
 			if (optionNames.contains(propertyName)){
 				options.put(propertyName, value);
 			}		
-			// bug 45112 backward compatibility.
-			// TODO (frederic) remove after 3.0 M6
-			else if (CompilerOptions.OPTION_ReportInvalidAnnotation.equals(propertyName)) {
-				options.put(JavaCore.COMPILER_PB_INVALID_JAVADOC, value);
-			}
-			else if (CompilerOptions.OPTION_ReportMissingAnnotation.equals(propertyName)) {
-				if (JavaCore.ENABLED.equals(value)) {
-					value = preferences.getString(JavaCore.COMPILER_PB_INVALID_JAVADOC);
-				} else {
-					value = JavaCore.IGNORE;
-				}
-				options.put(JavaCore.COMPILER_PB_MISSING_JAVADOC_COMMENTS, value);
-			}
-			// end bug 45112
-			// bug 46854 backward compatibility
-			// TODO (frederic) remove after 3.0 M7
-			else if (CompilerOptions.OPTION_ReportMissingJavadoc.equals(propertyName)) {
-				if (JavaCore.ENABLED.equals(value)) {
-					value = preferences.getString(JavaCore.COMPILER_PB_INVALID_JAVADOC);
-				} else {
-					value = JavaCore.IGNORE;
-				}
-				options.put(JavaCore.COMPILER_PB_MISSING_JAVADOC_COMMENTS, value);
-			}
-			// end bug 46854
 			// TODO (olivier) Remove after M7
 			else if (propertyName.startsWith(JavaCore.PLUGIN_ID + ".formatter")) {//$NON-NLS-1$
 				Util.convertFormatterDeprecatedOptions(propertyName, value, options);
@@ -2521,24 +2495,16 @@
 			}
 		}
 
-		// Backward compatibility
+		/* Test OPTION_DocCommentSupport
 		String[] propertyNames = preferences.propertyNames();
 		for (int i = 0; i < propertyNames.length; i++){
 			String propertyName = propertyNames[i];
-			// bug 45112
-			if (CompilerOptions.OPTION_ReportInvalidAnnotation.equals(propertyName)) {
-				preferences.setToDefault(JavaCore.OLD_COMPILER_PB_INVALID_ANNOTATION);
+			// set same value than missing javadoc comments overriding
+			if (CompilerOptions.OPTION_ReportMissingJavadocCommentsOverriding.equals(propertyName)) {
+				preferences.setValue(JavaCore.COMPILER_DOC_COMMENT_SUPPORT, preferences.getString(propertyName));
 			}
-			else if (CompilerOptions.OPTION_ReportMissingAnnotation.equals(propertyName)) {
-				preferences.setToDefault(JavaCore.OLD_COMPILER_PB_MISSING_ANNOTATION);
-			}
-			// end bug 45112
-			// bug 46854
-			else if (CompilerOptions.OPTION_ReportMissingJavadoc.equals(propertyName)) {
-				preferences.setToDefault(JavaCore.OLD_COMPILER_PB_MISSING_JAVADOC);
-			}
-			// end bug 46854
 		}
+		*/
 
 		// persist options
 		savePreferences(preferences);	
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/CommentRecorderParser.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/CommentRecorderParser.java
index 922662a..6199584 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/CommentRecorderParser.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/CommentRecorderParser.java
@@ -35,7 +35,6 @@
 	 */
 	public CommentRecorderParser(ProblemReporter problemReporter, boolean optimizeStringLiterals) {
 		super(problemReporter, optimizeStringLiterals);
-		this.javadocParser.checkDocComment = true;
 	}
 
 	// old javadoc style check which doesn't include all leading comments into declaration
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/PublicScanner.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/PublicScanner.java
index bd19da5..63bce13 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/PublicScanner.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/PublicScanner.java
@@ -62,6 +62,7 @@
 	public int[] commentStops = new int[10];
 	public int[] commentStarts = new int[10];
 	public int commentPtr = -1; // no comment test with commentPtr value -1
+	protected int lastCommentLinePosition = -1;
 	
 	// task tag support
 	public char[][] foundTaskTags = null;
@@ -1226,6 +1227,7 @@
 					{
 						int test;
 						if ((test = getNextChar('/', '*')) == 0) { //line comment 
+							this.lastCommentLinePosition = this.currentPosition;
 							try { //get the next char 
 								if (((this.currentCharacter = this.source[this.currentPosition++]) == '\\')
 									&& (this.source[this.currentPosition] == 'u')) {
@@ -1256,6 +1258,7 @@
 								} //jump over the \\
 								boolean isUnicode = false;
 								while (this.currentCharacter != '\r' && this.currentCharacter != '\n') {
+									this.lastCommentLinePosition = this.currentPosition;
 									//get the next char
 									isUnicode = false;									
 									if (((this.currentCharacter = this.source[this.currentPosition++]) == '\\')
@@ -1638,6 +1641,7 @@
 						int test;
 						if ((test = getNextChar('/', '*')) == 0) { //line comment 
 							try {
+								this.lastCommentLinePosition = this.currentPosition;
 								//get the next char 
 								if (((this.currentCharacter = this.source[this.currentPosition++]) == '\\')
 									&& (this.source[this.currentPosition] == 'u')) {
@@ -1668,6 +1672,7 @@
 								} //jump over the \\
 								boolean isUnicode = false;
 								while (this.currentCharacter != '\r' && this.currentCharacter != '\n') {
+									this.lastCommentLinePosition = this.currentPosition;
 									//get the next char 
 									isUnicode = false;
 									if (((this.currentCharacter = this.source[this.currentPosition++]) == '\\')
@@ -2280,16 +2285,26 @@
 	}
 }
 public void recordComment(int token) {
+	// compute position
+	int stopPosition = this.currentPosition;
+	switch (token) {
+		case TokenNameCOMMENT_LINE:
+			stopPosition = -this.lastCommentLinePosition;
+			break;
+		case TokenNameCOMMENT_BLOCK:
+			stopPosition = -this.currentPosition;
+			break;
+	}
 
 	// a new comment is recorded
 	try {
-		this.commentStops[++this.commentPtr] = (token==TokenNameCOMMENT_JAVADOC) ? this.currentPosition : -this.currentPosition;
+		this.commentStops[++this.commentPtr] = stopPosition;
 	} catch (IndexOutOfBoundsException e) {
 		int oldStackLength = this.commentStops.length;
 		int[] oldStack = this.commentStops;
 		this.commentStops = new int[oldStackLength + 30];
 		System.arraycopy(oldStack, 0, this.commentStops, 0, oldStackLength);
-		this.commentStops[this.commentPtr] = (token==TokenNameCOMMENT_JAVADOC) ? this.currentPosition : -this.currentPosition;
+		this.commentStops[this.commentPtr] = stopPosition;
 		//grows the positions buffers too
 		int[] old = this.commentStarts;
 		this.commentStarts = new int[oldStackLength + 30];
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser.java
index 59b1466..508d030 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MatchLocatorParser.java
@@ -96,9 +96,6 @@
 			? new MethodButNoClassDeclarationVisitor()
 			: new NoClassNoMethodDeclarationVisitor();
 	}
-
-	// Always check javadoc while matching indexes
-	this.javadocParser.checkDocComment = true;
 }
 public void checkComment() {
 	super.checkComment();
