Bug 562147 - [15] Update bundle versions and dependency versions in
jdt.ui. Merge branch 'BETA_JAVA15'

Conflicts:
	org.eclipse.jdt.core.manipulation/META-INF/MANIFEST.MF
	org.eclipse.jdt.core.manipulation/pom.xml
	org.eclipse.jdt.ui.tests/META-INF/MANIFEST.MF
	org.eclipse.jdt.ui.tests/pom.xml
	org.eclipse.jdt.ui/META-INF/MANIFEST.MF
	org.eclipse.jdt.ui/pom.xml

Change-Id: Ica64e5d8740c0dfd173808dc38ce17ca79d7cbcb
Signed-off-by: Kalyan Prasad Tatavarthi <kalyan_prasad@in.ibm.com>
diff --git a/org.eclipse.jdt.astview/META-INF/MANIFEST.MF b/org.eclipse.jdt.astview/META-INF/MANIFEST.MF
index 3971f27..5182ac9 100644
--- a/org.eclipse.jdt.astview/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.astview/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.jdt.astview; singleton:=true
-Bundle-Version: 1.4.400.qualifier
+Bundle-Version: 1.4.500.qualifier
 Eclipse-SourceReferences: scm:git:git://git.eclipse.org/gitroot/jdt/eclipse.jdt.ui.git;path="org.eclipse.jdt.astview";tag=R4_4
 Bundle-Activator: org.eclipse.jdt.astview.ASTViewPlugin
 Bundle-Vendor: %providerName
diff --git a/org.eclipse.jdt.astview/pom.xml b/org.eclipse.jdt.astview/pom.xml
index 7d1858a..7c69da3 100644
--- a/org.eclipse.jdt.astview/pom.xml
+++ b/org.eclipse.jdt.astview/pom.xml
@@ -18,6 +18,6 @@
   </parent>
   <groupId>org.eclipse.jdt</groupId>
   <artifactId>org.eclipse.jdt.astview</artifactId>
