diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ConditionalExitPoint.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ConditionalExitPoint.java
new file mode 100644
index 000000000000..b03a650084ad
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ConditionalExitPoint.java
@@ -0,0 +1,13 @@
+public class Test {
+ public int test(int x) {
+ int i;
+ for (i = 0; i <= x; i++) {
+ if (i == 42) {
+ break;
+ } else if (i == 17) {
+ break;
+ }
+ }
+ return i;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ConditionalExitPoint_after.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ConditionalExitPoint_after.java
new file mode 100644
index 000000000000..5c9ec1e33e0a
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ConditionalExitPoint_after.java
@@ -0,0 +1,18 @@
+public class Test {
+ public int test(int x) {
+ int i;
+ for (i = 0; i <= x; i++) {
+ if (extracted(i)) break;
+ }
+ return i;
+ }
+
+ private boolean extracted(int i) {
+ if (i == 42) {
+ return true;
+ } else if (i == 17) {
+ return true;
+ }
+ return false;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ConflictRename.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ConflictRename.java
new file mode 100644
index 000000000000..c7c8f269f95c
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ConflictRename.java
@@ -0,0 +1,9 @@
+class Test {
+ void test() {
+ System.out.println();
+ }
+
+ void conflict(){
+
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ConflictedNamesFiltered.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ConflictedNamesFiltered.java
new file mode 100644
index 000000000000..1c238fccf273
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ConflictedNamesFiltered.java
@@ -0,0 +1,10 @@
+class Test {
+ void test() {
+ int x = 42;
+ System.out.println(x);
+ }
+
+ int getX(){
+ return 42;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ConflictedNamesFiltered_after.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ConflictedNamesFiltered_after.java
new file mode 100644
index 000000000000..47dd53292347
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ConflictedNamesFiltered_after.java
@@ -0,0 +1,15 @@
+class Test {
+ void test() {
+ int x = getAnInt();
+ System.out.println(x);
+ }
+
+ private int getAnInt() {
+ int x = 42;
+ return x;
+ }
+
+ int getX(){
+ return 42;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ExactDuplicates.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ExactDuplicates.java
new file mode 100644
index 000000000000..ee9fb135eaaa
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ExactDuplicates.java
@@ -0,0 +1,6 @@
+class Test {
+ void test() {
+ System.out.println();
+ System.out.println();
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ExactDuplicates_after.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ExactDuplicates_after.java
new file mode 100644
index 000000000000..d7e510fd771d
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ExactDuplicates_after.java
@@ -0,0 +1,10 @@
+class Test {
+ void test() {
+ extracted();
+ extracted();
+ }
+
+ private void extracted() {
+ System.out.println();
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/GeneratedDefault.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/GeneratedDefault.java
new file mode 100644
index 000000000000..16031b6278b9
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/GeneratedDefault.java
@@ -0,0 +1,14 @@
+class Test {
+ void test() {
+ int x = 42;
+ System.out.println(x);
+ }
+
+ int getX(){
+ return 0;
+ }
+
+ int getAnInt(){
+ return 0;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/GeneratedDefault_after.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/GeneratedDefault_after.java
new file mode 100644
index 000000000000..a77288b0eb08
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/GeneratedDefault_after.java
@@ -0,0 +1,19 @@
+class Test {
+ void test() {
+ int x = getX1();
+ System.out.println(x);
+ }
+
+ private int getX1() {
+ int x = 42;
+ return x;
+ }
+
+ int getX(){
+ return 0;
+ }
+
+ int getAnInt(){
+ return 0;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/InvalidRename.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/InvalidRename.java
new file mode 100644
index 000000000000..8fa5c0df2bb7
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/InvalidRename.java
@@ -0,0 +1,5 @@
+class Test {
+ void test() {
+ System.out.println();
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ParameterGrouping.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ParameterGrouping.java
new file mode 100644
index 000000000000..094bbbb2f502
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ParameterGrouping.java
@@ -0,0 +1,16 @@
+class Test {
+ void test1(){
+ System.out.println("string");
+ System.out.println("string");
+ }
+
+ void test2(){
+ System.out.println("message");
+ System.out.println("message");
+ }
+
+ void test3(){
+ System.out.println("first");
+ System.out.println("second");
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ParameterGrouping_after.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ParameterGrouping_after.java
new file mode 100644
index 000000000000..7621d35dfc15
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ParameterGrouping_after.java
@@ -0,0 +1,18 @@
+class Test {
+ void test1(){
+ extracted("string", "string");
+ }
+
+ private void extracted(String string, String string2) {
+ System.out.println(string);
+ System.out.println(string2);
+ }
+
+ void test2(){
+ extracted("message", "message");
+ }
+
+ void test3(){
+ extracted("first", "second");
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/RefactoringListener.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/RefactoringListener.java
new file mode 100644
index 000000000000..8fa5c0df2bb7
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/RefactoringListener.java
@@ -0,0 +1,5 @@
+class Test {
+ void test() {
+ System.out.println();
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/RenamedExactDuplicate.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/RenamedExactDuplicate.java
new file mode 100644
index 000000000000..ee9fb135eaaa
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/RenamedExactDuplicate.java
@@ -0,0 +1,6 @@
+class Test {
+ void test() {
+ System.out.println();
+ System.out.println();
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/RenamedExactDuplicate_after.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/RenamedExactDuplicate_after.java
new file mode 100644
index 000000000000..0810a342f3b3
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/RenamedExactDuplicate_after.java
@@ -0,0 +1,10 @@
+class Test {
+ void test() {
+ renamed();
+ renamed();
+ }
+
+ private void renamed() {
+ System.out.println();
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/RenamedParametrizedDuplicate.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/RenamedParametrizedDuplicate.java
new file mode 100644
index 000000000000..a27c4d3e59c6
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/RenamedParametrizedDuplicate.java
@@ -0,0 +1,6 @@
+class Test {
+ void test(){
+ int avgA = 10 + 20 / 2;
+ int avgB = 100 + 200 / 2;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/RenamedParametrizedDuplicate_after.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/RenamedParametrizedDuplicate_after.java
new file mode 100644
index 000000000000..d71e6b4681a0
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/RenamedParametrizedDuplicate_after.java
@@ -0,0 +1,10 @@
+class Test {
+ void test(){
+ int avgA = average(10, 20);
+ int avgB = average(100, 200);
+ }
+
+ private int average(int i, int i2) {
+ return i + i2 / 2;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/RuntimeCatchMayChangeSemantic1.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/RuntimeCatchMayChangeSemantic1.java
new file mode 100644
index 000000000000..5cdfc8d6e85d
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/RuntimeCatchMayChangeSemantic1.java
@@ -0,0 +1,11 @@
+public class Test {
+ public int test(int x) {
+ int y = 42;
+ try {
+ y = y + x;
+ y = y / x;
+ } catch (ArithmeticException e) {
+ }
+ return y;
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/RuntimeCatchMayChangeSemantic2.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/RuntimeCatchMayChangeSemantic2.java
new file mode 100644
index 000000000000..41cd3c82292f
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/RuntimeCatchMayChangeSemantic2.java
@@ -0,0 +1,13 @@
+public class Test {
+ public int test(int x) {
+ int y = 42;
+ try {
+ y = y / x;
+ foo();
+ } catch (ArithmeticException e) {
+ }
+ return y;
+ }
+
+ void foo(){ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/RuntimeCatchWithLastAssignment.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/RuntimeCatchWithLastAssignment.java
new file mode 100644
index 000000000000..58a69c3baafe
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/RuntimeCatchWithLastAssignment.java
@@ -0,0 +1,13 @@
+public class Test {
+ public int test(int x) {
+ int y = 42;
+ try {
+ foo();
+ y = y / x;
+ } catch (ArithmeticException e) {
+ }
+ return y;
+ }
+
+ void foo() {}
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/RuntimeCatchWithLastAssignment_after.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/RuntimeCatchWithLastAssignment_after.java
new file mode 100644
index 000000000000..9027b8218d8b
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/RuntimeCatchWithLastAssignment_after.java
@@ -0,0 +1,18 @@
+public class Test {
+ public int test(int x) {
+ int y = 42;
+ try {
+ y = getY(x, y);
+ } catch (ArithmeticException e) {
+ }
+ return y;
+ }
+
+ private int getY(int x, int y) {
+ foo();
+ y = y / x;
+ return y;
+ }
+
+ void foo() {}
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ShortenClassReferences.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ShortenClassReferences.java
new file mode 100644
index 000000000000..147fe461006d
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ShortenClassReferences.java
@@ -0,0 +1,8 @@
+import java.util.ArrayList;
+
+class Test {
+ void test() {
+ var s = new ArrayList<>().stream();
+ System.out.println(s);
+ }
+}
\ No newline at end of file
diff --git a/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ShortenClassReferences_after.java b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ShortenClassReferences_after.java
new file mode 100644
index 000000000000..a6ab74c55681
--- /dev/null
+++ b/java/java-tests/testData/refactoring/extractMethodAndDuplicatesInplace/ShortenClassReferences_after.java
@@ -0,0 +1,13 @@
+import java.util.ArrayList;
+import java.util.stream.Stream;
+
+class Test {
+ void test() {
+ var s = new ArrayList<>().stream();
+ extracted(s);
+ }
+
+ private void extracted(Stream