Bug 571868 - [16] Merge BETA branch to master - update bundle and
dependency versions

Merge remote-tracking branch 'origin/BETA_JAVA16'

Change-Id: Ic4d52f21d6b1eac76999dd315d73e71c6be80421
Signed-off-by: Kalyan Prasad Tatavarthi <kalyan_prasad@in.ibm.com>
diff --git a/org.eclipse.jdt.astview.feature/pom.xml b/org.eclipse.jdt.astview.feature/pom.xml
index 62136a3..fe78901 100644
--- a/org.eclipse.jdt.astview.feature/pom.xml
+++ b/org.eclipse.jdt.astview.feature/pom.xml
@@ -14,7 +14,7 @@
   <parent>
     <artifactId>eclipse.jdt.ui</artifactId>
     <groupId>eclipse.jdt.ui</groupId>
-    <version>4.19.0-SNAPSHOT</version>
+    <version>4.20.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.jdt.feature</groupId>
   <artifactId>org.eclipse.jdt.astview.feature</artifactId>
diff --git a/org.eclipse.jdt.astview/META-INF/MANIFEST.MF b/org.eclipse.jdt.astview/META-INF/MANIFEST.MF
index 33cba71..48d87ac 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.550.qualifier
+Bundle-Version: 1.4.600.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 a6328f6..ddae77e 100644
--- a/org.eclipse.jdt.astview/pom.xml
+++ b/org.eclipse.jdt.astview/pom.xml
@@ -14,10 +14,10 @@
   <parent>
     <artifactId>eclipse.jdt.ui</artifactId>
     <groupId>eclipse.jdt.ui</groupId>
-    <version>4.19.0-SNAPSHOT</version>
+    <version>4.20.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.jdt</groupId>
   <artifactId>org.eclipse.jdt.astview</artifactId>
-  <version>1.4.550-SNAPSHOT</version>
+  <version>1.4.600-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/org.eclipse.jdt.core.manipulation/META-INF/MANIFEST.MF b/org.eclipse.jdt.core.manipulation/META-INF/MANIFEST.MF
index f7bdd0f..7568d97 100644
--- a/org.eclipse.jdt.core.manipulation/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.core.manipulation/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.jdt.core.manipulation; singleton:=true
-Bundle-Version: 1.14.350.qualifier
+Bundle-Version: 1.14.400.qualifier
 Bundle-Vendor: %providerName
 Bundle-Activator: org.eclipse.jdt.internal.core.manipulation.JavaManipulationPlugin
 Bundle-Localization: plugin
diff --git a/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/fix/PlainReplacementCleanUpCore.java b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/fix/PlainReplacementCleanUpCore.java
index 181cbd4..7f30819 100644
--- a/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/fix/PlainReplacementCleanUpCore.java
+++ b/org.eclipse.jdt.core.manipulation/common/org/eclipse/jdt/internal/ui/fix/PlainReplacementCleanUpCore.java
@@ -71,15 +71,15 @@
 		if (isEnabled(CleanUpConstants.PLAIN_REPLACEMENT)) {
 			return "" //$NON-NLS-1$
 					+ "String result = text.replace(\"foo\", \"bar\");\n" //$NON-NLS-1$
-					+ "String result2 = text.replace(\"&\", \"&amp;\");\n" //$NON-NLS-1$
-					+ "String result3 = text.replaceAll(\"[ab]\", \"c\");\n" //$NON-NLS-1$
-					+ "String result4 = text.replaceAll(\"\\s\". \"\");\n"; //$NON-NLS-1$
+					+ "String result2 = text.replace(\"$0.02\", \"$0.50\");\n" //$NON-NLS-1$
+					+ "String result3 = text.replace('.', '/');\n" //$NON-NLS-1$
+					+ "String result4 = text.replace(placeholder, value);\n"; //$NON-NLS-1$
 		}
 
 		return "" //$NON-NLS-1$
 				+ "String result = text.replaceAll(\"foo\", \"bar\");\n" //$NON-NLS-1$
-				+ "String result2 = text.replaceAll(\"&\", \"&amp;\");\n" //$NON-NLS-1$
-				+ "String result3 = text.replaceAll(\"[ab]\", \"c\");\n" //$NON-NLS-1$
-				+ "String result4 = text.replaceAll(\"\\s\". \"\");\n"; //$NON-NLS-1$
+				+ "String result2 = text.replaceAll(\"\\\\$0\\\\.02\", \"\\\\$0.50\");\n" //$NON-NLS-1$
+				+ "String result3 = text.replaceAll(\"\\\\.\", \"/\");\n" //$NON-NLS-1$
+				+ "String result4 = text.replaceAll(Pattern.quote(placeholder), Matcher.quoteReplacement(value));\n"; //$NON-NLS-1$
 	}
 }
diff --git a/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/fix/PlainReplacementFixCore.java b/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/fix/PlainReplacementFixCore.java
index 38ae849..bb58cf9 100644
--- a/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/fix/PlainReplacementFixCore.java
+++ b/org.eclipse.jdt.core.manipulation/core extension/org/eclipse/jdt/internal/corext/fix/PlainReplacementFixCore.java
@@ -10,6 +10,7 @@
  *
  * Contributors:
  *     Fabrice TIERCELIN - initial API and implementation
+ *     Holger Voormann - Handles Pattern.quote(), Matcher.quoteReplacement(), lone chars and escaped texts
  *******************************************************************************/
 package org.eclipse.jdt.internal.corext.fix;
 
@@ -25,9 +26,11 @@
 import org.eclipse.jdt.core.dom.AST;
 import org.eclipse.jdt.core.dom.ASTNode;
 import org.eclipse.jdt.core.dom.ASTVisitor;
+import org.eclipse.jdt.core.dom.CharacterLiteral;
 import org.eclipse.jdt.core.dom.CompilationUnit;
 import org.eclipse.jdt.core.dom.Expression;
 import org.eclipse.jdt.core.dom.MethodInvocation;
+import org.eclipse.jdt.core.dom.StringLiteral;
 import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;
 import org.eclipse.jdt.core.dom.rewrite.TargetSourceRangeComputer;
 import org.eclipse.jdt.core.manipulation.ICleanUpFixCore;
