diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest.java
index 45baaa7..8b10fa0 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/AbstractRegressionTest.java
@@ -68,12 +68,20 @@
 				return new SearchDocument(documentPath, this.searchParticipant) {
 					public byte[] getByteContents() {
 						try {
-							return  org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(this.documentPath));
+							return  org.eclipse.jdt.internal.compiler.util.Util.getFileByteContent(new File(getPath()));
 						} catch (IOException e) {
 							e.printStackTrace();
 							return null;
 						}
 					}
+					public char[] getCharContents() {
+						// not used
+						return null;
+					}
+					public String getEncoding() {
+						// not used
+						return null;
+					}
 				};
 			}
 		};
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CollisionCase.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CollisionCase.java
index 227af10..78d6732 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CollisionCase.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/CollisionCase.java
@@ -53,7 +53,7 @@
 		"1. ERROR in X.java (at line 3)\n" + 
 		"	foo.bar	abar; \n" + 
 		"	^^^^^^^\n" + 
-		"foo.bar cannot be resolved (or is not a valid type) for the field X.abar\n" + 
+		"foo.bar cannot be resolved to a type\n" + 
 		"----------\n");
 }
 }
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/Compliance_1_3.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/Compliance_1_3.java
index 0384334..e40814a 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/Compliance_1_3.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/Compliance_1_3.java
@@ -13,14 +13,14 @@
 import java.io.File;
 import java.io.IOException;
 import java.util.Map;
-
 import junit.framework.Test;
-
 import org.eclipse.jdt.core.ToolFactory;
 import org.eclipse.jdt.core.util.ClassFileBytesDisassembler;
 import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 
 public class Compliance_1_3 extends AbstractRegressionTest {
+boolean docSupport = false;
+
 public Compliance_1_3(String name) {
 	super(name);
 }
@@ -33,18 +33,32 @@
 	options.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_1_3);
 	options.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_1_3);
 	options.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_1_1);
+	if (docSupport) {
+		options.put(CompilerOptions.OPTION_DocCommentSupport, CompilerOptions.ENABLED);
+		options.put(CompilerOptions.OPTION_ReportInvalidJavadoc, CompilerOptions.ERROR);
+	}
 	return options;
 }
 public static Test suite() {
-	return setupSuite(testClass());
-/*	
-   	TestSuite ts;
-	//some of the tests depend on the order of this suite.
-	ts = new TestSuite();
-	//
-	ts.addTest(new Compliance_1_3("test17"));
-	return new RegressionTestSetup(ts);
-*/	
+	return suite(testClass(), null);
+}
+// Use this static initializer to specify subset for tests
+// All specified tests which does not belong to the class are skipped...
+static {
+	// Names of tests to run: can be "testBugXXXX" or "BugXXXX")
+//		testsNames = new String[] { "Bug58069" };
+	// Numbers of tests to run: "test<number>" will be run for each number of this array
+	testsNumbers = new int[] { 78 };
+	// Range numbers of tests to run: all tests between "test<first>" and "test<last>" will be run for { first, last }
+//		testsRange = new int[] { 76, -1 };
+}
+/* (non-Javadoc)
+ * @see junit.framework.TestCase#setUp()
+ */
+protected void setUp() throws Exception {
+	super.setUp();
+	// Javadoc disabled by default 
+	docSupport = false;
 }
 public void test001() {
 	this.runNegativeTest(
@@ -2604,6 +2618,136 @@
 		"The local variable displayString may not have been initialized\n" + 
 		"----------\n");
 }
+public void test075() {
+	this.runNegativeTest(
+		new String[] {
+			"X.java",
+			"public class X {	\n" +
+			"    public void foo(int p1) {} \n" +
+			"    public void foo(short p1) {} \n" +
+			"}	\n",
+			"Y.java",
+			"public class Y extends X {	\n" +
+			"    public void foo(long p1) {} \n" +
+			"    public void test() { foo((short) 1); } \n" +
+			"}	\n",
+		},
+		"----------\n" + 
+		"1. ERROR in Y.java (at line 3)\r\n" + 
+		"	public void test() { foo((short) 1); } \r\n" + 
+		"	                     ^^^\n" + 
+		"The method foo(long) is ambiguous for the type Y\n" + 
+		"----------\n");
+}
+/**
+ * Test fix bug 58069 for type.
+ * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=58069">58069</a>
+ */
+public void test076() {
+	docSupport = true;
+	runNegativeTest(
+		new String[] {
+			"IX.java",
+			"interface IX {\n" + 
+				"	public static class Problem extends Exception {}\n" + 
+				"}\n",
+			"X.java",
+			"public abstract class X {\n" + 
+				"	public static class Problem extends Exception {}\n" + 
+				"	public abstract static class InnerClass implements IX {\n" + 
+				"		/**\n" + 
+				"		 * @throws Problem \n" + 
+				"		 */\n" + 
+				"		public void foo() throws IllegalArgumentException {\n" + 
+				"		}\n" + 
+				"	}\n" + 
+				"}\n" + 
+				"\n"
+		},
+		"----------\n" + 
+			"1. ERROR in X.java (at line 5)\n" + 
+			"	* @throws Problem \n" + 
+			"	          ^^^^^^^\n" + 
+			"Javadoc: The type Problem is defined in an inherited type and an enclosing scope\n" + 
+			"----------\n"
+	);
+}
+/**
+ * Test fix bug 58069 for method.
+ * Note that problem is not flagged in doc comments as it is only raised while verifying
+ * implicit method and javadoc resolution does not use it.
+ */
+public void test077() {
+	docSupport = true;
+	this.runNegativeTest(
+		new String[] {
+			"p1/Test.java",
+			"package p1; \n"+
+			"public class Test { \n"+
+			"	public static void main(String[] arguments) { \n"+
+			"		new Test().foo(); \n"+
+			"	} \n"+
+			"	String bar() { \n"+
+			"		return \"FAILED\";	\n" +
+			"	} \n"+
+			"	void foo(){ \n"+
+			"		/** @see #bar() */\n" +
+			"		class Y extends Secondary { \n"+
+			"			/** @see #bar() */\n" +
+			"			String z = bar();	\n" +
+			"		}; \n"+
+			"		System.out.println(new Y().z);	\n" +
+			"	} \n"+
+			"} \n" +
+			"class Secondary { \n" +
+			"	String bar(){ return \"FAILED\"; } \n" +
+			"} \n"
+		},
+		"----------\n" + 
+		"1. ERROR in p1\\Test.java (at line 13)\n" + 
+		"	String z = bar();	\n" + 
+		"	           ^^^\n" + 
+		"The method bar is defined in an inherited type and an enclosing scope\n" + 
+		"----------\n"
+	);
+}
+/**
+ * Test fix bug 58069 for field.
+ * Note that problem is not flagged in doc comments as it is only raised while verifying
+ * Name or Qualified name references and javadoc reference is a field reference.
+ */
+public void test078() {
+	docSupport = true;
+	this.runNegativeTest(
+		new String[] {
+			"p1/Test.java",
+			"package p1; \n"+
+			"public class Test { \n"+
+			"	public static void main(String[] arguments) { \n"+
+			"		new Test().foo(); \n"+
+			"	} \n"+
+			"	String bar = \"FAILED\";"+
+			"	void foo(){ \n"+
+			"		/** @see #bar */\n" +
+			"		class Y extends Secondary { \n"+
+			"			/** @see #bar */\n" +
+			"			String z = bar; \n"+
+			"		}; \n"+
+			"		System.out.println(new Y().z);	\n" +
+			"	} \n"+
+			"} \n" +
+			"class Secondary { \n" +
+			"	String bar = \"FAILED\"; \n" +
+			"} \n"
+		},
+		"----------\n" + 
+		"1. ERROR in p1\\Test.java (at line 10)\n" + 
+		"	String z = bar; \n" + 
+		"	           ^^^\n" + 
+		"The field bar is defined in an inherited type and an enclosing scope \n" + 
+		"----------\n"
+	);
+}
 
 public static Class testClass() {
 	return Compliance_1_3.class;
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/Compliance_1_4.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/Compliance_1_4.java
index efa1668..9545544 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/Compliance_1_4.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/Compliance_1_4.java
@@ -21,6 +21,8 @@
 import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 
 public class Compliance_1_4 extends AbstractRegressionTest {
+boolean docSupport = false;
+
 public Compliance_1_4(String name) {
 	super(name);
 }
@@ -33,10 +35,32 @@
 	options.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_1_4);
 	options.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_1_4);	
 	options.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_1_4);	
+	if (docSupport) {
+		options.put(CompilerOptions.OPTION_DocCommentSupport, CompilerOptions.ENABLED);
+		options.put(CompilerOptions.OPTION_ReportInvalidJavadoc, CompilerOptions.ERROR);
+	}
 	return options;
 }
 public static Test suite() {
-	return setupSuite(testClass());
+	return suite(testClass(), null);
+}
+// Use this static initializer to specify subset for tests
+// All specified tests which does not belong to the class are skipped...
+static {
+	// Names of tests to run: can be "testBugXXXX" or "BugXXXX")
+//		testsNames = new String[] { "Bug58069" };
+	// Numbers of tests to run: "test<number>" will be run for each number of this array
+//	testsNumbers = new int[] { 78 };
+	// Range numbers of tests to run: all tests between "test<first>" and "test<last>" will be run for { first, last }
+//		testsRange = new int[] { 76, -1 };
+}
+/* (non-Javadoc)
+ * @see junit.framework.TestCase#setUp()
+ */
+protected void setUp() throws Exception {
+	super.setUp();
+	// Javadoc disabled by default 
+	docSupport = false;
 }
 public void test001() {
 	this.runConformTest(
@@ -2430,6 +2454,123 @@
 		"Local cannot be resolved to a type\n" + 
 		"----------\n");
 }
+public void test075() {
+	this.runConformTest(
+		new String[] {
+			"X.java",
+			"public class X {	\n" +
+			"    public static void main(String[] args) {\n" + 
+			"        System.out.println(\"SUCCESS\");\n" + 
+			"    }\n" + 
+			"    public void foo(int p1) {} \n" +
+			"    public void foo(short p1) {} \n" +
+			"}	\n",
+			"Y.java",
+			"public class Y extends X {	\n" +
+			"    public void foo(long p1) {} \n" +
+			"    public void testEc() { foo((short)1); } \n" +
+			"}	\n",
+		},
+		"SUCCESS");
+}
+
+/**
+ * Test fix for bug 58069.
+ * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=58069">58069</a>
+ */
+public void test076() {
+	docSupport = true;
+	runNegativeTest(
+		new String[] {
+			"IX.java",
+			"interface IX {\n" + 
+				"	public static class Problem extends Exception {}\n" + 
+				"}\n",
+			"X.java",
+			"public abstract class X {\n" + 
+				"	public static class Problem extends Exception {}\n" + 
+				"	public abstract static class InnerClass implements IX {\n" + 
+				"		/**\n" + 
+				"		 * @throws Problem \n" + 
+				"		 */\n" + 
+				"		public void foo() throws IllegalArgumentException {\n" + 
+				"		}\n" + 
+				"	}\n" + 
+				"}\n" + 
+				"\n"
+		},
+		"----------\n" + 
+			"1. ERROR in X.java (at line 5)\n" + 
+			"	* @throws Problem \n" + 
+			"	          ^^^^^^^\n" + 
+			"Javadoc: Exception Problem is not declared\n" + 
+			"----------\n"
+	);
+}
+/**
+ * Test fix bug 58069 for method.
+ * Note that problem is not flagged in doc comments as it is only raised while verifying
+ * implicit method and javadoc resolution does not use it.
+ */
+public void test077() {
+	docSupport = true;
+	this.runConformTest(
+		new String[] {
+			"p1/Test.java",
+			"package p1; \n"+
+			"public class Test { \n"+
+			"	public static void main(String[] arguments) { \n"+
+			"		new Test().foo(); \n"+
+			"	} \n"+
+			"	String bar() { \n"+
+			"		return \"FAILED\";	\n" +
+			"	} \n"+
+			"	void foo(){ \n"+
+			"		/** @see #bar() */\n" +
+			"		class Y extends Secondary { \n"+
+			"			/** @see #bar() */\n" +
+			"			String z = bar();	\n" +
+			"		}; \n"+
+			"		System.out.println(new Y().z);	\n" +
+			"	} \n"+
+			"} \n" +
+			"class Secondary { \n" +
+			"	String bar(){ return \"FAILED\"; } \n" +
+			"} \n"
+		}
+	);
+}
+/**
+ * Test fix bug 58069 for field.
+ * Note that problem is not flagged in doc comments as it is only raised while verifying
+ * Name or Qualified name references and javadoc reference is a field reference.
+ */
+public void test078() {
+	docSupport = true;
+	this.runConformTest(
+		new String[] {
+			"p1/Test.java",
+			"package p1; \n"+
+			"public class Test { \n"+
+			"	public static void main(String[] arguments) { \n"+
+			"		new Test().foo(); \n"+
+			"	} \n"+
+			"	String bar = \"FAILED\";"+
+			"	void foo(){ \n"+
+			"		/** @see #bar */\n" +
+			"		class Y extends Secondary { \n"+
+			"			/** @see #bar */\n" +
+			"			String z = bar; \n"+
+			"		}; \n"+
+			"		System.out.println(new Y().z);	\n" +
+			"	} \n"+
+			"} \n" +
+			"class Secondary { \n" +
+			"	String bar = \"FAILED\"; \n" +
+			"} \n"
+		}
+	);
+}
 
 public static Class testClass() {
 	return Compliance_1_4.class;
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 89f481b..9616447 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
@@ -20,6 +20,7 @@
 
 	String localDocCommentSupport = CompilerOptions.ENABLED;
 	String reportInvalidJavadoc = CompilerOptions.ERROR;
+	String reportMissingJavadocTags = CompilerOptions.ERROR;
 	String reportMissingJavadocComments = null;
 
 	public JavadocTestMixed(String name) {
@@ -52,7 +53,10 @@
 			options.put(CompilerOptions.OPTION_ReportMissingJavadocComments, reportMissingJavadocComments);
 		else
 			options.put(CompilerOptions.OPTION_ReportMissingJavadocComments, reportInvalidJavadoc);
-		options.put(CompilerOptions.OPTION_ReportMissingJavadocTags, reportInvalidJavadoc);
+		if (reportMissingJavadocTags != null) 
+			options.put(CompilerOptions.OPTION_ReportMissingJavadocTags, reportMissingJavadocTags);
+		else
+			options.put(CompilerOptions.OPTION_ReportMissingJavadocTags, reportInvalidJavadoc);
 		options.put(CompilerOptions.OPTION_ReportFieldHiding, CompilerOptions.IGNORE);
 		options.put(CompilerOptions.OPTION_ReportSyntheticAccessEmulation, CompilerOptions.IGNORE);
 		options.put(CompilerOptions.OPTION_ReportDeprecation, CompilerOptions.ERROR);
@@ -66,6 +70,7 @@
 		super.setUp();
 		this.localDocCommentSupport = this.docCommentSupport;
 		reportInvalidJavadoc = CompilerOptions.ERROR;
+		reportMissingJavadocTags = CompilerOptions.ERROR;
 		reportMissingJavadocComments = null;
 	}
 	
@@ -2192,4 +2197,79 @@
 				"----------\n"
 		);
 	}
+
+	/**
+	 * Test fix for bug 51911.
+	 * @see <a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=51911">51911</a>
+	 */
+	public void testBug51911() {
+		this.reportMissingJavadocComments = CompilerOptions.IGNORE;
+		// Warn an ambiguous method reference
+		runNegativeTest(
+			new String[] {
+				"X.java",
+				"/**\n" +
+					" * @see #foo\n" +
+					" */\n" +
+					"public class X {\n" +
+					"	public void foo(int i, float f) {}\n" +
+					"	public void foo(String str) {}\n" +
+					"}\n"
+		 	},
+			"----------\n" + 
+				"1. ERROR in X.java (at line 2)\n" + 
+				"	* @see #foo\n" + 
+				"	        ^^^\n" + 
+				"Javadoc: foo is an ambiguous method reference or is not a field\n" + 
+				"----------\n"
+		);
+	}
+	public void testBug51911a() {
+		this.reportMissingJavadocComments = CompilerOptions.IGNORE;
+		// Accept unambiguous method reference
+		runConformTest(
+			new String[] {
+				"X.java",
+				"/**\n" +
+					" * @see #foo\n" +
+					" */\n" +
+					"public class X {\n" +
+					"	public void foo(String str) {}\n" +
+					"}\n"
+		 	}
+		);
+	}
+	public void testBug51911b() {
+		this.reportMissingJavadocComments = CompilerOptions.IGNORE;
+		// Accept field reference with method name
+		runConformTest(
+			new String[] {
+				"X.java",
+				"/**\n" +
+					" * @see #foo\n" +
+					" */\n" +
+					"public class X {\n" +
+					"	public int foo;\n" +
+					"	public void foo(String str) {}\n" +
+					"}\n"
+		 	}
+		);
+	}
+	public void testBug51911c() {
+		this.reportMissingJavadocComments = CompilerOptions.IGNORE;
+		// Accept field reference with ambiguous method name
+		runConformTest(
+			new String[] {
+				"X.java",
+					"/**\n" +
+					" * @see #foo\n" +
+					" */\n" +
+					"public class X {\n" +
+					"	public int foo;\n" +
+					"	public void foo() {}\n" +
+					"	public void foo(String str) {}\n" +
+					"}\n"
+		 	}
+		);
+	}
 }
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 f154d3f..e81d91a0 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
@@ -36,6 +36,7 @@
 	standardTests.add(CastTest.class);
 	standardTests.add(ClassFileComparatorTest.class);
 	standardTests.add(ClassFileReaderTest.class);
+	standardTests.add(CollisionCase.class);
 	standardTests.add(ConstantTest.class);
 	standardTests.add(DeprecatedTest.class);
 	standardTests.add(LocalVariableTest.class);
diff --git a/org.eclipse.jdt.core.tests.model/JCL/converterJclMin.jar b/org.eclipse.jdt.core.tests.model/JCL/converterJclMin.jar
index e9d23a1..a86e1f2 100644
--- a/org.eclipse.jdt.core.tests.model/JCL/converterJclMin.jar
+++ b/org.eclipse.jdt.core.tests.model/JCL/converterJclMin.jar
Binary files differ
diff --git a/org.eclipse.jdt.core.tests.model/JCL/converterJclMinsrc.zip b/org.eclipse.jdt.core.tests.model/JCL/converterJclMinsrc.zip
index 9dce906..7e1211a 100644
--- a/org.eclipse.jdt.core.tests.model/JCL/converterJclMinsrc.zip
+++ b/org.eclipse.jdt.core.tests.model/JCL/converterJclMinsrc.zip
Binary files differ
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 576a56f..38d5c8b 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
@@ -191,7 +191,7 @@
 	}
 
 	public ASTNode runConversion(char[] source, String unitName, IJavaProject project) {
-		ASTParser parser = ASTParser.newParser(AST.LEVEL_2_0);
+		ASTParser parser = ASTParser.newParser(AST.JLS2);
 		parser.setSource(source);
 		parser.setUnitName(unitName);
 		parser.setProject(project);
@@ -1386,6 +1386,7 @@
 
 	/**
 	 * Verify DefaultCommentMapper heuristic to get leading and trailing comments
+	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=53445
 	 */
 	public void test100() throws JavaModelException {
 		verifyMapper("test100", 16, new int[] {2,7,8,15});
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 40e1690..c55f1f7 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
@@ -3382,7 +3382,7 @@
 		assertNotNull("No node", node);
 		assertTrue("not a method declaration", node.getNodeType() == ASTNode.METHOD_DECLARATION);
 		MethodDeclaration declaration = (MethodDeclaration) node;
-		ASTParser parser = ASTParser.newParser(AST.LEVEL_2_0);
+		ASTParser parser = ASTParser.newParser(AST.JLS2);
 		parser.setKind(ASTParser.K_CLASS_BODY_DECLARATIONS);
 		parser.setSource(source);
 		parser.setSourceRange(declaration.getStartPosition(), declaration.getLength());
@@ -3418,7 +3418,7 @@
 		assertNotNull("No node", node);
 		assertTrue("not a field declaration", node.getNodeType() == ASTNode.FIELD_DECLARATION);
 		FieldDeclaration declaration = (FieldDeclaration) node;
-		ASTParser parser = ASTParser.newParser(AST.LEVEL_2_0);
+		ASTParser parser = ASTParser.newParser(AST.JLS2);
 		parser.setKind(ASTParser.K_CLASS_BODY_DECLARATIONS);
 		parser.setSource(source);
 		parser.setSourceRange(declaration.getStartPosition(), declaration.getLength());
@@ -3452,7 +3452,7 @@
 		assertNotNull("No node", node);
 		assertTrue("not an initializer", node.getNodeType() == ASTNode.INITIALIZER);
 		Initializer declaration = (Initializer) node;
-		ASTParser parser = ASTParser.newParser(AST.LEVEL_2_0);
+		ASTParser parser = ASTParser.newParser(AST.JLS2);
 		parser.setKind(ASTParser.K_CLASS_BODY_DECLARATIONS);
 		parser.setSource(source);
 		parser.setSourceRange(declaration.getStartPosition(), declaration.getLength());
@@ -3487,7 +3487,7 @@
 		ASTNode node = getASTNode(unit, 0, 0, 0);
 		assertNotNull("No node", node);
 		ASTNode statement = node;
-		ASTParser parser = ASTParser.newParser(AST.LEVEL_2_0);
+		ASTParser parser = ASTParser.newParser(AST.JLS2);
 		parser.setKind(ASTParser.K_STATEMENTS);
 		parser.setSource(source);
 		parser.setSourceRange(statement.getStartPosition(), statement.getLength());
@@ -3524,7 +3524,7 @@
 		assertTrue("not a block", node.getNodeType() == ASTNode.EXPRESSION_STATEMENT);
 		ExpressionStatement expressionStatement = (ExpressionStatement) node;
 		Expression expression = expressionStatement.getExpression();
-		ASTParser parser = ASTParser.newParser(AST.LEVEL_2_0);
+		ASTParser parser = ASTParser.newParser(AST.JLS2);
 		parser.setKind(ASTParser.K_EXPRESSION);
 		parser.setSource(source);
 		parser.setSourceRange(expression.getStartPosition(), expression.getLength());
@@ -3564,7 +3564,7 @@
 			public void worked(int work) {}
 		}
 		Counter counter = new Counter();
-		ASTParser parser = ASTParser.newParser(AST.LEVEL_2_0);
+		ASTParser parser = ASTParser.newParser(AST.JLS2);
 		parser.setSource(sourceUnit);
 		parser.setResolveBindings(true);
 		parser.setWorkingCopyOwner(owner);
@@ -3590,7 +3590,7 @@
 		for (int i = 0; i < counter.count; i++) {
 			boolean gotException = false;
 			try {
-				parser = ASTParser.newParser(AST.LEVEL_2_0);
+				parser = ASTParser.newParser(AST.JLS2);
 				parser.setSource(sourceUnit);
 				parser.setResolveBindings(true);
 				parser.setWorkingCopyOwner(owner);
@@ -3602,7 +3602,7 @@
 		}
 		
 		// last should not throw an OperationCanceledException
-		parser = ASTParser.newParser(AST.LEVEL_2_0);
+		parser = ASTParser.newParser(AST.JLS2);
 		parser.setSource(sourceUnit);
 		parser.setResolveBindings(true);
 		parser.setWorkingCopyOwner(owner);
@@ -4097,7 +4097,7 @@
 		assertNotNull("No node", node);
 		assertTrue("not a method declaration", node.getNodeType() == ASTNode.METHOD_DECLARATION);
 		MethodDeclaration declaration = (MethodDeclaration) node;
-		ASTParser parser = ASTParser.newParser(AST.LEVEL_2_0);
+		ASTParser parser = ASTParser.newParser(AST.JLS2);
 		parser.setKind(ASTParser.K_CLASS_BODY_DECLARATIONS);
 		parser.setSource(source);
 		parser.setSourceRange(declaration.getStartPosition(), declaration.getLength());
@@ -4121,7 +4121,7 @@
 		assertNotNull("No node", node);
 		assertTrue("not a field declaration", node.getNodeType() == ASTNode.FIELD_DECLARATION);
 		FieldDeclaration declaration = (FieldDeclaration) node;
-		ASTParser parser = ASTParser.newParser(AST.LEVEL_2_0);
+		ASTParser parser = ASTParser.newParser(AST.JLS2);
 		parser.setKind(ASTParser.K_CLASS_BODY_DECLARATIONS);
 		parser.setSource(source);
 		parser.setSourceRange(declaration.getStartPosition(), declaration.getLength());
@@ -4145,7 +4145,7 @@
 		assertNotNull("No node", node);
 		assertTrue("not an initializer", node.getNodeType() == ASTNode.INITIALIZER);
 		Initializer declaration = (Initializer) node;
-		ASTParser parser = ASTParser.newParser(AST.LEVEL_2_0);
+		ASTParser parser = ASTParser.newParser(AST.JLS2);
 		parser.setKind(ASTParser.K_CLASS_BODY_DECLARATIONS);
 		parser.setSource(source);
 		parser.setSourceRange(declaration.getStartPosition(), declaration.getLength());
@@ -4201,10 +4201,10 @@
 				"  int i;\n" +
 				"}"
 			);
-			CompilationUnit unit = sourceUnit.reconcile(AST.LEVEL_2_0, false, null, null);
+			CompilationUnit unit = sourceUnit.reconcile(AST.JLS2, false, null, null);
 			assertNotNull("No level 2 compilation unit", unit);
-			assertEquals("Compilation unit has wrong AST level (2)", AST.LEVEL_2_0, unit.getAST().apiLevel());
-			// TODO improve test for AST.LEVEL_3_0
+			assertEquals("Compilation unit has wrong AST level (2)", AST.JLS2, unit.getAST().apiLevel());
+			// TODO improve test for AST.JLS3
 		} finally {
 			sourceUnit.discardWorkingCopy();
 		}
@@ -4235,9 +4235,9 @@
 		ICompilationUnit sourceUnit = getCompilationUnit("Converter", "src", "test0538", "A.java"); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$ //$NON-NLS-4$
 		try {
 			sourceUnit.becomeWorkingCopy(null, null);
-			CompilationUnit unit = sourceUnit.reconcile(AST.LEVEL_2_0, false, null, null);
+			CompilationUnit unit = sourceUnit.reconcile(AST.JLS2, false, null, null);
 			assertNull("Unexpected compilation unit", unit);
-			// TODO improve test for AST.LEVEL_3_0
+			// TODO improve test for AST.JLS3
 		} finally {
 			sourceUnit.discardWorkingCopy();
 		}
@@ -4256,8 +4256,8 @@
 				"  Object field;\n" +
 				"}"
 			);
-			// TODO improve test for AST.LEVEL_3_0
-			CompilationUnit unit = sourceUnit.reconcile(AST.LEVEL_2_0, false, null, null);
+			// TODO improve test for AST.JLS3
+			CompilationUnit unit = sourceUnit.reconcile(AST.JLS2, false, null, null);
 			ASTNode node = getASTNode(unit, 0, 0);
 			assertNotNull("No node", node);
 			assertTrue("not a field declaration", node.getNodeType() == ASTNode.FIELD_DECLARATION);
@@ -4278,8 +4278,8 @@
 		try {
 			ReconcilerTests.ProblemRequestor pbRequestor = new ReconcilerTests.ProblemRequestor();
 			sourceUnit.becomeWorkingCopy(pbRequestor, null);
-			// TODO improve test for AST.LEVEL_3_0
-			CompilationUnit unit = sourceUnit.reconcile(AST.LEVEL_2_0, true/*force pb detection*/, null, null);
+			// TODO improve test for AST.JLS3
+			CompilationUnit unit = sourceUnit.reconcile(AST.JLS2, true/*force pb detection*/, null, null);
 			ASTNode node = getASTNode(unit, 0);
 			assertNotNull("No node", node);
 			assertTrue("not a type declaration", node.getNodeType() == ASTNode.TYPE_DECLARATION);
@@ -4312,8 +4312,8 @@
 				"  }\n" +
 				"}"
 			);
-			// TODO improve test for AST.LEVEL_3_0
-			CompilationUnit unit = sourceUnit.reconcile(AST.LEVEL_2_0, true/*force pb detection*/, null, null);
+			// TODO improve test for AST.JLS3
+			CompilationUnit unit = sourceUnit.reconcile(AST.JLS2, true/*force pb detection*/, null, null);
 			ASTNode node = getASTNode(unit, 0);
 			assertNotNull("No node", node);
 		} finally {
@@ -4342,8 +4342,8 @@
 				"}"
 			);
 			sourceUnit.reconcile(ICompilationUnit.NO_AST, false/* don't force pb detection*/, null, null);
-			// TODO improve test for AST.LEVEL_3_0
-			CompilationUnit unit = sourceUnit.reconcile(AST.LEVEL_2_0, true/*force pb detection*/, null, null);
+			// TODO improve test for AST.JLS3
+			CompilationUnit unit = sourceUnit.reconcile(AST.JLS2, true/*force pb detection*/, null, null);
 			ASTNode node = getASTNode(unit, 0);
 			assertNotNull("No node", node);
 		} finally {
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTMatcherTest.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTMatcherTest.java
index 39ab6ef..8cca48d 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTMatcherTest.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTMatcherTest.java
@@ -29,8 +29,8 @@
 		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 ASTMatcherTest(methods[i].getName(), AST.LEVEL_2_0));
-				suite.addTest(new ASTMatcherTest(methods[i].getName(), AST.LEVEL_3_0));
+				suite.addTest(new ASTMatcherTest(methods[i].getName(), AST.JLS2));
+				suite.addTest(new ASTMatcherTest(methods[i].getName(), AST.JLS3));
 			}
 		}
 		return suite;
@@ -154,7 +154,7 @@
 		
 		JD1 = ast.newJavadoc();
 		JD2 = ast.newJavadoc();
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			JD1.setComment("/**X*/"); //$NON-NLS-1$
 			JD2.setComment("/**Y*/"); //$NON-NLS-1$
 		}
@@ -179,7 +179,7 @@
 		MPARM1 = ast.newMethodRefParameter();
 		MPARM1.setType(ast.newPrimitiveType(PrimitiveType.CHAR));
 
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			PT1 = ast.newParameterizedType(ast.newSimpleType(ast.newSimpleName("Z"))); //$NON-NLS-1$
 			PT1S = "[(tM[(tS[(nSZZnS)]tS)]tM)]"; //$NON-NLS-1$
 
@@ -638,7 +638,7 @@
 	}
 
 	public void testParameterizedType() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			return;
 		}
 		ParameterizedType x1 = ast.newParameterizedType(ast.newSimpleType(ast.newSimpleName("X"))); //$NON-NLS-1$
@@ -648,7 +648,7 @@
 	}
 
 	public void testQualifiedType() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			return;
 		}
 		Type x1 = ast.newQualifiedType(T1, N1);
@@ -656,7 +656,7 @@
 	}
 
 	public void testWildcardType() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			return;
 		}
 		WildcardType x1 = ast.newWildcardType();
@@ -745,7 +745,7 @@
 	public void testClassInstanceCreation() {
 		ClassInstanceCreation x1 = ast.newClassInstanceCreation();
 		x1.setExpression(E1);
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			x1.setName(N1);
 		} else {
 			x1.typeArguments().add(PT1);
@@ -772,7 +772,7 @@
 	}
 	public void testConstructorInvocation() {
 		ConstructorInvocation x1 = ast.newConstructorInvocation();
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			x1.typeArguments().add(PT1);
 		}
 		x1.arguments().add(E1);
@@ -795,7 +795,7 @@
 		basicMatch(x1);
 	}
 	public void testEnhancedForStatement() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			return;
 		}
 		EnhancedForStatement x1 = ast.newEnhancedForStatement();
@@ -805,7 +805,7 @@
 		basicMatch(x1);
 	}
 	public void testEnumConstantDeclaration() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			return;
 		}
 		EnumConstantDeclaration x1 = ast.newEnumConstantDeclaration();
@@ -820,7 +820,7 @@
 		basicMatch(x1);
 	}
 	public void testEnumDeclaration() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			return;
 		}
 		EnumDeclaration x1 = ast.newEnumDeclaration();
@@ -847,7 +847,7 @@
 	public void testFieldDeclaration() {
 		FieldDeclaration x1 = ast.newFieldDeclaration(W1);
 		x1.setJavadoc(JD1);
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			x1.modifiers().add(MOD1);
 			x1.modifiers().add(MOD2);
 		}
@@ -889,7 +889,7 @@
 	public void testInitializer() {
 		Initializer x1 = ast.newInitializer();
 		x1.setJavadoc(JD1);
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			x1.modifiers().add(MOD1);
 			x1.modifiers().add(MOD2);
 		}
@@ -903,7 +903,7 @@
 	 */
 	public void testJavadoc() {
 		Javadoc x1 = ast.newJavadoc();
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			x1.setComment("/**?*/"); //$NON-NLS-1$
 		}
 		x1.tags().add(TAG1);
@@ -933,7 +933,7 @@
 	public void testMethodDeclaration() {
 		MethodDeclaration x1 = ast.newMethodDeclaration();
 		x1.setJavadoc(JD1);
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			x1.setReturnType(T1);
 		} else {
 			x1.modifiers().add(MOD1);
@@ -953,7 +953,7 @@
 	public void testMethodInvocation() {
 		MethodInvocation x1 = ast.newMethodInvocation();
 		x1.setExpression(N1);
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			x1.typeArguments().add(PT1);
 		}
 		x1.setName(N2);
@@ -986,7 +986,7 @@
 	}
 	public void testPackageDeclaration() {
 		PackageDeclaration x1 = ast.newPackageDeclaration();
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			x1.setJavadoc(JD1);
 			x1.annotations().add(ANO1);
 			x1.annotations().add(ANO2);
@@ -1016,7 +1016,7 @@
 	}
 	public void testSingleVariableDeclaration() {
 		SingleVariableDeclaration x1 = ast.newSingleVariableDeclaration();
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			x1.modifiers().add(MOD1);
 			x1.modifiers().add(MOD2);
 		}
@@ -1033,7 +1033,7 @@
 	public void testSuperConstructorInvocation() {
 		SuperConstructorInvocation x1 = ast.newSuperConstructorInvocation();
 		x1.setExpression(N1);
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			x1.typeArguments().add(PT1);
 		}
 		x1.arguments().add(E1);
@@ -1049,7 +1049,7 @@
 	public void testSuperMethodInvocation() {
 		SuperMethodInvocation x1 = ast.newSuperMethodInvocation();
 		x1.setQualifier(N1);
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			x1.typeArguments().add(PT1);
 		}
 		x1.setName(N2);
@@ -1119,7 +1119,7 @@
 		TypeDeclaration x1 = ast.newTypeDeclaration();
 		x1.setJavadoc(JD1);
 		x1.setName(N1);
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			x1.setSuperclass(N2);
 			x1.superInterfaces().add(N3);
 			x1.superInterfaces().add(N4);
@@ -1146,7 +1146,7 @@
 		basicMatch(x1);
 	}
 	public void testTypeParameter() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			return;
 		}
 		TypeParameter x1 = ast.newTypeParameter();
@@ -1163,7 +1163,7 @@
 	}
 	public void testVariableDeclarationExpression() {
 		VariableDeclarationExpression x1 = ast.newVariableDeclarationExpression(W1);
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			x1.modifiers().add(MOD1);
 			x1.modifiers().add(MOD2);
 		}
@@ -1173,7 +1173,7 @@
 	}
 	public void testVariableDeclarationStatement() {
 		VariableDeclarationStatement x1 = ast.newVariableDeclarationStatement(W1);
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			x1.modifiers().add(MOD1);
 			x1.modifiers().add(MOD2);
 		}
@@ -1190,7 +1190,7 @@
 	
 	// annotation-related
 	public void testAnnotationTypeDeclaration() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			return;
 		}
 		AnnotationTypeDeclaration x1 = ast.newAnnotationTypeDeclaration();
@@ -1204,7 +1204,7 @@
 	}
 
 	public void testAnnotationTypeMemberDeclaration() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			return;
 		}
 		AnnotationTypeMemberDeclaration x1 = ast.newAnnotationTypeMemberDeclaration();
@@ -1218,7 +1218,7 @@
 	}
 
 	public void testNormalAnnotation() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			return;
 		}
 		NormalAnnotation x1 = ast.newNormalAnnotation();
@@ -1229,7 +1229,7 @@
 	}
 
 	public void testMarkerAnnotation() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			return;
 		}
 		MarkerAnnotation x1 = ast.newMarkerAnnotation();
@@ -1238,7 +1238,7 @@
 	}
 
 	public void testSingleMemberAnnotation() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			return;
 		}
 		SingleMemberAnnotation x1 = ast.newSingleMemberAnnotation();
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTNodesCollectorVisitor.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTNodesCollectorVisitor.java
index 5814dd1..99c003f 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTNodesCollectorVisitor.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTNodesCollectorVisitor.java
@@ -71,7 +71,7 @@
 	 * @see org.eclipse.jdt.core.dom.ASTVisitor#endVisit(org.eclipse.jdt.core.dom.ClassInstanceCreation)
 	 */
 	public void endVisit(ClassInstanceCreation node) {
-		if (node.getAST().apiLevel() == AST.LEVEL_2_0) {
+		if (node.getAST().apiLevel() == AST.JLS2) {
 			node.setName(
 					node.getAST().newSimpleName("XXX")); //$NON-NLS-1$
 		}
@@ -233,7 +233,7 @@
 	public void endVisit(TypeDeclaration node) {
 		add(node);
 		node.setName(node.getAST().newSimpleName("XXX")); //$NON-NLS-1$
-		if (node.getAST().apiLevel() == AST.LEVEL_2_0) {
+		if (node.getAST().apiLevel() == AST.JLS2) {
 			node.setSuperclass(node.getAST().newSimpleName("XXX")); //$NON-NLS-1$
 		}
 		detachedListElement(node.bodyDeclarations());
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTParserTest.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTParserTest.java
index 6ab1bf4..57dd00e 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTParserTest.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTParserTest.java
@@ -30,8 +30,8 @@
 		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 ASTParserTest(methods[i].getName(), AST.LEVEL_2_0));
-				suite.addTest(new ASTParserTest(methods[i].getName(), AST.LEVEL_3_0));
+				suite.addTest(new ASTParserTest(methods[i].getName(), AST.JLS2));
+				suite.addTest(new ASTParserTest(methods[i].getName(), AST.JLS3));
 			}
 		}
 		return suite;
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTStructuralPropertyTest.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTStructuralPropertyTest.java
index 30e6bbf..1955274 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTStructuralPropertyTest.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTStructuralPropertyTest.java
@@ -31,8 +31,8 @@
 		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 ASTStructuralPropertyTest(methods[i].getName(), AST.LEVEL_2_0));
-				suite.addTest(new ASTStructuralPropertyTest(methods[i].getName(), AST.LEVEL_3_0));
+				suite.addTest(new ASTStructuralPropertyTest(methods[i].getName(), AST.JLS2));
+				suite.addTest(new ASTStructuralPropertyTest(methods[i].getName(), AST.JLS3));
 			}
 		}
 		return suite;
@@ -261,7 +261,7 @@
 			if (nodeClass != null) {
 				try {
 					ASTNode node = ast.createInstance(nodeClass);
-					if (ast.apiLevel() == AST.LEVEL_2_0) {
+					if (ast.apiLevel() == AST.JLS2) {
 						assertTrue((nodeType >= 1) && (nodeType <= 69));
 					} else {
 						assertTrue((nodeType >= 1) && (nodeType <= 83));
@@ -270,7 +270,7 @@
 					//ASTNode node2 = ast.createInstance(nodeType);
 					//assertTrue(node2.getNodeType() == nodeType);
 				} catch (RuntimeException e) {
-					if (ast.apiLevel() == AST.LEVEL_2_0) {
+					if (ast.apiLevel() == AST.JLS2) {
 						assertTrue((nodeType < 1) || (nodeType > 69));
 					} else {
 						assertTrue((nodeType < 1) || (nodeType > 83));
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTTest.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTTest.java
index 672ca2f..98d7171 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTTest.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTTest.java
@@ -733,8 +733,8 @@
 		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 ASTTest(methods[i].getName(), AST.LEVEL_2_0));
-				suite.addTest(new ASTTest(methods[i].getName(), AST.LEVEL_3_0));
+				suite.addTest(new ASTTest(methods[i].getName(), AST.JLS2));
+				suite.addTest(new ASTTest(methods[i].getName(), AST.JLS3));
 			}
 		}
 		return suite;
@@ -787,7 +787,7 @@
 			
 			// /** Spec. \n @deprecated Use {@link #foo() bar} instead. */public class MyClass {}
 			TypeDeclaration td = localAst.newTypeDeclaration();
-			if (ast.apiLevel() == AST.LEVEL_2_0) {
+			if (ast.apiLevel() == AST.JLS2) {
 				td.setModifiers(Modifier.PUBLIC);
 			} else {
 				td.modifiers().add(localAst.newModifier(Modifier.ModifierKeyword.PUBLIC_KEYWORD));
@@ -830,7 +830,7 @@
 			f1.setInitializer(localAst.newBooleanLiteral(true));
 			FieldDeclaration fd = localAst.newFieldDeclaration(f1);
 			fd.setType(localAst.newPrimitiveType(PrimitiveType.BOOLEAN));
-			if (ast.apiLevel() == AST.LEVEL_2_0) {
+			if (ast.apiLevel() == AST.JLS2) {
 				fd.setModifiers(Modifier.PRIVATE | Modifier.FINAL);
 			} else {
 				fd.modifiers().add(localAst.newModifier(Modifier.ModifierKeyword.PRIVATE_KEYWORD));
@@ -841,7 +841,7 @@
 			
 			// public static void main();
 			MethodDeclaration md = localAst.newMethodDeclaration();
-			if (ast.apiLevel() == AST.LEVEL_2_0) {
+			if (ast.apiLevel() == AST.JLS2) {
 				md.setModifiers(Modifier.PUBLIC | Modifier.STATIC);
 				md.setReturnType(localAst.newPrimitiveType(PrimitiveType.VOID));
 			} else {
@@ -913,7 +913,7 @@
 			
 			// new String(10);
 			ClassInstanceCreation cr1 = localAst.newClassInstanceCreation();
-			if (ast.apiLevel() == AST.LEVEL_2_0) {
+			if (ast.apiLevel() == AST.JLS2) {
 				cr1.setName(localAst.newSimpleName("String")); //$NON-NLS-1$
 			} else {
 				cr1.setType(localAst.newSimpleType(localAst.newSimpleName("String"))); //$NON-NLS-1$
@@ -926,13 +926,13 @@
 			ClassInstanceCreation cr2 = localAst.newClassInstanceCreation();
 			AnonymousClassDeclaration ad1 = localAst.newAnonymousClassDeclaration();
 			cr2.setAnonymousClassDeclaration(ad1);
-			if (ast.apiLevel() == AST.LEVEL_2_0) {
+			if (ast.apiLevel() == AST.JLS2) {
 				cr2.setName(localAst.newSimpleName("Listener")); //$NON-NLS-1$
 			} else {
 				cr2.setType(localAst.newSimpleType(localAst.newSimpleName("Listener"))); //$NON-NLS-1$
 			}
 			MethodDeclaration md0 = localAst.newMethodDeclaration();
-			if (ast.apiLevel() == AST.LEVEL_2_0) {
+			if (ast.apiLevel() == AST.JLS2) {
 				md0.setModifiers(Modifier.PUBLIC);
 			} else {
 				md0.modifiers().add(localAst.newModifier(Modifier.ModifierKeyword.PUBLIC_KEYWORD));
@@ -1261,17 +1261,17 @@
 
 	public void testAST() {
 		
-		assertTrue(AST.LEVEL_2_0 == 2);
-		assertTrue(AST.LEVEL_3_0 == 3);
+		assertTrue(AST.JLS2 == 2);
+		assertTrue(AST.JLS3 == 3);
 		
 		AST a0 = new AST(); // deprecated, but still 2.0
-		assertTrue(a0.apiLevel() == AST.LEVEL_2_0);
+		assertTrue(a0.apiLevel() == AST.JLS2);
 		AST a1 = new AST(new HashMap()); // deprecated, but still 2.0
-		assertTrue(a1.apiLevel() == AST.LEVEL_2_0);
-		AST a2 = AST.newAST(AST.LEVEL_2_0);
-		assertTrue(a2.apiLevel() == AST.LEVEL_2_0);
-		AST a3 = AST.newAST(AST.LEVEL_3_0);
-		assertTrue(a3.apiLevel() == AST.LEVEL_3_0);
+		assertTrue(a1.apiLevel() == AST.JLS2);
+		AST a2 = AST.newAST(AST.JLS2);
+		assertTrue(a2.apiLevel() == AST.JLS2);
+		AST a3 = AST.newAST(AST.JLS3);
+		assertTrue(a3.apiLevel() == AST.JLS3);
 		
 		
 		// modification count is always non-negative
@@ -1443,7 +1443,7 @@
 		fd.setName(ast.newSimpleName("b")); //$NON-NLS-1$
 		assertTrue(x.isDeclaration() == false);
 		
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			AnnotationTypeDeclaration atd = ast.newAnnotationTypeDeclaration();
 			atd.setName(x);
 			assertTrue(x.isDeclaration() == true);
@@ -1451,7 +1451,7 @@
 			assertTrue(x.isDeclaration() == false);
 		}
 		
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			AnnotationTypeMemberDeclaration atmd = ast.newAnnotationTypeMemberDeclaration();
 			atmd.setName(x);
 			assertTrue(x.isDeclaration() == true);
@@ -1960,7 +1960,7 @@
 	}		
 
 	public void testParameterizedType() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			// node type introduced in 3.0 API
 			try {
 				ast.newParameterizedType(ast.newSimpleType(ast.newSimpleName("String"))); //$NON-NLS-1$
@@ -2039,7 +2039,7 @@
 	}		
 	
 	public void testQualifiedType() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			// node type introduced in 3.0 API
 			try {
 				ast.newQualifiedType(
@@ -2117,7 +2117,7 @@
 	}		
 
 	public void testWildcardType() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			// node type introduced in 3.0 API
 			try {
 				ast.newWildcardType();
@@ -2209,7 +2209,7 @@
 		previousCount = ast.modificationCount();
 		assertTrue(x.getAST() == ast);
 		assertTrue(x.getParent() == null);
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			assertTrue(x.getJavadoc() == null);
 			assertTrue(x.annotations().isEmpty());
 		}
@@ -2219,7 +2219,7 @@
 		// make sure that reading did not change modification count
 		assertTrue(ast.modificationCount() == previousCount);
 
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			genericPropertyTest(x, new Property("Javadoc", false, Javadoc.class) { //$NON-NLS-1$
 				public ASTNode sample(AST targetAst, boolean parented) {
 					Javadoc result = targetAst.newJavadoc();
@@ -2273,7 +2273,7 @@
 		assertTrue(x.getAST() == ast);
 		assertTrue(x.getParent() == null);
 		assertTrue(x.isOnDemand() == false);
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			assertTrue(x.isStatic() == false);
 		}
 		assertTrue(x.getName().getParent() == x);
@@ -2307,7 +2307,7 @@
 		assertTrue(ast.modificationCount() > previousCount);
 		assertTrue(x.isOnDemand() == true);
 		
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			x.setStatic(true);
 			assertTrue(ast.modificationCount() > previousCount);
 			assertTrue(x.isStatic() == true);
@@ -2443,7 +2443,7 @@
 		previousCount = ast.modificationCount();
 		assertTrue(x.getAST() == ast);
 		assertTrue(x.getParent() == null);
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			assertTrue(x.getModifiers() == Modifier.NONE);
 			assertTrue(x.getSuperclass() == null);
 			assertTrue(x.superInterfaces().size() == 0);
@@ -2468,7 +2468,7 @@
 		assertTrue(ast.modificationCount() > previousCount);
 		assertTrue(x.isInterface() == true);
 		
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			int legal = Modifier.PUBLIC | Modifier.PROTECTED
 				| Modifier.PRIVATE | Modifier.ABSTRACT | Modifier.STATIC
 				| Modifier.FINAL | Modifier.STRICTFP;
@@ -2502,7 +2502,7 @@
 			}
 		});
 		
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			genericPropertyListTest(x, x.typeParameters(),
 			  new Property("TypeParameters", true, TypeParameter.class) { //$NON-NLS-1$
 				public ASTNode sample(AST targetAst, boolean parented) {
@@ -2515,7 +2515,7 @@
 			});
 		}
 		
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			genericPropertyTest(x, new Property("Superclass", false, Name.class) { //$NON-NLS-1$
 				public ASTNode sample(AST targetAst, boolean parented) {
 					SimpleName result = targetAst.newSimpleName("foo"); //$NON-NLS-1$
@@ -2533,7 +2533,7 @@
 			});
 		}
 		
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			genericPropertyListTest(x, x.superInterfaces(),
 			  new Property("SuperInterfaces", true, Name.class) { //$NON-NLS-1$
 				public ASTNode sample(AST targetAst, boolean parented) {
@@ -2546,7 +2546,7 @@
 			});
 		}
 		
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			genericPropertyTest(x, new Property("SuperclassType", false, Type.class) { //$NON-NLS-1$
 				public ASTNode sample(AST targetAst, boolean parented) {
 					SimpleType result = targetAst.newSimpleType(targetAst.newSimpleName("foo")); //$NON-NLS-1$
@@ -2564,7 +2564,7 @@
 			});
 		}
 		
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			genericPropertyListTest(x, x.superInterfaceTypes(),
 			  new Property("SuperInterfaceTypes", true, Type.class) { //$NON-NLS-1$
 				public ASTNode sample(AST targetAst, boolean parented) {
@@ -2610,7 +2610,7 @@
 		
 		EnumConstantDeclaration c1 = null;
 		EnumConstantDeclaration c2 = null;
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			c1 = ast.newEnumConstantDeclaration();
 			c2 = ast.newEnumConstantDeclaration();
 			x.bodyDeclarations().add(c1);
@@ -2654,7 +2654,7 @@
 	}	
 	
 	public void testEnumDeclaration() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			// node type introduced in 3.0 API
 			try {
 				ast.newEnumDeclaration();
@@ -2774,7 +2774,7 @@
 	}	
 	
 	public void testEnumConstantDeclaration() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			// node type introduced in 3.0 API
 			try {
 				ast.newEnumConstantDeclaration();
@@ -2873,7 +2873,7 @@
 	}	
 	
 	public void testTypeParameter() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			// node type introduced in 3.0 API
 			try {
 				ast.newTypeParameter();
@@ -2930,7 +2930,7 @@
 		previousCount = ast.modificationCount();
 		assertTrue(x.getAST() == ast);
 		assertTrue(x.getParent() == null);
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			assertTrue(x.getModifiers() == Modifier.NONE);
 		} else {
 			assertTrue(x.modifiers().size() == 0);
@@ -2946,7 +2946,7 @@
 		// make sure that reading did not change modification count
 		assertTrue(ast.modificationCount() == previousCount);
 
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			int legal = Modifier.PUBLIC | Modifier.PROTECTED
 				| Modifier.PRIVATE | Modifier.STATIC | Modifier.FINAL
 				| Modifier.TRANSIENT | Modifier.VOLATILE;
@@ -2971,7 +2971,7 @@
 		assertTrue(ast.modificationCount() > previousCount);
 		assertTrue(x.getExtraDimensions() == 0);
 
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			previousCount = ast.modificationCount();
 			x.setVarargs(true);
 			assertTrue(ast.modificationCount() > previousCount);
@@ -2983,7 +2983,7 @@
 			assertTrue(x.isVarargs() == false);
 		}
 
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			genericPropertyListTest(x, x.modifiers(), new Property("Modifiers", true, IExtendedModifier.class) { //$NON-NLS-1$
 				public ASTNode sample(AST targetAst, boolean parented) {
 					Modifier result = targetAst.newModifier(Modifier.ModifierKeyword.PUBLIC_KEYWORD);
@@ -3179,7 +3179,7 @@
 		previousCount = ast.modificationCount();
 		assertTrue(x.getAST() == ast);
 		assertTrue(x.getParent() == null);
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			assertTrue(x.getModifiers() == Modifier.NONE);
 			assertTrue(x.getReturnType().getParent() == x);
 			assertTrue(x.getReturnType().isPrimitiveType());
@@ -3216,7 +3216,7 @@
 		assertTrue(ast.modificationCount() > previousCount);
 		assertTrue(x.isConstructor() == false);
 		
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			previousCount = ast.modificationCount();
 			int legal = Modifier.PUBLIC | Modifier.PROTECTED
 				| Modifier.PRIVATE | Modifier.ABSTRACT | Modifier.STATIC 
@@ -3245,7 +3245,7 @@
 		tJavadocComment(x);
 		tModifiers(x);
 						
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			genericPropertyListTest(x, x.typeParameters(),
 			  new Property("TypeParameters", true, TypeParameter.class) { //$NON-NLS-1$
 				public ASTNode sample(AST targetAst, boolean parented) {
@@ -3274,7 +3274,7 @@
 			}
 		});
 		
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			genericPropertyTest(x, new Property("ReturnType", true, Type.class) { //$NON-NLS-1$
 				public ASTNode sample(AST targetAst, boolean parented) {
 					SimpleType result = targetAst.newSimpleType(
@@ -3293,7 +3293,7 @@
 			});
 		}
 		
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			genericPropertyTest(x, new Property("ReturnType2", false, Type.class) { //$NON-NLS-1$
 				public ASTNode sample(AST targetAst, boolean parented) {
 					SimpleType result = targetAst.newSimpleType(
@@ -3377,7 +3377,7 @@
 			}
 		});
 		
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			// check isVariableArity convenience method
 			x.parameters().clear();
 			assertTrue(!x.isVarargs()); // 0 params
@@ -3401,7 +3401,7 @@
 		assertTrue(x.getAST() == ast);
 		assertTrue(x.getParent() == null);
 		assertTrue(x.getJavadoc() == null);
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			assertTrue(x.getModifiers() == Modifier.NONE);
 		} else {
 			assertTrue(x.modifiers().size() == 0);
@@ -3417,7 +3417,7 @@
 		tJavadocComment(x);
 		tModifiers(x);
 				
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			int legal = Modifier.STATIC;
 			previousCount = ast.modificationCount();
 			x.setModifiers(legal);
@@ -3471,7 +3471,7 @@
 		previousCount = ast.modificationCount();
 		assertTrue(x.getAST() == ast);
 		assertTrue(x.getParent() == null);
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			assertTrue(x.getComment().startsWith("/**")); //$NON-NLS-1$
 			assertTrue(x.getComment().endsWith("*/")); //$NON-NLS-1$
 		}
@@ -3505,7 +3505,7 @@
 		assertTrue(TagElement.TAG_VALUE.equals("@value")); //$NON-NLS-1$
 		assertTrue(TagElement.TAG_VERSION.equals("@version")); //$NON-NLS-1$
 
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			final String[] samples =
 				{ 
 				  "/** Hello there */", //$NON-NLS-1$
@@ -3966,7 +3966,7 @@
 		previousCount = ast.modificationCount();
 		assertTrue(x.getAST() == ast);
 		assertTrue(x.getParent() == null);
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			assertTrue(x.typeArguments().isEmpty());
 		}
 		assertTrue(x.getName().getParent() == x);
@@ -4004,7 +4004,7 @@
 			}
 		});
 
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			genericPropertyListTest(x, x.typeArguments(),
 			  new Property("TypeArguments", true, Type.class) { //$NON-NLS-1$
 				public ASTNode sample(AST targetAst, boolean parented) {
@@ -4116,7 +4116,7 @@
 		previousCount = ast.modificationCount();
 		assertTrue(x.getAST() == ast);
 		assertTrue(x.getParent() == null);
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			assertTrue(x.getModifiers() == Modifier.NONE);
 		} else {
 			assertTrue(x.modifiers().size() == 0);
@@ -4134,7 +4134,7 @@
 	
 		tLeadingComment(x);
 
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			int legal = Modifier.FINAL;
 			previousCount = ast.modificationCount();
 			x.setModifiers(legal);
@@ -4147,7 +4147,7 @@
 			assertTrue(x.getModifiers() == Modifier.NONE);
 		}
 		
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			genericPropertyListTest(x, x.modifiers(), new Property("Modifiers", true, IExtendedModifier.class) { //$NON-NLS-1$
 				public ASTNode sample(AST targetAst, boolean parented) {
 					Modifier result = targetAst.newModifier(Modifier.ModifierKeyword.PUBLIC_KEYWORD);
@@ -4254,7 +4254,7 @@
 		previousCount = ast.modificationCount();
 		assertTrue(x.getAST() == ast);
 		assertTrue(x.getParent() == null);
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			assertTrue(x.getTypeDeclaration() == x1);
 		} else {
 			assertTrue(x.getDeclaration() == x1);
@@ -4273,7 +4273,7 @@
 	
 		tLeadingComment(x);
 
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			genericPropertyTest(x, new Property("TypeDeclaration", true, TypeDeclaration.class) { //$NON-NLS-1$
 				public ASTNode sample(AST targetAst, boolean parented) {
 					TypeDeclaration result = targetAst.newTypeDeclaration();
@@ -4305,7 +4305,7 @@
 			});
 		}
 		
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			genericPropertyTest(x, new Property("Declaration", true, AbstractTypeDeclaration.class) { //$NON-NLS-1$
 				public ASTNode sample(AST targetAst, boolean parented) {
 					AbstractTypeDeclaration result = targetAst.newTypeDeclaration();
@@ -4347,7 +4347,7 @@
 		previousCount = ast.modificationCount();
 		assertTrue(x.getAST() == ast);
 		assertTrue(x.getParent() == null);
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			assertTrue(x.getModifiers() == Modifier.NONE);
 		} else {
 			assertTrue(x.modifiers().size() == 0);
@@ -4363,7 +4363,7 @@
 		// make sure that reading did not change modification count
 		assertTrue(ast.modificationCount() == previousCount);
 	
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			int legal = Modifier.FINAL;
 			previousCount = ast.modificationCount();
 			x.setModifiers(legal);
@@ -4376,7 +4376,7 @@
 			assertTrue(x.getModifiers() == Modifier.NONE);
 		}
 		
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			genericPropertyListTest(x, x.modifiers(), new Property("Modifiers", true, IExtendedModifier.class) { //$NON-NLS-1$
 				public ASTNode sample(AST targetAst, boolean parented) {
 					Modifier result = targetAst.newModifier(Modifier.ModifierKeyword.PUBLIC_KEYWORD);
@@ -4474,7 +4474,7 @@
 		assertTrue(x.getAST() == ast);
 		assertTrue(x.getParent() == null);
 		assertTrue(x.getJavadoc() == null);
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			assertTrue(x.getModifiers() == Modifier.NONE);
 		} else {
 			assertTrue(x.modifiers().size() == 0);
@@ -4490,7 +4490,7 @@
 		// make sure that reading did not change modification count
 		assertTrue(ast.modificationCount() == previousCount);
 	
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			int legal = Modifier.PUBLIC | Modifier.PROTECTED
 				| Modifier.PRIVATE | Modifier.STATIC | Modifier.FINAL
 				| Modifier.TRANSIENT | Modifier.VOLATILE;
@@ -5340,7 +5340,7 @@
 	 * @param x the body declaration to test
 	 */
 	void tModifiers(final BodyDeclaration x) {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			return;
 		}
 		genericPropertyListTest(x, x.modifiers(), new Property("Modifiers", true, IExtendedModifier.class) { //$NON-NLS-1$
@@ -6247,7 +6247,7 @@
 	 * @deprecated (Uses getLeadingComment() which is deprecated)
 	 */
 	public void testEnhancedForStatement() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			// node type introduced in 3.0 API
 			try {
 				ast.newEnhancedForStatement();
@@ -6336,7 +6336,7 @@
 		previousCount = ast.modificationCount();
 		assertTrue(x.getAST() == ast);
 		assertTrue(x.getParent() == null);
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			assertTrue(x.typeArguments().isEmpty());
 		}
 		assertTrue(x.arguments().isEmpty());
@@ -6346,7 +6346,7 @@
 		// make sure that reading did not change modification count
 		assertTrue(ast.modificationCount() == previousCount);
 		
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			genericPropertyListTest(x, x.typeArguments(),
 			  new Property("TypeArguments", true, Type.class) { //$NON-NLS-1$
 				public ASTNode sample(AST targetAst, boolean parented) {
@@ -6395,7 +6395,7 @@
 		assertTrue(x.getAST() == ast);
 		assertTrue(x.getParent() == null);
 		assertTrue(x.getExpression() == null);
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			assertTrue(x.typeArguments().isEmpty());
 		}
 		assertTrue(x.arguments().isEmpty());
@@ -6437,7 +6437,7 @@
 			}
 		});
 
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			genericPropertyListTest(x, x.typeArguments(),
 			  new Property("TypeArguments", true, Type.class) { //$NON-NLS-1$
 				public ASTNode sample(AST targetAst, boolean parented) {
@@ -6626,7 +6626,7 @@
 		previousCount = ast.modificationCount();
 		assertTrue(x.getAST() == ast);
 		assertTrue(x.getParent() == null);
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			assertTrue(x.typeArguments().isEmpty());
 		}
 		assertTrue(x.getName().getParent() == x);
@@ -6656,7 +6656,7 @@
 			}
 		});
 
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			genericPropertyListTest(x, x.typeArguments(),
 			  new Property("TypeArguments", true, Type.class) { //$NON-NLS-1$
 				public ASTNode sample(AST targetAst, boolean parented) {
@@ -7395,7 +7395,7 @@
 		assertTrue(x.getAST() == ast);
 		assertTrue(x.getParent() == null);
 		assertTrue(x.getExpression() == null);
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			assertTrue(x.getName().getParent() == x);
 		} else {
 			assertTrue(x.typeArguments().isEmpty());
@@ -7435,7 +7435,7 @@
 			}
 		});
 
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			genericPropertyListTest(x, x.typeArguments(),
 			  new Property("TypeArguments", true, Type.class) { //$NON-NLS-1$
 				public ASTNode sample(AST targetAst, boolean parented) {
@@ -7448,7 +7448,7 @@
 			});
 		}
 		
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			genericPropertyTest(x, new Property("Name", true, Name.class) { //$NON-NLS-1$
 				public ASTNode sample(AST targetAst, boolean parented) {
 					SimpleName result = targetAst.newSimpleName("a"); //$NON-NLS-1$
@@ -7466,7 +7466,7 @@
 			});
 		}
 		
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			genericPropertyTest(x, new Property("Type", true, Type.class) { //$NON-NLS-1$
 				public ASTNode sample(AST targetAst, boolean parented) {
 					SimpleType result = targetAst.newSimpleType(targetAst.newSimpleName("foo")); //$NON-NLS-1$
@@ -7705,7 +7705,7 @@
 	}
 	
 	public void testAnnotationTypeDeclaration() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			// node type introduced in 3.0 API
 			try {
 				ast.newAnnotationTypeDeclaration();
@@ -7801,7 +7801,7 @@
 	}
 
 	public void testAnnotationTypeMemberDeclaration() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			// node type introduced in 3.0 API
 			try {
 				ast.newAnnotationTypeMemberDeclaration();
@@ -7895,7 +7895,7 @@
 	}
 
 	public void testNormalAnnotation() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			// node type introduced in 3.0 API
 			try {
 				ast.newNormalAnnotation();
@@ -7955,7 +7955,7 @@
 	}
 		
 	public void testMarkerAnnotation() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			// node type introduced in 3.0 API
 			try {
 				ast.newMarkerAnnotation();
@@ -7987,7 +7987,7 @@
 	}
 
 	public void testSingleMemberAnnotation() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			// node type introduced in 3.0 API
 			try {
 				ast.newSingleMemberAnnotation();
@@ -8047,7 +8047,7 @@
 	}
 
 	public void testMemberValuePair() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			// node type introduced in 3.0 API
 			try {
 				ast.newMemberValuePair();
@@ -8191,7 +8191,7 @@
 			assertTrue(Modifier.isVolatile(m) == (m == Modifier.VOLATILE));
 		}
 		
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			// node type introduced in 3.0 API
 			try {
 				ast.newModifier(Modifier.ModifierKeyword.PUBLIC_KEYWORD);
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTVisitorTest.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTVisitorTest.java
index 7ca7dcf..be2ffa5 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTVisitorTest.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTVisitorTest.java
@@ -25,8 +25,8 @@
 		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 ASTVisitorTest(methods[i].getName(), AST.LEVEL_2_0));
-				suite.addTest(new ASTVisitorTest(methods[i].getName(), AST.LEVEL_3_0));
+				suite.addTest(new ASTVisitorTest(methods[i].getName(), AST.JLS2));
+				suite.addTest(new ASTVisitorTest(methods[i].getName(), AST.JLS3));
 			}
 		}
 		return suite;
@@ -232,7 +232,7 @@
 		MPARM1.setType(ast.newPrimitiveType(PrimitiveType.CHAR));
 		MPARM1S = "[(MPARM[(tPcharchartP)]MPARM)]";  //$NON-NLS-1$
 
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			PT1 = ast.newParameterizedType(ast.newSimpleType(ast.newSimpleName("Z"))); //$NON-NLS-1$
 			PT1S = "[(tM[(tS[(nSZZnS)]tS)]tM)]"; //$NON-NLS-1$
 
@@ -1073,7 +1073,7 @@
 	}
 
 	public void testParameterizedType() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			return;
 		}
 		ParameterizedType x1 = ast.newParameterizedType(T1);
@@ -1087,7 +1087,7 @@
 	}
 
 	public void testQualifiedType() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			return;
 		}
 		QualifiedType x1 = ast.newQualifiedType(T1, N1);
@@ -1099,7 +1099,7 @@
 	}
 
 	public void testWildcardType() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			return;
 		}
 		WildcardType x1 = ast.newWildcardType();
@@ -1242,7 +1242,7 @@
 	public void testClassInstanceCreation() {
 		ClassInstanceCreation x1 = ast.newClassInstanceCreation();
 		x1.setExpression(E1);
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			x1.setName(N1);
 		} else {
 			x1.typeArguments().add(PT1);
@@ -1253,7 +1253,7 @@
 		b.setLength(0);
 		x1.accept(v1);
 		String result = b.toString();
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			assertTrue(result.equals("[(eCI"+E1S+N1S+ACD1S+"eCI)]")); //$NON-NLS-1$ //$NON-NLS-2$
 		} else {
 			assertTrue(result.equals("[(eCI"+E1S+PT1S+T1S+ACD1S+"eCI)]")); //$NON-NLS-1$ //$NON-NLS-2$
@@ -1302,7 +1302,7 @@
 	}
 	public void testConstructorInvocation() {
 		ConstructorInvocation x1 = ast.newConstructorInvocation();
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			x1.typeArguments().add(PT1);
 		}
 		x1.arguments().add(E1);
@@ -1311,7 +1311,7 @@
 		b.setLength(0);
 		x1.accept(v1);
 		String result = b.toString();
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			assertTrue(result.equals("[(sCI"+E1S+E2S+"sCI)]")); //$NON-NLS-1$ //$NON-NLS-2$
 		} else {
 			assertTrue(result.equals("[(sCI"+PT1S+E1S+E2S+"sCI)]")); //$NON-NLS-1$ //$NON-NLS-2$
@@ -1345,7 +1345,7 @@
 		assertTrue(result.equals("[(sEMsEM)]")); //$NON-NLS-1$
 	}
 	public void testEnumConstantDeclaration() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			return;
 		}
 		EnumConstantDeclaration x1 = ast.newEnumConstantDeclaration();
@@ -1364,7 +1364,7 @@
 		assertTrue(result.equals("[(ECD"+JD1S+MOD1S+MOD2S+N1S+E1S+E2S+FD1S+FD2S+"ECD)]")); //$NON-NLS-1$ //$NON-NLS-2$
 	}
 	public void testEnumDeclaration() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			return;
 		}
 		EnumDeclaration x1 = ast.newEnumDeclaration();
@@ -1403,7 +1403,7 @@
 	public void testFieldDeclaration() {
 		FieldDeclaration x1 = ast.newFieldDeclaration(W1);
 		x1.setJavadoc(JD1);
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			x1.modifiers().add(MOD1);
 			x1.modifiers().add(MOD2);
 		}
@@ -1413,7 +1413,7 @@
 		b.setLength(0);
 		x1.accept(v1);
 		String result = b.toString();
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			assertTrue(result.equals("[(FD"+JD1S+T1S+W1S+W2S+"FD)]")); //$NON-NLS-1$ //$NON-NLS-2$
 		} else {
 			assertTrue(result.equals("[(FD"+JD1S+MOD1S+MOD2S+T1S+W1S+W2S+"FD)]")); //$NON-NLS-1$ //$NON-NLS-2$
@@ -1434,7 +1434,7 @@
 		assertTrue(result.equals("[(sFR"+E1S+E2S+N1S+N2S+N3S+S1S+"sFR)]")); //$NON-NLS-1$ //$NON-NLS-2$
 	}
 	public void testEnhancedForStatement() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			return;
 		}
 		EnhancedForStatement x1 = ast.newEnhancedForStatement();
@@ -1493,7 +1493,7 @@
 	public void testInitializer() {
 		Initializer x1 = ast.newInitializer();
 		x1.setJavadoc(JD1);
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			x1.modifiers().add(MOD1);
 			x1.modifiers().add(MOD2);
 		}
@@ -1502,7 +1502,7 @@
 		b.setLength(0);
 		x1.accept(v1);
 		String result = b.toString();
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			assertTrue(result.equals("[(IN"+JD1S+B1S+"IN)]")); //$NON-NLS-1$ //$NON-NLS-2$
 		} else {
 			assertTrue(result.equals("[(IN"+JD1S+MOD1S+MOD2S+B1S+"IN)]")); //$NON-NLS-1$ //$NON-NLS-2$
@@ -1580,7 +1580,7 @@
 	public void testMethodDeclaration() {
 		MethodDeclaration x1 = ast.newMethodDeclaration();
 		x1.setJavadoc(JD1);
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			x1.setReturnType(T1);
 		} else {
 			x1.modifiers().add(MOD1);
@@ -1598,7 +1598,7 @@
 		b.setLength(0);
 		x1.accept(v1);
 		String result = b.toString();
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			assertTrue(result.equals("[(MD"+JD1S+T1S+N1S+V1S+V2S+N2S+N3S+B1S+"MD)]")); //$NON-NLS-1$ //$NON-NLS-2$
 		} else {
 			assertTrue(result.equals("[(MD"+JD1S+MOD1S+MOD2S+TP1S+T1S+N1S+V1S+V2S+N2S+N3S+B1S+"MD)]")); //$NON-NLS-1$ //$NON-NLS-2$
@@ -1607,7 +1607,7 @@
 	public void testMethodInvocation() {
 		MethodInvocation x1 = ast.newMethodInvocation();
 		x1.setExpression(N1);
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			x1.typeArguments().add(PT1);
 		}
 		x1.setName(N2);
@@ -1617,7 +1617,7 @@
 		b.setLength(0);
 		x1.accept(v1);
 		String result = b.toString();
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			assertTrue(result.equals("[(eMI"+N1S+N2S+E1S+E2S+"eMI)]")); //$NON-NLS-1$ //$NON-NLS-2$
 		} else {
 			assertTrue(result.equals("[(eMI"+N1S+PT1S+N2S+E1S+E2S+"eMI)]")); //$NON-NLS-1$ //$NON-NLS-2$
@@ -1648,7 +1648,7 @@
 	}
 
 	public void testModifier() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			return;
 		}
 		Modifier x1 = ast.newModifier(Modifier.ModifierKeyword.PRIVATE_KEYWORD);
@@ -1660,7 +1660,7 @@
 	}
 
 	public void testNormalAnnotation() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			return;
 		}
 		NormalAnnotation x1 = ast.newNormalAnnotation();
@@ -1675,7 +1675,7 @@
 	}
 
 	public void testMemberValuePair() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			return;
 		}
 		MemberValuePair x1 = ast.newMemberValuePair();
@@ -1689,7 +1689,7 @@
 	}
 
 	public void testMarkerAnnotation() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			return;
 		}
 		MarkerAnnotation x1 = ast.newMarkerAnnotation();
@@ -1702,7 +1702,7 @@
 	}
 
 	public void testSingleMemberAnnotation() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			return;
 		}
 		SingleMemberAnnotation x1 = ast.newSingleMemberAnnotation();
@@ -1716,7 +1716,7 @@
 	}
 
 	public void testAnnotationTypeDeclaration() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			return;
 		}
 		AnnotationTypeDeclaration x1 = ast.newAnnotationTypeDeclaration();
@@ -1734,7 +1734,7 @@
 	}
 	
 	public void testAnnotationTypeMemberDeclaration() {
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			return;
 		}
 		AnnotationTypeMemberDeclaration x1 = ast.newAnnotationTypeMemberDeclaration();
@@ -1769,7 +1769,7 @@
 	}
 	public void testPackageDeclaration() {
 		PackageDeclaration x1 = ast.newPackageDeclaration();
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			x1.setJavadoc(JD1);
 			x1.annotations().add(ANO1);
 			x1.annotations().add(ANO2);
@@ -1779,7 +1779,7 @@
 		b.setLength(0);
 		x1.accept(v1);
 		String result = b.toString();
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			assertTrue(result.equals("[(PD"+N1S+"PD)]")); //$NON-NLS-1$ //$NON-NLS-2$
 		} else {
 			assertTrue(result.equals("[(PD"+JD1S+ANO1S+ANO2S+N1S+"PD)]")); //$NON-NLS-1$ //$NON-NLS-2$
@@ -1835,7 +1835,7 @@
 	public void testSuperConstructorInvocation() {
 		SuperConstructorInvocation x1 = ast.newSuperConstructorInvocation();
 		x1.setExpression(N1);
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			x1.typeArguments().add(PT1);
 		}
 		x1.arguments().add(E1);
@@ -1844,7 +1844,7 @@
 		b.setLength(0);
 		x1.accept(v1);
 		String result = b.toString();
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			assertTrue(result.equals("[(sSC"+N1S+E1S+E2S+"sSC)]")); //$NON-NLS-1$ //$NON-NLS-2$
 		} else {
 			assertTrue(result.equals("[(sSC"+N1S+PT1S+E1S+E2S+"sSC)]")); //$NON-NLS-1$ //$NON-NLS-2$
@@ -1863,7 +1863,7 @@
 	public void testSuperMethodInvocation() {
 		SuperMethodInvocation x1 = ast.newSuperMethodInvocation();
 		x1.setQualifier(N1);
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			x1.typeArguments().add(PT1);
 		}
 		x1.setName(N2);
@@ -1873,7 +1873,7 @@
 		b.setLength(0);
 		x1.accept(v1);
 		String result = b.toString();
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			assertTrue(result.equals("[(eSM"+N1S+N2S+E1S+E2S+"eSM)]")); //$NON-NLS-1$ //$NON-NLS-2$
 		} else {
 			assertTrue(result.equals("[(eSM"+N1S+PT1S+N2S+E1S+E2S+"eSM)]")); //$NON-NLS-1$ //$NON-NLS-2$
@@ -1971,7 +1971,7 @@
 		TypeDeclaration x1 = ast.newTypeDeclaration();
 		x1.setJavadoc(JD1);
 		x1.setName(N1);
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			x1.setSuperclass(N2);
 			x1.superInterfaces().add(N3);
 			x1.superInterfaces().add(N4);
@@ -1989,7 +1989,7 @@
 		b.setLength(0);
 		x1.accept(v1);
 		String result = b.toString();
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			assertTrue(result.equals("[(TD"+JD1S+N1S+N2S+N3S+N4S+FD1S+FD2S+"TD)]")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 		} else {
 			assertTrue(result.equals("[(TD"+JD1S+MOD1S+MOD2S+N1S+TP1S+PT1S+T1S+T2S+FD1S+FD2S+"TD)]")); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
@@ -2014,7 +2014,7 @@
 	}
 	public void testSingleVariableDeclaration() {
 		SingleVariableDeclaration x1 = ast.newSingleVariableDeclaration();
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			x1.modifiers().add(MOD1);
 			x1.modifiers().add(MOD2);
 		}
@@ -2025,7 +2025,7 @@
 		b.setLength(0);
 		x1.accept(v1);
 		String result = b.toString();
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			assertTrue(result.equals("[(VD"+T1S+N1S+E1S+"VD)]")); //$NON-NLS-1$ //$NON-NLS-2$
 		} else {
 			assertTrue(result.equals("[(VD"+MOD1S+MOD2S+T1S+N1S+E1S+"VD)]")); //$NON-NLS-1$ //$NON-NLS-2$
@@ -2043,7 +2043,7 @@
 	}
 	public void testVariableDeclarationExpression() {
 		VariableDeclarationExpression x1 = ast.newVariableDeclarationExpression(W1);
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			x1.modifiers().add(MOD1);
 			x1.modifiers().add(MOD2);
 		}
@@ -2053,7 +2053,7 @@
 		b.setLength(0);
 		x1.accept(v1);
 		String result = b.toString();
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			assertTrue(result.equals("[(eVD"+T1S+W1S+W2S+"eVD)]")); //$NON-NLS-1$ //$NON-NLS-2$
 		} else {
 			assertTrue(result.equals("[(eVD"+MOD1S+MOD2S+T1S+W1S+W2S+"eVD)]")); //$NON-NLS-1$ //$NON-NLS-2$
@@ -2061,7 +2061,7 @@
 	}
 	public void testVariableDeclarationStatement() {
 		VariableDeclarationStatement x1 = ast.newVariableDeclarationStatement(W1);
-		if (ast.apiLevel() >= AST.LEVEL_3_0) {
+		if (ast.apiLevel() >= AST.JLS3) {
 			x1.modifiers().add(MOD1);
 			x1.modifiers().add(MOD2);
 		}
@@ -2071,7 +2071,7 @@
 		b.setLength(0);
 		x1.accept(v1);
 		String result = b.toString();
-		if (ast.apiLevel() == AST.LEVEL_2_0) {
+		if (ast.apiLevel() == AST.JLS2) {
 			assertTrue(result.equals("[(sVD"+T1S+W1S+W2S+"sVD)]")); //$NON-NLS-1$ //$NON-NLS-2$
 		} else {
 			assertTrue(result.equals("[(sVD"+MOD1S+MOD2S+T1S+W1S+W2S+"sVD)]")); //$NON-NLS-1$ //$NON-NLS-2$
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/BindingsCollectorVisitor.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/BindingsCollectorVisitor.java
index 9158d1a..549511e 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/BindingsCollectorVisitor.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/BindingsCollectorVisitor.java
@@ -14,8 +14,6 @@
 import java.util.HashSet;
 
 import org.eclipse.jdt.core.dom.*;
-import org.eclipse.jdt.core.dom.ASTVisitor;
-
 /**
  * @author oliviert
  *
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ConverterTestSetup.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ConverterTestSetup.java
index 563b83f..24810e7 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ConverterTestSetup.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ConverterTestSetup.java
@@ -103,7 +103,7 @@
 	public void setUpSuite() throws Exception {
 		super.setUpSuite();
 		setupConverterJCL();
-		ast = AST.newAST(AST.LEVEL_2_0);
+		ast = AST.newAST(AST.JLS2);
 		setUpJavaProject("Converter"); //$NON-NLS-1$
 		
 		Map options = JavaCore.getDefaultOptions();
@@ -128,19 +128,19 @@
 	}
 	
 	public ASTNode runConversion(ICompilationUnit unit, boolean resolveBindings) {
-		return runConversion(AST.LEVEL_2_0, unit, resolveBindings);
+		return runConversion(AST.JLS2, unit, resolveBindings);
 	}
 
 	public ASTNode runConversion(ICompilationUnit unit, int position, boolean resolveBindings) {
-		return runConversion(AST.LEVEL_2_0, unit, position, resolveBindings);
+		return runConversion(AST.JLS2, unit, position, resolveBindings);
 	}
 
 	public ASTNode runConversion(IClassFile classFile, int position, boolean resolveBindings) {
-		return runConversion(AST.LEVEL_2_0, classFile, position, resolveBindings);
+		return runConversion(AST.JLS2, classFile, position, resolveBindings);
 	}
 	
 	public ASTNode runConversion(char[] source, String unitName, IJavaProject project) {
-		return runConversion(AST.LEVEL_2_0, source, unitName, project);
+		return runConversion(AST.JLS2, source, unitName, project);
 	}
 	
 	public ASTNode runConversion(int astLevel, ICompilationUnit unit, boolean resolveBindings) {
@@ -175,7 +175,7 @@
 	}
 
 	public ASTNode runConversion(char[] source, String unitName, IJavaProject project, Map options) {
-		ASTParser parser = ASTParser.newParser(AST.LEVEL_2_0);
+		ASTParser parser = ASTParser.newParser(AST.JLS2);
 		parser.setSource(source);
 		parser.setUnitName(unitName);
 		parser.setProject(project);
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/SampleASTs.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/SampleASTs.java
index 8dff887..998cb0d 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/SampleASTs.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/SampleASTs.java
@@ -50,7 +50,7 @@
 		Initializer in = target.newInitializer();
 		td.bodyDeclarations().add(in);	
 
-		if (target.apiLevel() >= AST.LEVEL_3_0) {
+		if (target.apiLevel() >= AST.JLS3) {
 			EnumDeclaration ed = target.newEnumDeclaration();
 			td.bodyDeclarations().add(ed);	
 			EnumConstantDeclaration ec = target.newEnumConstantDeclaration();
@@ -70,7 +70,7 @@
 		ArrayType at = target.newArrayType(pt);
 		fd.setType(at);
 
-		if (target.apiLevel() >= AST.LEVEL_3_0) {
+		if (target.apiLevel() >= AST.JLS3) {
 			SimpleType st = target.newSimpleType(qn);
 			QualifiedType qt = target.newQualifiedType(st, target.newSimpleName("x")); //$NON-NLS-1$
 			WildcardType wt = target.newWildcardType();
@@ -103,7 +103,7 @@
 		b.statements().add(expressionStatement);
 		ForStatement forStatement = target.newForStatement();
 		b.statements().add(forStatement);
-		if (target.apiLevel() >= AST.LEVEL_3_0) {
+		if (target.apiLevel() >= AST.JLS3) {
 			EnhancedForStatement foreachStatement = target.newEnhancedForStatement();
 			b.statements().add(foreachStatement);
 		}
@@ -201,7 +201,7 @@
 		z.add(variableDeclarationExpression);
 		
 		// annotations
-		if (target.apiLevel() >= AST.LEVEL_3_0) {
+		if (target.apiLevel() >= AST.JLS3) {
 			AnnotationTypeDeclaration atd = target.newAnnotationTypeDeclaration();
 			cu.types().add(atd);
 			atd.bodyDeclarations().add(target.newAnnotationTypeMemberDeclaration());
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterRegressionTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterRegressionTests.java
index 4eca436..c7f7003 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterRegressionTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/formatter/FormatterRegressionTests.java
@@ -55,7 +55,7 @@
 			return new Suite(FormatterRegressionTests.class);
 		}
 		junit.framework.TestSuite suite = new Suite(FormatterRegressionTests.class.getName());
-		suite.addTest(new FormatterRegressionTests("test489"));  //$NON-NLS-1$
+		suite.addTest(new FormatterRegressionTests("test493"));  //$NON-NLS-1$
 		return suite;
 	}
 
@@ -121,7 +121,7 @@
 			//time = System.currentTimeMillis();
 			edit = codeFormatter.format(kind, result, 0, result.length(), indentationLevel, lineSeparator);//$NON-NLS-1$
 			if (edit == null) return null;
-//			assertEquals("Shoult not have edits", 0, edit.getChildren().length);
+//			assertEquals("Should not have edits", 0, edit.getChildren().length);
 			final String result2 = org.eclipse.jdt.internal.core.util.Util.editedString(result, edit);
 			if (!result.equals(result2)) {
 				assertSourceEquals("Different reformatting", Util.convertToIndependantLineDelimiter(result), Util.convertToIndependantLineDelimiter(result2));
@@ -6295,4 +6295,43 @@
 		DefaultCodeFormatter codeFormatter = new DefaultCodeFormatter(preferences);
 		runTest(codeFormatter, "test490", "A.java", CodeFormatter.K_COMPILATION_UNIT, true);//$NON-NLS-1$ //$NON-NLS-2$
 	}
+	
+	/**
+	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=59451
+	 */
+	public void _test491() {
+		String resourcePath = getResource("test491", "formatter.xml");
+		Map options = DecodeCodeFormatterPreferences.decodeCodeFormatterOptions(resourcePath, "DOI");
+		assertNotNull("No preferences", options);
+		DefaultCodeFormatterOptions preferences = new DefaultCodeFormatterOptions(options);
+		DefaultCodeFormatter codeFormatter = new DefaultCodeFormatter(preferences);
+		runTest(codeFormatter, "test491", "BundleChain.java", CodeFormatter.K_COMPILATION_UNIT);//$NON-NLS-1$ //$NON-NLS-2$
+	}
+	
+	/**
+	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=59575
+	 */
+	public void test492() {
+		String resourcePath = getResource("test492", "core_formatting.xml");
+		Map options = DecodeCodeFormatterPreferences.decodeCodeFormatterOptions(resourcePath, "core");
+		assertNotNull("No preferences", options);
+		options.put(JavaCore.COMPILER_PB_NON_NLS_STRING_LITERAL, JavaCore.ERROR);
+		DefaultCodeFormatterOptions preferences = new DefaultCodeFormatterOptions(options);
+		DefaultCodeFormatter codeFormatter = new DefaultCodeFormatter(preferences, options);
+		runTest(codeFormatter, "test492", "Main.java", CodeFormatter.K_COMPILATION_UNIT);//$NON-NLS-1$ //$NON-NLS-2$
+	}
+	
+	/**
+	 * https://bugs.eclipse.org/bugs/show_bug.cgi?id=59716
+	 */
+	public void test493() {
+		Map options = DefaultCodeFormatterConstants.getDefaultSettings();
+		options.put(DefaultCodeFormatterConstants.FORMATTER_BLANK_LINES_AFTER_PACKAGE, "1");
+		options.put(DefaultCodeFormatterConstants.FORMATTER_BLANK_LINES_BEFORE_PACKAGE, "1");
+		options.put(DefaultCodeFormatterConstants.FORMATTER_BLANK_LINES_AFTER_IMPORTS, "1");
+		options.put(DefaultCodeFormatterConstants.FORMATTER_BLANK_LINES_BEFORE_IMPORTS, "1");
+		DefaultCodeFormatterOptions preferences = new DefaultCodeFormatterOptions(options);
+		DefaultCodeFormatter codeFormatter = new DefaultCodeFormatter(preferences);
+		runTest(codeFormatter, "test493", "MyClass.java", CodeFormatter.K_COMPILATION_UNIT);//$NON-NLS-1$ //$NON-NLS-2$
+	}
 }
\ No newline at end of file
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AttachSourceTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AttachSourceTests.java
index 16d4bab..0f3a499 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AttachSourceTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/AttachSourceTests.java
@@ -40,7 +40,7 @@
 	return new Suite(AttachSourceTests.class);
 }
 public ASTNode runConversion(IClassFile classFile, boolean resolveBindings) {
-	ASTParser parser = ASTParser.newParser(AST.LEVEL_2_0);
+	ASTParser parser = ASTParser.newParser(AST.JLS2);
 	parser.setSource(classFile);
 	parser.setResolveBindings(resolveBindings);
 	parser.setWorkingCopyOwner(null);
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ClasspathInitializerTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ClasspathInitializerTests.java
index 94abfde..c5d6511 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ClasspathInitializerTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/ClasspathInitializerTests.java
@@ -15,6 +15,7 @@
 
 import org.eclipse.core.resources.IResourceChangeEvent;
 import org.eclipse.core.resources.ResourcesPlugin;
+import org.eclipse.core.runtime.*;
 import org.eclipse.core.runtime.CoreException;
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.Path;
@@ -403,6 +404,33 @@
 		this.deleteProject("P2");
 	}
 }
+/*
+ * Ensure that an OperationCanceledException goes through
+ * (regression test for bug 59363 Should surface cancellation exceptions)
+ */
+public void testContainerInitializer7() throws CoreException {
+	try {
+		boolean gotException = false;
+		try {
+			ContainerInitializer.setInitializer(new DefaultContainerInitializer(new String[] {"P1", "/P1/lib.jar"}) {
+				public void initialize(IPath containerPath, IJavaProject project) throws CoreException {
+					throw new OperationCanceledException("test");
+				}});
+			IJavaProject p1 = this.createJavaProject(
+					"P1", 
+					new String[] {}, 
+					new String[] {"org.eclipse.jdt.core.tests.model.TEST_CONTAINER"}, 
+					"");
+			p1.getResolvedClasspath(true);
+		} catch (OperationCanceledException e) {
+			gotException = true;
+		}
+		assertTrue("Should get an OperationCanceledException", gotException);
+	} finally {
+		stopDeltas();
+		this.deleteProject("P1");
+	}
+}
 public void testVariableInitializer1() throws CoreException {
 	try {
 		this.createProject("P1");
@@ -593,4 +621,29 @@
 		VariablesInitializer.reset();
 	}
 }
+/*
+ * Ensure that an OperationCanceledException goes through
+ * (regression test for bug 59363 Should surface cancellation exceptions)
+ */
+
+public void testVariableInitializer8() throws CoreException {
+	try {
+		boolean gotException = false;
+		try {
+			VariablesInitializer.setInitializer(new DefaultVariableInitializer(new String[] {"TEST_LIB", "/P1/lib.jar"}) {
+				public void initialize(String variable) throws JavaModelException {
+					throw new OperationCanceledException("test");
+				}
+			});
+			IJavaProject p1 = this.createJavaProject("P1", new String[] {}, new String[] {"TEST_LIB"}, "");
+			p1.getResolvedClasspath(true);
+		} catch (OperationCanceledException e) {
+			gotException = true;
+		}
+		assertTrue("Should get an OperationCanceledException", gotException);
+	} finally {
+		this.deleteProject("P1");
+		VariablesInitializer.reset();
+	}
+}
 }
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/WorkingCopyOwnerTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/WorkingCopyOwnerTests.java
index 305b74e..dccca45 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/WorkingCopyOwnerTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/WorkingCopyOwnerTests.java
@@ -932,7 +932,7 @@
 			);
 			workingCopy2.makeConsistent(null);
 			
-			ASTParser parser = ASTParser.newParser(AST.LEVEL_2_0);
+			ASTParser parser = ASTParser.newParser(AST.JLS2);
 			parser.setSource(workingCopy1);
 			parser.setResolveBindings(true);
 			parser.setWorkingCopyOwner(owner);
@@ -972,7 +972,7 @@
 			char[] source = (
 				"public class Z extends Y {\n" +
 				"}").toCharArray();
-			ASTParser parser = ASTParser.newParser(AST.LEVEL_2_0);
+			ASTParser parser = ASTParser.newParser(AST.JLS2);
 			parser.setSource(source);
 			parser.setUnitName("Z.java");
 			parser.setProject(getJavaProject("P"));
@@ -1040,7 +1040,7 @@
 
 			// parse and resolve class file
 			IClassFile classFile = getClassFile("P1/lib/X.class");
-			ASTParser parser = ASTParser.newParser(AST.LEVEL_2_0);
+			ASTParser parser = ASTParser.newParser(AST.JLS2);
 			parser.setSource(classFile);
 			parser.setResolveBindings(true);
 			parser.setWorkingCopyOwner(owner);
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingTest.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingTest.java
index 4084ba8..94af45a 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingTest.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ASTRewritingTest.java
@@ -98,7 +98,7 @@
 	}
 	
 	protected CompilationUnit createAST(ICompilationUnit cu) {
-		ASTParser parser= ASTParser.newParser(AST.LEVEL_2_0);
+		ASTParser parser= ASTParser.newParser(AST.JLS2);
 		parser.setSource(cu);
 		parser.setResolveBindings(false);
 		return (CompilationUnit) parser.createAST(null);
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/modifying/ASTRewritingModifyingTest.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/modifying/ASTRewritingModifyingTest.java
index 8f2a242..a5d9c93 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/modifying/ASTRewritingModifyingTest.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/modifying/ASTRewritingModifyingTest.java
@@ -81,7 +81,7 @@
 		boolean resolveBindings) {
 
 		try {
-			ASTParser c = ASTParser.newParser(AST.LEVEL_2_0);
+			ASTParser c = ASTParser.newParser(AST.JLS2);
 			c.setSource(unit);
 			c.setResolveBindings(resolveBindings);
 			ASTNode result = c.createAST(null);
@@ -96,7 +96,7 @@
 		if (source == null) {
 			throw new IllegalArgumentException();
 		}
-		ASTParser c = ASTParser.newParser(AST.LEVEL_2_0);
+		ASTParser c = ASTParser.newParser(AST.JLS2);
 		c.setSource(source);
 		ASTNode result = c.createAST(null);
 		return (CompilationUnit) result;
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 a7a2ad2..2322200 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
@@ -329,8 +329,6 @@
 			}
 		} catch (InvalidInputException e) {
 			this.err.println(e.getMessage());
-			this.err.println("------------------------"); //$NON-NLS-1$
-			printUsage();
 			if (this.systemExitWhenFinished) {
 				System.exit(-1);
 			}
@@ -1656,7 +1654,7 @@
 		}
 	}
 	public void printUsage() {
-		this.out.println(Main.bind("misc.usage"));  //$NON-NLS-1$
+		this.out.println(Main.bind("misc.usage", System.getProperty("path.separator"))); //$NON-NLS-1$//$NON-NLS-2$
 		this.out.flush();
 		this.err.flush();
 	}
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 9800fd3..77cb330 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.422_Cheetah04
+compiler.version = 0.424_Cheetah04
 compiler.copyright = Copyright IBM Corp 2000, 2004. All rights reserved.
 
 ### scanning
@@ -87,9 +87,9 @@
 \ Possible options are listed below. Options enabled by default are prefixed with ''+''\n\
 \ \n\
 \ Classpath options:\n\
-\    -cp -classpath <directories and zip/jar files separated by ;>\n\
+\    -cp -classpath <directories and zip/jar files separated by {0}>\n\
 \                       specify location for application classes and sources\n\
-\    -bootclasspath <directories and zip/jar files separated by ;>\n\
+\    -bootclasspath <directories and zip/jar files separated by {0}>\n\
 \                       specify location for system classes\n\
 \    -d <dir>           destination directory (if omitted, no directory is created)\n\
 \    -d none            generate no .class files\n\
diff --git a/org.eclipse.jdt.core/buildnotes_jdt-core.html b/org.eclipse.jdt.core/buildnotes_jdt-core.html
index f71fcd6..5eb7ae2 100644
--- a/org.eclipse.jdt.core/buildnotes_jdt-core.html
+++ b/org.eclipse.jdt.core/buildnotes_jdt-core.html
@@ -124,6 +124,64 @@
 [1.5] ArrayStoreException in 1.5 parser
 
 
+<a name="v_424"></a>
+<p><hr><h1>
+Eclipse Platform Build Notes&nbsp;<br>
+Java Development Tooling Core</h1>
+Eclipse SDK 3.0M9 Build - ? April 2004
+<br>Project org.eclipse.jdt.core v_424
+(<a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jdt.core/?only_with_tag=v_424">cvs</a>).
+<h2>
+What's new in this drop</h2>
+<ul>
+</ul>
+
+<h3>Problem Reports Fixed</h3>
+<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=58069">58069</a>
+Compilation ERROR: Missing code implementation in the compiler
+<br><a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=51911">51911</a>
+@see method w/out ()
+<br><a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=49025">49025</a>
+Util.bind(String, String[]) can be optimized a little bit
+<br><a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=59743">59743</a>
+[Compiler] Incorrect diagnosis of ambiguous method when inheriting
+<br><a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=57871">57871</a>
+Override Indicator: blocks editor from opening when error occurs in java compiler
+<br><a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=59421">59421</a>
+Bad error message from Eclipse Java Compiler when file is missing
+<br><a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=58946">58946</a>
+Standalone compiler help text is incorrect on Unix
+<br><a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=59084">59084</a>
+[content type] ensure content types/file associations are contributed by the right plugins
+<br><a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=59716">59716</a>
+Using 200404201300, one more blank line is inserted in front of import declarations when no package is defined
+<br><a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=59575">59575</a>
+invalid formatting
+<br><a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=51213">51213</a>
+Unable to resolve conflict between type and package name in binaries
+
+<a name="v_423"></a>
+<p><hr><h1>
+Eclipse Platform Build Notes&nbsp;<br>
+Java Development Tooling Core</h1>
+Eclipse SDK 3.0M9 Build - 22nd April 2004
+<br>Project org.eclipse.jdt.core v_423
+(<a href="http://dev.eclipse.org/viewcvs/index.cgi/org.eclipse.jdt.core/?only_with_tag=v_423">cvs</a>).
+<h2>
+What's new in this drop</h2>
+<ul>
+</ul>
+
+<h3>Problem Reports Fixed</h3>
+<a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=59363">59363</a>
+Should surface cancellation exceptions 
+<br><a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=51075">51075</a>
+Compiler warning "is hiding a field" given for static inner class
+<br><a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=38658">38658</a>
+Search for existing type fails
+<br><a href="http://bugs.eclipse.org/bugs/show_bug.cgi?id=59291">59291</a>
+Deadlock between AllTypes cache and setClasspathContainer
+
 <a name="v_422"></a>
 <p><hr><h1>
 Eclipse Platform Build Notes&nbsp;<br>
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java
index 6151ae9..d23d739 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/core/compiler/IProblem.java
@@ -810,7 +810,15 @@
 	/** @since 3.0 */
 	int JavadocInternalTypeNameProvided = Javadoc + Internal + 507;
 	/** @since 3.0 */
-	int JavadocMessagePrefix = Internal + 509;
+	int JavadocInheritedMethodHidesEnclosingName = Javadoc + Internal + 508;
+	/** @since 3.0 */
+	int JavadocInheritedFieldHidesEnclosingName = Javadoc + Internal + 509;
+	/** @since 3.0 */
+	int JavadocInheritedNameHidesEnclosingTypeName = Javadoc + Internal + 510;
+	/** @since 3.0 */
+	int JavadocAmbiguousMethodReference = Javadoc + Internal + 511;
+	/** @since 3.0 */
+	int JavadocMessagePrefix = Internal + 512;
 
 	/**
 	 * Generics
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/FieldDeclaration.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/FieldDeclaration.java
index d2c35a2..670de04 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/FieldDeclaration.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/FieldDeclaration.java
@@ -127,7 +127,7 @@
 			return this.binding.isStatic();
 		return (this.modifiers & AccStatic) != 0;
 	}
-
+	
 	public void resolve(MethodScope initializationScope) {
 
 		// the two <constant = Constant.NotAConstant> could be regrouped into
@@ -140,21 +140,28 @@
 			this.hasBeenResolved = true;
 
 			// check if field is hiding some variable - issue is that field binding already got inserted in scope
+			// thus must lookup separately in super type and outer context
 			ClassScope classScope = initializationScope.enclosingClassScope();
+			
 			if (classScope != null) {
 				SourceTypeBinding declaringType = classScope.enclosingSourceType();
 				boolean checkLocal = true;
 				if (declaringType.superclass != null) {
-					Binding existingVariable = classScope.findField(declaringType.superclass, this.name, this, true /*resolve*/);
-					if (existingVariable != null && existingVariable.isValidBinding()) {
+					Binding existingVariable = classScope.findField(declaringType.superclass, this.name, this,  false /*do not resolve hidden field*/);
+					if (existingVariable != null && existingVariable.isValidBinding()){
 						initializationScope.problemReporter().fieldHiding(this, existingVariable);
 						checkLocal = false; // already found a matching field
 					}
 				}
 				if (checkLocal) {
 					Scope outerScope = classScope.parent;
+					// only corner case is: lookup of outer field through static declaringType, which isn't detected by #getBinding as lookup starts
+					// from outer scope. Subsequent static contexts are detected for free.
 					Binding existingVariable = outerScope.getBinding(this.name, BindingIds.VARIABLE, this, false /*do not resolve hidden field*/);
-					if (existingVariable != null && existingVariable.isValidBinding()){
+					if (existingVariable != null && existingVariable.isValidBinding()
+							&& (!(existingVariable instanceof FieldBinding)
+									|| ((FieldBinding) existingVariable).isStatic() 
+									|| !declaringType.isStatic())) {
 						initializationScope.problemReporter().fieldHiding(this, existingVariable);
 					}
 				}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Javadoc.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Javadoc.java
index b3bfdd2..0da3e33 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Javadoc.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Javadoc.java
@@ -100,7 +100,24 @@
 		// @see tags
 		int seeTagsLength = this.references == null ? 0 : this.references.length;
 		for (int i = 0; i < seeTagsLength; i++) {
+			
+			// Resolve reference
 			this.references[i].resolveType(classScope);
+
+			// Some unbound field reference might be changed to message send
+			// see bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=51911
+			if (this.references[i] instanceof JavadocFieldReference) {
+				JavadocFieldReference fieldRef = (JavadocFieldReference) this.references[i];
+				if (fieldRef.receiverType != null && fieldRef.binding == null) { // binding was reset in case of valid method reference
+					JavadocMessageSend msgSend = new JavadocMessageSend(fieldRef.token, fieldRef.nameSourcePosition);
+					msgSend.receiver = fieldRef.receiver;
+					msgSend.receiverType = fieldRef.receiverType;
+					msgSend.qualifyingType = fieldRef.receiverType;
+					msgSend.superAccess = classScope.enclosingSourceType().isCompatibleWith(msgSend.receiverType);
+					msgSend.binding = classScope.findMethod((ReferenceBinding)msgSend.receiverType, msgSend.selector, new TypeBinding[0], msgSend);
+					this.references[i] = msgSend;
+				}
+			}
 		}
 	}
 	
@@ -117,9 +134,27 @@
 		int seeTagsLength = this.references == null ? 0 : this.references.length;
 		boolean superRef = false;
 		for (int i = 0; i < seeTagsLength; i++) {
+			
+			// Resolve reference
 			this.references[i].resolveType(methScope);
+			
+			// Some unbound field reference might be changed to message send
+			// see bug https://bugs.eclipse.org/bugs/show_bug.cgi?id=51911
+			if (this.references[i] instanceof JavadocFieldReference) {
+				JavadocFieldReference fieldRef = (JavadocFieldReference) this.references[i];
+				if (fieldRef.receiverType != null && fieldRef.binding == null) { // binding was reset in case of valid method reference
+					JavadocMessageSend msgSend = new JavadocMessageSend(fieldRef.token, fieldRef.nameSourcePosition);
+					msgSend.receiver = fieldRef.receiver;
+					msgSend.receiverType = fieldRef.receiverType;
+					msgSend.qualifyingType = fieldRef.receiverType;
+					msgSend.superAccess = methScope.enclosingSourceType().isCompatibleWith(msgSend.receiverType);
+					msgSend.binding = methScope.findMethod((ReferenceBinding)msgSend.receiverType, msgSend.selector, new TypeBinding[0], msgSend);
+					this.references[i] = msgSend;
+				}
+			}
+
+			// see whether we can have a super reference
 			try {
-				// see whether we can have a super reference
 				if (methDecl != null && (methDecl.isConstructor() || overriding) && !superRef) {
 					if (this.references[i] instanceof JavadocMessageSend) {
 						JavadocMessageSend messageSend = (JavadocMessageSend) this.references[i];
@@ -154,7 +189,7 @@
 				}
 			}
 			catch (Exception e) {
-				// Something wrong happen, forgot super ref...
+				// Something wrong happen, forget super ref...
 			}
 		}
 		
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/JavadocFieldReference.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/JavadocFieldReference.java
index f698c5e..db8d3ad 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/JavadocFieldReference.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/JavadocFieldReference.java
@@ -41,8 +41,25 @@
 
 		this.binding = scope.getField(this.receiverType, this.token, this);
 		if (!this.binding.isValidBinding()) {
-			scope.problemReporter().javadocInvalidField(this, this.receiverType, scope.getDeclarationModifiers());
-			return null;
+			if (this.receiverType instanceof ReferenceBinding) {
+				ReferenceBinding refBinding = (ReferenceBinding) this.receiverType;
+				MethodBinding[] bindings = refBinding.getMethods(this.token);
+				if (bindings == null) {
+					scope.problemReporter().javadocInvalidField(this, this.receiverType, scope.getDeclarationModifiers());
+					return null;
+				} 
+				switch (bindings.length) {
+					case 0:
+						scope.problemReporter().javadocInvalidField(this, this.receiverType, scope.getDeclarationModifiers());
+						return null;
+					case 1:
+						this.binding = null;
+						return null;
+					default:
+						scope.problemReporter().javadocAmbiguousMethodReference(this, scope.getDeclarationModifiers());
+						return null;
+				}
+			}
 		}
 
 		if (isFieldUseDeprecated(this.binding, scope, (this.bits & IsStrictlyAssignedMASK) != 0)) {
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/DefaultProblemFactory.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/DefaultProblemFactory.java
index b75da6f..065c525 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/DefaultProblemFactory.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/DefaultProblemFactory.java
@@ -60,7 +60,8 @@
  * </ul>
  * @param originatingFileName char[]
  * @param problemId int
- * @param arguments String[]
+ * @param problemArguments String[]
+ * @param messageArguments String[]
  * @param severity int
  * @param startPosition int
  * @param endPosition int
@@ -95,14 +96,10 @@
  * @return java.util.Locale
  */
 public Locale getLocale() {
-	return locale;
+	return this.locale;
 }
 public final String getLocalizedMessage(int id, String[] problemArguments) {
-	StringBuffer output = new StringBuffer(80);
-	if ((id & IProblem.Javadoc) != 0) {
-		output.append((String)messageTemplates.get(keyFromID(IProblem.JavadocMessagePrefix & IProblem.IgnoreCategoriesMask)));
-	}
-	String message = (String)messageTemplates.get(keyFromID(id & IProblem.IgnoreCategoriesMask)); 
+	String message = (String) this.messageTemplates.get(keyFromID(id & IProblem.IgnoreCategoriesMask)); 
 	if (message == null) {
 		return "Unable to retrieve the error message for problem id: " //$NON-NLS-1$
 			+ (id & IProblem.IgnoreCategoriesMask)
@@ -112,19 +109,29 @@
 	// for compatibility with MessageFormat which eliminates double quotes in original message
 	char[] messageWithNoDoubleQuotes =
 		CharOperation.replace(message.toCharArray(), DOUBLE_QUOTES, SINGLE_QUOTE);
-	message = new String(messageWithNoDoubleQuotes);
 
-	int length = message.length();
-	int start = -1, end = length;
+	if (problemArguments == null) return new String(messageWithNoDoubleQuotes);
+
+	int length = messageWithNoDoubleQuotes.length;
+	int start = 0;
+	int end = length;
+	StringBuffer output = null;
+	if ((id & IProblem.Javadoc) != 0) {
+		if (output == null) output = new StringBuffer(10+length+problemArguments.length*20);
+		output.append((String) this.messageTemplates.get(keyFromID(IProblem.JavadocMessagePrefix & IProblem.IgnoreCategoriesMask)));
+	}
 	while (true) {
-		if ((end = message.indexOf('{', start)) > -1) {
-			output.append(message.substring(start + 1, end));
-			if ((start = message.indexOf('}', end)) > -1) {
+		if ((end = CharOperation.indexOf('{', messageWithNoDoubleQuotes, start)) > -1) {
+			if (output == null) output = new StringBuffer(length+problemArguments.length*20);
+			output.append(messageWithNoDoubleQuotes, start, end - start);
+			if ((start = CharOperation.indexOf('}', messageWithNoDoubleQuotes, end + 1)) > -1) {
+				int index = -1;
+				String argId = new String(messageWithNoDoubleQuotes, end + 1, start - end - 1);
 				try {
-					output.append(
-						problemArguments[Integer.parseInt(message.substring(end + 1, start))]); 
+					index = Integer.parseInt(argId);
+					output.append(problemArguments[index]);
 				} catch (NumberFormatException nfe) {
-					output.append(message.substring(end + 1, start + 1));
+					output.append(messageWithNoDoubleQuotes, end + 1, start - end);
 				} catch (ArrayIndexOutOfBoundsException e) {
 					return "Cannot bind message for problem (id: " //$NON-NLS-1$
 						+ (id & IProblem.IgnoreCategoriesMask)
@@ -134,15 +141,18 @@
 						+ Util.toString(problemArguments)
 						+"}"; //$NON-NLS-1$
 				}
+				start++;
 			} else {
-				output.append(message.substring(end, length));
+				output.append(messageWithNoDoubleQuotes, end, length);
 				break;
 			}
 		} else {
-			output.append(message.substring(start + 1, length));
+			if (output == null) return new String(messageWithNoDoubleQuotes);
+			output.append(messageWithNoDoubleQuotes, start, length - start);
 			break;
 		}
 	}
+
 	return output.toString();
 }
 /**
@@ -156,6 +166,8 @@
 /**
  * This method initializes the MessageTemplates class variable according
  * to the current Locale.
+ * @param loc Locale
+ * @return HashtableOfInt
  */
 public static HashtableOfInt loadMessageTemplates(Locale loc) {
 	ResourceBundle bundle = null;
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 4dbbea8..fc5170a 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
@@ -565,6 +565,7 @@
 		case IProblem.JavadocUndefinedMethod:
 		case IProblem.JavadocNotVisibleMethod:
 		case IProblem.JavadocAmbiguousMethod:
+		case IProblem.JavadocAmbiguousMethodReference:
 		case IProblem.JavadocParameterMismatch:
 		case IProblem.JavadocUndefinedType:
 		case IProblem.JavadocNotVisibleType:
@@ -572,6 +573,9 @@
 		case IProblem.JavadocInternalTypeNameProvided:
 		case IProblem.JavadocNoMessageSendOnArrayType:
 		case IProblem.JavadocNoMessageSendOnBaseType:
+		case IProblem.JavadocInheritedMethodHidesEnclosingName:
+		case IProblem.JavadocInheritedFieldHidesEnclosingName:
+		case IProblem.JavadocInheritedNameHidesEnclosingTypeName:
 			if (this.options.docCommentSupport && this.options.reportInvalidJavadocTags) {
 				return this.options.getSeverity(CompilerOptions.InvalidJavadoc);
 			} else {
@@ -2273,6 +2277,20 @@
 		statement.sourceStart,
 		statement.sourceEnd);
 }
+public void javadocAmbiguousMethodReference(FieldReference fieldRef, int modifiers) {
+	int id = IProblem.JavadocAmbiguousMethodReference;
+	if (javadocVisibility(this.options.reportInvalidJavadocTagsVisibility, modifiers)) {
+		String[] arguments = new String[] {new String(fieldRef.binding.readableName())};
+		handle(id, arguments, arguments, fieldRef.sourceStart, fieldRef.sourceEnd);
+	}
+}
+/*
+ * Similar implementation than invalidField(FieldReference...)
+ * Note that following problem id cannot occur for Javadoc:
+ * 	- NonStaticReferenceInStaticContext :
+ * 	- NonStaticReferenceInConstructorInvocation :
+ * 	- ReceiverTypeNotVisible :
+ */
 public void javadocInvalidField(FieldReference fieldRef, TypeBinding searchedType, int modifiers) {
 	int id = IProblem.JavadocUndefinedField;
 	FieldBinding field = fieldRef.binding;
@@ -2286,6 +2304,9 @@
 		case Ambiguous :
 			id = IProblem.JavadocAmbiguousField;
 			break;
+		case InheritedNameHidesEnclosingName :
+			id = IProblem.JavadocInheritedFieldHidesEnclosingName;
+			break;
 		case NoError : // 0
 		default :
 			needImplementation(); // want to fail to see why we were here...
@@ -2297,6 +2318,13 @@
 		handle(id, arguments, arguments, fieldRef.sourceStart, fieldRef.sourceEnd);
 	}
 }
+/*
+ * Similar implementation than invalidMethod(MessageSend...)
+ * Note that following problem id cannot occur for Javadoc:
+ * 	- NonStaticReferenceInStaticContext :
+ * 	- NonStaticReferenceInConstructorInvocation :
+ * 	- ReceiverTypeNotVisible :
+ */
 public void javadocInvalidMethod(MessageSend messageSend, MethodBinding method, int modifiers) {
 	if (!javadocVisibility(this.options.reportInvalidJavadocTagsVisibility, modifiers)) {
 		return;
@@ -2312,6 +2340,9 @@
 		case Ambiguous :
 			id = IProblem.JavadocAmbiguousMethod;
 			break;
+		case InheritedNameHidesEnclosingName :
+			id = IProblem.JavadocInheritedMethodHidesEnclosingName;
+			break;
 		case NoError : // 0
 		default :
 			needImplementation(); // want to fail to see why we were here...
@@ -2403,6 +2434,9 @@
 			case InternalNameProvided :
 				id = IProblem.JavadocInternalTypeNameProvided;
 				break;
+			case InheritedNameHidesEnclosingName :
+				id = IProblem.JavadocInheritedNameHidesEnclosingTypeName;
+				break;
 			case NoError : // 0
 			default :
 				needImplementation(); // want to fail to see why we were here...
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties
index dbd327d..a2996eb 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/problem/messages.properties
@@ -378,7 +378,11 @@
 505 = The type {0} is ambiguous
 506 = The type {0} is deprecated
 507 = The nested type {0} cannot be referenced using its binary name
-509 = Javadoc: 
+508 = The method {1} is defined in an inherited type and an enclosing scope
+509 = The field {0} is defined in an inherited type and an enclosing scope 
+510 = The type {0} is defined in an inherited type and an enclosing scope
+511 = {0} is an ambiguous method reference or is not a field
+512 = Javadoc: 
 
 ### GENERICS
 520 = Duplicate type parameter {0}
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/util/Util.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/util/Util.java
index d8939ed..eef5cbd 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/util/Util.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/util/Util.java
@@ -77,23 +77,24 @@
 		// for compatibility with MessageFormat which eliminates double quotes in original message
 		char[] messageWithNoDoubleQuotes =
 			CharOperation.replace(message.toCharArray(), DOUBLE_QUOTES, SINGLE_QUOTE);
-		message = new String(messageWithNoDoubleQuotes);
-
-		int length = message.length();
-		int start = -1;
+	
+		if (bindings == null) return new String(messageWithNoDoubleQuotes);
+	
+		int length = messageWithNoDoubleQuotes.length;
+		int start = 0;
 		int end = length;
 		StringBuffer output = null;
 		while (true) {
-			if ((end = message.indexOf('{', start)) > -1) {
-				if (output == null) output = new StringBuffer(80);
-				output.append(message.substring(start + 1, end));
-				if ((start = message.indexOf('}', end)) > -1) {
+			if ((end = CharOperation.indexOf('{', messageWithNoDoubleQuotes, start)) > -1) {
+				if (output == null) output = new StringBuffer(length+bindings.length*20);
+				output.append(messageWithNoDoubleQuotes, start, end - start);
+				if ((start = CharOperation.indexOf('}', messageWithNoDoubleQuotes, end + 1)) > -1) {
 					int index = -1;
+					String argId = new String(messageWithNoDoubleQuotes, end + 1, start - end - 1);
 					try {
-						index = Integer.parseInt(message.substring(end + 1, start));
+						index = Integer.parseInt(argId);
 						output.append(bindings[index]);
 					} catch (NumberFormatException nfe) { // could be nested message ID {compiler.name}
-						String argId = message.substring(end + 1, start);
 						boolean done = false;
 						if (!id.equals(argId)) {
 							String argMessage = null;
@@ -102,20 +103,21 @@
 								output.append(argMessage);
 								done = true;
 							} catch (MissingResourceException e) {
-								// ignore
+								// unable to bind argument, ignore (will leave argument in)
 							}
 						}
-						if (!done) output.append(message.substring(end + 1, start + 1));
+						if (!done) output.append(messageWithNoDoubleQuotes, end + 1, start - end);
 					} catch (ArrayIndexOutOfBoundsException e) {
 						output.append("{missing " + Integer.toString(index) + "}"); //$NON-NLS-2$ //$NON-NLS-1$
 					}
+					start++;
 				} else {
-					output.append(message.substring(end, length));
+					output.append(messageWithNoDoubleQuotes, end, length);
 					break;
 				}
 			} else {
-				if (output == null) return message;
-				output.append(message.substring(start + 1, length));
+				if (output == null) return new String(messageWithNoDoubleQuotes);
+				output.append(messageWithNoDoubleQuotes, start, length - start);
 				break;
 			}
 		}
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 abd5dac..925b8dd 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
@@ -56,7 +56,7 @@
  * with minimal loss of original formatting. Here is an example:
  * <pre>
  * Document doc = new Document("import java.util.List;\nclass X {}\n");
- * ASTParser parser = ASTParser.newParser(AST.LEVEL_3_0);
+ * ASTParser parser = ASTParser.newParser(AST.JLS3);
  * parser.setSource(doc.get().toCharArray());
  * CompilationUnit cu = (CompilationUnit) parser.createAST(null);
  * cu.recordModifications();
@@ -82,33 +82,53 @@
  */
 public final class AST {
 	/**
-	 * Constant for indicating the AST 2.0 API (handles
-	 * JLS2). The 2.0 API is capable of handling all constructs
+	 * Constant for indicating the AST API that handles JLS2.
+	 * This API is capable of handling all constructs
 	 * in the Java language as described in the Java Language
      * Specification, Second Edition (JLS2).
      * JLS2 is a superset of all earlier versions of the
-     * Java language, and the 2.0 API can be used to manipulate
+     * Java language, and the JLS2 API can be used to manipulate
      * programs written in all versions of the Java language
      * up to and including J2SE 1.4.
      *
 	 * @since 3.0
 	 */
 	// TODO (jeem) deprecated Clients should use the level 3 API.
-	public static final int LEVEL_2_0 = 2;
+	public static final int JLS2 = 2;
 	
 	/**
-	 * Constant for indicating the AST 3.0 API (handles JLS3).
-	 * The 3.0 API is capable of handling all constructs in the
+	 * Constant for indicating the AST API that handles JLS3.
+	 * This API is capable of handling all constructs in the
 	 * Java language as described in the Java Language
 	 * Specification, Third Edition (JLS3).
      * JLS3 is a superset of all earlier versions of the
-     * Java language, and the 3.0 API can be used to manipulate
+     * Java language, and the JLS3 API can be used to manipulate
      * programs written in all versions of the Java language
      * up to and including J2SE 1.5.
+     * <p>
+     * <b>NOTE:</b>In Eclipse 3.0, there is no underlying parser support for
+     * JLS3 ASTs. This support is planned for the follow-on release of
+     * Eclipse which includes support for J2SE 1.5. Without a parser to create
+     * JLS3 ASTs, they are not much use. Use JLS2 ASTs instead.
+     * </p>
      *
 	 * @since 3.0
 	 */
-	public static final int LEVEL_3_0 = 3;
+	public static final int JLS3 = 3;
+	
+	/**
+	 * @since 3.0
+	 * @deprecated Renamed {@link #JLS2}.
+	 * // TODO (jeem) - remove after I20040427
+	 */
+	public static final int LEVEL_2_0 = JLS2;
+	
+	/**
+	 * @since 3.0
+	 * @deprecated Renamed {@link #JLS3}.
+	 * // TODO (jeem) - remove after I20040427
+	 */
+	public static final int LEVEL_3_0 = JLS3;
 	
 	/**
 	 * The binding resolver for this AST. Initially a binding resolver that
@@ -186,8 +206,8 @@
      * @since 3.0
 	 */
 	private AST(int level) {
-		if ((level != AST.LEVEL_2_0)
-			&& (level != AST.LEVEL_3_0)) {
+		if ((level != AST.JLS2)
+			&& (level != AST.JLS3)) {
 			throw new IllegalArgumentException();
 		}
 		this.apiLevel = level;
@@ -268,7 +288,7 @@
 	 */
 	// TODO (jeem) deprecated Clients should port their code to use the new 3.0 API and call {@link #newAST(int)} instead of using this constructor.
 	public AST(Map options) {
-		this(LEVEL_2_0);
+		this(JLS2);
 		// override scanner if 1.4 asked for
 		if (JavaCore.VERSION_1_4.equals(options.get(JavaCore.COMPILER_SOURCE))) {
 			this.scanner = new Scanner(
@@ -294,8 +314,8 @@
      * @since 3.0
 	 */
 	public static AST newAST(int level) {
-		if ((level != AST.LEVEL_2_0)
-			&& (level != AST.LEVEL_3_0)) {
+		if ((level != AST.JLS2)
+			&& (level != AST.JLS3)) {
 			throw new IllegalArgumentException();
 		}
 		return new AST(level);
@@ -333,7 +353,7 @@
 	/**
 	 * Return the API level supported by this AST.
 	 * 
-	 * @return level the API level; one of the <code>LEVEL_*</code>LEVEL
+	 * @return level the API level; one of the <code>JLS*</code>LEVEL
      * declared on <code>AST</code>; assume this set is open-ended
      * @since 3.0
 	 */
@@ -746,7 +766,7 @@
 		boolean resolveBindings) {
 
 		try {
-			ASTParser c = ASTParser.newParser(AST.LEVEL_2_0);
+			ASTParser c = ASTParser.newParser(AST.JLS2);
 			c.setSource(unit);
 			c.setResolveBindings(resolveBindings);
 			ASTNode result = c.createAST(null);
@@ -824,7 +844,7 @@
 			throw new IllegalArgumentException();
 		}
 		try {
-			ASTParser c = ASTParser.newParser(AST.LEVEL_2_0);
+			ASTParser c = ASTParser.newParser(AST.JLS2);
 			c.setSource(classFile);
 			c.setResolveBindings(resolveBindings);
 			ASTNode result = c.createAST(null);
@@ -908,7 +928,7 @@
 		if (source == null) {
 			throw new IllegalArgumentException();
 		}
-		ASTParser c = ASTParser.newParser(AST.LEVEL_2_0);
+		ASTParser c = ASTParser.newParser(AST.JLS2);
 		c.setSource(source);
 		c.setUnitName(unitName);
 		c.setProject(project);
@@ -955,7 +975,7 @@
 		if (source == null) {
 			throw new IllegalArgumentException();
 		}
-		ASTParser c = ASTParser.newParser(AST.LEVEL_2_0);
+		ASTParser c = ASTParser.newParser(AST.JLS2);
 		c.setSource(source);
 		ASTNode result = c.createAST(null);
 		return (CompilationUnit) result;
@@ -1085,7 +1105,7 @@
 	 * @since 3.0
      */
 	void unsupportedIn2() {
-	  if (this.apiLevel == AST.LEVEL_2_0) {
+	  if (this.apiLevel == AST.JLS2) {
 	  	throw new UnsupportedOperationException("Operation not supported in 2.0 AST"); //$NON-NLS-1$
 	  }
 	}
@@ -1098,7 +1118,7 @@
 	 * @since 3.0
      */
 	void supportedOnlyIn2() {
-	  if (this.apiLevel != AST.LEVEL_2_0) {
+	  if (this.apiLevel != AST.JLS2) {
 	  	throw new UnsupportedOperationException("Operation not supported in 2.0 AST"); //$NON-NLS-1$
 	  }
 	}
@@ -1327,12 +1347,6 @@
 	/**
 	 * Creates and returns a new unparented parameterized type node with the
 	 * given type and an empty list of type arguments.
-	 * <p>
-	 * Note: Support for generic types is an experimental language feature 
-	 * under discussion in JSR-014 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @param type the type that is parameterized
 	 * @return a new unparented parameterized type node
@@ -1354,12 +1368,6 @@
 	/**
 	 * Creates and returns a new unparented qualified type node with 
 	 * the given qualifier type and name.
-	 * <p>
-	 * Note: Support for generic types is an experimental language feature 
-	 * under discussion in JSR-014 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @param qualifier the qualifier type node
 	 * @param name the simple name being qualified
@@ -1383,12 +1391,6 @@
 	/**
 	 * Creates and returns a new unparented wildcard type node with no 
 	 * type bound.
-	 * <p>
-	 * Note: Support for generic types is an experimental language feature 
-	 * under discussion in JSR-014 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @return a new unparented wildcard type node
 	 * @exception IllegalArgumentException if:
@@ -1540,12 +1542,6 @@
 	 * The name of the constant is an unspecified, but legal, name; 
 	 * no doc comment; no modifiers or annotations; no arguments; 
 	 * and an empty class body.
-	 * <p>
-	 * Note: Support for enumerations is an experimental language feature 
-	 * under discussion in JSR-201 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @return a new unparented enum constant declaration node
 	 * @exception UnsupportedOperationException if this operation is used in
@@ -1562,12 +1558,6 @@
 	 * The name of the enum is an unspecified, but legal, name; 
 	 * no doc comment; no modifiers or annotations; 
 	 * no superinterfaces; and no body declarations.
-	 * <p>
-	 * Note: Support for enumerations is an experimental language feature 
-	 * under discussion in JSR-201 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @return a new unparented enum declaration node
 	 * @exception UnsupportedOperationException if this operation is used in
@@ -1582,12 +1572,6 @@
 	/**
 	 * Creates and returns a new unparented type parameter type node with an
 	 * unspecified type variable name and an empty list of type bounds.
-	 * <p>
-	 * Note: Support for generic types is an experimental language feature 
-	 * under discussion in JSR-014 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @return a new unparented type parameter node
 	 * @exception UnsupportedOperationException if this operation is used in
@@ -1603,12 +1587,6 @@
 	 * Creates and returns a new unparented annotation type declaration
 	 * node for an unspecified, but legal, name; no modifiers; no javadoc; 
 	 * and an empty list of member declarations.
-	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @return a new unparented annotation type declaration node
 	 * @exception UnsupportedOperationException if this operation is used in
@@ -1625,12 +1603,6 @@
 	 * member declaration node for an unspecified, but legal, 
 	 * member name and type; no modifiers; no javadoc; 
 	 * and no default value.
-	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @return a new unparented annotation type member declaration node
 	 * @exception UnsupportedOperationException if this operation is used in
@@ -1645,12 +1617,6 @@
 	/**
 	 * Creates and returns a new unparented modifier node for the given
 	 * modifier.
-	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @param keyword one of the modifier keyword constants
 	 * @return a new unparented modifier node
@@ -1880,10 +1846,10 @@
 	public TypeDeclarationStatement 
 			newTypeDeclarationStatement(AbstractTypeDeclaration decl) {
 		TypeDeclarationStatement result = new TypeDeclarationStatement(this);
-		if (this.apiLevel == AST.LEVEL_2_0) {
+		if (this.apiLevel == AST.JLS2) {
 			result.setTypeDeclaration((TypeDeclaration) decl);
 		}
-		if (this.apiLevel >= AST.LEVEL_3_0) {
+		if (this.apiLevel >= AST.JLS3) {
 			result.setDeclaration(decl);
 		}
 		return result;
@@ -2097,12 +2063,6 @@
 	 * Creates a new unparented enhanced for statement node owned by this AST.
 	 * By default, the paramter and expression are unspecified
 	 * but legal subtrees, and the body is an empty block.
-	 * <p>
-	 * Note: Enhanced for statements are an experimental language feature 
-	 * under discussion in JSR-201 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @return a new unparented throw statement node
 	 * @exception UnsupportedOperationException if this operation is used in
@@ -2559,12 +2519,6 @@
 	 * Creates and returns a new unparented normal annotation node with
 	 * an unspecified type name and an empty list of member value
 	 * pairs.
-	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @return a new unparented normal annotation node
 	 * @exception UnsupportedOperationException if this operation is used in
@@ -2579,12 +2533,6 @@
 	/**
 	 * Creates and returns a new unparented marker annotation node with
 	 * an unspecified type name.
-	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @return a new unparented marker annotation node
 	 * @exception UnsupportedOperationException if this operation is used in
@@ -2599,12 +2547,6 @@
 	/**
 	 * Creates and returns a new unparented single member annotation node with
 	 * an unspecified type name and value.
-	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @return a new unparented single member annotation node
 	 * @exception UnsupportedOperationException if this operation is used in
@@ -2619,12 +2561,6 @@
 	/**
 	 * Creates and returns a new unparented member value pair node with
 	 * an unspecified member name and value.
-	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @return a new unparented member value pair node
 	 * @exception UnsupportedOperationException if this operation is used in
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 7aaf3a1..3caaf0c 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
@@ -26,6 +26,8 @@
 import org.eclipse.jdt.internal.compiler.ast.Argument;
 import org.eclipse.jdt.internal.compiler.ast.EnumConstant;
 import org.eclipse.jdt.internal.compiler.ast.JavadocArgumentExpression;
+import org.eclipse.jdt.internal.compiler.ast.JavadocFieldReference;
+import org.eclipse.jdt.internal.compiler.ast.JavadocMessageSend;
 import org.eclipse.jdt.internal.compiler.ast.LocalDeclaration;
 import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 import org.eclipse.jdt.internal.compiler.env.IConstants;
@@ -1393,12 +1395,10 @@
 							recordNodes(javadoc, (TagElement) tags.next());
 						}
 					}
-//					return docComment;
 					bodyDeclaration.setJavadoc(docComment);
 				}
 			}
 		}
-//		return null;
 	}
 	
 	public LabeledStatement convert(org.eclipse.jdt.internal.compiler.ast.LabeledStatement statement) {
@@ -2579,21 +2579,43 @@
 	
 	protected void recordNodes(org.eclipse.jdt.internal.compiler.ast.Javadoc javadoc, TagElement tagElement) {
 		Iterator fragments = tagElement.fragments().listIterator();
+		int size = tagElement.fragments().size();
+		int[] replaceIndex = new int[size];
+		int idx = 0;
 		while (fragments.hasNext()) {
 			ASTNode node = (ASTNode) fragments.next();
+			replaceIndex[idx] = 0;
 			if (node.getNodeType() == ASTNode.MEMBER_REF) {
 				MemberRef memberRef = (MemberRef) node;
 				Name name = memberRef.getName();
 				// get compiler node and record nodes
 				int start = name.getStartPosition();
-				org.eclipse.jdt.internal.compiler.ast.JavadocFieldReference fieldRef = (org.eclipse.jdt.internal.compiler.ast.JavadocFieldReference) javadoc.getNodeStartingAt(start);
-				if (fieldRef != null) {
-					recordNodes(name, fieldRef);
-					recordNodes(node, fieldRef);
+				org.eclipse.jdt.internal.compiler.ast.ASTNode compilerNode = javadoc.getNodeStartingAt(start);
+				if (compilerNode instanceof JavadocMessageSend) {
+					replaceIndex[idx] = 1;
+				}
+				if (compilerNode!= null) {
+					recordNodes(name, compilerNode);
+					recordNodes(node, compilerNode);
 				}
 				// Replace qualifier to have all nodes recorded
 				if (memberRef.getQualifier() != null) {
-					recordName(memberRef.getQualifier(), fieldRef.receiver);
+					org.eclipse.jdt.internal.compiler.ast.TypeReference typeRef = null;
+					if (compilerNode instanceof JavadocFieldReference) {
+						org.eclipse.jdt.internal.compiler.ast.Expression expression = ((JavadocFieldReference)compilerNode).receiver;
+						if (expression instanceof org.eclipse.jdt.internal.compiler.ast.TypeReference) {
+							typeRef = (org.eclipse.jdt.internal.compiler.ast.TypeReference) expression;
+						}
+					} 
+					else if (compilerNode instanceof JavadocMessageSend) {
+						org.eclipse.jdt.internal.compiler.ast.Expression expression = ((JavadocMessageSend)compilerNode).receiver;
+						if (expression instanceof org.eclipse.jdt.internal.compiler.ast.TypeReference) {
+							typeRef = (org.eclipse.jdt.internal.compiler.ast.TypeReference) expression;
+						}
+					}
+					if (typeRef != null) {
+						recordName(memberRef.getQualifier(), typeRef);
+					}
 				}
 			} else if (node.getNodeType() == ASTNode.METHOD_REF) {
 				MethodRef methodRef = (MethodRef) node;
@@ -2654,6 +2676,18 @@
 				recordNodes(javadoc, (TagElement) node);
 			}
 		}
+		for (int i=0; i<size; i++) {
+			if (replaceIndex[i] == 1) {
+				MemberRef memberRef = (MemberRef) tagElement.fragments().remove(i);
+				MethodRef methodRef = this.ast.newMethodRef();
+				methodRef.setName((SimpleName)memberRef.getName().clone(this.ast));
+				if (memberRef.getQualifier() != null) {
+					methodRef.setQualifier((Name)memberRef.getQualifier().clone(this.ast));
+				}
+				methodRef.setSourceRange(memberRef.getStartPosition(), memberRef.getLength());
+				tagElement.fragments().add(i, methodRef);
+			}
+		}
 	}
 	
 	protected void recordPendingNameScopeResolution(Name name) {
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTMatcher.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTMatcher.java
index d879fdc..e8e8d8d 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTMatcher.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTMatcher.java
@@ -166,12 +166,6 @@
 	 * other object is a node of the same type with structurally isomorphic
 	 * child subtrees. Subclasses may override this method as needed.
 	 * </p>
-	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @param node the node
 	 * @param other the other object, or <code>null</code>
@@ -199,12 +193,6 @@
 	 * other object is a node of the same type with structurally isomorphic
 	 * child subtrees. Subclasses may override this method as needed.
 	 * </p>
-	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @param node the node
 	 * @param other the other object, or <code>null</code>
@@ -568,12 +556,12 @@
 		}
 		ClassInstanceCreation o = (ClassInstanceCreation) other;
 		int level = node.getAST().apiLevel;
-		if (level == AST.LEVEL_2_0) {
+		if (level == AST.JLS2) {
 			if (!safeSubtreeMatch(node.getName(), o.getName())) {
 				return false;
 			}
 		}
-		if (level >= AST.LEVEL_3_0) {
+		if (level >= AST.JLS3) {
 			if (!safeSubtreeListMatch(node.typeArguments(), o.typeArguments())) {
 				return false;
 			}
@@ -658,7 +646,7 @@
 			return false;
 		}
 		ConstructorInvocation o = (ConstructorInvocation) other;
-		if (node.getAST().apiLevel >= AST.LEVEL_3_0) {
+		if (node.getAST().apiLevel >= AST.JLS3) {
 			if (!safeSubtreeListMatch(node.typeArguments(), o.typeArguments())) {
 				return false;
 			}
@@ -740,12 +728,6 @@
 	 * other object is a node of the same type with structurally isomorphic
 	 * child subtrees. Subclasses may override this method as needed.
 	 * </p>
-	 * <p>
-	 * Note: Enhanced for statements are an experimental language feature 
-	 * under discussion in JSR-201 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @param node the node
 	 * @param other the other object, or <code>null</code>
@@ -773,10 +755,10 @@
 	 * child subtrees. Subclasses may override this method as needed.
 	 * </p>
 	 * <p>
-	 * Note: Enum declarations are an experimental language feature 
-	 * under discussion in JSR-201 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * Note: This API element is only needed for dealing with Java code that uses
+	 * new language features of J2SE 1.5. It is included in anticipation of J2SE
+	 * 1.5 support, which is planned for the next release of Eclipse after 3.0, and
+	 * may change slightly before reaching its final form.
 	 * </p>
 	 * 
 	 * @param node the node
@@ -808,12 +790,6 @@
 	 * other object is a node of the same type with structurally isomorphic
 	 * child subtrees. Subclasses may override this method as needed.
 	 * </p>
-	 * <p>
-	 * Note: Enum declarations are an experimental language feature 
-	 * under discussion in JSR-201 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @param node the node
 	 * @param other the other object, or <code>null</code>
@@ -903,12 +879,12 @@
 		}
 		FieldDeclaration o = (FieldDeclaration) other;
 		int level = node.getAST().apiLevel;
-		if (level == AST.LEVEL_2_0) {
+		if (level == AST.JLS2) {
 			if (node.getModifiers() != o.getModifiers()) {
 				return false;
 			}
 		}
-		if (level >= AST.LEVEL_3_0) {
+		if (level >= AST.JLS3) {
 			if (!safeSubtreeListMatch(node.modifiers(), o.modifiers())) {
 				return false;
 			}
@@ -989,7 +965,7 @@
 			return false;
 		}
 		ImportDeclaration o = (ImportDeclaration) other;
-		if (node.getAST().apiLevel >= AST.LEVEL_3_0) {
+		if (node.getAST().apiLevel >= AST.JLS3) {
 			if (node.isStatic() != o.isStatic()) {
 				return false;
 			}
@@ -1077,12 +1053,12 @@
 		}
 		Initializer o = (Initializer) other;
 		int level = node.getAST().apiLevel;
-		if (level == AST.LEVEL_2_0) {
+		if (level == AST.JLS2) {
 			if (node.getModifiers() != o.getModifiers()) {
 				return false;
 			}
 		}
-		if (level >= AST.LEVEL_3_0) {
+		if (level >= AST.JLS3) {
 			if (!safeSubtreeListMatch(node.modifiers(), o.modifiers())) {
 				return false;
 			}
@@ -1137,7 +1113,7 @@
 	 * @deprecated mark deprecated to hide deprecated usage
 	 */
 	private boolean compareDeprecatedComment(Javadoc first, Javadoc second) {
-		if (first.getAST().apiLevel == AST.LEVEL_2_0) {
+		if (first.getAST().apiLevel == AST.JLS2) {
 			return safeEquals(first.getComment(), second.getComment());
 		} else {
 			return true;
@@ -1197,12 +1173,6 @@
 	 * other object is a node of the same type with structurally isomorphic
 	 * child subtrees. Subclasses may override this method as needed.
 	 * </p>
-	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @param node the node
 	 * @param other the other object, or <code>null</code>
@@ -1251,12 +1221,6 @@
 	 * other object is a node of the same type with structurally isomorphic
 	 * child subtrees. Subclasses may override this method as needed.
 	 * </p>
-	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @param node the node
 	 * @param other the other object, or <code>null</code>
@@ -1353,7 +1317,7 @@
 		}
 		MethodDeclaration o = (MethodDeclaration) other;
 		int level = node.getAST().apiLevel;
-		if (level == AST.LEVEL_2_0) {
+		if (level == AST.JLS2) {
 			if (node.getModifiers() != o.getModifiers()) {
 				return false;
 			}
@@ -1361,7 +1325,7 @@
 				return false;
 			}
 		}
-		if (level >= AST.LEVEL_3_0) {
+		if (level >= AST.JLS3) {
 			if (!safeSubtreeListMatch(node.modifiers(), o.modifiers())) {
 				return false;
 			}
@@ -1402,7 +1366,7 @@
 			return false;
 		}
 		MethodInvocation o = (MethodInvocation) other;
-		if (node.getAST().apiLevel >= AST.LEVEL_3_0) {
+		if (node.getAST().apiLevel >= AST.JLS3) {
 			if (!safeSubtreeListMatch(node.typeArguments(), o.typeArguments())) {
 				return false;
 			}
@@ -1420,12 +1384,6 @@
 	 * other object is a node of the same type with structurally isomorphic
 	 * child subtrees. Subclasses may override this method as needed.
 	 * </p>
-	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @param node the node
 	 * @param other the other object, or <code>null</code>
@@ -1449,12 +1407,6 @@
 	 * other object is a node of the same type with structurally isomorphic
 	 * child subtrees. Subclasses may override this method as needed.
 	 * </p>
-	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @param node the node
 	 * @param other the other object, or <code>null</code>
@@ -1534,7 +1486,7 @@
 			return false;
 		}
 		PackageDeclaration o = (PackageDeclaration) other;
-		if (node.getAST().apiLevel >= AST.LEVEL_3_0) {
+		if (node.getAST().apiLevel >= AST.JLS3) {
 			if (!safeSubtreeMatch(node.getJavadoc(), o.getJavadoc())) {
 				return false;
 			}
@@ -1552,12 +1504,6 @@
 	 * other object is a node of the same type with structurally isomorphic
 	 * child subtrees. Subclasses may override this method as needed.
 	 * </p>
-	 * <p>
-	 * Note: Support for generic types is an experimental language feature 
-	 * under discussion in JSR-014 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @param node the node
 	 * @param other the other object, or <code>null</code>
@@ -1698,12 +1644,6 @@
 	 * other object is a node of the same type with structurally isomorphic
 	 * child subtrees. Subclasses may override this method as needed.
 	 * </p>
-	 * <p>
-	 * Note: Support for generic types is an experimental language feature 
-	 * under discussion in JSR-014 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @param node the node
 	 * @param other the other object, or <code>null</code>
@@ -1795,12 +1735,6 @@
 	 * other object is a node of the same type with structurally isomorphic
 	 * child subtrees. Subclasses may override this method as needed.
 	 * </p>
-	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @param node the node
 	 * @param other the other object, or <code>null</code>
@@ -1842,12 +1776,12 @@
 		}
 		SingleVariableDeclaration o = (SingleVariableDeclaration) other;
 		int level = node.getAST().apiLevel;
-		if (level == AST.LEVEL_2_0) {
+		if (level == AST.JLS2) {
 			if (node.getModifiers() != o.getModifiers()) {
 				return false;
 			}
 		}
-		if (level >= AST.LEVEL_3_0) {
+		if (level >= AST.JLS3) {
 			if (!safeSubtreeListMatch(node.modifiers(), o.modifiers())) {
 				return false;
 			}
@@ -1903,7 +1837,7 @@
 			return false;
 		}
 		SuperConstructorInvocation o = (SuperConstructorInvocation) other;
-		if (node.getAST().apiLevel >= AST.LEVEL_3_0) {
+		if (node.getAST().apiLevel >= AST.JLS3) {
 			if (!safeSubtreeListMatch(node.typeArguments(), o.typeArguments())) {
 				return false;
 			}
@@ -1956,7 +1890,7 @@
 			return false;
 		}
 		SuperMethodInvocation o = (SuperMethodInvocation) other;
-		if (node.getAST().apiLevel >= AST.LEVEL_3_0) {
+		if (node.getAST().apiLevel >= AST.JLS3) {
 			if (!safeSubtreeListMatch(node.typeArguments(), o.typeArguments())) {
 				return false;
 			}
@@ -2174,7 +2108,7 @@
 		}
 		TypeDeclaration o = (TypeDeclaration) other;
 		int level = node.getAST().apiLevel;
-		if (level == AST.LEVEL_2_0) {
+		if (level == AST.JLS2) {
 			if (node.getModifiers() != o.getModifiers()) {
 				return false;
 			}
@@ -2185,7 +2119,7 @@
 				return false;
 			}
 		}
-		if (level >= AST.LEVEL_3_0) {
+		if (level >= AST.JLS3) {
 			if (!safeSubtreeListMatch(node.modifiers(), o.modifiers())) {
 				return false;
 			}
@@ -2257,12 +2191,6 @@
 	 * other object is a node of the same type with structurally isomorphic
 	 * child subtrees. Subclasses may override this method as needed.
 	 * </p>
-	 * <p>
-	 * Note: Support for generic types is an experimental language feature 
-	 * under discussion in JSR-014 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @param node the node
 	 * @param other the other object, or <code>null</code>
@@ -2300,12 +2228,12 @@
 		}
 		VariableDeclarationExpression o = (VariableDeclarationExpression) other;
 		int level = node.getAST().apiLevel;
-		if (level == AST.LEVEL_2_0) {
+		if (level == AST.JLS2) {
 			if (node.getModifiers() != o.getModifiers()) {
 				return false;
 			}
 		}
-		if (level >= AST.LEVEL_3_0) {
+		if (level >= AST.JLS3) {
 			if (!safeSubtreeListMatch(node.modifiers(), o.modifiers())) {
 				return false;
 			}
@@ -2362,12 +2290,12 @@
 		}
 		VariableDeclarationStatement o = (VariableDeclarationStatement) other;
 		int level = node.getAST().apiLevel;
-		if (level == AST.LEVEL_2_0) {
+		if (level == AST.JLS2) {
 			if (node.getModifiers() != o.getModifiers()) {
 				return false;
 			}
 		}
-		if (level >= AST.LEVEL_3_0) {
+		if (level >= AST.JLS3) {
 			if (!safeSubtreeListMatch(node.modifiers(), o.modifiers())) {
 				return false;
 			}
@@ -2407,12 +2335,6 @@
 	 * other object is a node of the same type with structurally isomorphic
 	 * child subtrees. Subclasses may override this method as needed.
 	 * </p>
-	 * <p>
-	 * Note: Support for generic types is an experimental language feature 
-	 * under discussion in JSR-014 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @param node the node
 	 * @param other the other object, or <code>null</code>
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTNode.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTNode.java
index ad919f5..6c31a08 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTNode.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTNode.java
@@ -646,12 +646,6 @@
 	/**
 	 * Node type constant indicating a node of type 
 	 * <code>EnhancedForStatement</code>.
-	 * <p>
-	 * Note: Enhanced for statements are an experimental language feature 
-	 * under discussion in JSR-201 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * @see EnhancedForStatement
 	 * @since 3.0
 	 */
@@ -660,12 +654,6 @@
 	/**
 	 * Node type constant indicating a node of type 
 	 * <code>EnumDeclaration</code>.
-	 * <p>
-	 * Note: Enum declarations are an experimental language feature 
-	 * under discussion in JSR-201 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * @see EnumDeclaration
 	 * @since 3.0
 	 */
@@ -674,12 +662,6 @@
 	/**
 	 * Node type constant indicating a node of type 
 	 * <code>EnumConstantDeclaration</code>.
-	 * <p>
-	 * Note: Enum declarations are an experimental language feature 
-	 * under discussion in JSR-201 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * @see EnumConstantDeclaration
 	 * @since 3.0
 	 */
@@ -688,12 +670,6 @@
 	/**
 	 * Node type constant indicating a node of type 
 	 * <code>TypeParameter</code>.
-	 * <p>
-	 * Note: Support for generic types is an experimental language feature 
-	 * under discussion in JSR-014 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * @see TypeParameter
 	 * @since 3.0
 	 */
@@ -702,12 +678,6 @@
 	/**
 	 * Node type constant indicating a node of type 
 	 * <code>ParameterizedType</code>.
-	 * <p>
-	 * Note: Support for generic types is an experimental language feature 
-	 * under discussion in JSR-014 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * @see ParameterizedType
 	 * @since 3.0
 	 */
@@ -716,12 +686,6 @@
 	/**
 	 * Node type constant indicating a node of type 
 	 * <code>QualifiedType</code>.
-	 * <p>
-	 * Note: Support for generic types is an experimental language feature 
-	 * under discussion in JSR-014 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * @see QualifiedType
 	 * @since 3.0
 	 */
@@ -730,12 +694,6 @@
 	/**
 	 * Node type constant indicating a node of type 
 	 * <code>WildcardType</code>.
-	 * <p>
-	 * Note: Support for generic types is an experimental language feature 
-	 * under discussion in JSR-014 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * @see WildcardType
 	 * @since 3.0
 	 */
@@ -744,12 +702,6 @@
 	/**
 	 * Node type constant indicating a node of type 
 	 * <code>NormalAnnotation</code>.
-	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * @see NormalAnnotation
 	 * @since 3.0
 	 */
@@ -758,12 +710,6 @@
 	/**
 	 * Node type constant indicating a node of type 
 	 * <code>MarkerAnnotation</code>.
-	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * @see MarkerAnnotation
 	 * @since 3.0
 	 */
@@ -772,12 +718,6 @@
 	/**
 	 * Node type constant indicating a node of type 
 	 * <code>SingleMemberAnnotation</code>.
-	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * @see SingleMemberAnnotation
 	 * @since 3.0
 	 */
@@ -786,12 +726,6 @@
 	/**
 	 * Node type constant indicating a node of type 
 	 * <code>MemberValuePair</code>.
-	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * @see MemberValuePair
 	 * @since 3.0
 	 */
@@ -800,12 +734,6 @@
 	/**
 	 * Node type constant indicating a node of type 
 	 * <code>AnnotationTypeDeclaration</code>.
-	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * @see AnnotationTypeDeclaration
 	 * @since 3.0
 	 */
@@ -814,12 +742,6 @@
 	/**
 	 * Node type constant indicating a node of type 
 	 * <code>AnnotationTypeMemberDeclaration</code>.
-	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * @see AnnotationTypeMemberDeclaration
 	 * @since 3.0
 	 */
@@ -828,12 +750,6 @@
 	/**
 	 * Node type constant indicating a node of type 
 	 * <code>Modifier</code>.
-	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * @see Modifier
 	 * @since 3.0
 	 */
@@ -1778,7 +1694,7 @@
 	 * clutter up the API doc.
 	 * </p>
 	 * 
-	 * @param apiLevel the API level; one of the <code>AST.LEVEL_&ast;</code> constants
+	 * @param apiLevel the API level; one of the <code>AST.JLS&ast;</code> constants
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
@@ -1842,7 +1758,7 @@
 	 * @since 3.0
      */
 	final void unsupportedIn2() {
-	  if (this.ast.apiLevel == AST.LEVEL_2_0) {
+	  if (this.ast.apiLevel == AST.JLS2) {
 	  	throw new UnsupportedOperationException("Operation not supported in 2.0 AST"); //$NON-NLS-1$
 	  }
 	}
@@ -1855,7 +1771,7 @@
 	 * @since 3.0
      */
 	final void supportedOnlyIn2() {
-	  if (this.ast.apiLevel != AST.LEVEL_2_0) {
+	  if (this.ast.apiLevel != AST.JLS2) {
 	  	throw new UnsupportedOperationException("Operation only supported in 2.0 AST"); //$NON-NLS-1$
 	  }
 	}
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTParser.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTParser.java
index a21b266..9ca41af 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTParser.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTParser.java
@@ -37,7 +37,7 @@
  * Example: Create basic AST from source string
  * <pre>
  * char[] source = ...;
- * ASTParser parser = ASTParser.newParser(AST.LEVEL_3_0);  // handles JLS3 (J2SE 1.5)
+ * ASTParser parser = ASTParser.newParser(AST.JLS2);  // handles JLS2 (J2SE 1.4)
  * parser.setSource(source);
  * CompilationUnit result = (CompilationUnit) parser.createAST(null);
  * </pre>
@@ -98,8 +98,13 @@
 	
 	/**
 	 * Creates a new object for creating a Java abstract syntax tree
-     * (AST) following the specified set of API rules. 
- 
+     * (AST) following the specified set of API rules.
+     * <p>
+     * <b>NOTE:</b>In Eclipse 3.0, there is no parser support for
+     * AST.JLS3. This support is planned for the follow-on release of
+     * Eclipse which includes support for J2SE 1.5.
+     * </p>
+     *  
  	 * @param level the API level; one of the LEVEL constants
      * declared on <code>AST</code>
 	 */
@@ -194,8 +199,8 @@
      * declared on <code>AST</code>
 	 */
 	ASTParser(int level) {
-		if ((level != AST.LEVEL_2_0)
-			&& (level != AST.LEVEL_3_0)) {
+		if ((level != AST.JLS2)
+			&& (level != AST.JLS3)) {
 			throw new IllegalArgumentException();
 		}
 		this.apiLevel = level;
@@ -690,7 +695,7 @@
 		AST ast = AST.newAST(this.apiLevel);
 		ast.setDefaultNodeFlag(ASTNode.ORIGINAL);
 		CompilationUnit compilationUnit = null;
-		if (AST.LEVEL_2_0 == this.apiLevel) {
+		if (AST.JLS2 == this.apiLevel) {
 			ASTConverter converter = new ASTConverter(this.compilerOptions, needToResolveBindings, monitor);
 			if (needToResolveBindings) {
 				resolver = new DefaultBindingResolver(compilationUnitDeclaration.scope);
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTVisitor.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTVisitor.java
index bb1dd3f..47c3f3d 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTVisitor.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ASTVisitor.java
@@ -156,164 +156,571 @@
 		// default implementation: do nothing
 	}
 
-	/** Visits the given node.
+
+	/**
+	 * Visits the given type-specific AST node.
 	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
 	 * </p>
 	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
 	 * @since 3.0
 	 */
 	public boolean visit(AnnotationTypeDeclaration node) {
 		return true;
 	}
 
-	/** Visits the given node.
+
+	/**
+	 * Visits the given type-specific AST node.
 	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
 	 * </p>
 	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
 	 * @since 3.0
 	 */
 	public boolean visit(AnnotationTypeMemberDeclaration node) {
 		return true;
 	}
 
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(AnonymousClassDeclaration node) {
 		return true;
 	}
+
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(ArrayAccess node) {
 		return true;
 	}
+
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(ArrayCreation node) {
 		return true;
 	}
+
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(ArrayInitializer node) {
 		return true;
 	}
+
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(ArrayType node) {
 		return true;
 	}
+
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(AssertStatement node) {
 		return true;
 	}
+
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(Assignment node) {
 		return true;
 	}
+
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(Block node) {
 		return true;
 	}
 	
+
 	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
 	 * @since 3.0
 	 */
 	public boolean visit(BlockComment node) {
 		return true;
 	}
+
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(BooleanLiteral node) {
 		return true;
 	}
+
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(BreakStatement node) {
 		return true;
 	}
+
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(CastExpression node) {
 		return true;
 	}
+
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(CatchClause node) {
 		return true;
 	}
+
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(CharacterLiteral node) {
 		return true;
 	}
+
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(ClassInstanceCreation node) {
 		return true;
 	}
+
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(CompilationUnit node) {
 		return true;
 	}
+
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(ConditionalExpression node) {
 		return true;
 	}
+
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(ConstructorInvocation node) {
 		return true;
 	}
+
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(ContinueStatement node) {
 		return true;
 	}
+
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(DoStatement node) {
 		return true;
 	}
+
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(EmptyStatement node) {
 		return true;
 	}
-	/** Visits the given node.
+
+	/**
+	 * Visits the given type-specific AST node.
 	 * <p>
-	 * Note: Enhanced for statements are an experimental language feature 
-	 * under discussion in JSR-201 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
 	 * </p>
 	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
 	 * @since 3.0
 	 */
 	public boolean visit(EnhancedForStatement node) {
 		return true;
 	}
-	/** Visits the given node.
+
+	/**
+	 * Visits the given type-specific AST node.
 	 * <p>
-	 * Note: Enum declarations are an experimental language feature 
-	 * under discussion in JSR-201 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
 	 * </p>
 	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
 	 * @since 3.0
 	 */
 	public boolean visit(EnumConstantDeclaration node) {
 		return true;
 	}
-	/** Visits the given node.
+
+	/**
+	 * Visits the given type-specific AST node.
 	 * <p>
-	 * Note: Enum declarations are an experimental language feature 
-	 * under discussion in JSR-201 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
 	 * </p>
 	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
 	 * @since 3.0
 	 */
 	public boolean visit(EnumDeclaration node) {
 		return true;
 	}
+
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(ExpressionStatement node) {
 		return true;
 	}
+
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(FieldAccess node) {
 		return true;
 	}
+
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(FieldDeclaration node) {
 		return true;
 	}
+
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(ForStatement node) {
 		return true;
 	}
+
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(IfStatement node) {
 		return true;
 	}
+
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(ImportDeclaration node) {
 		return true;
 	}
+
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(InfixExpression node) {
 		return true;
 	}
+
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(InstanceofExpression node) {
 		return true;
 	}
+
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(Initializer node) {
 		return true;
 	}
@@ -329,8 +736,9 @@
 	 * </p>
 	 * 
 	 * @param node the node to visit
-	 * @return <code>true</code> to visit the children of the given
-	 *   node, and <code>false</code> to skip the children
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
 	 * @see #ASTVisitor()
 	 * @see #ASTVisitor(boolean)
 	 */
@@ -339,484 +747,1297 @@
 		return this.visitDocTags;
 	}
 	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(LabeledStatement node) {
 		return true;
 	}
 	
+	
 	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
 	 * @since 3.0
 	 */
 	public boolean visit(LineComment node) {
 		return true;
 	}
 
-	/** Visits the given node.
+	
+	/**
+	 * Visits the given type-specific AST node.
 	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
 	 * </p>
 	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
 	 * @since 3.0
 	 */
 	public boolean visit(MarkerAnnotation node) {
 		return true;
 	}
 
+	
 	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
 	 * @since 3.0
 	 */
 	public boolean visit(MemberRef node) {
 		return true;
 	}
 
-	/** Visits the given node.
+	
+	/**
+	 * Visits the given type-specific AST node.
 	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
 	 * </p>
 	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
 	 * @since 3.0
 	 */
 	public boolean visit(MemberValuePair node) {
 		return true;
 	}
 
+	
 	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
 	 * @since 3.0
 	 */
 	public boolean visit(MethodRef node) {
 		return true;
 	}
 
+	
 	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
 	 * @since 3.0
 	 */
 	public boolean visit(MethodRefParameter node) {
 		return true;
 	}
 	
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(MethodDeclaration node) {
 		return true;
 	}
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(MethodInvocation node) {
 		return true;
 	}
 
-	/** Visits the given node.
+	
+	/**
+	 * Visits the given type-specific AST node.
 	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
 	 * </p>
 	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
 	 * @since 3.0
 	 */
 	public boolean visit(Modifier node) {
 		return true;
 	}
 
-	/** Visits the given node.
+	
+	/**
+	 * Visits the given type-specific AST node.
 	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
 	 * </p>
 	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
 	 * @since 3.0
 	 */
 	public boolean visit(NormalAnnotation node) {
 		return true;
 	}
-
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(NullLiteral node) {
 		return true;
 	}
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(NumberLiteral node) {
 		return true;
 	}
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(PackageDeclaration node) {
 		return true;
 	}
 
-	/** Visits the given node.
+	
+	/**
+	 * Visits the given type-specific AST node.
 	 * <p>
-	 * Note: Support for generic types is an experimental language feature 
-	 * under discussion in JSR-014 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
 	 * </p>
 	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
 	 * @since 3.0
 	 */
 	public boolean visit(ParameterizedType node) {
 		return true;
 	}
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(ParenthesizedExpression node) {
 		return true;
 	}
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(PostfixExpression node) {
 		return true;
 	}
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(PrefixExpression node) {
 		return true;
 	}
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(PrimitiveType node) {
 		return true;
 	}
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(QualifiedName node) {
 		return true;
 	}
-	/** Visits the given node.
+	
+	/**
+	 * Visits the given type-specific AST node.
 	 * <p>
-	 * Note: Support for generic types is an experimental language feature 
-	 * under discussion in JSR-014 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
 	 * </p>
 	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
 	 * @since 3.0
 	 */
 	public boolean visit(QualifiedType node) {
 		return true;
 	}
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(ReturnStatement node) {
 		return true;
 	}
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(SimpleName node) {
 		return true;
 	}
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(SimpleType node) {
 		return true;
 	}
 
-	/** Visits the given node.
+	
+	/**
+	 * Visits the given type-specific AST node.
 	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
 	 * </p>
 	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
 	 * @since 3.0
 	 */
 	public boolean visit(SingleMemberAnnotation node) {
 		return true;
 	}
 
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(SingleVariableDeclaration node) {
 		return true;
 	}
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(StringLiteral node) {
 		return true;
 	}
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(SuperConstructorInvocation node) {
 		return true;
 	}
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(SuperFieldAccess node) {
 		return true;
 	}
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(SuperMethodInvocation node) {
 		return true;
 	}
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(SwitchCase node) {
 		return true;
 	}
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(SwitchStatement node) {
 		return true;
 	}
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(SynchronizedStatement node) {
 		return true;
 	}
 
+	
 	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
 	 * @since 3.0
 	 */
 	public boolean visit(TagElement node) {
 		return true;
 	}
 
+	
 	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
 	 * @since 3.0
 	 */
 	public boolean visit(TextElement node) {
 		return true;
 	}
 
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(ThisExpression node) {
 		return true;
 	}
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(ThrowStatement node) {
 		return true;
 	}
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(TryStatement node) {
 		return true;
 	}
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(TypeDeclaration node) {
 		return true;
 	}
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(TypeDeclarationStatement node) {
 		return true;
 	}
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(TypeLiteral node) {
 		return true;
 	}
-	/** Visits the given node.
+	
+	/**
+	 * Visits the given type-specific AST node.
 	 * <p>
-	 * Note: Support for generic types is an experimental language feature 
-	 * under discussion in JSR-014 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
 	 * </p>
 	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
 	 * @since 3.0
 	 */
 	public boolean visit(TypeParameter node) {
 		return true;
 	}
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(VariableDeclarationExpression node) {
 		return true;
 	}
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(VariableDeclarationStatement node) {
 		return true;
 	}
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(VariableDeclarationFragment node) {
 		return true;
 	}
+	
+	/**
+	 * Visits the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
+	 */
 	public boolean visit(WhileStatement node) {
 		return true;
 	}
-	/** Visits the given node.
+	
+	/**
+	 * Visits the given type-specific AST node.
 	 * <p>
-	 * Note: Support for generic types is an experimental language feature 
-	 * under discussion in JSR-014 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * The default implementation does nothing and return true.
+	 * Subclasses may reimplement.
 	 * </p>
 	 * 
+	 * @param node the node to visit
+	 * @return <code>true</code> if the children of this node should be
+	 * visited, and <code>false</code> if the children of this node should
+	 * be skipped
 	 * @since 3.0
 	 */
 	public boolean visit(WildcardType node) {
 		return true;
 	}
-
-	/** End of visit of the given node.
+	
+	/**
+	 * End of visit the given type-specific AST node.
 	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * The default implementation does nothing. Subclasses may reimplement.
 	 * </p>
 	 * 
+	 * @param node the node to visit
 	 * @since 3.0
 	 */
 	public void endVisit(AnnotationTypeDeclaration node) {
 		// default implementation: do nothing
 	}
 
-	/** End of visit of the given node.
+	/**
+	 * End of visit the given type-specific AST node.
 	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * The default implementation does nothing. Subclasses may reimplement.
 	 * </p>
 	 * 
+	 * @param node the node to visit
 	 * @since 3.0
 	 */
 	public void endVisit(AnnotationTypeMemberDeclaration node) {
 		// default implementation: do nothing
 	}
 
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(AnonymousClassDeclaration node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(ArrayAccess node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(ArrayCreation node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(ArrayInitializer node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(ArrayType node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(AssertStatement node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(Assignment node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(Block node) {
 		// default implementation: do nothing
 	}
 	
 	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
 	 * @since 3.0
 	 */
 	public void endVisit(BlockComment node) {
 		// default implementation: do nothing
 	}
-	
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(BooleanLiteral node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(BreakStatement node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(CastExpression node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(CatchClause node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(CharacterLiteral node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(ClassInstanceCreation node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(CompilationUnit node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(ConditionalExpression node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(ConstructorInvocation node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(ContinueStatement node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(DoStatement node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(EmptyStatement node) {
 		// default implementation: do nothing
 	}
-	/** End of visit of the given node.
+	
+	/**
+	 * End of visit the given type-specific AST node.
 	 * <p>
-	 * Note: Enhanced for statements are an experimental language feature 
-	 * under discussion in JSR-201 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * The default implementation does nothing. Subclasses may reimplement.
 	 * </p>
 	 * 
+	 * @param node the node to visit
 	 * @since 3.0
 	 */
 	public void endVisit(EnhancedForStatement node) {
 		// default implementation: do nothing
 	}
-	/** End of visit of the given node.
+	
+	/**
+	 * End of visit the given type-specific AST node.
 	 * <p>
-	 * Note: Enum declarations are an experimental language feature 
-	 * under discussion in JSR-201 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * The default implementation does nothing. Subclasses may reimplement.
 	 * </p>
 	 * 
+	 * @param node the node to visit
 	 * @since 3.0
 	 */
 	public void endVisit(EnumConstantDeclaration node) {
 		// default implementation: do nothing
 	}	
-	/** End of visit of the given node.
+	
+	/**
+	 * End of visit the given type-specific AST node.
 	 * <p>
-	 * Note: Enum declarations are an experimental language feature 
-	 * under discussion in JSR-201 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * The default implementation does nothing. Subclasses may reimplement.
 	 * </p>
 	 * 
+	 * @param node the node to visit
 	 * @since 3.0
 	 */
 	public void endVisit(EnumDeclaration node) {
 		// default implementation: do nothing
 	}	
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(ExpressionStatement node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(FieldAccess node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(FieldDeclaration node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(ForStatement node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(IfStatement node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(ImportDeclaration node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(InfixExpression node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(InstanceofExpression node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(Initializer node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(Javadoc node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(LabeledStatement node) {
 		// default implementation: do nothing
 	}
 	
 	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
 	 * @since 3.0
 	 */
 	public void endVisit(LineComment node) {
 		// default implementation: do nothing
 	}
 	
-	/** End of visit of the given node.
+	/**
+	 * End of visit the given type-specific AST node.
 	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * The default implementation does nothing. Subclasses may reimplement.
 	 * </p>
 	 * 
+	 * @param node the node to visit
 	 * @since 3.0
 	 */
 	public void endVisit(MarkerAnnotation node) {
 		// default implementation: do nothing
 	}
-
+	
 	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
 	 * @since 3.0
 	 */
 	public void endVisit(MemberRef node) {
 		// default implementation: do nothing
 	}
 	
-	/** End of visit of the given node.
+	/**
+	 * End of visit the given type-specific AST node.
 	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * The default implementation does nothing. Subclasses may reimplement.
 	 * </p>
 	 * 
+	 * @param node the node to visit
 	 * @since 3.0
 	 */
 	public void endVisit(MemberValuePair node) {
 		// default implementation: do nothing
 	}
-
+	
 	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
 	 * @since 3.0
 	 */
 	public void endVisit(MethodRef node) {
@@ -824,147 +2045,342 @@
 	}
 	
 	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
 	 * @since 3.0
 	 */
 	public void endVisit(MethodRefParameter node) {
 		// default implementation: do nothing
 	}
-	
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(MethodDeclaration node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(MethodInvocation node) {
 		// default implementation: do nothing
 	}
 	
-	/** End of visit of the given node.
+	/**
+	 * End of visit the given type-specific AST node.
 	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * The default implementation does nothing. Subclasses may reimplement.
 	 * </p>
 	 * 
+	 * @param node the node to visit
 	 * @since 3.0
 	 */
 	public void endVisit(Modifier node) {
 		// default implementation: do nothing
 	}
-
-	/** End of visit of the given node.
+	
+	/**
+	 * End of visit the given type-specific AST node.
 	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * The default implementation does nothing. Subclasses may reimplement.
 	 * </p>
 	 * 
+	 * @param node the node to visit
 	 * @since 3.0
 	 */
 	public void endVisit(NormalAnnotation node) {
 		// default implementation: do nothing
 	}
 
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(NullLiteral node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(NumberLiteral node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(PackageDeclaration node) {
 		// default implementation: do nothing
 	}
-	/** Ends visit of the given node.
+	
+	/**
+	 * End of visit the given type-specific AST node.
 	 * <p>
-	 * Note: Support for generic types is an experimental language feature 
-	 * under discussion in JSR-014 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * The default implementation does nothing. Subclasses may reimplement.
 	 * </p>
 	 * 
+	 * @param node the node to visit
 	 * @since 3.0
 	 */
 	public void endVisit(ParameterizedType node) {
 		// default implementation: do nothing
 	}	
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(ParenthesizedExpression node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(PostfixExpression node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(PrefixExpression node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(PrimitiveType node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(QualifiedName node) {
 		// default implementation: do nothing
 	}
-	/** Ends visit of the given node.
+	
+	/**
+	 * End of visit the given type-specific AST node.
 	 * <p>
-	 * Note: Support for generic types is an experimental language feature 
-	 * under discussion in JSR-014 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * The default implementation does nothing. Subclasses may reimplement.
 	 * </p>
 	 * 
+	 * @param node the node to visit
 	 * @since 3.0
 	 */
 	public void endVisit(QualifiedType node) {
 		// default implementation: do nothing
 	}	
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(ReturnStatement node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(SimpleName node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(SimpleType node) {
 		// default implementation: do nothing
 	}
 	
-	/** End of visit of the given node.
+	/**
+	 * End of visit the given type-specific AST node.
 	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * The default implementation does nothing. Subclasses may reimplement.
 	 * </p>
 	 * 
+	 * @param node the node to visit
 	 * @since 3.0
 	 */
 	public void endVisit(SingleMemberAnnotation node) {
 		// default implementation: do nothing
 	}
 
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(SingleVariableDeclaration node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(StringLiteral node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(SuperConstructorInvocation node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(SuperFieldAccess node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(SuperMethodInvocation node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(SwitchCase node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(SwitchStatement node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(SynchronizedStatement node) {
 		// default implementation: do nothing
 	}
 	
 	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
 	 * @since 3.0
 	 */
 	public void endVisit(TagElement node) {
@@ -972,63 +2388,158 @@
 	}
 	
 	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
 	 * @since 3.0
 	 */
 	public void endVisit(TextElement node) {
 		// default implementation: do nothing
 	}
-	
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(ThisExpression node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(ThrowStatement node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(TryStatement node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(TypeDeclaration node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(TypeDeclarationStatement node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(TypeLiteral node) {
 		// default implementation: do nothing
 	}
-	/** Ends visit of the given node.
+	
+	/**
+	 * End of visit the given type-specific AST node.
 	 * <p>
-	 * Note: Support for generic types is an experimental language feature 
-	 * under discussion in JSR-014 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * The default implementation does nothing. Subclasses may reimplement.
 	 * </p>
 	 * 
+	 * @param node the node to visit
 	 * @since 3.0
 	 */
 	public void endVisit(TypeParameter node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(VariableDeclarationExpression node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(VariableDeclarationStatement node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(VariableDeclarationFragment node) {
 		// default implementation: do nothing
 	}
+
+	/**
+	 * End of visit the given type-specific AST node.
+	 * <p>
+	 * The default implementation does nothing. Subclasses may reimplement.
+	 * </p>
+	 * 
+	 * @param node the node to visit
+	 */
 	public void endVisit(WhileStatement node) {
 		// default implementation: do nothing
 	}
-	/** End of visit of the given node.
+	
+	/**
+	 * End of visit the given type-specific AST node.
 	 * <p>
-	 * Note: Enhanced for statements are an experimental language feature 
-	 * under discussion in JSR-201 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * The default implementation does nothing. Subclasses may reimplement.
 	 * </p>
 	 * 
+	 * @param node the node to visit
 	 * @since 3.0
 	 */
 	public void endVisit(WildcardType node) {
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AbstractTypeDeclaration.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AbstractTypeDeclaration.java
index 9768100..37fe9be 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AbstractTypeDeclaration.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AbstractTypeDeclaration.java
@@ -21,18 +21,6 @@
  * 		EnumDeclaration
  * 		AnnotationTypeDeclaration
  * </pre>
- * <p>
- * Note: Support for annotation metadata is an experimental language feature 
- * under discussion in JSR-175 and under consideration for inclusion
- * in the 1.5 release of J2SE. The support here is therefore tentative
- * and subject to change.
- * </p>
- * <p>
- * Note: Enum declarations are an experimental language feature 
- * under discussion in JSR-201 and under consideration for inclusion
- * in the 1.5 release of J2SE. The support here is therefore tentative
- * and subject to change.
- * </p>
  * 
  * @since 3.0
  */
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Annotation.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Annotation.java
index 35e37c8..631d01e 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Annotation.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Annotation.java
@@ -21,10 +21,10 @@
  * </pre>
  * </p>
  * <p>
- * Note: Support for annotation metadata is an experimental language feature 
- * under discussion in JSR-175 and under consideration for inclusion
- * in the 1.5 release of J2SE. The support here is therefore tentative
- * and subject to change.
+ * Note: This API element is only needed for dealing with Java code that uses
+ * new language features of J2SE 1.5. It is included in anticipation of J2SE
+ * 1.5 support, which is planned for the next release of Eclipse after 3.0, and
+ * may change slightly before reaching its final form.
  * </p>
  * @since 3.0
  */
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AnnotationTypeDeclaration.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AnnotationTypeDeclaration.java
index c76694e..3311793 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AnnotationTypeDeclaration.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AnnotationTypeDeclaration.java
@@ -39,10 +39,10 @@
  * token following the body declarations.
  * </p>
  * <p>
- * Note: Support for annotation metadata is an experimental language feature 
- * under discussion in JSR-175 and under consideration for inclusion
- * in the 1.5 release of J2SE. The support here is therefore tentative
- * and subject to change.
+ * Note: This API element is only needed for dealing with Java code that uses
+ * new language features of J2SE 1.5. It is included in anticipation of J2SE
+ * 1.5 support, which is planned for the next release of Eclipse after 3.0, and
+ * may change slightly before reaching its final form.
  * </p>
  * 
  * @since 3.0
@@ -94,7 +94,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AnnotationTypeMemberDeclaration.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AnnotationTypeMemberDeclaration.java
index 6851cc9..796362c 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AnnotationTypeMemberDeclaration.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AnnotationTypeMemberDeclaration.java
@@ -33,10 +33,10 @@
  * ";" token.
  * </p>
  * <p>
- * Note: Support for annotation metadata is an experimental language feature 
- * under discussion in JSR-175 and under consideration for inclusion
- * in the 1.5 release of J2SE. The support here is therefore tentative
- * and subject to change.
+ * Note: This API element is only needed for dealing with Java code that uses
+ * new language features of J2SE 1.5. It is included in anticipation of J2SE
+ * 1.5 support, which is planned for the next release of Eclipse after 3.0, and
+ * may change slightly before reaching its final form.
  * </p>
  * 
  * @since 3.0
@@ -100,7 +100,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 */
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AnonymousClassDeclaration.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AnonymousClassDeclaration.java
index 3827352..f80a954 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AnonymousClassDeclaration.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AnonymousClassDeclaration.java
@@ -51,7 +51,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ArrayAccess.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ArrayAccess.java
index 93a2275..23311bc 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ArrayAccess.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ArrayAccess.java
@@ -58,7 +58,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ArrayCreation.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ArrayCreation.java
index 3a2fad1..4f0f049 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ArrayCreation.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ArrayCreation.java
@@ -87,7 +87,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ArrayInitializer.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ArrayInitializer.java
index 834c6ec..ad11222 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ArrayInitializer.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ArrayInitializer.java
@@ -50,7 +50,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ArrayType.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ArrayType.java
index f89b0e0..371b24b 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ArrayType.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ArrayType.java
@@ -52,7 +52,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AssertStatement.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AssertStatement.java
index 90e3ccb..9afe463 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AssertStatement.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/AssertStatement.java
@@ -58,7 +58,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Assignment.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Assignment.java
index 7b994ca..5db1ff9 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Assignment.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Assignment.java
@@ -186,7 +186,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BindingResolver.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BindingResolver.java
index 1523717..4a21d87 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BindingResolver.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BindingResolver.java
@@ -92,7 +92,7 @@
 	 * Resolves the given well known type by name and returns the type binding
 	 * for it.
 	 * <p>
-	 * The implementation of <code>ASTNode.resolveWellKnownType</code>
+	 * The implementation of <code>AST.resolveWellKnownType</code>
 	 * forwards to this method.
 	 * </p>
 	 * <p>
@@ -145,12 +145,6 @@
 	 * The default implementation of this method returns <code>null</code>.
 	 * Subclasses may reimplement.
 	 * </p>
-	 * <p>
-	 * Note: Enum declarations are an experimental language feature 
-	 * under discussion in JSR-201 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @param type the enum declaration of interest
 	 * @return the binding for the given enum declaration, or <code>null</code>
@@ -196,12 +190,6 @@
 	 * The default implementation of this method returns <code>null</code>.
 	 * Subclasses may reimplement.
 	 * </p>
-	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @param type the annotation type declaration of interest
 	 * @return the binding for the given annotation type declaration, or <code>null</code>
@@ -303,12 +291,6 @@
 	 * The default implementation of this method returns <code>null</code>.
 	 * Subclasses may reimplement.
 	 * </p>
-	 * <p>
-	 * Note: Enhanced for statements are an experimental language feature 
-	 * under discussion in JSR-201 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @param statement the enhanced for statement of interest
 	 * @return the binding for the loop variable for the given enhanced for
@@ -320,27 +302,6 @@
 	}
 
 	/**
-	 * Resolves the given field declaration and returns the binding for it.
-	 * <p>
-	 * The implementation of <code>FieldDeclaration.resolveBinding</code>
-	 * forwards to this method. How the field declaration resolves is often
-	 * a function of the context in which the variable declaration node is 
-	 * embedded as well as the variable declaration subtree itself.
-	 * </p>
-	 * <p>
-	 * The default implementation of this method returns <code>null</code>.
-	 * Subclasses may reimplement.
-	 * </p>
-	 * 
-	 * @param variable the field declaration of interest
-	 * @return the binding for the given field declaration, or 
-	 *    <code>null</code> if no binding is available
-	 */
-	IVariableBinding resolveVariable(FieldDeclaration variable) {
-		return null;
-	}
-		
-	/**
 	 * Resolves the given enum constant declaration and returns the binding for
 	 * the field.
 	 * <p>
@@ -351,12 +312,6 @@
 	 * The default implementation of this method returns <code>null</code>.
 	 * Subclasses may reimplement.
 	 * </p>
-	 * <p>
-	 * Note: Enum declarations are an experimental language feature 
-	 * under discussion in JSR-201 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @param enumConstant the enum constant declaration of interest
 	 * @return the field binding for the given enum constant declaration, or 
@@ -380,12 +335,6 @@
 	 * The default implementation of this method returns <code>null</code>.
 	 * Subclasses may reimplement.
 	 * </p>
-	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @param member the annotation type member declaration of interest
 	 * @return the binding for the given annotation type member declaration, or <code>null</code>
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Block.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Block.java
index f3ea6ac..cfe193e 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Block.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Block.java
@@ -50,7 +50,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BlockComment.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BlockComment.java
index 4cb08b2..80b1ed3 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BlockComment.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BlockComment.java
@@ -50,7 +50,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BodyDeclaration.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BodyDeclaration.java
index 6aa938a..dda60ea 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BodyDeclaration.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BodyDeclaration.java
@@ -143,7 +143,7 @@
 	 */
 	BodyDeclaration(AST ast) {
 		super(ast);
-		if (ast.apiLevel >= AST.LEVEL_3_0) {
+		if (ast.apiLevel >= AST.JLS3) {
 			this.modifiers = new ASTNode.NodeList(internalModifiers2Property());
 		}
 	}
@@ -224,12 +224,6 @@
 	/**
 	 * Returns the live ordered list of modifiers and annotations
 	 * of this declaration (added in 3.0 API).
-	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @return the live list of modifiers and annotations
 	 *    (element type: <code>IExtendedModifier</code>)
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BooleanLiteral.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BooleanLiteral.java
index 7198068..39415a5 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BooleanLiteral.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BooleanLiteral.java
@@ -51,7 +51,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BreakStatement.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BreakStatement.java
index 34932be..fff00bb 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BreakStatement.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/BreakStatement.java
@@ -50,7 +50,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CastExpression.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CastExpression.java
index 6503e8f..5bbb22f 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CastExpression.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CastExpression.java
@@ -58,7 +58,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CatchClause.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CatchClause.java
index f87e071..79c3ce5 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CatchClause.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CatchClause.java
@@ -58,7 +58,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CharacterLiteral.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CharacterLiteral.java
index 9dca6e7..bb695f1 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CharacterLiteral.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CharacterLiteral.java
@@ -49,7 +49,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ClassInstanceCreation.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ClassInstanceCreation.java
index f19f00e..c9baa26 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ClassInstanceCreation.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ClassInstanceCreation.java
@@ -55,12 +55,6 @@
  * (Note also that the first form became possible as of 3.0; only the second
  * form existed in 2.0 and 2.1.)
  * </p>
- * <p>
- * Note: Support for generic types is an experimental language feature 
- * under discussion in JSR-014 and under consideration for inclusion
- * in the 1.5 release of J2SE. The support here is therefore tentative
- * and subject to change.
- * </p>
  * 
  * @since 2.0
  */
@@ -147,14 +141,14 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
 	 */
 	public static List propertyDescriptors(int apiLevel) {
-		if (apiLevel == AST.LEVEL_2_0) {
+		if (apiLevel == AST.JLS2) {
 			return PROPERTY_DESCRIPTORS_2_0;
 		} else {
 			return PROPERTY_DESCRIPTORS_3_0;
@@ -214,7 +208,7 @@
 	 */
 	ClassInstanceCreation (AST ast) {
 		super(ast);
-		if (ast.apiLevel >= AST.LEVEL_3_0) {
+		if (ast.apiLevel >= AST.JLS3) {
 			this.typeArguments = new ASTNode.NodeList(TYPE_ARGUMENTS_PROPERTY);
 		}
 	}
@@ -297,10 +291,10 @@
 		result.setSourceRange(this.getStartPosition(), this.getLength());
 		result.setExpression(
 			(Expression) ASTNode.copySubtree(target, getExpression()));
-		if (this.ast.apiLevel == AST.LEVEL_2_0) {
+		if (this.ast.apiLevel == AST.JLS2) {
 			result.setName((Name) getName().clone(target));
 		}
-		if (this.ast.apiLevel >= AST.LEVEL_3_0) {
+		if (this.ast.apiLevel >= AST.JLS3) {
 			result.typeArguments().addAll(ASTNode.copySubtrees(target, typeArguments()));
 			result.setType((Type) getType().clone(target));
 		}
@@ -327,10 +321,10 @@
 		if (visitChildren) {
 			// visit children in normal left to right reading order
 			acceptChild(visitor, getExpression());
-			if (this.ast.apiLevel == AST.LEVEL_2_0) {
+			if (this.ast.apiLevel == AST.JLS2) {
 				acceptChild(visitor, getName());
 			}
-			if (this.ast.apiLevel >= AST.LEVEL_3_0) {
+			if (this.ast.apiLevel >= AST.JLS3) {
 				acceptChildren(visitor, this.typeArguments);
 				acceptChild(visitor, getType());
 			}
@@ -375,10 +369,10 @@
 	 * Returns the live ordered list of type arguments of this class
 	 * instance creation (added in 3.0 API).
 	 * <p>
-	 * Note: Support for generic types is an experimental language feature 
-	 * under discussion in JSR-014 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * Note: This API element is only needed for dealing with Java code that uses
+	 * new language features of J2SE 1.5. It is included in anticipation of J2SE
+	 * 1.5 support, which is planned for the next release of Eclipse after 3.0, and
+	 * may change slightly before reaching its final form.
 	 * </p>
 	 * 
 	 * @return the live list of type arguments
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CompilationUnit.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CompilationUnit.java
index 29082c9..1792e7a 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CompilationUnit.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/CompilationUnit.java
@@ -93,7 +93,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ConditionalExpression.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ConditionalExpression.java
index d716697..c954a88 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ConditionalExpression.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ConditionalExpression.java
@@ -66,7 +66,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ConstructorInvocation.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ConstructorInvocation.java
index d932887..ad34cdf 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ConstructorInvocation.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ConstructorInvocation.java
@@ -77,14 +77,14 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
 	 */
 	public static List propertyDescriptors(int apiLevel) {
-		if (apiLevel == AST.LEVEL_2_0) {
+		if (apiLevel == AST.JLS2) {
 			return PROPERTY_DESCRIPTORS_2_0;
 		} else {
 			return PROPERTY_DESCRIPTORS_3_0;
@@ -114,7 +114,7 @@
 	 */
 	ConstructorInvocation(AST ast) {
 		super(ast);	
-		if (ast.apiLevel >= AST.LEVEL_3_0) {
+		if (ast.apiLevel >= AST.JLS3) {
 			this.typeArguments = new ASTNode.NodeList(TYPE_ARGUMENTS_PROPERTY);
 		}
 	}
@@ -154,7 +154,7 @@
 		ConstructorInvocation result = new ConstructorInvocation(target);
 		result.setSourceRange(this.getStartPosition(), this.getLength());
 		result.copyLeadingComment(this);
-		if (this.ast.apiLevel >= AST.LEVEL_3_0) {
+		if (this.ast.apiLevel >= AST.JLS3) {
 			result.typeArguments().addAll(ASTNode.copySubtrees(target, typeArguments()));
 		}
 		result.arguments().addAll(ASTNode.copySubtrees(target, arguments()));
@@ -175,7 +175,7 @@
 	void accept0(ASTVisitor visitor) {
 		boolean visitChildren = visitor.visit(this);
 		if (visitChildren) {
-			if (this.ast.apiLevel >= AST.LEVEL_3_0) {
+			if (this.ast.apiLevel >= AST.JLS3) {
 				acceptChildren(visitor, this.typeArguments);
 			}
 			acceptChildren(visitor, this.arguments);
@@ -187,10 +187,10 @@
 	 * Returns the live ordered list of type arguments of this constructor
 	 * invocation (added in 3.0 API).
 	 * <p>
-	 * Note: Support for generic types is an experimental language feature 
-	 * under discussion in JSR-014 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * Note: This API element is only needed for dealing with Java code that uses
+	 * new language features of J2SE 1.5. It is included in anticipation of J2SE
+	 * 1.5 support, which is planned for the next release of Eclipse after 3.0, and
+	 * may change slightly before reaching its final form.
 	 * </p>
 	 * 
 	 * @return the live list of type arguments
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ContinueStatement.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ContinueStatement.java
index 83bee1b..2a9ce72 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ContinueStatement.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ContinueStatement.java
@@ -50,7 +50,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
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 7af873e..29fd676 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
@@ -547,26 +547,6 @@
 	/*
 	 * Method declared on BindingResolver.
 	 */
-	synchronized IVariableBinding resolveVariable(FieldDeclaration variable) {
-		final Object node = this.newAstToOldAst.get(variable);
-		if (node instanceof org.eclipse.jdt.internal.compiler.ast.FieldDeclaration) {
-			org.eclipse.jdt.internal.compiler.ast.FieldDeclaration fieldDeclaration = (org.eclipse.jdt.internal.compiler.ast.FieldDeclaration) node;
-			IVariableBinding variableBinding = this.getVariableBinding(fieldDeclaration.binding);
-			if (variableBinding == null) {
-				return null;
-			}
-			this.bindingsToAstNodes.put(variableBinding, variable);
-			String key = variableBinding.getKey();
-			if (key != null) {
-				this.bindingKeysToAstNodes.put(key, variable);				
-			}
-			return variableBinding;
-		}
-		return null;
-	}
-	/*
-	 * Method declared on BindingResolver.
-	 */
 	synchronized ITypeBinding resolveExpressionType(Expression expression) {
 		if (expression instanceof ClassInstanceCreation) {
 			org.eclipse.jdt.internal.compiler.ast.ASTNode astNode = (org.eclipse.jdt.internal.compiler.ast.ASTNode) this.newAstToOldAst.get(expression);
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DoStatement.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DoStatement.java
index 4ffe90b..78ab9d7 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DoStatement.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/DoStatement.java
@@ -58,7 +58,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/EmptyStatement.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/EmptyStatement.java
index 92d634b..7a3d367 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/EmptyStatement.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/EmptyStatement.java
@@ -42,7 +42,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/EnhancedForStatement.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/EnhancedForStatement.java
index 0b3fcef..7208937 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/EnhancedForStatement.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/EnhancedForStatement.java
@@ -24,10 +24,10 @@
  * The FormalParameter is represented by a <code>SingleVariableDeclaration</code>
  * (without an initializer).
  * <p>
- * Note: Enhanced for statements are an experimental language feature 
- * under discussion in JSR-201 and under consideration for inclusion
- * in the 1.5 release of J2SE. The support here is therefore tentative
- * and subject to change.
+ * Note: This API element is only needed for dealing with Java code that uses
+ * new language features of J2SE 1.5. It is included in anticipation of J2SE
+ * 1.5 support, which is planned for the next release of Eclipse after 3.0, and
+ * may change slightly before reaching its final form.
  * </p>
  * @since 3.0
  */
@@ -74,7 +74,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/EnumConstantDeclaration.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/EnumConstantDeclaration.java
index a216096..7173cdc 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/EnumConstantDeclaration.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/EnumConstantDeclaration.java
@@ -36,10 +36,10 @@
  * the last character of the identifier.
  * </p>
  * <p>
- * Note: Enum declarations are an experimental language feature 
- * under discussion in JSR-201 and under consideration for inclusion
- * in the 1.5 release of J2SE. The support here is therefore tentative
- * and subject to change.
+ * Note: This API element is only needed for dealing with Java code that uses
+ * new language features of J2SE 1.5. It is included in anticipation of J2SE
+ * 1.5 support, which is planned for the next release of Eclipse after 3.0, and
+ * may change slightly before reaching its final form.
  * </p>
  * 
  * @since 3.0
@@ -98,7 +98,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
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 ec65441..6009990 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
@@ -36,10 +36,10 @@
  * character of the "}" token following the body declarations.
  * </p>
  * <p>
- * Note: Enum declarations are an experimental language feature 
- * under discussion in JSR-201 and under consideration for inclusion
- * in the 1.5 release of J2SE. The support here is therefore tentative
- * and subject to change.
+ * Note: This API element is only needed for dealing with Java code that uses
+ * new language features of J2SE 1.5. It is included in anticipation of J2SE
+ * 1.5 support, which is planned for the next release of Eclipse after 3.0, and
+ * may change slightly before reaching its final form.
  * </p>
  * 
  * @since 3.0
@@ -97,7 +97,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ExpressionStatement.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ExpressionStatement.java
index 7cecced..da42abf 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ExpressionStatement.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ExpressionStatement.java
@@ -53,7 +53,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/FieldAccess.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/FieldAccess.java
index c82cdfb..5b49352 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/FieldAccess.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/FieldAccess.java
@@ -88,7 +88,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/FieldDeclaration.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/FieldDeclaration.java
index c5a5855..8ea3836 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/FieldDeclaration.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/FieldDeclaration.java
@@ -110,14 +110,14 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
 	 */
 	public static List propertyDescriptors(int apiLevel) {
-		if (apiLevel == AST.LEVEL_2_0) {
+		if (apiLevel == AST.JLS2) {
 			return PROPERTY_DESCRIPTORS_2_0;
 		} else {
 			return PROPERTY_DESCRIPTORS_3_0;
@@ -250,10 +250,10 @@
 		result.setSourceRange(this.getStartPosition(), this.getLength());
 		result.setJavadoc(
 			(Javadoc) ASTNode.copySubtree(target, getJavadoc()));
-		if (this.ast.apiLevel == AST.LEVEL_2_0) {
+		if (this.ast.apiLevel == AST.JLS2) {
 			result.setModifiers(getModifiers());
 		}
-		if (this.ast.apiLevel >= AST.LEVEL_3_0) {
+		if (this.ast.apiLevel >= AST.JLS3) {
 			result.modifiers().addAll(ASTNode.copySubtrees(target, modifiers()));
 		}
 		result.setType((Type) getType().clone(target));
@@ -278,7 +278,7 @@
 		if (visitChildren) {
 			// visit children in normal left to right reading order
 			acceptChild(visitor, getJavadoc());
-			if (this.ast.apiLevel >= AST.LEVEL_3_0) {
+			if (this.ast.apiLevel >= AST.JLS3) {
 				acceptChildren(visitor, this.modifiers);
 			}
 			acceptChild(visitor, getType());
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ForStatement.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ForStatement.java
index 6d95d01..50f7eda 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ForStatement.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ForStatement.java
@@ -83,7 +83,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IExtendedModifier.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IExtendedModifier.java
index fc6e714..594a0d8 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IExtendedModifier.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IExtendedModifier.java
@@ -18,12 +18,6 @@
  *   Modifier
  *   Annotation
  * </pre>
- * <p>
- * Note: Support for annotation metadata is an experimental language feature 
- * under discussion in JSR-175 and under consideration for inclusion
- * in the 1.5 release of J2SE. The support here is therefore tentative
- * and subject to change.
- * </p>
  * @since 3.0
  */
 public interface IExtendedModifier {
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IfStatement.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IfStatement.java
index 9012633..91c863b 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IfStatement.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/IfStatement.java
@@ -65,7 +65,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ImportDeclaration.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ImportDeclaration.java
index aaf9155..27a0413 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ImportDeclaration.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ImportDeclaration.java
@@ -26,13 +26,6 @@
  * ImportDeclaration:
  *    <b>import</b> [ <b>static</b> ] Name [ <b>.</b> <b>*</b> ] <b>;</b>
  * </pre>
- * 
- * <p>
- * Note: Static imports are an experimental language feature 
- * under discussion in JSR-201 and under consideration for inclusion
- * in the 1.5 release of J2SE. The support here is therefore tentative
- * and subject to change.
- * </p>
  * @since 2.0
  */
 public class ImportDeclaration extends ASTNode {
@@ -92,14 +85,14 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
 	 */
 	public static List propertyDescriptors(int apiLevel) {
-		if (apiLevel == AST.LEVEL_2_0) {
+		if (apiLevel == AST.JLS2) {
 			return PROPERTY_DESCRIPTORS_2_0;
 		} else {
 			return PROPERTY_DESCRIPTORS_3_0;
@@ -201,7 +194,7 @@
 		ImportDeclaration result = new ImportDeclaration(target);
 		result.setSourceRange(this.getStartPosition(), this.getLength());
 		result.setOnDemand(isOnDemand());
-		if (this.ast.apiLevel >= AST.LEVEL_3_0) {
+		if (this.ast.apiLevel >= AST.JLS3) {
 			result.setStatic(isStatic());
 		}
 		result.setName((Name) getName().clone(target));
@@ -308,10 +301,10 @@
 	/**
 	 * Returns whether this import declaration is a static import (added in 3.0 API).
 	 * <p>
-	 * Note: Static imports are an experimental language feature 
-	 * under discussion in JSR-201 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * Note: This API element is only needed for dealing with Java code that uses
+	 * new language features of J2SE 1.5. It is included in anticipation of J2SE
+	 * 1.5 support, which is planned for the next release of Eclipse after 3.0, and
+	 * may change slightly before reaching its final form.
 	 * </p>
 	 * 
 	 * @return <code>true</code> if this is a static import,
@@ -328,10 +321,10 @@
 	/**
 	 * Sets whether this import declaration is a static import (added in 3.0 API).
 	 * <p>
-	 * Note: Static imports are an experimental language feature 
-	 * under discussion in JSR-201 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * Note: This API element is only needed for dealing with Java code that uses
+	 * new language features of J2SE 1.5. It is included in anticipation of J2SE
+	 * 1.5 support, which is planned for the next release of Eclipse after 3.0, and
+	 * may change slightly before reaching its final form.
 	 * </p>
 	 * 
 	 * @param isStatic <code>true</code> if this is a static import,
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/InfixExpression.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/InfixExpression.java
index 6a4bfbd..06de8b1 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/InfixExpression.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/InfixExpression.java
@@ -220,7 +220,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Initializer.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Initializer.java
index 5d9f5d0..6b24a7f 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Initializer.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Initializer.java
@@ -88,14 +88,14 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
 	 */
 	public static List propertyDescriptors(int apiLevel) {
-		if (apiLevel == AST.LEVEL_2_0) {
+		if (apiLevel == AST.JLS2) {
 			return PROPERTY_DESCRIPTORS_2_0;
 		} else {
 			return PROPERTY_DESCRIPTORS_3_0;
@@ -214,10 +214,10 @@
 	ASTNode clone0(AST target) {
 		Initializer result = new Initializer(target);
 		result.setSourceRange(this.getStartPosition(), this.getLength());
-		if (this.ast.apiLevel == AST.LEVEL_2_0) {
+		if (this.ast.apiLevel == AST.JLS2) {
 			result.setModifiers(getModifiers());
 		}
-		if (this.ast.apiLevel >= AST.LEVEL_3_0) {
+		if (this.ast.apiLevel >= AST.JLS3) {
 			result.modifiers().addAll(ASTNode.copySubtrees(target, modifiers()));
 		}
 		result.setJavadoc(
@@ -241,7 +241,7 @@
 		boolean visitChildren = visitor.visit(this);
 		if (visitChildren) {
 			acceptChild(visitor, getJavadoc());
-			if (this.ast.apiLevel >= AST.LEVEL_3_0) {
+			if (this.ast.apiLevel >= AST.JLS3) {
 				acceptChildren(visitor, this.modifiers);
 			}
 			acceptChild(visitor, getBody());
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/InstanceofExpression.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/InstanceofExpression.java
index bdedacd..24dfff9 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/InstanceofExpression.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/InstanceofExpression.java
@@ -57,7 +57,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Javadoc.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Javadoc.java
index ccb935d..e5e3f6d 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Javadoc.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Javadoc.java
@@ -76,13 +76,13 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
 	 */
 	public static List propertyDescriptors(int apiLevel) {
-		if (apiLevel == AST.LEVEL_2_0) {
+		if (apiLevel == AST.JLS2) {
 			return PROPERTY_DESCRIPTORS_2_0;
 		} else {
 			return PROPERTY_DESCRIPTORS_3_0;
@@ -175,7 +175,7 @@
 	ASTNode clone0(AST target) {
 		Javadoc result = new Javadoc(target);
 		result.setSourceRange(this.getStartPosition(), this.getLength());
-		if (this.ast.apiLevel == AST.LEVEL_2_0) {
+		if (this.ast.apiLevel == AST.JLS2) {
 			result.setComment(getComment());
 		}
 		result.tags().addAll(ASTNode.copySubtrees(target, tags()));
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/LabeledStatement.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/LabeledStatement.java
index 7c04756..08d8436 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/LabeledStatement.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/LabeledStatement.java
@@ -58,7 +58,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/LineComment.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/LineComment.java
index cc8fd85..15ec4a6 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/LineComment.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/LineComment.java
@@ -47,7 +47,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MarkerAnnotation.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MarkerAnnotation.java
index cd25047..c8f1a6e 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MarkerAnnotation.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MarkerAnnotation.java
@@ -22,10 +22,10 @@
  * </pre>
  * </p>
  * <p>
- * Note: Support for annotation metadata is an experimental language feature 
- * under discussion in JSR-175 and under consideration for inclusion
- * in the 1.5 release of J2SE. The support here is therefore tentative
- * and subject to change.
+ * Note: This API element is only needed for dealing with Java code that uses
+ * new language features of J2SE 1.5. It is included in anticipation of J2SE
+ * 1.5 support, which is planned for the next release of Eclipse after 3.0, and
+ * may change slightly before reaching its final form.
  * </p>
  * @since 3.0
  */
@@ -56,7 +56,7 @@
 	 * Returns a list of structural property descriptors for this node type.
 	 * Clients must not modify the result.
 	 * 
-	 * @param apiLevel the API level; one of the AST.LEVEL_* constants
+	 * @param apiLevel the API level; one of the AST.JLS* constants
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MemberRef.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MemberRef.java
index 256eb8d..306ef4e 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MemberRef.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MemberRef.java
@@ -60,7 +60,7 @@
 	 * Returns a list of structural property descriptors for this node type.
 	 * Clients must not modify the result.
 	 * 
-	 * @param apiLevel the API level; one of the AST.LEVEL_* constants
+	 * @param apiLevel the API level; one of the AST.JLS* constants
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MemberValuePair.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MemberValuePair.java
index cf3b219..c3e576b 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MemberValuePair.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MemberValuePair.java
@@ -24,10 +24,10 @@
  * including other annotations.
  * </p>
  * <p>
- * Note: Support for annotation metadata is an experimental language feature 
- * under discussion in JSR-175 and under consideration for inclusion
- * in the 1.5 release of J2SE. The support here is therefore tentative
- * and subject to change.
+ * Note: This API element is only needed for dealing with Java code that uses
+ * new language features of J2SE 1.5. It is included in anticipation of J2SE
+ * 1.5 support, which is planned for the next release of Eclipse after 3.0, and
+ * may change slightly before reaching its final form.
  * </p>
  * @see NormalAnnotation
  * @since 3.0
@@ -66,7 +66,7 @@
 	 * Returns a list of structural property descriptors for this node type.
 	 * Clients must not modify the result.
 	 * 
-	 * @param apiLevel the API level; one of the AST.LEVEL_* constants
+	 * @param apiLevel the API level; one of the AST.JLS* constants
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 */
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodDeclaration.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodDeclaration.java
index a432ea9..8962835 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodDeclaration.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodDeclaration.java
@@ -57,12 +57,6 @@
  * no modifiers). The source range extends through the last character of the
  * ";" token (if no body), or the last character of the block (if body).
  * </p>
- * <p>
- * Note: Support for generic types is an experimental language feature 
- * under discussion in JSR-014 and under consideration for inclusion
- * in the 1.5 release of J2SE. The support here is therefore tentative
- * and subject to change.
- * </p>
  *
  * @since 2.0 
  */
@@ -201,13 +195,13 @@
 	 * Returns a list of structural property descriptors for this node type.
 	 * Clients must not modify the result.
 	 * 
-	 * @param apiLevel the API level; one of the AST.LEVEL_* constants
+	 * @param apiLevel the API level; one of the AST.JLS* constants
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
 	 */
 	public static List propertyDescriptors(int apiLevel) {
-		if (apiLevel == AST.LEVEL_2_0) {
+		if (apiLevel == AST.JLS2) {
 			return PROPERTY_DESCRIPTORS_2_0;
 		} else {
 			return PROPERTY_DESCRIPTORS_3_0;
@@ -294,7 +288,7 @@
 	 */
 	MethodDeclaration(AST ast) {
 		super(ast);
-		if (ast.apiLevel >= AST.LEVEL_3_0) {
+		if (ast.apiLevel >= AST.JLS3) {
 			this.typeParameters = new ASTNode.NodeList(TYPE_PARAMETERS_PROPERTY);
 		}
 	}
@@ -451,12 +445,12 @@
 		result.setSourceRange(this.getStartPosition(), this.getLength());
 		result.setJavadoc(
 			(Javadoc) ASTNode.copySubtree(target, getJavadoc()));
-		if (this.ast.apiLevel == AST.LEVEL_2_0) {
+		if (this.ast.apiLevel == AST.JLS2) {
 			result.setModifiers(getModifiers());
 			result.setReturnType(
 					(Type) ASTNode.copySubtree(target, getReturnType()));
 		}
-		if (this.ast.apiLevel >= AST.LEVEL_3_0) {
+		if (this.ast.apiLevel >= AST.JLS3) {
 			result.modifiers().addAll(ASTNode.copySubtrees(target, modifiers()));
 			result.typeParameters().addAll(
 					ASTNode.copySubtrees(target, typeParameters()));
@@ -491,7 +485,7 @@
 		if (visitChildren) {
 			// visit children in normal left to right reading order
 			acceptChild(visitor, getJavadoc());
-			if (this.ast.apiLevel == AST.LEVEL_2_0) {
+			if (this.ast.apiLevel == AST.JLS2) {
 				acceptChild(visitor, getReturnType());
 			} else {
 				acceptChildren(visitor, this.modifiers);
@@ -539,10 +533,10 @@
 	 * available.
 	 * </p>
 	 * <p>
-	 * Note: Support for generic types is an experimental language feature 
-	 * under discussion in JSR-014 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * Note: This API element is only needed for dealing with Java code that uses
+	 * new language features of J2SE 1.5. It is included in anticipation of J2SE
+	 * 1.5 support, which is planned for the next release of Eclipse after 3.0, and
+	 * may change slightly before reaching its final form.
 	 * </p>
 	 * 
 	 * @return the live list of type parameters
@@ -618,10 +612,10 @@
 	 * variable arity method (added in 3.0 API). The convenience method checks
 	 * whether the last parameter is so marked.
 	 * <p>
-	 * Note: Varible arity methods are an experimental language feature 
-	 * under discussion in JSR-201 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * Note: This API element is only needed for dealing with Java code that uses
+	 * new language features of J2SE 1.5. It is included in anticipation of J2SE
+	 * 1.5 support, which is planned for the next release of Eclipse after 3.0, and
+	 * may change slightly before reaching its final form.
 	 * </p>
 	 * 
 	 * @return <code>true</code> if this is a variable arity method declaration,
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodInvocation.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodInvocation.java
index ea34cde..edca58d 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodInvocation.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodInvocation.java
@@ -97,14 +97,14 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
 	 */
 	public static List propertyDescriptors(int apiLevel) {
-		if (apiLevel == AST.LEVEL_2_0) {
+		if (apiLevel == AST.JLS2) {
 			return PROPERTY_DESCRIPTORS_2_0;
 		} else {
 			return PROPERTY_DESCRIPTORS_3_0;
@@ -146,7 +146,7 @@
 	 */
 	MethodInvocation(AST ast) {
 		super(ast);	
-		if (ast.apiLevel >= AST.LEVEL_3_0) {
+		if (ast.apiLevel >= AST.JLS3) {
 			this.typeArguments = new ASTNode.NodeList(TYPE_ARGUMENTS_PROPERTY);
 		}
 	}
@@ -212,7 +212,7 @@
 		result.setName((SimpleName) getName().clone(target));
 		result.setExpression(
 			(Expression) ASTNode.copySubtree(target, getExpression()));
-		if (this.ast.apiLevel >= AST.LEVEL_3_0) {
+		if (this.ast.apiLevel >= AST.JLS3) {
 			result.typeArguments().addAll(ASTNode.copySubtrees(target, typeArguments()));
 		}
 		result.arguments().addAll(ASTNode.copySubtrees(target, arguments()));
@@ -235,7 +235,7 @@
 		if (visitChildren) {
 			// visit children in normal left to right reading order
 			acceptChild(visitor, getExpression());
-			if (this.ast.apiLevel >= AST.LEVEL_3_0) {
+			if (this.ast.apiLevel >= AST.JLS3) {
 				acceptChildren(visitor, this.typeArguments);
 			}
 			acceptChild(visitor, getName());
@@ -277,10 +277,10 @@
 	 * Returns the live ordered list of type arguments of this method
 	 * invocation (added in 3.0 API).
 	 * <p>
-	 * Note: Support for generic types is an experimental language feature 
-	 * under discussion in JSR-014 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * Note: This API element is only needed for dealing with Java code that uses
+	 * new language features of J2SE 1.5. It is included in anticipation of J2SE
+	 * 1.5 support, which is planned for the next release of Eclipse after 3.0, and
+	 * may change slightly before reaching its final form.
 	 * </p>
 	 * 
 	 * @return the live list of type arguments
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodRef.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodRef.java
index de2643f..ab1307d 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodRef.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodRef.java
@@ -68,7 +68,7 @@
 	 * Returns a list of structural property descriptors for this node type.
 	 * Clients must not modify the result.
 	 * 
-	 * @param apiLevel the API level; one of the AST.LEVEL_* constants
+	 * @param apiLevel the API level; one of the AST.JLS* constants
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodRefParameter.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodRefParameter.java
index a3b56ca..207bced 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodRefParameter.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/MethodRefParameter.java
@@ -58,7 +58,7 @@
 	 * Returns a list of structural property descriptors for this node type.
 	 * Clients must not modify the result.
 	 * 
-	 * @param apiLevel the API level; one of the AST.LEVEL_* constants
+	 * @param apiLevel the API level; one of the AST.JLS* constants
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Modifier.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Modifier.java
index f3ed4cf..f28f11a 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Modifier.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Modifier.java
@@ -37,12 +37,6 @@
  * Note that Java model class {@link org.eclipse.jdt.core.Flags} also
  * provides the same constants as this class.
  * </p>
- * <p>
- * Note: Support for annotation metadata is an experimental language feature 
- * under discussion in JSR-175 and under consideration for inclusion
- * in the 1.5 release of J2SE. The support here is therefore tentative
- * and subject to change.
- * </p>
  * 
  * @since 2.0
  */
@@ -450,7 +444,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/NaiveASTFlattener.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/NaiveASTFlattener.java
index ef17214..d6cbaeb 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/NaiveASTFlattener.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/NaiveASTFlattener.java
@@ -349,10 +349,10 @@
 			this.buffer.append(".");//$NON-NLS-1$
 		}
 		this.buffer.append("new ");//$NON-NLS-1$
-		if (node.getAST().apiLevel() == AST.LEVEL_2_0) {
+		if (node.getAST().apiLevel() == AST.JLS2) {
 			node.getName().accept(this);
 		}
-		if (node.getAST().apiLevel() >= AST.LEVEL_3_0) {
+		if (node.getAST().apiLevel() >= AST.JLS3) {
 			if (!node.typeArguments().isEmpty()) {
 				this.buffer.append("<");//$NON-NLS-1$
 				for (Iterator it = node.typeArguments().iterator(); it.hasNext(); ) {
@@ -415,7 +415,7 @@
 	 * @see ASTVisitor#visit(ConstructorInvocation)
 	 */
 	public boolean visit(ConstructorInvocation node) {
-		if (node.getAST().apiLevel() >= AST.LEVEL_3_0) {
+		if (node.getAST().apiLevel() >= AST.JLS3) {
 			if (!node.typeArguments().isEmpty()) {
 				this.buffer.append("<");//$NON-NLS-1$
 				for (Iterator it = node.typeArguments().iterator(); it.hasNext(); ) {
@@ -589,10 +589,10 @@
 		if (node.getJavadoc() != null) {
 			node.getJavadoc().accept(this);
 		}
-		if (node.getAST().apiLevel() == AST.LEVEL_2_0) {
+		if (node.getAST().apiLevel() == AST.JLS2) {
 			printModifiers(node.getModifiers());
 		}
-		if (node.getAST().apiLevel() >= AST.LEVEL_3_0) {
+		if (node.getAST().apiLevel() >= AST.JLS3) {
 			printModifiers(node.modifiers());
 		}
 		node.getType().accept(this);
@@ -651,7 +651,7 @@
 	 */
 	public boolean visit(ImportDeclaration node) {
 		this.buffer.append("import ");//$NON-NLS-1$
-		if (node.getAST().apiLevel() >= AST.LEVEL_3_0) {
+		if (node.getAST().apiLevel() >= AST.JLS3) {
 			if (node.isStatic()) {
 				this.buffer.append("static ");//$NON-NLS-1$
 			}
@@ -698,10 +698,10 @@
 		if (node.getJavadoc() != null) {
 			node.getJavadoc().accept(this);
 		}
-		if (node.getAST().apiLevel() == AST.LEVEL_2_0) {
+		if (node.getAST().apiLevel() == AST.JLS2) {
 			printModifiers(node.getModifiers());
 		}
-		if (node.getAST().apiLevel() >= AST.LEVEL_3_0) {
+		if (node.getAST().apiLevel() >= AST.JLS3) {
 			printModifiers(node.modifiers());
 		}
 		node.getBody().accept(this);
@@ -816,10 +816,10 @@
 		if (node.getJavadoc() != null) {
 			node.getJavadoc().accept(this);
 		}
-		if (node.getAST().apiLevel() == AST.LEVEL_2_0) {
+		if (node.getAST().apiLevel() == AST.JLS2) {
 			printModifiers(node.getModifiers());
 		}
-		if (node.getAST().apiLevel() >= AST.LEVEL_3_0) {
+		if (node.getAST().apiLevel() >= AST.JLS3) {
 			printModifiers(node.modifiers());
 			if (!node.typeParameters().isEmpty()) {
 				this.buffer.append("<");//$NON-NLS-1$
@@ -834,7 +834,7 @@
 			}
 		}
 		if (!node.isConstructor()) {
-			if (node.getAST().apiLevel() == AST.LEVEL_2_0) {
+			if (node.getAST().apiLevel() == AST.JLS2) {
 				node.getReturnType().accept(this);
 			} else {
 				if (node.getReturnType2() != null) {
@@ -886,7 +886,7 @@
 			node.getExpression().accept(this);
 			this.buffer.append(".");//$NON-NLS-1$
 		}
-		if (node.getAST().apiLevel() >= AST.LEVEL_3_0) {
+		if (node.getAST().apiLevel() >= AST.JLS3) {
 			if (!node.typeArguments().isEmpty()) {
 				this.buffer.append("<");//$NON-NLS-1$
 				for (Iterator it = node.typeArguments().iterator(); it.hasNext(); ) {
@@ -960,7 +960,7 @@
 	 * @see ASTVisitor#visit(PackageDeclaration)
 	 */
 	public boolean visit(PackageDeclaration node) {
-		if (node.getAST().apiLevel() >= AST.LEVEL_3_0) {
+		if (node.getAST().apiLevel() >= AST.JLS3) {
 			if (node.getJavadoc() != null) {
 				node.getJavadoc().accept(this);
 			}
@@ -977,10 +977,6 @@
 	}
 
 	/*
-	 * Note: Support for generic types is an experimental language feature 
-	 * under discussion in JSR-014 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
 	 * @see ASTVisitor#visit(ParameterizedType)
 	 * @since 3.0
 	 */
@@ -1100,14 +1096,14 @@
 	 * @see ASTVisitor#visit(SingleVariableDeclaration)
 	 */
 	public boolean visit(SingleVariableDeclaration node) {
-		if (node.getAST().apiLevel() == AST.LEVEL_2_0) {
+		if (node.getAST().apiLevel() == AST.JLS2) {
 			printModifiers(node.getModifiers());
 		}
-		if (node.getAST().apiLevel() >= AST.LEVEL_3_0) {
+		if (node.getAST().apiLevel() >= AST.JLS3) {
 			printModifiers(node.modifiers());
 		}
 		node.getType().accept(this);
-		if (node.getAST().apiLevel() >= AST.LEVEL_3_0) {
+		if (node.getAST().apiLevel() >= AST.JLS3) {
 			if (node.isVarargs()) {
 				this.buffer.append("...");//$NON-NLS-1$
 			}
@@ -1140,7 +1136,7 @@
 			node.getExpression().accept(this);
 			this.buffer.append(".");//$NON-NLS-1$
 		}
-		if (node.getAST().apiLevel() >= AST.LEVEL_3_0) {
+		if (node.getAST().apiLevel() >= AST.JLS3) {
 			if (!node.typeArguments().isEmpty()) {
 				this.buffer.append("<");//$NON-NLS-1$
 				for (Iterator it = node.typeArguments().iterator(); it.hasNext(); ) {
@@ -1187,7 +1183,7 @@
 			this.buffer.append(".");//$NON-NLS-1$
 		}
 		this.buffer.append("super.");//$NON-NLS-1$
-		if (node.getAST().apiLevel() >= AST.LEVEL_3_0) {
+		if (node.getAST().apiLevel() >= AST.JLS3) {
 			if (!node.typeArguments().isEmpty()) {
 				this.buffer.append("<");//$NON-NLS-1$
 				for (Iterator it = node.typeArguments().iterator(); it.hasNext(); ) {
@@ -1350,15 +1346,15 @@
 		if (node.getJavadoc() != null) {
 			node.getJavadoc().accept(this);
 		}
-		if (node.getAST().apiLevel() == AST.LEVEL_2_0) {
+		if (node.getAST().apiLevel() == AST.JLS2) {
 			printModifiers(node.getModifiers());
 		}
-		if (node.getAST().apiLevel() >= AST.LEVEL_3_0) {
+		if (node.getAST().apiLevel() >= AST.JLS3) {
 			printModifiers(node.modifiers());
 		}
 		this.buffer.append(node.isInterface() ? "interface " : "class ");//$NON-NLS-2$//$NON-NLS-1$
 		node.getName().accept(this);
-		if (node.getAST().apiLevel() >= AST.LEVEL_3_0) {
+		if (node.getAST().apiLevel() >= AST.JLS3) {
 			if (!node.typeParameters().isEmpty()) {
 				this.buffer.append("<");//$NON-NLS-1$
 				for (Iterator it = node.typeParameters().iterator(); it.hasNext(); ) {
@@ -1372,7 +1368,7 @@
 			}
 		}
 		this.buffer.append(" ");//$NON-NLS-1$
-		if (node.getAST().apiLevel() == AST.LEVEL_2_0) {
+		if (node.getAST().apiLevel() == AST.JLS2) {
 			if (node.getSuperclass() != null) {
 				this.buffer.append("extends ");//$NON-NLS-1$
 				node.getSuperclass().accept(this);
@@ -1390,7 +1386,7 @@
 				this.buffer.append(" ");//$NON-NLS-1$
 			}
 		}
-		if (node.getAST().apiLevel() >= AST.LEVEL_3_0) {
+		if (node.getAST().apiLevel() >= AST.JLS3) {
 			if (node.getSuperclassType() != null) {
 				this.buffer.append("extends ");//$NON-NLS-1$
 				node.getSuperclassType().accept(this);
@@ -1433,10 +1429,10 @@
 	 * @see ASTVisitor#visit(TypeDeclarationStatement)
 	 */
 	public boolean visit(TypeDeclarationStatement node) {
-		if (node.getAST().apiLevel() == AST.LEVEL_2_0) {
+		if (node.getAST().apiLevel() == AST.JLS2) {
 			node.getTypeDeclaration().accept(this);
 		}
-		if (node.getAST().apiLevel() >= AST.LEVEL_3_0) {
+		if (node.getAST().apiLevel() >= AST.JLS3) {
 			node.getDeclaration().accept(this);
 		}
 		return false;
@@ -1452,10 +1448,6 @@
 	}
 
 	/*
-	 * Note: Support for generic types is an experimental language feature 
-	 * under discussion in JSR-014 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
 	 * @see ASTVisitor#visit(TypeParameter)
 	 * @since 3.0
 	 */
@@ -1478,10 +1470,10 @@
 	 * @see ASTVisitor#visit(VariableDeclarationExpression)
 	 */
 	public boolean visit(VariableDeclarationExpression node) {
-		if (node.getAST().apiLevel() == AST.LEVEL_2_0) {
+		if (node.getAST().apiLevel() == AST.JLS2) {
 			printModifiers(node.getModifiers());
 		}
-		if (node.getAST().apiLevel() >= AST.LEVEL_3_0) {
+		if (node.getAST().apiLevel() >= AST.JLS3) {
 			printModifiers(node.modifiers());
 		}
 		node.getType().accept(this);
@@ -1515,10 +1507,10 @@
 	 * @see ASTVisitor#visit(VariableDeclarationStatement)
 	 */
 	public boolean visit(VariableDeclarationStatement node) {
-		if (node.getAST().apiLevel() == AST.LEVEL_2_0) {
+		if (node.getAST().apiLevel() == AST.JLS2) {
 			printModifiers(node.getModifiers());
 		}
-		if (node.getAST().apiLevel() >= AST.LEVEL_3_0) {
+		if (node.getAST().apiLevel() >= AST.JLS3) {
 			printModifiers(node.modifiers());
 		}
 		node.getType().accept(this);
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/NormalAnnotation.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/NormalAnnotation.java
index baf1abe..9c97905 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/NormalAnnotation.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/NormalAnnotation.java
@@ -21,10 +21,10 @@
  * </pre>
  * </p>
  * <p>
- * Note: Support for annotation metadata is an experimental language feature 
- * under discussion in JSR-175 and under consideration for inclusion
- * in the 1.5 release of J2SE. The support here is therefore tentative
- * and subject to change.
+ * Note: This API element is only needed for dealing with Java code that uses
+ * new language features of J2SE 1.5. It is included in anticipation of J2SE
+ * 1.5 support, which is planned for the next release of Eclipse after 3.0, and
+ * may change slightly before reaching its final form.
  * </p>
  * @since 3.0
  */
@@ -62,7 +62,7 @@
 	 * Returns a list of structural property descriptors for this node type.
 	 * Clients must not modify the result.
 	 * 
-	 * @param apiLevel the API level; one of the AST.LEVEL_* constants
+	 * @param apiLevel the API level; one of the AST.JLS* constants
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/NullLiteral.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/NullLiteral.java
index 370ddfa..ae6ac0e 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/NullLiteral.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/NullLiteral.java
@@ -37,7 +37,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/NumberLiteral.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/NumberLiteral.java
index 7cf1772..c55f158 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/NumberLiteral.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/NumberLiteral.java
@@ -49,7 +49,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/PackageDeclaration.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/PackageDeclaration.java
index 82e6688..0c63088 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/PackageDeclaration.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/PackageDeclaration.java
@@ -26,12 +26,6 @@
  * PackageDeclaration:
  *    [ Javadoc ] { Annotation } <b>package</b> Name <b>;</b>
  * </pre>
- * <p>
- * Note: Support for annotation metadata is an experimental language feature 
- * under discussion in JSR-175 and under consideration for inclusion
- * in the 1.5 release of J2SE. The support here is therefore tentative
- * and subject to change.
- * </p>
  * 
  * @since 2.0
  */
@@ -91,14 +85,14 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
 	 */
 	public static List propertyDescriptors(int apiLevel) {
-		if (apiLevel == AST.LEVEL_2_0) {
+		if (apiLevel == AST.JLS2) {
 			return PROPERTY_DESCRIPTORS_2_0;
 		} else {
 			return PROPERTY_DESCRIPTORS_3_0;
@@ -140,7 +134,7 @@
 	 */
 	PackageDeclaration(AST ast) {
 		super(ast);
-		if (ast.apiLevel >= AST.LEVEL_3_0) {
+		if (ast.apiLevel >= AST.JLS3) {
 			this.annotations = new ASTNode.NodeList(ANNOTATIONS_PROPERTY);
 		}
 	}
@@ -200,7 +194,7 @@
 	ASTNode clone0(AST target) {
 		PackageDeclaration result = new PackageDeclaration(target);
 		result.setSourceRange(this.getStartPosition(), this.getLength());
-		if (this.ast.apiLevel >= AST.LEVEL_3_0) {
+		if (this.ast.apiLevel >= AST.JLS3) {
 			result.setJavadoc((Javadoc) ASTNode.copySubtree(target, getJavadoc()));
 			result.annotations().addAll(ASTNode.copySubtrees(target, annotations()));
 		}
@@ -222,7 +216,7 @@
 	void accept0(ASTVisitor visitor) {
 		boolean visitChildren = visitor.visit(this);
 		if (visitChildren) {
-			if (this.ast.apiLevel >= AST.LEVEL_3_0) {
+			if (this.ast.apiLevel >= AST.JLS3) {
 				acceptChild(visitor, getJavadoc());
 				acceptChildren(visitor, this.annotations);
 			}
@@ -235,10 +229,10 @@
 	 * Returns the live ordered list of annotations of this 
 	 * package declaration (added in 3.0 API).
 	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * Note: This API element is only needed for dealing with Java code that uses
+	 * new language features of J2SE 1.5. It is included in anticipation of J2SE
+	 * 1.5 support, which is planned for the next release of Eclipse after 3.0, and
+	 * may change slightly before reaching its final form.
 	 * </p>
 	 * 
 	 * @return the live list of annotations
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ParameterizedType.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ParameterizedType.java
index a4a5a9f..aa74acc 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ParameterizedType.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ParameterizedType.java
@@ -24,10 +24,10 @@
  * The first type may be a simple type or a qualified type;
  * other kinds of types are meaningless.
  * <p>
- * Note: Support for generic types is an experimental language feature 
- * under discussion in JSR-014 and under consideration for inclusion
- * in the 1.5 release of J2SE. The support here is therefore tentative
- * and subject to change.
+ * Note: This API element is only needed for dealing with Java code that uses
+ * new language features of J2SE 1.5. It is included in anticipation of J2SE
+ * 1.5 support, which is planned for the next release of Eclipse after 3.0, and
+ * may change slightly before reaching its final form.
  * </p>
  * 
  * @since 3.0
@@ -67,7 +67,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ParenthesizedExpression.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ParenthesizedExpression.java
index 93a13e0..f8a9435 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ParenthesizedExpression.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ParenthesizedExpression.java
@@ -50,7 +50,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/PostfixExpression.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/PostfixExpression.java
index 97bda23..18e312a 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/PostfixExpression.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/PostfixExpression.java
@@ -135,7 +135,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/PrefixExpression.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/PrefixExpression.java
index 84fa290..f483663 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/PrefixExpression.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/PrefixExpression.java
@@ -151,7 +151,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/PrimitiveType.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/PrimitiveType.java
index e8d9f6c..896d719 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/PrimitiveType.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/PrimitiveType.java
@@ -177,7 +177,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/QualifiedName.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/QualifiedName.java
index a1ba48c..c00899e 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/QualifiedName.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/QualifiedName.java
@@ -65,7 +65,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/QualifiedType.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/QualifiedType.java
index 1a47680..8a16009 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/QualifiedType.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/QualifiedType.java
@@ -39,12 +39,6 @@
  * either rather than make assumptions. (Note also that the first form
  * became possible as of 3.0; only the second form existed in 2.0 and 2.1.)
  * </p>
- * <p>
- * Note: Support for generic types is an experimental language feature 
- * under discussion in JSR-014 and under consideration for inclusion
- * in the 1.5 release of J2SE. The support here is therefore tentative
- * and subject to change.
- * </p>
  * 
  * @since 3.0
  */
@@ -83,7 +77,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ReturnStatement.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ReturnStatement.java
index 8cc7d9c..1815814 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ReturnStatement.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ReturnStatement.java
@@ -50,7 +50,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SimpleName.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SimpleName.java
index 11854bd..f80bce1 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SimpleName.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SimpleName.java
@@ -55,7 +55,7 @@
 	 * Returns a list of structural property descriptors for this node type.
 	 * Clients must not modify the result.
 	 * 
-	 * @param apiLevel the API level; one of the AST.LEVEL_* constants
+	 * @param apiLevel the API level; one of the AST.JLS* constants
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SimpleType.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SimpleType.java
index be97f4e..445f503 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SimpleType.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SimpleType.java
@@ -19,12 +19,6 @@
  * This kind of node is used to convert a name (<code>Name</code>) into a type
  * (<code>Type</code>) by wrapping it.
  * </p>
- * <p>
- * Note: Support for generic types is an experimental language feature 
- * under discussion in JSR-014 and under consideration for inclusion
- * in the 1.5 release of J2SE. The support here is therefore tentative
- * and subject to change.
- * </p>
  * 
  * @since 2.0
  */
@@ -55,7 +49,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SingleMemberAnnotation.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SingleMemberAnnotation.java
index f3fbf5a..ff3c053 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SingleMemberAnnotation.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SingleMemberAnnotation.java
@@ -24,10 +24,10 @@
  * including other annotations.
  * </p>
  * <p>
- * Note: Support for annotation metadata is an experimental language feature 
- * under discussion in JSR-175 and under consideration for inclusion
- * in the 1.5 release of J2SE. The support here is therefore tentative
- * and subject to change.
+ * Note: This API element is only needed for dealing with Java code that uses
+ * new language features of J2SE 1.5. It is included in anticipation of J2SE
+ * 1.5 support, which is planned for the next release of Eclipse after 3.0, and
+ * may change slightly before reaching its final form.
  * </p>
  * @since 3.0
  */
@@ -66,7 +66,7 @@
 	 * Returns a list of structural property descriptors for this node type.
 	 * Clients must not modify the result.
 	 * 
-	 * @param apiLevel the API level; one of the AST.LEVEL_* constants
+	 * @param apiLevel the API level; one of the AST.JLS* constants
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SingleVariableDeclaration.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SingleVariableDeclaration.java
index 32cd478..2f22804 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SingleVariableDeclaration.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SingleVariableDeclaration.java
@@ -126,13 +126,13 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
 	 */
 	public static List propertyDescriptors(int apiLevel) {
-		if (apiLevel == AST.LEVEL_2_0) {
+		if (apiLevel == AST.JLS2) {
 			return PROPERTY_DESCRIPTORS_2_0;
 		} else {
 			return PROPERTY_DESCRIPTORS_3_0;
@@ -201,7 +201,7 @@
 	 */
 	SingleVariableDeclaration(AST ast) {
 		super(ast);
-		if (ast.apiLevel >= AST.LEVEL_3_0) {
+		if (ast.apiLevel >= AST.JLS3) {
 			this.modifiers = new ASTNode.NodeList(MODIFIERS2_PROPERTY);
 		}
 	}
@@ -309,7 +309,7 @@
 	ASTNode clone0(AST target) {
 		SingleVariableDeclaration result = new SingleVariableDeclaration(target);
 		result.setSourceRange(this.getStartPosition(), this.getLength());
-		if (this.ast.apiLevel == AST.LEVEL_2_0) {
+		if (this.ast.apiLevel == AST.JLS2) {
 			result.setModifiers(getModifiers());
 		} else {
 			result.modifiers().addAll(ASTNode.copySubtrees(target, modifiers()));
@@ -338,7 +338,7 @@
 		boolean visitChildren = visitor.visit(this);
 		if (visitChildren) {
 			// visit children in normal left to right reading order
-			if (this.ast.apiLevel >= AST.LEVEL_3_0) {
+			if (this.ast.apiLevel >= AST.JLS3) {
 				acceptChildren(visitor, this.modifiers);
 			}
 			acceptChild(visitor, getType());
@@ -355,12 +355,6 @@
 	 * Note that the final modifier is the only meaningful modifier for local
 	 * variable and formal parameter declarations.
 	 * </p>
-	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @return the live list of modifiers and annotations
 	 *    (element type: <code>IExtendedModifier</code>)
@@ -502,10 +496,10 @@
 	 * Returns whether this declaration declares the last parameter of
 	 * a variable arity method (added in 3.0 API).
 	 * <p>
-	 * Note: Varible arity methods are an experimental language feature 
-	 * under discussion in JSR-201 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * Note: This API element is only needed for dealing with Java code that uses
+	 * new language features of J2SE 1.5. It is included in anticipation of J2SE
+	 * 1.5 support, which is planned for the next release of Eclipse after 3.0, and
+	 * may change slightly before reaching its final form.
 	 * </p>
 	 * 
 	 * @return <code>true</code> if this is a variable arity parameter declaration,
@@ -526,10 +520,10 @@
 	 * Sets whether this declaration declares the last parameter of
 	 * a variable arity method (added in 3.0 API).
 	 * <p>
-	 * Note: Varible arity methods are an experimental language feature 
-	 * under discussion in JSR-201 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * Note: This API element is only needed for dealing with Java code that uses
+	 * new language features of J2SE 1.5. It is included in anticipation of J2SE
+	 * 1.5 support, which is planned for the next release of Eclipse after 3.0, and
+	 * may change slightly before reaching its final form.
 	 * </p>
 	 * 
 	 * @param variableArity <code>true</code> if this is a variable arity
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/StringLiteral.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/StringLiteral.java
index fb206a5..a5dcca1 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/StringLiteral.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/StringLiteral.java
@@ -49,7 +49,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SuperConstructorInvocation.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SuperConstructorInvocation.java
index 45c2cf3..cd7f3f8 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SuperConstructorInvocation.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SuperConstructorInvocation.java
@@ -87,14 +87,14 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
 	 */
 	public static List propertyDescriptors(int apiLevel) {
-		if (apiLevel == AST.LEVEL_2_0) {
+		if (apiLevel == AST.JLS2) {
 			return PROPERTY_DESCRIPTORS_2_0;
 		} else {
 			return PROPERTY_DESCRIPTORS_3_0;
@@ -130,7 +130,7 @@
 	 */
 	SuperConstructorInvocation(AST ast) {
 		super(ast);	
-		if (ast.apiLevel >= AST.LEVEL_3_0) {
+		if (ast.apiLevel >= AST.JLS3) {
 			this.typeArguments = new ASTNode.NodeList(TYPE_ARGUMENTS_PROPERTY);
 		}
 	}
@@ -188,7 +188,7 @@
 		result.copyLeadingComment(this);
 		result.setExpression(
 			(Expression) ASTNode.copySubtree(target, getExpression()));
-		if (this.ast.apiLevel >= AST.LEVEL_3_0) {
+		if (this.ast.apiLevel >= AST.JLS3) {
 			result.typeArguments().addAll(ASTNode.copySubtrees(target, typeArguments()));
 		}
 		result.arguments().addAll(ASTNode.copySubtrees(target, arguments()));
@@ -211,7 +211,7 @@
 		if (visitChildren) {
 			// visit children in normal left to right reading order
 			acceptChild(visitor, getExpression());
-			if (this.ast.apiLevel >= AST.LEVEL_3_0) {
+			if (this.ast.apiLevel >= AST.JLS3) {
 				acceptChildren(visitor, this.typeArguments);
 			}
 			acceptChildren(visitor, this.arguments);
@@ -253,10 +253,10 @@
 	 * Returns the live ordered list of type arguments of this constructor
 	 * invocation (added in 3.0 API).
 	 * <p>
-	 * Note: Support for generic types is an experimental language feature 
-	 * under discussion in JSR-014 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * Note: This API element is only needed for dealing with Java code that uses
+	 * new language features of J2SE 1.5. It is included in anticipation of J2SE
+	 * 1.5 support, which is planned for the next release of Eclipse after 3.0, and
+	 * may change slightly before reaching its final form.
 	 * </p>
 	 * 
 	 * @return the live list of type arguments
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SuperFieldAccess.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SuperFieldAccess.java
index b005c8e..666c12e 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SuperFieldAccess.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SuperFieldAccess.java
@@ -64,7 +64,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SuperMethodInvocation.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SuperMethodInvocation.java
index 11314b9..e70768c 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SuperMethodInvocation.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SuperMethodInvocation.java
@@ -97,14 +97,14 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
 	 */
 	public static List propertyDescriptors(int apiLevel) {
-		if (apiLevel == AST.LEVEL_2_0) {
+		if (apiLevel == AST.JLS2) {
 			return PROPERTY_DESCRIPTORS_2_0;
 		} else {
 			return PROPERTY_DESCRIPTORS_3_0;
@@ -146,7 +146,7 @@
 	 */
 	SuperMethodInvocation(AST ast) {
 		super(ast);	
-		if (ast.apiLevel >= AST.LEVEL_3_0) {
+		if (ast.apiLevel >= AST.JLS3) {
 			this.typeArguments = new ASTNode.NodeList(TYPE_ARGUMENTS_PROPERTY);
 		}
 	}
@@ -211,7 +211,7 @@
 		result.setSourceRange(this.getStartPosition(), this.getLength());
 		result.setName((SimpleName) getName().clone(target));
 		result.setQualifier((Name) ASTNode.copySubtree(target, getQualifier()));
-		if (this.ast.apiLevel >= AST.LEVEL_3_0) {
+		if (this.ast.apiLevel >= AST.JLS3) {
 			result.typeArguments().addAll(ASTNode.copySubtrees(target, typeArguments()));
 		}
 		result.arguments().addAll(ASTNode.copySubtrees(target, arguments()));
@@ -234,7 +234,7 @@
 		if (visitChildren) {
 			// visit children in normal left to right reading order
 			acceptChild(visitor, getQualifier());
-			if (this.ast.apiLevel >= AST.LEVEL_3_0) {
+			if (this.ast.apiLevel >= AST.JLS3) {
 				acceptChildren(visitor, this.typeArguments);
 			}
 			acceptChild(visitor, getName());
@@ -275,10 +275,10 @@
 	 * Returns the live ordered list of type arguments of this method
 	 * invocation (added in 3.0 API).
 	 * <p>
-	 * Note: Support for generic types is an experimental language feature 
-	 * under discussion in JSR-014 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * Note: This API element is only needed for dealing with Java code that uses
+	 * new language features of J2SE 1.5. It is included in anticipation of J2SE
+	 * 1.5 support, which is planned for the next release of Eclipse after 3.0, and
+	 * may change slightly before reaching its final form.
 	 * </p>
 	 * 
 	 * @return the live list of type arguments
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SwitchCase.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SwitchCase.java
index 2251d98..d976f20 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SwitchCase.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SwitchCase.java
@@ -53,7 +53,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SwitchStatement.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SwitchStatement.java
index 5454df8..f9f6fa5 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SwitchStatement.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SwitchStatement.java
@@ -65,7 +65,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SynchronizedStatement.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SynchronizedStatement.java
index 4292fef..0f75787 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SynchronizedStatement.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/SynchronizedStatement.java
@@ -58,7 +58,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TagElement.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TagElement.java
index da26d39..b3fb6cc 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TagElement.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TagElement.java
@@ -68,7 +68,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TextElement.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TextElement.java
index 6e6a16b..4573d89 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TextElement.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TextElement.java
@@ -52,7 +52,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ThisExpression.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ThisExpression.java
index 2990822..505cc87 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ThisExpression.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ThisExpression.java
@@ -55,7 +55,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ThrowStatement.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ThrowStatement.java
index 469bc45..b9c101c 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ThrowStatement.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/ThrowStatement.java
@@ -50,7 +50,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TryStatement.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TryStatement.java
index 90863df..1a8807a 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TryStatement.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TryStatement.java
@@ -68,7 +68,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Type.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Type.java
index fb2a8c3..730eed3 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Type.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/Type.java
@@ -49,12 +49,6 @@
  *    <b>?</b> [ ( <b>extends</b> | <b>super</b>) Type ] 
  * </pre>
  * </p>
- * <p>
- * Note: Support for generic types is an experimental language feature 
- * under discussion in JSR-014 and under consideration for inclusion
- * in the 1.5 release of J2SE. The support here is therefore tentative
- * and subject to change.
- * </p>
  * 
  * @since 2.0
  */
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeBinding.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeBinding.java
index 051ebdd..a84ae5d 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeBinding.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeBinding.java
@@ -21,6 +21,7 @@
 import org.eclipse.jdt.internal.compiler.lookup.FieldBinding;
 import org.eclipse.jdt.internal.compiler.lookup.PackageBinding;
 import org.eclipse.jdt.internal.compiler.lookup.ReferenceBinding;
+import org.eclipse.jdt.internal.compiler.problem.AbortCompilation;
 
 /**
  * Internal implementation of type bindings.
@@ -164,10 +165,14 @@
 		}
 		ReferenceBinding referenceBinding = (ReferenceBinding) this.binding;
 		if (referenceBinding.isNestedType()) {
-			return this.resolver.getTypeBinding(referenceBinding.enclosingType());
-		} else {
-			return null;
+			try {
+				return this.resolver.getTypeBinding(referenceBinding.enclosingType());
+			} catch (AbortCompilation e) {
+				// in case the enclosing type cannot be resolvable due to missing jars on the classpath
+				// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=57871
+			}
 		}
+		return null;
 	}
 
 	/*
@@ -178,7 +183,14 @@
 			return null;
 		}
 		ReferenceBinding referenceBinding = (ReferenceBinding) this.binding;
-		ReferenceBinding superclass = referenceBinding.superclass();
+		ReferenceBinding superclass = null;
+		try {
+			superclass = referenceBinding.superclass();
+		} catch (AbortCompilation e) {
+			// in case the superclass cannot be resolvable due to missing jars on the classpath
+			// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=57871
+			return this.resolver.resolveWellKnownType("java.lang.Object"); //$NON-NLS-1$
+		}
 		if (superclass == null) {
 			return null;
 		}
@@ -193,7 +205,16 @@
 			return NO_TYPE_BINDINGS;
 		}
 		ReferenceBinding referenceBinding = (ReferenceBinding) this.binding;
-		ReferenceBinding[] interfaces = referenceBinding.superInterfaces();
+		ReferenceBinding[] interfaces = null;
+		try {
+			interfaces = referenceBinding.superInterfaces();
+		} catch (AbortCompilation e) {
+			// in case the one of the super interfaces cannot be resolvable due to missing jars on the classpath
+			// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=57871
+		}
+		if (interfaces == null) {
+			return NO_TYPE_BINDINGS;
+		}
 		int length = interfaces.length;
 		if (length == 0) {
 			return NO_TYPE_BINDINGS;
@@ -291,18 +312,22 @@
 	 * @see ITypeBinding#getDeclaredTypes()
 	 */
 	public ITypeBinding[] getDeclaredTypes() {
-		if (this.binding.isClass() || this.binding.isInterface()) {
-			ReferenceBinding referenceBinding = (ReferenceBinding) this.binding;
-			ReferenceBinding[] members = referenceBinding.memberTypes();
-			int length = members.length;
-			ITypeBinding[] newMembers = new ITypeBinding[length];
-			for (int i = 0; i < length; i++) {
-				newMembers[i] = this.resolver.getTypeBinding(members[i]);
+		try {
+			if (this.binding.isClass() || this.binding.isInterface()) {
+				ReferenceBinding referenceBinding = (ReferenceBinding) this.binding;
+				ReferenceBinding[] members = referenceBinding.memberTypes();
+				int length = members.length;
+				ITypeBinding[] newMembers = new ITypeBinding[length];
+				for (int i = 0; i < length; i++) {
+					newMembers[i] = this.resolver.getTypeBinding(members[i]);
+				}
+				return newMembers;
 			}
-			return newMembers;
-		} else {
-			return NO_TYPE_BINDINGS;
+		} catch (AbortCompilation e) {
+			// in case a member types cannot be resolvable due to missing jars on the classpath
+			// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=57871
 		}
+		return NO_TYPE_BINDINGS;
 	}
 	
 	/*
@@ -323,43 +348,51 @@
 	 * @see ITypeBinding#getDeclaredFields()
 	 */
 	public IVariableBinding[] getDeclaredFields() {
-		if (this.binding.isClass() || this.binding.isInterface()) {
-			ReferenceBinding referenceBinding = (ReferenceBinding) this.binding;
-			FieldBinding[] fields = referenceBinding.fields();
-			int length = fields.length;
-			IVariableBinding[] newFields = new IVariableBinding[length];
-			for (int i = 0; i < length; i++) {
-				newFields[i] = this.resolver.getVariableBinding(fields[i]);
+		try {
+			if (this.binding.isClass() || this.binding.isInterface()) {
+				ReferenceBinding referenceBinding = (ReferenceBinding) this.binding;
+				FieldBinding[] fields = referenceBinding.fields();
+				int length = fields.length;
+				IVariableBinding[] newFields = new IVariableBinding[length];
+				for (int i = 0; i < length; i++) {
+					newFields[i] = this.resolver.getVariableBinding(fields[i]);
+				}
+				return newFields;
 			}
-			return newFields;
-		} else {
-			return NO_VARIABLE_BINDINGS;
+		} catch (AbortCompilation e) {
+			// in case a field cannot be resolvable due to missing jars on the classpath
+			// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=57871
 		}
+		return NO_VARIABLE_BINDINGS;
 	}
 
 	/*
 	 * @see ITypeBinding#getDeclaredMethods()
 	 */
 	public IMethodBinding[] getDeclaredMethods() {
-		if (this.binding.isClass() || this.binding.isInterface()) {
-			ReferenceBinding referenceBinding = (ReferenceBinding) this.binding;
-			org.eclipse.jdt.internal.compiler.lookup.MethodBinding[] methods = referenceBinding.methods();
-			int length = methods.length;
-			int removeSyntheticsCounter = 0;
-			IMethodBinding[] newMethods = new IMethodBinding[length];
-			for (int i = 0; i < length; i++) {
-				org.eclipse.jdt.internal.compiler.lookup.MethodBinding methodBinding = methods[i];
-				if (!shouldBeRemoved(methodBinding)) { 
-					newMethods[removeSyntheticsCounter++] = this.resolver.getMethodBinding(methodBinding);
+		try {
+			if (this.binding.isClass() || this.binding.isInterface()) {
+				ReferenceBinding referenceBinding = (ReferenceBinding) this.binding;
+				org.eclipse.jdt.internal.compiler.lookup.MethodBinding[] methods = referenceBinding.methods();
+				int length = methods.length;
+				int removeSyntheticsCounter = 0;
+				IMethodBinding[] newMethods = new IMethodBinding[length];
+				for (int i = 0; i < length; i++) {
+					org.eclipse.jdt.internal.compiler.lookup.MethodBinding methodBinding = methods[i];
+					if (!shouldBeRemoved(methodBinding)) { 
+						newMethods[removeSyntheticsCounter++] = this.resolver.getMethodBinding(methodBinding);
+					}
 				}
+				if (removeSyntheticsCounter != length) {
+					System.arraycopy(newMethods, 0, (newMethods = new IMethodBinding[removeSyntheticsCounter]), 0, removeSyntheticsCounter);
+				}
+				return newMethods;
 			}
-			if (removeSyntheticsCounter != length) {
-				System.arraycopy(newMethods, 0, (newMethods = new IMethodBinding[removeSyntheticsCounter]), 0, removeSyntheticsCounter);
-			}
-			return newMethods;
-		} else {
-			return NO_METHOD_BINDINGS;
+		} catch (AbortCompilation e) {
+			// in case a method cannot be resolvable due to missing jars on the classpath
+			// see https://bugs.eclipse.org/bugs/show_bug.cgi?id=57871
 		}
+		return NO_METHOD_BINDINGS;
 	}
 
 	private boolean shouldBeRemoved(org.eclipse.jdt.internal.compiler.lookup.MethodBinding methodBinding) {
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeDeclaration.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeDeclaration.java
index 2eb6491..badbc68 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeDeclaration.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeDeclaration.java
@@ -61,12 +61,6 @@
  * modifiers or annotations). The source range extends through the last character of the "}"
  * token following the body declarations.
  * </p>
- * <p>
- * Note: Support for generic types is an experimental language feature 
- * under discussion in JSR-014 and under consideration for inclusion
- * in the 1.5 release of J2SE. The support here is therefore tentative
- * and subject to change.
- * </p>
  * 
  * @since 2.0
  */
@@ -196,14 +190,14 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
 	 */
 	public static List propertyDescriptors(int apiLevel) {
-		if (apiLevel == AST.LEVEL_2_0) {
+		if (apiLevel == AST.JLS2) {
 			return PROPERTY_DESCRIPTORS_2_0;
 		} else {
 			return PROPERTY_DESCRIPTORS_3_0;
@@ -271,10 +265,10 @@
 	 */
 	TypeDeclaration(AST ast) {
 		super(ast);
-		if (ast.apiLevel == AST.LEVEL_2_0) {
+		if (ast.apiLevel == AST.JLS2) {
 			this.superInterfaceNames = new ASTNode.NodeList(SUPER_INTERFACES_PROPERTY);
 		}
-		if (ast.apiLevel >= AST.LEVEL_3_0) {
+		if (ast.apiLevel >= AST.JLS3) {
 			this.typeParameters = new ASTNode.NodeList(TYPE_PARAMETERS_PROPERTY);
 			this.superInterfaceTypes = new ASTNode.NodeList(SUPER_INTERFACE_TYPES_PROPERTY);
 		}
@@ -434,7 +428,7 @@
 		result.setSourceRange(this.getStartPosition(), this.getLength());
 		result.setJavadoc(
 			(Javadoc) ASTNode.copySubtree(target, getJavadoc()));
-		if (this.ast.apiLevel == AST.LEVEL_2_0) {
+		if (this.ast.apiLevel == AST.JLS2) {
 			result.setModifiers(getModifiers());
 			result.setSuperclass(
 					(Name) ASTNode.copySubtree(target, getSuperclass()));
@@ -443,7 +437,7 @@
 		}
 		result.setInterface(isInterface());
 		result.setName((SimpleName) getName().clone(target));
-		if (this.ast.apiLevel >= AST.LEVEL_3_0) {
+		if (this.ast.apiLevel >= AST.JLS3) {
 			result.modifiers().addAll(ASTNode.copySubtrees(target, modifiers()));
 			result.typeParameters().addAll(
 					ASTNode.copySubtrees(target, typeParameters()));
@@ -472,14 +466,14 @@
 		boolean visitChildren = visitor.visit(this);
 		if (visitChildren) {
 			// visit children in normal left to right reading order
-			if (this.ast.apiLevel == AST.LEVEL_2_0) {
+			if (this.ast.apiLevel == AST.JLS2) {
 				acceptChild(visitor, getJavadoc());
 				acceptChild(visitor, getName());
 				acceptChild(visitor, getSuperclass());
 				acceptChildren(visitor, this.superInterfaceNames);
 				acceptChildren(visitor, this.bodyDeclarations);
 			}
-			if (this.ast.apiLevel >= AST.LEVEL_3_0) {
+			if (this.ast.apiLevel >= AST.JLS3) {
 				acceptChild(visitor, getJavadoc());
 				acceptChildren(visitor, this.modifiers);
 				acceptChild(visitor, getName());
@@ -521,10 +515,10 @@
 	 * Returns the live ordered list of type parameters of this type 
 	 * declaration (added in 3.0 API). This list is non-empty for parameterized types.
 	 * <p>
-	 * Note: Support for generic types is an experimental language feature 
-	 * under discussion in JSR-014 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * Note: This API element is only needed for dealing with Java code that uses
+	 * new language features of J2SE 1.5. It is included in anticipation of J2SE
+	 * 1.5 support, which is planned for the next release of Eclipse after 3.0, and
+	 * may change slightly before reaching its final form.
 	 * </p>
 	 * 
 	 * @return the live list of type parameters
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeDeclarationStatement.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeDeclarationStatement.java
index 97928a1..07de5cf 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeDeclarationStatement.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeDeclarationStatement.java
@@ -83,14 +83,14 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
 	 */
 	public static List propertyDescriptors(int apiLevel) {
-		if (apiLevel == AST.LEVEL_2_0) {
+		if (apiLevel == AST.JLS2) {
 			return PROPERTY_DESCRIPTORS_2_0;
 		} else {
 			return PROPERTY_DESCRIPTORS_3_0;
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeLiteral.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeLiteral.java
index da6b22a..9fc281b 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeLiteral.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeLiteral.java
@@ -50,7 +50,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeParameter.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeParameter.java
index 14ee931..42a586a 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeParameter.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TypeParameter.java
@@ -20,10 +20,10 @@
  *    TypeVariable [ <b>extends</b> Type { <b>&</b> Type } ]
  * </pre>
  * <p>
- * Note: Support for generic types is an experimental language feature 
- * under discussion in JSR-014 and under consideration for inclusion
- * in the 1.5 release of J2SE. The support here is therefore tentative
- * and subject to change.
+ * Note: This API element is only needed for dealing with Java code that uses
+ * new language features of J2SE 1.5. It is included in anticipation of J2SE
+ * 1.5 support, which is planned for the next release of Eclipse after 3.0, and
+ * may change slightly before reaching its final form.
  * </p>
  * 
  * @since 3.0
@@ -63,7 +63,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/VariableDeclarationExpression.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/VariableDeclarationExpression.java
index 1dd9596..52d10c1 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/VariableDeclarationExpression.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/VariableDeclarationExpression.java
@@ -105,14 +105,14 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
 	 */
 	public static List propertyDescriptors(int apiLevel) {
-		if (apiLevel == AST.LEVEL_2_0) {
+		if (apiLevel == AST.JLS2) {
 			return PROPERTY_DESCRIPTORS_2_0;
 		} else {
 			return PROPERTY_DESCRIPTORS_3_0;
@@ -159,7 +159,7 @@
 	 */
 	VariableDeclarationExpression(AST ast) {
 		super(ast);
-		if (ast.apiLevel >= AST.LEVEL_3_0) {
+		if (ast.apiLevel >= AST.JLS3) {
 			this.modifiers = new ASTNode.NodeList(MODIFIERS2_PROPERTY);
 		}
 	}
@@ -231,10 +231,10 @@
 		VariableDeclarationExpression result = 
 			new VariableDeclarationExpression(target);
 		result.setSourceRange(this.getStartPosition(), this.getLength());
-		if (this.ast.apiLevel == AST.LEVEL_2_0) {
+		if (this.ast.apiLevel == AST.JLS2) {
 			result.setModifiers(getModifiers());
 		}
-		if (this.ast.apiLevel >= AST.LEVEL_3_0) {
+		if (this.ast.apiLevel >= AST.JLS3) {
 			result.modifiers().addAll(ASTNode.copySubtrees(target, modifiers()));
 		}
 		result.setType((Type) getType().clone(target));
@@ -259,7 +259,7 @@
 		boolean visitChildren = visitor.visit(this);
 		if (visitChildren) {
 			// visit children in normal left to right reading order
-			if (this.ast.apiLevel >= AST.LEVEL_3_0) {
+			if (this.ast.apiLevel >= AST.JLS3) {
 				acceptChildren(visitor, this.modifiers);
 			}
 			acceptChild(visitor, getType());
@@ -276,10 +276,10 @@
 	 * variable declarations.
 	 * </p>
 	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
+	 * Note: This API element is only needed for dealing with Java code that uses
+	 * new language features of J2SE 1.5. It is included in anticipation of J2SE
+	 * 1.5 support, which is planned for the next release of Eclipse after 3.0, and
+	 * may change slightly before reaching its final form.
 	 * </p>
 	 * 
 	 * @return the live list of modifiers and annotations
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/VariableDeclarationFragment.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/VariableDeclarationFragment.java
index 03e231d..3a2332a 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/VariableDeclarationFragment.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/VariableDeclarationFragment.java
@@ -71,7 +71,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/VariableDeclarationStatement.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/VariableDeclarationStatement.java
index 55d04aa..5594c76 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/VariableDeclarationStatement.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/VariableDeclarationStatement.java
@@ -103,14 +103,14 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
 	 * @since 3.0
 	 */
 	public static List propertyDescriptors(int apiLevel) {
-		if (apiLevel == AST.LEVEL_2_0) {
+		if (apiLevel == AST.JLS2) {
 			return PROPERTY_DESCRIPTORS_2_0;
 		} else {
 			return PROPERTY_DESCRIPTORS_3_0;
@@ -157,7 +157,7 @@
 	 */
 	VariableDeclarationStatement(AST ast) {
 		super(ast);
-		if (ast.apiLevel >= AST.LEVEL_3_0) {
+		if (ast.apiLevel >= AST.JLS3) {
 			this.modifiers = new ASTNode.NodeList(MODIFIERS2_PROPERTY);
 		}
 	}
@@ -230,10 +230,10 @@
 			new VariableDeclarationStatement(target);
 		result.setSourceRange(this.getStartPosition(), this.getLength());
 		result.copyLeadingComment(this);
-		if (this.ast.apiLevel == AST.LEVEL_2_0) {
+		if (this.ast.apiLevel == AST.JLS2) {
 			result.setModifiers(getModifiers());
 		}
-		if (this.ast.apiLevel >= AST.LEVEL_3_0) {
+		if (this.ast.apiLevel >= AST.JLS3) {
 			result.modifiers().addAll(ASTNode.copySubtrees(target, modifiers()));
 		}
 		result.setType((Type) getType().clone(target));
@@ -257,7 +257,7 @@
 		boolean visitChildren = visitor.visit(this);
 		if (visitChildren) {
 			// visit children in normal left to right reading order
-			if (this.ast.apiLevel >= AST.LEVEL_3_0) {
+			if (this.ast.apiLevel >= AST.JLS3) {
 				acceptChildren(visitor, this.modifiers);
 			}
 			acceptChild(visitor, getType());
@@ -273,12 +273,6 @@
 	 * Note that the final modifier is the only meaningful modifier for local
 	 * variable declarations.
 	 * </p>
-	 * <p>
-	 * Note: Support for annotation metadata is an experimental language feature 
-	 * under discussion in JSR-175 and under consideration for inclusion
-	 * in the 1.5 release of J2SE. The support here is therefore tentative
-	 * and subject to change.
-	 * </p>
 	 * 
 	 * @return the live list of modifiers and annotations
 	 *    (element type: <code>IExtendedModifier</code>)
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/WhileStatement.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/WhileStatement.java
index c108bd1..731bf08 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/WhileStatement.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/WhileStatement.java
@@ -58,7 +58,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/WildcardType.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/WildcardType.java
index 0bc3622..6f4c815 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/WildcardType.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/WildcardType.java
@@ -25,10 +25,10 @@
  * argument of a <code>ParameterizedType</code> node.
  * </p>
  * <p>
- * Note: Support for generic types is an experimental language feature 
- * under discussion in JSR-014 and under consideration for inclusion
- * in the 1.5 release of J2SE. The support here is therefore tentative
- * and subject to change.
+ * Note: This API element is only needed for dealing with Java code that uses
+ * new language features of J2SE 1.5. It is included in anticipation of J2SE
+ * 1.5 support, which is planned for the next release of Eclipse after 3.0, and
+ * may change slightly before reaching its final form.
  * </p>
  * 
  * @since 3.0
@@ -68,7 +68,7 @@
 	 * Clients must not modify the result.
 	 * 
 	 * @param apiLevel the API level; one of the
-	 * <code>AST.LEVEL_&ast;</code> constants
+	 * <code>AST.JLS&ast;</code> constants
 
 	 * @return a list of property descriptors (element type: 
 	 * {@link StructuralPropertyDescriptor})
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/rewrite/ASTRewrite.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/rewrite/ASTRewrite.java
index 0c4efd7..2a622e2 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/rewrite/ASTRewrite.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/rewrite/ASTRewrite.java
@@ -49,7 +49,7 @@
  * </p>
  * <pre>
  * Document doc = new Document("import java.util.List;\nclass X {}\n");
- * ASTParser parser = ASTParser.newParser(AST.LEVEL_2_0);
+ * ASTParser parser = ASTParser.newParser(AST.JLS2);
  * parser.setSource(doc.get().toCharArray());
  * CompilationUnit cu = (CompilationUnit) parser.createAST(null);
  * AST ast = cu.getAST();
diff --git a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/CodeFormatterVisitor.java b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/CodeFormatterVisitor.java
index b6d115c..8458d89 100644
--- a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/CodeFormatterVisitor.java
+++ b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/CodeFormatterVisitor.java
@@ -2400,23 +2400,20 @@
 		CompilationUnitDeclaration compilationUnitDeclaration,
 		CompilationUnitScope scope) {
 		
+		// fake new line to handle empty lines before package declaration or import declarations
+		this.scribe.lastNumberOfNewLines = 1;
 		/* 
 		 * Package declaration
 		 */
 		if (compilationUnitDeclaration.currentPackage != null) {
 			if (hasComments()) {
 				this.scribe.printComment();
-				// add a fake new line to add potential blank lines
-				int blankLinesBeforePackage = this.preferences.blank_lines_before_package;
-				if (blankLinesBeforePackage > 0) {
-					this.scribe.printEmptyLines(blankLinesBeforePackage);
-				}
-			} else {
-				int blankLinesBeforePackage = this.preferences.blank_lines_before_package;
-				if (blankLinesBeforePackage > 0) {
-					this.scribe.printEmptyLines(blankLinesBeforePackage - 1);
-				}
 			}
+			int blankLinesBeforePackage = this.preferences.blank_lines_before_package;
+			if (blankLinesBeforePackage > 0) {
+				this.scribe.printEmptyLines(blankLinesBeforePackage);
+			}
+
 			// dump the package keyword
 			this.scribe.printNextToken(TerminalTokens.TokenNamepackage);
 			this.scribe.space();
diff --git a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/DefaultCodeFormatter.java b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/DefaultCodeFormatter.java
index a13378a..af35d37 100644
--- a/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/DefaultCodeFormatter.java
+++ b/org.eclipse.jdt.core/formatter/org/eclipse/jdt/internal/formatter/DefaultCodeFormatter.java
@@ -10,6 +10,7 @@
  ******************************************************************************/
 package org.eclipse.jdt.internal.formatter;
 
+import java.util.HashMap;
 import java.util.Map;
 
 import org.eclipse.jdt.core.formatter.CodeFormatter;
@@ -19,6 +20,7 @@
 import org.eclipse.jdt.internal.compiler.ast.CompilationUnitDeclaration;
 import org.eclipse.jdt.internal.compiler.ast.ConstructorDeclaration;
 import org.eclipse.jdt.internal.compiler.ast.Expression;
+import org.eclipse.jdt.internal.compiler.impl.CompilerOptions;
 import org.eclipse.jdt.internal.core.util.CodeSnippetParsingUtil;
 import org.eclipse.text.edits.TextEdit;
 
@@ -28,6 +30,7 @@
 	
 	private CodeFormatterVisitor newCodeFormatter;
 	private Map options;
+	private Map defaultCompilerOptions;
 	
 	private DefaultCodeFormatterOptions preferences;
 	private CodeSnippetParsingUtil codeSnippetParsingUtil;
@@ -41,20 +44,16 @@
 	}
 
 	public DefaultCodeFormatter(DefaultCodeFormatterOptions defaultCodeFormatterOptions, Map options) {
-		if (options == null) {
-			options = JavaCore.getOptions();
-		}
-		this.options = options;
 		if (options != null) {
+			this.options = options;
 			this.preferences = new DefaultCodeFormatterOptions(options);
-			if (defaultCodeFormatterOptions != null) {
-				this.preferences.set(defaultCodeFormatterOptions.getMap());
-			}
 		} else {
+			this.options = JavaCore.getOptions();
 			this.preferences = new DefaultCodeFormatterOptions(DefaultCodeFormatterConstants.getDefaultSettings());
-			if (defaultCodeFormatterOptions != null) {
-				this.preferences.set(defaultCodeFormatterOptions.getMap());
-			}
+		}
+		this.defaultCompilerOptions = getDefaultCompilerOptions();
+		if (defaultCodeFormatterOptions != null) {
+			this.preferences.set(defaultCodeFormatterOptions.getMap());
 		}
 	}
 
@@ -93,7 +92,7 @@
 	}
 	
 	private TextEdit formatClassBodyDeclarations(String source, int indentationLevel, String lineSeparator, int offset, int length) {
-		ASTNode[] bodyDeclarations = this.codeSnippetParsingUtil.parseClassBodyDeclarations(source.toCharArray(), this.options, true);
+		ASTNode[] bodyDeclarations = this.codeSnippetParsingUtil.parseClassBodyDeclarations(source.toCharArray(), getDefaultCompilerOptions(), true);
 		
 		if (bodyDeclarations == null) {
 			// a problem occured while parsing the source
@@ -103,7 +102,7 @@
 	}
 
 	private TextEdit formatCompilationUnit(String source, int indentationLevel, String lineSeparator, int offset, int length) {
-		CompilationUnitDeclaration compilationUnitDeclaration = this.codeSnippetParsingUtil.parseCompilationUnit(source.toCharArray(), this.options, true);
+		CompilationUnitDeclaration compilationUnitDeclaration = this.codeSnippetParsingUtil.parseCompilationUnit(source.toCharArray(), getDefaultCompilerOptions(), true);
 		
 		if (lineSeparator != null) {
 			this.preferences.line_separator = lineSeparator;
@@ -112,13 +111,13 @@
 		}
 		this.preferences.initial_indentation_level = indentationLevel;
 
-		this.newCodeFormatter = new CodeFormatterVisitor(this.preferences, options, offset, length, this.codeSnippetParsingUtil);
+		this.newCodeFormatter = new CodeFormatterVisitor(this.preferences, this.options, offset, length, this.codeSnippetParsingUtil);
 		
 		return this.newCodeFormatter.format(source, compilationUnitDeclaration);
 	}
 
 	private TextEdit formatExpression(String source, int indentationLevel, String lineSeparator, int offset, int length) {
-		Expression expression = this.codeSnippetParsingUtil.parseExpression(source.toCharArray(), this.options, true);
+		Expression expression = this.codeSnippetParsingUtil.parseExpression(source.toCharArray(), getDefaultCompilerOptions(), true);
 		
 		if (expression == null) {
 			// a problem occured while parsing the source
@@ -128,7 +127,7 @@
 	}
 
 	private TextEdit formatStatements(String source, int indentationLevel, String lineSeparator, int offset, int length) {
-		ConstructorDeclaration constructorDeclaration = this.codeSnippetParsingUtil.parseStatements(source.toCharArray(), this.options, true);
+		ConstructorDeclaration constructorDeclaration = this.codeSnippetParsingUtil.parseStatements(source.toCharArray(), getDefaultCompilerOptions(), true);
 		
 		if (constructorDeclaration.statements == null) {
 			// a problem occured while parsing the source
@@ -141,6 +140,72 @@
 		return this.newCodeFormatter.scribe.toString();
 	}
 
+	private Map getDefaultCompilerOptions() {
+		if (this.defaultCompilerOptions ==  null) {
+			Map optionsMap = new HashMap(30);
+			optionsMap.put(CompilerOptions.OPTION_LocalVariableAttribute, CompilerOptions.DO_NOT_GENERATE); 
+			optionsMap.put(CompilerOptions.OPTION_LineNumberAttribute, CompilerOptions.DO_NOT_GENERATE);
+			optionsMap.put(CompilerOptions.OPTION_SourceFileAttribute, CompilerOptions.DO_NOT_GENERATE);
+			optionsMap.put(CompilerOptions.OPTION_PreserveUnusedLocal, CompilerOptions.PRESERVE);
+			optionsMap.put(CompilerOptions.OPTION_DocCommentSupport, CompilerOptions.DISABLED); 
+			optionsMap.put(CompilerOptions.OPTION_ReportMethodWithConstructorName, CompilerOptions.IGNORE); 
+			optionsMap.put(CompilerOptions.OPTION_ReportOverridingPackageDefaultMethod, CompilerOptions.IGNORE);
+			optionsMap.put(CompilerOptions.OPTION_ReportDeprecation, CompilerOptions.IGNORE);
+			optionsMap.put(CompilerOptions.OPTION_ReportDeprecationInDeprecatedCode, CompilerOptions.DISABLED); 
+			optionsMap.put(CompilerOptions.OPTION_ReportDeprecationWhenOverridingDeprecatedMethod, CompilerOptions.DISABLED); 
+			optionsMap.put(CompilerOptions.OPTION_ReportHiddenCatchBlock, CompilerOptions.IGNORE);
+			optionsMap.put(CompilerOptions.OPTION_ReportUnusedLocal, CompilerOptions.IGNORE);
+			optionsMap.put(CompilerOptions.OPTION_ReportUnusedParameter, CompilerOptions.IGNORE);
+			optionsMap.put(CompilerOptions.OPTION_ReportUnusedImport, CompilerOptions.IGNORE);
+			optionsMap.put(CompilerOptions.OPTION_ReportSyntheticAccessEmulation, CompilerOptions.IGNORE);
+			optionsMap.put(CompilerOptions.OPTION_ReportNoEffectAssignment, CompilerOptions.IGNORE);
+			optionsMap.put(CompilerOptions.OPTION_ReportNonExternalizedStringLiteral, CompilerOptions.IGNORE);
+			optionsMap.put(CompilerOptions.OPTION_ReportNoImplicitStringConversion, CompilerOptions.IGNORE); 
+			optionsMap.put(CompilerOptions.OPTION_ReportNonStaticAccessToStatic, CompilerOptions.IGNORE);
+			optionsMap.put(CompilerOptions.OPTION_ReportIndirectStaticAccess, CompilerOptions.IGNORE);
+			optionsMap.put(CompilerOptions.OPTION_ReportIncompatibleNonInheritedInterfaceMethod, CompilerOptions.IGNORE);
+			optionsMap.put(CompilerOptions.OPTION_ReportUnusedPrivateMember, CompilerOptions.IGNORE);
+			optionsMap.put(CompilerOptions.OPTION_ReportLocalVariableHiding, CompilerOptions.IGNORE);
+			optionsMap.put(CompilerOptions.OPTION_ReportFieldHiding, CompilerOptions.IGNORE);
+			optionsMap.put(CompilerOptions.OPTION_ReportPossibleAccidentalBooleanAssignment, CompilerOptions.IGNORE);
+			optionsMap.put(CompilerOptions.OPTION_ReportSuperfluousSemicolon, CompilerOptions.IGNORE);
+			optionsMap.put(CompilerOptions.OPTION_ReportAssertIdentifier, CompilerOptions.IGNORE);
+			optionsMap.put(CompilerOptions.OPTION_ReportUndocumentedEmptyBlock, CompilerOptions.IGNORE);
+			optionsMap.put(CompilerOptions.OPTION_ReportUnnecessaryTypeCheck, CompilerOptions.IGNORE);
+			optionsMap.put(CompilerOptions.OPTION_ReportInvalidJavadoc, CompilerOptions.IGNORE);
+			optionsMap.put(CompilerOptions.OPTION_ReportInvalidJavadocTagsVisibility, CompilerOptions.PUBLIC);
+			optionsMap.put(CompilerOptions.OPTION_ReportInvalidJavadocTags, CompilerOptions.DISABLED);
+			optionsMap.put(CompilerOptions.OPTION_ReportMissingJavadocTags, CompilerOptions.IGNORE);
+			optionsMap.put(CompilerOptions.OPTION_ReportMissingJavadocTagsVisibility, CompilerOptions.PUBLIC);
+			optionsMap.put(CompilerOptions.OPTION_ReportMissingJavadocTagsOverriding, CompilerOptions.DISABLED);
+			optionsMap.put(CompilerOptions.OPTION_ReportMissingJavadocComments, CompilerOptions.IGNORE);
+			optionsMap.put(CompilerOptions.OPTION_ReportMissingJavadocCommentsVisibility, CompilerOptions.IGNORE);
+			optionsMap.put(CompilerOptions.OPTION_ReportMissingJavadocCommentsOverriding, CompilerOptions.DISABLED);
+			optionsMap.put(CompilerOptions.OPTION_ReportFinallyBlockNotCompletingNormally, CompilerOptions.IGNORE);
+			optionsMap.put(CompilerOptions.OPTION_ReportUnusedDeclaredThrownException, CompilerOptions.IGNORE);
+			optionsMap.put(CompilerOptions.OPTION_ReportUnusedDeclaredThrownExceptionWhenOverriding, CompilerOptions.DISABLED); 
+			optionsMap.put(CompilerOptions.OPTION_ReportUnqualifiedFieldAccess, CompilerOptions.IGNORE);
+			optionsMap.put(CompilerOptions.OPTION_Compliance, CompilerOptions.VERSION_1_4);
+			optionsMap.put(CompilerOptions.OPTION_TargetPlatform, CompilerOptions.VERSION_1_2); 
+			optionsMap.put(CompilerOptions.OPTION_TaskTags, ""); //$NON-NLS-1$
+			optionsMap.put(CompilerOptions.OPTION_TaskPriorities, ""); //$NON-NLS-1$
+			optionsMap.put(CompilerOptions.OPTION_TaskCaseSensitive, CompilerOptions.DISABLED);
+			optionsMap.put(CompilerOptions.OPTION_ReportUnusedParameterWhenImplementingAbstract, CompilerOptions.DISABLED); 
+			optionsMap.put(CompilerOptions.OPTION_ReportUnusedParameterWhenOverridingConcrete, CompilerOptions.DISABLED); 
+			optionsMap.put(CompilerOptions.OPTION_ReportSpecialParameterHidingField, CompilerOptions.DISABLED); 
+			optionsMap.put(CompilerOptions.OPTION_MaxProblemPerUnit, String.valueOf(100));
+			optionsMap.put(CompilerOptions.OPTION_InlineJsr, CompilerOptions.DISABLED); 
+			this.defaultCompilerOptions = optionsMap;
+		}
+		Object sourceOption = this.options.get(CompilerOptions.OPTION_Source);
+		if (sourceOption != null) {
+			this.defaultCompilerOptions.put(CompilerOptions.OPTION_Source, sourceOption);
+		} else {
+			this.defaultCompilerOptions.put(CompilerOptions.OPTION_Source, CompilerOptions.VERSION_1_3);
+		}
+		return this.defaultCompilerOptions;		
+	}
+
 	private TextEdit internalFormatClassBodyDeclarations(String source, int indentationLevel, String lineSeparator, ASTNode[] bodyDeclarations, int offset, int length) {
 		if (lineSeparator != null) {
 			this.preferences.line_separator = lineSeparator;
@@ -149,7 +214,7 @@
 		}
 		this.preferences.initial_indentation_level = indentationLevel;
 
-		this.newCodeFormatter = new CodeFormatterVisitor(this.preferences, options, offset, length, this.codeSnippetParsingUtil);
+		this.newCodeFormatter = new CodeFormatterVisitor(this.preferences, this.options, offset, length, this.codeSnippetParsingUtil);
 		return this.newCodeFormatter.format(source, bodyDeclarations);
 	}
 
@@ -161,7 +226,7 @@
 		}
 		this.preferences.initial_indentation_level = indentationLevel;
 
-		this.newCodeFormatter = new CodeFormatterVisitor(this.preferences, options, offset, length, this.codeSnippetParsingUtil);
+		this.newCodeFormatter = new CodeFormatterVisitor(this.preferences, this.options, offset, length, this.codeSnippetParsingUtil);
 		
 		TextEdit textEdit = this.newCodeFormatter.format(source, expression);
 		return textEdit;
@@ -175,23 +240,23 @@
 		}
 		this.preferences.initial_indentation_level = indentationLevel;
 
-		this.newCodeFormatter = new CodeFormatterVisitor(this.preferences, options, offset, length, this.codeSnippetParsingUtil);
+		this.newCodeFormatter = new CodeFormatterVisitor(this.preferences, this.options, offset, length, this.codeSnippetParsingUtil);
 		
 		return  this.newCodeFormatter.format(source, constructorDeclaration);
 	}
 
 	private TextEdit probeFormatting(String source, int indentationLevel, String lineSeparator, int offset, int length) {
-		Expression expression = this.codeSnippetParsingUtil.parseExpression(source.toCharArray(), this.options, true);
+		Expression expression = this.codeSnippetParsingUtil.parseExpression(source.toCharArray(), getDefaultCompilerOptions(), true);
 		if (expression != null) {
 			return internalFormatExpression(source, indentationLevel, lineSeparator, expression, offset, length);
 		}
 
-		ASTNode[] bodyDeclarations = this.codeSnippetParsingUtil.parseClassBodyDeclarations(source.toCharArray(), this.options, true);
+		ASTNode[] bodyDeclarations = this.codeSnippetParsingUtil.parseClassBodyDeclarations(source.toCharArray(), getDefaultCompilerOptions(), true);
 		if (bodyDeclarations != null) {
 			return internalFormatClassBodyDeclarations(source, indentationLevel, lineSeparator, bodyDeclarations, offset, length);
 		}
 
-		ConstructorDeclaration constructorDeclaration = this.codeSnippetParsingUtil.parseStatements(source.toCharArray(), this.options, true);
+		ConstructorDeclaration constructorDeclaration = this.codeSnippetParsingUtil.parseStatements(source.toCharArray(), getDefaultCompilerOptions(), true);
 		if (constructorDeclaration.statements != null) {
 			return internalFormatStatements(source, indentationLevel, lineSeparator, constructorDeclaration, offset, length);
 		}
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/core/ICodeAssist.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/core/ICodeAssist.java
index e055bd3..d73f876 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/core/ICodeAssist.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/core/ICodeAssist.java
@@ -64,11 +64,17 @@
 		throws JavaModelException;
 	
 	/**
+	 * <b>DO NOT USE</b>: This API element was added in anticipation of J2SE
+	 * 1.5 support, which is planned for the next release of Eclipse after 3.0.
+	 * It is currently unimplemented, and the API may change slightly before
+	 * reaching its final form.
+	 * <p>
 	 * Performs code completion at the given offset position in this compilation unit,
 	 * reporting results to the given completion requestor. The <code>offset</code>
 	 * is the 0-based index of the character, after which code assist is desired.
 	 * An <code>offset</code> of -1 indicates to code assist at the beginning of this
 	 * compilation unit.
+	 * <p>
 	 *
 	 * @param offset the given offset position
 	 * @param requestor the given completion requestor
@@ -116,6 +122,11 @@
 		throws JavaModelException;
 
 	/**
+	 * <b>DO NOT USE</b>: This API element was added in anticipation of J2SE
+	 * 1.5 support, which is planned for the next release of Eclipse after 3.0.
+	 * It is currently unimplemented, and the API may change slightly before
+	 * reaching its final form.
+	 * <p>
 	 * Performs code completion at the given offset position in this compilation unit,
 	 * reporting results to the given completion requestor. The <code>offset</code>
 	 * is the 0-based index of the character, after which code assist is desired.
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 2988336..61c8088 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
@@ -136,10 +136,10 @@
  * is defined, are not treated as special cases.  If they are specified, they are
  * included in the result.
  * <p>
- * Note: Static imports are an experimental language feature 
- * under discussion in JSR-201 and under consideration for inclusion
- * in the 1.5 release of J2SE. The support here is therefore tentative
- * and subject to change.
+ * Note: This API element is only needed for dealing with Java code that uses
+ * new language features of J2SE 1.5. It is included in anticipation of J2SE
+ * 1.5 support, which is planned for the next release of Eclipse after 3.0, and
+ * may change slightly before reaching its final form.
  * </p>
  *
  * @param name the name of the import declaration to add as defined by JLS2 7.5. (For example: <code>"java.io.File"</code> or
@@ -512,6 +512,10 @@
  * creation of the DOM AST was not requested, or if the requested level of AST
  * API is not supported, or if the working copy was already consistent.
  * </p>
+ * <b>NOTE:</b>In Eclipse 3.0, there is no reconciler support for
+ * level AST.JLS3. This support is planned for the follow-on release of
+ * Eclipse which includes support for J2SE 1.5.
+ * </p>
  *
  * @param astLevel either {@link #NO_AST} if no AST is wanted,
  * or the {@linkplain AST#AST(int) AST API level} of the AST if one is wanted
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IImportDeclaration.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IImportDeclaration.java
index e7a7fff..747ede1 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IImportDeclaration.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/core/IImportDeclaration.java
@@ -32,10 +32,10 @@
 /**
  * Returns the modifier flags for this import. The flags can be examined using class
  * <code>Flags</code>. Only the static flag is meaningful for import declarations.
- *
+ * 
+ * @return the modifier flags for this import
  * @exception JavaModelException if this element does not exist or if an
  *      exception occurs while accessing its corresponding resource.
- * @return the modifier flags for this import
  * @see Flags
  * @since 3.0
  */
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 b4b2def..1df5d9d 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
@@ -1181,20 +1181,20 @@
 				JavaModelManager.getJavaModelManager().containerPut(project, containerPath, JavaModelManager.CONTAINER_INITIALIZATION_IN_PROGRESS); // avoid initialization cycles
 				boolean ok = false;
 				try {
-					// wrap initializer call with Safe runnable in case initializer would be causing some grief
-					Platform.run(new ISafeRunnable() {
-						public void handleException(Throwable exception) {
-							Util.log(exception, "Exception occurred in classpath container initializer: "+initializer); //$NON-NLS-1$
-						}
-						public void run() throws Exception {
-							initializer.initialize(containerPath, project);
-						}
-					});
+					// let OperationCanceledException go through
+					// (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=59363)
+					initializer.initialize(containerPath, project);
 					
 					// retrieve value (if initialization was successful)
 					container = JavaModelManager.getJavaModelManager().containerGet(project, containerPath);
 					if (container == JavaModelManager.CONTAINER_INITIALIZATION_IN_PROGRESS) return null; // break cycle
 					ok = true;
+				} catch (CoreException e) {
+					if (e instanceof JavaModelException) {
+						throw (JavaModelException) e;
+					} else {
+						throw new JavaModelException(e);
+					}
 				} catch (RuntimeException e) {
 					if (JavaModelManager.CP_RESOLVE_VERBOSE) {
 						e.printStackTrace();
@@ -1351,15 +1351,10 @@
 			JavaModelManager.getJavaModelManager().variablePut(variableName, JavaModelManager.VARIABLE_INITIALIZATION_IN_PROGRESS); // avoid initialization cycles
 			boolean ok = false;
 			try {
-				// wrap initializer call with Safe runnable in case initializer would be causing some grief
-				Platform.run(new ISafeRunnable() {
-					public void handleException(Throwable exception) {
-						Util.log(exception, "Exception occurred in classpath variable initializer: "+initializer+" while initializing variable: "+variableName); //$NON-NLS-1$ //$NON-NLS-2$
-					}
-					public void run() throws Exception {
-						initializer.initialize(variableName);
-					}
-				});
+				// let OperationCanceledException go through
+				// (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=59363)
+				initializer.initialize(variableName);
+				
 				variablePath = JavaModelManager.getJavaModelManager().variableGet(variableName); // initializer should have performed side-effect
 				if (variablePath == JavaModelManager.VARIABLE_INITIALIZATION_IN_PROGRESS) return null; // break cycle (initializer did not init or reentering call)
 				if (JavaModelManager.CP_RESOLVE_VERBOSE){
@@ -1369,6 +1364,16 @@
 						"	variable path: " + variablePath); //$NON-NLS-1$
 				}
 				ok = true;
+			} catch (RuntimeException e) {
+				if (JavaModelManager.CP_RESOLVE_VERBOSE) {
+					e.printStackTrace();
+				}
+				throw e;
+			} catch (Error e) {
+				if (JavaModelManager.CP_RESOLVE_VERBOSE) {
+					e.printStackTrace();
+				}
+				throw e;
 			} finally {
 				if (!ok) JavaModelManager.getJavaModelManager().variablePut(variableName, null); // flush cache
 			}
@@ -2378,9 +2383,7 @@
 	 * @return Return an array containing the names of all known user defined.
 	 */
 	public static String[] getUserLibraryNames() {
-		return new String[0];
-	 	// TODO (frederic) to be finalized in coordination with jdt-ui
-		// return UserLibraryManager.getUserLibraryNames();
+		 return UserLibraryManager.getUserLibraryNames();
 	}
 
 	/**
@@ -3688,7 +3691,15 @@
 					| IResourceChangeEvent.PRE_CLOSE);
 
 			startIndexing();
-			workspace.addSaveParticipant(this, manager);
+			
+			// process deltas since last activated
+			ISavedState savedState = workspace.addSaveParticipant(this, manager);
+			if (savedState != null) {
+				// the event type coming from the saved state is always POST_AUTO_BUILD
+				// force it to be POST_CHANGE so that the delta processor can handle it
+				manager.deltaState.eventType = IResourceChangeEvent.POST_CHANGE;
+				savedState.processResourceChangeEvents(manager.deltaState);
+			}
 		} catch (RuntimeException e) {
 			manager.shutdown();
 			throw e;
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/core/jdom/IDOMImport.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/core/jdom/IDOMImport.java
index 8d91307..569cb1e 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/core/jdom/IDOMImport.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/core/jdom/IDOMImport.java
@@ -38,12 +38,6 @@
 /**
  * Returns the modifier flags for this import. The flags can be examined using class
  * <code>Flags</code>. Only the static flag is meaningful for import declarations.
- * <p>
- * Note: Static imports are an experimental language feature 
- * under discussion in JSR-201 and under consideration for inclusion
- * in the 1.5 release of J2SE. The support here is therefore tentative
- * and subject to change.
- * </p>
  * @return the modifier flags for this import
  * @see Flags
  * @since 3.0
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CompilationUnit.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CompilationUnit.java
index 76728e6..ec48d55 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CompilationUnit.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/CompilationUnit.java
@@ -1083,10 +1083,10 @@
 	if (workingCopyOwner == null) workingCopyOwner = DefaultWorkingCopyOwner.PRIMARY;
 	
 	boolean createAST = false;
-	if (astLevel == AST.LEVEL_2_0) {
+	if (astLevel == AST.JLS2) {
 		// client asking for level 2 AST; these are supported
 		createAST = true;
-	} else if (astLevel == AST.LEVEL_3_0) {
+	} else if (astLevel == AST.JLS3) {
 		// client asking for level 3 ASTs; these are not supported
 		// TODO (jerome) - these should also be supported in 1.5 stream
 		createAST = false;
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/DeltaProcessingState.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/DeltaProcessingState.java
index 9933fec..d4e3d80 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/DeltaProcessingState.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/DeltaProcessingState.java
@@ -77,6 +77,11 @@
 	 * This is a cache of the projects before any project addition/deletion has started.
 	 */
 	public IJavaProject[] modelProjectsCache;
+	
+	/*
+	 * Type of event that is being processed.
+	 */
+	public int eventType = -1;
 		
 	/*
 	 * Need to clone defensively the listener information, in case some listener is reacting to some notification iteration by adding/changing/removing
@@ -237,12 +242,14 @@
 
 	public void resourceChanged(IResourceChangeEvent event) {
 		try {
-			getDeltaProcessor().resourceChanged(event);
+			if (this.eventType == -1) this.eventType = event.getType();
+			getDeltaProcessor().resourceChanged(event, this.eventType);
 		} finally {
 			// TODO (jerome) see 47631, may want to get rid of following so as to reuse delta processor ? 
-			if (event.getType() == IResourceChangeEvent.POST_CHANGE) {
+			if (this.eventType == IResourceChangeEvent.POST_CHANGE) {
 				this.deltaProcessors.set(null);
 			}
+			this.eventType = -1;
 		}
 
 	}
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/DeltaProcessor.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/DeltaProcessor.java
index 89001ad..816f48e 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/DeltaProcessor.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/DeltaProcessor.java
@@ -1822,13 +1822,13 @@
 	 * @see IResourceDelta
 	 * @see IResource 
 	 */
-	public void resourceChanged(IResourceChangeEvent event) {
+	public void resourceChanged(IResourceChangeEvent event, int eventType) {
 	
 		if (event.getSource() instanceof IWorkspace) {
 			IResource resource = event.getResource();
 			IResourceDelta delta = event.getDelta();
 			
-			switch(event.getType()){
+			switch(eventType){
 				case IResourceChangeEvent.PRE_DELETE :
 					try {
 						if(resource.getType() == IResource.PROJECT 
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaModelManager.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaModelManager.java
index 359d72a..006b7b7 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaModelManager.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaModelManager.java
@@ -214,20 +214,7 @@
 				projectContainers.put(containerPath, container);
 			}
 		}
-		
-		Preferences preferences = JavaCore.getPlugin().getPluginPreferences();
-		String containerKey = CP_CONTAINER_PREFERENCES_PREFIX+project.getElementName() +"|"+containerPath;//$NON-NLS-1$
-		String containerString = CP_ENTRY_IGNORE;
-		try {
-			if (container != null) {
-				containerString = ((JavaProject)project).encodeClasspath(container.getClasspathEntries(), null, false);
-			}
-		} catch(JavaModelException e){
-			// could not encode entry: leave it as CP_ENTRY_IGNORE
-		}
-		preferences.setDefault(containerKey, CP_ENTRY_IGNORE); // use this default to get rid of removed ones
-		preferences.setValue(containerKey, containerString);
-		JavaCore.getPlugin().savePluginPreferences();
+		// container values are persisted in preferences during save operations, see #saving(ISaveContext)
 	}
 
 	/**
@@ -1412,9 +1399,37 @@
 	 */
 	public void saving(ISaveContext context) throws CoreException {
 		
-		// clean up indexes on workspace full save
-		// (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=52347)
+	    // save container values on snapshot/full save
+		Preferences preferences = JavaCore.getPlugin().getPluginPreferences();
+		IJavaProject[] projects = getJavaModel().getJavaProjects();
+		for (int i = 0, length = projects.length; i < length; i++) {
+		    IJavaProject project = projects[i];
+			Map projectContainers = (Map)this.containers.get(project);
+			if (projectContainers == null) continue;
+			for (Iterator keys = projectContainers.keySet().iterator(); keys.hasNext();) {
+			    IPath containerPath = (IPath) keys.next();
+			    IClasspathContainer container = (IClasspathContainer) projectContainers.get(containerPath);
+				String containerKey = CP_CONTAINER_PREFERENCES_PREFIX+project.getElementName() +"|"+containerPath;//$NON-NLS-1$
+				String containerString = CP_ENTRY_IGNORE;
+				try {
+					if (container != null) {
+						containerString = ((JavaProject)project).encodeClasspath(container.getClasspathEntries(), null, false);
+					}
+				} catch(JavaModelException e){
+					// could not encode entry: leave it as CP_ENTRY_IGNORE
+				}
+				preferences.setDefault(containerKey, CP_ENTRY_IGNORE); // use this default to get rid of removed ones
+				preferences.setValue(containerKey, containerString);
+			}
+		}
+		JavaCore.getPlugin().savePluginPreferences();
+		
 		if (context.getKind() == ISaveContext.FULL_SAVE) {
+			// will need delta since this save (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=38658)
+			context.needDelta();
+			
+			// clean up indexes on workspace full save
+			// (see https://bugs.eclipse.org/bugs/show_bug.cgi?id=52347)
 			IndexManager manager = this.indexManager;
 			if (manager != null) {
 				manager.cleanUpIndexes();
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SortElementBuilder.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SortElementBuilder.java
index c7fd1e8..0e91e5c 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SortElementBuilder.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/SortElementBuilder.java
@@ -932,7 +932,7 @@
 		this.comparator = comparator;
 		this.positionsToMap = positionsToMap;
 		this.scanner = new Scanner(false, false, false, ClassFileConstants.JDK1_3/*sourceLevel*/, null, null, true/*taskCaseSensitive*/);
-		this.ast = AST.newAST(AST.LEVEL_2_0);
+		this.ast = AST.newAST(AST.JLS2);
 	}
 	
 	/*
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/UserLibraryClasspathContainer.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/UserLibraryClasspathContainer.java
index 338f095..4069ac9 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/UserLibraryClasspathContainer.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/UserLibraryClasspathContainer.java
@@ -27,13 +27,17 @@
 		this.name= libName;
 	}
 	
+	private UserLibrary getUserLibrary() {
+		return UserLibraryManager.getUserLibrary(this.name);
+	}
+
 	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.core.IClasspathContainer#getClasspathEntries()
 	 */
 	public IClasspathEntry[] getClasspathEntries() {
-		IClasspathContainer library= UserLibraryManager.getUserLibrary(this.name);
+		UserLibrary library= getUserLibrary();
 		if (library != null) {
-			return library.getClasspathEntries();
+			return library.getEntries();
 		}
 		return new IClasspathEntry[0];
 		
@@ -50,9 +54,9 @@
 	 * @see org.eclipse.jdt.core.IClasspathContainer#getKind()
 	 */
 	public int getKind() {
-		IClasspathContainer library= UserLibraryManager.getUserLibrary(this.name);
-		if (library != null) {
-			return library.getKind();
+		UserLibrary library= getUserLibrary();
+		if (library != null && library.isSystemLibrary()) {
+			return K_SYSTEM;
 		}
 		return K_APPLICATION;
 	}
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/UserLibraryClasspathContainerInitializer.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/UserLibraryClasspathContainerInitializer.java
index f4f7daa..2920dcb 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/UserLibraryClasspathContainerInitializer.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/UserLibraryClasspathContainerInitializer.java
@@ -29,9 +29,10 @@
 		if (isUserLibraryContainer(containerPath)) {
 			String userLibName= containerPath.segment(1);
 						
-			IClasspathContainer library = UserLibraryManager.getUserLibrary(userLibName);
-			if (library != null) {
-				JavaCore.setClasspathContainer(containerPath, new IJavaProject[] { project }, 	new IClasspathContainer[] { library }, null);
+			UserLibrary entries= UserLibraryManager.getUserLibrary(userLibName);
+			if (entries != null) {
+				UserLibraryClasspathContainer container= new UserLibraryClasspathContainer(userLibName);
+				JavaCore.setClasspathContainer(containerPath, new IJavaProject[] { project }, 	new IClasspathContainer[] { container }, null);
 			}
 		}
 	}
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/UserLibraryManager.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/UserLibraryManager.java
index 31f9b97..ce58629 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/UserLibraryManager.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/UserLibraryManager.java
@@ -80,8 +80,8 @@
 	 * @param name The name of the library
 	 * @return The library registered for the given name or <code>null</code>.
 	 */
-	public static IClasspathContainer getUserLibrary(String name) {
-		return (IClasspathContainer) getLibraryMap().get(name);
+	public static UserLibrary getUserLibrary(String name) {
+		return (UserLibrary) getLibraryMap().get(name);
 	}
 
 	/**
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 b1a37c0..2c8414e 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
@@ -166,15 +166,14 @@
 		// if the source at <position> is immediately followed by a line comment, then
 		// flush this comment and shift <position> to the comment end.
 		if (validCount > 0){
-			int immediateCommentEnd = -this.scanner.commentStops[index+1]; //non-javadoc comment end positions are negative
-			if (immediateCommentEnd > 0){ // only tolerating non-javadoc comments
+			int immediateCommentEnd = 0;
+			while (index<lastCommentIndex && (immediateCommentEnd = -this.scanner.commentStops[index+1])  > 0){ // only tolerating non-javadoc comments (non-javadoc comment end positions are negative)
 				// is there any line break until the end of the immediate comment ? (thus only tolerating line comment)
 				immediateCommentEnd--; // comment end in one char too far
-				if (this.scanner.getLineNumber(position) == this.scanner.getLineNumber(immediateCommentEnd)){
-					position = immediateCommentEnd;
-					validCount--; // flush this comment
-					index++;
-				}
+				if (this.scanner.getLineNumber(position) != this.scanner.getLineNumber(immediateCommentEnd)) break;
+				position = immediateCommentEnd;
+				validCount--; // flush this comment
+				index++;
 			}
 		}
 	
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/Util.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/Util.java
index 5d53ec8..9596032 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/Util.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/Util.java
@@ -119,24 +119,24 @@
 		// for compatibility with MessageFormat which eliminates double quotes in original message
 		char[] messageWithNoDoubleQuotes =
 			CharOperation.replace(message.toCharArray(), DOUBLE_QUOTES, SINGLE_QUOTE);
-		message = new String(messageWithNoDoubleQuotes);
-		if (bindings == null) return message;
-
-		int length = message.length();
-		int start = -1;
+	
+		if (bindings == null) return new String(messageWithNoDoubleQuotes);
+	
+		int length = messageWithNoDoubleQuotes.length;
+		int start = 0;
 		int end = length;
 		StringBuffer output = null;
 		while (true) {
-			if ((end = message.indexOf('{', start)) > -1) {
-				if (output == null) output = new StringBuffer(80);
-				output.append(message.substring(start + 1, end));
-				if ((start = message.indexOf('}', end)) > -1) {
+			if ((end = CharOperation.indexOf('{', messageWithNoDoubleQuotes, start)) > -1) {
+				if (output == null) output = new StringBuffer(length+bindings.length*20);
+				output.append(messageWithNoDoubleQuotes, start, end - start);
+				if ((start = CharOperation.indexOf('}', messageWithNoDoubleQuotes, end + 1)) > -1) {
 					int index = -1;
+					String argId = new String(messageWithNoDoubleQuotes, end + 1, start - end - 1);
 					try {
-						index = Integer.parseInt(message.substring(end + 1, start));
+						index = Integer.parseInt(argId);
 						output.append(bindings[index]);
 					} catch (NumberFormatException nfe) { // could be nested message ID {compiler.name}
-						String argId = message.substring(end + 1, start);
 						boolean done = false;
 						if (!id.equals(argId)) {
 							String argMessage = null;
@@ -148,17 +148,18 @@
 								// unable to bind argument, ignore (will leave argument in)
 							}
 						}
-						if (!done) output.append(message.substring(end + 1, start + 1));
+						if (!done) output.append(messageWithNoDoubleQuotes, end + 1, start - end);
 					} catch (ArrayIndexOutOfBoundsException e) {
 						output.append("{missing " + Integer.toString(index) + "}"); //$NON-NLS-2$ //$NON-NLS-1$
 					}
+					start++;
 				} else {
-					output.append(message.substring(end, length));
+					output.append(messageWithNoDoubleQuotes, end, length);
 					break;
 				}
 			} else {
-				if (output == null) return message;
-				output.append(message.substring(start + 1, length));
+				if (output == null) return new String(messageWithNoDoubleQuotes);
+				output.append(messageWithNoDoubleQuotes, start, length - start);
 				break;
 			}
 		}
diff --git a/org.eclipse.jdt.core/plugin.properties b/org.eclipse.jdt.core/plugin.properties
index 579f43b..56951a2 100644
--- a/org.eclipse.jdt.core/plugin.properties
+++ b/org.eclipse.jdt.core/plugin.properties
@@ -18,4 +18,5 @@
 classpathVariableInitializersName=Classpath Variable Initializers
 classpathContainerInitializersName=Classpath Container Initializers
 codeFormattersName=Source Code Formatters
-javaTaskName=Java Task
\ No newline at end of file
+javaTaskName=Java Task
+javaPropertiesName=Java Properties File
\ No newline at end of file
diff --git a/org.eclipse.jdt.core/plugin.xml b/org.eclipse.jdt.core/plugin.xml
index e20aeab..73e6564 100644
--- a/org.eclipse.jdt.core/plugin.xml
+++ b/org.eclipse.jdt.core/plugin.xml
@@ -87,13 +87,9 @@
 	</builder>
 </extension>
 
-
 <!-- =================================================================================== -->
-<!-- Extension: Java Markers                                                             -->
+<!-- Extension: Java Problem                                                             -->
 <!-- =================================================================================== -->
-
-<!-- Java problems -->
-
 <extension id="problem" point="org.eclipse.core.resources.markers" name="%javaProblemName">
 	<super type="org.eclipse.core.resources.problemmarker"/>
 	<super type="org.eclipse.core.resources.textmarker"/>
@@ -103,8 +99,9 @@
 	<attribute name="arguments"/>
 </extension>   
 
-<!-- Java buildpath problems -->
-
+<!-- =================================================================================== -->
+<!-- Extension: Java Buildpath Problem                                                   -->
+<!-- =================================================================================== -->
 <extension id="buildpath_problem" point="org.eclipse.core.resources.markers" name="%buildPathProblemName">
 	<super type="org.eclipse.core.resources.problemmarker"/>
 	<super type="org.eclipse.core.resources.textmarker"/>
@@ -114,8 +111,9 @@
 	<attribute name="arguments"/>
 </extension>   
 
-<!-- Java transient problems -->
-
+<!-- =================================================================================== -->
+<!-- Extension: Java Transient Problem                                                   -->
+<!-- =================================================================================== -->
 <extension id="transient_problem" point="org.eclipse.core.resources.markers" name="%transientJavaProblemName">
 	<super type="org.eclipse.core.resources.textmarker"/>
 	<persistent value="false"/>
@@ -124,8 +122,9 @@
 	<attribute name="arguments"/>
 </extension>
 
-<!-- Java tasks -->
-
+<!-- =================================================================================== -->
+<!-- Extension: Java Task                                                                -->
+<!-- =================================================================================== -->
 <extension id="task" name="%javaTaskName" point="org.eclipse.core.resources.markers">
     <super type="org.eclipse.core.resources.taskmarker"/> 
     <persistent value="true"/>
@@ -141,26 +140,56 @@
 	</extraClasspathEntry>
 </extension> 
 
-<!-- Tasks -->
+<!-- =================================================================================== -->
+<!-- Extension: Javac Ant Task                                                           -->
+<!-- =================================================================================== -->
 <extension point="org.eclipse.ant.core.antTasks">
-  <antTask
-  	name="eclipse.checkDebugAttributes"
-	class="org.eclipse.jdt.core.CheckDebugAttributes"
-	library="jdtCompilerAdapter.jar">
-  </antTask>
+	<antTask
+		name="eclipse.checkDebugAttributes"
+		class="org.eclipse.jdt.core.CheckDebugAttributes"
+		library="jdtCompilerAdapter.jar">
+	</antTask>
 </extension>
       
 <!-- =================================================================================== -->
-<!-- Extension: Java file types                                                        -->
+<!-- Extension: User Library Container                                                   -->
+<!-- =================================================================================== -->
+<extension
+      point="org.eclipse.jdt.core.classpathContainerInitializer">
+      <classpathContainerInitializer
+            class="org.eclipse.jdt.internal.core.UserLibraryClasspathContainerInitializer"
+            id="org.eclipse.jdt.USER_LIBRARY">
+      </classpathContainerInitializer>
+   </extension>
+
+<!-- =================================================================================== -->
+<!-- Extension: Java File Types                                                          -->
 <!-- =================================================================================== -->
 <extension point="org.eclipse.team.core.fileTypes">
-  <fileTypes extension="java" type="text"/>
-  <fileTypes extension="classpath" type="text"/>
-  <fileTypes extension="properties" type="text"/>
-  <fileTypes extension="class" type="binary"/>
-  <fileTypes extension="jar" type="binary"/>
-  <fileTypes extension="jardesc" type="text"/>
-  <fileTypes extension="zip" type="binary"/>
+	<fileTypes extension="java" type="text"/>
+	<fileTypes extension="classpath" type="text"/>
+	<fileTypes extension="properties" type="text"/>
+	<fileTypes extension="class" type="binary"/>
+	<fileTypes extension="jar" type="binary"/>
+	<fileTypes extension="jardesc" type="text"/>
+	<fileTypes extension="zip" type="binary"/>
 </extension>
+      
+<!-- =================================================================================== -->
+<!-- Extension: Java Content Types                                                       -->
+<!-- =================================================================================== -->
+<extension point="org.eclipse.core.runtime.contentTypes">
+	<!-- declares a content type for Java Properties files -->
+	<content-type id="javaProperties" name="%javaPropertiesName" 
+		base-type="org.eclipse.core.runtime.text"
+		priority="high"				
+		file-extensions="properties"
+		default-charset="ISO-8859-1"/>
+	<!-- Associates .classpath to the XML content type -->
+	<file-association 
+		content-type="org.eclipse.core.runtime.xml" 
+		file-names=".classpath"/>  
+</extension>
+
 
 </plugin>
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/FieldDeclarationMatch.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/FieldDeclarationMatch.java
index d20c332..a44a317 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/FieldDeclarationMatch.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/FieldDeclarationMatch.java
@@ -16,6 +16,9 @@
 /**
  * A Java search match that represents a field declaration.
  * The element is an <code>IField</code>.
+ * <p>
+ * This class is intended to be instantiated and subclassed by clients.
+ * </p>
  * 
  * @since 3.0
  */
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/FieldReferenceMatch.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/FieldReferenceMatch.java
index 0a1b98a..4868aff 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/FieldReferenceMatch.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/FieldReferenceMatch.java
@@ -16,6 +16,9 @@
 /**
  * A Java search match that represents a field reference.
  * The element is the inner-most enclosing member that references this field.
+ * <p>
+ * This class is intended to be instantiated and subclassed by clients.
+ * </p>
  * 
  * @since 3.0
  */
@@ -48,7 +51,7 @@
 	/**
 	 * @see org.eclipse.jdt.core.search.SearchMatch#isInsideDocComment()
 	 */
-	public boolean isInsideDocComment() {
+	public final boolean isInsideDocComment() {
 		return this.insideDocComment;
 	}
 
@@ -58,7 +61,7 @@
 	 * 
 	 * @return whether the field reference is a read access to the field.
 	 */
-	public boolean isReadAccess() {
+	public final boolean isReadAccess() {
 		return this.isReadAccess;
 	}
 
@@ -68,7 +71,7 @@
 	 * 
 	 * @return whether the field reference is a write access to the field.
 	 */
-	public boolean isWriteAccess() {
+	public final boolean isWriteAccess() {
 		return this.isWriteAccess;
 	}
 	
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/LocalVariableDeclarationMatch.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/LocalVariableDeclarationMatch.java
index dfe410c..ea42f42 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/LocalVariableDeclarationMatch.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/LocalVariableDeclarationMatch.java
@@ -16,6 +16,9 @@
 /**
  * A Java search match that represents a local variable declaration.
  * The element is an <code>ILocalVariable</code>.
+ * <p>
+ * This class is intended to be instantiated and subclassed by clients.
+ * </p>
  * 
  * @since 3.0
  */
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/LocalVariableReferenceMatch.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/LocalVariableReferenceMatch.java
index f925431..34cc7c3 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/LocalVariableReferenceMatch.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/LocalVariableReferenceMatch.java
@@ -16,6 +16,9 @@
 /**
  * A Java search match that represents a local variable reference.
  * The element is the inner-most enclosing member that references this local variable.
+ * <p>
+ * This class is intended to be instantiated and subclassed by clients.
+ * </p>
  * 
  * @since 3.0
  */
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/MethodDeclarationMatch.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/MethodDeclarationMatch.java
index 1c08aa0..2bb5438 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/MethodDeclarationMatch.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/MethodDeclarationMatch.java
@@ -16,6 +16,9 @@
 /**
  * A Java search match that represents a method declaration.
  * The element is an <code>IMethod</code>.
+ * <p>
+ * This class is intended to be instantiated and subclassed by clients.
+ * </p>
  * 
  * @since 3.0
  */
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/MethodReferenceMatch.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/MethodReferenceMatch.java
index b1eb613..49973ee 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/MethodReferenceMatch.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/MethodReferenceMatch.java
@@ -16,6 +16,9 @@
 /**
  * A Java search match that represents a method reference.
  * The element is the inner-most enclosing member that references this method.
+ * <p>
+ * This class is intended to be instantiated and subclassed by clients.
+ * </p>
  * 
  * @since 3.0
  */
@@ -42,7 +45,7 @@
 	/**
 	 * @see org.eclipse.jdt.core.search.SearchMatch#isInsideDocComment()
 	 */
-	public boolean isInsideDocComment() {
+	public final boolean isInsideDocComment() {
 		return this.insideDocComment;
 	}
 	
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/PackageDeclarationMatch.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/PackageDeclarationMatch.java
index 967a445..d94cfca 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/PackageDeclarationMatch.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/PackageDeclarationMatch.java
@@ -16,6 +16,9 @@
 /**
  * A Java search match that represents a package declaration.
  * The element is an <code>IPackageFragment</code>.
+ * <p>
+ * This class is intended to be instantiated and subclassed by clients.
+ * </p>
  * 
  * @since 3.0
  */
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/PackageReferenceMatch.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/PackageReferenceMatch.java
index 43da758..5379917 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/PackageReferenceMatch.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/PackageReferenceMatch.java
@@ -15,7 +15,10 @@
 
 /**
  * A Java search match that represents a package reference.
- * The element is the inner-most enclosing member that references this package.
+ * The element is the inner-most enclosing member that references this package. * <p>
+ * This class is intended to be instantiated and subclassed by clients.
+ * </p>
+
  * 
  * @since 3.0
  */
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/SearchDocument.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/SearchDocument.java
index b5ec169..fab8778 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/SearchDocument.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/SearchDocument.java
@@ -10,78 +10,109 @@
  *******************************************************************************/
 package org.eclipse.jdt.core.search;
 
+import org.eclipse.jdt.internal.core.search.indexing.InternalSearchDocument;
+
 /**
  * A search document encapsulates a content to be either indexed or searched in.
  * A search particpant creates a search document.
+ * <p>
+ * This class is intended to be subclassed by clients.
+ * </p>
  * 
  * @since 3.0
  */
-public class SearchDocument {
-	protected String documentPath;
-	protected SearchParticipant participant;
+public abstract class SearchDocument extends InternalSearchDocument {
+	private String documentPath;
+	private SearchParticipant participant;
 	
 	/**
-	 * Internal field: do not use
-	 */
-	public org.eclipse.jdt.internal.core.index.Index index;
-
-	/**
-	 * Creates a new search document.
+	 * Creates a new search document. The given document path is a string that uniquely identifies the document.
+	 * Most of the time it is a workspace-relative path, but it can also be a file system path, or a path inside a zip file.
 	 * 
-	 * @param documentPath the path to the document on disk or <code>null</code> if not provided
+	 * @param documentPath the path to the document,
+	 * or <code>null</code> if none
 	 * @param participant the participant that creates the search document
 	 */
-	public SearchDocument(String documentPath, SearchParticipant participant) {
+	protected SearchDocument(String documentPath, SearchParticipant participant) {
 		this.documentPath = documentPath;
 		this.participant = participant;
 	}
 
 	/**
-	 * Returns the contents of this document.
-	 * Contents may be different from actual resource at corresponding document path,
-	 * in case of preprocessing.
+	 * Adds the given index entry (category and key) coming from this
+	 * document to the index. This method must be called from
+	 * {@link SearchParticipant#indexDocument(SearchDocument document, org.eclipse.core.runtime.IPath indexPath).
 	 * 
-	 * @return the contents of this document.
+	 * @param category the category of the index entry
+	 * @param key the key of the index entry
 	 */
-	public byte[] getByteContents() {
-		return null;
+	public void addIndexEntry(char[] category, char[] key) {
+		super.addIndexEntry(category, key);
 	}
-
+	
 	/**
 	 * Returns the contents of this document.
 	 * Contents may be different from actual resource at corresponding document path,
 	 * in case of preprocessing.
+	 * <p>
+	 * This method must be implemented in subclasses.
+	 * </p>
 	 * 
-	 * @return the contents of this document.
+	 * @return the contents of this document,
+	 * or <code>null</code> if none
 	 */
-	public char[] getCharContents() {
-		return null;
-	}
+	public abstract byte[] getByteContents();
 
 	/**
-	 * Returns the encoding for this document
+	 * Returns the contents of this document.
+	 * Contents may be different from actual resource at corresponding document
+	 * path due to preprocessing.
+	 * <p>
+	 * This method must be implemented in subclasses.
+	 * </p>
 	 * 
-	 * @return the encoding for this document
+	 * @return the contents of this document,
+	 * or <code>null</code> if none
 	 */
-	public String getEncoding() {
-		return null;
-	}
+	public abstract char[] getCharContents();
 
 	/**
-	 * Returns the participant that created this document
+	 * Returns the encoding for this document.
+	 * <p>
+	 * This method must be implemented in subclasses.
+	 * </p>
+	 * 
+	 * @return the encoding for this document,
+	 * or <code>null</code> if none
+	 */
+	public abstract String getEncoding();
+
+	/**
+	 * Returns the participant that created this document.
 	 * 
 	 * @return the participant that created this document
 	 */
-	public SearchParticipant getParticipant() {
+	public final SearchParticipant getParticipant() {
 		return this.participant;
 	}
 	
 	/**
-	 * Returns the path to the original document to publicly mention in index or search results.
+	 * Returns the path to the original document to publicly mention in index
+	 * or search results. This path is a string that uniquely identifies the document.
+	 * Most of the time it is a workspace-relative path, but it can also be a file system path, 
+	 * or a path inside a zip file.
 	 * 
 	 * @return the path to the document
 	 */	
-	public String getPath() {
+	public final String getPath() {
 		return this.documentPath;
 	}
+	/**
+	 * Removes all index entries from the index for the given document.
+	 * This method must be called from 
+	 * {@link SearchParticipant#indexDocument(SearchDocument document, org.eclipse.core.runtime.IPath indexPath).
+	 */
+	public void removeAllIndexEntries() {
+		super.removeAllIndexEntries();
+	}
 }
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/SearchMatch.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/SearchMatch.java
index 605582a..4cf1d82 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/SearchMatch.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/SearchMatch.java
@@ -21,6 +21,9 @@
  * a compile-time problem prevents the search engine from completely resolving
  * the match.
  * </p>
+ * <p>
+ * This class is intended to be instantiated and subclassed by clients.
+ * </p>
  * 
  * @see SearchEngine#search(SearchPattern, SearchParticipant[], IJavaSearchScope, SearchRequestor, org.eclipse.core.runtime.IProgressMonitor)
  * @since 3.0
@@ -50,7 +53,8 @@
 	/**
 	 * Creates a new search match.
 	 * 
-	 * @param element the element that encloses or corresponds to the match
+	 * @param element the element that encloses or corresponds to the match,
+	 * or <code>null</code> if none
 	 * @param accuracy one of A_ACCURATE or A_INACCURATE
 	 * @param offset the offset the match starts at, or -1 if unknown
 	 * @param length the length of the match, or -1 if unknown
@@ -77,16 +81,16 @@
 	 * 
 	 * @return one of {@link #A_ACCURATE} or {@link #A_INACCURATE}
 	 */
-	public int getAccuracy() {
+	public final int getAccuracy() {
 		return this.accuracy;
 	}
 
 	/**
 	 * Returns the element of this search match.
 	 * 
-	 * @return the element of the search match
+	 * @return the element of the search match, or <code>null</code> if none
 	 */
-	public Object getElement() {
+	public final Object getElement() {
 		return this.element;
 	}
 
@@ -95,7 +99,7 @@
 	 * 
 	 * @return the length of this search match, or -1 if unknown
 	 */
-	public int getLength() {
+	public final int getLength() {
 		return this.length;
 	}
 	
@@ -104,7 +108,7 @@
 	 * 
 	 * @return the offset of this search match, or -1 if unknown
 	 */
-	public int getOffset() {
+	public final int getOffset() {
 		return this.offset;
 	}
 	
@@ -113,7 +117,7 @@
 	 * 
 	 * @return the participant which issued this search match
 	 */
-	public SearchParticipant getParticipant() {
+	public final SearchParticipant getParticipant() {
 		return this.participant;
 	}
 	
@@ -122,7 +126,7 @@
 	 * 
 	 * @return the resource of the match, or <code>null</code> if none
 	 */
-	public IResource getResource() {
+	public final IResource getResource() {
 		return this.resource;
 	}
 	
@@ -134,6 +138,7 @@
 	 * comment, and <code>false</code> otherwise
 	 * @deprecated Use {@link #isInsideDocComment()} instead.
 	 */
+	 // TODO (jerome) - remove this method before M9
 	public boolean insideDocComment() {
 		return isInsideDocComment();
 	}
@@ -145,6 +150,7 @@
 	 * @return <code>true</code> if this search match is inside a Java doc
 	 * comment, and <code>false</code> otherwise
 	 */
+	//	 TODO (jerome) - it would be better to provide a private field and a public final get/set methods
 	public boolean isInsideDocComment() {
 		// default is outside a doc comment
 		return false;
@@ -155,7 +161,7 @@
 	 * 
 	 * @param length the length of this match, or -1 if unknown
 	 */
-	public void setLength(int length) {
+	public final void setLength(int length) {
 		this.length = length;
 	}
 	
@@ -164,7 +170,7 @@
 	 * 
 	 * @param offset the offset of this match, or -1 if unknown
 	 */
-	public void setOffset(int offset) {
+	public final void setOffset(int offset) {
 		this.offset = offset;
 	}
 }
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/SearchParticipant.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/SearchParticipant.java
index 4f1b6b2..9d19602 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/SearchParticipant.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/SearchParticipant.java
@@ -11,87 +11,176 @@
 package org.eclipse.jdt.core.search;
 
 import org.eclipse.core.runtime.*;
-import org.eclipse.core.resources.IFile;
 import org.eclipse.jdt.internal.core.JavaModelManager;
 
 /**
- * A search participant describes a particular extension to a generic search mechanism, permitting 
- * combined search actions which will involve all required participants.
+ * A search participant describes a particular extension to a generic search
+ * mechanism, permitting combined search actions which will involve all required
+ * participants.
+ * <p>
+ * A search participant is involved in the indexing phase and in the search phase. 
+ * The indexing phase consists in taking one or more search documents, parse them, and
+ * add index entries in an index chosen by the participant. An index is identified by a
+ * path on disk.
+ * The search phase consists in selecting the indexes corresponding to a search pattern
+ * and a search scope, from these indexes the search infrastructure extracts the document paths
+ * that match the search pattern asking the search participant for the corresponding document,
+ * finally the search participant is asked to locate the matches precisely in these search documents.
+ * </p>
+ * <p>
+ * This class is intended to be subclassed by clients. During the indexing phase, 
+ * a subclass will be called with the following requests in order:
+ * <ul>
+ * <li>{@link #scheduleDocumentIndexing(SearchDocument, IPath)}</li>
+ * <li>{@link #indexDocument(SearchDocument, IPath)}</li>
+ * </ul>
+ * During the search phase, a subclass will be called with the following requests in order:
+ * <ul>
+ * <li>{@link #selectIndexes(SearchPattern, IJavaSearchScope)}</li>
+ * <li>one or more {@link #getDocument(String)}</li>
+ * <li>{@link #locateMatches(SearchDocument[], SearchPattern, IJavaSearchScope, SearchRequestor, IProgressMonitor)}</li>
+ * </ul>
+ * </p>
  * 
- * A search scope defines which participants are involved. 
- * 
- * A search participant is responsible for holding index files, and selecting the appropriate ones to feed to
- * index queries. It also can map a document path to an actual document (note that documents could live outside
- * the workspace or not exist yet, and thus aren't just resources).
  * @since 3.0
  */
 public abstract class SearchParticipant {
 
-	public static final SearchParticipant[] NO_PARTICIPANT = {};
-
-	// A service provided for participants. Its called from indexDocument(SearchDocument document, IPath indexPath)
-	public static void addIndexEntry(char[] category, char[] key, SearchDocument document) {
-		if (document.index != null)
-			document.index.addIndexEntry(category, key, document);
+	/**
+	 * Creates a new search participant.
+	 */
+	protected SearchParticipant() {
+		// do nothing
 	}
-	// A service provided for participants. Its called from indexDocument(SearchDocument document, IPath indexPath)
-	public static void removeAllIndexEntries(SearchDocument document) {
-		if (document.index != null)
-			document.index.remove(document.getPath());
+	
+	/**
+	 * Notification that this participant's help is needed in a search.
+	 * <p>
+	 * This method should be re-implemented in subclasses that need to do something
+	 * when the participant is needed in a search.
+	 * </p>
+	 */
+	public void beginSearching() {
+		// do nothing
 	}
 
 	/**
-	 * Intermediate notification sent when a given participant is getting involved.
+	 * Notification that this participant's help is no longer needed.
+	 * <p>
+	 * This method should be re-implemented in subclasses that need to do something
+	 * when the participant is no longer needed in a search.
+	 * </p>
 	 */
-	public abstract void beginSearching();
+	public void doneSearching() {
+		// do nothing
+	}
 
 	/**
-	 * Intermediate notification sent when a given participant is finished to be involved.
+	 * Returns a displayable name of this search participant.
+	 * <p>
+	 * This method should be re-implemented in subclasses that need to 
+	 * display a meaningfull name.
+	 * </p>
+	 * 
+	 * @return the displayable name of this search participant
 	 */
-	public abstract void doneSearching();
+	public String getDescription() {
+		return "Search participant"; //$NON-NLS-1$
+	}
 
 	/**
-	 * Returns a displayable name of this search participant. e.g. "Java".
-	 */
-	public abstract String getDescription();
-
-	/**
-	 * Bind a file to an actual document.
-	 */
-	public abstract SearchDocument getDocument(IFile file);
-
-	/**
-	 * Bind a document path to an actual document. A document path is interpreted by a participant.
+	 * Returns a search document for the given path.
+	 * The given document path is a string that uniquely identifies the document.
+	 * Most of the time it is a workspace-relative path, but it can also be a file system path, or a path inside a zip file.
+	 * <p>
+	 * Implementors of this method can either create an instance of their own subclass of 
+	 * {@link SearchDocument} or return an existing instance of such a subclass.
+	 * </p>
+	 * 
+	 * @param documentPath the path of the document.
+	 * @return a search document
 	 */
 	public abstract SearchDocument getDocument(String documentPath);
 
 	/**
-	 * Index the given document.
-	 * Implementation should call addIndexEntry(...)
-	 * If delegating to another participant, it should use the original index location (and not the delegatee's one)
-	 * TODO (jerome) improve spec
+	 * Indexes the given document in the given index. A search participant
+	 * asked to index a document should parse it and call 
+	 * {@link #addIndexEntry(char[], char[], SearchDocument)} as many times as
+	 * needed to add index entries to the index. If delegating to another
+	 * participant, it should use the original index location (and not the
+	 * delegatee's one).
+	 * <p>
+	 * The given index location must represent a path in the file system to a file that
+	 * either already exists or is going to be created. If it exists, it must be an index file,
+	 * otherwise its data might be overwritten.
+	 * </p><p>
+	 * Clients are not expected to call this method.
+	 * </p>
+	 * 
+	 * @param document the document to index
+	 * @param indexLocation the location in the file system to the index
 	 */
-	public abstract void indexDocument(SearchDocument document, IPath indexPath);
+	public abstract void indexDocument(SearchDocument document, IPath indexLocation);
 
 	/**
-	 * Locate the matches in the given documents and report them using the search requestor. 
-	 * Note: permits combined match locators (e.g. jsp match locator can preprocess jsp unit contents and feed them
-	 * to Java match locator asking for virtual matches by contributing document implementations which do the conversion).
-	 * It is assumed that virtual matches are rearranged by requestor for adapting line/source positions before submitting
-	 * final results so the provided searchRequestor should intercept virtual matches and do appropriate conversions.
+	 * Locates the matches in the given documents using the given search pattern
+	 * and search scope, and reports them to the givenn search requestor. This
+	 * method is called by the search engine once it has search documents
+	 * matching the given pattern in the given search scope.
+	 * <p>
+	 * Note that a participant (e.g. a JSP participant) can pre-process the contents of the given documents, 
+	 * create its own documents whose contents are Java compilation units and delegate the match location 
+	 * to the default participant (see {@link SearchEngine#getDefaultSearchParticipant()}). Passing its own
+	 * {@link SearchRequestor} this particpant can then map the match positions back to the original
+	 * contents, create its own matches and report them to the original requestor.
+	 * </p><p>
+	 * Implementors of this method should check the progress monitor
+	 * for cancelation when it is safe and appropriate to do so.  The cancelation
+	 * request should be propagated to the caller by throwing 
+	 * <code>OperationCanceledException</code>.
+	 * </p>
+	 * 
+	 * @param documents the documents to locate matches in
+	 * @param pattern the search pattern to use when locating matches
+	 * @param scope the scope to limit the search to
+	 * @param requestor the requestor to report matches to
+	 * @param monitor the progress monitor to report progress to,
+	 * or <code>null</code> if no progress should be reported
+	 * @throws CoreException if the requestor had problem accepting one of the matches
 	 */
-	public abstract void locateMatches(SearchDocument[] indexMatches, SearchPattern pattern, IJavaSearchScope scope, SearchRequestor requestor, IProgressMonitor monitor) throws CoreException;
+	public abstract void locateMatches(SearchDocument[] documents, SearchPattern pattern, IJavaSearchScope scope, SearchRequestor requestor, IProgressMonitor monitor) throws CoreException;
 
 	/**
 	 * Schedules the indexing of the given document.
-	 * Once the document is ready to be indexed, indexDocument(document, indexPath) is called.
+	 * Once the document is ready to be indexed, 
+	 * {@link #indexDocument(SearchDocument, IPath) indexDocument(document, indexPath)}
+	 * will be called in a different thread than the caller's thread.
+	 * <p>
+	 * The given index location must represent a path in the file system to a file that
+	 * either already exists or is going to be created. If it exists, it must be an index file,
+	 * otherwise its data might be overwritten.
+	 * </p>
+	 * 
+	 * @param document the document to index
+	 * @param indexLocation the location on the file system of the index
 	 */
-	public void scheduleDocumentIndexing(SearchDocument document, IPath indexPath) {
-		JavaModelManager.getJavaModelManager().getIndexManager().scheduleDocumentIndexing(document, indexPath, this);
+	public final void scheduleDocumentIndexing(SearchDocument document, IPath indexLocation) {
+		JavaModelManager.getJavaModelManager().getIndexManager().scheduleDocumentIndexing(document, indexLocation, this);
 	}
 
 	/**
-	 * Returns the collection of index paths to consider when performing a given search query in a given scope.
+	 * Returns the collection of index locations to consider when performing the
+	 * given search query in the given scope. The search engine calls this
+	 * method before locating matches.
+	 * <p>
+	 * An index location represents a path in the file system to a file that holds index information. 
+	 * </p><p>
+	 * Clients are not expected to call this method.
+	 * </p>
+	 * 
+	 * @param query the search pattern to consider
+	 * @param scope the given search scope
+	 * @return the collection of index paths to consider
 	 */
 	public abstract IPath[] selectIndexes(SearchPattern query, IJavaSearchScope scope);
 }
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/SearchRequestor.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/SearchRequestor.java
index b7e514b..7a6ebe3 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/SearchRequestor.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/SearchRequestor.java
@@ -54,8 +54,8 @@
 
 	/**
 	 * Notification sent after having completed the search action.
-	 * Typically, this would tell a search requestor collector that no more results  should be expected in this
-	 * iteration.
+	 * Typically, this would tell a search requestor collector that no more
+	 * results will be forthcomping in this search.
 	 * <p>
 	 * The default implementation of this method does nothing. Subclasses
 	 * may override.
@@ -66,7 +66,7 @@
 	}
 
 	/**
-	 * Intermediate notification sent when a given participant is starting to
+	 * Intermediate notification sent when the given participant starts to
 	 * contribute.
 	 * <p>
 	 * The default implementation of this method does nothing. Subclasses
@@ -80,7 +80,7 @@
 	}
 
 	/**
-	 * Intermediate notification sent when a given participant is finished
+	 * Intermediate notification sent when the given participant is finished
 	 * contributing.
 	 * <p>
 	 * The default implementation of this method does nothing. Subclasses
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/TypeDeclarationMatch.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/TypeDeclarationMatch.java
index b2042d9..0b69db4 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/TypeDeclarationMatch.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/TypeDeclarationMatch.java
@@ -16,6 +16,9 @@
 /**
  * A Java search match that represents a type declaration.
  * The element is an <code>IType</code>.
+ * <p>
+ * This class is intended to be instantiated and subclassed by clients.
+ * </p>
  * 
  * @since 3.0
  */
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/TypeReferenceMatch.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/TypeReferenceMatch.java
index 91a1c6e..ced1bb0 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/TypeReferenceMatch.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/TypeReferenceMatch.java
@@ -16,6 +16,9 @@
 /**
  * A Java search match that represents a type reference.
  * The element is the inner-most enclosing member that references this type.
+ * <p>
+ * This class is intended to be instantiated and subclassed by clients.
+ * </p>
  * 
  * @since 3.0
  */
@@ -42,7 +45,7 @@
 	/**
 	 * @see org.eclipse.jdt.core.search.SearchMatch#isInsideDocComment()
 	 */
-	public boolean isInsideDocComment() {
+	public final boolean isInsideDocComment() {
 		return this.insideDocComment;
 	}
 }
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/Index.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/Index.java
index ca7e8d8..44a4f5b 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/Index.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/Index.java
@@ -17,6 +17,7 @@
 import org.eclipse.jdt.core.search.*;
 import org.eclipse.jdt.internal.compiler.util.HashtableOfObject;
 import org.eclipse.jdt.internal.core.util.*;
+import org.eclipse.jdt.internal.core.search.indexing.InternalSearchDocument;
 import org.eclipse.jdt.internal.core.search.indexing.ReadWriteMonitor;
 
 /**
@@ -94,7 +95,7 @@
 	this.diskIndex = new DiskIndex(fileName);
 	this.diskIndex.initialize(reuseExistingFile);
 }
-public void addIndexEntry(char[] category, char[] key, SearchDocument document) {
+public void addIndexEntry(char[] category, char[] key, InternalSearchDocument document) {
 	this.memoryIndex.addIndexEntry(category, key, document);
 }
 public File getIndexFile() {
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/MemoryIndex.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/MemoryIndex.java
index 464b1d3..ca44041 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/MemoryIndex.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/index/MemoryIndex.java
@@ -11,6 +11,7 @@
 package org.eclipse.jdt.internal.core.index;
 
 import org.eclipse.jdt.core.search.*;
+import org.eclipse.jdt.internal.core.search.indexing.InternalSearchDocument;
 import org.eclipse.jdt.internal.core.util.*;
 import org.eclipse.jdt.internal.compiler.util.HashtableOfObject;
 
@@ -39,7 +40,7 @@
 				results.add(paths[i]);
 	}
 }
-void addIndexEntry(char[] category, char[] key, SearchDocument document) {
+void addIndexEntry(char[] category, char[] key, InternalSearchDocument document) {
 	// assumed a document was removed before its reindexed
 	String documentName = document.getPath();
 	HashtableOfObject referenceTable = (HashtableOfObject) this.docsToReferences.get(documentName);
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/JavaSearchDocument.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/JavaSearchDocument.java
index 964e646..3d23b40 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/JavaSearchDocument.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/JavaSearchDocument.java
@@ -82,16 +82,16 @@
 	}
 	private IFile getFile() {
 		if (this.file == null)
-			this.file = (IFile) ResourcesPlugin.getWorkspace().getRoot().findMember(new Path(this.documentPath));
+			this.file = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(getPath()));
 		return this.file;
 	}
 	private IPath getLocation() {
 		IFile resource = getFile();
 		if (resource != null)
 			return resource.getLocation();
-		return new Path(this.documentPath); // external file
+		return new Path(getPath()); // external file
 	}
 	public String toString() {
-		return "SearchDocument for " + this.documentPath; //$NON-NLS-1$
+		return "SearchDocument for " + getPath(); //$NON-NLS-1$
 	}
 }
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/JavaSearchParticipant.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/JavaSearchParticipant.java
index 3fc6a9e..e0461a4 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/JavaSearchParticipant.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/JavaSearchParticipant.java
@@ -11,7 +11,6 @@
 package org.eclipse.jdt.internal.core.search;
 
 import org.eclipse.core.runtime.*;
-import org.eclipse.core.resources.IFile;
 import org.eclipse.jdt.core.search.*;
 import org.eclipse.jdt.internal.core.search.indexing.BinaryIndexer;
 import org.eclipse.jdt.internal.core.search.indexing.SourceIndexer;
@@ -35,6 +34,7 @@
 	 * @see org.eclipse.jdt.core.search.SearchParticipant#beginSearching()
 	 */
 	public void beginSearching() {
+		super.beginSearching();
 		this.indexSelector = null;
 	}
 
@@ -43,6 +43,7 @@
 	 */
 	public void doneSearching() {
 		this.indexSelector = null;
+		super.doneSearching();
 	}
 
 	/* (non-Javadoc)
@@ -53,13 +54,6 @@
 	}
 	
 	/* (non-Javadoc)
-	 * @see org.eclipse.jdt.core.search.SearchParticipant#getDocument(IFile)
-	 */
-	public SearchDocument getDocument(IFile file) {
-		return new JavaSearchDocument(file, this);
-	}
-
-	/* (non-Javadoc)
 	 * @see org.eclipse.jdt.core.search.SearchParticipant#getDocument(String)
 	 */
 	public SearchDocument getDocument(String documentPath) {
@@ -71,7 +65,7 @@
 	 */
 	public void indexDocument(SearchDocument document, IPath indexPath) {
 		// TODO must verify that the document + indexPath match, when this is not called from scheduleDocumentIndexing
-		removeAllIndexEntries(document); // in case the document was already indexed
+		document.removeAllIndexEntries(); // in case the document was already indexed
 
 		String documentPath = document.getPath();
 		if (org.eclipse.jdt.internal.compiler.util.Util.isJavaFileName(documentPath)) {
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/AbstractIndexer.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/AbstractIndexer.java
index 55f45c7..b2bec59 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/AbstractIndexer.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/AbstractIndexer.java
@@ -12,7 +12,6 @@
 
 import org.eclipse.jdt.core.compiler.CharOperation;
 import org.eclipse.jdt.core.search.SearchDocument;
-import org.eclipse.jdt.core.search.SearchParticipant;
 import org.eclipse.jdt.internal.core.search.matching.*;
 
 public abstract class AbstractIndexer implements IIndexConstants {
@@ -64,7 +63,7 @@
 		addNameReference(fieldName);
 	}
 	protected void addIndexEntry(char[] category, char[] key) {
-		SearchParticipant.addIndexEntry(category, key, this.document);
+		this.document.addIndexEntry(category, key);
 	}
 	public void addInterfaceDeclaration(int modifiers, char[] packageName, char[] name, char[][] enclosingTypeNames, char[][] superinterfaces) {
 		addIndexEntry(TYPE_DECL, TypeDeclarationPattern.createIndexKey(name, packageName, enclosingTypeNames, INTERFACE_SUFFIX));
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/IndexAllProject.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/IndexAllProject.java
index f49df91..6faae93 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/IndexAllProject.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/IndexAllProject.java
@@ -27,7 +27,6 @@
 import org.eclipse.jdt.internal.core.ClasspathEntry;
 import org.eclipse.jdt.internal.core.JavaProject;
 import org.eclipse.jdt.internal.core.index.Index;
-import org.eclipse.jdt.internal.core.search.JavaSearchDocument;
 import org.eclipse.jdt.internal.core.search.processing.JobManager;
 import org.eclipse.jdt.internal.core.util.SimpleLookupTable;
 import org.eclipse.jdt.internal.core.util.Util;
@@ -112,7 +111,7 @@
 													if (exclusionPatterns != null || inclusionPatterns != null)
 														if (Util.isExcluded(file, inclusionPatterns, exclusionPatterns))
 															return false;
-													indexedFileNames.put(new JavaSearchDocument(file, null).getPath(), file);
+													indexedFileNames.put(file.getFullPath().toString(), file);
 												}
 												return false;
 											case IResource.FOLDER :
@@ -141,7 +140,7 @@
 													if (exclusionPatterns != null || inclusionPatterns != null)
 														if (Util.isExcluded(file, inclusionPatterns, exclusionPatterns))
 															return false;
-													String path = new JavaSearchDocument(file, null).getPath();
+													String path = file.getFullPath().toString();
 													indexedFileNames.put(path,
 														indexedFileNames.get(path) == null || indexLastModified < location.toFile().lastModified()
 															? (Object) file
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/IndexBinaryFolder.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/IndexBinaryFolder.java
index a354246..a110150 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/IndexBinaryFolder.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/IndexBinaryFolder.java
@@ -21,7 +21,6 @@
 import org.eclipse.core.runtime.IPath;
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.jdt.internal.core.index.Index;
-import org.eclipse.jdt.internal.core.search.JavaSearchDocument;
 import org.eclipse.jdt.internal.core.search.processing.JobManager;
 import org.eclipse.jdt.internal.core.util.SimpleLookupTable;
 import org.eclipse.jdt.internal.core.util.Util;
@@ -69,7 +68,7 @@
 							if (org.eclipse.jdt.internal.compiler.util.Util.isClassFileName(proxy.getName())) {
 								IFile file = (IFile) proxy.requestResource();
 								if (file.getLocation() != null)
-									indexedFileNames.put(new JavaSearchDocument(file, null).getPath(), file);
+									indexedFileNames.put(file.getFullPath().toString(), file);
 							}
 							return false;
 						}
@@ -90,7 +89,7 @@
 									IFile file = (IFile) proxy.requestResource();
 									IPath location = file.getLocation();
 									if (location != null) {
-										String path = new JavaSearchDocument(file, null).getPath();
+										String path = file.getFullPath().toString();
 										indexedFileNames.put(path,
 											indexedFileNames.get(path) == null || indexLastModified < location.toFile().lastModified()
 												? (Object) file
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/IndexManager.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/IndexManager.java
index 10d6919..46e8438 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/IndexManager.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/indexing/IndexManager.java
@@ -32,6 +32,9 @@
 public class IndexManager extends JobManager implements IIndexConstants {
 
 	public SimpleLookupTable indexNames = new SimpleLookupTable();
+	/*
+	 * key = an IPath, value = an Index
+	 */
 	private Map indexes = new HashMap(5);
 
 	/* need to save ? */
@@ -72,7 +75,7 @@
 public void addBinary(IFile resource, IPath indexPath) {
 	if (JavaCore.getPlugin() == null) return;	
 	SearchParticipant participant = SearchEngine.getDefaultSearchParticipant();
-	SearchDocument document = participant.getDocument(resource);
+	SearchDocument document = participant.getDocument(resource.getFullPath().toString());
 	participant.scheduleDocumentIndexing(document, indexPath);
 }
 /**
@@ -82,7 +85,7 @@
 public void addSource(IFile resource, IPath indexPath) {
 	if (JavaCore.getPlugin() == null) return;	
 	SearchParticipant participant = SearchEngine.getDefaultSearchParticipant();
-	SearchDocument document = participant.getDocument(resource);
+	SearchDocument document = participant.getDocument(resource.getFullPath().toString());
 	participant.scheduleDocumentIndexing(document, indexPath);
 }
 /*
@@ -231,10 +234,10 @@
 }
 public void indexDocument(SearchDocument searchDocument, SearchParticipant searchParticipant, Index index, IPath indexPath) throws IOException {
 	try {
-		searchDocument.index = index;
+		((InternalSearchDocument) searchDocument).index = index;
 		searchParticipant.indexDocument(searchDocument, indexPath);
 	} finally {
-		searchDocument.index = null;
+		((InternalSearchDocument) searchDocument).index = null;
 	}
 }
 /**
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/FieldPattern.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/FieldPattern.java
index dd2acae..0d54c81 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/FieldPattern.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/FieldPattern.java
@@ -29,7 +29,7 @@
 protected static char[][] DECL_CATEGORIES = { FIELD_DECL };
 
 public static char[] createIndexKey(char[] fieldName) {
-	return encodeIndexKey(fieldName, R_EXACT_MATCH);
+	return fieldName;
 }
 
 public FieldPattern(
@@ -59,7 +59,7 @@
 	return new FieldPattern(false, false, false, null, null, null, null, null, R_EXACT_MATCH | R_CASE_SENSITIVE);
 }
 public char[] getIndexKey() {
-	return encodeIndexKey(this.name, getMatchMode());
+	return this.name;
 }
 public char[][] getMatchCategories() {
 	if (this.findReferences)
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/PackageReferencePattern.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/PackageReferencePattern.java
index 4c89362..f8b75b2 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/PackageReferencePattern.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/PackageReferencePattern.java
@@ -49,7 +49,7 @@
 public char[] getIndexKey() {
 	// Package reference keys are encoded as 'name' (where 'name' is the last segment of the package name)
 	if (this.currentSegment >= 0) 
-		return encodeIndexKey(this.segments[this.currentSegment], getMatchMode());
+		return this.segments[this.currentSegment];
 	return null;
 }
 public char[][] getMatchCategories() {
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/TypeReferencePattern.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/TypeReferencePattern.java
index fff42df..8bccb5b 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/TypeReferencePattern.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/TypeReferencePattern.java
@@ -51,11 +51,11 @@
 }
 public char[] getIndexKey() {
 	if (this.simpleName != null)
-		return encodeIndexKey(this.simpleName, getMatchMode());
+		return this.simpleName;
 
 	// Optimization, eg. type reference is 'org.eclipse.jdt.core.*'
 	if (this.currentSegment >= 0) 
-		return encodeIndexKey(this.segments[this.currentSegment], getMatchMode());
+		return this.segments[this.currentSegment];
 	return null;
 }
 public char[][] getMatchCategories() {
