Merge remote-tracking branch 'origin/master' into BETA_JAVA16 after M3

Conflicts:
	org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/source/SourceTestCase14.java

Change-Id: I905af9738941d6bb5918daeb7d05300702fa8ec2
diff --git a/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/views/ASTView.java b/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/views/ASTView.java
index 5b936f7..3ab8b5c 100644
--- a/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/views/ASTView.java
+++ b/org.eclipse.jdt.astview/src/org/eclipse/jdt/astview/views/ASTView.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
@@ -8,6 +8,10 @@
  *
  * SPDX-License-Identifier: EPL-2.0
  *
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *******************************************************************************/
@@ -114,7 +118,6 @@
 import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jdt.core.WorkingCopyOwner;
 import org.eclipse.jdt.core.compiler.IProblem;
-import org.eclipse.jdt.core.dom.AST;
 import org.eclipse.jdt.core.dom.ASTNode;
 import org.eclipse.jdt.core.dom.ASTParser;
 import org.eclipse.jdt.core.dom.ASTRequestor;
@@ -132,70 +135,24 @@
 
 import org.eclipse.jdt.ui.JavaUI;
 
+import org.eclipse.jdt.internal.ui.util.ASTHelper;
+
 
 public class ASTView extends ViewPart implements IShowInSource, IShowInTargetList {
 
-	static final int JLS_LATEST= AST.JLS15;
-
-	private static final int JLS15= AST.JLS15;
-
-	/**
-	 * @deprecated to get rid of deprecation warnings in code
-	 */
-	@Deprecated
-	private static final int JLS14= AST.JLS14;
-
-	/**
-	 * @deprecated to get rid of deprecation warnings in code
-	 */
-	@Deprecated
-	private static final int JLS13= AST.JLS13;
-
-	/**
-	 * @deprecated to get rid of deprecation warnings in code
-	 */
-	@Deprecated
-	private static final int JLS12= AST.JLS12;
-
-	/**
-	 * @deprecated to get rid of deprecation warnings in code
-	 */
-	@Deprecated
-	private static final int JLS11= AST.JLS11;
-
-	/**
-	 * @deprecated to get rid of deprecation warnings in code
-	 */
-	@Deprecated
-	private static final int JLS10= AST.JLS10;
-
-	/**
-	 * @deprecated to get rid of deprecation warnings in code
-	 */
-	@Deprecated
-	private static final int JLS9= AST.JLS9;
-
-	/**
-	 * @deprecated to get rid of deprecation warnings in code
-	 */
-	@Deprecated
-	private static final int JLS8= AST.JLS8;
-
-	/**
-	 * @deprecated to get rid of deprecation warnings in code
-	 */
-	@Deprecated
-	private static final int JLS4= AST.JLS4;
-	/**
-	 * @deprecated to get rid of deprecation warnings in code
-	 */
-	@Deprecated
-	private static final int JLS3= AST.JLS3;
-	/**
-	 * @deprecated to get rid of deprecation warnings in code
-	 */
-	@Deprecated
-	private static final int JLS2= AST.JLS2;
+	static final int JLS_LATEST= ASTHelper.JLS_Latest;
+	private static final int JLS16= ASTHelper.JLS16;
+	private static final int JLS15= ASTHelper.JLS15;
+	private static final int JLS14= ASTHelper.JLS14;
+	private static final int JLS13= ASTHelper.JLS13;
+	private static final int JLS12= ASTHelper.JLS12;
+	private static final int JLS11= ASTHelper.JLS11;
+	private static final int JLS10= ASTHelper.JLS10;
+	private static final int JLS9= ASTHelper.JLS9;
+	private static final int JLS8= ASTHelper.JLS8;
+	private static final int JLS4= ASTHelper.JLS4;
+	private static final int JLS3= ASTHelper.JLS3;
+	private static final int JLS2= ASTHelper.JLS2;
 
 	private class ASTViewSelectionProvider implements ISelectionProvider {
 		ListenerList<ISelectionChangedListener> fListeners= new ListenerList<>(ListenerList.IDENTITY);
@@ -554,6 +511,7 @@
 				case JLS13:
 				case JLS14:
 				case JLS15:
+				case JLS16:
 					fCurrentASTLevel= level;
 			}
 		} catch (NumberFormatException e) {
@@ -1175,6 +1133,7 @@
 				new ASTLevelToggle("AST Level 1&3 (13)", JLS13), //$NON-NLS-1$
 				new ASTLevelToggle("AST Level 1&4 (14)", JLS14), //$NON-NLS-1$
 				new ASTLevelToggle("AST Level 1&5 (15)", JLS15), //$NON-NLS-1$
+				new ASTLevelToggle("AST Level 1&6 (16)", JLS16), //$NON-NLS-1$
 		};
 
 		fAddToTrayAction= new Action() {
diff --git a/org.eclipse.jdt.core.manipulation/.settings/.api_filters b/org.eclipse.jdt.core.manipulation/.settings/.api_filters
index 21cf1b8..a0a4c9e 100644
--- a/org.eclipse.jdt.core.manipulation/.settings/.api_filters
+++ b/org.eclipse.jdt.core.manipulation/.settings/.api_filters
@@ -27,53 +27,18 @@
         </filter>
     </resource>
     <resource path="core extension/org/eclipse/jdt/internal/corext/dom/ASTFlattener.java" type="org.eclipse.jdt.internal.corext.dom.ASTFlattener">
-        <filter comment="For Java 14 preview features" id="640712815">
+        <filter comment="This is a Java 16 preview feature" id="640712815">
             <message_arguments>
-                <message_argument value="AbstractTypeDeclaration"/>
+                <message_argument value="PatternInstanceofExpression"/>
                 <message_argument value="ASTFlattener"/>
-                <message_argument value="bodyDeclarations()"/>
+                <message_argument value="getLeftOperand()"/>
             </message_arguments>
         </filter>
-        <filter comment="For Java 14 preview features" id="640712815">
+        <filter comment="This is a Java 16 preview feature" id="640712815">
             <message_arguments>
-                <message_argument value="AbstractTypeDeclaration"/>
+                <message_argument value="PatternInstanceofExpression"/>
                 <message_argument value="ASTFlattener"/>
-                <message_argument value="getName()"/>
-            </message_arguments>
-        </filter>
-        <filter comment="For Java 14 preview features" id="640712815">
-            <message_arguments>
-                <message_argument value="BodyDeclaration"/>
-                <message_argument value="ASTFlattener"/>
-                <message_argument value="getJavadoc()"/>
-            </message_arguments>
-        </filter>
-        <filter comment="For Java 14 preview features" id="640712815">
-            <message_arguments>
-                <message_argument value="BodyDeclaration"/>
-                <message_argument value="ASTFlattener"/>
-                <message_argument value="modifiers()"/>
-            </message_arguments>
-        </filter>
-        <filter comment="For Java 14 preview features" id="640712815">
-            <message_arguments>
-                <message_argument value="RecordDeclaration"/>
-                <message_argument value="ASTFlattener"/>
-                <message_argument value="recordComponents()"/>
-            </message_arguments>
-        </filter>
-        <filter comment="For Java 14 preview features" id="640712815">
-            <message_arguments>
-                <message_argument value="RecordDeclaration"/>
-                <message_argument value="ASTFlattener"/>
-                <message_argument value="superInterfaceTypes()"/>
-            </message_arguments>
-        </filter>
-        <filter comment="For Java 14 preview features" id="640712815">
-            <message_arguments>
-                <message_argument value="RecordDeclaration"/>
-                <message_argument value="ASTFlattener"/>
-                <message_argument value="typeParameters()"/>
+                <message_argument value="getRightOperand()"/>
             </message_arguments>
         </filter>
     </resource>
@@ -99,22 +64,6 @@
                 <message_argument value="isRecord()"/>
             </message_arguments>
         </filter>
-        <filter id="640712815">
-            <message_arguments>
-                <message_argument value="RecordDeclaration"/>
-                <message_argument value="LinkedNodeFinder"/>
-                <message_argument value="recordComponents()"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="core extension/org/eclipse/jdt/internal/corext/dom/ModifierRewrite.java" type="org.eclipse.jdt.internal.corext.dom.ModifierRewrite">
-        <filter comment="This is a Java 14 preview feature" id="623939596">
-            <message_arguments>
-                <message_argument value="RecordDeclaration"/>
-                <message_argument value="ModifierRewrite"/>
-                <message_argument value="MODIFIERS2_PROPERTY"/>
-            </message_arguments>
-        </filter>
     </resource>
     <resource path="core extension/org/eclipse/jdt/internal/corext/refactoring/rename/RefactoringAnalyzeUtil.java" type="org.eclipse.jdt.internal.corext.refactoring.rename.RefactoringAnalyzeUtil">
         <filter comment="This is a Java15 preview feature" id="640712815">
@@ -124,12 +73,5 @@
                 <message_argument value="isCompactConstructor()"/>
             </message_arguments>
         </filter>
-        <filter comment="This is a Java15 preview feature" id="640712815">
-            <message_arguments>
-                <message_argument value="RecordDeclaration"/>
-                <message_argument value="RefactoringAnalyzeUtil"/>
-                <message_argument value="getMethods()"/>
-            </message_arguments>
-        </filter>
     </resource>
 </component>
diff --git a/org.eclipse.jdt.core.manipulation/META-INF/MANIFEST.MF b/org.eclipse.jdt.core.manipulation/META-INF/MANIFEST.MF
index 7031dea..3fdbb2c 100644
--- a/org.eclipse.jdt.core.manipulation/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.core.manipulation/META-INF/MANIFEST.MF
@@ -61,5 +61,5 @@
  org.eclipse.jdt.internal.ui.text.correction;x-friends:="org.eclipse.jdt.ui,org.eclipse.jdt.debug.ui",
  org.eclipse.jdt.internal.ui.text.correction.proposals;x-friends:="org.eclipse.jdt.ui",
  org.eclipse.jdt.internal.ui.text.template.contentassist;x-friends:="org.eclipse.jdt.ui",
- org.eclipse.jdt.internal.ui.util;x-friends:="org.eclipse.jdt.ui"
+ org.eclipse.jdt.internal.ui.util;x-friends:="org.eclipse.jdt.ui,org.eclipse.jdt.astview,org.eclipse.jdt.junit.core"
 Bundle-RequiredExecutionEnvironment: JavaSE-1.8
diff --git a/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/core/manipulation/ImportReferencesCollector.java b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/core/manipulation/ImportReferencesCollector.java
index 521e571..67d8a70 100644
--- a/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/core/manipulation/ImportReferencesCollector.java
+++ b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/core/manipulation/ImportReferencesCollector.java
@@ -20,7 +20,6 @@
 import org.eclipse.jface.text.Region;
 
 import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.dom.AST;
 import org.eclipse.jdt.core.dom.ASTNode;
 import org.eclipse.jdt.core.dom.AnnotatableType;
 import org.eclipse.jdt.core.dom.ClassInstanceCreation;
@@ -246,7 +245,7 @@
 
 	@Override
 	public boolean visit(SimpleType node) {
-		if (node.getAST().apiLevel() < AST.JLS10 || !node.isVar()) {
+		if (node.getAST().apiLevel() < ASTHelper.JLS10 || !node.isVar()) {
 			typeRefFound(node.getName());
 		}
 		visitAnnotations(node);
@@ -268,7 +267,7 @@
 	}
 
 	private void visitAnnotations(AnnotatableType node) {
-		if (node.getAST().apiLevel() >= AST.JLS8) {
+		if (node.getAST().apiLevel() >= ASTHelper.JLS8) {
 			doVisitChildren(node.annotations());
 		}
 	}
@@ -479,13 +478,13 @@
 		// name not visited
 
 		int apiLevel= node.getAST().apiLevel();
-		if (apiLevel >= AST.JLS8) {
+		if (apiLevel >= ASTHelper.JLS8) {
 			doVisitNode(node.getReceiverType());
 		}
 		// receiverQualifier not visited:
 		//   Enclosing class names cannot be shadowed by an import (qualification is always redundant).
 		doVisitChildren(node.parameters());
-		if (apiLevel >= AST.JLS8) {
+		if (apiLevel >= ASTHelper.JLS8) {
 			doVisitChildren(node.extraDimensions());
 			doVisitChildren(node.thrownExceptionTypes());
 		} else {
diff --git a/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/core/manipulation/SharedASTProviderCore.java b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/core/manipulation/SharedASTProviderCore.java
index 2c4039b..092de50 100644
--- a/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/core/manipulation/SharedASTProviderCore.java
+++ b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/core/manipulation/SharedASTProviderCore.java
@@ -7,6 +7,10 @@
  * https://www.eclipse.org/legal/epl-2.0/
  *
  * SPDX-License-Identifier: EPL-2.0
+ * 
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
@@ -32,7 +36,7 @@
  * <p>Clients can make the following assumptions about the AST:</p>
  * <ul>
  *    <li>the AST has a {@link ITypeRoot} as source: {@link CompilationUnit#getTypeRoot()} is not null.</li>
- *    <li>the {@link AST#apiLevel() AST API level} is {@link AST#JLS15 API level 15} or higher</li>
+ *    <li>the {@link AST#apiLevel() AST API level} is {@link AST#JLS16 API level 16} or higher</li>
  *    <li>the AST has bindings resolved ({@link AST#hasResolvedBindings()})</li>
  *    <li>{@link AST#hasStatementsRecovery() statement} and {@link AST#hasBindingsRecovery() bindings}
  *           recovery are enabled
diff --git a/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/core/manipulation/StubUtility.java b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/core/manipulation/StubUtility.java
index 2099d1c..3425ef0 100644
--- a/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/core/manipulation/StubUtility.java
+++ b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/core/manipulation/StubUtility.java
@@ -69,7 +69,6 @@
 import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jdt.core.NamingConventions;
 import org.eclipse.jdt.core.Signature;
-import org.eclipse.jdt.core.dom.AST;
 import org.eclipse.jdt.core.dom.ASTNode;
 import org.eclipse.jdt.core.dom.ASTParser;
 import org.eclipse.jdt.core.dom.AbstractTypeDeclaration;
@@ -108,6 +107,8 @@
 import org.eclipse.jdt.internal.corext.dom.Bindings;
 import org.eclipse.jdt.internal.corext.dom.IASTSharedValues;
 
+import org.eclipse.jdt.internal.ui.util.ASTHelper;
+
 /**
  * Implementations for {@link CodeGeneration} APIs, and other helper methods
  * to create source code stubs based on {@link IJavaElement}s.
@@ -765,7 +766,7 @@
 	@Deprecated
 	private static String[] getExceptionNames(MethodDeclaration decl) {
 		String[] exceptionNames;
-		if (decl.getAST().apiLevel() >= AST.JLS8) {
+		if (decl.getAST().apiLevel() >= ASTHelper.JLS8) {
 			List<Type> exceptions= decl.thrownExceptionTypes();
 			exceptionNames= new String[exceptions.size()];
 			for (int i= 0; i < exceptionNames.length; i++) {
@@ -793,7 +794,7 @@
 	@Deprecated
 	private static ASTNode getReturnType(MethodDeclaration decl) {
 		// used from API, can't eliminate
-		return decl.getAST().apiLevel() == AST.JLS2 ? decl.getReturnType() : decl.getReturnType2();
+		return decl.getAST().apiLevel() == ASTHelper.JLS2 ? decl.getReturnType() : decl.getReturnType2();
 	}
 
 
diff --git a/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/util/ASTHelper.java b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/util/ASTHelper.java
index 3d397ae..7d8c7b2 100644
--- a/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/util/ASTHelper.java
+++ b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/util/ASTHelper.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
@@ -7,6 +7,10 @@
  * https://www.eclipse.org/legal/epl-2.0/
  *
  * SPDX-License-Identifier: EPL-2.0
+ * 
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
@@ -17,20 +21,38 @@
 import org.eclipse.jdt.core.dom.ASTNode;
 import org.eclipse.jdt.core.dom.Modifier;
 
+@SuppressWarnings("deprecation")
 public class ASTHelper {
 
-	@SuppressWarnings("deprecation")
+	public static final int JLS2 = AST.JLS2;
+	public static final int JLS3 = AST.JLS3;
+	public static final int JLS4 = AST.JLS4;
+	public static final int JLS8 = AST.JLS8;
+	public static final int JLS9 = AST.JLS9;
+	public static final int JLS10 = AST.JLS10;
+	public static final int JLS11 = AST.JLS11;
+	public static final int JLS12 = AST.JLS12;
+	public static final int JLS13 = AST.JLS13;
+	public static final int JLS14 = AST.JLS14;
+	public static final int JLS15 = AST.JLS15;
+	public static final int JLS16 = AST.JLS16;
+
+	/*
+	 *  Junit4TestFinder and Junit5TestFinder use AST.JLS_Latest directly
+	 */
+	public static final int JLS_Latest = AST.JLS_Latest;
+
 	private static boolean isNodeTypeSupportedInAST(AST ast, int nodeType) {
 		switch (nodeType) {
 			case ASTNode.SWITCH_CASE:
 			case ASTNode.SWITCH_EXPRESSION:
 			case ASTNode.YIELD_STATEMENT:
-				return ast.apiLevel() >= AST.JLS14;
+				return ast.apiLevel() >= JLS14;
 			case ASTNode.TEXT_BLOCK:
-				return ast.apiLevel() >= AST.JLS15;
+				return ast.apiLevel() >= JLS15;
 			case ASTNode.RECORD_DECLARATION:
 			case ASTNode.INSTANCEOF_EXPRESSION:
-				return ast.isPreviewEnabled();
+				return ast.apiLevel() >= JLS16;
 			default:
 				break;
 		}
@@ -72,4 +94,8 @@
 		return isModifierSupportedInAST(ast, Modifier.SEALED);
 	}
 
+	public static boolean isInstanceofExpressionPatternSupported(AST ast) {
+		return isNodeTypeSupportedInAST(ast, ASTNode.INSTANCEOF_EXPRESSION);
+	}
+
 }
diff --git a/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/codemanipulation/StubUtility2Core.java b/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/codemanipulation/StubUtility2Core.java
index b8cf73d..970f7cb 100644
--- a/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/codemanipulation/StubUtility2Core.java
+++ b/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/codemanipulation/StubUtility2Core.java
@@ -85,6 +85,8 @@
 import org.eclipse.jdt.internal.corext.refactoring.util.JavaElementUtil;
 import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
 
+import org.eclipse.jdt.internal.ui.util.ASTHelper;
+
 /**
  * Utilities for code generation based on AST rewrite.
  *
@@ -525,7 +527,7 @@
 
 	public static void createThrownExceptions(MethodDeclaration decl, IMethodBinding method, ImportRewrite imports, ImportRewriteContext context, AST ast) {
 		ITypeBinding[] excTypes= method.getExceptionTypes();
-		if (ast.apiLevel() >= AST.JLS8) {
+		if (ast.apiLevel() >= ASTHelper.JLS8) {
 			List<Type> thrownExceptions= decl.thrownExceptionTypes();
 			for (ITypeBinding t : excTypes) {
 				Type excType= imports.addImport(t, ast, context, TypeLocation.EXCEPTION);
diff --git a/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/dom/ASTFlattener.java b/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/dom/ASTFlattener.java
index 42a35dc..c483baa 100644
--- a/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/dom/ASTFlattener.java
+++ b/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/dom/ASTFlattener.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
@@ -7,6 +7,10 @@
  * https://www.eclipse.org/legal/epl-2.0/
  *
  * SPDX-License-Identifier: EPL-2.0
+ * 
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
@@ -29,27 +33,6 @@
  */
 
 	/**
-	 * @deprecated to avoid deprecation warnings
-	 */
-	@Deprecated
-	private static final int JLS3= AST.JLS3;
-	/**
-	 * @deprecated to avoid deprecation warnings
-	 */
-	@Deprecated
-	private static final int JLS4= AST.JLS4;
-	/**
-	 * @deprecated to avoid deprecation warnings
-	 */
-	@Deprecated
-	private static final int JLS8= AST.JLS8;
-	/**
-	 * @deprecated to avoid deprecation warnings
-	 */
-	@Deprecated
-	private static final int JLS9= AST.JLS9;
-
-	/**
 	 * The string buffer into which the serialized representation of the AST is
 	 * written.
 	 */
@@ -137,7 +120,7 @@
 	}
 
 	void printTypeAnnotations(AnnotatableType node) {
-		if (node.getAST().apiLevel() >= JLS8) {
+		if (node.getAST().apiLevel() >= ASTHelper.JLS8) {
 			printAnnotationsList(node.annotations());
 		}
 	}
@@ -287,7 +270,7 @@
 	 */
 	@Override
 	public boolean visit(ArrayType node) {
-		if (node.getAST().apiLevel() < JLS8) {
+		if (node.getAST().apiLevel() < ASTHelper.JLS8) {
 			getComponentType(node).accept(this);
 			this.fBuffer.append("[]");//$NON-NLS-1$
 		} else {
@@ -420,7 +403,7 @@
 			this.fBuffer.append(".");//$NON-NLS-1$
 		}
 		this.fBuffer.append("new ");//$NON-NLS-1$
-		if (node.getAST().apiLevel() >= JLS3) {
+		if (node.getAST().apiLevel() >= ASTHelper.JLS3) {
 			if (!node.typeArguments().isEmpty()) {
 				this.fBuffer.append("<");//$NON-NLS-1$
 				for (Iterator<Type> it= node.typeArguments().iterator(); it.hasNext();) {
@@ -454,7 +437,7 @@
 	 */
 	@Override
 	public boolean visit(CompilationUnit node) {
-		if (node.getAST().apiLevel() >= JLS9) {
+		if (node.getAST().apiLevel() >= ASTHelper.JLS9) {
 			if (node.getModule() != null) {
 				node.getModule().accept(this);
 			}
@@ -491,7 +474,7 @@
 	 */
 	@Override
 	public boolean visit(ConstructorInvocation node) {
-		if (node.getAST().apiLevel() >= JLS3) {
+		if (node.getAST().apiLevel() >= ASTHelper.JLS3) {
 			if (!node.typeArguments().isEmpty()) {
 				this.fBuffer.append("<");//$NON-NLS-1$
 				for (Iterator<Type> it= node.typeArguments().iterator(); it.hasNext();) {
@@ -708,7 +691,7 @@
 		if (node.getJavadoc() != null) {
 			node.getJavadoc().accept(this);
 		}
-		if (node.getAST().apiLevel() >= JLS3) {
+		if (node.getAST().apiLevel() >= ASTHelper.JLS3) {
 			printModifiers(node.modifiers());
 		}
 		node.getType().accept(this);
@@ -770,7 +753,7 @@
 	@Override
 	public boolean visit(ImportDeclaration node) {
 		this.fBuffer.append("import ");//$NON-NLS-1$
-		if (node.getAST().apiLevel() >= JLS3) {
+		if (node.getAST().apiLevel() >= ASTHelper.JLS3) {
 			if (node.isStatic()) {
 				this.fBuffer.append("static ");//$NON-NLS-1$
 			}
@@ -812,7 +795,7 @@
 		if (node.getJavadoc() != null) {
 			node.getJavadoc().accept(this);
 		}
-		if (node.getAST().apiLevel() >= JLS3) {
+		if (node.getAST().apiLevel() >= ASTHelper.JLS3) {
 			printModifiers(node.modifiers());
 		}
 		node.getBody().accept(this);
@@ -829,6 +812,14 @@
 		node.getRightOperand().accept(this);
 		return false;
 	}
+	
+	@Override
+	public boolean visit(PatternInstanceofExpression node) {
+		node.getLeftOperand().accept(this);
+		this.fBuffer.append(" instanceof ");//$NON-NLS-1$
+		node.getRightOperand().accept(this);
+		return false;
+	}
 
 	/*
 	 * @see ASTVisitor#visit(IntersectionType)
@@ -969,7 +960,7 @@
 	@Override
 	public boolean visit(MethodRefParameter node) {
 		node.getType().accept(this);
-		if (node.getAST().apiLevel() >= JLS3) {
+		if (node.getAST().apiLevel() >= ASTHelper.JLS3) {
 			if (node.isVarargs()) {
 				this.fBuffer.append("...");//$NON-NLS-1$
 			}
@@ -989,7 +980,7 @@
 		if (node.getJavadoc() != null) {
 			node.getJavadoc().accept(this);
 		}
-		if (node.getAST().apiLevel() >= JLS3) {
+		if (node.getAST().apiLevel() >= ASTHelper.JLS3) {
 			printModifiers(node.modifiers());
 			if (!node.typeParameters().isEmpty()) {
 				this.fBuffer.append("<");//$NON-NLS-1$
@@ -1014,7 +1005,7 @@
 		}
 		node.getName().accept(this);
 		this.fBuffer.append("(");//$NON-NLS-1$
-		if (node.getAST().apiLevel() >= JLS8) {
+		if (node.getAST().apiLevel() >= ASTHelper.JLS8) {
 			Type receiverType= node.getReceiverType();
 			if (receiverType != null) {
 				receiverType.accept(this);
@@ -1038,7 +1029,7 @@
 			}
 		}
 		this.fBuffer.append(")");//$NON-NLS-1$
-		if (node.getAST().apiLevel() >= JLS8) {
+		if (node.getAST().apiLevel() >= ASTHelper.JLS8) {
 			List<Dimension> dimensions = node.extraDimensions();
 			for (Dimension e : dimensions) {
 				e.accept(this);
@@ -1048,7 +1039,7 @@
 				this.fBuffer.append("[]"); //$NON-NLS-1$
 			}
 		}
-		List<? extends ASTNode> thrownExceptions= node.getAST().apiLevel() >= JLS8 ? node.thrownExceptionTypes() : getThrownExceptions(node);
+		List<? extends ASTNode> thrownExceptions= node.getAST().apiLevel() >= ASTHelper.JLS8 ? node.thrownExceptionTypes() : getThrownExceptions(node);
 		if (!thrownExceptions.isEmpty()) {
 			this.fBuffer.append(" throws ");//$NON-NLS-1$
 			for (Iterator<? extends ASTNode> it= thrownExceptions.iterator(); it.hasNext();) {
@@ -1077,7 +1068,7 @@
 			node.getExpression().accept(this);
 			this.fBuffer.append(".");//$NON-NLS-1$
 		}
-		if (node.getAST().apiLevel() >= JLS3) {
+		if (node.getAST().apiLevel() >= ASTHelper.JLS3) {
 			if (!node.typeArguments().isEmpty()) {
 				this.fBuffer.append("<");//$NON-NLS-1$
 				for (Iterator<Type> it= node.typeArguments().iterator(); it.hasNext();) {
@@ -1211,7 +1202,7 @@
 	 */
 	@Override
 	public boolean visit(PackageDeclaration node) {
-		if (node.getAST().apiLevel() >= JLS3) {
+		if (node.getAST().apiLevel() >= ASTHelper.JLS3) {
 			if (node.getJavadoc() != null) {
 				node.getJavadoc().accept(this);
 			}
@@ -1438,13 +1429,13 @@
 	 */
 	@Override
 	public boolean visit(SingleVariableDeclaration node) {
-		if (node.getAST().apiLevel() >= JLS3) {
+		if (node.getAST().apiLevel() >= ASTHelper.JLS3) {
 			printModifiers(node.modifiers());
 		}
 		node.getType().accept(this);
-		if (node.getAST().apiLevel() >= JLS3) {
+		if (node.getAST().apiLevel() >= ASTHelper.JLS3) {
 			if (node.isVarargs()) {
-				if (node.getAST().apiLevel() >= JLS8) {
+				if (node.getAST().apiLevel() >= ASTHelper.JLS8) {
 					this.fBuffer.append(' ');
 					List<Annotation> annotations= node.varargsAnnotations();
 					printAnnotationsList(annotations);
@@ -1454,7 +1445,7 @@
 		}
 		this.fBuffer.append(" ");//$NON-NLS-1$
 		node.getName().accept(this);
-		if (node.getAST().apiLevel() >= JLS8) {
+		if (node.getAST().apiLevel() >= ASTHelper.JLS8) {
 			List<Dimension> dimensions = node.extraDimensions();
 			for (Dimension e : dimensions) {
 				e.accept(this);
@@ -1498,7 +1489,7 @@
 			node.getExpression().accept(this);
 			this.fBuffer.append(".");//$NON-NLS-1$
 		}
-		if (node.getAST().apiLevel() >= JLS3) {
+		if (node.getAST().apiLevel() >= ASTHelper.JLS3) {
 			if (!node.typeArguments().isEmpty()) {
 				this.fBuffer.append("<");//$NON-NLS-1$
 				for (Iterator<Type> it= node.typeArguments().iterator(); it.hasNext();) {
@@ -1547,7 +1538,7 @@
 			this.fBuffer.append(".");//$NON-NLS-1$
 		}
 		this.fBuffer.append("super.");//$NON-NLS-1$
-		if (node.getAST().apiLevel() >= JLS3) {
+		if (node.getAST().apiLevel() >= ASTHelper.JLS3) {
 			if (!node.typeArguments().isEmpty()) {
 				this.fBuffer.append("<");//$NON-NLS-1$
 				for (Iterator<Type> it= node.typeArguments().iterator(); it.hasNext();) {
@@ -1757,7 +1748,7 @@
 	@Override
 	public boolean visit(TryStatement node) {
 		this.fBuffer.append("try ");//$NON-NLS-1$
-		if (node.getAST().apiLevel() >= JLS4) {
+		if (node.getAST().apiLevel() >= ASTHelper.JLS4) {
 			if (!node.resources().isEmpty()) {
 				this.fBuffer.append("(");//$NON-NLS-1$
 				for (Iterator<Expression> it= node.resources().iterator(); it.hasNext();) {
@@ -1791,12 +1782,12 @@
 		if (node.getJavadoc() != null) {
 			node.getJavadoc().accept(this);
 		}
-		if (node.getAST().apiLevel() >= JLS3) {
+		if (node.getAST().apiLevel() >= ASTHelper.JLS3) {
 			printModifiers(node.modifiers());
 		}
 		this.fBuffer.append(node.isInterface() ? "interface " : "class ");//$NON-NLS-2$//$NON-NLS-1$
 		node.getName().accept(this);
-		if (node.getAST().apiLevel() >= JLS3) {
+		if (node.getAST().apiLevel() >= ASTHelper.JLS3) {
 			if (!node.typeParameters().isEmpty()) {
 				this.fBuffer.append("<");//$NON-NLS-1$
 				for (Iterator<TypeParameter> it= node.typeParameters().iterator(); it.hasNext();) {
@@ -1810,7 +1801,7 @@
 			}
 		}
 		this.fBuffer.append(" ");//$NON-NLS-1$
-		if (node.getAST().apiLevel() >= JLS3) {
+		if (node.getAST().apiLevel() >= ASTHelper.JLS3) {
 			if (node.getSuperclassType() != null) {
 				this.fBuffer.append("extends ");//$NON-NLS-1$
 				node.getSuperclassType().accept(this);
@@ -1866,7 +1857,7 @@
 	 */
 	@Override
 	public boolean visit(TypeDeclarationStatement node) {
-		if (node.getAST().apiLevel() >= JLS3) {
+		if (node.getAST().apiLevel() >= ASTHelper.JLS3) {
 			node.getDeclaration().accept(this);
 		}
 		return false;
@@ -1943,7 +1934,7 @@
 	 */
 	@Override
 	public boolean visit(VariableDeclarationExpression node) {
-		if (node.getAST().apiLevel() >= JLS3) {
+		if (node.getAST().apiLevel() >= ASTHelper.JLS3) {
 			printModifiers(node.modifiers());
 		}
 		node.getType().accept(this);
@@ -1964,7 +1955,7 @@
 	@Override
 	public boolean visit(VariableDeclarationFragment node) {
 		node.getName().accept(this);
-		if (node.getAST().apiLevel() >= JLS8) {
+		if (node.getAST().apiLevel() >= ASTHelper.JLS8) {
 			List<Dimension> dimensions = node.extraDimensions();
 			for (Dimension e : dimensions) {
 				e.accept(this);
@@ -1986,7 +1977,7 @@
 	 */
 	@Override
 	public boolean visit(VariableDeclarationStatement node) {
-		if (node.getAST().apiLevel() >= JLS3) {
+		if (node.getAST().apiLevel() >= ASTHelper.JLS3) {
 			printModifiers(node.modifiers());
 		}
 		node.getType().accept(this);
diff --git a/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/dom/ASTNodeFactory.java b/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/dom/ASTNodeFactory.java
index 0a53ee3..fada460 100644
--- a/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/dom/ASTNodeFactory.java
+++ b/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/dom/ASTNodeFactory.java
@@ -57,6 +57,8 @@
 
 import org.eclipse.jdt.internal.corext.codemanipulation.StubUtility2Core;
 
+import org.eclipse.jdt.internal.ui.util.ASTHelper;
+
 /**
  * JDT-UI-internal helper methods to create new {@link ASTNode}s.
  * Complements <code>AST#new*(..)</code> and <code>ImportRewrite#add*(..)</code>.
@@ -430,7 +432,7 @@
 	}
 
 	public static Type newNonVarType(AST ast, VariableDeclaration declaration, ImportRewrite importRewrite, ImportRewriteContext context) {
-		if (declaration.getAST().apiLevel() < AST.JLS10) {
+		if (declaration.getAST().apiLevel() < ASTHelper.JLS10) {
 			return newType(ast, declaration, importRewrite, context);
 		}
 
diff --git a/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/dom/IASTSharedValues.java b/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/dom/IASTSharedValues.java
index 4297ae0..5d9049d 100644
--- a/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/dom/IASTSharedValues.java
+++ b/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/dom/IASTSharedValues.java
@@ -15,13 +15,15 @@
 
 import org.eclipse.jdt.core.dom.AST;
 
+import org.eclipse.jdt.internal.ui.util.ASTHelper;
+
 public interface IASTSharedValues {
 
 	/**
 	 * This value is subject to change with every release. JDT-UI-internal code typically supports
 	 * the latest available {@link AST#apiLevel() AST level} exclusively.
 	 */
-	int SHARED_AST_LEVEL= AST.JLS15;
+	int SHARED_AST_LEVEL= ASTHelper.JLS_Latest;
 
 	boolean SHARED_AST_STATEMENT_RECOVERY= true;
 
diff --git a/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/dom/LinkedNodeFinder.java b/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/dom/LinkedNodeFinder.java
index cd7be3d..6073904 100644
--- a/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/dom/LinkedNodeFinder.java
+++ b/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/dom/LinkedNodeFinder.java
@@ -18,7 +18,6 @@
 
 import org.eclipse.jdt.core.Flags;
 import org.eclipse.jdt.core.compiler.IProblem;
-import org.eclipse.jdt.core.dom.AST;
 import org.eclipse.jdt.core.dom.ASTNode;
 import org.eclipse.jdt.core.dom.ASTVisitor;
 import org.eclipse.jdt.core.dom.BreakStatement;
@@ -269,7 +268,7 @@
 
 
 	public static SimpleName[] findByProblems(ASTNode parent, SimpleName nameNode) {
-		if (nameNode.getAST().apiLevel() >= AST.JLS10 && nameNode.isVar()) {
+		if (nameNode.getAST().apiLevel() >= ASTHelper.JLS10 && nameNode.isVar()) {
 			return null;
 		}
 		ArrayList<SimpleName> res= new ArrayList<>();
@@ -299,7 +298,7 @@
 				if ((nameNodeKind & currKind) != 0) {
 					ASTNode node= NodeFinder.perform(parent, probStart, (probEnd - probStart));
 					if (node instanceof SimpleName && name.equals(((SimpleName) node).getIdentifier())) {
-						if (node.getAST().apiLevel() < AST.JLS10 || !((SimpleName) node).isVar()) {
+						if (node.getAST().apiLevel() < ASTHelper.JLS10 || !((SimpleName) node).isVar()) {
 							res.add((SimpleName) node);
 						}
 					}
@@ -371,7 +370,7 @@
 
 		@Override
 		public boolean visit(SimpleName node) {
-			if (node.getAST().apiLevel() >= AST.JLS10 && node.isVar()) {
+			if (node.getAST().apiLevel() >= ASTHelper.JLS10 && node.isVar()) {
 				return false;
 			}
 			IBinding binding= node.resolveBinding();
diff --git a/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/refactoring/structure/MovedMemberAnalyzer.java b/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/refactoring/structure/MovedMemberAnalyzer.java
index 4d47d5d..0c0ad4c 100644
--- a/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/refactoring/structure/MovedMemberAnalyzer.java
+++ b/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/refactoring/structure/MovedMemberAnalyzer.java
@@ -14,7 +14,6 @@
  *******************************************************************************/
 package org.eclipse.jdt.internal.corext.refactoring.structure;
 
-import org.eclipse.jdt.core.dom.AST;
 import org.eclipse.jdt.core.dom.FieldAccess;
 import org.eclipse.jdt.core.dom.IBinding;
 import org.eclipse.jdt.core.dom.IMethodBinding;
@@ -29,6 +28,8 @@
 
 import org.eclipse.jdt.internal.corext.dom.Bindings;
 
+import org.eclipse.jdt.internal.ui.util.ASTHelper;
+
 /**
  * Updates references in moved static members.
  * Accepts <code>BodyDeclaration</code>s.
@@ -65,7 +66,7 @@
 		if (isMovedMember(binding))
 			return super.visit(node);
 
-		boolean isVarType= node.getAST().apiLevel() >= AST.JLS10 && node.isVar();
+		boolean isVarType= node.getAST().apiLevel() >= ASTHelper.JLS10 && node.isVar();
 		if (isSourceAccess(binding) && ! isVarType)
 			rewrite(node, fSource);
 		return super.visit(node);
diff --git a/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/refactoring/structure/ReferenceAnalyzer.java b/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/refactoring/structure/ReferenceAnalyzer.java
index f9a88fd..0718be0 100644
--- a/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/refactoring/structure/ReferenceAnalyzer.java
+++ b/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/refactoring/structure/ReferenceAnalyzer.java
@@ -14,7 +14,6 @@
  *******************************************************************************/
 package org.eclipse.jdt.internal.corext.refactoring.structure;
 
-import org.eclipse.jdt.core.dom.AST;
 import org.eclipse.jdt.core.dom.AnnotationTypeDeclaration;
 import org.eclipse.jdt.core.dom.EnumDeclaration;
 import org.eclipse.jdt.core.dom.FieldAccess;
@@ -32,6 +31,8 @@
 import org.eclipse.jdt.core.dom.TypeDeclaration;
 import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
 
+import org.eclipse.jdt.internal.ui.util.ASTHelper;
+
 /**
  * Updates references to moved static members.
  * Accepts <code>CompilationUnit</code>s.
@@ -87,7 +88,7 @@
 
 	@Override
 	public boolean visit(SimpleName node) {
-		boolean isVarType= node.getAST().apiLevel() >= AST.JLS10 && node.isVar();
+		boolean isVarType= node.getAST().apiLevel() >= ASTHelper.JLS10 && node.isVar();
 		if (! node.isDeclaration() && isMovedMember(node.resolveBinding()) && ! isVarType && ! isProcessed(node))
 			rewrite(node, fTarget);
 		return false;
diff --git a/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/util/JavaModelUtil.java b/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/util/JavaModelUtil.java
index ae7d957..0429b41 100644
--- a/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/util/JavaModelUtil.java
+++ b/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/util/JavaModelUtil.java
@@ -8,6 +8,10 @@
  *
  * SPDX-License-Identifier: EPL-2.0
  *
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Matt Chapman, mpchapman@gmail.com - 89977 Make JDT .java agnostic
@@ -80,7 +84,7 @@
 	 */
 	public static final String VERSION_LATEST;
 	static {
-		VERSION_LATEST= JavaCore.VERSION_15; // make sure it is not inlined
+		VERSION_LATEST= JavaCore.VERSION_16; // make sure it is not inlined
 	}
 
 	public static final int VALIDATE_EDIT_CHANGED_CONTENT= 10003;
@@ -841,6 +845,10 @@
 		return !isVersionLessThan(compliance, JavaCore.VERSION_15);
 	}
 
+	public static boolean is16OrHigher(String compliance) {
+		return !isVersionLessThan(compliance, JavaCore.VERSION_16);
+	}
+
 	/**
 	 * Checks if the given project or workspace has source compliance 1.2 or greater.
 	 *
@@ -959,6 +967,17 @@
 		return is15OrHigher(getSourceCompliance(project));
 	}
 
+	/**
+	 * Checks if the given project or workspace has source compliance 16 or greater.
+	 *
+	 * @param project the project to test or <code>null</code> to test the workspace settings
+	 * @return <code>true</code> if the given project or workspace has source compliance 16 or
+	 *         greater.
+	 */
+	public static boolean is16OrHigher(IJavaProject project) {
+		return is16OrHigher(getSourceCompliance(project));
+	}
+
 	private static String getSourceCompliance(IJavaProject project) {
 		return project != null ? project.getOption(JavaCore.COMPILER_SOURCE, true) : JavaCore.getOption(JavaCore.COMPILER_SOURCE);
 	}
@@ -1009,6 +1028,8 @@
 		String version= vMInstall.getJavaVersion();
 		if (version == null) {
 			return defaultCompliance;
+		} else if (version.startsWith(JavaCore.VERSION_16)) {
+			return JavaCore.VERSION_16;
 		} else if (version.startsWith(JavaCore.VERSION_15)) {
 			return JavaCore.VERSION_15;
 		} else if (version.startsWith(JavaCore.VERSION_14)) {
@@ -1051,7 +1072,9 @@
 
 		// fallback:
 		String desc= executionEnvironment.getId();
-		if (desc.indexOf(JavaCore.VERSION_15) != -1) {
+		if (desc.indexOf(JavaCore.VERSION_16) != -1) {
+			return JavaCore.VERSION_16;
+		} else if (desc.indexOf(JavaCore.VERSION_15) != -1) {
 			return JavaCore.VERSION_15;
 		} else if (desc.indexOf(JavaCore.VERSION_14) != -1) {
 			return JavaCore.VERSION_14;
diff --git a/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/launcher/ITestFinder.java b/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/launcher/ITestFinder.java
index b79d2e8..c3d237e 100644
--- a/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/launcher/ITestFinder.java
+++ b/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/launcher/ITestFinder.java
@@ -29,6 +29,7 @@
  * org.eclipse.jdt.junit.internal_testKinds.
  */
 public interface ITestFinder {
+
 	ITestFinder NULL= new ITestFinder() {
 		@Override
 		public void findTestsInContainer(IJavaElement element, Set<IType> result, IProgressMonitor pm) {
diff --git a/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/launcher/JUnit4TestFinder.java b/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/launcher/JUnit4TestFinder.java
index fdea73f..c58dd8c 100644
--- a/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/launcher/JUnit4TestFinder.java
+++ b/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/launcher/JUnit4TestFinder.java
@@ -205,7 +205,7 @@
 			if (CoreTestSearchEngine.hasSuiteMethod(type)) { // since JUnit 4.3.1
 				return true;
 			}
-			ASTParser parser= ASTParser.newParser(AST.JLS15);
+			ASTParser parser= ASTParser.newParser(AST.JLS_Latest);
 			/* TODO: When bug 156352 is fixed:
 			parser.setProject(type.getJavaProject());
 			IBinding[] bindings= parser.createBindings(new IJavaElement[] { type }, monitor);
diff --git a/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/launcher/JUnit5TestFinder.java b/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/launcher/JUnit5TestFinder.java
index c1236e3..655e6e0 100644
--- a/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/launcher/JUnit5TestFinder.java
+++ b/org.eclipse.jdt.junit.core/src/org/eclipse/jdt/internal/junit/launcher/JUnit5TestFinder.java
@@ -256,7 +256,7 @@
 			if (CoreTestSearchEngine.hasSuiteMethod(type)) { // since JUnit 4.3.1
 				return true;
 			}
-			ASTParser parser= ASTParser.newParser(AST.JLS15);
+			ASTParser parser= ASTParser.newParser(AST.JLS_Latest);
 			if (type.getCompilationUnit() != null) {
 				parser.setSource(type.getCompilationUnit());
 			} else if (!isAvailable(type.getSourceRange())) { // class file with no source
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/AllRefactoringTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/AllRefactoringTests.java
index 5147eed..4ef4237 100644
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/AllRefactoringTests.java
+++ b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/AllRefactoringTests.java
@@ -28,7 +28,7 @@
 	ExtractMethodTests1d8.class,
 	InlineMethodTests.class,
 	InlineMethodTests1d8.class,
-	InlineMethodTests14.class,
+	InlineMethodTests16.class,
 	ReplaceInvocationsTests.class,
 	SefTests.class,
 	InlineTempTests.class,
@@ -47,12 +47,12 @@
 	IntroduceParameterTests.class,
 	IntroduceParameterTests1d7.class,
 	IntroduceFactoryTests.class,
-	IntroduceFactoryTests15.class,
+	IntroduceFactoryTests16.class,
 
 	//-- structure
 	ChangeSignatureTests.class,
 	ChangeSignatureTests1d8.class,
-	ChangeSignatureTests15.class,
+	ChangeSignatureTests16.class,
 	IntroduceParameterObjectTests.class,
 	PullUpTests.class,
 	PullUpTests1d8.class,
@@ -63,7 +63,7 @@
 	ExtractInterfaceTests1d8.class,
 	ExtractSupertypeTests.class,
 	MoveInnerToTopLevelTests.class,
-	MoveInnerToNewTests14.class,
+	MoveInnerToNewTests16.class,
 	UseSupertypeWherePossibleTests.class,
 	ExtractClassTests.class,
 
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ChangeSignatureTests15.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ChangeSignatureTests16.java
similarity index 92%
rename from org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ChangeSignatureTests15.java
rename to org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ChangeSignatureTests16.java
index df57fe6..30f2c2d 100644
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ChangeSignatureTests15.java
+++ b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ChangeSignatureTests16.java
@@ -26,16 +26,16 @@
 
 import org.eclipse.jdt.ui.tests.CustomBaseRunner;
 import org.eclipse.jdt.ui.tests.IgnoreInheritedTests;
-import org.eclipse.jdt.ui.tests.core.rules.Java15ProjectTestSetup;
+import org.eclipse.jdt.ui.tests.core.rules.Java16ProjectTestSetup;
 
 /**
  * Those tests are made to run on Java Spider 1.8 .
  */
 @IgnoreInheritedTests
 @RunWith(CustomBaseRunner.class)
-public class ChangeSignatureTests15 extends ChangeSignatureTests {
+public class ChangeSignatureTests16 extends ChangeSignatureTests {
 	@Rule
-	public Java15ProjectTestSetup jps= new Java15ProjectTestSetup(true);
+	public Java16ProjectTestSetup jps= new Java16ProjectTestSetup(false);
 
 	private IJavaProject fJProject1;
 
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/InlineMethodTestSetup14.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/InlineMethodTestSetup16.java
similarity index 90%
rename from org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/InlineMethodTestSetup14.java
rename to org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/InlineMethodTestSetup16.java
index 16ceb69..780bb85 100644
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/InlineMethodTestSetup14.java
+++ b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/InlineMethodTestSetup16.java
@@ -16,9 +16,9 @@
 import org.eclipse.jdt.core.IPackageFragment;
 import org.eclipse.jdt.core.IPackageFragmentRoot;
 
-import org.eclipse.jdt.ui.tests.refactoring.rules.JavaPreviewSetup;
+import org.eclipse.jdt.ui.tests.refactoring.rules.Java16Setup;
 
-public class InlineMethodTestSetup14 extends JavaPreviewSetup {
+public class InlineMethodTestSetup16 extends Java16Setup {
 
 	private IPackageFragment fSimple14;
 
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/InlineMethodTests14.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/InlineMethodTests16.java
similarity index 75%
rename from org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/InlineMethodTests14.java
rename to org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/InlineMethodTests16.java
index 0f5286e..d1a2ada 100644
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/InlineMethodTests14.java
+++ b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/InlineMethodTests16.java
@@ -26,24 +26,24 @@
 
 @IgnoreInheritedTests
 @RunWith(CustomBaseRunner.class)
-public class InlineMethodTests14 extends InlineMethodTests {
+public class InlineMethodTests16 extends InlineMethodTests {
 
 	@Rule
-	public InlineMethodTestSetup14 fgTestSetup14= new InlineMethodTestSetup14();
+	public InlineMethodTestSetup16 fgSetup= new InlineMethodTestSetup16();
 
 	protected void performSimpleTest() throws Exception {
-		performTestInlineCall(fgTestSetup14.getSimplePackage(), getName(), COMPARE_WITH_OUTPUT, fgTestSetup14.getSimplePkgOutName());
+		performTestInlineCall(fgSetup.getSimplePackage(), getName(), COMPARE_WITH_OUTPUT, fgSetup.getSimplePkgOutName());
 	}
 
 	protected void performDefaultTest() throws Exception {
-		performTestInlineCall(fgTestSetup14.getDefaultPackage(), getName(), COMPARE_WITH_OUTPUT, fgTestSetup14.getSimplePkgOutName());
+		performTestInlineCall(fgSetup.getDefaultPackage(), getName(), COMPARE_WITH_OUTPUT, fgSetup.getSimplePkgOutName());
 	}
 
 	@Override
 	protected String getFilePath(IPackageFragment pack, String name) {
 		IPackageFragment packToUse = pack;
-		if (pack == fgTestSetup14.getDefaultPackage()) {
-			packToUse= fgTestSetup14.getSimplePackage();
+		if (pack == fgSetup.getDefaultPackage()) {
+			packToUse= fgSetup.getSimplePackage();
 		}
 		return super.getFilePath(packToUse, name);
 	}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/IntroduceFactoryTests15.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/IntroduceFactoryTests16.java
similarity index 83%
rename from org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/IntroduceFactoryTests15.java
rename to org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/IntroduceFactoryTests16.java
index 95c4c2d..caf3589 100644
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/IntroduceFactoryTests15.java
+++ b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/IntroduceFactoryTests16.java
@@ -15,13 +15,13 @@
 
 import org.junit.Test;
 
-import org.eclipse.jdt.ui.tests.refactoring.rules.JavaPreviewSetup;
+import org.eclipse.jdt.ui.tests.refactoring.rules.Java16Setup;
 
-public class IntroduceFactoryTests15 extends IntroduceFactoryTestsBase {
+public class IntroduceFactoryTests16 extends IntroduceFactoryTestsBase {
 	private static final String REFACTORING_PATH= "IntroduceFactory/";
 
-	public IntroduceFactoryTests15() {
-		rts= new JavaPreviewSetup();
+	public IntroduceFactoryTests16() {
+		rts= new Java16Setup();
 	}
 
 	@Override
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/MoveInnerToNewTests14.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/MoveInnerToNewTests16.java
similarity index 94%
rename from org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/MoveInnerToNewTests14.java
rename to org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/MoveInnerToNewTests16.java
index 7fab934..668e580 100644
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/MoveInnerToNewTests14.java
+++ b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/MoveInnerToNewTests16.java
@@ -31,15 +31,15 @@
 import org.eclipse.jdt.internal.corext.refactoring.RefactoringAvailabilityTester;
 import org.eclipse.jdt.internal.corext.refactoring.structure.MoveInnerToTopRefactoring;
 
-import org.eclipse.jdt.ui.tests.refactoring.rules.JavaPreviewSetup;
+import org.eclipse.jdt.ui.tests.refactoring.rules.Java16Setup;
 
 import org.eclipse.jdt.internal.ui.preferences.JavaPreferencesSettings;
 
-public class MoveInnerToNewTests14 extends GenericRefactoringTest {
+public class MoveInnerToNewTests16 extends GenericRefactoringTest {
 	private static final String REFACTORING_PATH= "MoveInnerToNew14/";
 
-	public MoveInnerToNewTests14() {
-		rts= new JavaPreviewSetup();
+	public MoveInnerToNewTests16() {
+		rts= new Java16Setup();
 	}
 
 	@Override
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameRecordElementsTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameRecordElementsTests.java
index 3fe4999..250f402 100644
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameRecordElementsTests.java
+++ b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/RenameRecordElementsTests.java
@@ -46,7 +46,7 @@
 import org.eclipse.jdt.internal.core.refactoring.descriptors.RefactoringSignatureDescriptorFactory;
 import org.eclipse.jdt.internal.corext.refactoring.rename.RenameFieldProcessor;
 
-import org.eclipse.jdt.ui.tests.refactoring.rules.JavaPreviewSetup;
+import org.eclipse.jdt.ui.tests.refactoring.rules.Java16Setup;
 
 public class RenameRecordElementsTests extends GenericRefactoringTest {
 	private static final String REFACTORING_PATH= "RenameRecordElements/";
@@ -54,7 +54,7 @@
 	private String fPrefixPref;
 
 	public RenameRecordElementsTests() {
-		rts= new JavaPreviewSetup();
+		rts= new Java16Setup();
 	}
 
 	@Override
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/rules/Java16Setup.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/rules/Java16Setup.java
new file mode 100644
index 0000000..2107a12
--- /dev/null
+++ b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/rules/Java16Setup.java
@@ -0,0 +1,31 @@
+/*******************************************************************************
+ * Copyright (c) 2020 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jdt.ui.tests.refactoring.rules;
+
+import org.eclipse.jdt.testplugin.JavaProjectHelper;
+
+import org.eclipse.core.runtime.CoreException;
+
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+
+public class Java16Setup extends RefactoringTestSetup {
+	/*
+	 * @see org.eclipse.jdt.ui.tests.refactoring.RefactoringTestSetup#addRTJar(org.eclipse.jdt.core.IJavaProject)
+	 */
+	@Override
+	protected IPackageFragmentRoot addRTJar(IJavaProject project) throws CoreException {
+		return JavaProjectHelper.addRTJar_16(project, false);
+	}
+}
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/rules/JavaPreviewSetup.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/rules/JavaPreviewSetup.java
index fe98e1c..b938dfe 100644
--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/rules/JavaPreviewSetup.java
+++ b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/rules/JavaPreviewSetup.java
@@ -13,6 +13,19 @@
  *******************************************************************************/
 package org.eclipse.jdt.ui.tests.refactoring.rules;
 
-public class JavaPreviewSetup extends Java15Setup {
+import org.eclipse.jdt.testplugin.JavaProjectHelper;
 
+import org.eclipse.core.runtime.CoreException;
+
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+
+public class JavaPreviewSetup extends Java16Setup {
+	/*
+	 * @see org.eclipse.jdt.ui.tests.refactoring.RefactoringTestSetup#addRTJar(org.eclipse.jdt.core.IJavaProject)
+	 */
+	@Override
+	protected IPackageFragmentRoot addRTJar(IJavaProject project) throws CoreException {
+		return JavaProjectHelper.addRTJar_16(project, true);
+	}
 }
diff --git a/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/JavaProjectHelper.java b/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/JavaProjectHelper.java
index 41b14a5..a5966fd 100644
--- a/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/JavaProjectHelper.java
+++ b/org.eclipse.jdt.ui.tests/test plugin/org/eclipse/jdt/testplugin/JavaProjectHelper.java
@@ -104,6 +104,7 @@
 	public static final IPath RT_STUBS13= new Path("testresources/rtstubs13.jar");
 	public static final IPath RT_STUBS14= new Path("testresources/rtstubs14.jar");
 	public static final IPath RT_STUBS15= new Path("testresources/rtstubs_15.jar");
+	public static final IPath RT_STUBS16= new Path("testresources/rtstubs_16.jar");
 	public static final IPath JUNIT_SRC_381= new Path("testresources/junit381-noUI-src.zip");
 	public static final String JUNIT_SRC_ENCODING= "ISO-8859-1";
 
@@ -313,6 +314,23 @@
 	}
 
 	/**
+	 * Sets the compiler options to 15 for the given project.
+	 *
+	 * @param project the java project
+	 * @param enable_preview_feature sets enable-preview compliance project option based on the
+	 *            value specified.
+	 */
+	public static void set16CompilerOptions(IJavaProject project, boolean enable_preview_feature) {
+		Map<String, String> options= project.getOptions(false);
+		set16_CompilerOptions(options);
+		if (enable_preview_feature) {
+			options.put(JavaCore.COMPILER_PB_ENABLE_PREVIEW_FEATURES, JavaCore.ENABLED);
+			options.put(JavaCore.COMPILER_PB_REPORT_PREVIEW_FEATURES, JavaCore.IGNORE);
+		}
+		project.setOptions(options);
+	}
+
+	/**
 	 * Sets the compiler options to 1.8 for the given project.
 	 *
 	 * @param project the java project
@@ -420,7 +438,7 @@
 	}
 
 	/**
-	 * Sets the compiler options to 14.
+	 * Sets the compiler options to 15.
 	 *
 	 * @param options the compiler options to configure
 	 */
@@ -429,6 +447,15 @@
 	}
 
 	/**
+	 * Sets the compiler options to 16.
+	 *
+	 * @param options the compiler options to configure
+	 */
+	public static void set16_CompilerOptions(Map<String, String> options) {
+		JavaCore.setComplianceOptions(JavaCore.VERSION_16, options);
+	}
+
+	/**
 	 * Sets the compiler options to 1.8
 	 *
 	 * @param options the compiler options to configure
@@ -946,6 +973,12 @@
 		return addLibrary(jproject, rtJarPath[0], rtJarPath[1], rtJarPath[2]);
 	}
 
+	public static IPackageFragmentRoot addRTJar_16(IJavaProject jproject, boolean enable_preview_feature) throws CoreException {
+		IPath[] rtJarPath= findRtJar(RT_STUBS16);
+		set16CompilerOptions(jproject, enable_preview_feature);
+		return addLibrary(jproject, rtJarPath[0], rtJarPath[1], rtJarPath[2]);
+	}
+
 	/**
 	 * Adds a variable entry with source attachment to a IJavaProject.
 	 * Can return null if variable can not be resolved.
diff --git a/org.eclipse.jdt.ui.tests/testresources/rtstubs_16.jar b/org.eclipse.jdt.ui.tests/testresources/rtstubs_16.jar
new file mode 100644
index 0000000..fb6cb93
--- /dev/null
+++ b/org.eclipse.jdt.ui.tests/testresources/rtstubs_16.jar
Binary files differ
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/AbstractBindingLabelsTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/AbstractBindingLabelsTest.java
index 8142119..2bfd398 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/AbstractBindingLabelsTest.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/AbstractBindingLabelsTest.java
@@ -24,10 +24,10 @@
 
 import org.eclipse.jdt.core.IJavaElement;
 import org.eclipse.jdt.core.IJavaProject;
-import org.eclipse.jdt.core.dom.AST;
 import org.eclipse.jdt.core.dom.ASTParser;
 import org.eclipse.jdt.core.dom.IBinding;
 
+import org.eclipse.jdt.internal.ui.util.ASTHelper;
 import org.eclipse.jdt.internal.ui.viewsupport.JavaElementLinks;
 
 public abstract class AbstractBindingLabelsTest extends CoreTests {
@@ -35,7 +35,7 @@
 	protected boolean fHaveSource= true;
 
 	protected String getBindingLabel(IJavaElement elem, long flags) {
-		ASTParser parser= ASTParser.newParser(AST.JLS15);
+		ASTParser parser= ASTParser.newParser(ASTHelper.JLS_Latest);
 		parser.setResolveBindings(true);
 		parser.setProject(fJProject1);
 		IBinding binding= parser.createBindings(new IJavaElement[]{elem}, null)[0];
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/BindingLabels18Test.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/BindingLabels18Test.java
index 57d4a03..eb8e58e 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/BindingLabels18Test.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/BindingLabels18Test.java
@@ -33,7 +33,6 @@
 import org.eclipse.jdt.core.IType;
 import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jdt.core.Signature;
-import org.eclipse.jdt.core.dom.AST;
 import org.eclipse.jdt.core.dom.ASTParser;
 import org.eclipse.jdt.core.dom.ASTRequestor;
 import org.eclipse.jdt.core.dom.Assignment;
@@ -50,6 +49,7 @@
 import org.eclipse.jdt.ui.PreferenceConstants;
 import org.eclipse.jdt.ui.tests.core.rules.Java1d8ProjectTestSetup;
 
+import org.eclipse.jdt.internal.ui.util.ASTHelper;
 import org.eclipse.jdt.internal.ui.viewsupport.JavaElementLinks;
 
 public class BindingLabels18Test extends AbstractBindingLabelsTest {
@@ -464,7 +464,7 @@
 					this.ast= unit;
 				}
 			}
-			ASTParser parser= ASTParser.newParser(AST.JLS15);
+			ASTParser parser= ASTParser.newParser(ASTHelper.JLS_Latest);
 			parser.setResolveBindings(true);
 			parser.setBindingsRecovery(true);
 			parser.setProject(javaProject);
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/BindingLabelsTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/BindingLabelsTest.java
index 8919980..beb54e0 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/BindingLabelsTest.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/BindingLabelsTest.java
@@ -32,7 +32,6 @@
 import org.eclipse.jdt.core.IType;
 import org.eclipse.jdt.core.ITypeParameter;
 import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.dom.AST;
 import org.eclipse.jdt.core.dom.ASTParser;
 import org.eclipse.jdt.core.dom.IBinding;
 import org.eclipse.jdt.core.dom.ITypeBinding;
@@ -41,6 +40,7 @@
 import org.eclipse.jdt.ui.PreferenceConstants;
 import org.eclipse.jdt.ui.tests.core.rules.ProjectTestSetup;
 
+import org.eclipse.jdt.internal.ui.util.ASTHelper;
 import org.eclipse.jdt.internal.ui.viewsupport.JavaElementLinks;
 
 /**
@@ -485,7 +485,7 @@
 		IJavaElement t1= cu.getElementAt(content.indexOf("T1"));
 		IJavaElement t2= cu.getElementAt(content.indexOf("T2"));
 
-		ASTParser parser= ASTParser.newParser(AST.JLS8);
+		ASTParser parser= ASTParser.newParser(ASTHelper.JLS8);
 		parser.setResolveBindings(true);
 		parser.setProject(fJProject1);
 		IBinding[] bindings= parser.createBindings(new IJavaElement[]{main, t1, t2}, null);
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/JDTFlagsTest18.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/JDTFlagsTest18.java
index 10eced4..f76d01e 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/JDTFlagsTest18.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/JDTFlagsTest18.java
@@ -44,7 +44,6 @@
 import org.eclipse.jdt.core.IPackageFragmentRoot;
 import org.eclipse.jdt.core.IType;
 import org.eclipse.jdt.core.JavaCore;
-import org.eclipse.jdt.core.dom.AST;
 import org.eclipse.jdt.core.dom.ASTParser;
 import org.eclipse.jdt.core.dom.AnnotationTypeMemberDeclaration;
 import org.eclipse.jdt.core.dom.CompilationUnit;
@@ -60,6 +59,8 @@
 
 import org.eclipse.jdt.ui.tests.core.rules.Java1d8ProjectTestSetup;
 
+import org.eclipse.jdt.internal.ui.util.ASTHelper;
+
 /**
  * Those tests are made to run on Java Spider 1.8 .
  */
@@ -83,7 +84,7 @@
 	}
 
 	protected CompilationUnit getCompilationUnitNode(String source) {
-		ASTParser parser = ASTParser.newParser(AST.JLS8);
+		ASTParser parser = ASTParser.newParser(ASTHelper.JLS8);
 		parser.setSource(source.toCharArray());
 		Hashtable<String, String> options= JavaCore.getOptions();
 		JavaCore.setComplianceOptions(JavaCore.VERSION_1_8, options);
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/rules/Java16ProjectTestSetup.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/rules/Java16ProjectTestSetup.java
new file mode 100644
index 0000000..af93fd3
--- /dev/null
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/rules/Java16ProjectTestSetup.java
@@ -0,0 +1,71 @@
+/*******************************************************************************
+ * Copyright (c) 2020 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * derived from corresponding file in org.eclipse.jdt.ui.tests.core
+ * instead extending TestSetup for junit4 ExternalResource is extended
+ * to allow use as junit "@Rule"
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jdt.ui.tests.core.rules;
+
+import org.eclipse.jdt.testplugin.JavaProjectHelper;
+
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.resources.ResourcesPlugin;
+
+import org.eclipse.jdt.core.IClasspathAttribute;
+import org.eclipse.jdt.core.IClasspathEntry;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.JavaCore;
+
+import org.eclipse.jdt.internal.core.ClasspathEntry;
+
+public class Java16ProjectTestSetup extends ProjectTestSetup {
+
+	public static final String PROJECT_NAME16= "TestSetupProject16";
+
+	private boolean enable_preview_feature;
+
+	@Override
+	public IJavaProject getProject() {
+		IProject project= ResourcesPlugin.getWorkspace().getRoot().getProject(PROJECT_NAME16);
+		return JavaCore.create(project);
+	}
+
+	@Override
+	public IClasspathEntry[] getDefaultClasspath() throws CoreException {
+		IPath[] rtJarPath= JavaProjectHelper.findRtJar(JavaProjectHelper.RT_STUBS16);
+		IClasspathAttribute[] extraAttributes= { JavaCore.newClasspathAttribute(IClasspathAttribute.MODULE, Boolean.TRUE.toString()) };
+		return new IClasspathEntry[] { JavaCore.newLibraryEntry(rtJarPath[0], rtJarPath[1], rtJarPath[2], ClasspathEntry.NO_ACCESS_RULES, extraAttributes, true) };
+	}
+
+	public Java16ProjectTestSetup( boolean enable_preview_feature) {
+		this.enable_preview_feature= enable_preview_feature;
+	}
+
+	@Override
+	protected boolean projectExists() {
+		return getProject().exists();
+	}
+
+	@Override
+	protected IJavaProject createAndInitializeProject() throws CoreException {
+		IJavaProject javaProject= JavaProjectHelper.createJavaProject(PROJECT_NAME16, "bin");
+		javaProject.setRawClasspath(getDefaultClasspath(), null);
+		JavaProjectHelper.set16CompilerOptions(javaProject, enable_preview_feature);
+		return javaProject;
+	}
+
+}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/source/AddUnimplementedMethodsTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/source/AddUnimplementedMethodsTest.java
index d340750..680135f 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/source/AddUnimplementedMethodsTest.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/source/AddUnimplementedMethodsTest.java
@@ -47,7 +47,6 @@
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.core.JavaModelException;
 import org.eclipse.jdt.core.compiler.IProblem;
-import org.eclipse.jdt.core.dom.AST;
 import org.eclipse.jdt.core.dom.AbstractTypeDeclaration;
 import org.eclipse.jdt.core.dom.CompilationUnit;
 import org.eclipse.jdt.core.dom.IMethodBinding;
@@ -69,6 +68,8 @@
 import org.eclipse.jdt.ui.PreferenceConstants;
 import org.eclipse.jdt.ui.tests.core.rules.ProjectTestSetup;
 
+import org.eclipse.jdt.internal.ui.util.ASTHelper;
+
 public class AddUnimplementedMethodsTest {
 	@Rule
 	public ProjectTestSetup pts= new ProjectTestSetup();
@@ -385,7 +386,7 @@
 	@Deprecated
 	@Test
 	public void jLS3() throws Exception {
-		doTestOldAstLevel(AST.JLS3);
+		doTestOldAstLevel(ASTHelper.JLS3);
 	}
 
 	/**
@@ -395,12 +396,12 @@
 	@Deprecated
 	@Test
 	public void jLS4() throws Exception {
-		doTestOldAstLevel(AST.JLS4);
+		doTestOldAstLevel(ASTHelper.JLS4);
 	}
 
 	@Test
 	public void jLS8() throws Exception {
-		doTestOldAstLevel(AST.JLS8);
+		doTestOldAstLevel(ASTHelper.JLS8);
 	}
 
 	/**
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/source/GenerateGettersSettersTest14.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/source/GenerateGettersSettersTest16.java
similarity index 97%
rename from org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/source/GenerateGettersSettersTest14.java
rename to org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/source/GenerateGettersSettersTest16.java
index 76ee6aa..2865381 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/source/GenerateGettersSettersTest14.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/source/GenerateGettersSettersTest16.java
@@ -39,7 +39,7 @@
  * @see org.eclipse.jdt.internal.corext.codemanipulation.AddGetterSetterOperation
  *
  */
-public class GenerateGettersSettersTest14 extends SourceTestCase14 {
+public class GenerateGettersSettersTest16 extends SourceTestCase16 {
 	@Rule
 	public ProjectTestSetup pts= new ProjectTestSetup();
 
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/source/SourceActionTests.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/source/SourceActionTests.java
index 8989403..72385a1 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/source/SourceActionTests.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/source/SourceActionTests.java
@@ -28,7 +28,7 @@
 @Suite.SuiteClasses({
 AddUnimplementedMethodsTest.class,
 GenerateGettersSettersTest.class,
-GenerateGettersSettersTest14.class,
+GenerateGettersSettersTest16.class,
 GenerateDelegateMethodsTest.class,
 AddUnimplementedConstructorsTest.class,
 GenerateConstructorUsingFieldsTest.class,
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/source/SourceTestCase14.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/source/SourceTestCase16.java
similarity index 97%
rename from org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/source/SourceTestCase14.java
rename to org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/source/SourceTestCase16.java
index ae8f8cc..c82dfac 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/source/SourceTestCase14.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/source/SourceTestCase16.java
@@ -50,7 +50,7 @@
  * @see org.eclipse.jdt.internal.corext.codemanipulation.AddGetterSetterOperation
  *
  */
-public class SourceTestCase14 {
+public class SourceTestCase16 {
 	@Rule
 	public TestName tn=new TestName();
 
@@ -106,7 +106,7 @@
 	public void setUp() throws CoreException {
 
 		fJavaProject= JavaProjectHelper.createJavaProject("DummyProject", "bin");
-		assertNotNull(JavaProjectHelper.addRTJar_15(fJavaProject, true));
+		assertNotNull(JavaProjectHelper.addRTJar_16(fJavaProject, false));
 
 		fRoot= JavaProjectHelper.addSourceContainer(fJavaProject, "src");
 		fPackageP= fRoot.createPackageFragment("p", true, null);
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest.java
index 45a77b9..08ba57b 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest.java
@@ -48,7 +48,6 @@
 import org.eclipse.jdt.core.IPackageFragmentRoot;
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.core.compiler.IProblem;
-import org.eclipse.jdt.core.dom.AST;
 import org.eclipse.jdt.core.dom.ASTParser;
 import org.eclipse.jdt.core.dom.ASTRequestor;
 import org.eclipse.jdt.core.dom.CompilationUnit;
@@ -73,6 +72,7 @@
 import org.eclipse.jdt.internal.ui.fix.RedundantModifiersCleanUp;
 import org.eclipse.jdt.internal.ui.fix.UnimplementedCodeCleanUp;
 import org.eclipse.jdt.internal.ui.text.correction.ProblemLocation;
+import org.eclipse.jdt.internal.ui.util.ASTHelper;
 
 public class CleanUpTest extends CleanUpTestCase {
 	@Rule
@@ -19657,7 +19657,7 @@
 		assertRefactoringHasNoChange(new ICompilationUnit[] { cu1 });
 
 		// When
-		ASTParser parser= ASTParser.newParser(AST.JLS15);
+		ASTParser parser= ASTParser.newParser(ASTHelper.JLS_Latest);
 		parser.setKind(ASTParser.K_COMPILATION_UNIT);
 		parser.setSource(cu1);
 		parser.setResolveBindings(true);
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest15.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest16.java
similarity index 97%
rename from org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest15.java
rename to org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest16.java
index 6a116b3..1579ac6 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest15.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTest16.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2020 Red Hat Inc. and others.
+ * Copyright (c) 2020, 2021 Red Hat Inc. and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -30,17 +30,17 @@
 
 import org.eclipse.jdt.internal.corext.fix.CleanUpConstants;
 
-import org.eclipse.jdt.ui.tests.core.rules.Java15ProjectTestSetup;
+import org.eclipse.jdt.ui.tests.core.rules.Java16ProjectTestSetup;
 import org.eclipse.jdt.ui.tests.core.rules.ProjectTestSetup;
 
 import org.eclipse.jdt.internal.ui.fix.MultiFixMessages;
 
 /**
- * Tests the cleanup features related to Java 15.
+ * Tests the cleanup features related to Java 16.
  */
-public class CleanUpTest15 extends CleanUpTestCase {
+public class CleanUpTest16 extends CleanUpTestCase {
 	@Rule
-	public ProjectTestSetup projectSetup= new Java15ProjectTestSetup(true);
+	public ProjectTestSetup projectSetup= new Java16ProjectTestSetup(false);
 
 	@Override
 	protected IJavaProject getProject() {
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTestCaseSuite.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTestCaseSuite.java
index dd3c5d6..dc268a1 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTestCaseSuite.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/CleanUpTestCaseSuite.java
@@ -31,7 +31,7 @@
 	CleanUpTest11.class,
 	CleanUpTest12.class,
 	CleanUpTest14.class,
-	CleanUpTest15.class,
+	CleanUpTest16.class,
 	CleanUpAnnotationTest.class,
 	SaveParticipantTest.class,
 	CleanUpActionTest.class,
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/JavadocQuickFixTestPreview.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/JavadocQuickFixTestPreview.java
index b04ae89..3ca5c77 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/JavadocQuickFixTestPreview.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/JavadocQuickFixTestPreview.java
@@ -36,7 +36,7 @@
 import org.eclipse.jdt.internal.core.manipulation.CodeTemplateContextType;
 import org.eclipse.jdt.internal.core.manipulation.StubUtility;
 
-import org.eclipse.jdt.ui.tests.core.rules.Java15ProjectTestSetup;
+import org.eclipse.jdt.ui.tests.core.rules.Java16ProjectTestSetup;
 import org.eclipse.jdt.ui.tests.core.rules.ProjectTestSetup;
 import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;
 import org.eclipse.jdt.ui.text.java.correction.CUCorrectionProposal;
@@ -44,7 +44,7 @@
 public class JavadocQuickFixTestPreview extends QuickFixTest {
 
 	@Rule
-    public ProjectTestSetup projectsetup = new Java15ProjectTestSetup(true);
+    public ProjectTestSetup projectsetup = new Java16ProjectTestSetup(true);
 
 	private IJavaProject fJProject1;
 
@@ -72,7 +72,7 @@
 		StubUtility.setCodeTemplate(CodeTemplateContextType.TYPECOMMENT_ID, res, null);
 
 		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
-		JavaProjectHelper.set15CompilerOptions(fJProject1, true);
+		JavaProjectHelper.set16CompilerOptions(fJProject1, true);
 		JavaProjectHelper.addRequiredModularProject(fJProject1, projectsetup.getProject());
 
 		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTest.java
index a8ef0ca..023015f 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTest.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTest.java
@@ -88,6 +88,11 @@
 /**
  */
 public class QuickFixTest {
+
+	protected static String MODULE_INFO_FILE_CONTENT = ""
+			+ "module test {\n"
+			+ "}\n";
+
 	public static void assertCorrectLabels(List<? extends ICompletionProposal> proposals) {
 		for (ICompletionProposal proposal : proposals) {
 			String name= proposal.getDisplayString();
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTest16.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTest16.java
new file mode 100644
index 0000000..1dae9d0
--- /dev/null
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTest16.java
@@ -0,0 +1,309 @@
+/*******************************************************************************
+ * Copyright (c) 2020 IBM Corporation and others.
+ *
+ * This program and the accompanying materials
+ * are made available under the terms of the Eclipse Public License 2.0
+ * which accompanies this distribution, and is available at
+ * https://www.eclipse.org/legal/epl-2.0/
+ *
+ * SPDX-License-Identifier: EPL-2.0
+ *
+ * Contributors:
+ *     IBM Corporation - initial API and implementation
+ *******************************************************************************/
+package org.eclipse.jdt.ui.tests.quickfix;
+
+import java.util.ArrayList;
+
+import org.junit.After;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+import org.eclipse.jdt.testplugin.JavaProjectHelper;
+
+import org.eclipse.jdt.core.ICompilationUnit;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.dom.CompilationUnit;
+
+import org.eclipse.jdt.internal.corext.util.Messages;
+
+import org.eclipse.jdt.ui.tests.core.rules.Java16ProjectTestSetup;
+import org.eclipse.jdt.ui.tests.core.rules.ProjectTestSetup;
+import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;
+import org.eclipse.jdt.ui.text.java.correction.CUCorrectionProposal;
+
+import org.eclipse.jdt.internal.ui.text.correction.CorrectionMessages;
+
+@RunWith(JUnit4.class)
+public class QuickFixTest16 extends QuickFixTest {
+
+	@Rule
+	public ProjectTestSetup projectsetup= new Java16ProjectTestSetup(false);
+
+	private IJavaProject fJProject;
+
+	private IPackageFragmentRoot fSourceFolder;
+
+	@After
+	public void tearDown() throws Exception {
+		if (fJProject != null) {
+			JavaProjectHelper.delete(fJProject);
+		}
+	}
+
+	@Test
+	public void testRecordGetNeedHigherComplianceProposal() throws Exception {
+		fJProject= JavaProjectHelper.createJavaProject("TestProject1", "bin");
+		fJProject.setRawClasspath(projectsetup.getDefaultClasspath(), null);
+		JavaProjectHelper.set15CompilerOptions(fJProject, false);
+
+		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject, "src");
+
+
+		IPackageFragment def= fSourceFolder.createPackageFragment("", false, null);
+		def.createCompilationUnit("module-info.java", MODULE_INFO_FILE_CONTENT, false, null);
+
+		IPackageFragment pack= fSourceFolder.createPackageFragment("test", false, null);
+		String test= ""
+					+ "package test;\n"
+					+ "public record Rec1() {\n"
+					+ "}\n";
+		ICompilationUnit cu= pack.createCompilationUnit("Rec1.java", test, false, null);
+
+		CompilationUnit astRoot= getASTRoot(cu);
+		ArrayList<IJavaCompletionProposal> proposals= collectCorrections(cu, astRoot, 1, null);
+
+		assertNumberOfProposals(proposals, 1);
+		String label= Messages.format(CorrectionMessages.ReorgCorrectionsSubProcessor_change_project_compliance_description, "16");
+		assertProposalExists(proposals, label);
+	}
+
+	@Test
+	public void testRecordConstructorIncorrectParamsProposal1() throws Exception {
+		fJProject= JavaProjectHelper.createJavaProject("TestProject1", "bin");
+		fJProject.setRawClasspath(projectsetup.getDefaultClasspath(), null);
+		JavaProjectHelper.set16CompilerOptions(fJProject, false);
+
+		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject, "src");
+		IPackageFragment pack1= fSourceFolder.createPackageFragment("test", false, null);
+
+		String test= "" +
+					"package test;\n" +
+					"\n" +
+					"public record Rec1(int a){\n" +
+					"\n" +
+					"	public static void main(String[] args) {\n" +
+					"		Rec1 abc = new Rec1();\n" +
+					"	}\n" +
+					"}\n";
+		ICompilationUnit cu= pack1.createCompilationUnit("Rec1.java", test, false, null);
+
+		CompilationUnit astRoot= getASTRoot(cu);
+		ArrayList<IJavaCompletionProposal> proposals= collectCorrections(cu, astRoot, 1);
+		assertNumberOfProposals(proposals, 2);
+		assertCorrectLabels(proposals);
+
+		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
+		String preview1= getPreviewContent(proposal);
+
+		String expected1= "" +
+						"package test;\n" +
+						"\n" +
+						"public record Rec1(int a){\n" +
+						"\n" +
+						"	public static void main(String[] args) {\n" +
+						"		Rec1 abc = new Rec1(a);\n" +
+						"	}\n" +
+						"}\n";
+
+		proposal= (CUCorrectionProposal) proposals.get(1);
+		String preview2= getPreviewContent(proposal);
+
+		String expected2= "" +
+						"package test;\n" +
+						"\n" +
+						"public record Rec1(int a){\n" +
+						"\n" +
+						"	/**\n" +
+						"	 * \n" +
+						"	 */\n" +
+						"	public Rec1() {\n" +
+						"		// TODO Auto-generated constructor stub\n" +
+						"	}\n" +
+						"\n" +
+						"	public static void main(String[] args) {\n" +
+						"		Rec1 abc = new Rec1();\n" +
+						"	}\n" +
+						"}\n";
+
+		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });
+	}
+
+	@Test
+	public void testRecordConstructorIncorrectParamsProposal2() throws Exception {
+		fJProject= JavaProjectHelper.createJavaProject("TestProject1", "bin");
+		fJProject.setRawClasspath(projectsetup.getDefaultClasspath(), null);
+		JavaProjectHelper.set16CompilerOptions(fJProject, false);
+
+		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject, "src");
+		IPackageFragment pack1= fSourceFolder.createPackageFragment("test", false, null);
+
+		String test= "" +
+					"package test;\n" +
+					"\n" +
+					"public record Rec1(int a){\n" +
+					"\n" +
+					"	public static void main(String[] args) {\n" +
+					"		Rec1 abc = new Rec1(10, 20);\n" +
+					"	}\n" +
+					"}\n";
+		ICompilationUnit cu= pack1.createCompilationUnit("Rec1.java", test, false, null);
+
+		CompilationUnit astRoot= getASTRoot(cu);
+		ArrayList<IJavaCompletionProposal> proposals= collectCorrections(cu, astRoot, 1);
+		assertNumberOfProposals(proposals, 2);
+		assertCorrectLabels(proposals);
+
+		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
+		String preview1= getPreviewContent(proposal);
+
+		String expected1= "" +
+						"package test;\n" +
+						"\n" +
+						"public record Rec1(int a){\n" +
+						"\n" +
+						"	public static void main(String[] args) {\n" +
+						"		Rec1 abc = new Rec1(10);\n" +
+						"	}\n" +
+						"}\n";
+
+		proposal= (CUCorrectionProposal) proposals.get(1);
+		String preview2= getPreviewContent(proposal);
+
+		String expected2= "" +
+						"package test;\n" +
+						"\n" +
+						"public record Rec1(int a){\n" +
+						"\n" +
+						"	/**\n" +
+						"	 * @param i\n" +
+						"	 * @param j\n" +
+						"	 */\n" +
+						"	public Rec1(int i, int j) {\n" +
+						"		// TODO Auto-generated constructor stub\n" +
+						"	}\n" +
+						"\n" +
+						"	public static void main(String[] args) {\n" +
+						"		Rec1 abc = new Rec1(10, 20);\n" +
+						"	}\n" +
+						"}\n";
+
+		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });
+	}
+
+	@Test
+	public void testRecordConstructorIncorrectParamsProposal3() throws Exception {
+		fJProject= JavaProjectHelper.createJavaProject("TestProject1", "bin");
+		fJProject.setRawClasspath(projectsetup.getDefaultClasspath(), null);
+		JavaProjectHelper.set16CompilerOptions(fJProject, false);
+
+		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject, "src");
+		IPackageFragment pack1= fSourceFolder.createPackageFragment("test", false, null);
+
+		String test= "" +
+					"package test;\n" +
+					"\n" +
+					"public record Rec1(int a){\n" +
+					"\n" +
+					"	public static void main(String[] args) {\n" +
+					"		Rec1 abc = new Rec1(\"str\");\n" +
+					"	}\n" +
+					"}\n";
+		ICompilationUnit cu= pack1.createCompilationUnit("Rec1.java", test, false, null);
+
+		CompilationUnit astRoot= getASTRoot(cu);
+		ArrayList<IJavaCompletionProposal> proposals= collectCorrections(cu, astRoot, 1);
+		assertNumberOfProposals(proposals, 1);
+		assertCorrectLabels(proposals);
+
+		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
+		String preview1= getPreviewContent(proposal);
+
+		String expected1= "" +
+						"package test;\n" +
+						"\n" +
+						"public record Rec1(int a){\n" +
+						"\n" +
+						"	/**\n" +
+						"	 * @param string\n" +
+						"	 */\n" +
+						"	public Rec1(String string) {\n" +
+						"		// TODO Auto-generated constructor stub\n" +
+						"	}\n" +
+						"\n" +
+						"	public static void main(String[] args) {\n" +
+						"		Rec1 abc = new Rec1(\"str\");\n" +
+						"	}\n" +
+						"}\n";
+
+		assertEqualStringsIgnoreOrder(new String[] { preview1 }, new String[] { expected1 });
+	}
+
+	@Test
+	public void testRecordCanonicalConstructordUninitializedFieldProposal() throws Exception {
+		fJProject= JavaProjectHelper.createJavaProject("TestProject1", "bin");
+		fJProject.setRawClasspath(projectsetup.getDefaultClasspath(), null);
+		JavaProjectHelper.set16CompilerOptions(fJProject, false);
+
+		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject, "src");
+		IPackageFragment pack1= fSourceFolder.createPackageFragment("test", false, null);
+
+		String test= "" +
+					"package test;\n" +
+					"\n" +
+					"public record Rec1(int a, int b){\n" +
+					"\n" +
+					"	public Rec1(int a, int b) {\n" +
+					"		\n" +
+					"	}\n\n" +
+					"	public Rec1(int a) {\n" +
+					"		this(a, a);\n" +
+					"	}\n\n" +
+					"	public Rec1(int a, int b, int c) {\n" +
+					"		this(a, b+c);\n" +
+					"	}\n\n" +
+					"}\n";
+		ICompilationUnit cu= pack1.createCompilationUnit("Rec1.java", test, false, null);
+
+		CompilationUnit astRoot= getASTRoot(cu);
+		ArrayList<IJavaCompletionProposal> proposals= collectCorrections(cu, astRoot, 2);
+		assertNumberOfProposals(proposals, 1);
+		assertCorrectLabels(proposals);
+
+		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
+		String preview1= getPreviewContent(proposal);
+
+		String expected1= "" +
+					"package test;\n" +
+					"\n" +
+					"public record Rec1(int a, int b){\n" +
+					"\n" +
+					"	public Rec1(int a, int b) {\n" +
+					"		this.a = 0;\n" +
+					"		\n" +
+					"	}\n\n" +
+					"	public Rec1(int a) {\n" +
+					"		this(a, a);\n" +
+					"	}\n\n" +
+					"	public Rec1(int a, int b, int c) {\n" +
+					"		this(a, b+c);\n" +
+					"	}\n\n" +
+					"}\n";
+
+		assertEqualStringsIgnoreOrder(new String[] { preview1 }, new String[] { expected1 });
+	}
+}
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTestPreview.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTestPreview.java
index 28a6a4c..7216012 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTestPreview.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTestPreview.java
@@ -17,14 +17,11 @@
 import java.util.Map;
 
 import org.junit.After;
-import org.junit.Ignore;
 import org.junit.Rule;
 import org.junit.Test;
 
 import org.eclipse.jdt.testplugin.JavaProjectHelper;
 
-import org.eclipse.jface.text.contentassist.ICompletionProposal;
-
 import org.eclipse.jdt.core.ICompilationUnit;
 import org.eclipse.jdt.core.IJavaProject;
 import org.eclipse.jdt.core.IPackageFragment;
@@ -32,27 +29,19 @@
 import org.eclipse.jdt.core.JavaCore;
 import org.eclipse.jdt.core.dom.CompilationUnit;
 
-import org.eclipse.jdt.internal.corext.util.Messages;
-
-import org.eclipse.jdt.ui.tests.core.rules.Java15ProjectTestSetup;
+import org.eclipse.jdt.ui.tests.core.rules.Java16ProjectTestSetup;
 import org.eclipse.jdt.ui.tests.core.rules.ProjectTestSetup;
 import org.eclipse.jdt.ui.text.java.IJavaCompletionProposal;
 import org.eclipse.jdt.ui.text.java.correction.CUCorrectionProposal;
 
-import org.eclipse.jdt.internal.ui.text.correction.CorrectionMessages;
-
 public class QuickFixTestPreview extends QuickFixTest {
 
-	@Rule
-	public ProjectTestSetup projectsetup= new Java15ProjectTestSetup(true);
+    @Rule
+    public ProjectTestSetup projectsetup = new Java16ProjectTestSetup(true);
 
-	private IJavaProject fJProject1;
+    private IJavaProject fJProject1;
 
-	private IPackageFragmentRoot fSourceFolder;
-
-	private static String MODULE_INFO_FILE_CONTENT = ""
-										+ "module test {\n"
-										+ "}\n";
+    private IPackageFragmentRoot fSourceFolder;
 
 	@After
 	public void tearDown() throws Exception {
@@ -62,135 +51,10 @@
 	}
 
 	@Test
-	public void testEnablePreviewsAndOpenCompilerPropertiesProposals() throws Exception {
-		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
-		fJProject1.setRawClasspath(projectsetup.getDefaultClasspath(), null);
-		JavaProjectHelper.set15CompilerOptions(fJProject1, false);
-
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-		IPackageFragment def= fSourceFolder.createPackageFragment("", false, null);
-		def.createCompilationUnit("module-info.java", MODULE_INFO_FILE_CONTENT, false, null);
-
-		IPackageFragment pack= fSourceFolder.createPackageFragment("test", false, null);
-		String test= ""
-					+ "package test;\n"
-					+ "public record Rec1() {\n"
-					+ "}\n";
-		ICompilationUnit cu= pack.createCompilationUnit("Rec1.java", test, false, null);
-
-		CompilationUnit astRoot= getASTRoot(cu);
-		ArrayList<IJavaCompletionProposal> proposals= collectCorrections(cu, astRoot, 1, null);
-
-		assertNumberOfProposals(proposals, 2);
-		String label1= CorrectionMessages.PreviewFeaturesSubProcessor_enable_preview_features;
-		assertProposalExists(proposals, label1);
-		String label2= CorrectionMessages.PreviewFeaturesSubProcessor_open_compliance_properties_page_enable_preview_features;
-		assertProposalExists(proposals, label2);
-	}
-
-	@Test
-	public void testRecordSuppressWarningsProposals() throws Exception {
-		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
-		fJProject1.setRawClasspath(projectsetup.getDefaultClasspath(), null);
-		JavaProjectHelper.set15CompilerOptions(fJProject1, true);
-
-		Map<String, String> options= fJProject1.getOptions(false);
-		options.put(JavaCore.COMPILER_PB_REPORT_PREVIEW_FEATURES, JavaCore.WARNING);
-		fJProject1.setOptions(options);
-
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-
-		IPackageFragment def= fSourceFolder.createPackageFragment("", false, null);
-		def.createCompilationUnit("module-info.java", MODULE_INFO_FILE_CONTENT, false, null);
-
-		IPackageFragment pack= fSourceFolder.createPackageFragment("test", false, null);
-		String test= ""
-					+ "package test;\n"
-					+ "public record Rec1() {\n"
-					+ "}\n";
-		ICompilationUnit cu= pack.createCompilationUnit("Rec1.java", test, false, null);
-
-		CompilationUnit astRoot= getASTRoot(cu);
-		ArrayList<IJavaCompletionProposal> proposals= collectCorrections(cu, astRoot, 1, null);
-
-		assertNumberOfProposals(proposals, 2);
-		String label= Messages.format(CorrectionMessages.SuppressWarningsSubProcessor_suppress_warnings_label, new String[] { "preview", "Rec1" });
-		assertProposalExists(proposals, label);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview= getPreviewContent(proposal);
-
-		String expected= ""
-						+ "package test;\n"
-						+ "@SuppressWarnings(\"preview\")\n"
-						+ "public record Rec1() {\n"
-						+ "}\n";
-
-		assertEqualStringsIgnoreOrder(new String[] { preview }, new String[] { expected });
-	}
-
-	@Ignore("See bug 562103 comment 4")
-	@Test
-	public void testGetNeedHigherComplianceProposalsAndEnablePreviewsProposal() throws Exception {
-		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
-		fJProject1.setRawClasspath(projectsetup.getDefaultClasspath(), null);
-		JavaProjectHelper.set15CompilerOptions(fJProject1, false);
-
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-
-		IPackageFragment def= fSourceFolder.createPackageFragment("", false, null);
-		def.createCompilationUnit("module-info.java", MODULE_INFO_FILE_CONTENT, false, null);
-
-		IPackageFragment pack= fSourceFolder.createPackageFragment("test", false, null);
-		String test= ""
-					+ "package test;\n"
-					+ "public record Rec1() {\n"
-					+ "}\n";
-		ICompilationUnit cu= pack.createCompilationUnit("Rec1.java", test, false, null);
-
-		CompilationUnit astRoot= getASTRoot(cu);
-		ArrayList<IJavaCompletionProposal> proposals= collectCorrections(cu, astRoot, 1, null);
-
-		assertNumberOfProposals(proposals, 1);
-		String label1= Messages.format(CorrectionMessages.ReorgCorrectionsSubProcessor_change_project_compliance_description, "14");
-		String label2= CorrectionMessages.PreviewFeaturesSubProcessor_enable_preview_features;
-		String label= Messages.format(CorrectionMessages.ReorgCorrectionsSubProcessor_combine_two_quickfixes, new String[] {label1, label2});
-		assertProposalExists(proposals, label);
-	}
-
-	@Test
-	public void testNoEnablePreviewProposal() throws Exception {
-		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
-		fJProject1.setRawClasspath(projectsetup.getDefaultClasspath(), null);
-		JavaProjectHelper.set15CompilerOptions(fJProject1, true);
-
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-
-
-		IPackageFragment def= fSourceFolder.createPackageFragment("", false, null);
-		def.createCompilationUnit("module-info.java", MODULE_INFO_FILE_CONTENT, false, null);
-
-		IPackageFragment pack= fSourceFolder.createPackageFragment("test", false, null);
-		String test= ""
-					+ "package test;\n"
-					+ "public record Rec() {\n"
-					+ "}\n";
-		ICompilationUnit cu= pack.createCompilationUnit("Rec.java", test, false, null);
-
-		CompilationUnit astRoot= getASTRoot(cu);
-		ArrayList<ICompletionProposal> proposals= collectAllCorrections(cu, astRoot, 0);
-
-		assertNumberOfProposals(proposals, 0);
-	}
-
-	@Test
 	public void testAddSealedMissingClassModifierProposal() throws Exception {
 		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
 		fJProject1.setRawClasspath(projectsetup.getDefaultClasspath(), null);
-		JavaProjectHelper.set15CompilerOptions(fJProject1, true);
+		JavaProjectHelper.set16CompilerOptions(fJProject1, true);
 
 		Map<String, String> options= fJProject1.getOptions(false);
 		options.put(JavaCore.COMPILER_PB_REPORT_PREVIEW_FEATURES, JavaCore.IGNORE);
@@ -250,7 +114,7 @@
 	public void testAddSealedMissingInterfaceModifierProposal() throws Exception {
 		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
 		fJProject1.setRawClasspath(projectsetup.getDefaultClasspath(), null);
-		JavaProjectHelper.set15CompilerOptions(fJProject1, true);
+		JavaProjectHelper.set16CompilerOptions(fJProject1, true);
 
 		Map<String, String> options= fJProject1.getOptions(false);
 		options.put(JavaCore.COMPILER_PB_REPORT_PREVIEW_FEATURES, JavaCore.IGNORE);
@@ -296,244 +160,5 @@
 
 	}
 
-	@Test
-	public void testRecordConstructorIncorrectParamsProposal1() throws Exception {
-		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
-		fJProject1.setRawClasspath(projectsetup.getDefaultClasspath(), null);
-		JavaProjectHelper.set15CompilerOptions(fJProject1, true);
 
-		Map<String, String> options= fJProject1.getOptions(false);
-		options.put(JavaCore.COMPILER_PB_REPORT_PREVIEW_FEATURES, JavaCore.IGNORE);
-		fJProject1.setOptions(options);
-
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test", false, null);
-
-		String test= "" +
-					"package test;\n" +
-					"\n" +
-					"public record Rec1(int a){\n" +
-					"\n" +
-					"	public static void main(String[] args) {\n" +
-					"		Rec1 abc = new Rec1();\n" +
-					"	}\n" +
-					"}\n";
-		ICompilationUnit cu= pack1.createCompilationUnit("Rec1.java", test, false, null);
-
-		CompilationUnit astRoot= getASTRoot(cu);
-		ArrayList<IJavaCompletionProposal> proposals= collectCorrections(cu, astRoot, 1);
-		assertNumberOfProposals(proposals, 2);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= getPreviewContent(proposal);
-
-		String expected1= "" +
-						"package test;\n" +
-						"\n" +
-						"public record Rec1(int a){\n" +
-						"\n" +
-						"	public static void main(String[] args) {\n" +
-						"		Rec1 abc = new Rec1(a);\n" +
-						"	}\n" +
-						"}\n";
-
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= getPreviewContent(proposal);
-
-		String expected2= "" +
-						"package test;\n" +
-						"\n" +
-						"public record Rec1(int a){\n" +
-						"\n" +
-						"	/**\n" +
-						"	 * \n" +
-						"	 */\n" +
-						"	public Rec1() {\n" +
-						"		// TODO Auto-generated constructor stub\n" +
-						"	}\n" +
-						"\n" +
-						"	public static void main(String[] args) {\n" +
-						"		Rec1 abc = new Rec1();\n" +
-						"	}\n" +
-						"}\n";
-
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });
-	}
-
-	@Test
-	public void testRecordConstructorIncorrectParamsProposal2() throws Exception {
-		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
-		fJProject1.setRawClasspath(projectsetup.getDefaultClasspath(), null);
-		JavaProjectHelper.set15CompilerOptions(fJProject1, true);
-
-		Map<String, String> options= fJProject1.getOptions(false);
-		options.put(JavaCore.COMPILER_PB_REPORT_PREVIEW_FEATURES, JavaCore.IGNORE);
-		fJProject1.setOptions(options);
-
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test", false, null);
-
-		String test= "" +
-					"package test;\n" +
-					"\n" +
-					"public record Rec1(int a){\n" +
-					"\n" +
-					"	public static void main(String[] args) {\n" +
-					"		Rec1 abc = new Rec1(10, 20);\n" +
-					"	}\n" +
-					"}\n";
-		ICompilationUnit cu= pack1.createCompilationUnit("Rec1.java", test, false, null);
-
-		CompilationUnit astRoot= getASTRoot(cu);
-		ArrayList<IJavaCompletionProposal> proposals= collectCorrections(cu, astRoot, 1);
-		assertNumberOfProposals(proposals, 2);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= getPreviewContent(proposal);
-
-		String expected1= "" +
-						"package test;\n" +
-						"\n" +
-						"public record Rec1(int a){\n" +
-						"\n" +
-						"	public static void main(String[] args) {\n" +
-						"		Rec1 abc = new Rec1(10);\n" +
-						"	}\n" +
-						"}\n";
-
-		proposal= (CUCorrectionProposal) proposals.get(1);
-		String preview2= getPreviewContent(proposal);
-
-		String expected2= "" +
-						"package test;\n" +
-						"\n" +
-						"public record Rec1(int a){\n" +
-						"\n" +
-						"	/**\n" +
-						"	 * @param i\n" +
-						"	 * @param j\n" +
-						"	 */\n" +
-						"	public Rec1(int i, int j) {\n" +
-						"		// TODO Auto-generated constructor stub\n" +
-						"	}\n" +
-						"\n" +
-						"	public static void main(String[] args) {\n" +
-						"		Rec1 abc = new Rec1(10, 20);\n" +
-						"	}\n" +
-						"}\n";
-
-		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });
-	}
-
-	@Test
-	public void testRecordConstructorIncorrectParamsProposal3() throws Exception {
-		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
-		fJProject1.setRawClasspath(projectsetup.getDefaultClasspath(), null);
-		JavaProjectHelper.set15CompilerOptions(fJProject1, true);
-
-		Map<String, String> options= fJProject1.getOptions(false);
-		options.put(JavaCore.COMPILER_PB_REPORT_PREVIEW_FEATURES, JavaCore.IGNORE);
-		fJProject1.setOptions(options);
-
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test", false, null);
-
-		String test= "" +
-					"package test;\n" +
-					"\n" +
-					"public record Rec1(int a){\n" +
-					"\n" +
-					"	public static void main(String[] args) {\n" +
-					"		Rec1 abc = new Rec1(\"str\");\n" +
-					"	}\n" +
-					"}\n";
-		ICompilationUnit cu= pack1.createCompilationUnit("Rec1.java", test, false, null);
-
-		CompilationUnit astRoot= getASTRoot(cu);
-		ArrayList<IJavaCompletionProposal> proposals= collectCorrections(cu, astRoot, 1);
-		assertNumberOfProposals(proposals, 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= getPreviewContent(proposal);
-
-		String expected1= "" +
-						"package test;\n" +
-						"\n" +
-						"public record Rec1(int a){\n" +
-						"\n" +
-						"	/**\n" +
-						"	 * @param string\n" +
-						"	 */\n" +
-						"	public Rec1(String string) {\n" +
-						"		// TODO Auto-generated constructor stub\n" +
-						"	}\n" +
-						"\n" +
-						"	public static void main(String[] args) {\n" +
-						"		Rec1 abc = new Rec1(\"str\");\n" +
-						"	}\n" +
-						"}\n";
-
-		assertEqualStringsIgnoreOrder(new String[] { preview1 }, new String[] { expected1 });
-	}
-
-	@Test
-	public void testRecordCanonicalConstructordUninitializedFieldProposal() throws Exception {
-		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
-		fJProject1.setRawClasspath(projectsetup.getDefaultClasspath(), null);
-		JavaProjectHelper.set15CompilerOptions(fJProject1, true);
-
-		Map<String, String> options= fJProject1.getOptions(false);
-		options.put(JavaCore.COMPILER_PB_REPORT_PREVIEW_FEATURES, JavaCore.IGNORE);
-		fJProject1.setOptions(options);
-
-		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
-		IPackageFragment pack1= fSourceFolder.createPackageFragment("test", false, null);
-
-		String test= "" +
-					"package test;\n" +
-					"\n" +
-					"public record Rec1(int a, int b){\n" +
-					"\n" +
-					"	public Rec1(int a, int b) {\n" +
-					"		\n" +
-					"	}\n\n" +
-					"	public Rec1(int a) {\n" +
-					"		this(a, a);\n" +
-					"	}\n\n" +
-					"	public Rec1(int a, int b, int c) {\n" +
-					"		this(a, b+c);\n" +
-					"	}\n\n" +
-					"}\n";
-		ICompilationUnit cu= pack1.createCompilationUnit("Rec1.java", test, false, null);
-
-		CompilationUnit astRoot= getASTRoot(cu);
-		ArrayList<IJavaCompletionProposal> proposals= collectCorrections(cu, astRoot, 2);
-		assertNumberOfProposals(proposals, 1);
-		assertCorrectLabels(proposals);
-
-		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
-		String preview1= getPreviewContent(proposal);
-
-		String expected1= "" +
-					"package test;\n" +
-					"\n" +
-					"public record Rec1(int a, int b){\n" +
-					"\n" +
-					"	public Rec1(int a, int b) {\n" +
-					"		this.a = 0;\n" +
-					"		\n" +
-					"	}\n\n" +
-					"	public Rec1(int a) {\n" +
-					"		this(a, a);\n" +
-					"	}\n\n" +
-					"	public Rec1(int a, int b, int c) {\n" +
-					"		this(a, b+c);\n" +
-					"	}\n\n" +
-					"}\n";
-
-		assertEqualStringsIgnoreOrder(new String[] { preview1 }, new String[] { expected1 });
-	}
 }
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/UtilitiesTest.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/UtilitiesTest.java
index d9f1c13..7f10f11 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/UtilitiesTest.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/UtilitiesTest.java
@@ -221,7 +221,7 @@
 
 	@Test
 	public void testGetPossibleTypeKindsForTypes() throws Exception {
-		JavaProjectHelper.set15CompilerOptions(fJProject1, true);
+		JavaProjectHelper.set16CompilerOptions(fJProject1, true);
 
 		IPackageFragment pack1= fSourceFolder.createPackageFragment("test1", false, null);
 		StringBuilder buf= new StringBuilder();
diff --git a/org.eclipse.jdt.ui/.settings/.api_filters b/org.eclipse.jdt.ui/.settings/.api_filters
index aad5889..4b08b50 100644
--- a/org.eclipse.jdt.ui/.settings/.api_filters
+++ b/org.eclipse.jdt.ui/.settings/.api_filters
@@ -32,36 +32,6 @@
             </message_arguments>
         </filter>
     </resource>
-    <resource path="core refactoring/org/eclipse/jdt/internal/corext/refactoring/TypeContextChecker.java" type="org.eclipse.jdt.internal.corext.refactoring.TypeContextChecker">
-        <filter comment="This is a Java15 preview feature" id="640712815">
-            <message_arguments>
-                <message_argument value="AbstractTypeDeclaration"/>
-                <message_argument value="TypeContextChecker"/>
-                <message_argument value="getName()"/>
-            </message_arguments>
-        </filter>
-        <filter comment="This is a Java15 preview feature" id="640712815">
-            <message_arguments>
-                <message_argument value="RecordDeclaration"/>
-                <message_argument value="TypeContextChecker"/>
-                <message_argument value="recordComponents()"/>
-            </message_arguments>
-        </filter>
-        <filter comment="This is a Java 15 preview feature" id="640712815">
-            <message_arguments>
-                <message_argument value="RecordDeclaration"/>
-                <message_argument value="TypeContextChecker"/>
-                <message_argument value="superInterfaceTypes()"/>
-            </message_arguments>
-        </filter>
-        <filter comment="This is a Java 15 preview feature" id="640712815">
-            <message_arguments>
-                <message_argument value="RecordDeclaration"/>
-                <message_argument value="TypeContextChecker"/>
-                <message_argument value="typeParameters()"/>
-            </message_arguments>
-        </filter>
-    </resource>
     <resource path="core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/IntroduceFactoryRefactoring.java" type="org.eclipse.jdt.internal.corext.refactoring.code.IntroduceFactoryRefactoring">
         <filter comment="This is a Java 15 preview feature" id="640712815">
             <message_arguments>
@@ -77,13 +47,6 @@
                 <message_argument value="isCompactConstructor()"/>
             </message_arguments>
         </filter>
-        <filter comment="This is a Java 15 preview feature" id="640712815">
-            <message_arguments>
-                <message_argument value="RecordDeclaration"/>
-                <message_argument value="IntroduceFactoryRefactoring"/>
-                <message_argument value="recordComponents()"/>
-            </message_arguments>
-        </filter>
     </resource>
     <resource path="core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/ReplaceInvocationsRefactoring.java" type="org.eclipse.jdt.internal.corext.refactoring.code.ReplaceInvocationsRefactoring">
         <filter id="571519004">
@@ -230,11 +193,18 @@
         </filter>
     </resource>
     <resource path="ui/org/eclipse/jdt/internal/ui/fix/PatternMatchingForInstanceofCleanUp.java" type="org.eclipse.jdt.internal.ui.fix.PatternMatchingForInstanceofCleanUp$PatternMatchingForInstanceofOperation">
-        <filter comment="For Java 15" id="640712815">
+        <filter comment="This is a Java 16 preview feature" id="640712815">
             <message_arguments>
-                <message_argument value="InstanceofExpression"/>
+                <message_argument value="PatternInstanceofExpression"/>
                 <message_argument value="PatternMatchingForInstanceofOperation"/>
-                <message_argument value="setPatternVariable(SimpleName)"/>
+                <message_argument value="setLeftOperand(Expression)"/>
+            </message_arguments>
+        </filter>
+        <filter comment="This is a Java 16 preview feature" id="640712815">
+            <message_arguments>
+                <message_argument value="PatternInstanceofExpression"/>
+                <message_argument value="PatternMatchingForInstanceofOperation"/>
+                <message_argument value="setRightOperand(SingleVariableDeclaration)"/>
             </message_arguments>
         </filter>
     </resource>
@@ -287,20 +257,6 @@
         </filter>
     </resource>
     <resource path="ui/org/eclipse/jdt/internal/ui/javaeditor/SemanticHighlightingReconciler.java" type="org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlightingReconciler$PositionCollector">
-        <filter comment="This is a Java15 preview feature" id="640712815">
-            <message_arguments>
-                <message_argument value="ASTNode"/>
-                <message_argument value="PositionCollector"/>
-                <message_argument value="getAST()"/>
-            </message_arguments>
-        </filter>
-        <filter comment="For Java 14 preview features" id="640712815">
-            <message_arguments>
-                <message_argument value="RecordDeclaration"/>
-                <message_argument value="PositionCollector"/>
-                <message_argument value="getRestrictedIdentifierStartPosition()"/>
-            </message_arguments>
-        </filter>
         <filter comment="This is a Java 15 preview feature" id="640712815">
             <message_arguments>
                 <message_argument value="TypeDeclaration"/>
@@ -317,98 +273,6 @@
             </message_arguments>
         </filter>
     </resource>
-    <resource path="ui/org/eclipse/jdt/internal/ui/text/correction/JavadocTagsSubProcessor.java" type="org.eclipse.jdt.internal.ui.text.correction.JavadocTagsSubProcessor">
-        <filter comment="For Java 14 Enable Preview feature" id="623939596">
-            <message_arguments>
-                <message_argument value="RecordDeclaration"/>
-                <message_argument value="JavadocTagsSubProcessor"/>
-                <message_argument value="RECORD_COMPONENTS_PROPERTY"/>
-            </message_arguments>
-        </filter>
-        <filter comment="For Java 14 Enable Preview feature" id="623939596">
-            <message_arguments>
-                <message_argument value="RecordDeclaration"/>
-                <message_argument value="JavadocTagsSubProcessor"/>
-                <message_argument value="TYPE_PARAMETERS_PROPERTY"/>
-            </message_arguments>
-        </filter>
-        <filter comment="For Java 14 Enable Preview feature" id="640712815">
-            <message_arguments>
-                <message_argument value="RecordDeclaration"/>
-                <message_argument value="JavadocTagsSubProcessor"/>
-                <message_argument value="recordComponents()"/>
-            </message_arguments>
-        </filter>
-        <filter comment="For Java 14 Enable Preview feature" id="640712815">
-            <message_arguments>
-                <message_argument value="RecordDeclaration"/>
-                <message_argument value="JavadocTagsSubProcessor"/>
-                <message_argument value="typeParameters()"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="ui/org/eclipse/jdt/internal/ui/text/correction/JavadocTagsSubProcessor.java" type="org.eclipse.jdt.internal.ui.text.correction.JavadocTagsSubProcessor$AddAllMissingJavadocTagsProposal">
-        <filter comment="For Java 14 Enable Preview feature" id="640712815">
-            <message_arguments>
-                <message_argument value="ASTNode"/>
-                <message_argument value="AddAllMissingJavadocTagsProposal"/>
-                <message_argument value="getAST()"/>
-            </message_arguments>
-        </filter>
-        <filter comment="For Java 14 Enable Preview feature" id="640712815">
-            <message_arguments>
-                <message_argument value="BodyDeclaration"/>
-                <message_argument value="AddAllMissingJavadocTagsProposal"/>
-                <message_argument value="getJavadoc()"/>
-            </message_arguments>
-        </filter>
-        <filter comment="For Java 14 Enable Preview feature" id="640712815">
-            <message_arguments>
-                <message_argument value="RecordDeclaration"/>
-                <message_argument value="AddAllMissingJavadocTagsProposal"/>
-                <message_argument value="recordComponents()"/>
-            </message_arguments>
-        </filter>
-        <filter comment="For Java 14 Enable Preview feature" id="640712815">
-            <message_arguments>
-                <message_argument value="RecordDeclaration"/>
-                <message_argument value="AddAllMissingJavadocTagsProposal"/>
-                <message_argument value="typeParameters()"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="ui/org/eclipse/jdt/internal/ui/text/correction/JavadocTagsSubProcessor.java" type="org.eclipse.jdt.internal.ui.text.correction.JavadocTagsSubProcessor$AddMissingJavadocTagProposal">
-        <filter comment="This is a Java15 preview feature" id="640712815">
-            <message_arguments>
-                <message_argument value="RecordDeclaration"/>
-                <message_argument value="AddMissingJavadocTagProposal"/>
-                <message_argument value="recordComponents()"/>
-            </message_arguments>
-        </filter>
-        <filter comment="For Java 14 Enable Preview feature" id="640712815">
-            <message_arguments>
-                <message_argument value="RecordDeclaration"/>
-                <message_argument value="AddMissingJavadocTagProposal"/>
-                <message_argument value="typeParameters()"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="ui/org/eclipse/jdt/internal/ui/text/correction/SuppressWarningsSubProcessor.java" type="org.eclipse.jdt.internal.ui.text.correction.SuppressWarningsSubProcessor">
-        <filter comment="For Java 14 Enable Preview feature" id="623939596">
-            <message_arguments>
-                <message_argument value="RecordDeclaration"/>
-                <message_argument value="SuppressWarningsSubProcessor"/>
-                <message_argument value="MODIFIERS2_PROPERTY"/>
-            </message_arguments>
-        </filter>
-        <filter comment="For Java 14 Enable Preview feature" id="640712815">
-            <message_arguments>
-                <message_argument value="AbstractTypeDeclaration"/>
-                <message_argument value="SuppressWarningsSubProcessor"/>
-                <message_argument value="getName()"/>
-            </message_arguments>
-        </filter>
-    </resource>
     <resource path="ui/org/eclipse/jdt/internal/ui/text/correction/UnresolvedElementsSubProcessor.java" type="org.eclipse.jdt.internal.ui.text.correction.UnresolvedElementsSubProcessor">
         <filter comment="This is a Java 15 preview feature" id="640712815">
             <message_arguments>
@@ -419,13 +283,6 @@
         </filter>
     </resource>
     <resource path="ui/org/eclipse/jdt/internal/ui/text/correction/proposals/InitializeFinalFieldProposal.java" type="org.eclipse.jdt.internal.ui.text.correction.proposals.InitializeFinalFieldProposal">
-        <filter id="640712815">
-            <message_arguments>
-                <message_argument value="AbstractTypeDeclaration"/>
-                <message_argument value="InitializeFinalFieldProposal"/>
-                <message_argument value="getName()"/>
-            </message_arguments>
-        </filter>
         <filter comment="This is a Java 15 preview feature" id="640712815">
             <message_arguments>
                 <message_argument value="IMethodBinding"/>
@@ -434,15 +291,6 @@
             </message_arguments>
         </filter>
     </resource>
-    <resource path="ui/org/eclipse/jdt/internal/ui/text/correction/proposals/InitializeFinalFieldProposal.java" type="org.eclipse.jdt.internal.ui.text.correction.proposals.InitializeFinalFieldProposal$RecordComponentVisitor">
-        <filter id="640712815">
-            <message_arguments>
-                <message_argument value="RecordDeclaration"/>
-                <message_argument value="RecordComponentVisitor"/>
-                <message_argument value="recordComponents()"/>
-            </message_arguments>
-        </filter>
-    </resource>
     <resource path="ui/org/eclipse/jdt/internal/ui/util/ViewerPane.java" type="org.eclipse.jdt.internal.ui.util.ViewerPane">
         <filter id="571473929">
             <message_arguments>
diff --git a/org.eclipse.jdt.ui/ui refactoring/org/eclipse/jdt/internal/ui/refactoring/actions/RenameJavaElementAction.java b/org.eclipse.jdt.ui/ui refactoring/org/eclipse/jdt/internal/ui/refactoring/actions/RenameJavaElementAction.java
index c1bb80c..0165194 100644
--- a/org.eclipse.jdt.ui/ui refactoring/org/eclipse/jdt/internal/ui/refactoring/actions/RenameJavaElementAction.java
+++ b/org.eclipse.jdt.ui/ui refactoring/org/eclipse/jdt/internal/ui/refactoring/actions/RenameJavaElementAction.java
@@ -33,7 +33,6 @@
 import org.eclipse.jdt.core.IType;
 import org.eclipse.jdt.core.ITypeRoot;
 import org.eclipse.jdt.core.JavaModelException;
-import org.eclipse.jdt.core.dom.AST;
 import org.eclipse.jdt.core.dom.ASTNode;
 import org.eclipse.jdt.core.dom.CompilationUnit;
 import org.eclipse.jdt.core.dom.IMethodBinding;
@@ -61,6 +60,7 @@
 import org.eclipse.jdt.internal.ui.refactoring.reorg.RenameLinkedMode;
 import org.eclipse.jdt.internal.ui.text.correction.CorrectionCommandHandler;
 import org.eclipse.jdt.internal.ui.text.correction.proposals.LinkedNamesAssistProposal;
+import org.eclipse.jdt.internal.ui.util.ASTHelper;
 import org.eclipse.jdt.internal.ui.util.ExceptionHandler;
 
 public class RenameJavaElementAction extends SelectionDispatchAction {
@@ -244,7 +244,7 @@
 	private boolean isVarTypeSelection(ITextSelection textSelection) {
 		if (textSelection instanceof JavaTextSelection) {
 			ASTNode node= ((JavaTextSelection) textSelection).resolveCoveringNode();
-			if (node instanceof SimpleName && node.getAST().apiLevel() >= AST.JLS10 && ((SimpleName) node).isVar()) {
+			if (node instanceof SimpleName && node.getAST().apiLevel() >= ASTHelper.JLS10 && ((SimpleName) node).isVar()) {
 				return true;
 			}
 		} else if (textSelection != null) {
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/PatternMatchingForInstanceofCleanUp.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/PatternMatchingForInstanceofCleanUp.java
index 5a5bc6d..4cbe83d 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/PatternMatchingForInstanceofCleanUp.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/PatternMatchingForInstanceofCleanUp.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2020 Fabrice TIERCELIN and others.
+ * Copyright (c) 2020, 2021 Fabrice TIERCELIN and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -8,9 +8,13 @@
  *
  * SPDX-License-Identifier: EPL-2.0
  *
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
+ *
  * Contributors:
  *     Fabrice TIERCELIN - initial API and implementation
- *     IBM Corporation - Bug 565447
+ *     IBM Corporation - Bug 565447, Bug 570690
  *******************************************************************************/
 package org.eclipse.jdt.internal.ui.fix;
 
@@ -35,8 +39,10 @@
 import org.eclipse.jdt.core.dom.IfStatement;
 import org.eclipse.jdt.core.dom.InfixExpression;
 import org.eclipse.jdt.core.dom.InstanceofExpression;
+import org.eclipse.jdt.core.dom.PatternInstanceofExpression;
 import org.eclipse.jdt.core.dom.PrefixExpression;
 import org.eclipse.jdt.core.dom.SimpleName;
+import org.eclipse.jdt.core.dom.SingleVariableDeclaration;
 import org.eclipse.jdt.core.dom.Statement;
 import org.eclipse.jdt.core.dom.VariableDeclarationFragment;
 import org.eclipse.jdt.core.dom.VariableDeclarationStatement;
@@ -55,8 +61,6 @@
 import org.eclipse.jdt.ui.cleanup.ICleanUpFix;
 import org.eclipse.jdt.ui.text.java.IProblemLocation;
 
-import org.eclipse.jdt.internal.ui.text.correction.PreviewFeaturesSubProcessor;
-
 /**
  * A fix that uses pattern matching for the instanceof expression when possible.
  */
@@ -103,8 +107,7 @@
 	@Override
 	protected ICleanUpFix createFix(CompilationUnit unit) throws CoreException {
 		if (!isEnabled(CleanUpConstants.USE_PATTERN_MATCHING_FOR_INSTANCEOF)
-				|| !PreviewFeaturesSubProcessor.isPreviewFeatureEnabled(unit.getJavaElement().getJavaProject())
-				|| !JavaModelUtil.is15OrHigher(unit.getJavaElement().getJavaProject())) {
+				|| !JavaModelUtil.is16OrHigher(unit.getJavaElement().getJavaProject())) {
 			return null;
 		}
 
@@ -140,8 +143,7 @@
 
 				@Override
 				public boolean visit(final InstanceofExpression visited) {
-					if (visited.getPatternVariable() != null
-							|| !ASTNodes.isPassive(visited.getLeftOperand())
+					if (!ASTNodes.isPassive(visited.getLeftOperand())
 							|| visited.getRightOperand().resolveBinding() == null) {
 						return true;
 					}
@@ -267,10 +269,12 @@
 			AST ast= cuRewrite.getRoot().getAST();
 			TextEditGroup group= createTextEditGroup(MultiFixMessages.PatternMatchingForInstanceofCleanup_description, cuRewrite);
 
-			InstanceofExpression newInstanceof= ast.newInstanceofExpression();
+			PatternInstanceofExpression newInstanceof= ast.newPatternInstanceofExpression();
 			newInstanceof.setLeftOperand(ASTNodes.createMoveTarget(rewrite, nodeToComplete.getLeftOperand()));
-			newInstanceof.setRightOperand(ASTNodes.createMoveTarget(rewrite, nodeToComplete.getRightOperand()));
-			newInstanceof.setPatternVariable(ASTNodes.createMoveTarget(rewrite, expressionToMove));
+			SingleVariableDeclaration newSVDecl= ast.newSingleVariableDeclaration();
+			newSVDecl.setName(ASTNodes.createMoveTarget(rewrite, expressionToMove));
+			newSVDecl.setType(ASTNodes.createMoveTarget(rewrite, nodeToComplete.getRightOperand()));
+			newInstanceof.setRightOperand(newSVDecl);
 
 			ASTNodes.replaceButKeepComment(rewrite, nodeToComplete, newInstanceof, group);
 
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/SemanticHighlightingReconciler.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/SemanticHighlightingReconciler.java
index 6bf5f7a..531c831 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/SemanticHighlightingReconciler.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/SemanticHighlightingReconciler.java
@@ -131,7 +131,7 @@
 
 		@Override
 		public boolean visit(SimpleType node) {
-			if (node.getAST().apiLevel() >= AST.JLS10 && node.isVar()) {
+			if (node.getAST().apiLevel() >= ASTHelper.JLS10 && node.isVar()) {
 				int offset= node.getStartPosition();
 				int length= node.getLength();
 				if (offset > -1 && length > 0) {
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/ComplianceConfigurationBlock.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/ComplianceConfigurationBlock.java
index 9731796..36ed061 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/ComplianceConfigurationBlock.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/ComplianceConfigurationBlock.java
@@ -8,6 +8,10 @@
  *
  * SPDX-License-Identifier: EPL-2.0
  *
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     Jesper S Møller - Bug 529432 - Allow JDT UI to target Java 10
@@ -143,6 +147,7 @@
 	private static final String VERSION_13 = JavaCore.VERSION_13;
 	private static final String VERSION_14 = JavaCore.VERSION_14;
 	private static final String VERSION_15 = JavaCore.VERSION_15;
+	private static final String VERSION_16 = JavaCore.VERSION_16;
 	private static final String VERSION_LATEST = JavaCore.latestSupportedJavaVersion();
 	private static final String VERSION_JSR14= "jsr14"; //$NON-NLS-1$
 
@@ -300,7 +305,7 @@
 	private Composite createComplianceTabContent(Composite folder) {
 
 		final String[] complianceVersions= new String[] { VERSION_1_3, VERSION_1_4,
-				VERSION_1_5, VERSION_1_6, VERSION_1_7, VERSION_1_8, VERSION_9, VERSION_10, VERSION_11, VERSION_12, VERSION_13, VERSION_14, VERSION_15 };
+				VERSION_1_5, VERSION_1_6, VERSION_1_7, VERSION_1_8, VERSION_9, VERSION_10, VERSION_11, VERSION_12, VERSION_13, VERSION_14, VERSION_15, VERSION_16 };
 		final String[] complianceLabels= new String[] {
 			PreferencesMessages.ComplianceConfigurationBlock_version13,
 			PreferencesMessages.ComplianceConfigurationBlock_version14,
@@ -315,10 +320,11 @@
 			PreferencesMessages.ComplianceConfigurationBlock_version_13,
 			PreferencesMessages.ComplianceConfigurationBlock_version_14,
 			PreferencesMessages.ComplianceConfigurationBlock_version_15,
+			PreferencesMessages.ComplianceConfigurationBlock_version_16,
 		};
 
 		String[] targetVersions= new String[] { VERSION_CLDC_1_1, VERSION_1_1, VERSION_1_2, VERSION_1_3, VERSION_1_4,
-				VERSION_1_5, VERSION_1_6, VERSION_1_7, VERSION_1_8, VERSION_9, VERSION_10, VERSION_11, VERSION_12, VERSION_13, VERSION_14, VERSION_15 };
+				VERSION_1_5, VERSION_1_6, VERSION_1_7, VERSION_1_8, VERSION_9, VERSION_10, VERSION_11, VERSION_12, VERSION_13, VERSION_14, VERSION_15, VERSION_16 };
 		String[] targetLabels= new String[] {
 				PreferencesMessages.ComplianceConfigurationBlock_versionCLDC11,
 				PreferencesMessages.ComplianceConfigurationBlock_version11,
@@ -336,6 +342,7 @@
 				PreferencesMessages.ComplianceConfigurationBlock_version_13,
 				PreferencesMessages.ComplianceConfigurationBlock_version_14,
 				PreferencesMessages.ComplianceConfigurationBlock_version_15,
+				PreferencesMessages.ComplianceConfigurationBlock_version_16,
 		};
 		if (ComplianceConfigurationBlock.VERSION_JSR14.equals(getValue(PREF_CODEGEN_TARGET_PLATFORM))) {
 			targetVersions= append(targetVersions, ComplianceConfigurationBlock.VERSION_JSR14);
@@ -343,7 +350,7 @@
 		}
 
 		String[] sourceVersions= new String[] { VERSION_1_3, VERSION_1_4,
-				VERSION_1_5, VERSION_1_6, VERSION_1_7, VERSION_1_8, VERSION_9, VERSION_10, VERSION_11, VERSION_12, VERSION_13, VERSION_14, VERSION_15 };
+				VERSION_1_5, VERSION_1_6, VERSION_1_7, VERSION_1_8, VERSION_9, VERSION_10, VERSION_11, VERSION_12, VERSION_13, VERSION_14, VERSION_15, VERSION_16 };
 		String[] sourceLabels= new String[] {
 				PreferencesMessages.ComplianceConfigurationBlock_version13,
 				PreferencesMessages.ComplianceConfigurationBlock_version14,
@@ -358,6 +365,7 @@
 				PreferencesMessages.ComplianceConfigurationBlock_version_13,
 				PreferencesMessages.ComplianceConfigurationBlock_version_14,
 				PreferencesMessages.ComplianceConfigurationBlock_version_15,
+				PreferencesMessages.ComplianceConfigurationBlock_version_16,
 		};
 
 		final ScrolledPageContent sc1 = new ScrolledPageContent(folder);
@@ -807,13 +815,13 @@
 				}
 			}
 
-//			//TODO: Comment once Java SE 15 has been shipped:
-//			String selectedCompliance= getValue(PREF_COMPLIANCE);
-//			if (VERSION_15.equals(selectedCompliance)) {
-//				fJRE50InfoText.setText(
-//						"This is an implementation of an early-draft specification developed under the Java Community Process (JCP) and is made available for testing and evaluation purposes only. The code is not compatible with any specification of the JCP."); //$NON-NLS-1$
-//				isVisible= true;
-//			}
+			//TODO: Comment once Java SE 16 has been shipped:
+			String selectedCompliance= getValue(PREF_COMPLIANCE);
+			if (VERSION_16.equals(selectedCompliance)) {
+				fJRE50InfoText.setText(
+						"This is an implementation of an early-draft specification developed under the Java Community Process (JCP) and is made available for testing and evaluation purposes only. The code is not compatible with any specification of the JCP."); //$NON-NLS-1$
+				isVisible= true;
+			}
 
 			fJRE50InfoText.setVisible(isVisible);
 			fJRE50InfoImage.setImage(isVisible ? image : null);
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.java
index 52946cc..65b04e6 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.java
@@ -8,6 +8,10 @@
  *
  * SPDX-License-Identifier: EPL-2.0
  *
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
+ *
  * Contributors:
  *     IBM Corporation - initial API and implementation
  *     John Kaplan, johnkaplantech@gmail.com - 108071 [code templates] template for body of newly created class
@@ -839,6 +843,7 @@
 	public static String ComplianceConfigurationBlock_version_13;
 	public static String ComplianceConfigurationBlock_version_14;
 	public static String ComplianceConfigurationBlock_version_15;
+	public static String ComplianceConfigurationBlock_version_16;
 	public static String ComplianceConfigurationBlock_versionCLDC11;
 	public static String ComplianceConfigurationBlock_src_greater_compliance;
 	public static String ComplianceConfigurationBlock_classfile_greater_compliance;
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.properties b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.properties
index a8801fc..d8b7290 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.properties
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/PreferencesMessages.properties
@@ -8,6 +8,10 @@
 #
 # SPDX-License-Identifier: EPL-2.0
 #
+# This is an implementation of an early-draft specification developed under the Java
+# Community Process (JCP) and is made available for testing and evaluation purposes
+# only. The code is not compatible with any specification of the JCP.
+#
 #     IBM Corporation - initial API and implementation
 #     John Kaplan, johnkaplantech@gmail.com - 108071 [code templates] template for body of newly created class
 #     Sebastian Davids, sdavids@gmx.de - 187316 [preferences] Mark Occurrences Pref Page; Link to
@@ -591,6 +595,7 @@
 ComplianceConfigurationBlock_version_13=13
 ComplianceConfigurationBlock_version_14=14
 ComplianceConfigurationBlock_version_15=15
+ComplianceConfigurationBlock_version_16=16 (BETA)
 ComplianceConfigurationBlock_versionCLDC11=CLDC 1.1
 
 ComplianceConfigurationBlock_needsbuild_title=Compiler Settings Changed
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/CorrectionCommandHandler.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/CorrectionCommandHandler.java
index cd37cd0..da8952e 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/CorrectionCommandHandler.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/CorrectionCommandHandler.java
@@ -38,7 +38,6 @@
 import org.eclipse.ui.keys.IBindingService;
 
 import org.eclipse.jdt.core.ICompilationUnit;
-import org.eclipse.jdt.core.dom.AST;
 import org.eclipse.jdt.core.dom.ASTNode;
 import org.eclipse.jdt.core.dom.SimpleName;
 
@@ -50,6 +49,7 @@
 import org.eclipse.jdt.internal.ui.actions.ActionUtil;
 import org.eclipse.jdt.internal.ui.javaeditor.JavaEditor;
 import org.eclipse.jdt.internal.ui.text.correction.proposals.LinkedNamesAssistProposal;
+import org.eclipse.jdt.internal.ui.util.ASTHelper;
 
 /**
  * Handler to be used to run a quick fix or assist by keyboard shortcut
@@ -132,7 +132,7 @@
 		ASTNode node= context.getCoveringNode();
 		if (node instanceof SimpleName) {
 			SimpleName name= (SimpleName) node;
-			if (name.getAST().apiLevel() >= AST.JLS10 && name.isVar()) {
+			if (name.getAST().apiLevel() >= ASTHelper.JLS10 && name.isVar()) {
 				return null;
 			}
 			return new LinkedNamesAssistProposal(context, name);
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/LocalCorrectionsSubProcessor.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/LocalCorrectionsSubProcessor.java
index 30aca6b..f048d6f 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/LocalCorrectionsSubProcessor.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/LocalCorrectionsSubProcessor.java
@@ -246,7 +246,7 @@
 		List<String> affectedLocals= new ArrayList<>();
 		SimpleName vName= null;
 		ITypeBinding vType= null;
-		if (selectedNode.getAST().apiLevel() >= AST.JLS10 && (selectedNode instanceof VariableDeclarationStatement)) {
+		if (selectedNode.getAST().apiLevel() >= ASTHelper.JLS10 && (selectedNode instanceof VariableDeclarationStatement)) {
 			for (Object o : ((VariableDeclarationStatement)selectedNode).fragments()) {
 				VariableDeclarationFragment v= ((VariableDeclarationFragment)o);
 				vName= v.getName();
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java
index 9a06d22..07655ca 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickAssistProcessor.java
@@ -3059,7 +3059,7 @@
 			return false;
 		}
 		SimpleName name= (SimpleName) node;
-		if (name.getAST().apiLevel() >= AST.JLS10 && name.isVar()) {
+		if (name.getAST().apiLevel() >= ASTHelper.JLS10 && name.isVar()) {
 			return false;
 		}
 		IBinding binding= name.resolveBinding();
@@ -3097,7 +3097,7 @@
 			return false;
 		}
 		SimpleName name= (SimpleName) node;
-		if (name.getAST().apiLevel() >= AST.JLS10 && name.isVar()) {
+		if (name.getAST().apiLevel() >= ASTHelper.JLS10 && name.isVar()) {
 			return false;
 		}
 		IBinding binding= name.resolveBinding();
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/TypeMismatchSubProcessor.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/TypeMismatchSubProcessor.java
index 031301b..24f0342 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/TypeMismatchSubProcessor.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/TypeMismatchSubProcessor.java
@@ -82,6 +82,7 @@
 import org.eclipse.jdt.internal.ui.text.correction.proposals.NewVariableCorrectionProposal;
 import org.eclipse.jdt.internal.ui.text.correction.proposals.OptionalCorrectionProposal;
 import org.eclipse.jdt.internal.ui.text.correction.proposals.TypeChangeCorrectionProposal;
+import org.eclipse.jdt.internal.ui.util.ASTHelper;
 import org.eclipse.jdt.internal.ui.viewsupport.BindingLabelProvider;
 
 
@@ -159,7 +160,7 @@
 
 		if (!(nodeToCast instanceof ArrayInitializer)) {
 			String castTypeName= castTypeBinding.getErasure().getQualifiedName();
-			if (castTypeName.equals("java.util.Optional") && ast.apiLevel() >= AST.JLS8) { //$NON-NLS-1$
+			if (castTypeName.equals("java.util.Optional") && ast.apiLevel() >= ASTHelper.JLS8) { //$NON-NLS-1$
 				ITypeBinding nodeToCastTypeBinding= nodeToCast.resolveTypeBinding();
 				String label0= Messages.format(CorrectionMessages.TypeMismatchSubProcessor_changetooptionalempty_description, nodeToCast.toString());
 				proposals.add(new OptionalCorrectionProposal(label0, cu, nodeToCast, IProposalRelevance.CREATE_EMPTY_OPTIONAL, OptionalCorrectionProposal.OPTIONAL_EMPTY));
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/NewProviderMethodDeclaration.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/NewProviderMethodDeclaration.java
index 29bfcb7..b2948fd 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/NewProviderMethodDeclaration.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/proposals/NewProviderMethodDeclaration.java
@@ -47,6 +47,7 @@
 import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
 
 import org.eclipse.jdt.internal.ui.JavaPluginImages;
+import org.eclipse.jdt.internal.ui.util.ASTHelper;
 
 public class NewProviderMethodDeclaration extends AbstractMethodCorrectionProposal {
 
@@ -67,7 +68,7 @@
 		typeProposals.addAll(Arrays.asList(subTypes));
 		Image image= JavaPluginImages.get(JavaPluginImages.IMG_MISC_PUBLIC);
 
-		ASTParser parser= ASTParser.newParser(AST.JLS9);
+		ASTParser parser= ASTParser.newParser(ASTHelper.JLS9);
 		parser.setKind(ASTParser.K_COMPILATION_UNIT);
 		parser.setProject(compilationUnit.getJavaProject());
 		parser.setSource(compilationUnit);
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/template/contentassist/TemplateEngine.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/template/contentassist/TemplateEngine.java
index aefa99a..7ea18e5 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/template/contentassist/TemplateEngine.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/template/contentassist/TemplateEngine.java
@@ -47,7 +47,6 @@
 
 import org.eclipse.jdt.internal.ui.JavaPlugin;
 import org.eclipse.jdt.internal.ui.JavaPluginImages;
-import org.eclipse.jdt.internal.ui.text.correction.PreviewFeaturesSubProcessor;
 
 
 public class TemplateEngine {
@@ -213,7 +212,7 @@
 			}
 			return false;
 		}
-		if (NEW_RECORD_TEMPLATE_NAME.equals(template.getName()) && PreviewFeaturesSubProcessor.isPreviewFeatureEnabled(context.getJavaProject())) {
+		if (NEW_RECORD_TEMPLATE_NAME.equals(template.getName()) && JavaModelUtil.is16OrHigher(context.getJavaProject())) {
 			return true;
 		}
 		return true;
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/NewWizardMessages.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/NewWizardMessages.java
index 2faefdd..7f6db77 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/NewWizardMessages.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/NewWizardMessages.java
@@ -118,7 +118,6 @@
 	public static String NewTypeWizardPage_warning_NotJDKCompliant2;
 	public static String NewTypeWizardPage_warning_EnumClassNotFound;
 	public static String NewTypeWizardPage_warning_RecordClassNotFound;
-	public static String NewTypeWizardPage_warning_PreviewFeatureNotEnabled;
 	public static String NewTypeWizardPage_default;
 	public static String NewTypeWizardPage_ChoosePackageDialog_title;
 	public static String NewTypeWizardPage_ChoosePackageDialog_description;
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/NewWizardMessages.properties b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/NewWizardMessages.properties
index 59f0f1a..93fe9c1 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/NewWizardMessages.properties
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/wizards/NewWizardMessages.properties
@@ -93,7 +93,6 @@
 NewTypeWizardPage_warning_NotJDKCompliant2=Project ''{0}'' is not a Java {1} compliant project.
 NewTypeWizardPage_warning_EnumClassNotFound=Type 'java.lang.Enum' is not on the project's build path. Make sure you use a 1.5 JDK.
 NewTypeWizardPage_warning_RecordClassNotFound=Type 'java.lang.Record' is not on the project's build path. Make sure you use a 14 JDK.
-NewTypeWizardPage_warning_PreviewFeatureNotEnabled=Project ''{0}'' does not have preview features enabled.
 
 NewTypeWizardPage_default=(default)
 NewTypeWizardPage_ChoosePackageDialog_title=Package Selection
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/SharedASTProvider.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/SharedASTProvider.java
index f0d941e..b74205f 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/SharedASTProvider.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/SharedASTProvider.java
@@ -7,6 +7,10 @@
  * https://www.eclipse.org/legal/epl-2.0/
  *
  * SPDX-License-Identifier: EPL-2.0
+ * 
+ * This is an implementation of an early-draft specification developed under the Java
+ * Community Process (JCP) and is made available for testing and evaluation purposes
+ * only. The code is not compatible with any specification of the JCP.
  *
  * Contributors:
  *     IBM Corporation - initial API and implementation
@@ -33,7 +37,7 @@
  * <p>Clients can make the following assumptions about the AST:</p>
  * <ul>
  *    <li>the AST has a {@link ITypeRoot} as source: {@link CompilationUnit#getTypeRoot()} is not null.</li>
- *    <li>the {@link AST#apiLevel() AST API level} is {@link AST#JLS15 API level 15} or higher</li>
+ *    <li>the {@link AST#apiLevel() AST API level} is {@link AST#JLS16 API level 16} or higher</li>
  *    <li>the AST has bindings resolved ({@link AST#hasResolvedBindings()})</li>
  *    <li>{@link AST#hasStatementsRecovery() statement} and {@link AST#hasBindingsRecovery() bindings}
  *           recovery are enabled
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/wizards/NewTypeWizardPage.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/wizards/NewTypeWizardPage.java
index a893ee9..eec15f3 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/wizards/NewTypeWizardPage.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/wizards/NewTypeWizardPage.java
@@ -149,7 +149,6 @@
 import org.eclipse.jdt.internal.ui.refactoring.contentassist.ControlContentAssistHelper;
 import org.eclipse.jdt.internal.ui.refactoring.contentassist.JavaPackageCompletionProcessor;
 import org.eclipse.jdt.internal.ui.refactoring.contentassist.JavaTypeCompletionProcessor;
-import org.eclipse.jdt.internal.ui.text.correction.PreviewFeaturesSubProcessor;
 import org.eclipse.jdt.internal.ui.util.SWTUtil;
 import org.eclipse.jdt.internal.ui.wizards.NewWizardMessages;
 import org.eclipse.jdt.internal.ui.wizards.SuperInterfaceSelectionDialog;
@@ -1613,10 +1612,8 @@
 	    }
 		if ((fTypeKind == RECORD_TYPE) && !status.matches(IStatus.ERROR)) {
 	    	if (root != null) {
-	    		if (!JavaModelUtil.is14OrHigher(root.getJavaProject())) {
-	    			return new StatusInfo(IStatus.ERROR, Messages.format(NewWizardMessages.NewTypeWizardPage_warning_NotJDKCompliant2, new String[] {BasicElementLabels.getJavaElementName(root.getJavaProject().getElementName()), "14" })); //$NON-NLS-1$
-	    		} else if (!PreviewFeaturesSubProcessor.isPreviewFeatureEnabled(root.getJavaProject())) {
-	    			return new StatusInfo(IStatus.ERROR, Messages.format(NewWizardMessages.NewTypeWizardPage_warning_PreviewFeatureNotEnabled, BasicElementLabels.getJavaElementName(root.getJavaProject().getElementName())));
+	    		if (!JavaModelUtil.is16OrHigher(root.getJavaProject())) {
+	    			return new StatusInfo(IStatus.ERROR, Messages.format(NewWizardMessages.NewTypeWizardPage_warning_NotJDKCompliant2, new String[] {BasicElementLabels.getJavaElementName(root.getJavaProject().getElementName()), "16" })); //$NON-NLS-1$
 	    		}
 	    		try {
 		    	    // if findType(...) == null then Record is unavailable
diff --git a/pom.xml b/pom.xml
index b6694d8..23d954e 100644
--- a/pom.xml
+++ b/pom.xml
@@ -35,6 +35,10 @@
   <profiles>
     <profile>
       <id>build-individual-bundles</id>
+      <properties>
+      	<eclipse-p2-repo.url>http://download.eclipse.org/eclipse/updates/Y-builds</eclipse-p2-repo.url>
+      	<skipAPIAnalysis>true</skipAPIAnalysis>
+ 	  </properties>
       <repositories>
         <repository>
           <releases>