@@ -39,8 +42,6 @@
 
 public class PlainReplacementFixCore extends CompilationUnitRewriteOperationsFixCore {
 	public static final class PlainReplacementFinder extends ASTVisitor {
-		private Pattern HAS_REGEX_CHARACTER= Pattern.compile("[\\\\\\[\\]\\{\\}\\(\\)\\*\\+\\?\\.\\^\\$\\|]"); //$NON-NLS-1$
-
 		private List<PlainReplacementFixOperation> fResult;
 
 		public PlainReplacementFinder(List<PlainReplacementFixOperation> ops) {
@@ -49,21 +50,33 @@
 
 		@Override
 		public boolean visit(final MethodInvocation visited) {
-			if (ASTNodes.usesGivenSignature(visited, String.class.getCanonicalName(), "replaceAll", String.class.getCanonicalName(), String.class.getCanonicalName())) { //$NON-NLS-1$
-				Object pattern= ((Expression) visited.arguments().get(0)).resolveConstantExpressionValue();
-				Object replacement= ((Expression) visited.arguments().get(1)).resolveConstantExpressionValue();
+			if (ASTNodes.usesGivenSignature(visited, String.class.getCanonicalName(), "replaceAll", String.class.getCanonicalName(), String.class.getCanonicalName()) //$NON-NLS-1$
+					&& isPlainStringArgument(visited, true, 0, Pattern.class, "quote") //$NON-NLS-1$
+					&& isPlainStringArgument(visited, false, 1, Matcher.class, "quoteReplacement")) { //$NON-NLS-1$
+				fResult.add(new PlainReplacementFixOperation(visited));
 
-				if (pattern instanceof String
-						&& !HAS_REGEX_CHARACTER.matcher((String) pattern).find()
-						&& replacement instanceof String
-						&& ((String) replacement).equals(Matcher.quoteReplacement((String) replacement))) {
-					fResult.add(new PlainReplacementFixOperation(visited));
-					return false;
+				if (visited.getExpression() != null) {
+					visited.getExpression().accept(this);
 				}
+
+				return false;
 			}
 
 			return true;
 		}
+
+		private boolean isPlainStringArgument(final MethodInvocation visited, final boolean isRegex, final int index, final Class<?> klass, final String methodName) {
+			Expression argument= (Expression) visited.arguments().get(index);
+
+			if (argument instanceof MethodInvocation
+					&& ASTNodes.usesGivenSignature((MethodInvocation) argument, klass.getCanonicalName(), methodName, String.class.getCanonicalName())) {
+				return true;
+			}
+
+			Object argumentResolved= argument.resolveConstantExpressionValue();
+			return argumentResolved instanceof String && toPlainString((String) argumentResolved, isRegex, argument instanceof StringLiteral) != null;
+		}
+
 	}
 
 	public static class PlainReplacementFixOperation extends CompilationUnitRewriteOperation {
@@ -90,9 +103,63 @@
 			});
 
 			rewrite.set(visited, MethodInvocation.NAME_PROPERTY, ast.newSimpleName("replace"), group); //$NON-NLS-1$
-		}
-	}
+			String arg1= tryToSimplifyStringLiteralArgument(true, ast, rewrite, group);
+			String arg2= tryToSimplifyStringLiteralArgument(false, ast, rewrite, group);
 
+			if (arg1 != null
+					&& arg2 != null
+					&& arg1.length() == 1
+					&& arg2.length() == 1) {
+				convertStringLiteralArgumentToChar(true, arg1, ast, rewrite, group);
+				convertStringLiteralArgumentToChar(false, arg2, ast, rewrite, group);
+			} else {
+				useQuotedArgumentWhenPossible(true, rewrite, group);
+				useQuotedArgumentWhenPossible(false, rewrite, group);
+			}
+		}
+
+		private String tryToSimplifyStringLiteralArgument(boolean isRegex, final AST ast, final ASTRewrite rewrite, final TextEditGroup group) {
+			int index= isRegex ? 0 : 1;
+			Expression argument= (Expression) visited.arguments().get(index);
+
+			if (!(argument instanceof StringLiteral)) {
+				return null;
+			}
+
+			String argumentResolved= (String) argument.resolveConstantExpressionValue();
+			String asPlainString= toPlainString(argumentResolved, isRegex, true);
+
+			if (asPlainString == null) {
+				return null;
+			} else if (argumentResolved.equals(asPlainString)) {
+				return argumentResolved;
+			}
+
+			// rewrite String literal
+			StringLiteral dummyStringLiteral= ast.newStringLiteral();
+			dummyStringLiteral.setLiteralValue(asPlainString);
+			rewrite.set(((StringLiteral) visited.arguments().get(index)), StringLiteral.ESCAPED_VALUE_PROPERTY, dummyStringLiteral.getEscapedValue(), group);
+			return asPlainString;
+		}
+
+		private void convertStringLiteralArgumentToChar(final boolean isRegex, final String string, final AST ast, final ASTRewrite rewrite, final TextEditGroup group) {
+			int index= isRegex ? 0 : 1;
+			CharacterLiteral characterLiteral= ast.newCharacterLiteral();
+			characterLiteral.setCharValue(string.charAt(0));
+			ASTNodes.replaceButKeepComment(rewrite, (ASTNode) visited.arguments().get(index), characterLiteral, group);
+		}
+
+		private void useQuotedArgumentWhenPossible(final boolean isRegex, final ASTRewrite rewrite, final TextEditGroup group) {
+			int index= isRegex ? 0 : 1;
+			Expression argument= (Expression) visited.arguments().get(index);
+
+			if (argument instanceof MethodInvocation) {
+				Expression quoteExpr= (Expression) ((MethodInvocation) argument).arguments().get(0);
+				ASTNodes.replaceButKeepComment(rewrite, argument, ASTNodes.createMoveTarget(rewrite, quoteExpr), group);
+			}
+		}
+
+	}
 
 	public static ICleanUpFixCore createCleanUp(final CompilationUnit compilationUnit) {
 		List<PlainReplacementFixOperation> operations= new ArrayList<>();
@@ -110,4 +177,90 @@
 	protected PlainReplacementFixCore(final String name, final CompilationUnit compilationUnit, final CompilationUnitRewriteOperationsFixCore.CompilationUnitRewriteOperation[] fixRewriteOperations) {
 		super(name, compilationUnit, fixRewriteOperations);
 	}
+
+	/**
+	 * @param regexOrReplacement the regular expression or the replacement to convert to a plain String
+	 * @param isRegex {@code true} to convert a regular expression, {@code false} to convert a replacement
+	 * @param doUnescape {@code true} if and only if removing of escaping to convert to a plain String is allowed
+	 * @return the plain String or {@code null} if the given regular expression cannot be converted to a plain String
+	 *         or when in doubt (for the sake of simplicity, e.g. {@code null} is also returned for {@code "a[b]c"}
+	 *         even if that would be {@code "abc"})
+	 */
+	private static String toPlainString(final String regexOrReplacement, final boolean isRegex, final boolean doUnescape) {
+		boolean isEscaped= false;
+		StringBuilder plainString= null;
+
+		for (int i= 0; i < regexOrReplacement.length(); i++) {
+			char c= regexOrReplacement.charAt(i);
+
+			if (Character.isSurrogate(c)) {
+				// See https://bugs.openjdk.java.net/browse/JDK-8149446
+				return null;
+			} else if (isMetaChar(c, isRegex)) {
+				if (isEscaped) {
+					if (plainString == null) {
+						if (!doUnescape) {
+							return null;
+						}
+
+						plainString= new StringBuilder();
+
+						if (i > 1) {
+							plainString.append(regexOrReplacement, 0, i - 1);
+						}
+					}
+
+					plainString.append(c);
+				} else if (c != '\\') {
+					return null;
+				}
+
+			// in regex, escaped non-meta chars might have special meaning, e.g. \s, \d, \W, etc.
+			// in replacement, escaped non-meta chars do not have a special meaning (escaping is here unnecessary and will be ignored)
+			} else if (isEscaped) {
+				if (isRegex || (!doUnescape && !isMetaChar(c, false))) {
+					return null;
+				}
+
+				if (!isMetaChar(c, false)) {
+					if (plainString == null) {
+						plainString= new StringBuilder();
+
+						if (i > 1) {
+							plainString.append(regexOrReplacement, 0, i - 1);
+						}
+					}
+
+					plainString.append(c);
+				}
+			} else if (plainString != null) {
+				plainString.append(c);
+			}
+
+			isEscaped= !isEscaped && c == '\\';
+		}
+
+		return isEscaped ? null : (plainString == null ? regexOrReplacement : plainString.toString());
+	}
+
+	private static boolean isMetaChar(char c, boolean isRegex) {
+		if (isRegex) {
+			return c == '.'
+					|| c == '$'
+					|| c == '|'
+					|| c == '('
+					|| c == ')'
+					|| c == '['
+					|| c == ']'
+					|| c == '{'
+					|| c == '}'
+					|| c == '^'
+					|| c == '?'
+					|| c == '*'
+					|| c == '+'
+					|| c == '\\';
+		}
+
+		return c == '$' || c == '\\';
+	}
 }
diff --git a/org.eclipse.jdt.core.manipulation/pom.xml b/org.eclipse.jdt.core.manipulation/pom.xml
index a11e053..c8c3065 100644
--- a/org.eclipse.jdt.core.manipulation/pom.xml
+++ b/org.eclipse.jdt.core.manipulation/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-  Copyright (c) 2012, 2021 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
@@ -14,10 +14,10 @@
   <parent>
     <artifactId>eclipse.jdt.ui</artifactId>
     <groupId>eclipse.jdt.ui</groupId>
-    <version>4.19.0-SNAPSHOT</version>
+    <version>4.20.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.jdt</groupId>
   <artifactId>org.eclipse.jdt.core.manipulation</artifactId>
-  <version>1.14.350-SNAPSHOT</version>
+  <version>1.14.400-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/org.eclipse.jdt.jeview.feature/pom.xml b/org.eclipse.jdt.jeview.feature/pom.xml
index 26274f3..1919b6e 100644
--- a/org.eclipse.jdt.jeview.feature/pom.xml
+++ b/org.eclipse.jdt.jeview.feature/pom.xml
@@ -14,7 +14,7 @@
   <parent>
     <artifactId>eclipse.jdt.ui</artifactId>
     <groupId>eclipse.jdt.ui</groupId>
