update jdt.core to I20210524-1800
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java
index 167b2bf..a7eca69 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/BatchCompilerTest.java
@@ -652,7 +652,7 @@
         "    --processor-module-path <directories separated by " + File.pathSeparator + ">\n" +
         "                       specify module path where annotation processors\n" +
         "                       can be found\n" +
-        "    --system <jdk>      Override location of system modules\n" +
+        "    --system <jdk>     Override location of system modules\n" +
         "    --add-exports <module>/<package>=<other-module>(,<other-module>)*\n" +
         "                       specify additional package exports clauses to the\n" +
         "                       given modules\n" +
@@ -664,8 +664,7 @@
         "                       resolved to be root modules\n" +
         "    --limit-modules <module>(,<module>)*\n" +
         "                       specify the observable module names\n" +
-        "    --release <release>\n" +
-        "                       compile for a specific VM version\n" +
+        "    --release <release> compile for a specific VM version\n" +
         " \n" +
         " Compliance options:\n" +
         "    -1.3               use 1.3 compliance (-source 1.3 -target 1.1)\n" +
@@ -712,18 +711,18 @@
         "                                      reported as errors\n" +
         " \n" +
         " Info options:\n" +
-        "    -info:<warnings separated by ,>    convert exactly the listed warnings\n" +
+        "    -info:<warnings separated by ,>   convert exactly the listed warnings\n" +
         "                                      to be reported as infos\n" +
-        "    -info:+<warnings separated by ,>   enable additional warnings to be\n" +
+        "    -info:+<warnings separated by ,>  enable additional warnings to be\n" +
         "                                      reported as infos\n" +
-        "    -info:-<warnings separated by ,>   disable specific warnings to be\n" +
+        "    -info:-<warnings separated by ,>  disable specific warnings to be\n" +
         "                                      reported as infos\n" +
         " \n" +
         " Setting warning, error or info options using properties file:\n" +
         "    -properties <file>   set warnings/errors/info option based on the properties\n" +
-        "                          file contents. This option can be used with -nowarn,\n" +
-        "                          -err:.., -info: or -warn:.. options, but the last one\n" +
-        "                          on the command line sets the options to be used.\n" +
+        "                         file contents. This option can be used with -nowarn,\n" +
+        "                         -err:.., -info: or -warn:.. options, but the last one\n" +
+        "                         on the command line sets the options to be used.\n" +
         " \n" +
         " Debug options:\n" +
         "    -g[:lines,vars,source] custom debug info\n" +
@@ -829,11 +828,11 @@
         "    -deprecation         + deprecation outside deprecated code\n" +
         "    -nowarn -warn:none disable all warnings and infos\n" +
         "    -nowarn:[<directories separated by " + File.pathSeparator+ ">]\n" +
-        "                       specify directories from which optional problems should\n" +
-        "                       be ignored\n" +
-        "    -warn:<warnings separated by ,>    enable exactly the listed warnings\n" +
-        "    -warn:+<warnings separated by ,>   enable additional warnings\n" +
-        "    -warn:-<warnings separated by ,>   disable specific warnings\n" +
+        "                           specify directories from which optional problems\n" +
+        "                           should be ignored\n" +
+        "    -warn:<warnings separated by ,>   enable exactly the listed warnings\n" +
+        "    -warn:+<warnings separated by ,>  enable additional warnings\n" +
+        "    -warn:-<warnings separated by ,>  disable specific warnings\n" +
 //{ObjectTeams: new options (marked individually as //OT: )
 //OT (2x):
         "      abstractrelevantrole + abstract relevant role (OTJLD 2.5(b))\n" +
@@ -855,7 +854,7 @@
         "                           (OTJLD 2.1.2(b)\n" +
         "      bindingconventions + discouraged use of import / import base\n" +
         "                           (OTJLD 2.1.2(d))\n" +
-        "      bindingtosystemclass 	+ trying to bind a role to a system class\n" +
+        "      bindingtosystemclass + trying to bind a role to a system class\n" +
 //:TO
         "      boxing               autoboxing conversion\n" +
         "      charConcat         + char[] in String concat\n" +
@@ -886,7 +885,7 @@
 //OT:
         "      fragilecallin      + replace callin not providing expected result\n" +
         "                           (OTJLD 4.3(e))\n" +
-        "      hashCode              missing hashCode() method when overriding equals()\n" +
+        "      hashCode             missing hashCode() method when overriding equals()\n" +
 //OT:
 		"      hiddenLiftingProblem + a lifting that is not directly visible in source\n" +
 		"                             code could fail at runtime (OTJLD 2.3.5)\n" +
@@ -904,42 +903,45 @@
         "      invalidJavadoc       all warnings for malformed javadoc tags\n" +
         "      invalidJavadocTag    validate javadoc tag arguments\n" +
         "      invalidJavadocTagDep validate deprecated references in javadoc tag args\n" +
-        "      invalidJavadocTagNotVisible  validate non-visible references in javadoc\n" +
-        "							tag args\n" +
-        "      invalidJavadocVisibility(<visibility>)  specify visibility modifier\n" +
-        "							for malformed javadoc tag warnings\n" +
+        "      invalidJavadocTagNotVisible\n" +
+        "                           validate non-visible references in javadoc tag args\n" +
+        "      invalidJavadocVisibility(<visibility>)\n" +
+        "                           specify visibility modifier for malformed javadoc\n" +
+        "                           tag warnings\n" +
         "      javadoc              invalid javadoc\n" +
         "      localHiding          local variable hiding another variable\n" +
         "      maskedCatchBlock   + hidden catch block\n" +
         "      missingJavadocTags   missing Javadoc tags\n" +
         "      missingJavadocTagsOverriding missing Javadoc tags in overriding methods\n" +
         "      missingJavadocTagsMethod missing Javadoc tags for method type parameter\n" +
-        "      missingJavadocTagsVisibility(<visibility>)  specify visibility modifier\n" +
-        "							for missing javadoc tags warnings\n" +
-        "      missingJavadocComments   missing Javadoc comments\n" +
-        "      missingJavadocCommentsOverriding   missing Javadoc tags in overriding\n" +
-        "							methods\n" +
+        "      missingJavadocTagsVisibility(<visibility>)\n" +
+        "                           specify visibility modifier for missing javadoc\n" +
+        "                           tags warnings\n" +
+        "      missingJavadocComments  missing Javadoc comments\n" +
+        "      missingJavadocCommentsOverriding\n" +
+        "                           missing Javadoc tags in overriding methods\n" +
         "      missingJavadocCommentsVisibility(<visibility>)  specify visibility\n" +
-        "							modifier for missing javadoc comments warnings\n" +
+        "                           modifier for missing javadoc comments warnings\n" +
         "      module             + module related problems.\n" +
         "      nls                  string literal lacking non-nls tag //$NON-NLS-<n>$\n" +
         "      noEffectAssign     + assignment without effect\n" +
         "      null                 potential missing or redundant null check\n" +
-        "      nullAnnot(<annot. names separated by |>)   annotation based null analysis,\n" +
+        "      nullAnnot(<annot. names separated by |>)\n" +
+        "                           annotation based null analysis,\n" +
         "                           nullable|nonnull|nonnullbydefault annotation types\n" +
         "                           optionally specified using fully qualified names.\n" +
-        "							Enabling this option enables all null-annotation\n" +
-        "							related sub-options. These can be individually\n" +
-        "							controlled using options listed below.\n" +
+        "                           Enabling this option enables all null-annotation\n" +
+        "                           related sub-options. These can be individually\n" +
+        "                           controlled using options listed below.\n" +
         "      nullAnnotConflict    conflict between null annotation specified\n" +
-        "							and nullness inferred. Is effective only with\n" +
-        "							nullAnnot option enabled.\n" +
+        "                           and nullness inferred. Is effective only with\n" +
+        "                           nullAnnot option enabled.\n" +
         "      nullAnnotRedundant   redundant specification of null annotation. Is\n" +
-        "							effective only with nullAnnot option enabled.\n" +
+        "                           effective only with nullAnnot option enabled.\n" +
         "      nullDereference    + missing null check\n" +
-        "	   nullUncheckedConversion unchecked conversion from non-annotated type\n" +
-        "							to @NonNull type. Is effective only with\n" +
-        "							nullAnnot option enabled.\n" +
+        "      nullUncheckedConversion  unchecked conversion from non-annotated type\n" +
+        "                           to @NonNull type. Is effective only with\n" +
+        "                           nullAnnot option enabled.\n" +
         "      over-ann             missing @Override annotation (superclass)\n" +
         "      paramAssign          assignment to a parameter\n" +
         "      pkgDefaultMethod   + attempt to override package-default method\n" +
@@ -965,39 +967,39 @@
         "      syncOverride         missing synchronized in synchr. method override\n" +
         "      syntacticAnalysis    perform syntax-based null analysis for fields\n" +
         "      syntheticAccess      synthetic access for innerclass\n" +
-        "      tasks(<tags separated by |>) tasks identified by tags inside comments\n" +
+        "      tasks(<tags separated by |>)  tasks identified by tags inside comments\n" +
         "      typeHiding         + type parameter hiding another type\n" +
-        "      unavoidableGenericProblems + ignore unavoidable type safety problems\n" +
-        "                                   due to raw APIs\n" +
+        "      unavoidableGenericProblems  + ignore unavoidable type safety problems\n" +
+        "                           due to raw APIs\n" +
         "      unchecked          + unchecked type operation\n" +
         "      unlikelyCollectionMethodArgumentType\n" +
         "                         + unlikely argument type for collection method\n" +
         "                           declaring an Object parameter\n" +
-        "      unlikelyEqualsArgumentType unlikely argument type for method equals()\n" +
+        "      unlikelyEqualsArgumentType  unlikely argument type for method equals()\n" +
         "      unnecessaryElse      unnecessary else clause\n" +
         "      unqualifiedField     unqualified reference to field\n" +
         "      unused               macro for unusedAllocation, unusedArgument,\n" +
-        "                               unusedImport, unusedLabel, unusedLocal,\n" +
-        "                               unusedPrivate, unusedThrown, and unusedTypeArgs,\n" +
-        "								unusedExceptionParam\n"+
+        "                           unusedImport, unusedLabel, unusedLocal,\n" +
+        "                           unusedPrivate, unusedThrown, and unusedTypeArgs,\n" +
+        "                           unusedExceptionParam\n" +
         "      unusedAllocation     allocating an object that is not used\n" +
         "      unusedArgument       unread method parameter\n" +
         "      unusedExceptionParam unread exception parameter\n" +
         "      unusedImport       + unused import declaration\n" +
         "      unusedLabel        + unused label\n" +
         "      unusedLocal        + unread local variable\n" +
-        "      unusedParam		    unused parameter\n" +
-        "      unusedParamOverriding unused parameter for overriding method\n" +
-        "      unusedParamImplementing unused parameter for implementing method\n" +
-        "      unusedParamIncludeDoc unused parameter documented in comment tag\n" +
+        "      unusedParam          unused parameter\n" +
+        "      unusedParamOverriding  unused parameter for overriding method\n" +
+        "      unusedParamImplementing  unused parameter for implementing method\n" +
+        "      unusedParamIncludeDoc  unused parameter documented in comment tag\n" +
         "      unusedPrivate      + unused private member declaration\n" +
         "      unusedThrown         unused declared thrown exception\n" +
-        "      unusedThrownWhenOverriding unused declared thrown exception in \n" +
-        "							overriding method\n" +
-        "      unusedThrownIncludeDocComment     unused declared thrown exception,\n" +
-        "							documented in a comment tag\n" +
+        "      unusedThrownWhenOverriding  unused declared thrown exception in \n" +
+        "                           overriding method\n" +
+        "      unusedThrownIncludeDocComment  unused declared thrown exception,\n" +
+        "                           documented in a comment tag\n" +
         "      unusedThrownExemptExceptionThrowable  unused declared thrown exception,\n" +
-        "							exempt Exception and Throwable\n" +
+        "                           exempt Exception and Throwable\n" +
         "      unusedTypeArgs     + unused type arguments for method and constructor\n" +
         "      uselessTypeCheck     unnecessary cast/instanceof operation\n" +
         "      varargsCast        + varargs argument need explicit cast\n" +
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java
index eacb3fa..1769812 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericTypeTest.java
@@ -52895,6 +52895,29 @@
 	}
 }
 
+public void testBugBug571785_001() {
+	if (this.complianceLevel >= ClassFileConstants.JDK1_8) {
+		runConformTest(
+			new String[] {
+				"Test.java",
+				"import java.util.Collection;\n"+
+				"\n" +
+				"public class Test {\n" +
+				"	public static void main(String[] args) {\n" +
+				"		new testclass();\n" +
+				"	}\n" +
+				"}\n" +
+				"class testclass {\n" +
+				"	public void update(final Collection<? extends byte[]> inputs) {\n" +
+				"		inputs.forEach(this::update);\n" +
+				"	}\n" +
+				"	public void update(final byte[] input) {\n" +
+				"	}\n" +
+				"}\n"
+			});
+	}
+}
+
 protected void assertCompileTimes(final List<Duration> shortTimes, final double factor, final List<Duration> longTimes) {
 	final double shortTimesAverage = minExcludingBoundaries(shortTimes);
 	final double longTimesAverage = minExcludingBoundaries(longTimes);
@@ -52902,8 +52925,12 @@
 			+ longTimesAverage + "ms should be less than " + factor + "x the minimum short compile time " + shortTimesAverage +"ms\n"
 			+ "long compile times: "+longTimes+"\n"
 			+ "short compile times: "+shortTimes;
-	assertTrue(message,longTimesAverage < factor*shortTimesAverage);
-	System.out.println(message);
+	if (PERFORMANCE_ASSERTS) {
+		assertTrue(message,longTimesAverage < factor*shortTimesAverage);
+		System.out.println(message);
+	} else if (longTimesAverage >= factor*shortTimesAverage) {
+		System.out.println(message);
+	}
 }
 
 protected double minExcludingBoundaries(final List<Duration> durations) {
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_9.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_9.java
index ba91a25..9469484 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_9.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/GenericsRegressionTest_9.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2016, 2018 IBM Corporation.
+ * Copyright (c) 2016, 2021 IBM Corporation.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -23,7 +23,7 @@
 public class GenericsRegressionTest_9 extends AbstractRegressionTest9 {
 
 static {
-//	TESTS_NAMES = new String[] { "testBug488663_006" };
+//	TESTS_NAMES = new String[] { "testBug551913_001", "testBug551913_002" };
 //	TESTS_NUMBERS = new int[] { 40, 41, 43, 45, 63, 64 };
 //	TESTS_RANGE = new int[] { 11, -1 };
 }
@@ -670,6 +670,58 @@
 	};
 	runner.runConformTest();
 }
+//As All non-private methods of an anonymous class instantiated with '<>' must be treated as being annotated with @override,
+//"Remove redundant type arguments" error should be reported if all the non-private methods defined in the anonymous class
+//are also present in the parent class.
+public void testBug551913_001() {
+	Map<String, String> options = getCompilerOptions();
+	options.put(CompilerOptions.OPTION_ReportRedundantSpecificationOfTypeArguments, CompilerOptions.ERROR);
+	this.runConformTest(
+		new String[] {
+			"X.java",
+			"public class X {\n" +
+			"	int foo() {\n" +
+			"		java.util.HashSet<String> a = new java.util.HashSet<>();\n" +
+			"		java.util.HashSet<String> b = new java.util.HashSet<String>(a) {\n" +
+			"			private static final long serialVersionUID = 1L;\n" +
+			"			public int x() {return 10;}\n" +
+			"		};\n" +
+			"		return 10;\n" +
+			"	}\n\n" +
+			"	public static void main(String[] args) {\n" +
+			"		X abc= new X();\n" +
+			"		System.out.println(abc.foo());" +
+			"	}" +
+			"}",
+		},"10", options);
+}
+// As All non-private methods of an anonymous class instantiated with '<>' must be treated as being annotated with @override,
+// "Remove redundant type arguments" error should be reported if all the non-private methods defined in the anonymous class
+// are also present in the parent class.
+public void testBug551913_002() {
+	Map<String, String> options = getCompilerOptions();
+	options.put(CompilerOptions.OPTION_ReportRedundantSpecificationOfTypeArguments, CompilerOptions.ERROR);
+	this.runNegativeTest(
+		new String[] {
+			"X.java",
+			"public class X {\n" +
+			"	void foo() {\n" +
+			"		java.util.HashSet<String> a = new java.util.HashSet<>();\n" +
+			"		java.util.HashSet<String> b = new java.util.HashSet<String>(a) {\n" +
+			"			private static final long serialVersionUID = 1L;\n" +
+			"			public String toString() {return null;}\n" +
+			"		};\n" +
+			"	}\n" +
+			"}",
+		},
+		"----------\n" +
+		"1. ERROR in X.java (at line 4)\n" +
+		"	java.util.HashSet<String> b = new java.util.HashSet<String>(a) {\n" +
+		"	                                            ^^^^^^^\n" +
+		"Redundant specification of type arguments <String>\n" +
+		"----------\n",
+		null, true, options);
+}
 public static Class<GenericsRegressionTest_9> testClass() {
 	return GenericsRegressionTest_9.class;
 }
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/SealedTypesTests.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/SealedTypesTests.java
index 56dd197..71bc444 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/SealedTypesTests.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/compiler/regression/SealedTypesTests.java
@@ -31,7 +31,7 @@
 	static {
 //		TESTS_NUMBERS = new int [] { 40 };
 //		TESTS_RANGE = new int[] { 1, -1 };
-//		TESTS_NAMES = new String[] { "testBug572205"};
+		TESTS_NAMES = new String[] { "testBug573450"};
 	}
 
 	public static Class<?> testClass() {
@@ -5867,5 +5867,96 @@
 			"Sealed class or interface lacks the permits clause and no class or interface from the same compilation unit declares Shape as its direct superclass or superinterface\n" +
 			"----------\n");
 	}