-  <version>1.4.400-SNAPSHOT</version>
+  <version>1.4.500-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
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 85a8045..1036f6a 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
@@ -135,8 +135,13 @@
 
 public class ASTView extends ViewPart implements IShowInSource, IShowInTargetList {
 
-	static final int JLS_LATEST= AST.JLS14;
+	static final int JLS_LATEST= AST.JLS15;
 
+	private static final int JLS15= AST.JLS15;
+
+	/**
+	 * @deprecated to get rid of deprecation warnings in code
+	 */
 	private static final int JLS14= AST.JLS14;
 
 	/**
@@ -547,6 +552,7 @@
 				case JLS12:
 				case JLS13:
 				case JLS14:
+				case JLS15:
 					fCurrentASTLevel= level;
 			}
 		} catch (NumberFormatException e) {
@@ -1167,6 +1173,7 @@
 				new ASTLevelToggle("AST Level 1&2 (12)", JLS12), //$NON-NLS-1$
 				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$
 		};
 
 		fAddToTrayAction= new Action() {
diff --git a/org.eclipse.jdt.core.manipulation/.settings/.api_filters b/org.eclipse.jdt.core.manipulation/.settings/.api_filters
index d1062c8..82502db 100644
--- a/org.eclipse.jdt.core.manipulation/.settings/.api_filters
+++ b/org.eclipse.jdt.core.manipulation/.settings/.api_filters
@@ -1,48 +1,19 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <component id="org.eclipse.jdt.core.manipulation" version="2">
-    <resource path="META-INF/MANIFEST.MF">
-        <filter id="924844039">
-            <message_arguments>
-                <message_argument value="1.13.100"/>
-                <message_argument value="1.13.0"/>
-            </message_arguments>
-        </filter>
-        <filter comment="This is for Java14 work" id="924844039">
-            <message_arguments>
-                <message_argument value="1.13.150"/>
-                <message_argument value="1.13.100"/>
-            </message_arguments>
-        </filter>
-    </resource>
     <resource path="common/org/eclipse/jdt/core/manipulation/ImportReferencesCollector.java" type="org.eclipse.jdt.core.manipulation.ImportReferencesCollector">
-        <filter comment="For Java 13 Enable Preview support" id="640712815">
+        <filter id="576720909">
             <message_arguments>
-                <message_argument value="ASTNode"/>
+                <message_argument value="GenericVisitor"/>
                 <message_argument value="ImportReferencesCollector"/>
-                <message_argument value="getAST()"/>
-            </message_arguments>
-        </filter>
-        <filter comment="For Java 13 Enable Preview support" id="640712815">
-            <message_arguments>
-                <message_argument value="YieldStatement"/>
-                <message_argument value="ImportReferencesCollector"/>
-                <message_argument value="getExpression()"/>
             </message_arguments>
         </filter>
     </resource>
-    <resource path="core extension/org/eclipse/jdt/internal/core/manipulation/dom/ASTResolving.java" type="org.eclipse.jdt.internal.core.manipulation.dom.ASTResolving">
-        <filter comment="For Java 13 Enable Preview support" id="640712815">
+    <resource path="core extension/org/eclipse/jdt/internal/corext/codemanipulation/GetterSetterUtil.java" type="org.eclipse.jdt.internal.corext.codemanipulation.GetterSetterUtil">
+        <filter comment="This is a Java 15 preview feature" id="640712815">
             <message_arguments>
-                <message_argument value="SwitchCase"/>
-                <message_argument value="ASTResolving"/>
-                <message_argument value="expressions()"/>
-            </message_arguments>
-        </filter>
-        <filter comment="For Java 13 Enable Preview support" id="640712815">
-            <message_arguments>
-                <message_argument value="SwitchExpression"/>
-                <message_argument value="ASTResolving"/>
-                <message_argument value="getExpression()"/>
+                <message_argument value="IType"/>
+                <message_argument value="GetterSetterUtil"/>
+                <message_argument value="isRecord()"/>
             </message_arguments>
         </filter>
     </resource>
@@ -96,13 +67,6 @@
                 <message_argument value="typeParameters()"/>
             </message_arguments>
         </filter>
-        <filter comment="For Java 13 Enable Preview support" id="640712815">
-            <message_arguments>
-                <message_argument value="TextBlock"/>
-                <message_argument value="ASTFlattener"/>
-                <message_argument value="getEscapedValue()"/>
-            </message_arguments>
-        </filter>
     </resource>
     <resource path="core extension/org/eclipse/jdt/internal/corext/dom/GenericVisitor.java" type="org.eclipse.jdt.internal.corext.dom.GenericVisitor">
         <filter comment="For Java 13 Enable Preview support" id="642777099">
@@ -210,47 +174,4 @@
             </message_arguments>
         </filter>
     </resource>
-    <resource path="core extension/org/eclipse/jdt/internal/corext/dom/ScopeAnalyzer.java" type="org.eclipse.jdt.internal.corext.dom.ScopeAnalyzer">
-        <filter comment="For Java 13 Enable Preview feature" id="640712815">
-            <message_arguments>
-                <message_argument value="SwitchExpression"/>
-                <message_argument value="ScopeAnalyzer"/>
-                <message_argument value="getExpression()"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="core extension/org/eclipse/jdt/internal/corext/dom/ScopeAnalyzer.java" type="org.eclipse.jdt.internal.corext.dom.ScopeAnalyzer$ScopeAnalyzerVisitor">
-        <filter comment="For Java 13 Enable Preview feature" id="640712815">
-            <message_arguments>
-                <message_argument value="SwitchCase"/>
-                <message_argument value="ScopeAnalyzerVisitor"/>
-                <message_argument value="expressions()"/>
-            </message_arguments>
-        </filter>
-        <filter comment="For Java 13 Enable Preview feature" id="640712815">
-            <message_arguments>
-                <message_argument value="SwitchExpression"/>
-                <message_argument value="ScopeAnalyzerVisitor"/>
-                <message_argument value="getExpression()"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="core extension/org/eclipse/jdt/internal/corext/refactoring/Checks.java" type="org.eclipse.jdt.internal.corext.refactoring.Checks">
-        <filter comment="For Java 13 Enable Preview support" id="640712815">
-            <message_arguments>
-                <message_argument value="SwitchCase"/>
-                <message_argument value="Checks"/>
-                <message_argument value="expressions()"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="core extension/org/eclipse/jdt/internal/corext/refactoring/util/StatementAnalyzer.java" type="org.eclipse.jdt.internal.corext.refactoring.util.StatementAnalyzer">
-        <filter comment="For Java 13 Enable Preview feature" id="640712815">
-            <message_arguments>
-                <message_argument value="SwitchExpression"/>
-                <message_argument value="StatementAnalyzer"/>
-                <message_argument value="statements()"/>
-            </message_arguments>
-        </filter>
-    </resource>
 </component>
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 dc71ae2..521e571 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
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2019 IBM Corporation and others.
+ * Copyright (c) 2000, 2020 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -43,6 +43,7 @@
 import org.eclipse.jdt.core.dom.MethodRef;
 import org.eclipse.jdt.core.dom.MethodRefParameter;
 import org.eclipse.jdt.core.dom.Modifier;
+import org.eclipse.jdt.core.dom.ModuleQualifiedName;
 import org.eclipse.jdt.core.dom.Name;
 import org.eclipse.jdt.core.dom.NameQualifiedType;
 import org.eclipse.jdt.core.dom.NormalAnnotation;
@@ -69,7 +70,6 @@
 
 import org.eclipse.jdt.internal.ui.util.ASTHelper;
 
-
 /**
  * @since 1.10
  */
@@ -148,6 +148,14 @@
 
 	private void typeRefFound(Name node) {
 		if (node != null) {
+			if (node instanceof ModuleQualifiedName) {
+				ModuleQualifiedName mName = (ModuleQualifiedName)node;
+				if (mName.getName() != null) {
+					node= mName.getName();
+				} else {
+					return;
+				}
+			}
 			while (node.isQualifiedName()) {
 				node= ((QualifiedName) node).getQualifier();
 			}
@@ -156,6 +164,14 @@
 	}
 
 	private void possibleTypeRefFound(Name node) {
+		if (node instanceof ModuleQualifiedName) {
+			ModuleQualifiedName mName= (ModuleQualifiedName) node;
+			Name name= mName.getName();
+			if (name != null) {
+				possibleTypeRefFound(name);
+			}
+			return;
+		}
 		while (node.isQualifiedName()) {
 			node= ((QualifiedName) node).getQualifier();
 		}
@@ -228,9 +244,6 @@
 		return isAffected(node);
 	}
 
-	/*
-	 * @see ASTVisitor#visit(SimpleType)
-	 */
 	@Override
 	public boolean visit(SimpleType node) {
 		if (node.getAST().apiLevel() < AST.JLS10 || !node.isVar()) {
@@ -240,9 +253,6 @@
 		return false;
 	}
 
-	/*
-	 * @see ASTVisitor#visit(NameQualifiedType)
-	 */
 	@Override
 	public boolean visit(NameQualifiedType node) {
 		possibleTypeRefFound(node.getQualifier());
@@ -250,9 +260,6 @@
 		return false;
 	}
 
-	/*
-	 * @see ASTVisitor#visit(QualifiedType)
-	 */
 	@Override
 	public boolean visit(QualifiedType node) {
 		doVisitNode(node.getQualifier());
@@ -266,9 +273,16 @@
 		}
 	}
 
-	/*
-	 * @see ASTVisitor#visit(QualifiedName)
-	 */
+	@Override
+	public boolean visit(ModuleQualifiedName node) {
+		Name name = node.getName();
+		if (name != null) {
+			possibleTypeRefFound(node); // possible ref
+			possibleStaticImportFound(node);
+		}
+		return false;
+	}
+
 	@Override
 	public boolean visit(QualifiedName node) {
 		possibleTypeRefFound(node); // possible ref
@@ -276,17 +290,11 @@
 		return false;
 	}
 
-	/*
-	 * @see ASTVisitor#visit(ImportDeclaration)
-	 */
 	@Override
 	public boolean visit(ImportDeclaration node) {
 		return false;
 	}
 
-	/*
-	 * @see ASTVisitor#visit(PackageDeclaration)
-	 */
 	@Override
 	public boolean visit(PackageDeclaration node) {
 		doVisitNode(node.getJavadoc());
@@ -313,9 +321,6 @@
 		return false;
 	}
 
-	/*
-	 * @see ASTVisitor#visit(ThisExpression)
-	 */
 	@Override
 	public boolean visit(ThisExpression node) {
 		typeRefFound(node.getQualifier());
@@ -342,9 +347,6 @@
 		}
 	}
 
-	/*
-	 * @see ASTVisitor#visit(ClassInstanceCreation)
-	 */
 	@Override
 	public boolean visit(ClassInstanceCreation node) {
 		doVisitChildren(node.typeArguments());
@@ -357,9 +359,6 @@
 		return false;
 	}
 
-	/*
-	 * @see ASTVisitor#endVisit(MethodInvocation)
-	 */
 	@Override
 	public boolean visit(MethodInvocation node) {
 		evalQualifyingExpression(node.getExpression(), node.getName());
@@ -411,9 +410,6 @@
 		return false;
 	}
 
-	/*
-	 * @see ASTVisitor#visit(SuperConstructorInvocation)
-	 */
 	@Override
 	public boolean visit(SuperConstructorInvocation node) {
 		if (!isAffected(node)) {
@@ -426,18 +422,12 @@
 		return false;
 	}
 
-	/*
-	 * @see ASTVisitor#visit(FieldAccess)
-	 */
 	@Override
 	public boolean visit(FieldAccess node) {
 		evalQualifyingExpression(node.getExpression(), node.getName());
 		return false;
 	}
 
-	/*
-	 * @see ASTVisitor#visit(SimpleName)
-	 */
 	@Override
 	public boolean visit(SimpleName node) {
 		// if the call gets here, it can only be a variable reference
@@ -465,9 +455,6 @@
 		return false;
 	}
 
-	/*
-	 * @see ASTVisitor#visit(TypeDeclaration)
-	 */
 	@Override
 	public boolean visit(TypeDeclaration node) {
 		if (!isAffected(node)) {
@@ -476,9 +463,6 @@
 		return true;
 	}
 
-	/*
-	 * @see ASTVisitor#visit(MethodDeclaration)
-	 */
 	@Override
 	public boolean visit(MethodDeclaration node) {
 		if (!isAffected(node)) {
@@ -538,7 +522,15 @@
 					typeRefFound((Name) first);
 				} else if ("@see".equals(tagName) || "@link".equals(tagName) || "@linkplain".equals(tagName)) {  //$NON-NLS-1$//$NON-NLS-2$ //$NON-NLS-3$
 					Name name= (Name) first;
-					possibleTypeRefFound(name);
+					if (name instanceof ModuleQualifiedName) {
+						ModuleQualifiedName mqName = (ModuleQualifiedName)name;
+						Name iname = mqName.getName();
+						if (iname != null) {
+							possibleTypeRefFound(iname);
+						}
+					} else {
+						possibleTypeRefFound(name);
+					}
 				}
 				idx++;
 			}
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 952f6da..2c4039b 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
@@ -32,7 +32,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#JLS14 API level 14} or higher</li>
+ *    <li>the {@link AST#apiLevel() AST API level} is {@link AST#JLS15 API level 15} 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/ui/javaeditor/SemanticHighlightingsCore.java b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/javaeditor/SemanticHighlightingsCore.java
index cfaf8bb..d072bac 100644
--- a/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/javaeditor/SemanticHighlightingsCore.java
+++ b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/javaeditor/SemanticHighlightingsCore.java
@@ -176,6 +176,11 @@
 	public static final String RECORD_KEYWORD= "recordKeyword"; //$NON-NLS-1$
 
 	/**
+	 * A named preference part that controls the highlighting of 'sealed' and 'non-sealed' keywords.
+	 */
+	public static final String SEALED_KEYWORDS= "sealedKeywords"; //$NON-NLS-1$
+
+	/**
 	 * Do not instantiate
 	 */
 	private SemanticHighlightingsCore() {
diff --git a/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/text/correction/CorrectionMessages.java b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/text/correction/CorrectionMessages.java
index 082801e..631cd65 100644
--- a/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/text/correction/CorrectionMessages.java
+++ b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/text/correction/CorrectionMessages.java
@@ -156,6 +156,9 @@
 	public static String RenameRefactoringProposal_additionalInfo;
 	public static String RenameRefactoringProposal_name;
 
+	public static String ModifierCorrectionSubProcessor_changemodifierto_final_description;
+	public static String ModifierCorrectionSubProcessor_changemodifierto_sealed_description;
+	public static String ModifierCorrectionSubProcessor_changemodifierto_nonsealed_description;
 	public static String ModifierCorrectionSubProcessor_changemodifiertoabstract_description;
 	public static String ModifierCorrectionSubProcessor_changemodifiertostatic_description;
 	public static String ModifierCorrectionSubProcessor_changemodifiertononstatic_description;
diff --git a/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/text/correction/CorrectionMessages.properties b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/text/correction/CorrectionMessages.properties
index aa40a5f..d173a5a 100644
--- a/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/text/correction/CorrectionMessages.properties
+++ b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/text/correction/CorrectionMessages.properties
@@ -7,7 +7,7 @@
 # https://www.eclipse.org/legal/epl-2.0/
 #
 # SPDX-License-Identifier: EPL-2.0
-#
+# 
 # Contributors:
 #     IBM Corporation - initial API and implementation
 #     Benjamin Muskalla <b.muskalla@gmx.net> - [quick fix] Quick fix for missing synchronized modifier - https://bugs.eclipse.org/bugs/show_bug.cgi?id=245250
@@ -159,6 +159,9 @@
 RenameRefactoringProposal_additionalInfo=Start the Rename refactoring
 RenameRefactoringProposal_name=Rename in workspace
 
+ModifierCorrectionSubProcessor_changemodifierto_final_description=Change ''{0}'' to ''final''
+ModifierCorrectionSubProcessor_changemodifierto_sealed_description=Change ''{0}'' to ''sealed''
+ModifierCorrectionSubProcessor_changemodifierto_nonsealed_description=Change ''{0}'' to ''non-sealed''
 ModifierCorrectionSubProcessor_changemodifiertoabstract_description=Change ''{0}'' to ''abstract''
 ModifierCorrectionSubProcessor_changemodifiertostatic_description=Change ''{0}'' to ''static''
 ModifierCorrectionSubProcessor_changemodifiertodefault_description=Change ''{0}'' to ''default''
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 4b87ce2..3d397ae 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
@@ -15,9 +15,11 @@
 
 import org.eclipse.jdt.core.dom.AST;
 import org.eclipse.jdt.core.dom.ASTNode;
+import org.eclipse.jdt.core.dom.Modifier;
 
 public class ASTHelper {
 
+	@SuppressWarnings("deprecation")
 	private static boolean isNodeTypeSupportedInAST(AST ast, int nodeType) {
 		switch (nodeType) {
 			case ASTNode.SWITCH_CASE:
@@ -25,8 +27,23 @@
 			case ASTNode.YIELD_STATEMENT:
 				return ast.apiLevel() >= AST.JLS14;
 			case ASTNode.TEXT_BLOCK:
+				return ast.apiLevel() >= AST.JLS15;
 			case ASTNode.RECORD_DECLARATION:
+			case ASTNode.INSTANCEOF_EXPRESSION:
 				return ast.isPreviewEnabled();
+			default:
+				break;
+		}
+		return true;
+	}
+
+	private static boolean isModifierSupportedInAST(AST ast, int modifier) {
+		switch (modifier) {
+			case Modifier.SEALED:
+			case Modifier.NON_SEALED:
+				return ast.isPreviewEnabled();
+			default:
+				break;
 		}
 		return true;
 	}
@@ -50,4 +67,9 @@
 	public static boolean isRecordDeclarationNodeSupportedInAST(AST ast) {
 		return isNodeTypeSupportedInAST(ast, ASTNode.RECORD_DECLARATION);
 	}
+
+	public static boolean isSealedTypeSupportedInAST(AST ast) {
+		return isModifierSupportedInAST(ast, Modifier.SEALED);
+	}
+
 }
diff --git a/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/core/manipulation/search/OccurrencesFinder.java b/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/core/manipulation/search/OccurrencesFinder.java
index 419c174..3906a65 100644
--- a/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/core/manipulation/search/OccurrencesFinder.java
+++ b/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/core/manipulation/search/OccurrencesFinder.java
@@ -33,6 +33,7 @@
 import org.eclipse.jdt.core.dom.ImportDeclaration;
 import org.eclipse.jdt.core.dom.MethodInvocation;
 import org.eclipse.jdt.core.dom.Modifier;
+import org.eclipse.jdt.core.dom.ModuleQualifiedName;
 import org.eclipse.jdt.core.dom.Name;
 import org.eclipse.jdt.core.dom.NameQualifiedType;
 import org.eclipse.jdt.core.dom.NodeFinder;
@@ -160,6 +161,12 @@
 		return !addUsage(node, binding);
 	}
 
+	@Override
+	public boolean visit(ModuleQualifiedName node) {
+		node.resolveBinding();
+		return true;
+	}
+
 	private static boolean isStaticImport(ASTNode node) {
 		if (!(node instanceof QualifiedName))
 			return false;
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 6f2ba9f..42a35dc 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
@@ -1828,6 +1828,17 @@
 				this.fBuffer.append(" ");//$NON-NLS-1$
 			}
 		}
+		if (ASTHelper.isSealedTypeSupportedInAST(node.getAST()) && !node.permittedTypes().isEmpty()) {
+			this.fBuffer.append("permits ");//$NON-NLS-1$
+			for (Iterator<Type> it = node.permittedTypes().iterator(); it.hasNext(); ) {
+				Type t = it.next();
+				t.accept(this);
+				if (it.hasNext()) {
+					this.fBuffer.append(", ");//$NON-NLS-1$
+				}
+			}
+			this.fBuffer.append(" ");//$NON-NLS-1$
+		}
 		this.fBuffer.append("{");//$NON-NLS-1$
 		BodyDeclaration prev= null;
 		for (Iterator<BodyDeclaration> it= node.bodyDeclarations().iterator(); it.hasNext();) {
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 457580f..c7d27f9 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
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2016, 2019 IBM Corporation and others.
+ * Copyright (c) 2016, 2020 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -21,7 +21,7 @@
 	 * This value is subject to change with every release. JDT-UI-internal code typically supports
 	 * the latest available {@link AST#apiLevel() AST level} exclusively.
 	 */
-	public static final int SHARED_AST_LEVEL= AST.JLS14;
+	public static final int SHARED_AST_LEVEL= AST.JLS15;
 
 	public static final boolean SHARED_AST_STATEMENT_RECOVERY= true;
 
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 3a9d596..be08c69 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
@@ -80,7 +80,7 @@
 	 */
 	public static final String VERSION_LATEST;
 	static {
-		VERSION_LATEST= JavaCore.VERSION_14; // make sure it is not inlined
+		VERSION_LATEST= JavaCore.VERSION_15; // make sure it is not inlined
 	}
 
 	public static final int VALIDATE_EDIT_CHANGED_CONTENT= 10003;
@@ -833,6 +833,10 @@
 		return !isVersionLessThan(compliance, JavaCore.VERSION_14);
 	}
 
+	public static boolean is15OrHigher(String compliance) {
+		return !isVersionLessThan(compliance, JavaCore.VERSION_15);
+	}
+
 	/**
 	 * Checks if the given project or workspace has source compliance 1.4 or greater.
 	 *
@@ -930,6 +934,17 @@
 		return is14OrHigher(getSourceCompliance(project));
 	}
 
+	/**
+	 * Checks if the given project or workspace has source compliance 14 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 15 or
+	 *         greater.
+	 */
+	public static boolean is15OrHigher(IJavaProject project) {
+		return is15OrHigher(getSourceCompliance(project));
+	}
+
 	private static String getSourceCompliance(IJavaProject project) {
 		return project != null ? project.getOption(JavaCore.COMPILER_SOURCE, true) : JavaCore.getOption(JavaCore.COMPILER_SOURCE);
 	}
@@ -980,6 +995,8 @@
 		String version= vMInstall.getJavaVersion();
 		if (version == null) {
 			return defaultCompliance;
+		} else if (version.startsWith(JavaCore.VERSION_15)) {
+			return JavaCore.VERSION_15;
 		} else if (version.startsWith(JavaCore.VERSION_14)) {
 			return JavaCore.VERSION_14;
 		} else if (version.startsWith(JavaCore.VERSION_13)) {
@@ -1022,7 +1039,9 @@
 
 		// fallback:
 		String desc= executionEnvironment.getId();
-		if (desc.indexOf(JavaCore.VERSION_14) != -1) {
+		if (desc.indexOf(JavaCore.VERSION_15) != -1) {
+			return JavaCore.VERSION_15;
+		} else if (desc.indexOf(JavaCore.VERSION_14) != -1) {
 			return JavaCore.VERSION_14;
 		} else if (desc.indexOf(JavaCore.VERSION_13) != -1) {
 			return JavaCore.VERSION_13;
diff --git a/org.eclipse.jdt.junit.core/META-INF/MANIFEST.MF b/org.eclipse.jdt.junit.core/META-INF/MANIFEST.MF
index 305a4fc..6a0d9bf 100644
--- a/org.eclipse.jdt.junit.core/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.junit.core/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.jdt.junit.core;singleton:=true
-Bundle-Version: 3.10.800.qualifier
+Bundle-Version: 3.10.900.qualifier
 Bundle-Activator: org.eclipse.jdt.internal.junit.JUnitCorePlugin
 Bundle-ActivationPolicy: lazy
 Bundle-Vendor: %providerName
diff --git a/org.eclipse.jdt.junit.core/pom.xml b/org.eclipse.jdt.junit.core/pom.xml
index 9a258ab..20c47d3 100644
--- a/org.eclipse.jdt.junit.core/pom.xml
+++ b/org.eclipse.jdt.junit.core/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-  Copyright (c) 2012, 2019 Eclipse Foundation and others.
+  Copyright (c) 2012, 2020 Eclipse Foundation and others.
   All rights reserved. This program and the accompanying materials
   are made available under the terms of the Eclipse Distribution License v1.0
   which accompanies this distribution, and is available at
@@ -18,6 +18,6 @@
   </parent>
   <groupId>org.eclipse.jdt</groupId>
   <artifactId>org.eclipse.jdt.junit.core</artifactId>
-  <version>3.10.800-SNAPSHOT</version>
+  <version>3.10.900-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
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 2bda343..fdea73f 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.JLS14);
+			ASTParser parser= ASTParser.newParser(AST.JLS15);
 			/* 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 b893e5d..c1236e3 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.JLS14);
+			ASTParser parser= ASTParser.newParser(AST.JLS15);
 			if (type.getCompilationUnit() != null) {
 				parser.setSource(type.getCompilationUnit());
 			} else if (!isAvailable(type.getSourceRange())) { // class file with no source
diff --git a/org.eclipse.jdt.junit/forceQualifierUpdate.txt b/org.eclipse.jdt.junit/forceQualifierUpdate.txt
index a3a9504..2cc498c 100644
--- a/org.eclipse.jdt.junit/forceQualifierUpdate.txt
+++ b/org.eclipse.jdt.junit/forceQualifierUpdate.txt
@@ -1,8 +1,9 @@
-# To force a version qualifier update, add the bug here
-Bug 549784: Comparator errors in Y20190801-0900
-Bug 545576: [12] Push Java 12 work to master
-Bug 509973 - Comparator errors in I20170105-0320
-Bug 539509 - Comparator errors in jdt.ui bundles in I20180926-0830
-Adopt change of IASTSharedValues.SHARED_AST_LEVEL to 10
-Comparator errors in jdt.ui bundles in Y20200127-1055
+# To force a version qualifier update, add the bug here

+Bug 549784: Comparator errors in Y20190801-0900

+Bug 545576: [12] Push Java 12 work to master

+Bug 509973 - Comparator errors in I20170105-0320

+Bug 539509 - Comparator errors in jdt.ui bundles in I20180926-0830

+Adopt change of IASTSharedValues.SHARED_AST_LEVEL to 10

+Comparator errors in jdt.ui bundles in Y20200127-1055

+Bug 564399 - [Comparator] Comparator Errors in Y-build Y20200617-2350

 Bug 566471 - I20200828-0150 - Comparator Errors Found
\ No newline at end of file
diff --git a/org.eclipse.jdt.text.tests/forceQualifierUpdate.txt b/org.eclipse.jdt.text.tests/forceQualifierUpdate.txt
index 6cb5a70..9ff2be4 100644
--- a/org.eclipse.jdt.text.tests/forceQualifierUpdate.txt
+++ b/org.eclipse.jdt.text.tests/forceQualifierUpdate.txt
@@ -1,7 +1,8 @@
-# To force a version qualifier update, add the bug here
-Bug 549784: Comparator errors in Y20190801-0900
-Bug 545576: [12] Push Java 12 work to master
-BETA_JAVA9 merge into R4_7_maintenance
-Adopt change of IASTSharedValues.SHARED_AST_LEVEL to 10
-Bug 539509 - Comparator errors in jdt.ui bundles in I20180926-0830
-Comparator errors in jdt.ui bundles in Y20200127-1055
+# To force a version qualifier update, add the bug here

+Bug 549784: Comparator errors in Y20190801-0900

+Bug 545576: [12] Push Java 12 work to master

+BETA_JAVA9 merge into R4_7_maintenance

+Adopt change of IASTSharedValues.SHARED_AST_LEVEL to 10

+Bug 539509 - Comparator errors in jdt.ui bundles in I20180926-0830

+Comparator errors in jdt.ui bundles in Y20200127-1055

+Bug 564399 - [Comparator] Comparator Errors in Y-build Y20200617-2350

diff --git a/org.eclipse.jdt.ui.tests.refactoring/META-INF/MANIFEST.MF b/org.eclipse.jdt.ui.tests.refactoring/META-INF/MANIFEST.MF
index 918a737..67e2c81 100644
--- a/org.eclipse.jdt.ui.tests.refactoring/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.ui.tests.refactoring/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %Plugin.name
 Bundle-SymbolicName: org.eclipse.jdt.ui.tests.refactoring; singleton:=true
-Bundle-Version: 3.13.1100.qualifier
+Bundle-Version: 3.13.1200.qualifier
 Bundle-Activator: org.eclipse.jdt.ui.tests.refactoring.infra.RefactoringTestPlugin
 Bundle-ActivationPolicy: lazy
 Bundle-Vendor: %Plugin.providerName
diff --git a/org.eclipse.jdt.ui.tests.refactoring/forceQualifierUpdate.txt b/org.eclipse.jdt.ui.tests.refactoring/forceQualifierUpdate.txt
index b05563c..4ab16f8 100644
--- a/org.eclipse.jdt.ui.tests.refactoring/forceQualifierUpdate.txt
+++ b/org.eclipse.jdt.ui.tests.refactoring/forceQualifierUpdate.txt
@@ -1,7 +1,8 @@
-# To force a version qualifier update, add the bug here
-Bug 545576: [12] Push Java 12 work to master
-Bug 530709 - Comparator errors in jdt debug and jdt ui in I20180204-2000
-Bug 539509 - Comparator errors in jdt.ui bundles in I20180926-0830
-Adopt change of IASTSharedValues.SHARED_AST_LEVEL to 10
-Comparator errors in jdt.ui bundles in Y20200127-1055
+# To force a version qualifier update, add the bug here

+Bug 545576: [12] Push Java 12 work to master

+Bug 530709 - Comparator errors in jdt debug and jdt ui in I20180204-2000

+Bug 539509 - Comparator errors in jdt.ui bundles in I20180926-0830

+Adopt change of IASTSharedValues.SHARED_AST_LEVEL to 10

+Comparator errors in jdt.ui bundles in Y20200127-1055

+Bug 564399 - [Comparator] Comparator Errors in Y-build Y20200617-2350

 Bug 566471 - I20200828-0150 - Comparator Errors Found
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests.refactoring/pom.xml b/org.eclipse.jdt.ui.tests.refactoring/pom.xml
index c4bcda9..34d13b9 100644
--- a/org.eclipse.jdt.ui.tests.refactoring/pom.xml
+++ b/org.eclipse.jdt.ui.tests.refactoring/pom.xml
@@ -19,7 +19,7 @@
   </parent>
   <groupId>org.eclipse.jdt</groupId>
   <artifactId>org.eclipse.jdt.ui.tests.refactoring</artifactId>
-  <version>3.13.1100-SNAPSHOT</version>
+  <version>3.13.1200-SNAPSHOT</version>
   <packaging>eclipse-test-plugin</packaging>
   <properties>
     <testSuite>${project.artifactId}</testSuite>
diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/rules/Java15Setup.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/rules/Java15Setup.java
new file mode 100644
index 0000000..f9c0fe2
--- /dev/null
+++ b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/rules/Java15Setup.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 Java15Setup 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_15(project, true);
+	}
+}
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 64969d7..fe98e1c 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,6 @@
  *******************************************************************************/
 package org.eclipse.jdt.ui.tests.refactoring.rules;
 
-public class JavaPreviewSetup extends Java14Setup {
+public class JavaPreviewSetup extends Java15Setup {
 
 }
diff --git a/org.eclipse.jdt.ui.tests/forceQualifierUpdate.txt b/org.eclipse.jdt.ui.tests/forceQualifierUpdate.txt
index 18e92a1..4ccf97d 100644
--- a/org.eclipse.jdt.ui.tests/forceQualifierUpdate.txt
+++ b/org.eclipse.jdt.ui.tests/forceQualifierUpdate.txt
@@ -1,4 +1,5 @@
-# To force a version qualifier update, add the bug here
-Bug 545576: [12] Push Java 12 work to master
-Bug 509973 - Comparator errors in I20170105-0320
-Bug 534597 - Unanticipated comparator errors in I20180511-2000
\ No newline at end of file
+# To force a version qualifier update, add the bug here

+Bug 545576: [12] Push Java 12 work to master

+Bug 509973 - Comparator errors in I20170105-0320

+Bug 534597 - Unanticipated comparator errors in I20180511-2000

+Bug 564399 - [Comparator] Comparator Errors in Y-build Y20200617-2350
\ No newline at end of file
diff --git a/org.eclipse.jdt.ui.tests/pom.xml b/org.eclipse.jdt.ui.tests/pom.xml
index d568184..2a838e6 100644
--- a/org.eclipse.jdt.ui.tests/pom.xml
+++ b/org.eclipse.jdt.ui.tests/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-  Copyright (c) 2012, 2019 Eclipse Foundation and others.
+  Copyright (c) 2012, 2020 Eclipse Foundation and others.
   All rights reserved. This program and the accompanying materials
   are made available under the terms of the Eclipse Distribution License v1.0
   which accompanies this distribution, and is available at
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 2afa6c9..c10d616 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
@@ -103,6 +103,7 @@
 	public static final IPath RT_STUBS_12= new Path("testresources/rtstubs12.jar");
 	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 JUNIT_SRC_381= new Path("testresources/junit381-noUI-src.zip");
 	public static final String JUNIT_SRC_ENCODING= "ISO-8859-1";
 
@@ -281,6 +282,24 @@
 	}
 
 	/**
+	 * Sets the compiler options to 13 for the given project.
+	 *
+	 * @param project the java project
+	 * @param enable_preview_feature sets enable-preview compliance project option based on the
+	 *            value specified.
+	 * @since 3.20
+	 */
+	public static void set15CompilerOptions(IJavaProject project, boolean enable_preview_feature) {
+		Map<String, String> options= project.getOptions(false);
+		set15_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
@@ -379,6 +398,15 @@
 	}
 
 	/**
+	 * Sets the compiler options to 14.
+	 *
+	 * @param options the compiler options to configure
+	 */
+	public static void set15_CompilerOptions(Map<String, String> options) {
+		JavaCore.setComplianceOptions(JavaCore.VERSION_15, options);
+	}
+
+	/**
 	 * Sets the compiler options to 1.8
 	 *
 	 * @param options the compiler options to configure
@@ -890,6 +918,12 @@
 		return addLibrary(jproject, rtJarPath[0], rtJarPath[1], rtJarPath[2]);
 	}
 
+	public static IPackageFragmentRoot addRTJar_15(IJavaProject jproject, boolean enable_preview_feature) throws CoreException {
+		IPath[] rtJarPath= findRtJar(RT_STUBS15);
+		set15CompilerOptions(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_15.jar b/org.eclipse.jdt.ui.tests/testresources/rtstubs_15.jar
new file mode 100644
index 0000000..37051d1
--- /dev/null
+++ b/org.eclipse.jdt.ui.tests/testresources/rtstubs_15.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 3ac5340..8142119 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
@@ -35,7 +35,7 @@
 	protected boolean fHaveSource= true;
 
 	protected String getBindingLabel(IJavaElement elem, long flags) {
-		ASTParser parser= ASTParser.newParser(AST.JLS14);
+		ASTParser parser= ASTParser.newParser(AST.JLS15);
 		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 226c6cb..57d4a03 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
@@ -464,7 +464,7 @@
 					this.ast= unit;
 				}
 			}
-			ASTParser parser= ASTParser.newParser(AST.JLS14);
+			ASTParser parser= ASTParser.newParser(AST.JLS15);
 			parser.setResolveBindings(true);
 			parser.setBindingsRecovery(true);
 			parser.setProject(javaProject);
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/rules/Java15ProjectTestSetup.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/rules/Java15ProjectTestSetup.java
new file mode 100644
index 0000000..7ed20a7
--- /dev/null
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/core/rules/Java15ProjectTestSetup.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 Java15ProjectTestSetup extends ProjectTestSetup {
+
+	public static final String PROJECT_NAME15= "TestSetupProject15";
+
+	private boolean enable_preview_feature;
+
+	@Override
+	public IJavaProject getProject() {
+		IProject project= ResourcesPlugin.getWorkspace().getRoot().getProject(PROJECT_NAME15);
+		return JavaCore.create(project);
+	}
+
+	@Override
+	public IClasspathEntry[] getDefaultClasspath() throws CoreException {
+		IPath[] rtJarPath= JavaProjectHelper.findRtJar(JavaProjectHelper.RT_STUBS15);
+		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 Java15ProjectTestSetup( 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_NAME15, "bin");
+		javaProject.setRawClasspath(getDefaultClasspath(), null);
+		JavaProjectHelper.set15CompilerOptions(javaProject, enable_preview_feature);
+		return javaProject;
+	}
+
+}
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/GenerateGettersSettersTest14.java
index 47c322e..76ee6aa 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/GenerateGettersSettersTest14.java
@@ -87,7 +87,7 @@
 	@Test
 	public void testBug561413() throws Exception {
 
-		runOperation(fRecordA.getFields(), NOFIELDS, NOFIELDS);
+		runOperation(fRecordA.getRecordComponents(), NOFIELDS, NOFIELDS);
 
 		String expected= "public record A(int x, String y) {\r\n" +
 				"\r\n" +
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/SourceTestCase14.java
index 89ea441..ad51183 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/SourceTestCase14.java
@@ -106,7 +106,7 @@
 	public void setUp() throws CoreException {
 
 		fJavaProject= JavaProjectHelper.createJavaProject("DummyProject", "bin");
-		assertNotNull(JavaProjectHelper.addRTJar_14(fJavaProject, true));
+		assertNotNull(JavaProjectHelper.addRTJar_15(fJavaProject, true));
 
 		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 8bf62be..8d80042 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
@@ -10041,7 +10041,7 @@
 		assertRefactoringHasNoChange(new ICompilationUnit[] { cu1 });
 
 		// When
-		ASTParser parser= ASTParser.newParser(AST.JLS14);
+		ASTParser parser= ASTParser.newParser(AST.JLS15);
 		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/JavadocQuickFixTestPreview.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/JavadocQuickFixTestPreview.java
index c2f6b2b..b04ae89 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.Java14ProjectTestSetup;
+import org.eclipse.jdt.ui.tests.core.rules.Java15ProjectTestSetup;
 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 Java14ProjectTestSetup(true);
+    public ProjectTestSetup projectsetup = new Java15ProjectTestSetup(true);
 
 	private IJavaProject fJProject1;
 
@@ -63,35 +63,34 @@
 		options.put(JavaCore.COMPILER_PB_MISSING_JAVADOC_COMMENTS_OVERRIDING, JavaCore.ENABLED);
 		JavaCore.setOptions(options);
 
-		StringBuilder comment= new StringBuilder();
-		comment.append("/**\n");
-		comment.append(" * A record comment.\n");
-		comment.append(" *\n");
-		comment.append(" * ${tags}\n");
-		comment.append(" */");
-		String res= comment.toString();
+		String res= ""
+					+ "/**\n"
+					+ " * A record comment.\n"
+					+ " *\n"
+					+ " * ${tags}\n"
+					+ " */";
 		StubUtility.setCodeTemplate(CodeTemplateContextType.TYPECOMMENT_ID, res, null);
 
 		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
-		JavaProjectHelper.set14CompilerOptions(fJProject1, true);
-		JavaProjectHelper.addRequiredModularProject(fJProject1, projectSetup.getProject());
+		JavaProjectHelper.set15CompilerOptions(fJProject1, true);
+		JavaProjectHelper.addRequiredModularProject(fJProject1, projectsetup.getProject());
 
 		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
 	}
 
 	@After
 	public void tearDown() throws Exception {
-		JavaProjectHelper.clear(fJProject1, projectSetup.getDefaultClasspath());
+		JavaProjectHelper.clear(fJProject1, projectsetup.getDefaultClasspath());
 	}
 
 	@Test
 	public void testMissingRecordComment() throws Exception {
 		IPackageFragment pack= fSourceFolder.createPackageFragment("test", false, null);
-		StringBuilder buf= new StringBuilder();
-		buf.append("package test;\n\n");
-		buf.append("public record Rec1(int a, int b) {\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack.createCompilationUnit("Rec1.java", buf.toString(), false, null);
+		String test= ""
+					+ "package test;\n\n"
+					+ "public record Rec1(int a, int b) {\n"
+					+ "}\n";
+		ICompilationUnit cu= pack.createCompilationUnit("Rec1.java", test, false, null);
 
 		CompilationUnit astRoot= getASTRoot(cu);
 		ArrayList<IJavaCompletionProposal> proposals= collectCorrections(cu, astRoot);
@@ -102,29 +101,28 @@
 		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
 		String preview1= getPreviewContent(proposal);
 
-		buf= new StringBuilder();
-		buf.append("package test;\n\n");
-		buf.append("/**\n");
-		buf.append(" * A record comment.\n");
-		buf.append(" *\n");
-		buf.append(" * @param a\n");
-		buf.append(" * @param b\n");
-		buf.append(" */\n");
-		buf.append("public record Rec1(int a, int b) {\n");
-		buf.append("}\n");
+		String expected= ""
+						+ "package test;\n\n"
+						+ "/**\n"
+						+ " * A record comment.\n"
+						+ " *\n"
+						+ " * @param a\n"
+						+ " * @param b\n"
+						+ " */\n"
+						+ "public record Rec1(int a, int b) {\n"
+						+ "}\n";
 
-		String expected= buf.toString();
 		assertEqualString(preview1, expected);
 	}
 
 	@Test
 	public void testMissingRecordCommentWithTypeParam() throws Exception {
 		IPackageFragment pack= fSourceFolder.createPackageFragment("test", false, null);
-		StringBuilder buf= new StringBuilder();
-		buf.append("package test;\n\n");
-		buf.append("public record Rec1<N>(int a, int b) {\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack.createCompilationUnit("Rec1.java", buf.toString(), false, null);
+		String test= ""
+					+ "package test;\n\n"
+					+ "public record Rec1<N>(int a, int b) {\n"
+					+ "}\n";
+		ICompilationUnit cu= pack.createCompilationUnit("Rec1.java", test, false, null);
 
 		CompilationUnit astRoot= getASTRoot(cu);
 		ArrayList<IJavaCompletionProposal> proposals= collectCorrections(cu, astRoot);
@@ -135,35 +133,34 @@
 		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
 		String preview1= getPreviewContent(proposal);
 
-		buf= new StringBuilder();
-		buf.append("package test;\n\n");
-		buf.append("/**\n");
-		buf.append(" * A record comment.\n");
-		buf.append(" *\n");
-		buf.append(" * @param <N>\n");
-		buf.append(" * @param a\n");
-		buf.append(" * @param b\n");
-		buf.append(" */\n");
-		buf.append("public record Rec1<N>(int a, int b) {\n");
-		buf.append("}\n");
+		String expected= ""
+						+ "package test;\n\n"
+						+ "/**\n"
+						+ " * A record comment.\n"
+						+ " *\n"
+						+ " * @param <N>\n"
+						+ " * @param a\n"
+						+ " * @param b\n"
+						+ " */\n"
+						+ "public record Rec1<N>(int a, int b) {\n"
+						+ "}\n";
 
-		String expected= buf.toString();
 		assertEqualString(preview1, expected);
 	}
 
 	@Test
 	public void testMissingRecordCommentTag() throws Exception {
 		IPackageFragment pack= fSourceFolder.createPackageFragment("test", false, null);
-		StringBuilder buf= new StringBuilder();
-		buf.append("package test;\n\n");
-		buf.append("/**\n");
-		buf.append(" * A record comment.\n");
-		buf.append(" *\n");
-		buf.append(" * @param a\n");
-		buf.append(" */\n");
-		buf.append("public record Rec1(int a, int b) {\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack.createCompilationUnit("Rec1.java", buf.toString(), false, null);
+		String test= ""
+					+ "package test;\n\n"
+					+ "/**\n"
+					+ " * A record comment.\n"
+					+ " *\n"
+					+ " * @param a\n"
+					+ " */\n"
+					+ "public record Rec1(int a, int b) {\n"
+					+ "}\n";
+		ICompilationUnit cu= pack.createCompilationUnit("Rec1.java", test, false, null);
 
 		CompilationUnit astRoot= getASTRoot(cu);
 		ArrayList<IJavaCompletionProposal> proposals= collectCorrections(cu, astRoot);
@@ -174,18 +171,17 @@
 		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
 		String preview1= getPreviewContent(proposal);
 
-		buf= new StringBuilder();
-		buf.append("package test;\n\n");
-		buf.append("/**\n");
-		buf.append(" * A record comment.\n");
-		buf.append(" *\n");
-		buf.append(" * @param a\n");
-		buf.append(" * @param b \n");
-		buf.append(" */\n");
-		buf.append("public record Rec1(int a, int b) {\n");
-		buf.append("}\n");
+		String expected= ""
+						+ "package test;\n\n"
+						+ "/**\n"
+						+ " * A record comment.\n"
+						+ " *\n"
+						+ " * @param a\n"
+						+ " * @param b \n"
+						+ " */\n"
+						+ "public record Rec1(int a, int b) {\n"
+						+ "}\n";
 
-		String expected= buf.toString();
 		assertEqualString(preview1, expected);
 	}
 
@@ -193,15 +189,15 @@
 	@Test
 	public void testMissingAllRecordCommentTags() throws Exception {
 		IPackageFragment pack= fSourceFolder.createPackageFragment("test", false, null);
-		StringBuilder buf= new StringBuilder();
-		buf.append("package test;\n\n");
-		buf.append("/**\n");
-		buf.append(" * A record comment.\n");
-		buf.append(" *\n");
-		buf.append(" */\n");
-		buf.append("public record Rec1(int a, int b) {\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack.createCompilationUnit("Rec1.java", buf.toString(), false, null);
+		String test= ""
+					+ "package test;\n\n"
+					+ "/**\n"
+					+ " * A record comment.\n"
+					+ " *\n"
+					+ " */\n"
+					+ "public record Rec1(int a, int b) {\n"
+					+ "}\n";
+		ICompilationUnit cu= pack.createCompilationUnit("Rec1.java", test, false, null);
 
 		CompilationUnit astRoot= getASTRoot(cu);
 		ArrayList<IJavaCompletionProposal> proposals= collectCorrections(cu, astRoot, 2);
@@ -212,35 +208,34 @@
 		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(1);
 		String preview1= getPreviewContent(proposal);
 
-		buf= new StringBuilder();
-		buf.append("package test;\n\n");
-		buf.append("/**\n");
-		buf.append(" * A record comment.\n");
-		buf.append(" * @param a \n");
-		buf.append(" * @param b \n");
-		buf.append(" *\n");
-		buf.append(" */\n");
-		buf.append("public record Rec1(int a, int b) {\n");
-		buf.append("}\n");
+		String expected= ""
+						+ "package test;\n\n"
+						+ "/**\n"
+						+ " * A record comment.\n"
+						+ " * @param a \n"
+						+ " * @param b \n"
+						+ " *\n"
+						+ " */\n"
+						+ "public record Rec1(int a, int b) {\n"
+						+ "}\n";
 
-		String expected= buf.toString();
 		assertEqualString(preview1, expected);
 	}
 
 	@Test
 	public void testMissingTypeParamTag() throws Exception {
 		IPackageFragment pack= fSourceFolder.createPackageFragment("test", false, null);
-		StringBuilder buf= new StringBuilder();
-		buf.append("package test;\n\n");
-		buf.append("/**\n");
-		buf.append(" * A record comment.\n");
-		buf.append(" * @param a \n");
-		buf.append(" * @param b \n");
-		buf.append(" *\n");
-		buf.append(" */\n");
-		buf.append("public record Rec1<N>(int a, int b) {\n");
-		buf.append("}\n");
-		ICompilationUnit cu= pack.createCompilationUnit("Rec1.java", buf.toString(), false, null);
+		String test= ""
+					+ "package test;\n\n"
+					+ "/**\n"
+					+ " * A record comment.\n"
+					+ " * @param a \n"
+					+ " * @param b \n"
+					+ " *\n"
+					+ " */\n"
+					+ "public record Rec1<N>(int a, int b) {\n"
+					+ "}\n";
+		ICompilationUnit cu= pack.createCompilationUnit("Rec1.java", test, false, null);
 
 		CompilationUnit astRoot= getASTRoot(cu);
 		ArrayList<IJavaCompletionProposal> proposals= collectCorrections(cu, astRoot);
@@ -251,19 +246,18 @@
 		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(1);
 		String preview1= getPreviewContent(proposal);
 
-		buf= new StringBuilder();
-		buf.append("package test;\n\n");
-		buf.append("/**\n");
-		buf.append(" * A record comment.\n");
-		buf.append(" * @param <N> \n");
-		buf.append(" * @param a \n");
-		buf.append(" * @param b \n");
-		buf.append(" *\n");
-		buf.append(" */\n");
-		buf.append("public record Rec1<N>(int a, int b) {\n");
-		buf.append("}\n");
+		String expected= ""
+						+ "package test;\n\n"
+						+ "/**\n"
+						+ " * A record comment.\n"
+						+ " * @param <N> \n"
+						+ " * @param a \n"
+						+ " * @param b \n"
+						+ " *\n"
+						+ " */\n"
+						+ "public record Rec1<N>(int a, int b) {\n"
+						+ "}\n";
 
-		String expected= buf.toString();
 		assertEqualString(preview1, expected);
 	}
 }
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 be18932..c8febcb 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
@@ -29,6 +29,9 @@
 import java.util.List;
 import java.util.stream.Collectors;
 
+import org.junit.runner.RunWith;
+import org.junit.runners.Suite;
+
 import org.eclipse.jdt.testplugin.JavaProjectHelper;
 import org.eclipse.jdt.testplugin.StringAsserts;
 
@@ -86,6 +89,55 @@
 
 /**
  */
+@RunWith(Suite.class)
+@Suite.SuiteClasses({
+	QuickFixTest9.class,
+	QuickFixTest1d8.class,
+	QuickFixTest14.class,
+	QuickFixTest15.class,
+	SerialVersionQuickFixTest.class,
+	UtilitiesTest.class,
+	UnresolvedTypesQuickFixTest.class,
+	UnresolvedVariablesQuickFixTest.class,
+	UnresolvedMethodsQuickFixTest.class,
+	UnresolvedMethodsQuickFixTest1d8.class,
+	ReturnTypeQuickFixTest.class,
+	LocalCorrectionsQuickFixTest.class,
+	LocalCorrectionsQuickFixTest1d7.class,
+	LocalCorrectionsQuickFixTest1d8.class,
+	TypeMismatchQuickFixTests.class,
+	ReorgQuickFixTest.class,
+	ModifierCorrectionsQuickFixTest.class,
+	ModifierCorrectionsQuickFixTest1d7.class,
+	ModifierCorrectionsQuickFixTest9.class,
+	GetterSetterQuickFixTest.class,
+	AssistQuickFixTest.class,
+	AssistQuickFixTest1d7.class,
+	AssistQuickFixTest1d8.class,
+	AssistQuickFixTest12.class,
+	ChangeNonStaticToStaticTest.class,
+	MarkerResolutionTest.class,
+	JavadocQuickFixTest.class,
+	JavadocQuickFixTest9.class,
+	JavadocQuickFixTestPreview.class,
+	ConvertForLoopQuickFixTest.class,
+	ConvertIterableLoopQuickFixTest.class,
+	AdvancedQuickAssistTest.class,
+	AdvancedQuickAssistTest1d7.class,
+	AdvancedQuickAssistTest1d8.class,
+	CleanUpTestCase.class,
+	QuickFixEnablementTest.class,
+	SurroundWithTemplateTest.class,
+	TypeParameterMismatchTest.class,
+	PropertiesFileQuickAssistTest.class,
+	NullAnnotationsQuickFixTest.class,
+	NullAnnotationsQuickFixTest1d8.class,
+	NullAnnotationsQuickFixTest1d8Mix.class,
+	AnnotateAssistTest1d5.class,
+	AnnotateAssistTest1d8.class,
+	TypeAnnotationQuickFixTest.class
+})
+
 public class QuickFixTest {
 	public static void assertCorrectLabels(List<? extends ICompletionProposal> proposals) {
 		for (int i= 0; i < proposals.size(); i++) {
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTest14.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTest14.java
index 22cc4ba..169af34 100644
--- a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTest14.java
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTest14.java
@@ -40,7 +40,8 @@
 
     private IPackageFragmentRoot fSourceFolder;
 
-	private static String MODULE_INFO_FILE_CONTENT = ""
+    public static String MODULE_INFO_FILE = "module-info.java";
+    public static String MODULE_INFO_FILE_CONTENT = ""
 										+ "module test {\n"
 										+ "}\n";
 
@@ -59,7 +60,7 @@
 		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
 
 		IPackageFragment def= fSourceFolder.createPackageFragment("", false, null);
-		def.createCompilationUnit("module-info.java", MODULE_INFO_FILE_CONTENT, false, null);
+		def.createCompilationUnit(MODULE_INFO_FILE, MODULE_INFO_FILE_CONTENT, false, null);
 
 		IPackageFragment pack= fSourceFolder.createPackageFragment("test", false, null);
 		String test= ""
@@ -113,7 +114,7 @@
 		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
 
 		IPackageFragment def= fSourceFolder.createPackageFragment("", false, null);
-		def.createCompilationUnit("module-info.java", MODULE_INFO_FILE_CONTENT, false, null);
+		def.createCompilationUnit(MODULE_INFO_FILE, MODULE_INFO_FILE_CONTENT, false, null);
 
 		IPackageFragment pack= fSourceFolder.createPackageFragment("test", false, null);
 		String test= ""
@@ -168,7 +169,7 @@
 		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
 
 		IPackageFragment def= fSourceFolder.createPackageFragment("", false, null);
-		def.createCompilationUnit("module-info.java", MODULE_INFO_FILE_CONTENT, false, null);
+		def.createCompilationUnit(MODULE_INFO_FILE, MODULE_INFO_FILE_CONTENT, false, null);
 
 		IPackageFragment pack= fSourceFolder.createPackageFragment("test", false, null);
 		String test= ""
@@ -219,7 +220,7 @@
 		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
 
 		IPackageFragment def= fSourceFolder.createPackageFragment("", false, null);
-		def.createCompilationUnit("module-info.java", MODULE_INFO_FILE_CONTENT, false, null);
+		def.createCompilationUnit(MODULE_INFO_FILE, MODULE_INFO_FILE_CONTENT, false, null);
 
 		IPackageFragment pack= fSourceFolder.createPackageFragment("test", false, null);
 		String test= ""
@@ -275,7 +276,7 @@
 		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
 
 		IPackageFragment def= fSourceFolder.createPackageFragment("", false, null);
-		def.createCompilationUnit("module-info.java", MODULE_INFO_FILE_CONTENT, false, null);
+		def.createCompilationUnit(MODULE_INFO_FILE, MODULE_INFO_FILE_CONTENT, false, null);
 
 		IPackageFragment pack= fSourceFolder.createPackageFragment("test", false, null);
 		String test= ""
@@ -329,7 +330,7 @@
 		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
 
 		IPackageFragment def= fSourceFolder.createPackageFragment("", false, null);
-		def.createCompilationUnit("module-info.java", MODULE_INFO_FILE_CONTENT, false, null);
+		def.createCompilationUnit(MODULE_INFO_FILE, MODULE_INFO_FILE_CONTENT, false, null);
 
 		IPackageFragment pack= fSourceFolder.createPackageFragment("test", false, null);
 		String test= ""
@@ -433,7 +434,7 @@
 		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
 
 		IPackageFragment def= fSourceFolder.createPackageFragment("", false, null);
-		def.createCompilationUnit("module-info.java", MODULE_INFO_FILE_CONTENT, false, null);
+		def.createCompilationUnit(MODULE_INFO_FILE, MODULE_INFO_FILE_CONTENT, false, null);
 
 		IPackageFragment pack= fSourceFolder.createPackageFragment("test", false, null);
 		String test= ""
@@ -501,7 +502,7 @@
 		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
 
 		IPackageFragment def= fSourceFolder.createPackageFragment("", false, null);
-		def.createCompilationUnit("module-info.java", MODULE_INFO_FILE_CONTENT, false, null);
+		def.createCompilationUnit(MODULE_INFO_FILE, MODULE_INFO_FILE_CONTENT, false, null);
 
 		IPackageFragment pack= fSourceFolder.createPackageFragment("test", false, null);
 		String test= ""
diff --git a/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTest15.java b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTest15.java
new file mode 100644
index 0000000..03470a2
--- /dev/null
+++ b/org.eclipse.jdt.ui.tests/ui/org/eclipse/jdt/ui/tests/quickfix/QuickFixTest15.java
@@ -0,0 +1,337 @@
+/*******************************************************************************
+ * 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 java.util.Map;
+
+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.jface.text.contentassist.ICompletionProposal;
+
+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.JavaCore;
+import org.eclipse.jdt.core.dom.CompilationUnit;
+
+import org.eclipse.jdt.internal.corext.util.Messages;
+
+import org.eclipse.jdt.ui.tests.core.rules.Java14ProjectTestSetup;
+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 QuickFixTest15 extends QuickFixTest {
+
+	@Rule
+	public ProjectTestSetup projectsetup= new Java14ProjectTestSetup(true);
+
+	private IJavaProject fJProject;
+
+	private IPackageFragmentRoot fSourceFolder;
+
+	@After
+	public void tearDown() throws Exception {
+		if (fJProject != null) {
+			JavaProjectHelper.delete(fJProject);
+		}
+	}
+
+	@Test
+	public void testEnablePreviewsAndOpenCompilerPropertiesProposals() 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(QuickFixTest14.MODULE_INFO_FILE, QuickFixTest14.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 testGetNeedHigherComplianceProposalsAndEnablePreviewsProposal() throws Exception {
+//		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
+//		fJProject1.setRawClasspath(Java14ProjectTestSetup.getDefaultClasspath(), null);
+//		JavaProjectHelper.set13CompilerOptions(fJProject1, false);
+//
+//		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
+//
+//
+//		IPackageFragment def= fSourceFolder.createPackageFragment("", false, null);
+//		def.createCompilationUnit(QuickFixTest14.MODULE_INFO_FILE, QuickFixTest14.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 testTextBlockGetNeedHigherComplianceProposal() throws Exception {
+		fJProject= JavaProjectHelper.createJavaProject("TestProject1", "bin");
+		fJProject.setRawClasspath(projectsetup.getDefaultClasspath(), null);
+		JavaProjectHelper.set14CompilerOptions(fJProject, false);
+
+		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject, "src");
+
+
+		IPackageFragment def= fSourceFolder.createPackageFragment("", false, null);
+		def.createCompilationUnit(QuickFixTest14.MODULE_INFO_FILE, QuickFixTest14.MODULE_INFO_FILE_CONTENT, false, null);
+
+		IPackageFragment pack= fSourceFolder.createPackageFragment("test", false, null);
+		String test= ""
+				+ "package test;\n"
+				+ "public class Cls1 {\n"
+				+ "	public static void main(String[] args) {\n"
+				+ "		String str= \"\"\"\n"
+				+ "					Hello\n"
+				+ "					World\n"
+				+ "					\"\"\";\n"
+				+ "		System.out.println(str);\n"
+				+ "	}\n"
+				+ "}\n";
+		ICompilationUnit cu= pack.createCompilationUnit("Cls1.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, "15");
+		assertProposalExists(proposals, label);
+	}
+
+	@Test
+	public void testNoEnablePreviewProposal() throws Exception {
+		fJProject= JavaProjectHelper.createJavaProject("TestProject1", "bin");
+		fJProject.setRawClasspath(projectsetup.getDefaultClasspath(), null);
+		JavaProjectHelper.set15CompilerOptions(fJProject, true);
+
+		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject, "src");
+
+
+		IPackageFragment def= fSourceFolder.createPackageFragment("", false, null);
+		def.createCompilationUnit(QuickFixTest14.MODULE_INFO_FILE, QuickFixTest14.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 testRecordSuppressWarningsProposals() throws Exception {
+		fJProject= JavaProjectHelper.createJavaProject("TestProject1", "bin");
+		fJProject.setRawClasspath(projectsetup.getDefaultClasspath(), null);
+		JavaProjectHelper.set15CompilerOptions(fJProject, true);
+
+		Map<String, String> options= fJProject.getOptions(false);
+		options.put(JavaCore.COMPILER_PB_REPORT_PREVIEW_FEATURES, JavaCore.WARNING);
+		fJProject.setOptions(options);
+
+		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject, "src");
+
+
+		IPackageFragment def= fSourceFolder.createPackageFragment("", false, null);
+		def.createCompilationUnit(QuickFixTest14.MODULE_INFO_FILE, QuickFixTest14.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 });
+	}
+
+	@Test
+	public void testAddSealedMissingClassModifierProposal() throws Exception {
+		fJProject= JavaProjectHelper.createJavaProject("TestProject1", "bin");
+		fJProject.setRawClasspath(projectsetup.getDefaultClasspath(), null);
+		JavaProjectHelper.set15CompilerOptions(fJProject, true);
+
+		Map<String, String> options= fJProject.getOptions(false);
+		options.put(JavaCore.COMPILER_PB_REPORT_PREVIEW_FEATURES, JavaCore.IGNORE);
+		fJProject.setOptions(options);
+
+		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject, "src");
+		IPackageFragment pack1= fSourceFolder.createPackageFragment("test", false, null);
+
+		StringBuffer buf= new StringBuffer();
+		buf= new StringBuffer();
+		buf.append("package test;\n");
+		buf.append("\n");
+		buf.append("public sealed class Shape permits Square {}\n");
+		buf.append("\n");
+		buf.append("class Square extends Shape {}\n");
+		ICompilationUnit cu= pack1.createCompilationUnit("Shape.java", buf.toString(), false, null);
+
+		CompilationUnit astRoot= getASTRoot(cu);
+		ArrayList<IJavaCompletionProposal> proposals= collectCorrections(cu, astRoot, 1);
+		assertNumberOfProposals(proposals, 3);
+		assertCorrectLabels(proposals);
+
+		CUCorrectionProposal proposal= (CUCorrectionProposal) proposals.get(0);
+		String preview1= getPreviewContent(proposal);
+
+		buf= new StringBuffer();
+		buf.append("package test;\n");
+		buf.append("\n");
+		buf.append("public sealed class Shape permits Square {}\n");
+		buf.append("\n");
+		buf.append("final class Square extends Shape {}\n");
+		String expected1= buf.toString();
+
+		proposal= (CUCorrectionProposal) proposals.get(1);
+		String preview2= getPreviewContent(proposal);
+
+		buf= new StringBuffer();
+		buf.append("package test;\n");
+		buf.append("\n");
+		buf.append("public sealed class Shape permits Square {}\n");
+		buf.append("\n");
+		buf.append("non-sealed class Square extends Shape {}\n");
+		String expected2= buf.toString();
+
+		proposal= (CUCorrectionProposal) proposals.get(2);
+		String preview3= getPreviewContent(proposal);
+
+		buf= new StringBuffer();
+		buf.append("package test;\n");
+		buf.append("\n");
+		buf.append("public sealed class Shape permits Square {}\n");
+		buf.append("\n");
+		buf.append("sealed class Square extends Shape {}\n");
+		String expected3= buf.toString();
+
+		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2, preview3 }, new String[] { expected1, expected2, expected3 });
+
+	}
+
+	@Test
+	public void testAddSealedMissingInterfaceModifierProposal() throws Exception {
+		fJProject= JavaProjectHelper.createJavaProject("TestProject1", "bin");
+		fJProject.setRawClasspath(projectsetup.getDefaultClasspath(), null);
+		JavaProjectHelper.set15CompilerOptions(fJProject, true);
+
+		Map<String, String> options= fJProject.getOptions(false);
+		options.put(JavaCore.COMPILER_PB_REPORT_PREVIEW_FEATURES, JavaCore.IGNORE);
+		fJProject.setOptions(options);
+
+		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject, "src");
+		IPackageFragment pack1= fSourceFolder.createPackageFragment("test", false, null);
+
+		StringBuffer buf= new StringBuffer();
+		buf= new StringBuffer();
+		buf.append("package test;\n");
+		buf.append("\n");
+		buf.append("public sealed interface Shape permits Square {}\n");
+		buf.append("\n");
+		buf.append("interface Square extends Shape {}\n");
+		ICompilationUnit cu= pack1.createCompilationUnit("Shape.java", buf.toString(), 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);
+
+		buf= new StringBuffer();
+		buf.append("package test;\n");
+		buf.append("\n");
+		buf.append("public sealed interface Shape permits Square {}\n");
+		buf.append("\n");
+		buf.append("sealed interface Square extends Shape {}\n");
+		String expected1= buf.toString();
+
+		proposal= (CUCorrectionProposal) proposals.get(1);
+		String preview2= getPreviewContent(proposal);
+
+		buf= new StringBuffer();
+		buf.append("package test;\n");
+		buf.append("\n");
+		buf.append("public sealed interface Shape permits Square {}\n");
+		buf.append("\n");
+		buf.append("non-sealed interface Square extends Shape {}\n");
+		String expected2= buf.toString();
+
+		assertEqualStringsIgnoreOrder(new String[] { preview1, preview2 }, new String[] { expected1, expected2 });
+
+	}
+}
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 01fc470..10cdc48 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
@@ -34,7 +34,7 @@
 
 import org.eclipse.jdt.internal.corext.util.Messages;
 
-import org.eclipse.jdt.ui.tests.core.rules.Java14ProjectTestSetup;
+import org.eclipse.jdt.ui.tests.core.rules.Java15ProjectTestSetup;
 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;
@@ -46,7 +46,7 @@
 //	private static final Class<QuickFixTest14> THIS= QuickFixTest14.class;
 
     @Rule
-    public ProjectTestSetup projectSetup = new Java14ProjectTestSetup(true);
+    public ProjectTestSetup projectsetup = new Java15ProjectTestSetup(true);
 
     private IJavaProject fJProject1;
 
@@ -66,8 +66,8 @@
 	@Test
 	public void testEnablePreviewsAndOpenCompilerPropertiesProposals() throws Exception {
 		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
-		fJProject1.setRawClasspath(projectSetup.getDefaultClasspath(), null);
-		JavaProjectHelper.set14CompilerOptions(fJProject1, false);
+		fJProject1.setRawClasspath(projectsetup.getDefaultClasspath(), null);
+		JavaProjectHelper.set15CompilerOptions(fJProject1, false);
 
 		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
 
@@ -94,8 +94,8 @@
 	@Test
 	public void testRecordSuppressWarningsProposals() throws Exception {
 		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
-		fJProject1.setRawClasspath(projectSetup.getDefaultClasspath(), null);
-		JavaProjectHelper.set14CompilerOptions(fJProject1, true);
+		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);
@@ -137,8 +137,8 @@
 	@Test
 	public void testGetNeedHigherComplianceProposalsAndEnablePreviewsProposal() throws Exception {
 		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
-		fJProject1.setRawClasspath(projectSetup.getDefaultClasspath(), null);
-		JavaProjectHelper.set13CompilerOptions(fJProject1, false);
+		fJProject1.setRawClasspath(projectsetup.getDefaultClasspath(), null);
+		JavaProjectHelper.set15CompilerOptions(fJProject1, false);
 
 		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
 
@@ -166,8 +166,8 @@
 	@Test
 	public void testNoEnablePreviewProposal() throws Exception {
 		fJProject1= JavaProjectHelper.createJavaProject("TestProject1", "bin");
-		fJProject1.setRawClasspath(projectSetup.getDefaultClasspath(), null);
-		JavaProjectHelper.set14CompilerOptions(fJProject1, true);
+		fJProject1.setRawClasspath(projectsetup.getDefaultClasspath(), null);
+		JavaProjectHelper.set15CompilerOptions(fJProject1, true);
 
 		fSourceFolder= JavaProjectHelper.addSourceContainer(fJProject1, "src");
 
diff --git a/org.eclipse.jdt.ui/.settings/.api_filters b/org.eclipse.jdt.ui/.settings/.api_filters
index 7f32e3f..758d81c 100644
--- a/org.eclipse.jdt.ui/.settings/.api_filters
+++ b/org.eclipse.jdt.ui/.settings/.api_filters
@@ -1,10 +1,18 @@
 <?xml version="1.0" encoding="UTF-8" standalone="no"?>
 <component id="org.eclipse.jdt.ui" version="2">
-    <resource path="META-INF/MANIFEST.MF">
-        <filter comment="This is for Java14 work" id="924844039">
+    <resource path="core extension/org/eclipse/jdt/internal/corext/codemanipulation/AddGetterSetterOperation.java" type="org.eclipse.jdt.internal.corext.codemanipulation.AddGetterSetterOperation">
+        <filter comment="This is a Java 15 preview feature" id="640712815">
             <message_arguments>
-                <message_argument value="3.21.50"/>
-                <message_argument value="3.21.0"/>
+                <message_argument value="IType"/>
+                <message_argument value="AddGetterSetterOperation"/>
+                <message_argument value="getRecordComponents()"/>
+            </message_arguments>
+        </filter>
+        <filter comment="This is a Java 15 preview feature" id="640712815">
+            <message_arguments>
+                <message_argument value="IType"/>
+                <message_argument value="AddGetterSetterOperation"/>
+                <message_argument value="isRecord()"/>
             </message_arguments>
         </filter>
     </resource>
@@ -16,7 +24,23 @@
             </message_arguments>
         </filter>
     </resource>
+    <resource path="core refactoring/org/eclipse/jdt/internal/corext/refactoring/rename/RenameFieldProcessor.java" type="org.eclipse.jdt.internal.corext.refactoring.rename.RenameFieldProcessor">
+        <filter comment="This is a Java15 preview feature" id="640712815">
+            <message_arguments>
+                <message_argument value="IType"/>
+                <message_argument value="RenameFieldProcessor"/>
+                <message_argument value="isRecord()"/>
+            </message_arguments>
+        </filter>
+    </resource>
     <resource path="core refactoring/org/eclipse/jdt/internal/corext/refactoring/rename/RenameVirtualMethodProcessor.java" type="org.eclipse.jdt.internal.corext.refactoring.rename.RenameVirtualMethodProcessor">
+        <filter comment="This is a Java15 preview feature" id="640712815">
+            <message_arguments>
+                <message_argument value="IType"/>
+                <message_argument value="RenameVirtualMethodProcessor"/>
+                <message_argument value="getRecordComponents()"/>
+            </message_arguments>
+        </filter>
         <filter id="640712815">
             <message_arguments>
                 <message_argument value="IType"/>
@@ -66,6 +90,15 @@
             </message_arguments>
         </filter>
     </resource>
+    <resource path="ui/org/eclipse/jdt/internal/ui/InterfaceIndicatorLabelDecorator.java" type="org.eclipse.jdt.internal.ui.InterfaceIndicatorLabelDecorator">
+        <filter comment="This is a Java15 preview feature" id="640712815">
+            <message_arguments>
+                <message_argument value="Flags"/>
+                <message_argument value="InterfaceIndicatorLabelDecorator"/>
+                <message_argument value="isRecord(int)"/>
+            </message_arguments>
+        </filter>
+    </resource>
     <resource path="ui/org/eclipse/jdt/internal/ui/callhierarchy/CallHierarchyViewer.java" type="org.eclipse.jdt.internal.ui.callhierarchy.CallHierarchyViewer">
         <filter id="571473929">
             <message_arguments>
@@ -139,6 +172,13 @@
         </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"/>
@@ -146,6 +186,13 @@
                 <message_argument value="getRestrictedIdentifierStartPosition()"/>
             </message_arguments>
         </filter>
+        <filter comment="This is a Java 15 preview feature" id="640712815">
+            <message_arguments>
+                <message_argument value="TypeDeclaration"/>
+                <message_argument value="PositionCollector"/>
+                <message_argument value="getRestrictedIdentifierStartPosition()"/>
+            </message_arguments>
+        </filter>
     </resource>
     <resource path="ui/org/eclipse/jdt/internal/ui/text/JavaOutlineInformationControl.java" type="org.eclipse.jdt.internal.ui.text.JavaOutlineInformationControl$OutlineTreeViewer">
         <filter id="571473929">
@@ -216,6 +263,13 @@
         </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"/>
@@ -266,6 +320,29 @@
             </message_arguments>
         </filter>
     </resource>
+    <resource path="ui/org/eclipse/jdt/internal/ui/viewsupport/JavaElementImageProvider.java" type="org.eclipse.jdt.internal.ui.viewsupport.JavaElementImageProvider">
+        <filter comment="This is a Java 15 preview feature" id="640712815">
+            <message_arguments>
+                <message_argument value="Flags"/>
+                <message_argument value="JavaElementImageProvider"/>
+                <message_argument value="isNonSealed(int)"/>
+            </message_arguments>
+        </filter>
+        <filter comment="This is a Java 15 preview feature" id="640712815">
+            <message_arguments>
+                <message_argument value="Flags"/>
+                <message_argument value="JavaElementImageProvider"/>
+                <message_argument value="isRecord(int)"/>
+            </message_arguments>
+        </filter>
+        <filter comment="This is a Java 15 preview feature" id="640712815">
+            <message_arguments>
+                <message_argument value="Flags"/>
+                <message_argument value="JavaElementImageProvider"/>
+                <message_argument value="isSealed(int)"/>
+            </message_arguments>
+        </filter>
+    </resource>
     <resource path="ui/org/eclipse/jdt/internal/ui/viewsupport/ProblemTableViewer.java" type="org.eclipse.jdt.internal.ui.viewsupport.ProblemTableViewer">
         <filter id="571473929">
             <message_arguments>
@@ -290,6 +367,22 @@
             </message_arguments>
         </filter>
     </resource>
+    <resource path="ui/org/eclipse/jdt/ui/actions/AddGetterSetterAction.java" type="org.eclipse.jdt.ui.actions.AddGetterSetterAction">
+        <filter comment="This is a Java 15 preview feature" id="640712815">
+            <message_arguments>
+                <message_argument value="IType"/>
+                <message_argument value="AddGetterSetterAction"/>
+                <message_argument value="getRecordComponents()"/>
+            </message_arguments>
+        </filter>
+        <filter comment="This is a Java 15 preview feature" id="640712815">
+            <message_arguments>
+                <message_argument value="IType"/>
+                <message_argument value="AddGetterSetterAction"/>
+                <message_argument value="isRecord()"/>
+            </message_arguments>
+        </filter>
+    </resource>
     <resource path="ui/org/eclipse/jdt/ui/actions/IJavaEditorActionDefinitionIds.java" type="org.eclipse.jdt.ui.actions.IJavaEditorActionDefinitionIds">
         <filter id="571473929">
             <message_arguments>
@@ -298,20 +391,4 @@
             </message_arguments>
         </filter>
     </resource>
-    <resource path="ui/org/eclipse/jdt/ui/text/IJavaPartitions.java" type="org.eclipse.jdt.ui.text.IJavaPartitions">
-        <filter id="403767336">
-            <message_arguments>
-                <message_argument value="org.eclipse.jdt.ui.text.IJavaPartitions"/>
-                <message_argument value="JAVA_MULTI_LINE_STRING"/>
-            </message_arguments>
-        </filter>
-    </resource>
-    <resource path="ui/org/eclipse/jdt/ui/wizards/NewTypeWizardPage.java" type="org.eclipse.jdt.ui.wizards.NewTypeWizardPage">
-        <filter id="336658481">
-            <message_arguments>
-                <message_argument value="org.eclipse.jdt.ui.wizards.NewTypeWizardPage"/>
-                <message_argument value="RECORD_TYPE"/>
-            </message_arguments>
-        </filter>
-    </resource>
 </component>
diff --git a/org.eclipse.jdt.ui/META-INF/MANIFEST.MF b/org.eclipse.jdt.ui/META-INF/MANIFEST.MF
index a81db2f..8f9c78b 100644
--- a/org.eclipse.jdt.ui/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.ui/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.jdt.ui; singleton:=true
-Bundle-Version: 3.21.300.qualifier
+Bundle-Version: 3.22.0.qualifier
 Bundle-Activator: org.eclipse.jdt.internal.ui.JavaPlugin
 Bundle-ActivationPolicy: lazy
 Bundle-Vendor: %providerName
diff --git a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/AddGetterSetterOperation.java b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/AddGetterSetterOperation.java
index ac45192..2a51a3a 100644
--- a/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/AddGetterSetterOperation.java
+++ b/org.eclipse.jdt.ui/core extension/org/eclipse/jdt/internal/corext/codemanipulation/AddGetterSetterOperation.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2018 IBM Corporation and others.
+ * Copyright (c) 2000, 2020 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -339,6 +339,18 @@
 					}
 				}
 			}
+			if (fType.isRecord()) {
+				IField[] recComps= fType.getRecordComponents();
+				for (IField field : recComps) {
+					if (getters.contains(field)) {
+						generateGetterMethod(field, listRewriter);
+						monitor.worked(1);
+						if (monitor.isCanceled()) {
+							throw new OperationCanceledException();
+						}
+					}
+				}
+			}
 			for (IField field : fields) {
 				if (getters.contains(field)) {
 					generateGetterMethod(field, listRewriter);
diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/rename/RenameVirtualMethodProcessor.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/rename/RenameVirtualMethodProcessor.java
index 1ce56f4..093dc09 100644
--- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/rename/RenameVirtualMethodProcessor.java
+++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/rename/RenameVirtualMethodProcessor.java
@@ -42,6 +42,7 @@
 import org.eclipse.jdt.core.Signature;
 import org.eclipse.jdt.core.search.IJavaSearchConstants;
 import org.eclipse.jdt.core.search.IJavaSearchScope;
+import org.eclipse.jdt.core.search.SearchEngine;
 import org.eclipse.jdt.core.search.SearchMatch;
 import org.eclipse.jdt.core.search.SearchPattern;
 
@@ -51,7 +52,6 @@
 import org.eclipse.jdt.internal.corext.refactoring.JavaRefactoringArguments;
 import org.eclipse.jdt.internal.corext.refactoring.RefactoringAvailabilityTester;
 import org.eclipse.jdt.internal.corext.refactoring.RefactoringCoreMessages;
-import org.eclipse.jdt.internal.corext.refactoring.RefactoringScopeFactory;
 import org.eclipse.jdt.internal.corext.refactoring.RefactoringSearchEngine;
 import org.eclipse.jdt.internal.corext.refactoring.SearchResultGroup;
 import org.eclipse.jdt.internal.corext.refactoring.util.JavaStatusContext;
@@ -296,7 +296,7 @@
 						&& ((IType)parent).isRecord()
 						&& !Flags.isStatic(sMethod.getFlags())) {
 					IType record= (IType) parent;
-					IField[] fields= record.getFields();
+					IField[] fields= record.getRecordComponents();
 					for (IField field: fields) {
 						if (!Flags.isStatic(field.getFlags()) && sMethod.getElementName().equals(field.getElementName())) {
 							fRecordComponent= field;
@@ -314,7 +314,7 @@
 	private void addRecordComponentOccurrences(IProgressMonitor pm, TextChangeManager changeManager, RefactoringStatus status) throws CoreException {
 		Assert.isTrue(fRecordComponent.exists());
 
-		IJavaSearchScope scope= RefactoringScopeFactory.create(fRecordComponent.getDeclaringType());
+		IJavaSearchScope scope= SearchEngine.createJavaSearchScope(new IJavaElement[] { fRecordComponent.getDeclaringType()});
 		SearchPattern pattern= SearchPattern.createPattern(fRecordComponent.getElementName(), IJavaSearchConstants.FIELD,
 				IJavaSearchConstants.REFERENCES,SearchPattern.R_EXACT_MATCH | SearchPattern.R_CASE_SENSITIVE | SearchPattern.R_ERASURE_MATCH);
 		SearchResultGroup[] groupedResults= RefactoringSearchEngine.search(
diff --git a/org.eclipse.jdt.ui/css/e4-dark_jdt_syntaxhighlighting.css b/org.eclipse.jdt.ui/css/e4-dark_jdt_syntaxhighlighting.css
index c72d684..133184b 100644
--- a/org.eclipse.jdt.ui/css/e4-dark_jdt_syntaxhighlighting.css
+++ b/org.eclipse.jdt.ui/css/e4-dark_jdt_syntaxhighlighting.css
@@ -100,6 +100,8 @@
 		'semanticHighlighting.yieldKeyword.bold=false'
 		'semanticHighlighting.recordKeyword.color=204,108,29'
 		'semanticHighlighting.recordKeyword.bold=false'
+		'semanticHighlighting.sealedKeywords.color=204,108,29'
+		'semanticHighlighting.sealedKeywords.bold=false'
 		'sourceHoverBackgroundColor=68,68,68'
 }
 
diff --git a/org.eclipse.jdt.ui/icons/full/ovr16/non-sealed_co.png b/org.eclipse.jdt.ui/icons/full/ovr16/non-sealed_co.png
new file mode 100644
index 0000000..a143771
--- /dev/null
+++ b/org.eclipse.jdt.ui/icons/full/ovr16/non-sealed_co.png
Binary files differ
diff --git a/org.eclipse.jdt.ui/icons/full/ovr16/non-sealed_co@2x.png b/org.eclipse.jdt.ui/icons/full/ovr16/non-sealed_co@2x.png
new file mode 100644
index 0000000..b2e8d06
--- /dev/null
+++ b/org.eclipse.jdt.ui/icons/full/ovr16/non-sealed_co@2x.png
Binary files differ
diff --git a/org.eclipse.jdt.ui/icons/full/ovr16/sealed_co.png b/org.eclipse.jdt.ui/icons/full/ovr16/sealed_co.png
new file mode 100644
index 0000000..1e9021e
--- /dev/null
+++ b/org.eclipse.jdt.ui/icons/full/ovr16/sealed_co.png
Binary files differ
diff --git a/org.eclipse.jdt.ui/icons/full/ovr16/sealed_co@2x.png b/org.eclipse.jdt.ui/icons/full/ovr16/sealed_co@2x.png
new file mode 100644
index 0000000..d42a316
--- /dev/null
+++ b/org.eclipse.jdt.ui/icons/full/ovr16/sealed_co@2x.png
Binary files differ
diff --git a/org.eclipse.jdt.ui/pom.xml b/org.eclipse.jdt.ui/pom.xml
index 7ee5f90..324f4a7 100644
--- a/org.eclipse.jdt.ui/pom.xml
+++ b/org.eclipse.jdt.ui/pom.xml
@@ -18,7 +18,7 @@
   </parent>
   <groupId>org.eclipse.jdt</groupId>
   <artifactId>org.eclipse.jdt.ui</artifactId>
-  <version>3.21.300-SNAPSHOT</version>
+  <version>3.22.0-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
   <properties>
     <code.ignoredWarnings>-warn:-deprecation,unavoidableGenericProblems</code.ignoredWarnings>
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/JavaPluginImages.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/JavaPluginImages.java
index 6a746ce..9cff650 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/JavaPluginImages.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/JavaPluginImages.java
@@ -436,6 +436,8 @@
 	public static final ImageDescriptor DESC_OVR_VOLATILE= createUnManagedCached(T_OVR, "volatile_co.png"); 						//$NON-NLS-1$
 	public static final ImageDescriptor DESC_OVR_TRANSIENT= createUnManagedCached(T_OVR, "transient_co.png"); 						//$NON-NLS-1$
 	public static final ImageDescriptor DESC_OVR_NATIVE= createUnManagedCached(T_OVR, "native_co.png"); 						//$NON-NLS-1$
+	public static final ImageDescriptor DESC_OVR_SEALED= createUnManagedCached(T_OVR, "sealed_co.png"); 						//$NON-NLS-1$
+	public static final ImageDescriptor DESC_OVR_NON_SEALED= createUnManagedCached(T_OVR, "non-sealed_co.png"); 						//$NON-NLS-1$
 
 	public static final ImageDescriptor DESC_OVR_INFO= createUnManagedCached(T_OVR, "info_co.png"); //$NON-NLS-1$
 	public static final ImageDescriptor DESC_OVR_RUN= createUnManagedCached(T_OVR, "run_co.png"); 							//$NON-NLS-1$
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/actions/AddTextBlockAction.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/actions/AddTextBlockAction.java
index 52a90b3..2508c7a 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/actions/AddTextBlockAction.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/actions/AddTextBlockAction.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2019 IBM Corporation and others.
+ * Copyright (c) 2019, 2020 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -37,13 +37,14 @@
 import org.eclipse.jdt.core.IJavaProject;
 import org.eclipse.jdt.core.ITypeRoot;
 
+import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
+
 import org.eclipse.jdt.ui.actions.SelectionDispatchAction;
 import org.eclipse.jdt.ui.text.IJavaPartitions;
 
 import org.eclipse.jdt.internal.ui.IJavaHelpContextIds;
 import org.eclipse.jdt.internal.ui.javaeditor.CompilationUnitEditor;
 import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility;
-import org.eclipse.jdt.internal.ui.text.correction.PreviewFeaturesSubProcessor;
 import org.eclipse.jdt.internal.ui.text.java.JavaMultiLineStringAutoIndentStrategy;
 
 public class AddTextBlockAction extends SelectionDispatchAction {
@@ -176,7 +177,7 @@
 		if (fEditor == null) {
 			return false;
 		}
-		if (!PreviewFeaturesSubProcessor.isPreviewFeatureEnabled(javaProject)) {
+		if (!JavaModelUtil.is15OrHigher(javaProject)) {
 			return false;
 		}
 		boolean addTextBlock= true;
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 acd7d84..fea20d3 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
@@ -40,10 +40,13 @@
 import org.eclipse.jdt.core.dom.ConstructorInvocation;
 import org.eclipse.jdt.core.dom.Expression;
 import org.eclipse.jdt.core.dom.IMethodBinding;
+import org.eclipse.jdt.core.dom.Modifier;
+import org.eclipse.jdt.core.dom.Modifier.ModifierKeyword;
 import org.eclipse.jdt.core.dom.RecordDeclaration;
 import org.eclipse.jdt.core.dom.SimpleName;
 import org.eclipse.jdt.core.dom.SimpleType;
 import org.eclipse.jdt.core.dom.SuperConstructorInvocation;
+import org.eclipse.jdt.core.dom.TypeDeclaration;
 import org.eclipse.jdt.core.dom.YieldStatement;
 import org.eclipse.jdt.core.manipulation.SharedASTProviderCore;
 
@@ -51,7 +54,9 @@
 import org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlightingManager.HighlightedPosition;
 import org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlightingManager.Highlighting;
 import org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlightings.DeprecatedMemberHighlighting;
+import org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlightings.PermitsKeywordHighlighting;
 import org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlightings.RecordKeywordHighlighting;
+import org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlightings.SealedKeywordsHighlighting;
 import org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlightings.VarKeywordHighlighting;
 import org.eclipse.jdt.internal.ui.javaeditor.SemanticHighlightings.YieldKeywordHighlighting;
 import org.eclipse.jdt.internal.ui.text.java.IJavaReconcilingListener;
@@ -184,6 +189,55 @@
 			return true;
 		}
 
+		@Override
+		public boolean visit(TypeDeclaration node) {
+			try {
+				if (node.permittedTypes().size() > 0) {
+					int offset= node.getRestrictedIdentifierStartPosition();
+					int length= 7; // length of 'permits'
+					if (offset > -1) {
+						for (int i= 0; i < fJobSemanticHighlightings.length; i++) {
+							SemanticHighlighting semanticHighlighting= fJobSemanticHighlightings[i];
+							if (semanticHighlighting instanceof PermitsKeywordHighlighting) {
+								addPosition(offset, length, fJobHighlightings[i]);
+								return true;
+							}
+						}
+					}
+				}
+			} catch (UnsupportedOperationException e) {
+				// do nothing
+			}
+			return true;
+		}
+
+		@Override
+		public boolean visit(Modifier node) {
+			AST ast= node.getAST();
+			if (ASTHelper.isSealedTypeSupportedInAST(ast)) {
+				ModifierKeyword keyword= node.getKeyword();
+				int offset= node.getStartPosition();
+				int length;
+				if (keyword == ModifierKeyword.SEALED_KEYWORD) {
+					length= 6;
+				} else if (keyword == ModifierKeyword.NON_SEALED_KEYWORD) {
+					length= 10;
+				} else {
+					return true;
+				}
+				if (offset > -1 && length > 0) {
+					for (int i= 0; i < fJobSemanticHighlightings.length; i++) {
+						SemanticHighlighting semanticHighlighting= fJobSemanticHighlightings[i];
+						if (semanticHighlighting instanceof SealedKeywordsHighlighting) {
+							addPosition(offset, length, fJobHighlightings[i]);
+							return false;
+						}
+					}
+				}
+			}
+			return true;
+		}
+
 		/*
 		 * @see org.eclipse.jdt.core.dom.ASTVisitor#visit(org.eclipse.jdt.core.dom.SimpleName)
 		 */
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/SemanticHighlightings.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/SemanticHighlightings.java
index f37cdcc..72f05f7 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/SemanticHighlightings.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/javaeditor/SemanticHighlightings.java
@@ -218,6 +218,11 @@
 	public static final String RECORD_KEYWORD= SemanticHighlightingsCore.RECORD_KEYWORD;
 
 	/**
+	 * A named preference part that controls the highlighting of 'sealed' and 'non-sealed' keywords.
+	 */
+	public static final String SEALED_KEYWORDS= SemanticHighlightingsCore.SEALED_KEYWORDS;
+
+	/**
 	 * Semantic highlightings
 	 */
 	private static SemanticHighlighting[] fgSemanticHighlightings;
@@ -2019,6 +2024,47 @@
 	}
 
 	/**
+	 * Semantic highlighting for 'permits' keyword.
+	 */
+	static final class PermitsKeywordHighlighting extends SemanticHighlighting {
+
+		@Override
+		public String getPreferenceKey() {
+			return RECORD_KEYWORD;
+		}
+
+		@Override
+		public RGB getDefaultDefaultTextColor() {
+			return new RGB(127, 0, 85);
+		}
+
+		@Override
+		public boolean isBoldByDefault() {
+			return true;
+		}
+
+		@Override
+		public boolean isItalicByDefault() {
+			return false;
+		}
+
+		@Override
+		public boolean isEnabledByDefault() {
+			return true;
+		}
+
+		@Override
+		public String getDisplayName() {
+			return PreferencesMessages.JavaEditorPreferencePage_recordKeyword;
+		}
+
+		@Override
+		public boolean consumes(SemanticToken token) {
+			return false;
+		}
+	}
+
+	/**
 	 * Semantic highlighting for 'yield' keyword.
 	 */
 	static final class YieldKeywordHighlighting extends SemanticHighlighting {
@@ -2060,6 +2106,47 @@
 	}
 
 	/**
+	 * Semantic highlighting for 'sealed' and 'non-sealed' keywords.
+	 */
+	static final class SealedKeywordsHighlighting extends SemanticHighlighting {
+
+		@Override
+		public String getPreferenceKey() {
+			return SEALED_KEYWORDS;
+		}
+
+		@Override
+		public RGB getDefaultDefaultTextColor() {
+			return new RGB(127, 0, 85);
+		}
+
+		@Override
+		public boolean isBoldByDefault() {
+			return true;
+		}
+
+		@Override
+		public boolean isItalicByDefault() {
+			return false;
+		}
+
+		@Override
+		public boolean isEnabledByDefault() {
+			return true;
+		}
+
+		@Override
+		public String getDisplayName() {
+			return PreferencesMessages.JavaEditorPreferencePage_sealedKeywords;
+		}
+
+		@Override
+		public boolean consumes(SemanticToken token) {
+			return false;
+		}
+	}
+
+	/**
 	 * A named preference that controls the given semantic highlighting's color.
 	 *
 	 * @param semanticHighlighting the semantic highlighting
@@ -2152,7 +2239,9 @@
 				new NumberHighlighting(),
 				new VarKeywordHighlighting(),
 				new YieldKeywordHighlighting(),
-				new RecordKeywordHighlighting()
+				new RecordKeywordHighlighting(),
+				new SealedKeywordsHighlighting(),
+				new PermitsKeywordHighlighting()
 			};
 		return fgSemanticHighlightings;
 	}
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 c66dfd4..6cabdb3 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
@@ -142,6 +142,7 @@
 	private static final String VERSION_12 = JavaCore.VERSION_12;
 	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_LATEST = JavaCore.latestSupportedJavaVersion();
 	private static final String VERSION_JSR14= "jsr14"; //$NON-NLS-1$
 
@@ -299,7 +300,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_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 };
 		final String[] complianceLabels= new String[] {
 			PreferencesMessages.ComplianceConfigurationBlock_version13,
 			PreferencesMessages.ComplianceConfigurationBlock_version14,
@@ -313,10 +314,11 @@
 			PreferencesMessages.ComplianceConfigurationBlock_version_12,
 			PreferencesMessages.ComplianceConfigurationBlock_version_13,
 			PreferencesMessages.ComplianceConfigurationBlock_version_14,
+			PreferencesMessages.ComplianceConfigurationBlock_version_15,
 		};
 
 		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_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 };
 		String[] targetLabels= new String[] {
 				PreferencesMessages.ComplianceConfigurationBlock_versionCLDC11,
 				PreferencesMessages.ComplianceConfigurationBlock_version11,
@@ -333,6 +335,7 @@
 				PreferencesMessages.ComplianceConfigurationBlock_version_12,
 				PreferencesMessages.ComplianceConfigurationBlock_version_13,
 				PreferencesMessages.ComplianceConfigurationBlock_version_14,
+				PreferencesMessages.ComplianceConfigurationBlock_version_15,
 		};
 		if (ComplianceConfigurationBlock.VERSION_JSR14.equals(getValue(PREF_CODEGEN_TARGET_PLATFORM))) {
 			targetVersions= append(targetVersions, ComplianceConfigurationBlock.VERSION_JSR14);
@@ -340,7 +343,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_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 };
 		String[] sourceLabels= new String[] {
 				PreferencesMessages.ComplianceConfigurationBlock_version13,
 				PreferencesMessages.ComplianceConfigurationBlock_version14,
@@ -354,6 +357,7 @@
 				PreferencesMessages.ComplianceConfigurationBlock_version_12,
 				PreferencesMessages.ComplianceConfigurationBlock_version_13,
 				PreferencesMessages.ComplianceConfigurationBlock_version_14,
+				PreferencesMessages.ComplianceConfigurationBlock_version_15,
 		};
 
 		final ScrolledPageContent sc1 = new ScrolledPageContent(folder);
@@ -803,13 +807,13 @@
 				}
 			}
 
-			//TODO: Comment once Java SE 14 has been shipped:
-			/*String selectedCompliance= getValue(PREF_COMPLIANCE);
-			if (VERSION_14.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 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;
+//			}
 
 			fJRE50InfoText.setVisible(isVisible);
 			fJRE50InfoImage.setImage(isVisible ? image : null);
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/JavaEditorColoringConfigurationBlock.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/JavaEditorColoringConfigurationBlock.java
index 2c1aa8b..eb63fb7 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/JavaEditorColoringConfigurationBlock.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/preferences/JavaEditorColoringConfigurationBlock.java
@@ -266,6 +266,7 @@
 					for (HighlightingColorListItem listItem : subList) {
 						if (!listItem.getDisplayName().equals(PreferencesMessages.JavaEditorPreferencePage_varKeyword) &&
 								!listItem.getDisplayName().equals(PreferencesMessages.JavaEditorPreferencePage_yieldKeyword) &&
+								!listItem.getDisplayName().equals(PreferencesMessages.JavaEditorPreferencePage_sealedKeywords) &&
 								!listItem.getDisplayName().equals(PreferencesMessages.JavaEditorPreferencePage_recordKeyword)) {
 							visibleChildren.add(listItem);
 						}
@@ -718,6 +719,7 @@
 					for (HighlightingColorListItem listItem : fListModel) {
 						if (listItem.getDisplayName().equals(PreferencesMessages.JavaEditorPreferencePage_varKeyword) ||
 								listItem.getDisplayName().equals(PreferencesMessages.JavaEditorPreferencePage_yieldKeyword) ||
+								listItem.getDisplayName().equals(PreferencesMessages.JavaEditorPreferencePage_sealedKeywords) ||
 								listItem.getDisplayName().equals(PreferencesMessages.JavaEditorPreferencePage_recordKeyword)) {
 							PreferenceConverter.setValue(getPreferenceStore(), listItem.getColorKey(), fSyntaxForegroundColorEditor.getColorValue());
 						}
@@ -739,6 +741,7 @@
 					for (HighlightingColorListItem listItem : fListModel) {
 						if (listItem.getDisplayName().equals(PreferencesMessages.JavaEditorPreferencePage_varKeyword) ||
 								listItem.getDisplayName().equals(PreferencesMessages.JavaEditorPreferencePage_yieldKeyword) ||
+								listItem.getDisplayName().equals(PreferencesMessages.JavaEditorPreferencePage_sealedKeywords) ||
 								listItem.getDisplayName().equals(PreferencesMessages.JavaEditorPreferencePage_recordKeyword)) {
 							getPreferenceStore().setValue(listItem.getBoldKey(), fBoldCheckBox.getSelection());
 						}
@@ -760,6 +763,7 @@
 					for (HighlightingColorListItem listItem : fListModel) {
 						if (listItem.getDisplayName().equals(PreferencesMessages.JavaEditorPreferencePage_varKeyword) ||
 								listItem.getDisplayName().equals(PreferencesMessages.JavaEditorPreferencePage_yieldKeyword) ||
+								listItem.getDisplayName().equals(PreferencesMessages.JavaEditorPreferencePage_sealedKeywords) ||
 								listItem.getDisplayName().equals(PreferencesMessages.JavaEditorPreferencePage_recordKeyword)) {
 							getPreferenceStore().setValue(listItem.getItalicKey(), fItalicCheckBox.getSelection());
 						}
@@ -780,6 +784,7 @@
 					for (HighlightingColorListItem listItem : fListModel) {
 						if (listItem.getDisplayName().equals(PreferencesMessages.JavaEditorPreferencePage_varKeyword) ||
 								listItem.getDisplayName().equals(PreferencesMessages.JavaEditorPreferencePage_yieldKeyword) ||
+								listItem.getDisplayName().equals(PreferencesMessages.JavaEditorPreferencePage_sealedKeywords) ||
 								listItem.getDisplayName().equals(PreferencesMessages.JavaEditorPreferencePage_recordKeyword)) {
 							getPreferenceStore().setValue(listItem.getStrikethroughKey(), fStrikethroughCheckBox.getSelection());
 						}
@@ -801,6 +806,7 @@
 					for (HighlightingColorListItem listItem : fListModel) {
 						if (listItem.getDisplayName().equals(PreferencesMessages.JavaEditorPreferencePage_varKeyword) ||
 								listItem.getDisplayName().equals(PreferencesMessages.JavaEditorPreferencePage_yieldKeyword) ||
+								listItem.getDisplayName().equals(PreferencesMessages.JavaEditorPreferencePage_sealedKeywords) ||
 								listItem.getDisplayName().equals(PreferencesMessages.JavaEditorPreferencePage_recordKeyword)) {
 							getPreferenceStore().setValue(listItem.getUnderlineKey(), fUnderlineCheckBox.getSelection());
 						}
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 20477e3..a754477 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
@@ -150,6 +150,7 @@
 	public static String JavaEditorPreferencePage_varKeyword;
 	public static String JavaEditorPreferencePage_yieldKeyword;
 	public static String JavaEditorPreferencePage_recordKeyword;
+	public static String JavaEditorPreferencePage_sealedKeywords;
 	public static String JavaEditorPreferencePage_strings;
 	public static String JavaEditorPreferencePage_others;
 	public static String JavaEditorPreferencePage_operators;
@@ -840,6 +841,7 @@
 	public static String ComplianceConfigurationBlock_version_12;
 	public static String ComplianceConfigurationBlock_version_13;
 	public static String ComplianceConfigurationBlock_version_14;
+	public static String ComplianceConfigurationBlock_version_15;
 	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 8a75aff..3e9b260 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
@@ -127,6 +127,7 @@
 JavaEditorPreferencePage_varKeyword=Keyword 'var'
 JavaEditorPreferencePage_yieldKeyword=Keyword 'yield'
 JavaEditorPreferencePage_recordKeyword=Keyword 'record'
+JavaEditorPreferencePage_sealedKeywords=Keywords 'sealed' and 'non-sealed'
 JavaEditorPreferencePage_strings=Strings
 JavaEditorPreferencePage_others=Others
 JavaEditorPreferencePage_operators=Operators
@@ -592,6 +593,7 @@
 ComplianceConfigurationBlock_version_12=12
 ComplianceConfigurationBlock_version_13=13
 ComplianceConfigurationBlock_version_14=14
+ComplianceConfigurationBlock_version_15=15
 ComplianceConfigurationBlock_versionCLDC11=CLDC 1.1
 
 ComplianceConfigurationBlock_needsbuild_title=Compiler Settings Changed
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/MatchLocations.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/MatchLocations.java
index c013d59..65263db 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/MatchLocations.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/MatchLocations.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2007, 2014 IBM Corporation and others.
+ * Copyright (c) 2007, 2020 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -155,6 +155,7 @@
 
 			createButton(group, SearchMessages.MatchLocations_imports_label, IJavaSearchConstants.IMPORT_DECLARATION_TYPE_REFERENCE);
 			createButton(group, SearchMessages.MatchLocations_super_types_label, IJavaSearchConstants.SUPERTYPE_TYPE_REFERENCE);
+			createButton(group, SearchMessages.MatchLocations_permitted_types_label, IJavaSearchConstants.PERMITTYPE_TYPE_REFERENCE);
 			addSeparator(group);
 
 			createButton(group, SearchMessages.MatchLocations_annotations_label , IJavaSearchConstants.ANNOTATION_TYPE_REFERENCE);
@@ -271,6 +272,9 @@
 		if (isSet(locations, IJavaSearchConstants.SUPERTYPE_TYPE_REFERENCE)) {
 			args.add(SearchMessages.MatchLocations_super_types_description);
 		}
+		if (isSet(locations, IJavaSearchConstants.PERMITTYPE_TYPE_REFERENCE)) {
+			args.add(SearchMessages.MatchLocations_permitted_types_description);
+		}
 		if (isSet(locations, IJavaSearchConstants.ANNOTATION_TYPE_REFERENCE)) {
 			args.add(SearchMessages.MatchLocations_annotations_description);
 		}
@@ -345,7 +349,7 @@
 	public static int getTotalNumberOfSettings(int searchFor) {
 		switch (searchFor) {
 			case IJavaSearchConstants.TYPE:
-				return 15;
+				return 16;
 			case IJavaSearchConstants.CONSTRUCTOR:
 				return 1;
 			case IJavaSearchConstants.METHOD:
@@ -367,6 +371,9 @@
 			if (isSet(locations, IJavaSearchConstants.SUPERTYPE_TYPE_REFERENCE)) {
 				count++;
 			}
+			if (isSet(locations, IJavaSearchConstants.PERMITTYPE_TYPE_REFERENCE)) {
+				count++;
+			}
 			if (isSet(locations, IJavaSearchConstants.ANNOTATION_TYPE_REFERENCE)) {
 				count++;
 			}
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/SearchMessages.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/SearchMessages.java
index 78d1a29..813fa9d 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/SearchMessages.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/SearchMessages.java
@@ -1,13 +1,11 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2017 IBM Corporation and others.
+ * Copyright (c) 2000, 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
  *******************************************************************************/
@@ -319,7 +317,9 @@
 	public static String MatchLocations_super_description;
 	public static String MatchLocations_super_label;
 	public static String MatchLocations_super_types_description;
+	public static String MatchLocations_permitted_types_description;
 	public static String MatchLocations_super_types_label;
+	public static String MatchLocations_permitted_types_label;
 	public static String MatchLocations_this_description;
 	public static String MatchLocations_this_label;
 	public static String MatchLocations_thrown_exceptions_description;
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/SearchMessages.properties b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/SearchMessages.properties
index f480abf..85301df 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/SearchMessages.properties
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/search/SearchMessages.properties
@@ -1,5 +1,5 @@
 ###############################################################################
-# Copyright (c) 2000, 2017 IBM Corporation and others.
+# Copyright (c) 2000, 2020 IBM Corporation and others.
 #
 # This program and the accompanying materials
 # are made available under the terms of the Eclipse Public License 2.0
@@ -356,7 +356,9 @@
 MatchLocations_super_description=super references
 MatchLocations_super_label='s&uper.' references
 MatchLocations_super_types_description=super type declarations
+MatchLocations_permitted_types_description=permitted type declarations
 MatchLocations_super_types_label=Super &type declarations
+MatchLocations_permitted_types_label=Permitted t&ype declarations
 MatchLocations_this_description=this references
 MatchLocations_this_label='&this.' references
 MatchLocations_thrown_exceptions_description=thrown exceptions
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/FastJavaPartitionScanner.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/FastJavaPartitionScanner.java
index 7c1d377..651bdf2 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/FastJavaPartitionScanner.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/FastJavaPartitionScanner.java
@@ -35,11 +35,12 @@
 import org.eclipse.jdt.core.IJavaElement;
 import org.eclipse.jdt.core.IJavaProject;
 
+import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
+
 import org.eclipse.jdt.ui.text.IJavaPartitions;
 
 import org.eclipse.jdt.internal.ui.JavaPlugin;
 import org.eclipse.jdt.internal.ui.javaeditor.EditorUtility;
-import org.eclipse.jdt.internal.ui.text.correction.PreviewFeaturesSubProcessor;
 
 /**
  * This scanner recognizes the JavaDoc comments, Java multi line comments, Java single line comments,
@@ -465,7 +466,7 @@
 		 					}
 		 					if (docPartitioner instanceof FastJavaPartitioner) {
 		 						FastJavaPartitioner fjPartitioner= (FastJavaPartitioner) docPartitioner;
-		 						if (!fjPartitioner.hasPreviewEnabledValueChanged()) {
+		 						if (!fjPartitioner.hasTextBlockSupportedValueChanged()) {
 				 					ITypedRegion originalPartition= TextUtilities.getPartition(fCurrentDocument, IJavaPartitions.JAVA_PARTITIONING, fTokenOffset, false);
 									ITypedRegion startingPartition= TextUtilities.getPartition(fCurrentDocument, IJavaPartitions.JAVA_PARTITIONING, fTokenOffset+ fTokenLength+2, false);
 									fjPartitioner.resetPositionCache();
@@ -545,7 +546,7 @@
 	}
 
 	private boolean scanForTextBlockBeginning() {
-		if (!isEnablePreviewsAllowed()) {
+		if (!isTextBlockSupported()) {
 			return false;
 		}
 		int count= 0;
@@ -804,11 +805,11 @@
 		}
 	}
 
-	public boolean isEnablePreviewsAllowed() {
+	public boolean isTextBlockSupported() {
 		boolean isAllowed= false;
 		setJavaProject();
 		if (fJavaProject != null) {
-			isAllowed= PreviewFeaturesSubProcessor.isPreviewFeatureEnabled(fJavaProject);
+			isAllowed= JavaModelUtil.is15OrHigher(fJavaProject);
 		}
 		return isAllowed;
 	}
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/FastJavaPartitioner.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/FastJavaPartitioner.java
index 9474eff..e1afe32 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/FastJavaPartitioner.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/FastJavaPartitioner.java
@@ -22,7 +22,7 @@
 public class FastJavaPartitioner extends FastPartitioner {
 
 
-	private boolean fIsPreviewEnabled= false;
+	private boolean fIsTextBlockSupported= false;
 
 	public FastJavaPartitioner(IPartitionTokenScanner scanner, String[] legalContentTypes) {
 		super(scanner, legalContentTypes);
@@ -31,7 +31,7 @@
 	@Override
 	protected void initialize() {
 		super.initialize();
-		fIsPreviewEnabled= isEnablePreviewsAllowed();
+		fIsTextBlockSupported= isTextBlockSupported();
 	}
 
 	public void resetPositionCache() {
@@ -41,7 +41,7 @@
 	@Override
 	public void documentAboutToBeChanged(DocumentEvent e) {
 		super.documentAboutToBeChanged(e);
-		if (hasPreviewEnabledValueChanged()) {
+		if (hasTextBlockSupportedValueChanged()) {
 			clearManagingPositionCategory();
 			connect(fDocument, false);
 		}
@@ -49,7 +49,7 @@
 
 	@Override
 	public ITypedRegion[] computePartitioning(int offset, int length, boolean includeZeroLengthPartitions) {
-		if (hasPreviewEnabledValueChanged()) {
+		if (hasTextBlockSupportedValueChanged()) {
 			clearManagingPositionCategory();
 			connect(fDocument, false);
 		}
@@ -57,29 +57,29 @@
 	}
 
 	public void cleanAndReConnectDocumentIfNecessary() {
-		if (hasPreviewEnabledValueChanged()) {
+		if (hasTextBlockSupportedValueChanged()) {
 			clearManagingPositionCategory();
 			connect(fDocument, false);
 		}
 	}
 
-	public boolean hasPreviewEnabledValueChanged() {
-		boolean previewEnabledFlagChanged= false;
-		boolean enablePreviewsAllowed= isEnablePreviewsAllowed();
-		if (enablePreviewsAllowed != fIsPreviewEnabled) {
-			previewEnabledFlagChanged= true;
+	public boolean hasTextBlockSupportedValueChanged() {
+		boolean textBlockSupportedValueChanged= false;
+		boolean textBlockSupported= isTextBlockSupported();
+		if (textBlockSupported != fIsTextBlockSupported) {
+			textBlockSupportedValueChanged= true;
 		}
-		return previewEnabledFlagChanged;
+		return textBlockSupportedValueChanged;
 	}
 
-	private boolean isEnablePreviewsAllowed() {
-		boolean isEnablePreviewsAllowed= false;
+	private boolean isTextBlockSupported() {
+		boolean isTextBlockSupported= false;
 		if (fScanner instanceof FastJavaPartitionScanner) {
-			isEnablePreviewsAllowed= ((FastJavaPartitionScanner) fScanner).isEnablePreviewsAllowed();
+			isTextBlockSupported= ((FastJavaPartitionScanner) fScanner).isTextBlockSupported();
 		} else {
-			isEnablePreviewsAllowed= false;
+			isTextBlockSupported= false;
 		}
-		return isEnablePreviewsAllowed;
+		return isTextBlockSupported;
 	}
 
 	private void clearManagingPositionCategory() {
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/ModifierCorrectionSubProcessor.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/ModifierCorrectionSubProcessor.java
index e852ff2..039a0aa 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/ModifierCorrectionSubProcessor.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/ModifierCorrectionSubProcessor.java
@@ -944,6 +944,42 @@
 		}
 	}
 
+	public static void addSealedMissingModifierProposal(IInvocationContext context, IProblemLocation problem, Collection<ICommandAccess> proposals) {
+		if (proposals == null) {
+			return;
+		}
+		ASTNode selectedNode= problem.getCoveringNode(context.getASTRoot());
+		if (!(selectedNode instanceof SimpleName)) {
+			return;
+		}
+		if (!(((SimpleName) selectedNode).getParent() instanceof TypeDeclaration)) {
+			return;
+		}
+		TypeDeclaration typeDecl= (TypeDeclaration) ((SimpleName) selectedNode).getParent();
+		boolean isInterface= typeDecl.isInterface();
+
+		ICompilationUnit cu= context.getCompilationUnit();
+		ITypeBinding typeDeclBinding= typeDecl.resolveBinding();
+		int relevance= IProposalRelevance.CHANGE_MODIFIER_TO_FINAL;
+		Image image= JavaPluginImages.get(JavaPluginImages.IMG_CORRECTION_CHANGE);
+		String label;
+
+		if (!isInterface) {
+			// Add final modifier
+			label= Messages.format(CorrectionMessages.ModifierCorrectionSubProcessor_changemodifierto_final_description, typeDecl.getName());
+			proposals.add(new ModifierChangeCorrectionProposal(label, cu, typeDeclBinding, typeDecl, Modifier.FINAL, 0, relevance, image));
+		}
+
+		// Add sealed modifier
+		label= Messages.format(CorrectionMessages.ModifierCorrectionSubProcessor_changemodifierto_sealed_description, typeDecl.getName());
+		proposals.add(new ModifierChangeCorrectionProposal(label, cu, typeDeclBinding, typeDecl, Modifier.SEALED, 0, relevance, image));
+
+		// Add non-sealed modifier
+		label= Messages.format(CorrectionMessages.ModifierCorrectionSubProcessor_changemodifierto_nonsealed_description, typeDecl.getName());
+		proposals.add(new ModifierChangeCorrectionProposal(label, cu, typeDeclBinding, typeDecl, Modifier.NON_SEALED, 0, relevance, image));
+
+	}
+
 	private ModifierCorrectionSubProcessor() {
 	}
 }
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickFixProcessor.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickFixProcessor.java
index 6413260..dd29eaf 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickFixProcessor.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/QuickFixProcessor.java
@@ -128,6 +128,8 @@
 			case IProblem.UnnecessaryInstanceof:
 			case IProblem.IndirectAccessToStaticField:
 			case IProblem.IndirectAccessToStaticMethod:
+			case IProblem.SealedMissingClassModifier:
+			case IProblem.SealedMissingInterfaceModifier:
 			case IProblem.Task:
 			case IProblem.UnusedMethodDeclaredThrownException:
 			case IProblem.UnusedConstructorDeclaredThrownException:
@@ -310,6 +312,7 @@
 			case IProblem.SwitchExpressionsYieldMissingDefaultCase:
 			case IProblem.PreviewFeaturesNotAllowed:
 			case IProblem.UninitializedBlankFinalField:
+			case IProblem.FeatureNotSupported:
 			case IProblem.SwitchExpressionsReturnWithinSwitchExpression:
 			case IProblem.DanglingReference:
 				return true;
@@ -462,6 +465,10 @@
 			case IProblem.IndirectAccessToStaticMethod:
 				LocalCorrectionsSubProcessor.addCorrectAccessToStaticProposals(context, problem, proposals);
 				break;
+			case IProblem.SealedMissingClassModifier:
+			case IProblem.SealedMissingInterfaceModifier:
+				ModifierCorrectionSubProcessor.addSealedMissingModifierProposal(context, problem, proposals);
+				break;
 			case IProblem.StaticMethodRequested:
 			case IProblem.NonStaticFieldFromStaticInvocation:
 			case IProblem.InstanceMethodDuringConstructorInvocation:
@@ -870,6 +877,8 @@
 			case IProblem.PreviewFeaturesNotAllowed:
 				PreviewFeaturesSubProcessor.getNeedHigherComplianceProposals(context, problem, proposals);
 				break;
+			case IProblem.FeatureNotSupported:
+				ReorgCorrectionsSubProcessor.getNeedHigherComplianceProposals(context, problem, proposals);
 			case IProblem.SwitchExpressionsReturnWithinSwitchExpression:
 				ReturnTypeSubProcessor.replaceReturnWithYieldStatementProposals(context, problem, proposals);
 				break;
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/ReorgCorrectionsSubProcessor.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/ReorgCorrectionsSubProcessor.java
index b94825d..aff337a 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/ReorgCorrectionsSubProcessor.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/correction/ReorgCorrectionsSubProcessor.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2018 IBM Corporation and others.
+ * Copyright (c) 2000, 2020 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -562,6 +562,13 @@
 		getNeedHigherComplianceProposals(context, problem, proposals, false, requiredVersion);
 	}
 
+	public static void getNeedHigherComplianceProposals(IInvocationContext context, IProblemLocation problem, Collection<ICommandAccess> proposals) {
+		String[] args= problem.getProblemArguments();
+		if (args != null && args.length == 2) {
+			ReorgCorrectionsSubProcessor.getNeedHigherComplianceProposals(context, problem, proposals, false, args[1]);
+		}
+	}
+
 	/**
 	 * Adds a proposal to increase the compiler compliance level as well as set --enable-previews
 	 * option.
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/JavaMultiLineStringAutoIndentStrategy.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/JavaMultiLineStringAutoIndentStrategy.java
index 4d00c5b..b77b35e 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/JavaMultiLineStringAutoIndentStrategy.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/JavaMultiLineStringAutoIndentStrategy.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2019 IBM Corporation and others.
+ * Copyright (c) 2019, 2020 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -26,10 +26,11 @@
 
 import org.eclipse.jdt.core.IJavaProject;
 
+import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
+
 import org.eclipse.jdt.ui.PreferenceConstants;
 
 import org.eclipse.jdt.internal.ui.actions.IndentAction;
-import org.eclipse.jdt.internal.ui.text.correction.PreviewFeaturesSubProcessor;
 
 public class JavaMultiLineStringAutoIndentStrategy extends JavaStringAutoIndentStrategy {
 
@@ -55,8 +56,8 @@
 			fullStr= document.get(line.getOffset(),line.getLength()).trim();
 		}
 		String fullTextBlockText= document.get(offset, length).trim();
-		boolean hasTextBlockEnded= PreviewFeaturesSubProcessor.isPreviewFeatureEnabled(fProject) && fullTextBlockText.endsWith(IndentAction.TEXT_BLOCK_STR);
-		boolean isTextBlock= PreviewFeaturesSubProcessor.isPreviewFeatureEnabled(fProject) && fullStr.endsWith(IndentAction.TEXT_BLOCK_STR);
+		boolean hasTextBlockEnded= JavaModelUtil.is15OrHigher(fProject) && fullTextBlockText.endsWith(IndentAction.TEXT_BLOCK_STR);
+		boolean isTextBlock= JavaModelUtil.is15OrHigher(fProject) && fullStr.endsWith(IndentAction.TEXT_BLOCK_STR);
 		boolean isLineDelimiter= isLineDelimiter(document, command.text);
 		if (isEditorWrapStrings() && isLineDelimiter && isTextBlock) {
 			if (isTextBlock) {
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/JavaStringAutoIndentStrategy.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/JavaStringAutoIndentStrategy.java
index 4661a94..ef705a5 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/JavaStringAutoIndentStrategy.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/JavaStringAutoIndentStrategy.java
@@ -38,12 +38,12 @@
 import org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants;
 
 import org.eclipse.jdt.internal.corext.util.CodeFormatterUtil;
+import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
 
 import org.eclipse.jdt.ui.PreferenceConstants;
 
 import org.eclipse.jdt.internal.ui.JavaPlugin;
 import org.eclipse.jdt.internal.ui.actions.IndentAction;
-import org.eclipse.jdt.internal.ui.text.correction.PreviewFeaturesSubProcessor;
 
 
 /**
@@ -201,7 +201,7 @@
 		IRegion line= document.getLineInformationOfOffset(offset);
 		String string= document.get(line.getOffset(), offset - line.getOffset()).trim();
 		boolean isLineDelimiter= isLineDelimiter(document, command.text);
-		boolean isTextBlock= PreviewFeaturesSubProcessor.isPreviewFeatureEnabled(fProject) && string.endsWith(IndentAction.POTENTIAL_TEXT_BLOCK_STR) && isLineDelimiter;
+		boolean isTextBlock= JavaModelUtil.is15OrHigher(fProject) && string.endsWith(IndentAction.POTENTIAL_TEXT_BLOCK_STR) && isLineDelimiter;
 		if (isTextBlock) {
 			JavaMultiLineStringAutoIndentStrategy mlsStrategy= getMultiLineStringAutoIndentStrategy();
 			mlsStrategy.customizeDocumentCommand(document, command);
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/JavaElementImageProvider.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/JavaElementImageProvider.java
index 44e877a..6ad85ec 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/JavaElementImageProvider.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/JavaElementImageProvider.java
@@ -403,6 +403,14 @@
 					if (JdtFlags.isStatic(member))
 						flags|= JavaElementImageDescriptor.STATIC;
 
+					if (isInterfaceOrClassType(member)) {
+						if (Flags.isSealed(modifiers)) {
+							flags|= JavaElementImageDescriptor.SEALED;
+						}
+						if (Flags.isNonSealed(modifiers)) {
+							flags|= JavaElementImageDescriptor.NON_SEALED;
+						}
+					}
 					if (Flags.isDeprecated(modifiers))
 						flags|= JavaElementImageDescriptor.DEPRECATED;
 
@@ -451,6 +459,17 @@
 		return true;
 	}
 
+	private static boolean isInterfaceOrClassType(IMember element) throws JavaModelException {
+		//check if the type is interface or class
+		boolean val= false;
+		if (element instanceof IType) {
+			IType type= (IType) element;
+			if (type.isInterface() || type.isClass()) {
+				val= true;
+			}
+		}
+		return val;
+	}
 	private static boolean isInterfaceOrAnnotationField(IMember element) throws JavaModelException {
 		// always show the final symbol on interface fields
 		if (element.getElementType() == IJavaElement.FIELD) {
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/JavaElementLinks.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/JavaElementLinks.java
index 1d62fb1..195b162 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/JavaElementLinks.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/viewsupport/JavaElementLinks.java
@@ -46,9 +46,9 @@
 import org.eclipse.jdt.core.Signature;
 import org.eclipse.jdt.core.dom.IBinding;
 
+import org.eclipse.jdt.internal.core.manipulation.util.Strings;
 import org.eclipse.jdt.internal.corext.util.JavaModelUtil;
 import org.eclipse.jdt.internal.corext.util.Messages;
-import org.eclipse.jdt.internal.core.manipulation.util.Strings;
 import org.eclipse.jdt.internal.corext.util.SuperTypeHierarchyCache;
 
 import org.eclipse.jdt.ui.JavaElementLabels;
@@ -387,19 +387,30 @@
 	public static IJavaElement parseURI(URI uri) {
 		String ssp= uri.getSchemeSpecificPart();
 		String[] segments= ssp.split(String.valueOf(LINK_SEPARATOR), -1);
-
+		String refModuleName= null;
 		// replace '[' manually, since URI confuses it for an IPv6 address as per RFC 2732:
 		IJavaElement element= JavaCore.create(segments[1].replace(LINK_BRACKET_REPLACEMENT, '['));
-
+		boolean canReferModuleName= canReferModuleName(element);
 		if (segments.length > 2) {
 			String refTypeName= segments[2];
-			if (refTypeName.indexOf('.') == -1) {
-				try {
-					ITypeParameter resolvedTypeVariable= resolveTypeVariable(element, refTypeName);
-					if (resolvedTypeVariable != null)
-						return resolvedTypeVariable;
-				} catch (JavaModelException e) {
-					JavaPlugin.log(e);
+			int index= refTypeName.indexOf('/');
+			if (index != -1 && canReferModuleName) {
+				refModuleName= refTypeName.substring(0, index);
+				refTypeName= refTypeName.substring(index+1);
+			}
+			if ((refTypeName== null || refTypeName.isEmpty()) &&
+					(refModuleName != null && !refModuleName.isEmpty())) {
+				return getModule(element, refModuleName);
+			}
+			if (refTypeName.indexOf('/') == -1) {
+				if (refTypeName.indexOf('.') == -1) {
+					try {
+						ITypeParameter resolvedTypeVariable= resolveTypeVariable(element, refTypeName);
+						if (resolvedTypeVariable != null)
+							return resolvedTypeVariable;
+					} catch (JavaModelException e) {
+						JavaPlugin.log(e);
+					}
 				}
 			}
 			if (element instanceof IAnnotation) {
@@ -490,6 +501,12 @@
 						// FIXME: either remove or show dialog
 //						JavaPlugin.logErrorMessage("JavaElementLinks could not resolve " + uri); //$NON-NLS-1$
 					}
+					if (type == null &&
+							refModuleName == null &&
+							canReferModuleName &&
+							segments.length <= 3) {
+						return getModule(element, refTypeName);
+					}
 					return type;
 				} catch (JavaModelException e) {
 					JavaPlugin.log(e);
@@ -499,6 +516,31 @@
 		return element;
 	}
 
+
+	private static IJavaElement getModule(IJavaElement element, String moduleName) {
+		if (element == null || moduleName == null) {
+			return null;
+		}
+		IJavaProject javaProject= element.getJavaProject();
+		try {
+			return javaProject.findModule(moduleName, null);
+		} catch (JavaModelException e1) {
+			// do nothing
+		}
+		return null;
+	}
+
+	private static boolean canReferModuleName(IJavaElement element) {
+		boolean canRefer= false;
+		if (element != null) {
+			IJavaProject javaProject= element.getJavaProject();
+			if (javaProject != null) {
+				canRefer = JavaModelUtil.is15OrHigher(javaProject);
+			}
+		}
+		return canRefer;
+	}
+
 	private static IType resolvePackageInfoType(IPackageFragment pack, String refTypeName) throws JavaModelException {
 		// Note: The scoping rules of JLS7 6.3 are broken for package-info.java, see https://bugs.eclipse.org/216451#c4
 		// We follow the javadoc tool's implementation and only support fully-qualified type references:
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/JavaElementImageDescriptor.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/JavaElementImageDescriptor.java
index 0132b42..502d2a6 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/JavaElementImageDescriptor.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/JavaElementImageDescriptor.java
@@ -125,6 +125,20 @@
 	 */
 	public final static int INFO= 0x40000;
 
+	/** Flag to render the sealed adornment.
+	 *
+	 * @noreference This field is not intended to be referenced by clients.
+	 * @since 3.22
+	 */
+	public final static int SEALED=	0x10000000;
+
+	/** Flag to render the sealed adornment.
+	 *
+	 * @noreference This field is not intended to be referenced by clients.
+	 * @since 3.22
+	 */
+	public final static int NON_SEALED=	0x4000000;
+
 	private ImageDescriptor fBaseImage;
 	private int fFlags;
 	private Point fSize;
@@ -281,6 +295,12 @@
 		if ((fFlags & ANNOTATION_DEFAULT) != 0) {
 			addTopRightImage(JavaPluginImages.DESC_OVR_ANNOTATION_DEFAULT_METHOD, pos);
 		}
+		if ((fFlags & SEALED) != 0) {
+			addTopRightImage(JavaPluginImages.DESC_OVR_SEALED, pos);
+		}
+		if ((fFlags & NON_SEALED) != 0) {
+			addTopRightImage(JavaPluginImages.DESC_OVR_NON_SEALED, pos);
+		}
 	}
 
 	private void drawBottomRight() {
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 e0a9a89..f0d941e 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
@@ -33,7 +33,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#JLS14 API level 14} or higher</li>
+ *    <li>the {@link AST#apiLevel() AST API level} is {@link AST#JLS15 API level 15} 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/actions/AddGetterSetterAction.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/AddGetterSetterAction.java
index 53a3f58..f688762 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/AddGetterSetterAction.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/ui/actions/AddGetterSetterAction.java
@@ -1,5 +1,5 @@
 /*******************************************************************************
- * Copyright (c) 2000, 2018 IBM Corporation and others.
+ * Copyright (c) 2000, 2020 IBM Corporation and others.
  *
  * This program and the accompanying materials
  * are made available under the terms of the Eclipse Public License 2.0
@@ -556,7 +556,12 @@
 			if (element != null) {
 				IType type= (IType) element.getAncestor(IJavaElement.TYPE);
 				if (type != null) {
-					if (type.getFields().length > 0) {
+					if (type.isRecord()) {
+						if (type.getRecordComponents().length > 0) {
+							run(type, new IField[0], true);
+							return;
+						}
+					} else if (type.getFields().length > 0) {
 						run(type, new IField[0], true);
 						return;
 					}
@@ -763,6 +768,21 @@
 					result.put(field, l.toArray(new GetterSetterEntry[l.size()]));
 			}
 		}
+		if (type.isRecord()) {
+			for (IField field : type.getRecordComponents()) {
+				int flags= field.getFlags();
+				if (!Flags.isEnum(flags)) {
+					List<GetterSetterEntry> l= new ArrayList<>(1);
+					if (GetterSetterUtil.getGetter(field) == null) {
+						l.add(new GetterSetterEntry(field, true, Flags.isFinal(flags)));
+						incNumEntries();
+					}
+
+					if (!l.isEmpty())
+						result.put(field, l.toArray(new GetterSetterEntry[l.size()]));
+				}
+			}
+		}
 		return result;
 	}
 
diff --git a/pom.xml b/pom.xml
index f2156e2..8dd88b3 100644
--- a/pom.xml
+++ b/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-  Copyright (c) 2012, 2019 Eclipse Foundation and others.
+  Copyright (c) 2012, 2020 Eclipse Foundation and others.
   All rights reserved. This program and the accompanying materials
   are made available under the terms of the Eclipse Distribution License v1.0
   which accompanies this distribution, and is available at
@@ -47,6 +47,26 @@
           <url>https://repo.eclipse.org/content/repositories/eclipse/</url>
         </repository>
       </repositories>
+      <build>
+      	<plugins>
+      		<plugin>
+      			<groupId>org.eclipse.tycho.extras</groupId>
+      			<artifactId>tycho-p2-extras-plugin</artifactId>
+      			<version>${tycho.version}</version>
+      			<executions>
+      				<execution> <!-- Checks versions are properly bumped from one stream to the other -->
+      					<id>compare-attached-artifacts-with-release</id>
+      					<goals>
+      						<goal>compare-version-with-baselines</goal>
+      					</goals>
+      					<configuration>
+      						<skip>true</skip>
+      					</configuration>
+      				</execution>
+      			</executions>
+      		</plugin>
+      	</plugins>
+      </build>
     </profile>
   </profiles>