-    <version>4.19.0-SNAPSHOT</version>
+    <version>4.20.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.jdt.feature</groupId>
   <artifactId>org.eclipse.jdt.jeview.feature</artifactId>
diff --git a/org.eclipse.jdt.jeview/META-INF/MANIFEST.MF b/org.eclipse.jdt.jeview/META-INF/MANIFEST.MF
index c501132..1bc44fc 100644
--- a/org.eclipse.jdt.jeview/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.jeview/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.jdt.jeview; singleton:=true
-Bundle-Version: 1.3.300.qualifier
+Bundle-Version: 1.3.400.qualifier
 Eclipse-SourceReferences: scm:git:git://git.eclipse.org/gitroot/jdt/eclipse.jdt.ui.git;path="org.eclipse.jdt.jeview";tag=R4_4
 Bundle-Activator: org.eclipse.jdt.jeview.JEViewPlugin
 Bundle-Vendor: %providerName
diff --git a/org.eclipse.jdt.jeview/pom.xml b/org.eclipse.jdt.jeview/pom.xml
index 8e52bae..a11bc46 100644
--- a/org.eclipse.jdt.jeview/pom.xml
+++ b/org.eclipse.jdt.jeview/pom.xml
@@ -14,10 +14,10 @@
   <parent>
     <artifactId>eclipse.jdt.ui</artifactId>
     <groupId>eclipse.jdt.ui</groupId>
-    <version>4.19.0-SNAPSHOT</version>
+    <version>4.20.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.jdt</groupId>
   <artifactId>org.eclipse.jdt.jeview</artifactId>
-  <version>1.3.300-SNAPSHOT</version>
+  <version>1.3.400-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/org.eclipse.jdt.junit.core/META-INF/MANIFEST.MF b/org.eclipse.jdt.junit.core/META-INF/MANIFEST.MF
index 5688d59..30057b5 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.1050.qualifier
+Bundle-Version: 3.10.1100.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 cc55ae5..3f6ead1 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, 2021 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
@@ -14,10 +14,10 @@
   <parent>
     <artifactId>eclipse.jdt.ui</artifactId>
     <groupId>eclipse.jdt.ui</groupId>
-    <version>4.19.0-SNAPSHOT</version>
+    <version>4.20.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.jdt</groupId>
   <artifactId>org.eclipse.jdt.junit.core</artifactId>
-  <version>3.10.1050-SNAPSHOT</version>
+  <version>3.10.1100-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/org.eclipse.jdt.junit.runtime/META-INF/MANIFEST.MF b/org.eclipse.jdt.junit.runtime/META-INF/MANIFEST.MF
index a714324..418fef7 100644
--- a/org.eclipse.jdt.junit.runtime/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.junit.runtime/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.jdt.junit.runtime;singleton:=true
-Bundle-Version: 3.5.500.qualifier
+Bundle-Version: 3.5.600.qualifier
 Bundle-Vendor: %providerName
 Bundle-Localization: plugin
 Export-Package: org.eclipse.jdt.internal.junit.runner;
diff --git a/org.eclipse.jdt.junit.runtime/pom.xml b/org.eclipse.jdt.junit.runtime/pom.xml
index 7c7517a..feafa08 100644
--- a/org.eclipse.jdt.junit.runtime/pom.xml
+++ b/org.eclipse.jdt.junit.runtime/pom.xml
@@ -14,10 +14,10 @@
   <parent>
     <artifactId>eclipse.jdt.ui</artifactId>
     <groupId>eclipse.jdt.ui</groupId>
-    <version>4.19.0-SNAPSHOT</version>
+    <version>4.20.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.jdt</groupId>
   <artifactId>org.eclipse.jdt.junit.runtime</artifactId>
-  <version>3.5.500-SNAPSHOT</version>
+  <version>3.5.600-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/org.eclipse.jdt.junit/META-INF/MANIFEST.MF b/org.eclipse.jdt.junit/META-INF/MANIFEST.MF
index 3bec0bf..c87e90f 100644
--- a/org.eclipse.jdt.junit/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.junit/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.jdt.junit;singleton:=true
-Bundle-Version: 3.11.1100.qualifier
+Bundle-Version: 3.11.1200.qualifier
 Bundle-Activator: org.eclipse.jdt.internal.junit.ui.JUnitPlugin
 Bundle-ActivationPolicy: lazy
 Bundle-Vendor: %providerName
diff --git a/org.eclipse.jdt.junit/pom.xml b/org.eclipse.jdt.junit/pom.xml
index 6a65567..62f48e5 100644
--- a/org.eclipse.jdt.junit/pom.xml
+++ b/org.eclipse.jdt.junit/pom.xml
@@ -14,10 +14,10 @@
   <parent>
     <artifactId>eclipse.jdt.ui</artifactId>
     <groupId>eclipse.jdt.ui</groupId>
-    <version>4.19.0-SNAPSHOT</version>
+    <version>4.20.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.jdt</groupId>
   <artifactId>org.eclipse.jdt.junit</artifactId>
-  <version>3.11.1100-SNAPSHOT</version>
+  <version>3.11.1200-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/org.eclipse.jdt.junit4.runtime/META-INF/MANIFEST.MF b/org.eclipse.jdt.junit4.runtime/META-INF/MANIFEST.MF
index e32ef67..3368297 100644
--- a/org.eclipse.jdt.junit4.runtime/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.junit4.runtime/META-INF/MANIFEST.MF
@@ -4,7 +4,7 @@
 Bundle-Name: %pluginName
 Bundle-Vendor: %providerName
 Bundle-SymbolicName: org.eclipse.jdt.junit4.runtime;singleton:=true
-Bundle-Version: 1.1.1500.qualifier
+Bundle-Version: 1.1.1600.qualifier
 Bundle-Localization: plugin
 Export-Package: org.eclipse.jdt.internal.junit4.runner;x-internal:=true
 Require-Bundle: org.junit;bundle-version="4.7.0",
diff --git a/org.eclipse.jdt.junit4.runtime/pom.xml b/org.eclipse.jdt.junit4.runtime/pom.xml
index da35e4e..3e2831b 100644
--- a/org.eclipse.jdt.junit4.runtime/pom.xml
+++ b/org.eclipse.jdt.junit4.runtime/pom.xml
@@ -14,10 +14,10 @@
   <parent>
     <artifactId>eclipse.jdt.ui</artifactId>
     <groupId>eclipse.jdt.ui</groupId>
-    <version>4.19.0-SNAPSHOT</version>
+    <version>4.20.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.jdt</groupId>
   <artifactId>org.eclipse.jdt.junit4.runtime</artifactId>
-  <version>1.1.1500-SNAPSHOT</version>
+  <version>1.1.1600-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/org.eclipse.jdt.junit5.runtime/META-INF/MANIFEST.MF b/org.eclipse.jdt.junit5.runtime/META-INF/MANIFEST.MF
index 3f17e06..dbc3a59 100644
--- a/org.eclipse.jdt.junit5.runtime/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.junit5.runtime/META-INF/MANIFEST.MF
@@ -4,7 +4,7 @@
 Bundle-Name: %pluginName
 Bundle-Vendor: %providerName
 Bundle-SymbolicName: org.eclipse.jdt.junit5.runtime;singleton:=true
-Bundle-Version: 1.0.1200.qualifier
+Bundle-Version: 1.0.1300.qualifier
 Bundle-Localization: plugin
 Export-Package: org.eclipse.jdt.internal.junit5.runner;x-internal:=true
 Require-Bundle: org.eclipse.jdt.junit.runtime;bundle-version="[3.5.0,4.0.0)",
diff --git a/org.eclipse.jdt.junit5.runtime/pom.xml b/org.eclipse.jdt.junit5.runtime/pom.xml
index 01aed22..b9777b3 100644
--- a/org.eclipse.jdt.junit5.runtime/pom.xml
+++ b/org.eclipse.jdt.junit5.runtime/pom.xml
@@ -14,10 +14,10 @@
   <parent>
     <artifactId>eclipse.jdt.ui</artifactId>
     <groupId>eclipse.jdt.ui</groupId>
-    <version>4.19.0-SNAPSHOT</version>
+    <version>4.20.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.jdt</groupId>
   <artifactId>org.eclipse.jdt.junit5.runtime</artifactId>