+	public void testBug573450_001() {
+		runConformTest(
+				new String[] {
+					"X.java",
+					"sealed interface Foo permits Foo.Bar {\n" +
+					"	interface Interface {}\n" +
+					"	record Bar() implements Foo, Interface { }\n" +
+					"}\n" +
+					"public class X { \n" +
+					"  public static void main(String[] args){\n"+
+					"     System.out.println(0);\n" +
+					"  }\n"+
+					"}",
+				},
+				"0");
+	}
 
+	public void testBug573450_002() {
+		runConformTest(
+				new String[] {
+					"X.java",
+					"interface Interface {}\n" +
+					"sealed interface Foo extends Interface permits Foo.Bar {\n" +
+					"	record Bar() implements Foo, Interface {}\n" +
+					"}\n" +
+					"public class X { \n" +
+					"  public static void main(String[] args){\n"+
+					"     System.out.println(0);\n" +
+					"  }\n"+
+					"}"
+				},
+				"0");
+	}
+	public void testBug573450_003() {
+		runNegativeTest(
+				new String[] {
+					"X.java",
+					"sealed interface Interface extends Foo{}\n" +
+					"sealed interface Foo extends Interface permits Foo.Bar, Interface {\n" +
+					"	record Bar() implements Foo, Interface {} \n" +
+					"}"
+				},
+				"----------\n" +
+				"1. ERROR in X.java (at line 1)\n" +
+				"	sealed interface Interface extends Foo{}\n" +
+				"	                 ^^^^^^^^^\n" +
+				"The hierarchy of the type Interface is inconsistent\n" +
+				"----------\n" +
+				"2. ERROR in X.java (at line 2)\n" +
+				"	sealed interface Foo extends Interface permits Foo.Bar, Interface {\n" +
+				"	                             ^^^^^^^^^\n" +
+				"Cycle detected: a cycle exists in the type hierarchy between Foo and Interface\n" +
+				"----------\n" +
+				"3. ERROR in X.java (at line 3)\n" +
+				"	record Bar() implements Foo, Interface {} \n" +
+				"	       ^^^\n" +
+				"The hierarchy of the type Bar is inconsistent\n" +
+				"----------\n");
+	}
+	public void testBug573450_004() {
+		runConformTest(
+				new String[] {
+					"X.java",
+					"public sealed class X permits X.Y {\n" +
+					"	final class Y extends X {}\n" +
+					"	public static void main(String[] args){\n"+
+					"		System.out.println(0);\n" +
+					"	}\n"+
+					"}"
+				},
+				"0");
+	}
+	public void testBug573450_005() {
+		runNegativeTest(
+				new String[] {
+					"X.java",
+					"public sealed class X permits Y {\n" +
+					"	final class Y extends X {}\n" +
+					"}"
+				},
+				"----------\n"
+				+ "1. ERROR in X.java (at line 1)\n"
+				+ "	public sealed class X permits Y {\n"
+				+ "	                              ^\n"
+				+ "Y cannot be resolved to a type\n"
+				+ "----------\n"
+				+ "2. ERROR in X.java (at line 2)\n"
+				+ "	final class Y extends X {}\n"
+				+ "	                      ^\n"
+				+ "The type Y extending a sealed class X should be a permitted subtype of X\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 10a0ded..420d53f 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
@@ -197,11 +197,6 @@
 	 // add 14 specific test here (check duplicates)
 	 ArrayList since_14 = new ArrayList();
 	 since_14.add(SwitchExpressionsYieldTest.class);
-/*{ObjectTeams: wrong in JDT
-	 since_14.add(RecordsRestrictedClassTest.class);
-	 since_14.add(PatternMatching16Test.class);
-	 since_14.add(JavadocTestForRecord.class);
-SH} */
 	 since_14.add(BatchCompilerTest_14.class);
 
 	 // add 15 specific test here (check duplicates)
@@ -219,11 +214,9 @@
 	 since_16.add(PreviewFeatureTest.class);
 	 since_16.add(ValueBasedAnnotationTests.class);
 	 since_16.add(BatchCompilerTest_16.class);
-//{ObjectTeams: moved
 	 since_16.add(RecordsRestrictedClassTest.class);
 	 since_16.add(PatternMatching16Test.class);
 	 since_16.add(JavadocTestForRecord.class);
-// SH}
 
 	 // Build final test suite
 	TestSuite all = new TestSuite(TestAll.class.getName());
diff --git a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/util/AbstractCompilerTest.java b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/util/AbstractCompilerTest.java
index 55a127f..a705a2b 100644
--- a/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/util/AbstractCompilerTest.java
+++ b/org.eclipse.jdt.core.tests.compiler/src/org/eclipse/jdt/core/tests/util/AbstractCompilerTest.java
@@ -50,6 +50,7 @@
 	public static final int F_16  = 0x2000;
 
 	public static final boolean RUN_JAVAC = CompilerOptions.ENABLED.equals(System.getProperty("run.javac"));
+	public static final boolean PERFORMANCE_ASSERTS = !CompilerOptions.DISABLED.equals(System.getProperty("jdt.performance.asserts"));
 	private static final int UNINITIALIZED = -1;
 	private static final int NONE = 0;
 	private static int possibleComplianceLevels = UNINITIALIZED;
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter_15Test.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter_15Test.java
index 373bc83..52673d8 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter_15Test.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/dom/ASTConverter_15Test.java
@@ -28,6 +28,7 @@
 import org.eclipse.jdt.core.dom.AbstractTypeDeclaration;
 import org.eclipse.jdt.core.dom.CompilationUnit;
 import org.eclipse.jdt.core.dom.Expression;
+import org.eclipse.jdt.core.dom.FieldDeclaration;
 import org.eclipse.jdt.core.dom.IBinding;
 import org.eclipse.jdt.core.dom.IMethodBinding;
 import org.eclipse.jdt.core.dom.ITypeBinding;
@@ -670,12 +671,12 @@
 				"public class X {\n" +
 						"	public String test001() {\n" +
 						"		String s = \"\"\"\n" +
-						"      	<html>\n" +
+						"       <html>\n" +
 						"        <body>\n" +
 						"            <p>Hello, world</p>\n" +
 						"        </body>\n" +
-						"    	</html>\n" +
-						"    	\"\"\";\n" +
+						"       </html>\n" +
+						"   \"\"\";\n" +
 						"    	System.out.println(s);" +
 						"		return s;\n" +
 						"	}" +
@@ -703,12 +704,11 @@
 
 		String literal = ((TextBlock) initializer).getLiteralValue();
 		assertEquals("literal value not correct",
-				"      	<html>\n" +
-				"        <body>\n" +
-				"            <p>Hello, world</p>\n" +
-				"        </body>\n" +
-				"    	</html>\n" +
-				"    	",
+				"    <html>\n" +
+				"     <body>\n" +
+				"         <p>Hello, world</p>\n" +
+				"     </body>\n" +
+				"    </html>\n",
 				literal);
 
 	}
@@ -726,8 +726,8 @@
 						"        <body>\n" +
 						"            <p>Hello, world</p>\n" +
 						"        </body>\n" +
-						"    	</html>\n" +
-						"    	\"\"\";\n" +
+						"      	</html>\n" +
+						"\"\"\";\n" +
 						"    	System.out.println(s);" +
 						"		return s;\n" +
 						"	}" +
@@ -762,8 +762,8 @@
 				"        <body>\n" +
 				"            <p>Hello, world</p>\n" +
 				"        </body>\n" +
-				"    	</html>\n" +
-				"    	\"\"\"",
+				"      	</html>\n" +
+				"\"\"\"",
 				escapedValue);
 
 		String literal = ((TextBlock) initializer).getLiteralValue();
@@ -772,8 +772,8 @@
 				"        <body>\n" +
 				"            <p>Hello, world</p>\n" +
 				"        </body>\n" +
-				"    	</html>\n" +
-				"    	",
+				"      	</html>\n" +
+				"",
 				literal);
 	}
 
@@ -1218,4 +1218,42 @@
 			javaProject.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, old);
 		}
 	}
+	public void testBug571461() throws JavaModelException {
+		if (!isJRE15) {
+			System.err.println("Test "+getName()+" requires a JRE 15");
+			return;
+		}
+		String contents =
+						"public class X {\n"
+						+ "    String example = \"\"\"\n"
+						+ "            Example text\"\"\";\n"
+						+ "    final String expected = \"Example text\";\n"
+						+ "}" ;
+		this.workingCopy = getWorkingCopy("/Converter_15/src/X.java", true/*resolve*/);
+		ASTNode node = buildAST(
+				contents,
+				this.workingCopy);
+		assertEquals("Not a compilation unit", ASTNode.COMPILATION_UNIT, node.getNodeType());
+		CompilationUnit compilationUnit = (CompilationUnit) node;
+		assertProblemsSize(compilationUnit, 0);
+		node = getASTNode(compilationUnit, 0, 0, 0);
+		assertEquals("Text block statement", node.getNodeType(), ASTNode.FIELD_DECLARATION);
+		FieldDeclaration field = (FieldDeclaration) node;
+		List fragments = field.fragments();
+		assertEquals("Incorrect no of fragments", 1, fragments.size());
+		node = (ASTNode) fragments.get(0);
+		assertEquals("Switch statement", node.getNodeType(), ASTNode.VARIABLE_DECLARATION_FRAGMENT);
+		VariableDeclarationFragment fragment = (VariableDeclarationFragment) node;
+		Expression initializer = fragment.getInitializer();
+		assertTrue("Initializer is not a TextBlock", initializer instanceof TextBlock);
+		String escapedValue = ((TextBlock) initializer).getEscapedValue();
+
+		assertTrue("String should not be empty", escapedValue.length() != 0);
+		assertTrue("String should start with \"\"\"", escapedValue.startsWith("\"\"\""));
+
+		String literal = ((TextBlock) initializer).getLiteralValue();
+		assertEquals("literal value not correct",
+				"Example text",
+				literal);
+	}
 }
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 24f025c..33dae11 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
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2020 IBM Corporation and others.
+ * Copyright (c) 2000, 2021 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -757,6 +757,8 @@
 			Initializer initializer = (Initializer) bodyDeclaration;
 			Block block = initializer.getBody();
 			return (ASTNode) block.statements().get(statementIndex);
+		} else if (bodyDeclaration instanceof FieldDeclaration) {
+			return bodyDeclaration;
 		}
 		return null;
 	}
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests.java
index ec72393..0411c06 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests.java
@@ -26078,4 +26078,301 @@
 	        "val2[ANNOTATION_ATTRIBUTE_REF]{val2=, LT;, I, val2, null, 52}",
 			requestor.getResults());
 }
