JDK_1_5-Merge with HEAD: v_423a
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() {