-  <version>1.0.1200-SNAPSHOT</version>
+  <version>1.0.1300-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/org.eclipse.jdt.text.tests/META-INF/MANIFEST.MF b/org.eclipse.jdt.text.tests/META-INF/MANIFEST.MF
index 57e2674..ac37ace 100644
--- a/org.eclipse.jdt.text.tests/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.text.tests/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %Plugin.name
 Bundle-SymbolicName: org.eclipse.jdt.text.tests;singleton:=true
-Bundle-Version: 3.13.1200.qualifier
+Bundle-Version: 3.13.1300.qualifier
 Bundle-Activator: org.eclipse.jdt.text.tests.JdtTextTestPlugin
 Bundle-ActivationPolicy: lazy
 Bundle-Vendor: %Plugin.providerName
diff --git a/org.eclipse.jdt.text.tests/pom.xml b/org.eclipse.jdt.text.tests/pom.xml
index 913c450..21efaf9 100644
--- a/org.eclipse.jdt.text.tests/pom.xml
+++ b/org.eclipse.jdt.text.tests/pom.xml
@@ -15,12 +15,12 @@
   <parent>
     <artifactId>tests-pom</artifactId>
     <groupId>eclipse.jdt.ui</groupId>
-    <version>4.19.0-SNAPSHOT</version>
+    <version>4.20.0-SNAPSHOT</version>
     <relativePath>../tests-pom/</relativePath>
   </parent>
   <groupId>org.eclipse.jdt</groupId>
   <artifactId>org.eclipse.jdt.text.tests</artifactId>
-  <version>3.13.1200-SNAPSHOT</version>
+  <version>3.13.1300-SNAPSHOT</version>
   <packaging>eclipse-test-plugin</packaging>
 
   <properties>
diff --git a/org.eclipse.jdt.ui.examples.projects/META-INF/MANIFEST.MF b/org.eclipse.jdt.ui.examples.projects/META-INF/MANIFEST.MF
index 161463c..94e1ace 100644
--- a/org.eclipse.jdt.ui.examples.projects/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.ui.examples.projects/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.jdt.ui.examples.projects; singleton:=true
-Bundle-Version: 3.1.200.qualifier
+Bundle-Version: 3.1.300.qualifier
 Bundle-ClassPath: jdtexamples.jar
 Bundle-Activator: org.eclipse.jdt.internal.ui.exampleprojects.ExampleProjectsPlugin
 Bundle-ActivationPolicy: lazy
diff --git a/org.eclipse.jdt.ui.examples.projects/pom.xml b/org.eclipse.jdt.ui.examples.projects/pom.xml
index 7406a74..bb06c19 100644
--- a/org.eclipse.jdt.ui.examples.projects/pom.xml
+++ b/org.eclipse.jdt.ui.examples.projects/pom.xml
@@ -11,11 +11,11 @@
 	<parent>
 		<artifactId>eclipse.jdt.ui</artifactId>
 		<groupId>eclipse.jdt.ui</groupId>
-		<version>4.19.0-SNAPSHOT</version>
+		<version>4.20.0-SNAPSHOT</version>
 	</parent>
 	<groupId>org.eclipse.jdt</groupId>
 	<artifactId>org.eclipse.jdt.ui.examples.projects</artifactId>
-	<version>3.1.200-SNAPSHOT</version>
+	<version>3.1.300-SNAPSHOT</version>
 	<packaging>eclipse-plugin</packaging>
 	<dependencies>
 		<dependency>
diff --git a/org.eclipse.jdt.ui.junit.sampleproject/pom.xml b/org.eclipse.jdt.ui.junit.sampleproject/pom.xml
index 92cd8aa..5a71c7b 100644
--- a/org.eclipse.jdt.ui.junit.sampleproject/pom.xml
+++ b/org.eclipse.jdt.ui.junit.sampleproject/pom.xml
@@ -19,7 +19,7 @@
 	<parent>
 		<artifactId>eclipse.jdt.ui</artifactId>
 		<groupId>eclipse.jdt.ui</groupId>
-		<version>4.19.0-SNAPSHOT</version>
+		<version>4.20.0-SNAPSHOT</version>
 	</parent>
 	<groupId>org.eclipse.jdt.ui</groupId>
 	<artifactId>org.eclipse.jdt.ui.junit.sampleproject</artifactId>
@@ -61,7 +61,6 @@
 			<plugin>
 				<groupId>org.apache.maven.plugins</groupId>
 				<artifactId>maven-surefire-plugin</artifactId>
-				<version>2.12.4</version>
 				<configuration>
 					<skipTests>${skipTests}</skipTests>
 				</configuration>
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 b0c3d43..669bf47 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.1350.qualifier
+Bundle-Version: 3.13.1400.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/pom.xml b/org.eclipse.jdt.ui.tests.refactoring/pom.xml
index 14c7dca..f9b0359 100644
--- a/org.eclipse.jdt.ui.tests.refactoring/pom.xml
+++ b/org.eclipse.jdt.ui.tests.refactoring/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-  Copyright (c) 2012, 2021 Eclipse Foundation and others.
+  Copyright (c) 2012, 2019 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
@@ -14,12 +14,12 @@
   <parent>
     <artifactId>tests-pom</artifactId>
     <groupId>eclipse.jdt.ui</groupId>
-    <version>4.19.0-SNAPSHOT</version>
+    <version>4.20.0-SNAPSHOT</version>
     <relativePath>../tests-pom/</relativePath>
   </parent>
   <groupId>org.eclipse.jdt</groupId>
   <artifactId>org.eclipse.jdt.ui.tests.refactoring</artifactId>
-  <version>3.13.1350-SNAPSHOT</version>
+  <version>3.13.1400-SNAPSHOT</version>
   <packaging>eclipse-test-plugin</packaging>
   <properties>
     <testSuite>${project.artifactId}</testSuite>
diff --git a/org.eclipse.jdt.ui.tests/META-INF/MANIFEST.MF b/org.eclipse.jdt.ui.tests/META-INF/MANIFEST.MF
index 9980540..23c81ec 100644
--- a/org.eclipse.jdt.ui.tests/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.ui.tests/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %Plugin.name
 Bundle-SymbolicName: org.eclipse.jdt.ui.tests; singleton:=true
-Bundle-Version: 3.13.1350.qualifier
+Bundle-Version: 3.13.1400.qualifier
 Bundle-Activator: org.eclipse.jdt.testplugin.JavaTestPlugin
 Bundle-Vendor: %Plugin.providerName
 Bundle-Localization: plugin
diff --git a/org.eclipse.jdt.ui.tests/pom.xml b/org.eclipse.jdt.ui.tests/pom.xml
index f0731d5..e5705fa 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, 2021 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
@@ -15,17 +15,17 @@
   <parent>
     <artifactId>tests-pom</artifactId>
     <groupId>eclipse.jdt.ui</groupId>
-    <version>4.19.0-SNAPSHOT</version>
+    <version>4.20.0-SNAPSHOT</version>
     <relativePath>../tests-pom/</relativePath>
   </parent>
   <groupId>org.eclipse.jdt</groupId>
   <artifactId>org.eclipse.jdt.ui.tests</artifactId>
-  <version>3.13.1350-SNAPSHOT</version>
+  <version>3.13.1400-SNAPSHOT</version>
   <packaging>eclipse-test-plugin</packaging>
   <properties>
     <defaultSigning-excludeInnerJars>true</defaultSigning-excludeInnerJars>
     <!-- Necessary for leakTests to succeed without raising module/classloader issues on Java 9+ -->