+public void testBug573632() throws Exception {
+	this.workingCopies = new ICompilationUnit[1];
+	this.workingCopies[0] = getWorkingCopy(
+			"Completion/src/Foo.java",
+			"package test;\n" +
+			"public class Foo {\n" +
+			"	Foo f;\n" +
+			"	public void foo() {\n" +
+			"		if (f != null) {\n" +
+			"			f.\n" +
+			"			f = null;\n" +
+			"		}\n" +
+			"	};\n" +
+			"}\n");
+
+	CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+	requestor.allowAllRequiredProposals();
+	String str = this.workingCopies[0].getSource();
+	String completeBehind = "f.";
+	int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+	assertResults(
+			"clone[METHOD_REF]{clone(), Ljava.lang.Object;, ()Ljava.lang.Object;, clone, null, 60}\n" +
+			"equals[METHOD_REF]{equals(), Ljava.lang.Object;, (Ljava.lang.Object;)Z, equals, (obj), 60}\n" +
+			"f[FIELD_REF]{f, LFoo;, LFoo;, f, null, 60}\n" +
+			"finalize[METHOD_REF]{finalize(), Ljava.lang.Object;, ()V, finalize, null, 60}\n" +
+			"foo[METHOD_REF]{foo(), LFoo;, ()V, foo, null, 60}\n" +
+			"getClass[METHOD_REF]{getClass(), Ljava.lang.Object;, ()Ljava.lang.Class;, getClass, null, 60}\n" +
+			"hashCode[METHOD_REF]{hashCode(), Ljava.lang.Object;, ()I, hashCode, null, 60}\n" +
+			"notify[METHOD_REF]{notify(), Ljava.lang.Object;, ()V, notify, null, 60}\n" +
+			"notifyAll[METHOD_REF]{notifyAll(), Ljava.lang.Object;, ()V, notifyAll, null, 60}\n" +
+			"toString[METHOD_REF]{toString(), Ljava.lang.Object;, ()Ljava.lang.String;, toString, null, 60}\n" +
+			"wait[METHOD_REF]{wait(), Ljava.lang.Object;, ()V, wait, null, 60}\n" +
+			"wait[METHOD_REF]{wait(), Ljava.lang.Object;, (J)V, wait, (millis), 60}\n" +
+			"wait[METHOD_REF]{wait(), Ljava.lang.Object;, (JI)V, wait, (millis, nanos), 60}",
+			requestor.getResults());
+}
+public void testBug573632a() throws Exception {
+	// variation: nested ifs
+	this.workingCopies = new ICompilationUnit[1];
+	this.workingCopies[0] = getWorkingCopy(
+			"Completion/src/Foo.java",
+			"package test;\n" +
+			"public class Foo {\n" +
+			"	Foo f;\n" +
+			"	public void foo() {\n" +
+			"		if (f != null) {\n" +
+			"			if (f != null) {\n" +
+			"				f.\n" +
+			"				f = null;\n" +
+			"			}\n" +
+			"		}\n" +
+			"	};\n" +
+			"}\n");
+
+	CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+	requestor.allowAllRequiredProposals();
+	String str = this.workingCopies[0].getSource();
+	String completeBehind = "f.";
+	int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+	assertResults(
+			"clone[METHOD_REF]{clone(), Ljava.lang.Object;, ()Ljava.lang.Object;, clone, null, 60}\n" +
+			"equals[METHOD_REF]{equals(), Ljava.lang.Object;, (Ljava.lang.Object;)Z, equals, (obj), 60}\n" +
+			"f[FIELD_REF]{f, LFoo;, LFoo;, f, null, 60}\n" +
+			"finalize[METHOD_REF]{finalize(), Ljava.lang.Object;, ()V, finalize, null, 60}\n" +
+			"foo[METHOD_REF]{foo(), LFoo;, ()V, foo, null, 60}\n" +
+			"getClass[METHOD_REF]{getClass(), Ljava.lang.Object;, ()Ljava.lang.Class;, getClass, null, 60}\n" +
+			"hashCode[METHOD_REF]{hashCode(), Ljava.lang.Object;, ()I, hashCode, null, 60}\n" +
+			"notify[METHOD_REF]{notify(), Ljava.lang.Object;, ()V, notify, null, 60}\n" +
+			"notifyAll[METHOD_REF]{notifyAll(), Ljava.lang.Object;, ()V, notifyAll, null, 60}\n" +
+			"toString[METHOD_REF]{toString(), Ljava.lang.Object;, ()Ljava.lang.String;, toString, null, 60}\n" +
+			"wait[METHOD_REF]{wait(), Ljava.lang.Object;, ()V, wait, null, 60}\n" +
+			"wait[METHOD_REF]{wait(), Ljava.lang.Object;, (J)V, wait, (millis), 60}\n" +
+			"wait[METHOD_REF]{wait(), Ljava.lang.Object;, (JI)V, wait, (millis, nanos), 60}",
+			requestor.getResults());
+}
+public void testBug573632b() throws Exception {
+	// variation: for
+	this.workingCopies = new ICompilationUnit[1];
+	this.workingCopies[0] = getWorkingCopy(
+			"Completion/src/Foo.java",
+			"package test;\n" +
+			"public class Foo {\n" +
+			"	Foo f;\n" +
+			"	public void foo() {\n" +
+			"		for (int i = 0; f != null; i++) {\n" +
+			"			f.\n" +
+			"			f = null;\n" +
+			"		}\n" +
+			"	};\n" +
+			"}\n");
+
+	CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+	requestor.allowAllRequiredProposals();
+	String str = this.workingCopies[0].getSource();
+	String completeBehind = "f.";
+	int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+	assertResults(
+			"clone[METHOD_REF]{clone(), Ljava.lang.Object;, ()Ljava.lang.Object;, clone, null, 60}\n" +
+			"equals[METHOD_REF]{equals(), Ljava.lang.Object;, (Ljava.lang.Object;)Z, equals, (obj), 60}\n" +
+			"f[FIELD_REF]{f, LFoo;, LFoo;, f, null, 60}\n" +
+			"finalize[METHOD_REF]{finalize(), Ljava.lang.Object;, ()V, finalize, null, 60}\n" +
+			"foo[METHOD_REF]{foo(), LFoo;, ()V, foo, null, 60}\n" +
+			"getClass[METHOD_REF]{getClass(), Ljava.lang.Object;, ()Ljava.lang.Class;, getClass, null, 60}\n" +
+			"hashCode[METHOD_REF]{hashCode(), Ljava.lang.Object;, ()I, hashCode, null, 60}\n" +
+			"notify[METHOD_REF]{notify(), Ljava.lang.Object;, ()V, notify, null, 60}\n" +
+			"notifyAll[METHOD_REF]{notifyAll(), Ljava.lang.Object;, ()V, notifyAll, null, 60}\n" +
+			"toString[METHOD_REF]{toString(), Ljava.lang.Object;, ()Ljava.lang.String;, toString, null, 60}\n" +
+			"wait[METHOD_REF]{wait(), Ljava.lang.Object;, ()V, wait, null, 60}\n" +
+			"wait[METHOD_REF]{wait(), Ljava.lang.Object;, (J)V, wait, (millis), 60}\n" +
+			"wait[METHOD_REF]{wait(), Ljava.lang.Object;, (JI)V, wait, (millis, nanos), 60}",
+			requestor.getResults());
+}
+public void testBug573632c() throws Exception {
+	// variation: while
+	this.workingCopies = new ICompilationUnit[1];
+	this.workingCopies[0] = getWorkingCopy(
+			"Completion/src/Foo.java",
+			"package test;\n" +
+			"public class Foo {\n" +
+			"	Foo f;\n" +
+			"	public void foo() {\n" +
+			"		while (f != null) {\n" +
+			"			f.\n" +
+			"			f = null;\n" +
+			"		}\n" +
+			"	};\n" +
+			"}\n");
+
+	CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+	requestor.allowAllRequiredProposals();
+	String str = this.workingCopies[0].getSource();
+	String completeBehind = "f.";
+	int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+	assertResults(
+			"clone[METHOD_REF]{clone(), Ljava.lang.Object;, ()Ljava.lang.Object;, clone, null, 60}\n" +
+			"equals[METHOD_REF]{equals(), Ljava.lang.Object;, (Ljava.lang.Object;)Z, equals, (obj), 60}\n" +
+			"f[FIELD_REF]{f, LFoo;, LFoo;, f, null, 60}\n" +
+			"finalize[METHOD_REF]{finalize(), Ljava.lang.Object;, ()V, finalize, null, 60}\n" +
+			"foo[METHOD_REF]{foo(), LFoo;, ()V, foo, null, 60}\n" +
+			"getClass[METHOD_REF]{getClass(), Ljava.lang.Object;, ()Ljava.lang.Class;, getClass, null, 60}\n" +
+			"hashCode[METHOD_REF]{hashCode(), Ljava.lang.Object;, ()I, hashCode, null, 60}\n" +
+			"notify[METHOD_REF]{notify(), Ljava.lang.Object;, ()V, notify, null, 60}\n" +
+			"notifyAll[METHOD_REF]{notifyAll(), Ljava.lang.Object;, ()V, notifyAll, null, 60}\n" +
+			"toString[METHOD_REF]{toString(), Ljava.lang.Object;, ()Ljava.lang.String;, toString, null, 60}\n" +
+			"wait[METHOD_REF]{wait(), Ljava.lang.Object;, ()V, wait, null, 60}\n" +
+			"wait[METHOD_REF]{wait(), Ljava.lang.Object;, (J)V, wait, (millis), 60}\n" +
+			"wait[METHOD_REF]{wait(), Ljava.lang.Object;, (JI)V, wait, (millis, nanos), 60}",
+			requestor.getResults());
+}
+public void testBug573702() throws JavaModelException {
+	this.workingCopies = new ICompilationUnit[1];
+	this.workingCopies[0] = getWorkingCopy(
+			"Completion/src/App.java",
+			"import java.util.Collection;\n" +
+			"import java.util.Map;\n" +
+			"\n" +
+			"interface ObjectProperty<T> {\n" +
+			"	void addListener(SingleFireInvalidationListener singleFireInvalidationListener);\n" +
+			"}\n" +
+			"class SingleFireInvalidationListener {\n" +
+			"	public SingleFireInvalidationListener(Collection<String> list) { }\n" +
+			"}\n" +
+			"public class App {\n" +
+			"\n" +
+			"  public static void boo(Map<String, String> data) {\n" +
+			"    System.out.println(\"PopOver direct buffer delayed patch installation started\");\n" +
+			"    App.getDataProperty().addListener(new SingleFireInvalidationListener(data.values()));\n" +
+			"    System.out.println(\"PopOver direct buffer delayed patch installation done\");\n" +
+			"  }\n" +
+			"\n" +
+			"  public static ObjectProperty<Map<String, String>> getDataProperty() {\n" +
+			"    return null;\n" +
+			"  }\n" +
+			"}\n");
+
+	CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+	requestor.allowAllRequiredProposals();
+	String str = this.workingCopies[0].getSource();
+	String completeBehind = "new SingleFireInvalidationListener(data";
+	int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+	assertResults(
+			"data[LOCAL_VARIABLE_REF]{data, null, LMap;, data, null, 56}",
+			requestor.getResults());
+}
+public void testBug573702_fieldRef() throws JavaModelException {
+	this.workingCopies = new ICompilationUnit[1];
+	this.workingCopies[0] = getWorkingCopy(
+			"Completion/src/App.java",
+			"import java.util.Collection;\n" +
+			"import java.util.Map;\n" +
+			"\n" +
+			"interface ObjectProperty<T> {\n" +
+			"	void addListener(SingleFireInvalidationListener singleFireInvalidationListener);\n" +
+			"}\n" +
+			"class SingleFireInvalidationListener {\n" +
+			"	public SingleFireInvalidationListener(Collection<String> list) { }\n" +
+			"}\n" +
+			"public class App {\n" +
+			"  Map<String, String> data;\n" +
+			"  public void boo() {\n" +
+			"    System.out.println(\"PopOver direct buffer delayed patch installation started\");\n" +
+			"    App.getDataProperty().addListener(new SingleFireInvalidationListener(this.data.values()));\n" +
+			"    System.out.println(\"PopOver direct buffer delayed patch installation done\");\n" +
+			"  }\n" +
+			"\n" +
+			"  public static ObjectProperty<Map<String, String>> getDataProperty() {\n" +
+			"    return null;\n" +
+			"  }\n" +
+			"}\n");
+
+	CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+	requestor.allowAllRequiredProposals();
+	String str = this.workingCopies[0].getSource();
+	String completeBehind = "new SingleFireInvalidationListener(this.data";
+	int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+	assertResults(
+			"data[FIELD_REF]{data, LApp;, LMap;, data, null, 64}",
+			requestor.getResults());
+}
+public void testBug573702_qualifiedName() throws JavaModelException {
+	this.workingCopies = new ICompilationUnit[1];
+	this.workingCopies[0] = getWorkingCopy(
+			"Completion/src/App.java",
+			"import java.util.Collection;\n" +
+			"import java.util.Map;\n" +
+			"\n" +
+			"interface ObjectProperty<T> {\n" +
+			"	void addListener(SingleFireInvalidationListener singleFireInvalidationListener);\n" +
+			"}\n" +
+			"class SingleFireInvalidationListener {\n" +
+			"	public SingleFireInvalidationListener(Collection<String> list) { }\n" +
+			"}\n" +
+			"public class App {\n" +
+			"  static Map<String, String> data;\n" +
+			"  public void boo() {\n" +
+			"    System.out.println(\"PopOver direct buffer delayed patch installation started\");\n" +
+			"    App.getDataProperty().addListener(new SingleFireInvalidationListener(App.data.values()));\n" +
+			"    System.out.println(\"PopOver direct buffer delayed patch installation done\");\n" +
+			"  }\n" +
+			"\n" +
+			"  public static ObjectProperty<Map<String, String>> getDataProperty() {\n" +
+			"    return null;\n" +
+			"  }\n" +
+			"}\n");
+
+	CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+	requestor.allowAllRequiredProposals();
+	String str = this.workingCopies[0].getSource();
+	String completeBehind = "new SingleFireInvalidationListener(App.data";
+	int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+	assertResults(
+			"data[FIELD_REF]{data, LApp;, LMap;, data, null, 55}",
+			requestor.getResults());
+}
+public void testBug573702_qualifiedName_firstSegment() throws JavaModelException {
+	this.workingCopies = new ICompilationUnit[1];
+	this.workingCopies[0] = getWorkingCopy(
+			"Completion/src/App.java",
+			"import java.util.Collection;\n" +
+			"import java.util.Map;\n" +
+			"\n" +
+			"interface ObjectProperty<T> {\n" +
+			"	void addListener(SingleFireInvalidationListener singleFireInvalidationListener);\n" +
+			"}\n" +
+			"class SingleFireInvalidationListener {\n" +
+			"	public SingleFireInvalidationListener(Collection<String> list) { }\n" +
+			"}\n" +
+			"public class App {\n" +
+			"  static Map<String, String> data;\n" +
+			"  public void boo() {\n" +
+			"    System.out.println(\"PopOver direct buffer delayed patch installation started\");\n" +
+			"    App.getDataProperty().addListener(new SingleFireInvalidationListener(App.data.values()));\n" +
+			"    System.out.println(\"PopOver direct buffer delayed patch installation done\");\n" +
+			"  }\n" +
+			"\n" +
+			"  public static ObjectProperty<Map<String, String>> getDataProperty() {\n" +
+			"    return null;\n" +
+			"  }\n" +
+			"}\n");
+
+	CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+	requestor.allowAllRequiredProposals();
+	String str = this.workingCopies[0].getSource();
+	String completeBehind = "new SingleFireInvalidationListener(App";
+	int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+	this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+	assertResults(
+			"App[TYPE_REF]{App, , LApp;, null, null, 56}",
+			requestor.getResults());
+}
 }
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests16_2.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests16_2.java
index e1c4ef0..30272c2 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests16_2.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests16_2.java
@@ -46,9 +46,9 @@
 		this.workingCopies = new ICompilationUnit[1];
 		this.workingCopies[0] = getWorkingCopy("/Completion/src/X.java",
 				"public seal class X permits Y{\n"
-		+ " public static void main(String[] args){\n"
-		+ "    interf;\n}\n}\n"
-		+ "	");
+						+ " public static void main(String[] args){\n"
+						+ "    interf;\n}\n}\n"
+						+ "	");
 		this.workingCopies[0].getJavaProject(); // assuming single project for all working copies
 		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
 		requestor.allowAllRequiredProposals();
@@ -65,9 +65,9 @@
 		this.workingCopies = new ICompilationUnit[1];
 		this.workingCopies[0] = getWorkingCopy("/Completion/src/X.java",
 				"public seal class X permits Y{\n"
-		+ " public static void main(String[] args){\n"
-		+ "    enu;\n}\n}\n"
-		+ "	");
+						+ " public static void main(String[] args){\n"
+						+ "    enu;\n}\n}\n"
+						+ "	");
 		this.workingCopies[0].getJavaProject(); // assuming single project for all working copies
 		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
 		requestor.allowAllRequiredProposals();
@@ -86,11 +86,11 @@
 		this.workingCopies[0] = getWorkingCopy(
 				"/Completion/src/Point.java",
 				"public class Point {\n" +
-				"private void method(Object o) throws Exception{\n" +
-				"if ((o instanceof fina Record xvar )) \n" +
-				"{\n" +
-				"}\n" +
-				"}\n" +
+						"private void method(Object o) throws Exception{\n" +
+						"if ((o instanceof fina Record xvar )) \n" +
+						"{\n" +
+						"}\n" +
+						"}\n" +
 				"}");
 		this.workingCopies[0].getJavaProject(); // assuming single project for all working copies
 		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
@@ -105,34 +105,292 @@
 
 	}
 	// completion for final keyword in instanceof pattern variable at higher relevance than Fin* classes
-		public void test004() throws JavaModelException {
-			this.workingCopies = new ICompilationUnit[2];
-			this.workingCopies[0] = getWorkingCopy(
-					"/Completion/src/Point.java",
-					"public class Point {\n" +
-					"private void method(Object o) throws Exception{\n" +
-					"if ((o instanceof fina Record xvar )) \n" +
-					"{\n" +
+	public void test004() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[2];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/Point.java",
+				"public class Point {\n" +
+						"private void method(Object o) throws Exception{\n" +
+						"if ((o instanceof fina Record xvar )) \n" +
+						"{\n" +
+						"}\n" +
+						"}\n" +
+				"}");
+		this.workingCopies[1] = getWorkingCopy(
+				"/Completion/src/Bug460411.java",
+				"package abc;" +
+						"public class FinalCl {\n"+
+				"}\n");
+		this.workingCopies[0].getJavaProject(); // assuming single project for all working copies
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "fina";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults("FinalCl[TYPE_REF]{abc.FinalCl, abc, Labc.FinalCl;, null, null, "+(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_NON_RESTRICTED+R_EXPECTED_TYPE)+"}\n"
+				+ "final[KEYWORD]{final, null, null, final, null, "+(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_NON_RESTRICTED+R_FINAL+R_EXPECTED_TYPE)+"}",
+				requestor.getResults());
+
+
+	}
+
+	// completion for instanceof pattern variable for false condition - inside the instanceof block
+	public void test005() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/Point.java",
+				"public class Point {\n" +
+						"private void method(Object o) throws Exception{\n" +
+						"if (!(o instanceof Record xvar )) \n" +
+						"{\n" +
+						" System.out.println(xvar.);\n" +
+						" throw new Exception();\n" +
+						"}\n" +
+
+				"}\n" +
+
+				"}");
+		this.workingCopies[0].getJavaProject(); // assuming single project for all working copies
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "xvar.";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults("",
+				requestor.getResults());
+
+	}
+	// completion for instanceof pattern variable for true condition - outside the instanceof block
+	public void test006() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/Point.java",
+				"public class Point {\n" +
+						"private void method(Object o) throws Exception{\n" +
+						"if ((o instanceof Record xvar )) \n" +
+						"{\n" +
+						" throw new Exception();\n" +
+						"}\n" +
+						" System.out.println(xvar.);\n" +
+						"}\n" +
+
+				"}");
+		this.workingCopies[0].getJavaProject(); // assuming single project for all working copies
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "xvar.";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults("",
+				requestor.getResults());
+
+	}
+	// completion for instanceof pattern variable for false condition - outside the instanceof block - in do-while loop
+	public void test007() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/Point.java",
+				"public class Point {\n" +
+						"private void method(Object o) throws Exception{\n" +
+						"do { \n" +
+						"} while (!(o instanceof Record var1));\n" +
+						"System.out.println(var1.);\n" +
+
 					"}\n" +