-    <leakTestsArgLine>--add-modules ALL-SYSTEM --add-opens java.base/jdk.internal.loader=ALL-UNNAMED --add-opens jdk.localedata/sun.util.resources.cldr.provider=ALL-UNNAMED --add-opens jdk.localedata/sun.util.resources.provider=ALL-UNNAMED --add-opens java.base/jdk.internal.module=ALL-UNNAMED --add-opens java.base/java.lang.module=ALL-UNNAMED --add-opens java.base/jdk.internal.reflect=ALL-UNNAMED --add-opens java.base/jdk.internal.ref=ALL-UNNAMED --add-opens java.base/jdk.internal.math=ALL-UNNAMED --add-opens java.base/jdk.internal.misc=ALL-UNNAMED --add-opens java.base/jdk.internal.icu.impl=ALL-UNNAMED --add-opens java.base/jdk.internal.icu.text=ALL-UNNAMED --illegal-access=permit</leakTestsArgLine>
+    <leakTestsArgLine>--add-modules ALL-SYSTEM --add-opens java.base/jdk.internal.loader=ALL-UNNAMED --add-opens jdk.localedata/sun.util.resources.cldr.provider=ALL-UNNAMED --add-opens jdk.localedata/sun.util.resources.provider=ALL-UNNAMED --add-opens java.base/jdk.internal.module=ALL-UNNAMED --add-opens java.base/java.lang.module=ALL-UNNAMED --add-opens java.base/jdk.internal.reflect=ALL-UNNAMED --add-opens java.base/jdk.internal.ref=ALL-UNNAMED --add-opens java.base/jdk.internal.math=ALL-UNNAMED --add-opens java.base/jdk.internal.misc=ALL-UNNAMED --add-opens java.base/jdk.internal.icu.impl=ALL-UNNAMED --add-opens java.base/jdk.internal.icu.text=ALL-UNNAMED</leakTestsArgLine>
   </properties>
 
   <build>
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 9501695..99cccc1 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
@@ -67,8 +67,10 @@
 import org.eclipse.jdt.ui.tests.core.rules.ProjectTestSetup;
 
 import org.eclipse.jdt.internal.ui.JavaPlugin;
+import org.eclipse.jdt.internal.ui.fix.AbstractCleanUpCore;
 import org.eclipse.jdt.internal.ui.fix.Java50CleanUp;
 import org.eclipse.jdt.internal.ui.fix.MultiFixMessages;
+import org.eclipse.jdt.internal.ui.fix.PlainReplacementCleanUpCore;
 import org.eclipse.jdt.internal.ui.fix.RedundantModifiersCleanUp;
 import org.eclipse.jdt.internal.ui.fix.UnimplementedCodeCleanUp;
 import org.eclipse.jdt.internal.ui.text.correction.ProblemLocation;
@@ -15328,28 +15330,108 @@
 		String given= "" //
 				+ "package test1;\n" //
 				+ "\n" //
+				+ "import java.io.File;\n" //
+				+ "import java.util.regex.Matcher;\n" //
+				+ "import java.util.regex.Pattern;\n" //
+				+ "\n" //
 				+ "public class E {\n" //
 				+ "    private static final String CONSTANT = \"&\";\n" //
+				+ "    private static final String CONSTANT2 = \"+\";\n" //
 				+ "\n" //
-				+ "    public void refactor(String text) {\n" //
-				+ "        String s1 = text.replaceAll(\"&\", \"&amp;\");\n" //
-				+ "        String s2 = text.replaceAll(\",:#\", \"/\");\n" //
-				+ "        String s3 = text.replaceAll(\"/\", \".\");\n" //
-				+ "        String s4 = text.replaceAll(CONSTANT, \"&amp;\");\n" //
+				+ "    public void refactorUsingString(String text, String placeholder, String value) {\n" //
+				+ "        String result1 = text.replaceAll(\"&\", \"&amp;\");\n" //
+				+ "        String result2 = text.replaceAll(\",:#\", \"/\");\n" //
+				+ "        String result3 = text.replaceAll(\"\\\\^a\", \"b\" + \"c\");\n" //
+				+ "        String result4 = text.replaceAll(CONSTANT, \"&amp;\");\n" //
+				+ "        String result5 = text.replaceAll(\"\\\\.\", \"\\r\\n\");\n" //
+				+ "        String result6 = text.replaceAll(\"-\\\\.-\", \"\\\\$\\\\.\\\\x\");\n" //
+				+ "        String result7 = text.replaceAll(\"foo\", \"\\\\\\\\-\\\\$1\\\\s\");\n" //
+				+ "        String result8 = text.replaceAll(\"foo\", \"bar\");\n" //
+				+ "        String result9 = text.replaceAll(\"\\\\$0\\\\.02\", \"\\\\$0.50\");\n" //
+				+ "        String result10 = text.replaceAll(/*Keep this comment*/\"n\"/*o*/, /*Keep this comment too*/\"\\\\$\\\\a\\\\\\\\\"/*y*/);\n" //
+				+ "        String result11 = text.replaceAll(\"a\" + \"b\", \"c\\\\$\");\n" //
+				+ "        String result12 = text.replaceAll(\"\\\\+\", CONSTANT);\n" //
+				+ "        String result13 = text.replaceAll(CONSTANT, \"\\\\$\");\n" //
+				+ "        String result14 = text.replaceAll(CONSTANT, CONSTANT2);\n" //
+				+ "    }\n" //
+				+ "\n" //
+				+ "    public void removeQuote(String text) {\n" //
+				+ "        String result = text.replaceAll(Pattern.quote(File.separator), \"/\");\n" //
+				+ "        String result2 = text.replaceAll(Pattern.quote(File.separator + \"a\"), \"\\\\.\");\n" //
+				+ "        String result3 = text.replaceAll(Pattern.quote(placeholder), Matcher.quoteReplacement(value));\n" //
+				+ "        String result4 = text.replaceAll(\"\\\\.\", Matcher.quoteReplacement(File.separator));\n" //
+				+ "        String result5 = text.replaceAll(\"/\", Matcher.quoteReplacement(File.separator + \"\\n\"));\n" //
+				+ "        String result6 = text.replaceAll(\"n\", Matcher.quoteReplacement(System.getProperty(\"java.version\")));\n" //
+				+ "        String result7 = text.replaceAll(CONSTANT, Matcher.quoteReplacement(System.getProperty(\"java.version\")));\n" //
+				+ "    }\n" //
+				+ "\n" //
+				+ "    public void refactorUsingChar(String text) {\n" //
+				+ "        String result = text.replaceAll(\"\\\\.\", \"/\");\n" //
+				+ "        String result2 = text.replaceAll(\"\\\\.\", \"/\");\n" //
+				+ "        String result3 = text.replaceAll(\"/\", \".\");\n" //
+				+ "    }\n" //
+				+ "\n" //
+				+ "    public String refactorUselessEscapingInReplacement() {\n" //
+				+ "        return \"foo\".replaceAll(\"foo\", \"\\\\.\");\n" //
+				+ "    }\n" //
+				+ "\n" //
+				+ "    public void refactorChained() {\n" //
+				+ "        System.out.println(\"${p1}...???\".replaceAll(\"\\\\$\", \"\\\\\\\\\\\\$\")\n" //
+				+ "            .replaceAll(\"\\\\.\", \"\\\\\\\\.\").replaceAll(\"\\\\?\", \"^\"));\n" //
 				+ "    }\n" //
 				+ "}\n";
 
 		String expected= "" //
 				+ "package test1;\n" //
 				+ "\n" //
+				+ "import java.io.File;\n" //
+				+ "import java.util.regex.Matcher;\n" //
+				+ "import java.util.regex.Pattern;\n" //
+				+ "\n" //
 				+ "public class E {\n" //
 				+ "    private static final String CONSTANT = \"&\";\n" //
+				+ "    private static final String CONSTANT2 = \"+\";\n" //
 				+ "\n" //
-				+ "    public void refactor(String text) {\n" //
-				+ "        String s1 = text.replace(\"&\", \"&amp;\");\n" //
-				+ "        String s2 = text.replace(\",:#\", \"/\");\n" //
-				+ "        String s3 = text.replace(\"/\", \".\");\n" //
-				+ "        String s4 = text.replace(CONSTANT, \"&amp;\");\n" //
+				+ "    public void refactorUsingString(String text, String placeholder, String value) {\n" //
+				+ "        String result1 = text.replace(\"&\", \"&amp;\");\n" //
+				+ "        String result2 = text.replace(\",:#\", \"/\");\n" //
+				+ "        String result3 = text.replace(\"^a\", \"b\" + \"c\");\n" //
+				+ "        String result4 = text.replace(CONSTANT, \"&amp;\");\n" //
+				+ "        String result5 = text.replace(\".\", \"\\r\\n\");\n" //
+				+ "        String result6 = text.replace(\"-.-\", \"$.x\");\n" //
+				+ "        String result7 = text.replace(\"foo\", \"\\\\-$1s\");\n" //
+				+ "        String result8 = text.replace(\"foo\", \"bar\");\n" //
+				+ "        String result9 = text.replace(\"$0.02\", \"$0.50\");\n" //
+				+ "        String result10 = text.replace(/*Keep this comment*/\"n\"/*o*/, /*Keep this comment too*/\"$a\\\\\"/*y*/);\n" //
+				+ "        String result11 = text.replace(\"a\" + \"b\", \"c$\");\n" //
+				+ "        String result12 = text.replace(\"+\", CONSTANT);\n" //
+				+ "        String result13 = text.replace(CONSTANT, \"$\");\n" //
+				+ "        String result14 = text.replace(CONSTANT, CONSTANT2);\n" //
+				+ "    }\n" //
+				+ "\n" //
+				+ "    public void removeQuote(String text) {\n" //
+				+ "        String result = text.replace(File.separator, \"/\");\n" //
+				+ "        String result2 = text.replace(File.separator + \"a\", \".\");\n" //
+				+ "        String result3 = text.replace(placeholder, value);\n" //
+				+ "        String result4 = text.replace(\".\", File.separator);\n" //
+				+ "        String result5 = text.replace(\"/\", File.separator + \"\\n\");\n" //
+				+ "        String result6 = text.replace(\"n\", System.getProperty(\"java.version\"));\n" //
+				+ "        String result7 = text.replace(CONSTANT, System.getProperty(\"java.version\"));\n" //
+				+ "    }\n" //
+				+ "\n" //
+				+ "    public void refactorUsingChar(String text) {\n" //
+				+ "        String result = text.replace('.', '/');\n" //
+				+ "        String result2 = text.replace('.', '/');\n" //
+				+ "        String result3 = text.replace('/', '.');\n" //
+				+ "    }\n" //
+				+ "\n" //
+				+ "    public String refactorUselessEscapingInReplacement() {\n" //
+				+ "        return \"foo\".replace(\"foo\", \".\");\n" //
+				+ "    }\n" //
+				+ "\n" //
+				+ "    public void refactorChained() {\n" //
+				+ "        System.out.println(\"${p1}...???\".replace(\"$\", \"\\\\$\")\n" //
+				+ "            .replace(\".\", \"\\\\.\").replace('?', '^'));\n" //
 				+ "    }\n" //
 				+ "}\n";
 
@@ -15370,32 +15452,34 @@
 				+ "package test1;\n" //
 				+ "\n" //
 				+ "import java.util.regex.Matcher;\n" //
+				+ "import java.util.regex.Pattern;\n" //
 				+ "\n" //
 				+ "public class E {\n" //
+				+ "    private static final String CONSTANT = \"|\";\n" //
+				+ "\n" //
 				+ "    public void doNotRefactorEscapableCharacters(String text) {\n" //
-				+ "        String s1 = text.replaceAll(\"[ab]\", \"c\");\n" //
-				+ "        String s2 = text.replaceAll(\"a.b\", \"foo\");\n" //
-				+ "        String s3 = text.replaceAll(\"a?\", \"foo\");\n" //
-				+ "        String s4 = text.replaceAll(\"a+\", \"foo\");\n" //
-				+ "        String s5 = text.replaceAll(\"a*\", \"foo\");\n" //
-				+ "        String s6 = text.replaceAll(\"a{42}\", \"foo\");\n" //
-				+ "        String s7 = text.replaceAll(\"a{1,42}\", \"foo\");\n" //
-				+ "        String s8 = text.replaceAll(\"(a)\", \"foo\");\n" //
-				+ "        String s9 = text.replaceAll(\"^a\", \"foo\");\n" //
-				+ "        String s10 = text.replaceAll(\"a$\", \"foo\");\n" //
-				+ "        String s11 = text.replaceAll(\"\\\\s\", \"\");\n" //
-				+ "        String s12 = text.replaceAll(\"a|b\", \"foo\");\n" //
-				+ "        String s13 = text.replaceAll(\"\\n|\\r\\n?\", \" \");\n" //
+				+ "        String result1 = text.replaceAll(\"[ab]\", \"c\");\n" //
+				+ "        String result2 = text.replaceAll(\"d.e\", \"foo\");\n" //
+				+ "        String result3 = text.replaceAll(\"f?\", \"bar\");\n" //
+				+ "        String result4 = text.replaceAll(\"g+\", \"foo\");\n" //
+				+ "        String result5 = text.replaceAll(\"h*\", \"foo\");\n" //
+				+ "        String result6 = text.replaceAll(\"i{42}\", \"foo\");\n" //
+				+ "        String result7 = text.replaceAll(\"j{1,42}\", \"foo\");\n" //
+				+ "        String result8 = text.replaceAll(\"(k)\", \"foo\");\n" //
+				+ "        String result9 = text.replaceAll(\"^m\", \"foo\");\n" //
+				+ "        String result10 = text.replaceAll(\"n$\", \"foo\");\n" //
+				+ "        String result11 = text.replaceAll(\"\\\\s\", \"\");\n" //
+				+ "        String result12 = text.replaceAll(\"a|b\", \"foo\");\n" //
+				+ "        String result13 = text.replaceAll(\"\\r\\n|\\n\", \" \");\n" //
+				+ "        String result14 = text.replaceAll(\"\\\\\\\\$\", System.getProperty(\"java.version\"));\n" //
+				+ "        String result15 = text.replaceAll(System.getProperty(\"java.version\"), \"\");\n" //
+				+ "        String result16 = text.replaceAll(CONSTANT, \"not &amp;\");\n" //
 				+ "    }\n" //
 				+ "\n" //
 				+ "    public String doNotRefactorReplacementWithCapturedGroup(String text) {\n" //
 				+ "        return text.replaceAll(\"foo\", \"$0\");\n" //
 				+ "    }\n" //
 				+ "\n" //
-				+ "    public String doNotRefactorWithEscapedReplacement(String text) {\n" //
-				+ "        return text.replaceAll(\"foo\", \"\\\\$1\");\n" //
-				+ "    }\n" //
-				+ "\n" //
 				+ "    public String doNotRefactorUnknownPattern(String text, String pattern) {\n" //
 				+ "        return text.replaceAll(pattern, \"c\");\n" //
 				+ "    }\n" //
@@ -15403,6 +15487,13 @@
 				+ "    public String doNotRefactorOtherMethod(Matcher matcher, String text) {\n" //
 				+ "        return matcher.replaceAll(text);\n" //
 				+ "    }\n" //
+				+ "\n" //
+				+ "    public void doNotRefactorSurrogates(String text, String unquoted) {\n" //
+				+ "        String result1 = text.replaceAll(\"\\ud83c\", \"\");\n" //
+				+ "        String result2 = text.replaceAll(\"\\\\ud83c\", \"\");\n" //
+				+ "        String result3 = text.replaceAll(\"\\udf09\", \"\\udf10\");\n" //
+				+ "        String result4 = text.replaceAll(Pattern.quote(unquoted), \"\\udf10\");\n" //
+				+ "    }\n" //
 				+ "}\n";
 		ICompilationUnit cu= pack.createCompilationUnit("E.java", sample, false, null);
 
@@ -15412,6 +15503,46 @@
 	}
 
 	@Test