+
+				"}");
+		this.workingCopies[0].getJavaProject(); // assuming single project for all working copies
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "var1.";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults("finalize[METHOD_REF]{finalize(), Ljava.lang.Object;, ()V, finalize, null, 55}\n"
+				+ "notify[METHOD_REF]{notify(), Ljava.lang.Object;, ()V, notify, null, 55}\n"
+				+ "notifyAll[METHOD_REF]{notifyAll(), Ljava.lang.Object;, ()V, notifyAll, null, 55}\n"
+				+ "wait[METHOD_REF]{wait(), Ljava.lang.Object;, ()V, wait, null, 55}\n"
+				+ "wait[METHOD_REF]{wait(), Ljava.lang.Object;, (J)V, wait, (millis), 55}\n"
+				+ "wait[METHOD_REF]{wait(), Ljava.lang.Object;, (JI)V, wait, (millis, nanos), 55}\n"
+				+ "clone[METHOD_REF]{clone(), Ljava.lang.Object;, ()Ljava.lang.Object;, clone, null, 60}\n"
+				+ "equals[METHOD_REF]{equals(), Ljava.lang.Record;, (Ljava.lang.Object;)Z, equals, (obj), 60}\n"
+				+ "getClass[METHOD_REF]{getClass(), Ljava.lang.Object;, ()Ljava.lang.Class<+Ljava.lang.Object;>;, getClass, null, 60}\n"
+				+ "hashCode[METHOD_REF]{hashCode(), Ljava.lang.Record;, ()I, hashCode, null, 90}\n"
+				+ "toString[METHOD_REF]{toString(), Ljava.lang.Record;, ()Ljava.lang.String;, toString, null, 90}",
+				requestor.getResults());
+	}
+	// completion for instanceof pattern variable - double negation
+	public void test008() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/Point.java",
+				"public class Point {\n" +
+						"private void method(Object o) throws Exception{\n" +
+						"if (!!(o instanceof Record xvar )) \n" +
+						"{\n" +
+						" throw new Exception();\n" +
+						"}\n" +
+						" System.out.println(xvar.);\n" +
+						"}\n" +
+
+				"}");
+		this.workingCopies[0].getJavaProject(); // assuming single project for all working copies
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "xvar.";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults("",
+				requestor.getResults());
+
+	}
+	// completion for instanceof pattern variable - triple negation
+	public void test009() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/Point.java",
+				"public class Point {\n" +
+						"private void method(Object o) throws Exception{\n" +
+						"if (!!!(o instanceof Record xvar )) \n" +
+						"{\n" +
+						" throw new Exception();\n" +
+						"}\n" +
+						" System.out.println(xvar.);\n" +
+						"}\n" +
+
+				"}");
+		this.workingCopies[0].getJavaProject(); // assuming single project for all working copies
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "xvar.";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults("finalize[METHOD_REF]{finalize(), Ljava.lang.Object;, ()V, finalize, null, 55}\n"
+				+ "notify[METHOD_REF]{notify(), Ljava.lang.Object;, ()V, notify, null, 55}\n"
+				+ "notifyAll[METHOD_REF]{notifyAll(), Ljava.lang.Object;, ()V, notifyAll, null, 55}\n"
+				+ "wait[METHOD_REF]{wait(), Ljava.lang.Object;, ()V, wait, null, 55}\n"
+				+ "wait[METHOD_REF]{wait(), Ljava.lang.Object;, (J)V, wait, (millis), 55}\n"
+				+ "wait[METHOD_REF]{wait(), Ljava.lang.Object;, (JI)V, wait, (millis, nanos), 55}\n"
+				+ "clone[METHOD_REF]{clone(), Ljava.lang.Object;, ()Ljava.lang.Object;, clone, null, 60}\n"
+				+ "equals[METHOD_REF]{equals(), Ljava.lang.Record;, (Ljava.lang.Object;)Z, equals, (obj), 60}\n"
+				+ "getClass[METHOD_REF]{getClass(), Ljava.lang.Object;, ()Ljava.lang.Class<+Ljava.lang.Object;>;, getClass, null, 60}\n"
+				+ "hashCode[METHOD_REF]{hashCode(), Ljava.lang.Record;, ()I, hashCode, null, 90}\n"
+				+ "toString[METHOD_REF]{toString(), Ljava.lang.Record;, ()Ljava.lang.String;, toString, null, 90}",
+				requestor.getResults());
+
+	}
+	// completion for instanceof pattern variable - double negation
+	public void test010() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/Point.java",
+				"public class Point {\n" +
+						"private void method(Object o) throws Exception{\n" +
+						"if (!!(o instanceof Record xvar )) \n" +
+						"{\n" +
+						" System.out.println(xvar.);\n" +
+						"}\n" +
+
 					"}\n" +
-					"}");
-			this.workingCopies[1] = getWorkingCopy(
-					"/Completion/src/Bug460411.java",
-					"package abc;" +
-					"public class FinalCl {\n"+
-					"}\n");
-			this.workingCopies[0].getJavaProject(); // assuming single project for all working copies
-			CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
-			requestor.allowAllRequiredProposals();
-			String str = this.workingCopies[0].getSource();
-			String completeBehind = "fina";
-			int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
-			this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
-			assertResults("FinalCl[TYPE_REF]{abc.FinalCl, abc, Labc.FinalCl;, null, null, "+(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_NON_RESTRICTED+R_EXPECTED_TYPE)+"}\n"
-					+ "final[KEYWORD]{final, null, null, final, null, "+(R_DEFAULT+R_RESOLVED+R_INTERESTING+R_CASE+R_NON_RESTRICTED+R_FINAL+R_EXPECTED_TYPE)+"}",
-					requestor.getResults());
 
+				"}");
+		this.workingCopies[0].getJavaProject(); // assuming single project for all working copies
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "xvar.";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults("finalize[METHOD_REF]{finalize(), Ljava.lang.Object;, ()V, finalize, null, 55}\n"
+				+ "notify[METHOD_REF]{notify(), Ljava.lang.Object;, ()V, notify, null, 55}\n"
+				+ "notifyAll[METHOD_REF]{notifyAll(), Ljava.lang.Object;, ()V, notifyAll, null, 55}\n"
+				+ "wait[METHOD_REF]{wait(), Ljava.lang.Object;, ()V, wait, null, 55}\n"
+				+ "wait[METHOD_REF]{wait(), Ljava.lang.Object;, (J)V, wait, (millis), 55}\n"
+				+ "wait[METHOD_REF]{wait(), Ljava.lang.Object;, (JI)V, wait, (millis, nanos), 55}\n"
+				+ "clone[METHOD_REF]{clone(), Ljava.lang.Object;, ()Ljava.lang.Object;, clone, null, 60}\n"
+				+ "equals[METHOD_REF]{equals(), Ljava.lang.Record;, (Ljava.lang.Object;)Z, equals, (obj), 60}\n"
+				+ "getClass[METHOD_REF]{getClass(), Ljava.lang.Object;, ()Ljava.lang.Class<+Ljava.lang.Object;>;, getClass, null, 60}\n"
+				+ "hashCode[METHOD_REF]{hashCode(), Ljava.lang.Record;, ()I, hashCode, null, 90}\n"
+				+ "toString[METHOD_REF]{toString(), Ljava.lang.Record;, ()Ljava.lang.String;, toString, null, 90}",
+				requestor.getResults());
 
-		}
+	}
+	// completion for instanceof pattern variable for false condition
+	public void test011() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/Point.java",
+				"public class Point {\n" +
+						"private void method(Object o) throws Exception{\n" +
+						"if (!(o instanceof Record xvar )) \n" +
+						"{\n" +
+						" throw new Exception();\n" +
+						"}\n" +
+						" System.out.println(xvar.);\n" +
+						"}\n" +
 
+				"}");
+		this.workingCopies[0].getJavaProject(); // assuming single project for all working copies
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "xvar.";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults("finalize[METHOD_REF]{finalize(), Ljava.lang.Object;, ()V, finalize, null, 55}\n"
+				+ "notify[METHOD_REF]{notify(), Ljava.lang.Object;, ()V, notify, null, 55}\n"
+				+ "notifyAll[METHOD_REF]{notifyAll(), Ljava.lang.Object;, ()V, notifyAll, null, 55}\n"
+				+ "wait[METHOD_REF]{wait(), Ljava.lang.Object;, ()V, wait, null, 55}\n"
+				+ "wait[METHOD_REF]{wait(), Ljava.lang.Object;, (J)V, wait, (millis), 55}\n"
+				+ "wait[METHOD_REF]{wait(), Ljava.lang.Object;, (JI)V, wait, (millis, nanos), 55}\n"
+				+ "clone[METHOD_REF]{clone(), Ljava.lang.Object;, ()Ljava.lang.Object;, clone, null, 60}\n"
+				+ "equals[METHOD_REF]{equals(), Ljava.lang.Record;, (Ljava.lang.Object;)Z, equals, (obj), 60}\n"
+				+ "getClass[METHOD_REF]{getClass(), Ljava.lang.Object;, ()Ljava.lang.Class<+Ljava.lang.Object;>;, getClass, null, 60}\n"
+				+ "hashCode[METHOD_REF]{hashCode(), Ljava.lang.Record;, ()I, hashCode, null, 90}\n"
+				+ "toString[METHOD_REF]{toString(), Ljava.lang.Record;, ()Ljava.lang.String;, toString, null, 90}",
+				requestor.getResults());
+
+	}
+
+	// completion for instanceof pattern variable for true condition
+	public void test012() throws JavaModelException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy(
+				"/Completion/src/Point.java",
+				"public class Point {\n" +
+						"private void method(Object o) {\n" +
+						"if ((o instanceof Record xvar )) \n" +
+						"{\n" +
+						" System.out.println(xvar.);\n" +
+						"}\n" +
+
+						"}\n" +
+
+				"}");
+		this.workingCopies[0].getJavaProject(); // assuming single project for all working copies
+		CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+		requestor.allowAllRequiredProposals();
+		String str = this.workingCopies[0].getSource();
+		String completeBehind = "xvar.";
+		int cursorLocation = str.indexOf(completeBehind) + completeBehind.length();
+		this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner);
+		assertResults("finalize[METHOD_REF]{finalize(), Ljava.lang.Object;, ()V, finalize, null, 55}\n"
+				+ "notify[METHOD_REF]{notify(), Ljava.lang.Object;, ()V, notify, null, 55}\n"
+				+ "notifyAll[METHOD_REF]{notifyAll(), Ljava.lang.Object;, ()V, notifyAll, null, 55}\n"
+				+ "wait[METHOD_REF]{wait(), Ljava.lang.Object;, ()V, wait, null, 55}\n"
+				+ "wait[METHOD_REF]{wait(), Ljava.lang.Object;, (J)V, wait, (millis), 55}\n"
+				+ "wait[METHOD_REF]{wait(), Ljava.lang.Object;, (JI)V, wait, (millis, nanos), 55}\n"
+				+ "clone[METHOD_REF]{clone(), Ljava.lang.Object;, ()Ljava.lang.Object;, clone, null, 60}\n"
+				+ "equals[METHOD_REF]{equals(), Ljava.lang.Record;, (Ljava.lang.Object;)Z, equals, (obj), 60}\n"
+				+ "getClass[METHOD_REF]{getClass(), Ljava.lang.Object;, ()Ljava.lang.Class<+Ljava.lang.Object;>;, getClass, null, 60}\n"
+				+ "hashCode[METHOD_REF]{hashCode(), Ljava.lang.Record;, ()I, hashCode, null, 90}\n"
+				+ "toString[METHOD_REF]{toString(), Ljava.lang.Record;, ()Ljava.lang.String;, toString, null, 90}",
+				requestor.getResults());
+
+	}
 }
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests18.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests18.java
index 214ca75..a3bbcbc 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests18.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests18.java
@@ -4984,4 +4984,38 @@
     assertTrue(String.format("Result doesn''t contain method foo (%s)", result),
     		result.contains("foo[METHOD_REF]{foo(), LBug573105$Element;, ()Ljava.net.URI;, foo, null, 60}\n"));
 }
+public void testBug482663() throws Exception {
+	this.workingCopies = new ICompilationUnit[1];
+	this.workingCopies[0] = getWorkingCopy(
+			"/Completion/src/CompletionParserResumeFailure.java",
+			"import java.util.Map;\n" +
+			"import java.util.stream.Stream;\n" +
+			"class Path {}\n" +
+			"public class CompletionParserResumeFailure\n" +
+			"{\n" +
+			"    Stream<Path> list(Path dir) throws IOException { return null; }\n" +
+			"    public void freeze()\n" +
+			"    {\n" +
+			"        list(null).map(p -> new Object()\n" +
+			"            {\n" +
+			"                public String name = p.getFileName().toString();\n" +
+			"                public Map<String, Date> clients = p;\n" +
+			"            });\n" +
+			"    }\n" +
+			"}\n");
+    CompletionTestsRequestor2 requestor = new CompletionTestsRequestor2(true);
+	requestor.allowAllRequiredProposals();
+
+    String str = this.workingCopies[0].getSource();
+    String completeBehind = "Date";
+	int cursorLocation = str.lastIndexOf(completeBehind) + completeBehind.length();
+    this.workingCopies[0].codeComplete(cursorLocation, requestor, this.wcOwner, new NullProgressMonitor());
+
+	assertResults(
+			"DateFormat[TYPE_REF]{java.text.DateFormat, java.text, Ljava.text.DateFormat;, null, null, 69}\n" +
+			"DateFormatSymbols[TYPE_REF]{java.text.DateFormatSymbols, java.text, Ljava.text.DateFormatSymbols;, null, null, 69}\n" +
+			"Date[TYPE_REF]{java.sql.Date, java.sql, Ljava.sql.Date;, null, null, 73}\n" +
+			"Date[TYPE_REF]{java.util.Date, java.util, Ljava.util.Date;, null, null, 73}",
+			requestor.getResults());
+}
 }
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests9.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests9.java
index 6a9596b..a9420b7 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests9.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/CompletionTests9.java
@@ -1636,4 +1636,42 @@
 		deleteProject(project1);
 	}
 }
+public void testBug573632d() throws Exception {
+	IJavaProject project1 = createJavaProject("Completion9_1", new String[] {"src"}, new String[] {"JCL19_LIB", "org.eclipse.jdt.core.tests.model.TEST_CONTAINER"}, "bin", "9");
+	try {
+		project1.open(null);
+		CompletionResult result = complete(
+			"/Completion9_1/src/Foo.java",
+			"package test;\n" +
+			"import java.io.InputStream;\n" +
+			"public class Foo {\n" +
+			"	Foo f;\n" +
+			"	public void foo() {\n" +
+			"		InputStream is = new InputStream(null);\n" +
+			"		try (is) {\n" +
+			"			f.\n" +
+			"			f = null;\n" +
+			"		}\n" +
+			"	};\n" +
+			"}\n",
+			"f.");
+		assertResults(
+			"clone[METHOD_REF]{clone(), Ljava.lang.Object;, ()Ljava.lang.Object;, clone, null, 60}\n" +
+			"equals[METHOD_REF]{equals(), Ljava.lang.Object;, (Ljava.lang.Object;)Z, equals, (obj), 60}\n" +
+			"f[FIELD_REF]{f, LFoo;, LFoo;, f, null, 60}\n" +
+			"finalize[METHOD_REF]{finalize(), Ljava.lang.Object;, ()V, finalize, null, 60}\n" +
+			"foo[METHOD_REF]{foo(), LFoo;, ()V, foo, null, 60}\n" +
+			"getClass[METHOD_REF]{getClass(), Ljava.lang.Object;, ()Ljava.lang.Class<+Ljava.lang.Object;>;, getClass, null, 60}\n" +
+			"hashCode[METHOD_REF]{hashCode(), Ljava.lang.Object;, ()I, hashCode, null, 60}\n" +
+			"notify[METHOD_REF]{notify(), Ljava.lang.Object;, ()V, notify, null, 60}\n" +
+			"notifyAll[METHOD_REF]{notifyAll(), Ljava.lang.Object;, ()V, notifyAll, null, 60}\n" +
+			"toString[METHOD_REF]{toString(), Ljava.lang.Object;, ()Ljava.lang.String;, toString, null, 60}\n" +
+			"wait[METHOD_REF]{wait(), Ljava.lang.Object;, ()V, wait, null, 60}\n" +
+			"wait[METHOD_REF]{wait(), Ljava.lang.Object;, (J)V, wait, (millis), 60}\n" +
+			"wait[METHOD_REF]{wait(), Ljava.lang.Object;, (JI)V, wait, (millis, nanos), 60}",
+			result.proposals);
+	} finally {
+		deleteProject(project1);
+	}
+}
 }
\ No newline at end of file
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugs15Tests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugs15Tests.java
index 6db3722..54fbd1d 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugs15Tests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugs15Tests.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c)  2020 IBM Corporation and others.
+ * Copyright (c)  2020, 2021 IBM Corporation and others.
  * All rights reserved. This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License v1.0
  * which accompanies this distribution, and is available at
@@ -621,6 +621,39 @@
 				"src/X.java void Point.method() [comp_] EXACT_MATCH");
 	}
 