+	public void testPlainReplacementPreview() throws Exception {
+		IPackageFragment pack= fSourceFolder.createPackageFragment("test1", false, null);
+		String previewHeader= "" //
+				+ "package test1;\n" //
+				+ "\n" //
+				+ "import java.io.File;\n" //
+				+ "import java.util.regex.Matcher;\n" //
+				+ "import java.util.regex.Pattern;\n" //
+				+ "\n" //
+				+ "public class E {\n" //
+				+ "    public void preview(String text, String placeholder, String value) {\n";
+		String previewFooter= "" //
+				+ "    }\n" //
+				+ "}\n";
+		AbstractCleanUpCore cleanUp= new PlainReplacementCleanUpCore() {
+			@Override
+			protected boolean isEnabled(String key) {
+				return false;
+			}
+		};
+		String given= previewHeader + cleanUp.getPreview() + previewFooter;
+		cleanUp= new PlainReplacementCleanUpCore() {
+			@Override
+			protected boolean isEnabled(String key) {
+				return true;
+			}
+		};
+		String expected= previewHeader + cleanUp.getPreview() + previewFooter;
+
+		// When
+		ICompilationUnit cu= pack.createCompilationUnit("E.java", given, false, null);
+		enable(CleanUpConstants.PLAIN_REPLACEMENT);
+
+		// Then
+		assertNotEquals("The class must be changed", given, expected);
+		assertGroupCategoryUsed(new ICompilationUnit[] { cu }, new HashSet<>(Arrays.asList(MultiFixMessages.PlainReplacementCleanUp_description)));
+		assertRefactoringResultAsExpected(new ICompilationUnit[] { cu }, new String[] { expected });
+	}
+
+	@Test
 	public void testControlFlowMerge() throws Exception {
 		// Given
 		IPackageFragment pack= fSourceFolder.createPackageFragment("test1", false, null);
diff --git a/org.eclipse.jdt.ui.unittest.junit.feature/feature.xml b/org.eclipse.jdt.ui.unittest.junit.feature/feature.xml
index 6df5b8b..f0b1976 100644
--- a/org.eclipse.jdt.ui.unittest.junit.feature/feature.xml
+++ b/org.eclipse.jdt.ui.unittest.junit.feature/feature.xml
@@ -2,7 +2,7 @@
 <feature
       id="org.eclipse.jdt.ui.unittest.junit.feature"
       label="%featureName"
-      version="1.0.0.qualifier"
+      version="1.0.100.qualifier"
       provider-name="%provider"
       license-feature="org.eclipse.license"
       license-feature-version="0.0.0">
diff --git a/org.eclipse.jdt.ui.unittest.junit.feature/pom.xml b/org.eclipse.jdt.ui.unittest.junit.feature/pom.xml
index f9bb14b..2c4673e 100644
--- a/org.eclipse.jdt.ui.unittest.junit.feature/pom.xml
+++ b/org.eclipse.jdt.ui.unittest.junit.feature/pom.xml
@@ -16,11 +16,11 @@
   <parent>
     <artifactId>eclipse.jdt.ui</artifactId>
     <groupId>eclipse.jdt.ui</groupId>
-    <version>4.19.0-SNAPSHOT</version>
+    <version>4.20.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.jdt.feature</groupId>
   <artifactId>org.eclipse.jdt.ui.unittest.junit.feature</artifactId>
-  <version>1.0.0-SNAPSHOT</version>
+  <version>1.0.100-SNAPSHOT</version>
   <packaging>eclipse-feature</packaging>
   <build>
      <plugins>
diff --git a/org.eclipse.jdt.ui.unittest.junit/META-INF/MANIFEST.MF b/org.eclipse.jdt.ui.unittest.junit/META-INF/MANIFEST.MF
index 1e95d7e..e8381db 100644
--- a/org.eclipse.jdt.ui.unittest.junit/META-INF/MANIFEST.MF
+++ b/org.eclipse.jdt.ui.unittest.junit/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.jdt.ui.unittest.junit;singleton:=true
-Bundle-Version: 1.0.0.qualifier
+Bundle-Version: 1.0.100.qualifier
 Bundle-Activator: org.eclipse.jdt.ui.unittest.junit.JUnitTestPlugin
 Bundle-ActivationPolicy: lazy
 Bundle-Vendor: %providerName
diff --git a/org.eclipse.jdt.ui.unittest.junit/pom.xml b/org.eclipse.jdt.ui.unittest.junit/pom.xml
index e048724..379d86f 100644
--- a/org.eclipse.jdt.ui.unittest.junit/pom.xml
+++ b/org.eclipse.jdt.ui.unittest.junit/pom.xml
@@ -14,11 +14,11 @@
   <parent>
     <artifactId>eclipse.jdt.ui</artifactId>
     <groupId>eclipse.jdt.ui</groupId>
-    <version>4.19.0-SNAPSHOT</version>
+    <version>4.20.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.jdt</groupId>
   <artifactId>org.eclipse.jdt.ui.unittest.junit</artifactId>
-  <version>1.0.0-SNAPSHOT</version>
+  <version>1.0.100-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
   <properties>
       <skipAPIAnalysis>true</skipAPIAnalysis>
diff --git a/org.eclipse.jdt.ui/META-INF/MANIFEST.MF b/org.eclipse.jdt.ui/META-INF/MANIFEST.MF
index d2b7b2e..a77cb54 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.22.150.qualifier
+Bundle-Version: 3.22.200.qualifier
 Bundle-Activator: org.eclipse.jdt.internal.ui.JavaPlugin
 Bundle-ActivationPolicy: lazy
 Bundle-Vendor: %providerName
diff --git a/org.eclipse.jdt.ui/pom.xml b/org.eclipse.jdt.ui/pom.xml
index 96c9239..4c8f62e 100644
--- a/org.eclipse.jdt.ui/pom.xml
+++ b/org.eclipse.jdt.ui/pom.xml
@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <!--
-  Copyright (c) 2012, 2021 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
@@ -14,11 +14,11 @@
   <parent>
     <artifactId>eclipse.jdt.ui</artifactId>
     <groupId>eclipse.jdt.ui</groupId>
-    <version>4.19.0-SNAPSHOT</version>
+    <version>4.20.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.jdt</groupId>
   <artifactId>org.eclipse.jdt.ui</artifactId>
-  <version>3.22.150-SNAPSHOT</version>
+  <version>3.22.200-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/fix/PlainReplacementCleanUp.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/PlainReplacementCleanUp.java
index 9d8f114..d2ee98f 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/PlainReplacementCleanUp.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/fix/PlainReplacementCleanUp.java
@@ -25,9 +25,13 @@
 import org.eclipse.jdt.ui.cleanup.ICleanUpFix;
 
 /**
- * A fix that replaces <code>String.replaceAll()</code> by <code>String.replace()</code> when the pattern is a plain text:
+ * A fix that replaces <code>String.replaceAll()</code> by <code>String.replace()</code> when the pattern and the
+ * replacement is a plain text not containing surrogate characters:
  * <ul>
- * <li>The pattern must be a constant.</li>
+ * <li>If the pattern is a constant, it is unescaped if needed,</li>
+ * <li>If the pattern is quoted, it is unquoted,</li>
+ * <li>If the replacement is quoted, it is unquoted,</li>
+ * <li>If the pattern and the replacement are 1-character-long, they are replaced by chars.</li>
  * </ul>
  */
 public class PlainReplacementCleanUp extends AbstractCleanUp {
diff --git a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/AbstractTemplateCompletionProposalComputer.java b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/AbstractTemplateCompletionProposalComputer.java
index bf1c401..99c2e50 100644
--- a/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/AbstractTemplateCompletionProposalComputer.java
+++ b/org.eclipse.jdt.ui/ui/org/eclipse/jdt/internal/ui/text/java/AbstractTemplateCompletionProposalComputer.java
@@ -68,20 +68,20 @@
 			return Collections.emptyList();
 		}
 
-		fEngine= computeCompletionEngine(javaContext);
-		if (fEngine == null) {
+		TemplateEngine engine= fEngine= computeCompletionEngine(javaContext);
+		if (engine == null) {
 			return Collections.emptyList();
 		}
 
-		fEngine.reset();
+		engine.reset();
 		ITextSelection viewerSelection= context.getTextSelection();
 		if (viewerSelection == null) {
 			viewerSelection = new TextSelection(context.getDocument(), context.getInvocationOffset(), 0);
 		}
 		Point selectionAsPoint = new Point(viewerSelection.getOffset(), viewerSelection.getLength());
-		fEngine.complete(javaContext.getViewer(), selectionAsPoint, javaContext.getInvocationOffset(), unit);
+		engine.complete(javaContext.getViewer(), selectionAsPoint, javaContext.getInvocationOffset(), unit);
 
-		TemplateProposal[] templateProposals= fEngine.getResults();
+		TemplateProposal[] templateProposals= engine.getResults();
 		List<ICompletionProposal> result= new ArrayList<>(Arrays.asList(templateProposals));
 
 		IJavaCompletionProposal[] keyWordResults= javaContext.getKeywordProposals();
@@ -142,8 +142,9 @@
 
 	@Override
 	public void sessionEnded() {
-		if (fEngine != null) {
-			fEngine.reset();
+		TemplateEngine engine= fEngine;
+		if (engine != null) {
+			engine.reset();
 			fEngine= null;
 		}
 	}
diff --git a/org.eclipse.ltk.core.refactoring.tests/META-INF/MANIFEST.MF b/org.eclipse.ltk.core.refactoring.tests/META-INF/MANIFEST.MF
index 7598e8e..e64acb4 100644
--- a/org.eclipse.ltk.core.refactoring.tests/META-INF/MANIFEST.MF
+++ b/org.eclipse.ltk.core.refactoring.tests/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.ltk.core.refactoring.tests; singleton:=true
-Bundle-Version: 3.8.1100.qualifier
+Bundle-Version: 3.8.1200.qualifier
 Bundle-Activator: org.eclipse.ltk.core.refactoring.tests.RefactoringCoreTestPlugin
 Bundle-ActivationPolicy: lazy
 Bundle-Vendor: %providerName
diff --git a/org.eclipse.ltk.core.refactoring.tests/pom.xml b/org.eclipse.ltk.core.refactoring.tests/pom.xml
index 57ebc59..9845470 100644
--- a/org.eclipse.ltk.core.refactoring.tests/pom.xml
+++ b/org.eclipse.ltk.core.refactoring.tests/pom.xml
@@ -15,12 +15,12 @@
   <parent>
     <artifactId>tests-pom</artifactId>
     <groupId>eclipse.jdt.ui</groupId>
-    <version>4.19.0-SNAPSHOT</version>
+    <version>4.20.0-SNAPSHOT</version>
     <relativePath>../tests-pom/</relativePath>
   </parent>
   <groupId>org.eclipse.ltk</groupId>
   <artifactId>org.eclipse.ltk.core.refactoring.tests</artifactId>
-  <version>3.8.1100-SNAPSHOT</version>
+  <version>3.8.1200-SNAPSHOT</version>
   <packaging>eclipse-test-plugin</packaging>
   <properties>
   	<testSuite>${project.artifactId}</testSuite>
diff --git a/org.eclipse.ltk.core.refactoring/META-INF/MANIFEST.MF b/org.eclipse.ltk.core.refactoring/META-INF/MANIFEST.MF
index 7b7a642..efaaadd 100644
--- a/org.eclipse.ltk.core.refactoring/META-INF/MANIFEST.MF
+++ b/org.eclipse.ltk.core.refactoring/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.ltk.core.refactoring; singleton:=true
-Bundle-Version: 3.11.300.qualifier
+Bundle-Version: 3.11.400.qualifier
 Bundle-Activator: org.eclipse.ltk.internal.core.refactoring.RefactoringCorePlugin
 Bundle-ActivationPolicy: lazy
 Bundle-Vendor: %providerName
diff --git a/org.eclipse.ltk.core.refactoring/pom.xml b/org.eclipse.ltk.core.refactoring/pom.xml
index 4579549..9cb0fd8 100644
--- a/org.eclipse.ltk.core.refactoring/pom.xml
+++ b/org.eclipse.ltk.core.refactoring/pom.xml
@@ -14,10 +14,10 @@
   <parent>
     <artifactId>eclipse.jdt.ui</artifactId>
     <groupId>eclipse.jdt.ui</groupId>
-    <version>4.19.0-SNAPSHOT</version>
+    <version>4.20.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.ltk</groupId>
   <artifactId>org.eclipse.ltk.core.refactoring</artifactId>
-  <version>3.11.300-SNAPSHOT</version>
+  <version>3.11.400-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/org.eclipse.ltk.ui.refactoring.tests/META-INF/MANIFEST.MF b/org.eclipse.ltk.ui.refactoring.tests/META-INF/MANIFEST.MF
index 1cdbf95..e676834 100644
--- a/org.eclipse.ltk.ui.refactoring.tests/META-INF/MANIFEST.MF
+++ b/org.eclipse.ltk.ui.refactoring.tests/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.ltk.ui.refactoring.tests;singleton:=true
-Bundle-Version: 3.9.800.qualifier
+Bundle-Version: 3.9.900.qualifier
 Bundle-Activator: org.eclipse.ltk.ui.refactoring.tests.RefactoringUITestPlugin
 Bundle-ActivationPolicy: lazy
 Bundle-Vendor: %providerName
diff --git a/org.eclipse.ltk.ui.refactoring.tests/pom.xml b/org.eclipse.ltk.ui.refactoring.tests/pom.xml
index 1754e86..567f459 100644
--- a/org.eclipse.ltk.ui.refactoring.tests/pom.xml
+++ b/org.eclipse.ltk.ui.refactoring.tests/pom.xml
@@ -15,12 +15,12 @@
   <parent>
     <artifactId>tests-pom</artifactId>
     <groupId>eclipse.jdt.ui</groupId>
-    <version>4.19.0-SNAPSHOT</version>
+    <version>4.20.0-SNAPSHOT</version>
     <relativePath>../tests-pom/</relativePath>
   </parent>
   <groupId>org.eclipse.ltk</groupId>
   <artifactId>org.eclipse.ltk.ui.refactoring.tests</artifactId>
-  <version>3.9.800-SNAPSHOT</version>
+  <version>3.9.900-SNAPSHOT</version>
   <packaging>eclipse-test-plugin</packaging>
   <properties>
     <testSuite>${project.artifactId}</testSuite>
diff --git a/org.eclipse.ltk.ui.refactoring/META-INF/MANIFEST.MF b/org.eclipse.ltk.ui.refactoring/META-INF/MANIFEST.MF
index 0eecd1b..143130f 100644
--- a/org.eclipse.ltk.ui.refactoring/META-INF/MANIFEST.MF
+++ b/org.eclipse.ltk.ui.refactoring/META-INF/MANIFEST.MF
@@ -3,7 +3,7 @@
 Bundle-ManifestVersion: 2
 Bundle-Name: %pluginName
 Bundle-SymbolicName: org.eclipse.ltk.ui.refactoring; singleton:=true
-Bundle-Version: 3.11.300.qualifier
+Bundle-Version: 3.11.400.qualifier
 Bundle-Activator: org.eclipse.ltk.internal.ui.refactoring.RefactoringUIPlugin
 Bundle-ActivationPolicy: lazy
 Bundle-Vendor: %providerName
diff --git a/org.eclipse.ltk.ui.refactoring/pom.xml b/org.eclipse.ltk.ui.refactoring/pom.xml
index b76a809..f95d682 100644
--- a/org.eclipse.ltk.ui.refactoring/pom.xml
+++ b/org.eclipse.ltk.ui.refactoring/pom.xml
@@ -14,10 +14,10 @@
   <parent>
     <artifactId>eclipse.jdt.ui</artifactId>
     <groupId>eclipse.jdt.ui</groupId>
-    <version>4.19.0-SNAPSHOT</version>
+    <version>4.20.0-SNAPSHOT</version>
   </parent>
   <groupId>org.eclipse.ltk</groupId>
   <artifactId>org.eclipse.ltk.ui.refactoring</artifactId>
-  <version>3.11.300-SNAPSHOT</version>
+  <version>3.11.400-SNAPSHOT</version>
   <packaging>eclipse-plugin</packaging>
 </project>
diff --git a/pom.xml b/pom.xml
index 23d954e..4b5f7ef 100644
--- a/pom.xml
+++ b/pom.xml
@@ -15,7 +15,7 @@
   <parent>
     <groupId>org.eclipse</groupId>
     <artifactId>eclipse-platform-parent</artifactId>
-    <version>4.19.0-SNAPSHOT</version>
+    <version>4.20.0-SNAPSHOT</version>
     <relativePath>../eclipse-platform-parent</relativePath>
   </parent>
 
@@ -35,10 +35,6 @@
   <profiles>
     <profile>
       <id>build-individual-bundles</id>
-      <properties>
-      	<eclipse-p2-repo.url>http://download.eclipse.org/eclipse/updates/Y-builds</eclipse-p2-repo.url>
-      	<skipAPIAnalysis>true</skipAPIAnalysis>
- 	  </properties>
       <repositories>
         <repository>
           <releases>
diff --git a/tests-pom/pom.xml b/tests-pom/pom.xml
index 49dd769..5d4694f 100644
--- a/tests-pom/pom.xml
+++ b/tests-pom/pom.xml
@@ -14,7 +14,7 @@
   <parent>
     <artifactId>eclipse.jdt.ui</artifactId>
     <groupId>eclipse.jdt.ui</groupId>
-    <version>4.19.0-SNAPSHOT</version>
+    <version>4.20.0-SNAPSHOT</version>
   </parent>
   <artifactId>tests-pom</artifactId>
   <packaging>pom</packaging>