+	//
+	public void testBug572467() throws CoreException {
+		this.workingCopies = new ICompilationUnit[1];
+		this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/Point.java",
+				"public record Point(int comp_) { \n" +
+						"	public Point  {\n" +
+						"	  comp_=11;\n" +
+						"	}\n" +
+						"public void method ( ) {	  \n"+
+						"	  int  var1=comp_;\n" +
+						"	  int  var2=comp_;\n" +
+						"	  int  var3=this.comp_;\n" +
+						"	  int  accMethod=this.comp_();\n" +
+						"} \n"+
+						"}\n"
+				);
+
+		String str = this.workingCopies[0].getSource();
+		String selection =  "comp_";
+		int start = str.lastIndexOf(selection);
+		int length = selection.length();
+
+		IJavaElement[] elements = this.workingCopies[0].codeSelect(start, length);
+		assertTrue(elements.length ==1);
+		assertTrue(elements[0] instanceof IField);
+		search(elements[0], REFERENCES, EXACT_RULE);
+		assertSearchResults(
+				"src/Point.java Point(int) [comp_] EXACT_MATCH\n" +
+				"src/Point.java void Point.method() [comp_] EXACT_MATCH\n" +
+				"src/Point.java void Point.method() [comp_] EXACT_MATCH\n" +
+				"src/Point.java void Point.method() [comp_] EXACT_MATCH\n" +
+				"src/Point.java void Point.method() [comp_()] EXACT_MATCH");
+	}
 	//selection  - select CC type
 	public void testBug558812_018() throws CoreException {
 		this.workingCopies = new ICompilationUnit[1];
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugs16Tests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugs16Tests.java
index c78cf30..f0f85e3 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugs16Tests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugs16Tests.java
@@ -456,6 +456,39 @@
 					""
 			);
 		}
+		public void testBug573388 () throws CoreException {
+			this.workingCopies = new ICompilationUnit[3];
+			this.workingCopies[2] = getWorkingCopy("/JavaSearchBugs/src/b573388/X.java",
+				"package b573388;\n\n" +
+				"public class X {\n"+
+					"public static void main() {\n" +
+					"		R r= new R(7);\n"+
+					"		C c= new C();\n"+
+					"}\n"+
+				"}\n"
+				);
+			this.workingCopies[1] = getWorkingCopy("/JavaSearchBugs/src/b573388/C.java",
+					"package b573388;\n\n" +
+					"public class C {\n"+
+					"}\n"
+					);
+			this.workingCopies[0] = getWorkingCopy("/JavaSearchBugs/src/b573388/R.java",
+				"package b573388;\n\n" +
+				"public record R(int a) {\n"+
+				"}\n"
+				);
+			String str = this.workingCopies[2].getSource();
+			String selection = "X";
+			int start = str.indexOf(selection);
+			int length = selection.length();
+			IJavaElement[] elements = this.workingCopies[2].codeSelect(start, length);
+			SourceType st = (SourceType)elements[0];
+			new SearchEngine(this.workingCopies).searchDeclarationsOfReferencedTypes(st, this.resultCollector, null);
+			assertSearchResults(
+					"src/b573388/R.java b573388.R [R] EXACT_MATCH\n" +
+					"src/b573388/C.java b573388.C [C] EXACT_MATCH"
+			);
+		}
 }
 
 
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java
index ba3424d..5240def 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/JavaSearchBugsTests.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2020 IBM Corporation and others.
+ * Copyright (c) 2000, 2021 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -8900,6 +8900,7 @@
 		"src/b142044 b142044\n" +
 		"src/b163984 b163984\n" +
 		"src/b201064 b201064\n" +
+		"src/b573388 b573388\n" +
 		"src/b81556 b81556\n" +
 		"src/b81556/a b81556.a\n" +
 		"src/b86380 b86380\n" +
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/MementoTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/MementoTests.java
index 5656166..1fc0740 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/MementoTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/MementoTests.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2017 IBM Corporation and others.
+ * Copyright (c) 2000, 2021 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -951,4 +951,25 @@
 		deleteProject("Test");
 	}
 }
+public void testBug573147() throws CoreException, IOException {
+	try {
+		createJavaProject("Test`", new String[] {"src"}, null, "bin", "1.8", false);
+		createFile(
+				"/Test`/src/X.java",
+				"public class X<T> {\n" +
+				"  void foo() {\n" +
+				"    X<String> var = null;\n" +
+				"  }\n" +
+				"}"
+			);
+		ILocalVariable localVar = getLocalVariable(getCompilationUnit("/Test`/src/X.java"), "var", "var");
+		String memento = localVar.getHandleIdentifier();
+		IJavaElement restored = JavaCore.create(memento);
+		assertNotNull("element should not be null", restored);
+		String restoredMemento = restored.getHandleIdentifier();
+		assertEquals("Unexpected restored memento", memento, restoredMemento);
+	} finally {
+		deleteProject("Test`");
+	}
+}
 }
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/TypeHierarchyTests.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/TypeHierarchyTests.java
index cd8e17d..d4fe751 100644
--- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/TypeHierarchyTests.java
+++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/model/TypeHierarchyTests.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2018 IBM Corporation and others.
+ * Copyright (c) 2000, 2021 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -56,7 +56,7 @@
 	ITypeHierarchy typeHierarchy;
 
 static {
-//	TESTS_NAMES= new String[] { "testBug329663a" };
+//	TESTS_NAMES= new String[] { "testBug573450" };
 }
 public static Test suite() {
 	return buildModelTestSuite(TypeHierarchyTests.class, BYTECODE_DECLARATION_ORDER);
@@ -3393,5 +3393,61 @@
 	}
 }
 
+public void testBug573450_001() throws CoreException {
+	if (!isJRE16) return;
+	try {
+		IJavaProject proj = createJava16Project("P", new String[] {"src"});
+		proj.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+		createFolder("/P/src/hierarchy");
+		createFile(
+				"/P/src/hierarchy/X.java",
+				"@SuppressWarnings(\"preview\")\n" +
+				"public sealed class X permits X.Y {\n" +
+				"	final class Y extends X {}\n" +
+				"}"
+			);
+		IType type = getCompilationUnit("P", "src", "hierarchy", "X.java").getType("X");
+		assertTrue("Type should exist!", type.exists());
+		ITypeHierarchy hierarchy = type.newTypeHierarchy(null); // when bug occurred a stack overflow happened here...
+		assertHierarchyEquals(
+				"Focus: X [in X.java [in hierarchy [in src [in P]]]]\n" +
+				"Super types:\n" +
+				"  Object [in Object.class [in java.lang [in <module:java.base>]]]\n" +
+				"Sub types:\n" +
+				"  Y [in X [in X.java [in hierarchy [in src [in P]]]]]\n",
+				hierarchy);
+	} finally {
+		deleteProject("P");
+	}
+}
+
+public void testBug573450_002() throws CoreException {
+	if (!isJRE16) return;
+	try {
+		IJavaProject proj = createJava16Project("P", new String[] {"src"});
+		proj.setOption(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+		createFolder("/P/src/hierarchy");
+		createFile(
+				"/P/src/hierarchy/Foo.java",
+				"@SuppressWarnings(\"preview\")\n" +
+				"sealed interface Foo permits Foo.Bar {\n" +
+				"	interface Interface {}\n" +
+				"	record Bar() implements Foo, Interface {}\n" +
+				"}"
+			);
+		IType type1 = getCompilationUnit("P", "src", "hierarchy", "Foo.java").getType("Foo");
+		assertTrue("Type should exist!", type1.exists());
+		ITypeHierarchy hierarchy1 = type1.newTypeHierarchy(null);
+		assertHierarchyEquals(
+				"Focus: Foo [in Foo.java [in hierarchy [in src [in P]]]]\n" +
+				"Super types:\n" +
+				"Sub types:\n" +
+				"  Bar [in Foo [in Foo.java [in hierarchy [in src [in P]]]]]\n",
+				hierarchy1);
+	} finally {
+		deleteProject("P");
+	}
+}
+
 
 }
diff --git a/org.eclipse.jdt.core.tests.model/workspace/JavaSearchBugs/src/b573388/C.java b/org.eclipse.jdt.core.tests.model/workspace/JavaSearchBugs/src/b573388/C.java
new file mode 100644
index 0000000..ff6dec7
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/JavaSearchBugs/src/b573388/C.java
@@ -0,0 +1,4 @@
+package b573388;
+
+public class C {	
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/JavaSearchBugs/src/b573388/R.java b/org.eclipse.jdt.core.tests.model/workspace/JavaSearchBugs/src/b573388/R.java
new file mode 100644
index 0000000..247b096
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/JavaSearchBugs/src/b573388/R.java
@@ -0,0 +1,4 @@
+package b573388;
+
+public record R(int a) {
+}
diff --git a/org.eclipse.jdt.core.tests.model/workspace/JavaSearchBugs/src/b573388/X.java b/org.eclipse.jdt.core.tests.model/workspace/JavaSearchBugs/src/b573388/X.java
new file mode 100644
index 0000000..f4fa221
--- /dev/null
+++ b/org.eclipse.jdt.core.tests.model/workspace/JavaSearchBugs/src/b573388/X.java
@@ -0,0 +1,8 @@
+package b573388;
+
+public class XA {
+	public static void main(String[] args) {
+		R r= new R(7);
+		C c= new C();
+	}
+}
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 1a9f0d9..81f3fe7 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
@@ -3253,51 +3253,50 @@
 	}
 }
 /** Translates any supported standard version starting at 1.3 up-to latest into the corresponding constant from CompilerOptions */
-@SuppressWarnings("nls")
 private String optionStringToVersion(String currentArg) {
 	switch (currentArg) {
-		case "1.3": return CompilerOptions.VERSION_1_3;
-		case "1.4": return CompilerOptions.VERSION_1_4;
-		case "1.5":
-		case "5":
-		case "5.0":
+		case "1.3": return CompilerOptions.VERSION_1_3; //$NON-NLS-1$
+		case "1.4": return CompilerOptions.VERSION_1_4; //$NON-NLS-1$
+		case "1.5": //$NON-NLS-1$
+		case "5": //$NON-NLS-1$
+		case "5.0": //$NON-NLS-1$
 			return CompilerOptions.VERSION_1_5;
-		case "1.6":
-		case "6":
-		case "6.0":
+		case "1.6": //$NON-NLS-1$
+		case "6": //$NON-NLS-1$
+		case "6.0": //$NON-NLS-1$
 			return CompilerOptions.VERSION_1_6;
-		case "1.7":
-		case "7":
-		case "7.0":
+		case "1.7": //$NON-NLS-1$
+		case "7": //$NON-NLS-1$
+		case "7.0": //$NON-NLS-1$
 			return CompilerOptions.VERSION_1_7;
-		case "1.8":
-		case "8":
-		case "8.0":
+		case "1.8": //$NON-NLS-1$
+		case "8": //$NON-NLS-1$
+		case "8.0": //$NON-NLS-1$
 			return CompilerOptions.VERSION_1_8;
-		case "1.9":
-		case "9":
-		case "9.0":
+		case "1.9": //$NON-NLS-1$
+		case "9": //$NON-NLS-1$
+		case "9.0": //$NON-NLS-1$
 			return CompilerOptions.VERSION_9;
-		case "10":
-		case "10.0":
+		case "10": //$NON-NLS-1$
+		case "10.0": //$NON-NLS-1$
 			return CompilerOptions.VERSION_10;
-		case "11":
-		case "11.0":
+		case "11": //$NON-NLS-1$
+		case "11.0": //$NON-NLS-1$
 			return CompilerOptions.VERSION_11;
-		case "12":
-		case "12.0":
+		case "12": //$NON-NLS-1$
+		case "12.0": //$NON-NLS-1$
 			return CompilerOptions.VERSION_12;
-		case "13":
-		case "13.0":
+		case "13": //$NON-NLS-1$
+		case "13.0": //$NON-NLS-1$
 			return CompilerOptions.VERSION_13;
-		case "14":
-		case "14.0":
+		case "14": //$NON-NLS-1$
+		case "14.0": //$NON-NLS-1$
 			return CompilerOptions.VERSION_14;
-		case "15":
-		case "15.0":
+		case "15": //$NON-NLS-1$
+		case "15.0": //$NON-NLS-1$
 			return CompilerOptions.VERSION_15;
-		case "16":
-		case "16.0":
+		case "16": //$NON-NLS-1$
+		case "16.0": //$NON-NLS-1$
 			return CompilerOptions.VERSION_16;
 		default:
 			return null;
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 90cd0b3..bda0c07 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
@@ -9,19 +9,19 @@
 # SPDX-License-Identifier: EPL-2.0
 #
 # Contributors:
-#     IBM Corporation - initial API and implementation
-#		Benjamin Muskalla - Contribution for bug 239066
-#		Stephan Herrmann - Contributions for
-#								bug 236385 - [compiler] Warn for potential programming problem if an object is created but not used
-#								bug 295551 - Add option to automatically promote all warnings to errors
-#								bug 359721 - [options] add command line option for new warning token "resource"
-#								bug 365208 - [compiler][batch] command line options for annotation based null analysis
-#								bug 374605 - Unreasonable warning for enum-based switch statements
-#								bug 388281 - [compiler][null] inheritance of null annotations as an option
-#								bug 440687 - [compiler][batch][null] improve command line option for external annotations
-#								Bug 408815 - [batch][null] Add CLI option for COMPILER_PB_SYNTACTIC_NULL_ANALYSIS_FOR_FIELDS
-#		Alan Moraes <alan@kelon.org> - Contribution for bug 383644
-#		Jesper S Moller - Contribution for bug 407297 - [1.8][compiler] Control generation of parameter names by option
+#   IBM Corporation - initial API and implementation
+#   Benjamin Muskalla - Contribution for bug 239066
+#   Stephan Herrmann - Contributions for
+#     bug 236385 - [compiler] Warn for potential programming problem if an object is created but not used
+#     bug 295551 - Add option to automatically promote all warnings to errors
+#     bug 359721 - [options] add command line option for new warning token "resource"
+#     bug 365208 - [compiler][batch] command line options for annotation based null analysis
+#     bug 374605 - Unreasonable warning for enum-based switch statements
+#     bug 388281 - [compiler][null] inheritance of null annotations as an option
+#     bug 440687 - [compiler][batch][null] improve command line option for external annotations
+#     Bug 408815 - [batch][null] Add CLI option for COMPILER_PB_SYNTACTIC_NULL_ANALYSIS_FOR_FIELDS
+#   Alan Moraes <alan@kelon.org> - Contribution for bug 383644
+#   Jesper S Moller - Contribution for bug 407297 - [1.8][compiler] Control generation of parameter names by option
 ###############################################################################
 ### JavaBatchCompiler messages.
 
@@ -230,7 +230,7 @@
 \    --processor-module-path <directories separated by {0}>\n\
 \                       specify module path where annotation processors\n\
 \                       can be found\n\
-\    --system <jdk>      Override location of system modules\n\
+\    --system <jdk>     Override location of system modules\n\
 \    --add-exports <module>/<package>=<other-module>(,<other-module>)*\n\
 \                       specify additional package exports clauses to the\n\
 \                       given modules\n\
@@ -242,8 +242,7 @@
 \                       resolved to be root modules\n\
 \    --limit-modules <module>(,<module>)*\n\
 \                       specify the observable module names\n\
-\    --release <release>\n\
-\                       compile for a specific VM version\n\
+\    --release <release> compile for a specific VM version\n\
 \ \n\
 \ Compliance options:\n\
 \    -1.3               use 1.3 compliance (-source 1.3 -target 1.1)\n\
@@ -288,18 +287,18 @@
 \                                      reported as errors\n\
 \ \n\
 \ Info options:\n\
-\    -info:<warnings separated by ,>    convert exactly the listed warnings\n\
+\    -info:<warnings separated by ,>   convert exactly the listed warnings\n\
 \                                      to be reported as infos\n\
-\    -info:+<warnings separated by ,>   enable additional warnings to be\n\
+\    -info:+<warnings separated by ,>  enable additional warnings to be\n\
 \                                      reported as infos\n\
-\    -info:-<warnings separated by ,>   disable specific warnings to be\n\
+\    -info:-<warnings separated by ,>  disable specific warnings to be\n\
 \                                      reported as infos\n\
 \ \n\
 \ Setting warning, error or info options using properties file:\n\
 \    -properties <file>   set warnings/errors/info option based on the properties\n\
-\                          file contents. This option can be used with -nowarn,\n\
-\                          -err:.., -info: or -warn:.. options, but the last one\n\
-\                          on the command line sets the options to be used.\n\
+\                         file contents. This option can be used with -nowarn,\n\
+\                         -err:.., -info: or -warn:.. options, but the last one\n\
+\                         on the command line sets the options to be used.\n\
 \ \n\
 \ Debug options:\n\
 \    -g[:lines,vars,source] custom debug info\n\
@@ -377,11 +376,11 @@
 \    -deprecation         + deprecation outside deprecated code\n\
 \    -nowarn -warn:none disable all warnings and infos\n\
 \    -nowarn:[<directories separated by {0}>]\n\
-\                       specify directories from which optional problems should\n\
-\                       be ignored\n\
-\    -warn:<warnings separated by ,>    enable exactly the listed warnings\n\
-\    -warn:+<warnings separated by ,>   enable additional warnings\n\
-\    -warn:-<warnings separated by ,>   disable specific warnings\n\
+\                           specify directories from which optional problems\n\
+\                           should be ignored\n\
+\    -warn:<warnings separated by ,>   enable exactly the listed warnings\n\
+\    -warn:+<warnings separated by ,>  enable additional warnings\n\
+\    -warn:-<warnings separated by ,>  disable specific warnings\n\
 \      abstractrelevantrole + abstract relevant role (OTJLD 2.5(b))\n\
 \      adaptDeprecated    + adapting a deprecated type/method\n\
 \      all                  enable all warnings\n\
@@ -399,7 +398,7 @@
 \                           (OTJLD 2.1.2(b)\n\
 \      bindingconventions + discouraged use of import / import base\n\
 \                           (OTJLD 2.1.2(d))\n\
-\      bindingtosystemclass 	+ trying to bind a role to a system class\n\
+\      bindingtosystemclass + trying to bind a role to a system class\n\
 \      boxing               autoboxing conversion\n\
 \      charConcat         + char[] in String concat\n\
 \      compareIdentical   + comparing identical expressions\n\
@@ -425,7 +424,7 @@
 \      forbidden          + use of types matching a forbidden access rule\n\
 \      fragilecallin      + replace callin not providing expected result\n\
 \                           (OTJLD 4.3(e))\n\
-\      hashCode              missing hashCode() method when overriding equals()\n\
+\      hashCode             missing hashCode() method when overriding equals()\n\
 \      hiddenLiftingProblem + a lifting that is not directly visible in source\n\
 \                             code could fail at runtime (OTJLD 2.3.5)\n\
 \      hiding               macro for fieldHiding, localHiding, typeHiding and\n\
@@ -441,42 +440,45 @@
 \      invalidJavadoc       all warnings for malformed javadoc tags\n\
 \      invalidJavadocTag    validate javadoc tag arguments\n\
 \      invalidJavadocTagDep validate deprecated references in javadoc tag args\n\
-\      invalidJavadocTagNotVisible  validate non-visible references in javadoc\n\
-\							tag args\n\
-\      invalidJavadocVisibility(<visibility>)  specify visibility modifier\n\
-\							for malformed javadoc tag warnings\n\
+\      invalidJavadocTagNotVisible\n\
+\                           validate non-visible references in javadoc tag args\n\
+\      invalidJavadocVisibility(<visibility>)\n\
+\                           specify visibility modifier for malformed javadoc\n\
+\                           tag warnings\n\
 \      javadoc              invalid javadoc\n\
 \      localHiding          local variable hiding another variable\n\
 \      maskedCatchBlock   + hidden catch block\n\
 \      missingJavadocTags   missing Javadoc tags\n\
 \      missingJavadocTagsOverriding missing Javadoc tags in overriding methods\n\
 \      missingJavadocTagsMethod missing Javadoc tags for method type parameter\n\
-\      missingJavadocTagsVisibility(<visibility>)  specify visibility modifier\n\
-\							for missing javadoc tags warnings\n\
-\      missingJavadocComments   missing Javadoc comments\n\
-\      missingJavadocCommentsOverriding   missing Javadoc tags in overriding\n\
-\							methods\n\
+\      missingJavadocTagsVisibility(<visibility>)\n\
+\                           specify visibility modifier for missing javadoc\n\
+\                           tags warnings\n\
+\      missingJavadocComments  missing Javadoc comments\n\
+\      missingJavadocCommentsOverriding\n\
+\                           missing Javadoc tags in overriding methods\n\
 \      missingJavadocCommentsVisibility(<visibility>)  specify visibility\n\
-\							modifier for missing javadoc comments warnings\n\
+\                           modifier for missing javadoc comments warnings\n\
 \      module             + module related problems.\n\
 \      nls                  string literal lacking non-nls tag //$NON-NLS-<n>$\n\
 \      noEffectAssign     + assignment without effect\n\
 \      null                 potential missing or redundant null check\n\
-\      nullAnnot(<annot. names separated by |>)   annotation based null analysis,\n\
+\      nullAnnot(<annot. names separated by |>)\n\
+\                           annotation based null analysis,\n\
 \                           nullable|nonnull|nonnullbydefault annotation types\n\
 \                           optionally specified using fully qualified names.\n\
-\							Enabling this option enables all null-annotation\n\
-\							related sub-options. These can be individually\n\
-\							controlled using options listed below.\n\
+\                           Enabling this option enables all null-annotation\n\
+\                           related sub-options. These can be individually\n\
+\                           controlled using options listed below.\n\
 \      nullAnnotConflict    conflict between null annotation specified\n\
-\							and nullness inferred. Is effective only with\n\
-\							nullAnnot option enabled.\n\
+\                           and nullness inferred. Is effective only with\n\
+\                           nullAnnot option enabled.\n\
 \      nullAnnotRedundant   redundant specification of null annotation. Is\n\
-\							effective only with nullAnnot option enabled.\n\
+\                           effective only with nullAnnot option enabled.\n\
 \      nullDereference    + missing null check\n\
-\	   nullUncheckedConversion unchecked conversion from non-annotated type\n\
-\							to @NonNull type. Is effective only with\n\
-\							nullAnnot option enabled.\n\
+\      nullUncheckedConversion  unchecked conversion from non-annotated type\n\
+\                           to @NonNull type. Is effective only with\n\
+\                           nullAnnot option enabled.\n\
 \      over-ann             missing @Override annotation (superclass)\n\
 \      paramAssign          assignment to a parameter\n\
 \      pkgDefaultMethod   + attempt to override package-default method\n\
@@ -501,39 +503,39 @@
 \      syncOverride         missing synchronized in synchr. method override\n\
 \      syntacticAnalysis    perform syntax-based null analysis for fields\n\
 \      syntheticAccess      synthetic access for innerclass\n\
-\      tasks(<tags separated by |>) tasks identified by tags inside comments\n\
+\      tasks(<tags separated by |>)  tasks identified by tags inside comments\n\
 \      typeHiding         + type parameter hiding another type\n\
-\      unavoidableGenericProblems + ignore unavoidable type safety problems\n\
-\                                   due to raw APIs\n\
+\      unavoidableGenericProblems  + ignore unavoidable type safety problems\n\
+\                           due to raw APIs\n\
 \      unchecked          + unchecked type operation\n\
 \      unlikelyCollectionMethodArgumentType\n\
 \                         + unlikely argument type for collection method\n\
 \                           declaring an Object parameter\n\
-\      unlikelyEqualsArgumentType unlikely argument type for method equals()\n\
+\      unlikelyEqualsArgumentType  unlikely argument type for method equals()\n\
 \      unnecessaryElse      unnecessary else clause\n\
 \      unqualifiedField     unqualified reference to field\n\
 \      unused               macro for unusedAllocation, unusedArgument,\n\
-\                               unusedImport, unusedLabel, unusedLocal,\n\
-\                               unusedPrivate, unusedThrown, and unusedTypeArgs,\n\
-\								unusedExceptionParam\n\
+\                           unusedImport, unusedLabel, unusedLocal,\n\
+\                           unusedPrivate, unusedThrown, and unusedTypeArgs,\n\
+\                           unusedExceptionParam\n\
 \      unusedAllocation     allocating an object that is not used\n\
 \      unusedArgument       unread method parameter\n\
 \      unusedExceptionParam unread exception parameter\n\
 \      unusedImport       + unused import declaration\n\
 \      unusedLabel        + unused label\n\
 \      unusedLocal        + unread local variable\n\
-\      unusedParam		    unused parameter\n\
-\      unusedParamOverriding unused parameter for overriding method\n\
-\      unusedParamImplementing unused parameter for implementing method\n\
-\      unusedParamIncludeDoc unused parameter documented in comment tag\n\
+\      unusedParam          unused parameter\n\
+\      unusedParamOverriding  unused parameter for overriding method\n\
+\      unusedParamImplementing  unused parameter for implementing method\n\
+\      unusedParamIncludeDoc  unused parameter documented in comment tag\n\
 \      unusedPrivate      + unused private member declaration\n\
 \      unusedThrown         unused declared thrown exception\n\
-\      unusedThrownWhenOverriding unused declared thrown exception in \n\
-\							overriding method\n\
-\      unusedThrownIncludeDocComment     unused declared thrown exception,\n\
-\							documented in a comment tag\n\
+\      unusedThrownWhenOverriding  unused declared thrown exception in \n\
+\                           overriding method\n\
+\      unusedThrownIncludeDocComment  unused declared thrown exception,\n\
+\                           documented in a comment tag\n\
 \      unusedThrownExemptExceptionThrowable  unused declared thrown exception,\n\
-\							exempt Exception and Throwable\n\
+\                           exempt Exception and Throwable\n\
 \      unusedTypeArgs     + unused type arguments for method and constructor\n\
 \      uselessTypeCheck     unnecessary cast/instanceof operation\n\
 \      varargsCast        + varargs argument need explicit cast\n\
diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java
index 1cfb613..80b4274 100644
--- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java
+++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/complete/CompletionParser.java
@@ -4315,8 +4315,8 @@
 protected int fetchNextToken() throws InvalidInputException {
 	int token = this.scanner.getNextToken();
 	if (!this.diet && token != TerminalTokens.TokenNameEOF) {
-		if (!requireExtendedRecovery() && this.expressionPtr == -1) {
-			if (this.scanner.currentPosition > this.cursorLocation) {
+		if (!requireExtendedRecovery() && this.scanner.currentPosition > this.cursorLocation) {
+			if (!hasPendingExpression(token)) {
 				this.scanner.eofPosition = this.cursorLocation + 1; // revert to old strategy where we stop parsing right at the cursor
 
 				// stop immediately or deferred?
@@ -4331,6 +4331,26 @@
 	}
 	return token;
 }
+private boolean hasPendingExpression(int token) {
+	if (this.expressionPtr == -1)
+		return false;
+	if (token == TerminalTokens.TokenNameDOT) {
+		// at '.' we are more eager to send early EOF to avoid seeing a qualified type reference in this pattern:
+		//   foo.|
+		//   bar ...
+		Expression expression = this.expressionStack[this.expressionPtr];
+		int elPtr = this.elementPtr;
+		while (elPtr >= 0) {
+			if (this.elementKindStack[elPtr] == K_BLOCK_DELIMITER) {
+				if (this.elementObjectInfoStack[elPtr] == expression) {
+					return false; // top expr on expressionStack belongs to a block statement (e.g., an if-condition)
+				}
+			}
+			elPtr--;
+		}
+	}
+	return true;
+}
 @Override
 protected void consumeToken(int token) {
 	if(this.isFirst) {
@@ -4611,10 +4631,19 @@
 					if (kind == K_CONTROL_STATEMENT_DELIMITER) {
 						int info = topKnownElementInfo(COMPLETION_OR_ASSIST_PARSER);
 						popElement(K_CONTROL_STATEMENT_DELIMITER);
-						if (info == IF) {
-							pushOnElementStack(K_BLOCK_DELIMITER, IF, this.expressionStack[this.expressionPtr]);
-						} else {
-							pushOnElementStack(K_BLOCK_DELIMITER, info);
+						switch (info) {
+							case IF:
+								// include top-expression of these just for the benefit of hasPendingExpression():
+								// (TRY is not included, even Java9-t-w-r doesn't own an *expression*)
+							case FOR:
+							case WHILE:
+								if (this.expressionPtr > -1) {
+									pushOnElementStack(K_BLOCK_DELIMITER, info, this.expressionStack[this.expressionPtr]);
+									break;
+								}
+								//$FALL-THROUGH$
+							default:
+								pushOnElementStack(K_BLOCK_DELIMITER, info);
 						}
 					} else {
 						switch(previous) {
@@ -5755,11 +5784,61 @@
 }
 @Override
 protected NameReference getUnspecifiedReference(boolean rejectTypeAnnotations) {
-	NameReference nameReference = super.getUnspecifiedReference(rejectTypeAnnotations);
-	if (this.record) {
-		recordReference(nameReference);
+	// code copied from super, but conditionally creating CompletionOn* nodes:
+
+	/* build a (unspecified) NameReference which may be qualified*/
+	if (rejectTypeAnnotations) { // Compensate for overpermissive grammar.
+		consumeNonTypeUseName();
 	}
-	return nameReference;
+	int length;
+	NameReference ref;
+	if ((length = this.identifierLengthStack[this.identifierLengthPtr--]) == 1) {
+		// single variable reference
+		char[] token = this.identifierStack[this.identifierPtr];
+		long position = this.identifierPositionStack[this.identifierPtr--];
+		int start = (int) (position >>> 32), end = (int) position;
+		if (this.assistNode == null && start < this.cursorLocation && end >= this.cursorLocation) {
+			ref = new CompletionOnSingleNameReference(token, position, isInsideAttributeValue());
+			this.assistNode = ref;
+		} else {
+			ref = new SingleNameReference(token, position);
+		}
+	} else {
+		//Qualified variable reference
+		char[][] tokens = new char[length][];
+		this.identifierPtr -= length;
+		System.arraycopy(this.identifierStack, this.identifierPtr + 1, tokens, 0, length);
+		long[] positions = new long[length];
+		System.arraycopy(this.identifierPositionStack, this.identifierPtr + 1, positions, 0, length);
+		int start = (int) (positions[0] >>> 32), end = (int) positions[length-1];
+		if (this.assistNode == null && start < this.cursorLocation && end >= this.cursorLocation) {
+			// find the token at cursorLocation:
+			int previousCount = 0;
+			for (int i=0; i<length; i++) {
+				if (((int) positions[i]) < this.cursorLocation)
+					previousCount = i + 1;
+			}
+			if (previousCount > 0) {
+				char[][] subset = new char[previousCount][];
+				System.arraycopy(tokens, 0, subset, 0, previousCount);
+				ref = new CompletionOnQualifiedNameReference(subset, tokens[previousCount], positions, isInsideAttributeValue());
+			} else {
+				// with only one token up-to cursorLocation avoid a bogus qualifiedNameReference (simply skipping the remainder):
+				ref = new CompletionOnSingleNameReference(tokens[0], positions[0], isInsideAttributeValue());
+			}
+			this.assistNode = ref;
+		} else {
+			ref =
+				new QualifiedNameReference(tokens,
+					positions,
+					(int) (this.identifierPositionStack[this.identifierPtr + 1] >> 32), // sourceStart
+					(int) this.identifierPositionStack[this.identifierPtr + length]); // sourceEnd
+		}
+	}
+	if (this.record) {
+		recordReference(ref);
+	}
+	return ref;
 }
 @Override
 protected void consumePostfixExpression() {
diff --git a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/impl/AssistParser.java b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/impl/AssistParser.java
index 40d0007..3027f01 100644
--- a/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/impl/AssistParser.java
+++ b/org.eclipse.jdt.core/codeassist/org/eclipse/jdt/internal/codeassist/impl/AssistParser.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2019 IBM Corporation and others.
+ * Copyright (c) 2000, 2021 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -361,6 +361,10 @@
 				} else if ((stmt instanceof ForeachStatement) && ((ForeachStatement) stmt).action == null) {
 					element = element.add(stmt, 0);
 					this.lastCheckPoint = stmt.sourceEnd + 1;
+				} else if (stmt.containsPatternVariable()) {
+					element.add(stmt, 0);
+					this.lastCheckPoint = stmt.sourceEnd + 1;
+					this.isOrphanCompletionNode = false;
 				}
 			}
 			continue;
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/AllocationExpression.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/AllocationExpression.java
index eec972a..ae65c42 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/AllocationExpression.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/AllocationExpression.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2020 IBM Corporation and others.
+ * Copyright (c) 2000, 2021 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -841,6 +841,10 @@
 		if (TypeBinding.notEquals(inferredTypes[i], allocationType.arguments[i]))
 			return;
 	}
+	reportTypeArgumentRedundancyProblem(allocationType, scope);
+}
+
+protected void reportTypeArgumentRedundancyProblem(ParameterizedTypeBinding allocationType, final BlockScope scope) {
 	scope.problemReporter().redundantSpecificationOfTypeArguments(this.type, allocationType.arguments);
 }
 
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/DoStatement.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/DoStatement.java
index 2a82177..8bd10b4 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/DoStatement.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/DoStatement.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2020 IBM Corporation and others.
+ * Copyright (c) 2000, 2021 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -227,14 +227,14 @@
 
 @Override
 public void resolve(BlockScope scope) {
-	if (this.condition.containsPatternVariable()) {
+	if (containsPatternVariable()) {
 		this.condition.collectPatternVariablesToScope(null, scope);
 		LocalVariableBinding[] patternVariablesInFalseScope = this.condition.getPatternVariablesWhenFalse();
 		TypeBinding type = this.condition.resolveTypeExpecting(scope, TypeBinding.BOOLEAN);
 		this.condition.computeConversion(scope, type, type);
 		if (this.action != null) {
 			this.action.resolve(scope);
-			this.action.promotePatternVariablesIfApplicable(patternVariablesInFalseScope, 
+			this.action.promotePatternVariablesIfApplicable(patternVariablesInFalseScope,
 					() -> !this.action.breaksOut(null));
 		}
 	} else {
@@ -246,6 +246,10 @@
 }
 
 @Override
+public boolean containsPatternVariable() {
+	return this.condition.containsPatternVariable();
+}
+@Override
 public void traverse(ASTVisitor visitor, BlockScope scope) {
 	if (visitor.visit(this, scope)) {
 		if (this.action != null) {
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Expression.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Expression.java
index 19ddff8..5e84651 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Expression.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Expression.java
@@ -984,9 +984,6 @@
 public void addPatternVariables(BlockScope scope, CodeStream codeStream) {
 	// Nothing by default
 }
-public boolean containsPatternVariable() {
-	return false;
-}
 protected LocalDeclaration getPatternVariableIntroduced() {
 	return null;
 }
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ForStatement.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ForStatement.java
index 39cd4a1..e5fb611 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ForStatement.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/ForStatement.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2020 IBM Corporation and others.
+ * Copyright (c) 2000, 2021 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -271,7 +271,7 @@
 				this.initializations[i].generateCode(this.scope, codeStream);
 			}
 		}
-		if (this.condition != null && this.condition.containsPatternVariable()) {
+		if (containsPatternVariable()) {
 			this.condition.addPatternVariables(currentScope, codeStream);
 		}
 		Constant cst = this.condition == null ? null : this.condition.optimizedBooleanConstant();
@@ -412,7 +412,7 @@
 		LocalVariableBinding[] patternVariablesInTrueScope = null;
 		LocalVariableBinding[] patternVariablesInFalseScope = null;
 
-		if (this.condition != null && this.condition.containsPatternVariable()) {
+		if (containsPatternVariable()) {
 			this.condition.collectPatternVariablesToScope(null, upperScope);
 			patternVariablesInTrueScope = this.condition.getPatternVariablesWhenTrue();
 			patternVariablesInFalseScope = this.condition.getPatternVariablesWhenFalse();
@@ -442,6 +442,11 @@
 	}
 
 	@Override
+	public boolean containsPatternVariable() {
+		return this.condition != null && this.condition.containsPatternVariable();
+	}
+
+	@Override
 	public void traverse(
 		ASTVisitor visitor,
 		BlockScope blockScope) {
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/IfStatement.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/IfStatement.java
index 56d12f7..9eff87b 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/IfStatement.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/IfStatement.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2020 IBM Corporation and others.
+ * Copyright (c) 2000, 2021 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -288,7 +288,7 @@
 }
 @Override
 public void resolve(BlockScope scope) {
-	if (this.condition.containsPatternVariable()) {
+	if (containsPatternVariable()) {
 		this.condition.collectPatternVariablesToScope(null, scope);
 		LocalVariableBinding[] patternVariablesInTrueScope = this.condition.getPatternVariablesWhenTrue();
 		LocalVariableBinding[] patternVariablesInFalseScope = this.condition.getPatternVariablesWhenFalse();
@@ -313,6 +313,11 @@
 }
 
 @Override
+public boolean containsPatternVariable() {
+	return this.condition.containsPatternVariable();
+}
+
+@Override
 public void traverse(ASTVisitor visitor, BlockScope blockScope) {
 	if (visitor.visit(this, blockScope)) {
 		this.condition.traverse(visitor, blockScope);
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/NullAnnotationMatching.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/NullAnnotationMatching.java
index 6a7c710..e05a54c 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/NullAnnotationMatching.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/NullAnnotationMatching.java
@@ -793,16 +793,15 @@
 		return mainType;
 	}
 
-	@SuppressWarnings("nls")
 	@Override
 	public String toString() {
-		if (this == NULL_ANNOTATIONS_OK) return "OK";
-		if (this == NULL_ANNOTATIONS_MISMATCH) return "MISMATCH";
-		if (this == NULL_ANNOTATIONS_OK_NONNULL) return "OK NonNull";
-		if (this == NULL_ANNOTATIONS_UNCHECKED) return "UNCHECKED";
+		if (this == NULL_ANNOTATIONS_OK) return "OK"; //$NON-NLS-1$
+		if (this == NULL_ANNOTATIONS_MISMATCH) return "MISMATCH"; //$NON-NLS-1$
+		if (this == NULL_ANNOTATIONS_OK_NONNULL) return "OK NonNull"; //$NON-NLS-1$
+		if (this == NULL_ANNOTATIONS_UNCHECKED) return "UNCHECKED"; //$NON-NLS-1$
 		StringBuilder buf = new StringBuilder();
-		buf.append("Analysis result: severity="+this.severity);
-		buf.append(" nullStatus="+this.nullStatus);
+		buf.append("Analysis result: severity="+this.severity); //$NON-NLS-1$
+		buf.append(" nullStatus="+this.nullStatus); //$NON-NLS-1$
 		return buf.toString();
 	}
 }
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedAllocationExpression.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedAllocationExpression.java
index 17f14a4..35c7b9a 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedAllocationExpression.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/QualifiedAllocationExpression.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2020 IBM Corporation and others.
+ * Copyright (c) 2000, 2021 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -941,4 +941,23 @@
 		}
 		visitor.endVisit(this, scope);
 	}
+	@Override
+	protected void reportTypeArgumentRedundancyProblem(ParameterizedTypeBinding allocationType, final BlockScope scope) {
+		if (checkDiamondOperatorCanbeRemoved(scope)) {
+			scope.problemReporter().redundantSpecificationOfTypeArguments(this.type, allocationType.arguments);
+		}
+	}
+	private boolean checkDiamondOperatorCanbeRemoved(final BlockScope scope) {
+		if (this.anonymousType != null &&
+				this.anonymousType.methods != null &&
+				this.anonymousType.methods.length > 0) {
+			//diamond operator is allowed for anonymous types only from java 9
+			if (scope.compilerOptions().complianceLevel < ClassFileConstants.JDK9) return false;
+			for (AbstractMethodDeclaration method : this.anonymousType.methods) {
+				if ( method.binding != null && (method.binding.modifiers & ExtraCompilerModifiers.AccOverriding) == 0)
+					return false;
+			}
+		}
+		return true;
+	}
 }
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Statement.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Statement.java
index 41d20a0..0c13cbd 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Statement.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/Statement.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2020 IBM Corporation and others.
+ * Copyright (c) 2000, 2021 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -606,6 +606,9 @@
 public TypeBinding resolveExpressionType(BlockScope scope) {
 	return null;
 }
+public boolean containsPatternVariable() {
+	return false;
+}
 /**
  * Implementation of {@link org.eclipse.jdt.internal.compiler.lookup.InvocationSite#invocationTargetType}
  * suitable at this level. Subclasses should override as necessary.
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/WhileStatement.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/WhileStatement.java
index 028c1f6..f816d5a 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/WhileStatement.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/ast/WhileStatement.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2020 IBM Corporation and others.
+ * Copyright (c) 2000, 2021 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -192,7 +192,7 @@
 		if ((this.bits & IsReachable) == 0) {
 			return;
 		}
-		if (this.condition != null && this.condition.containsPatternVariable()) {
+		if (containsPatternVariable()) {
 			this.condition.addPatternVariables(currentScope, codeStream);
 		}
 		int pc = codeStream.position;
@@ -275,7 +275,7 @@
 
 	@Override
 	public void resolve(BlockScope scope) {
-		if (this.condition.containsPatternVariable()) {
+		if (containsPatternVariable()) {
 			this.condition.collectPatternVariablesToScope(null, scope);
 			LocalVariableBinding[] patternVariablesInTrueScope = this.condition.getPatternVariablesWhenTrue();
 			LocalVariableBinding[] patternVariablesInFalseScope = this.condition.getPatternVariablesWhenFalse();
@@ -297,6 +297,11 @@
 	}
 
 	@Override
+	public boolean containsPatternVariable() {
+		return this.condition != null && this.condition.containsPatternVariable();
+	}
+
+	@Override
 	public StringBuffer printStatement(int tab, StringBuffer output) {
 
 		printIndent(tab, output).append("while ("); //$NON-NLS-1$
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding.java
index 4db95b5..c00d78a 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/BinaryTypeBinding.java
@@ -46,6 +46,8 @@
  *								Bug 412153 - [1.8][compiler] Check validity of annotations which may be repeatable
  *    Sebastian Zarnekow - Contributions for
  *								bug 544921 - [performance] Poor performance with large source files
+ *    Alexander Lehmann - Contributions for
+ *								bug 566258 - Intermittent NPE in APT RoundDispatcher
  *******************************************************************************/
 package org.eclipse.jdt.internal.compiler.lookup;
 
@@ -2102,10 +2104,9 @@
 		 * is sorted, too.
 		 */
 		ReferenceBinding [] members = this.prototype.memberTypes();
-		int memberTypesLength = members == null ? 0 : members.length;
-		if (memberTypesLength > 0) {
-			this.memberTypes = new ReferenceBinding[memberTypesLength];
-			for (int i = 0; i < memberTypesLength; i++)
+		if (members != null) {
+			this.memberTypes = new ReferenceBinding[members.length];
+			for (int i = 0; i < members.length; i++)
 				this.memberTypes[i] = this.environment.createMemberType(members[i], this);
 		}
 		this.tagBits &= ~TagBits.HasUnresolvedMemberTypes;
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/CaptureBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/CaptureBinding.java
index 79c9952..20ab6bf 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/CaptureBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/CaptureBinding.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2019 IBM Corporation and others.
+ * Copyright (c) 2000, 2021 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -633,4 +633,20 @@
 		}
 	}
 // SH}
+
+
+	@Override
+	public char[] signature() /* Ljava/lang/Object; */ {
+		if (this.signature != null)
+			return this.signature;
+
+		if (this.firstBound instanceof ArrayBinding) {
+			this.signature = constantPoolName();
+		} else {
+			this.signature = CharOperation.concat('L', constantPoolName(), ';');
+		}
+		return this.signature;
+
+	}
+
 }
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ClassScope.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ClassScope.java
index 8230a73..b841290 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ClassScope.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ClassScope.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2020 IBM Corporation and others.
+ * Copyright (c) 2000, 2021 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -2532,9 +2532,9 @@
 				environment().typesBeingConnected.add(sourceType);
 				boolean noProblems = connectSuperclass();
 				noProblems &= connectSuperInterfaces();
-				connectPermittedTypes();
 				environment().typesBeingConnected.remove(sourceType);
 				sourceType.tagBits |= TagBits.EndHierarchyCheck;
+				connectPermittedTypes();
 				noProblems &= connectTypeVariables(this.referenceContext.typeParameters, false);
 				sourceType.tagBits |= TagBits.TypeVariablesAreConnected;
 				if (noProblems && sourceType.isHierarchyInconsistent())
@@ -2613,9 +2613,9 @@
 			environment().typesBeingConnected.add(sourceType);
 			boolean noProblems = connectSuperclass();
 			noProblems &= connectSuperInterfaces();
-			connectPermittedTypes();
 			environment().typesBeingConnected.remove(sourceType);
 			sourceType.tagBits |= TagBits.EndHierarchyCheck;
+			connectPermittedTypes();
 			noProblems &= connectTypeVariables(this.referenceContext.typeParameters, false);
 			sourceType.tagBits |= TagBits.TypeVariablesAreConnected;
 			if (noProblems && sourceType.isHierarchyInconsistent())
diff --git a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ModuleBinding.java b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ModuleBinding.java
index a145a47..d3bc31c 100644
--- a/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ModuleBinding.java
+++ b/org.eclipse.jdt.core/compiler/org/eclipse/jdt/internal/compiler/lookup/ModuleBinding.java
@@ -65,7 +65,6 @@
 
 		private static final char[] UNNAMED_READABLE_NAME = "<unnamed>".toCharArray(); //$NON-NLS-1$
 
-		@SuppressWarnings("synthetic-access")
 		UnNamedModule(LookupEnvironment env) {
 			super(env);
 		}
@@ -167,7 +166,7 @@
 	public HashtableOfPackage<PlainPackageBinding> declaredPackages;
 
 	/** Constructor for the unnamed module. */
-	private ModuleBinding(LookupEnvironment env) {
+	ModuleBinding(LookupEnvironment env) {
 		this.moduleName = ModuleBinding.UNNAMED;
 		this.environment = env;
 		this.requires = Binding.NO_MODULES;
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 c6879b9..a2ebd57 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
@@ -3464,7 +3464,9 @@
 		if (this.resolveBindings) {
 			this.recordNodes(literal, expression);
 		}
-		literal.internalSetEscapedValue(new String(this.compilationUnitSource, sourceStart, length));
+		literal.internalSetEscapedValue(
+				new String(this.compilationUnitSource, sourceStart, length),
+				new String(expression.source()));
 		literal.setSourceRange(expression.sourceStart, expression.sourceEnd - expression.sourceStart + 1);
 		return literal;
 	}
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TextBlock.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TextBlock.java
index 4cc1d2c..9fa3246 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TextBlock.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/TextBlock.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2019, 2020 IBM Corporation and others.
+ * Copyright (c) 2019, 2021 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -76,6 +76,12 @@
 	private String escapedValue = "\"\"";//$NON-NLS-1$
 
 	/**
+	 * The literal string without the quotes and the applicable preceding and
+	 * trailing whitespace if any ; defaults to empty string.
+	 */
+	private String literalValue = "";//$NON-NLS-1$
+
+	/**
 	 * Creates a new unparented TextBlock node owned by the given AST.
 	 * By default, the TextBlock denotes the empty string.
 	 * <p>
@@ -190,14 +196,15 @@
 	}
 
 	/* (omit javadoc for this method)
-	 * This method is a copy of setEscapedValue(String) that doesn't do any validation.
+	 * This method is does what setEscapedValue(String) does but without any validation.
+	 * In addition, it also sets the literalValue property.
 	 */
-	void internalSetEscapedValue(String token) {
+	void internalSetEscapedValue(String token, String literal) {
 		preValueChange(ESCAPED_VALUE_PROPERTY);
 		this.escapedValue = token;
+		this.literalValue = literal;
 		postValueChange(ESCAPED_VALUE_PROPERTY);
 	}
-
 	/**
 	 * Returns the value of this literal node.
 	 * <p>
@@ -217,6 +224,9 @@
 	 * @since 3.24
 	 */
 	public String getLiteralValue() {
+		if (!this.literalValue.isEmpty()) {
+			return this.literalValue;
+		}
 		char[] escaped = getEscapedValue().toCharArray();
 		int len = escaped.length;
 		if (len < 7) {
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/util/DOMASTUtil.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/util/DOMASTUtil.java
index 3d45d3c..e0180f1 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/util/DOMASTUtil.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/util/DOMASTUtil.java
@@ -148,23 +148,16 @@
 
 	@SuppressWarnings("deprecation")
 	public static void checkASTLevel(int level) {
+		// Clients can use AST.JLS_Latest
+		if(level >=AST.JLS8 && level <= AST.JLS_Latest )
+			return;
 		switch (level) {
 	        case AST.JLS2 :
 	        case AST.JLS3 :
 	        case AST.JLS4 :
-	        case AST.JLS8 :
-	        case AST.JLS9 :
-	        case AST.JLS10 :
-	        case AST.JLS11 :
-	        case AST.JLS12 :
-	        case AST.JLS13 :
-	        case AST.JLS14 :
-	        case AST.JLS15 :
-	        case AST.JLS16 :
 	        	return;
 		}
-		throw new IllegalArgumentException();
-
+		throw new IllegalArgumentException(Integer.toString(level));
 	}
 
 }
diff --git a/org.eclipse.jdt.core/forceQualifierUpdate.txt b/org.eclipse.jdt.core/forceQualifierUpdate.txt
index c044c2e..bc9b99d 100644
--- a/org.eclipse.jdt.core/forceQualifierUpdate.txt
+++ b/org.eclipse.jdt.core/forceQualifierUpdate.txt
@@ -3,4 +3,5 @@
 Bug 436266 - Use RC3 (plus) version of JDT compiler to build RC4
 Bug 551547 - The library org.eclipse.jdt.core.compiler.batch_*.jar should be signed
 Bug 549687 - Local ecj build has a SHA-256 digest error for org/eclipse/jdt/internal/compiler/apt/model/PackageElementImpl.class
-Bug 566471 - I20200828-0150 - Comparator Errors Found
\ No newline at end of file
+Bug 566471 - I20200828-0150 - Comparator Errors Found
+Bug 573283 - don't include javax15api.jar in jdt binaries
\ No newline at end of file
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaElement.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaElement.java
index 05f9fe3..69efe66 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaElement.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/JavaElement.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2020 IBM Corporation and others.
+ * Copyright (c) 2000, 2021 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -203,6 +203,7 @@
 		for (int i = 0, length = mementoName.length(); i < length; i++) {
 			char character = mementoName.charAt(i);
 			switch (character) {
+				case JEM_MODULE:
 				case JEM_ESCAPE:
 				case JEM_COUNT:
 				case JEM_JAVAPROJECT:
diff --git a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/MementoTokenizer.java b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/MementoTokenizer.java
index 4b376f0..efab1e6 100644
--- a/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/MementoTokenizer.java
+++ b/org.eclipse.jdt.core/model/org/eclipse/jdt/internal/core/util/MementoTokenizer.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2004, 2018 IBM Corporation and others.
+ * Copyright (c) 2004, 2021 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -127,8 +127,6 @@
 					if (buffer == null) buffer = new StringBuffer();
 					buffer.append(this.memento, start, this.index - start);
 					start = ++this.index;
-					if (this.memento[this.index] == JavaElement.JEM_MODULE)
-						return buffer.toString();
 					break;
 				case JavaElement.JEM_COUNT:
 				case JavaElement.JEM_JAVAPROJECT:
diff --git a/org.eclipse.jdt.core/pom.xml b/org.eclipse.jdt.core/pom.xml
index f6d8ab2..6c1ba3c 100644
--- a/org.eclipse.jdt.core/pom.xml
+++ b/org.eclipse.jdt.core/pom.xml
@@ -227,6 +227,69 @@
           </execution>
         </executions>
       </plugin>
+      <plugin>
+        <groupId>org.codehaus.mojo</groupId>
+        <artifactId>build-helper-maven-plugin</artifactId>
+        <version>3.2.0</version>
+        <executions>
+          <!--
+            Replace '\' Windows file separators by '/' in order to expand the new property 'compiler-message-properties'
+            into a string literal in Maven Enforcer rule 'evaluateBeanshell' further below
+          --> 
+          <execution>
+            <id>compiler-message-properties</id>
+            <goals>
+              <goal>regex-property</goal>
+            </goals>
+            <configuration>
+              <name>compiler-message-properties</name>
+              <value>${project.basedir}/batch/org/eclipse/jdt/internal/compiler/batch/messages.properties</value>
+              <regex>\\</regex>
+              <replacement>/</replacement>
+              <failIfNoMatch>false</failIfNoMatch>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
+      <plugin>
+        <groupId>org.apache.maven.plugins</groupId>
+        <artifactId>maven-enforcer-plugin</artifactId>
+        <executions>
+          <execution>
+            <id>no-tabs-in-compiler-messages</id>
+            <goals>
+              <goal>enforce</goal>
+            </goals>
+            <configuration>
+              <rules>
+                <evaluateBeanshell>
+                  <message>
+                    Compiler message resource file ${compiler-message-properties} must not contain tab characters, please use spaces instead!
+                  </message>
+                  <condition><![CDATA[
+                    FileReader fileReader = new FileReader("${compiler-message-properties}");
+                    BufferedReader bufferReader = new BufferedReader(fileReader);
+                    boolean containsTab = false;
+                    String line;
+                    while((line = bufferReader.readLine()) != null) {
+                      if (line.contains("\t")) {
+                        if (!containsTab) {
+                          System.out.println("Lines containing tab characters detected in resource file:");
+                          containsTab = true;
+                        }
+                        System.out.println(line);
+                      }
+                    }
+                    fileReader.close();
+                    bufferReader.close();
+                    !containsTab
+                  ]]></condition>
+                </evaluateBeanshell>
+              </rules>
+            </configuration>
+          </execution>
+        </executions>
+      </plugin>
     </plugins>
   </build>
 </project>
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/SearchPattern.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/SearchPattern.java
index 9530fbf..f8255fd 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/SearchPattern.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/core/search/SearchPattern.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2020 IBM Corporation and others.
+ * Copyright (c) 2000, 2021 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -19,8 +19,19 @@
 
 import org.eclipse.core.runtime.IProgressMonitor;
 import org.eclipse.core.runtime.OperationCanceledException;
-import org.eclipse.jdt.core.*;
-import org.eclipse.jdt.core.compiler.*;
+import org.eclipse.jdt.core.Flags;
+import org.eclipse.jdt.core.IField;
+import org.eclipse.jdt.core.IImportDeclaration;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IMember;
+import org.eclipse.jdt.core.IMethod;
+import org.eclipse.jdt.core.IModularClassFile;
+import org.eclipse.jdt.core.IType;
+import org.eclipse.jdt.core.ITypeParameter;
+import org.eclipse.jdt.core.JavaModelException;
+import org.eclipse.jdt.core.Signature;
+import org.eclipse.jdt.core.compiler.CharOperation;
+import org.eclipse.jdt.core.compiler.InvalidInputException;
 import org.eclipse.jdt.internal.compiler.classfmt.ClassFileConstants;
 import org.eclipse.jdt.internal.compiler.env.AccessRuleSet;
 import org.eclipse.jdt.internal.compiler.parser.Scanner;
@@ -34,7 +45,21 @@
 import org.eclipse.jdt.internal.core.search.JavaSearchScope;
 import org.eclipse.jdt.internal.core.search.StringOperation;
 import org.eclipse.jdt.internal.core.search.indexing.IIndexConstants;
-import org.eclipse.jdt.internal.core.search.matching.*;
+import org.eclipse.jdt.internal.core.search.matching.AndPattern;
+import org.eclipse.jdt.internal.core.search.matching.ConstructorPattern;
+import org.eclipse.jdt.internal.core.search.matching.FieldPattern;
+import org.eclipse.jdt.internal.core.search.matching.LocalVariablePattern;
+import org.eclipse.jdt.internal.core.search.matching.MatchLocator;
+import org.eclipse.jdt.internal.core.search.matching.MethodPattern;
+import org.eclipse.jdt.internal.core.search.matching.ModulePattern;
+import org.eclipse.jdt.internal.core.search.matching.OrPattern;
+import org.eclipse.jdt.internal.core.search.matching.PackageDeclarationPattern;
+import org.eclipse.jdt.internal.core.search.matching.PackageReferencePattern;
+import org.eclipse.jdt.internal.core.search.matching.QualifiedTypeDeclarationPattern;
+import org.eclipse.jdt.internal.core.search.matching.SuperTypeReferencePattern;
+import org.eclipse.jdt.internal.core.search.matching.TypeDeclarationPattern;
+import org.eclipse.jdt.internal.core.search.matching.TypeParameterPattern;
+import org.eclipse.jdt.internal.core.search.matching.TypeReferencePattern;
 import org.eclipse.objectteams.otdt.core.IOTJavaElement;
 import org.eclipse.objectteams.otdt.internal.core.AbstractCalloutMapping;
 import org.eclipse.objectteams.otdt.internal.core.CalloutMapping;
@@ -2036,6 +2061,28 @@
 					typeSignature,
 					limitTo,
 					matchRule);
+
+			//If field is record's component, create a OR pattern comprising of record's component and its accessor methods
+			IType declaringType = field.getDeclaringType();
+			try {
+				if( declaringType.isRecord()){
+					MethodPattern accessorMethodPattern = new MethodPattern(name,
+							declaringQualification,
+							declaringSimpleName,
+							typeQualification,
+							typeSimpleName,
+							null,
+							null,
+							field.getDeclaringType(),
+							limitTo,
+							matchRule);
+
+					searchPattern= new OrPattern(searchPattern,accessorMethodPattern);
+				}
+			} catch (JavaModelException e1) {
+			// continue with previous searchPattern
+			}
+
 			break;
 		case IJavaElement.IMPORT_DECLARATION :
 			String elementName = element.getElementName();
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/nd/Nd.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/nd/Nd.java
index 13f0276..30aa62f 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/nd/Nd.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/nd/Nd.java
@@ -361,12 +361,11 @@
 		releaseWriteLock(0, false);
 	}
 
-	@SuppressWarnings("nls")
 	public void releaseWriteLock(int establishReadLocks, boolean flush) {
 		synchronized (this.mutex) {
 			Thread current = Thread.currentThread();
 			if (current != this.writeLockOwner) {
-				throw new IllegalStateException("Index wasn't locked by this thread!!!");
+				throw new IllegalStateException("Index wasn't locked by this thread!!!"); //$NON-NLS-1$
 			}
 			this.writeLockOwner = null;
 		}
@@ -511,13 +510,12 @@
 			return this.fTraces.size();
 		}
 
-		@SuppressWarnings("nls")
 		public void write(String threadName) {
-			System.out.println("Thread: '" + threadName + "': " + this.fReadLocks + " readlocks, " + this.fWriteLocks + " writelocks");
+			System.out.println("Thread: '" + threadName + "': " + this.fReadLocks + " readlocks, " + this.fWriteLocks + " writelocks");    //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$
 			for (StackTraceElement[] trace : this.fTraces) {
-				System.out.println("  Stacktrace:");
+				System.out.println("  Stacktrace:"); //$NON-NLS-1$
 				for (StackTraceElement ste : trace) {
-					System.out.println("    " + ste);
+					System.out.println("    " + ste); //$NON-NLS-1$
 				}
 			}
 		}
@@ -555,16 +553,15 @@
 	}
 
 	// For debugging lock issues
-	@SuppressWarnings("nls")
 	static void decReadLock(Map<Thread, DebugLockInfo> lockDebugging) throws AssertionError {
 		DebugLockInfo info = getLockInfo(lockDebugging);
 		if (info.fReadLocks <= 0) {
 			outputReadLocks(lockDebugging);
-			throw new AssertionError("Superfluous releaseReadLock");
+			throw new AssertionError("Superfluous releaseReadLock"); //$NON-NLS-1$
 		}
 		if (info.fWriteLocks != 0) {
 			outputReadLocks(lockDebugging);
-			throw new AssertionError("Releasing readlock while holding write lock");
+			throw new AssertionError("Releasing readlock while holding write lock"); //$NON-NLS-1$
 		}
 		if (--info.fReadLocks == 0) {
 			lockDebugging.remove(Thread.currentThread());
@@ -574,15 +571,14 @@
 	}
 
 	// For debugging lock issues
-	@SuppressWarnings("nls")
 	private void incWriteLock(int giveupReadLocks) throws AssertionError {
 		DebugLockInfo info = getLockInfo(this.fLockDebugging);
 		if (info.fReadLocks != giveupReadLocks) {
 			outputReadLocks(this.fLockDebugging);
-			throw new AssertionError("write lock with " + giveupReadLocks + " readlocks, expected " + info.fReadLocks);
+			throw new AssertionError("write lock with " + giveupReadLocks + " readlocks, expected " + info.fReadLocks); //$NON-NLS-1$ //$NON-NLS-2$
 		}
 		if (info.fWriteLocks != 0)
-			throw new AssertionError("Duplicate write lock");
+			throw new AssertionError("Duplicate write lock"); //$NON-NLS-1$
 		info.fWriteLocks++;
 	}
 
@@ -600,13 +596,12 @@
 	}
 
 	// For debugging lock issues
-	@SuppressWarnings("nls")
 	private long reportBlockedWriteLock(long start, int giveupReadLocks) {
 		long now= System.currentTimeMillis();
 		if (now >= start + BLOCKED_WRITE_LOCK_OUTPUT_INTERVAL) {
 			System.out.println();
-			System.out.println("Blocked writeLock");
-			System.out.println("  lockcount= " + this.lockCount + ", giveupReadLocks=" + giveupReadLocks + ", waitingReaders=" + this.waitingReaders);
+			System.out.println("Blocked writeLock"); //$NON-NLS-1$
+			System.out.println("  lockcount= " + this.lockCount + ", giveupReadLocks=" + giveupReadLocks + ", waitingReaders=" + this.waitingReaders); //$NON-NLS-1$ //$NON-NLS-2$ //$NON-NLS-3$
 			outputReadLocks(this.fLockDebugging);
 			start= now;
 		}
@@ -614,14 +609,13 @@
 	}
 
 	// For debugging lock issues
-	@SuppressWarnings("nls")
 	private static void outputReadLocks(Map<Thread, DebugLockInfo> lockDebugging) {
-		System.out.println("---------------------  Lock Debugging -------------------------");
+		System.out.println("---------------------  Lock Debugging -------------------------"); //$NON-NLS-1$
 		for (Thread th: lockDebugging.keySet()) {
 			DebugLockInfo info = lockDebugging.get(th);
 			info.write(th.getName());
 		}
-		System.out.println("---------------------------------------------------------------");
+		System.out.println("---------------------------------------------------------------"); //$NON-NLS-1$
 	}
 
 	// For debugging lock issues
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/nd/RawGrowableArray.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/nd/RawGrowableArray.java
index e3ed5c9..b2c488c 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/nd/RawGrowableArray.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/nd/RawGrowableArray.java
@@ -113,7 +113,7 @@
 		ARRAY_HEADER_BYTES = type.size();
 	}
 
-	private static class GrowableBlockHeader {
+	static class GrowableBlockHeader {
 		public static final FieldInt ARRAY_SIZE;
 		public static final FieldInt ALLOCATED_SIZE;
 		public static final int GROWABLE_BLOCK_HEADER_BYTES;
@@ -134,10 +134,13 @@
 			MAX_GROWABLE_SIZE = (Database.MAX_SINGLE_BLOCK_MALLOC_SIZE - GROWABLE_BLOCK_HEADER_BYTES)
 					/ Database.PTR_SIZE;
 		}
+
+		static StructDef<GrowableBlockHeader> getType() {
+			return type;
+		}
 	}
 
-	@SuppressWarnings("synthetic-access")
-	private static final class MetaBlockHeader extends GrowableBlockHeader {
+	static final class MetaBlockHeader extends GrowableBlockHeader {
 		/**
 		 * Holds the number of pages used for the metablock. Note that the start of the metablock array needs to be
 		 * 4-byte aligned. Since all malloc calls are always 2 bytes away from 4-byte alignment, we need to use at
@@ -149,7 +152,7 @@
 		private static final StructDef<MetaBlockHeader> type;
 
 		static {
-			type = StructDef.createAbstract(MetaBlockHeader.class, GrowableBlockHeader.type);
+			type = StructDef.createAbstract(MetaBlockHeader.class, GrowableBlockHeader.getType());
 
 			METABLOCK_NUM_PAGES = type.addShort();
 			type.done();
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/nd/util/CharArrayMap.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/nd/util/CharArrayMap.java
index c46beaf..74a64e3 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/nd/util/CharArrayMap.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/nd/util/CharArrayMap.java
@@ -104,11 +104,10 @@
             return result;
         }
 
-        @SuppressWarnings("nls")
 		@Override
         public String toString() {
         	String slice = new String(this.buffer, this.start, this.length);
-        	return "'" + slice + "'@(" + this.start + "," + this.length + ")";
+        	return "'" + slice + "'@(" + this.start + "," + this.length + ")";    //$NON-NLS-1$//$NON-NLS-2$//$NON-NLS-3$//$NON-NLS-4$
         }
 
 
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MatchLocator.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MatchLocator.java
index b52e8a8..db99ce2 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MatchLocator.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MatchLocator.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2020 IBM Corporation and others.
+ * Copyright (c) 2000, 2021 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -1785,6 +1785,8 @@
 		acceptFlag = NameLookup.ACCEPT_ENUMS;
 	} else if (typeBinding.isInterface()) {
 		acceptFlag = NameLookup.ACCEPT_INTERFACES;
+	} else if (typeBinding.isRecord()) {
+		acceptFlag = NameLookup.ACCEPT_RECORDS;
 	} else if (typeBinding.isClass()) {
 		acceptFlag = NameLookup.ACCEPT_CLASSES;
 	}