diff --git a/src/test/java/com/android/tools/r8/Jdk11TestUtils.java b/src/test/java/com/android/tools/r8/Jdk11TestUtils.java
deleted file mode 100644
index 26da974..0000000
--- a/src/test/java/com/android/tools/r8/Jdk11TestUtils.java
+++ /dev/null
@@ -1,33 +0,0 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8;
-
-import static com.android.tools.r8.TestRuntime.getCheckedInJdk8;
-
-import java.io.IOException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import org.junit.Assume;
-import org.junit.rules.TemporaryFolder;
-
-public class Jdk11TestUtils {
-
-  public static ThrowableConsumer<R8FullTestBuilder> addJdk11LibraryFiles(
-      TemporaryFolder temporaryFolder) {
-    return builder -> builder.addLibraryFiles(getJdk11LibraryFiles(temporaryFolder));
-  }
-
-  public static Path[] getJdk11LibraryFiles(TemporaryFolder temp) throws IOException {
-    Assume.assumeFalse(ToolHelper.isWindows());
-    // TODO(b/180553597): Add JDK-11 runtime jar instead. As a temporary solution we use the JDK-8
-    //  runtime with additional stubs.
-    Path stubs =
-        JavaCompilerTool.create(getCheckedInJdk8(), temp)
-            .addSourceFiles(Paths.get("src", "test", "javaStubs", "StringConcatFactory.java"))
-            .addSourceFiles(Paths.get("src", "test", "javaStubs", "VarHandle.java"))
-            .compile();
-    return new Path[] {stubs, ToolHelper.getJava8RuntimeJar()};
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/Jdk9TestUtils.java b/src/test/java/com/android/tools/r8/Jdk9TestUtils.java
index 891ba09..8b6bfbb 100644
--- a/src/test/java/com/android/tools/r8/Jdk9TestUtils.java
+++ b/src/test/java/com/android/tools/r8/Jdk9TestUtils.java
@@ -4,12 +4,8 @@
 
 package com.android.tools.r8;
 
-import static com.android.tools.r8.TestRuntime.getCheckedInJdk8;
+import static com.android.tools.r8.desugar.LibraryFilesHelper.getJdk9LibraryFiles;
 
-import java.io.IOException;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import org.junit.Assume;
 import org.junit.rules.TemporaryFolder;
 
 public class Jdk9TestUtils {
@@ -19,15 +15,4 @@
     return builder -> builder.addLibraryFiles(getJdk9LibraryFiles(temporaryFolder));
   }
 
-  public static Path[] getJdk9LibraryFiles(TemporaryFolder temp) throws IOException {
-    Assume.assumeFalse(ToolHelper.isWindows());
-    // TODO(b/180553597): Add JDK-9 runtime jar instead. As a temporary solution we use the JDK-8
-    //  runtime with additional stubs.
-    Path stubs =
-        JavaCompilerTool.create(getCheckedInJdk8(), temp)
-            .addSourceFiles(Paths.get("src", "test", "javaStubs", "StringConcatFactory.java"))
-            .addSourceFiles(Paths.get("src", "test", "javaStubs", "VarHandle.java"))
-            .compile();
-    return new Path[] {stubs, ToolHelper.getJava8RuntimeJar()};
-  }
 }
diff --git a/src/test/java/com/android/tools/r8/R8CFRunExamplesJava9Test.java b/src/test/java/com/android/tools/r8/R8CFRunExamplesJava9Test.java
index 79b8799..050fe1c 100644
--- a/src/test/java/com/android/tools/r8/R8CFRunExamplesJava9Test.java
+++ b/src/test/java/com/android/tools/r8/R8CFRunExamplesJava9Test.java
@@ -8,6 +8,7 @@
 import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.ToolHelper.ProcessResult;
+import com.android.tools.r8.desugar.LibraryFilesHelper;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -50,7 +51,7 @@
       for (UnaryOperator<R8Command.Builder> transformation : builderTransformations) {
         builder = transformation.apply(builder);
       }
-      builder.addLibraryFiles(Jdk9TestUtils.getJdk9LibraryFiles(temp));
+      builder.addLibraryFiles(LibraryFilesHelper.getJdk9LibraryFiles(temp));
       R8Command command =
           builder.addProgramFiles(inputFile).setOutput(out, OutputMode.ClassFile).build();
       ToolHelper.runR8(command, this::combinedOptionConsumer);
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 596a13d..ea8e96c 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -1123,7 +1123,8 @@
 
   public static Path getJdwpTestsCfJarPath(AndroidApiLevel minSdk) {
     if (minSdk.getLevel() >= AndroidApiLevel.N.getLevel()) {
-      return Paths.get("third_party", "jdwp-tests", "apache-harmony-jdwp-tests-host.jar");
+      return Paths.get(
+          ToolHelper.THIRD_PARTY_DIR, "jdwp-tests", "apache-harmony-jdwp-tests-host.jar");
     } else {
       return Paths.get(ToolHelper.BUILD_DIR, "libs", "jdwp-tests-preN.jar");
     }
diff --git a/src/test/java/com/android/tools/r8/desugar/LibraryFilesHelper.java b/src/test/java/com/android/tools/r8/desugar/LibraryFilesHelper.java
new file mode 100644
index 0000000..0e07bf4
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugar/LibraryFilesHelper.java
@@ -0,0 +1,193 @@
+// Copyright (c) 2023, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8.desugar;
+
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.utils.ConsumerUtils;
+import com.android.tools.r8.utils.DescriptorUtils;
+import com.android.tools.r8.utils.ZipUtils.ZipBuilder;
+import com.google.common.collect.ObjectArrays;
+import java.nio.file.Path;
+import java.util.function.Consumer;
+import org.junit.Assume;
+import org.junit.rules.TemporaryFolder;
+import org.objectweb.asm.ClassWriter;
+import org.objectweb.asm.Opcodes;
+
+public class LibraryFilesHelper implements Opcodes {
+
+  public static Path[] getJdk9LibraryFiles(TemporaryFolder temp) throws Exception {
+    // TODO(b/270105162): We should be able to run this on windows.
+    Assume.assumeFalse(ToolHelper.isWindows());
+    // TODO(b/180553597): Add JDK-9 runtime jar instead. As a temporary solution we use the JDK-8
+    //  runtime with additional stubs.
+    // We use jdk-8 for compilation because in jdk-9 and higher we would need to deal with the
+    // module patching logic.
+    Path generatedJar = temp.newFolder().toPath().resolve("stubs.jar");
+    ZipBuilder builder = ZipBuilder.builder(generatedJar);
+    addStringConcatFactory(builder);
+    addVarHandle(builder);
+    builder.build();
+    return new Path[] {generatedJar, ToolHelper.getJava8RuntimeJar()};
+  }
+
+  public static Path[] getJdk11LibraryFiles(TemporaryFolder temp) throws Exception {
+    Assume.assumeFalse(ToolHelper.isWindows());
+    // TODO(b/180553597): Add JDK-11 runtime jar instead. As a temporary solution we use the JDK-8
+    //  runtime with additional stubs.
+    return getJdk9LibraryFiles(temp);
+  }
+
+  public static Path[] getJdk15LibraryFiles(TemporaryFolder temp) throws Exception {
+    // TODO(b/270105162): We should be able to run this on windows.
+    Assume.assumeFalse(ToolHelper.isWindows());
+    // TODO(b/169645628): Add JDK-15 runtime jar instead. As a temporary solution we use the jdk 8
+    //   runtime with additional stubs.
+    Path generatedJar = temp.newFolder().toPath().resolve("stubs.jar");
+    ZipBuilder builder = ZipBuilder.builder(generatedJar);
+    addRecord(builder);
+    addRecordComponent(builder);
+    addObjectsMethod(builder);
+    addTypeDescriptor(builder);
+    builder.build();
+    return ObjectArrays.concat(getJdk9LibraryFiles(temp), new Path[] {generatedJar}, Path.class);
+  }
+
+  // Generates a class file for:
+  // <pre>
+  // public class ObjectMethods {}
+  // </pre>
+  private static void addObjectsMethod(ZipBuilder builder) throws Exception {
+    addClassToZipBuilder(
+        builder, ACC_PUBLIC, "java/lang/runtime/ObjectMethods", ConsumerUtils.emptyConsumer());
+  }
+
+  // Generates a class file for:
+  // <pre>
+  // public interface TypeDescriptor {
+  //   String descriptorString();
+  // }
+  // </pre>
+  private static void addTypeDescriptor(ZipBuilder builder) throws Exception {
+    addClassToZipBuilder(
+        builder,
+        ACC_PUBLIC | ACC_INTERFACE | ACC_ABSTRACT,
+        "java/lang/invoke/TypeDescriptor",
+        methodAdder ->
+            methodAdder.add(
+                ACC_PUBLIC | ACC_ABSTRACT,
+                "descriptorString",
+                methodDescriptor(false, String.class)));
+  }
+
+  // Generates a class file for:
+  // <pre>
+  // public class StringConcatFactory {}
+  // </pre>
+  private static void addStringConcatFactory(ZipBuilder builder) throws Exception {
+    addClassToZipBuilder(
+        builder, ACC_PUBLIC, "java/lang/invoke/StringConcatFactory", ConsumerUtils.emptyConsumer());
+  }
+
+  // Generates a class file for:
+  // <pre>
+  // public class VarHandle {}
+  // </pre>
+  private static void addVarHandle(ZipBuilder builder) throws Exception {
+    addClassToZipBuilder(
+        builder, ACC_PUBLIC, "java/lang/invoke/VarHandle", ConsumerUtils.emptyConsumer());
+  }
+
+  // Generates a class file for:
+  // <pre>
+  // public abstract class Record {
+  //   protected Record() {}
+  //
+  //   public abstract boolean equals(Object obj);
+  //
+  //   public abstract int hashCode();
+  //
+  //   public abstract String toString();
+  // }
+  // </pre>
+  private static void addRecord(ZipBuilder builder) throws Exception {
+    addClassToZipBuilder(
+        builder,
+        ACC_PUBLIC | ACC_ABSTRACT,
+        "java/lang/Record",
+        methodAdder -> {
+          methodAdder.add(ACC_PROTECTED, "<init>", "()V");
+          methodAdder.add(
+              ACC_PUBLIC | ACC_ABSTRACT,
+              "equals",
+              methodDescriptor(false, Object.class, boolean.class));
+          methodAdder.add(
+              ACC_PUBLIC | ACC_ABSTRACT, "hashCode", methodDescriptor(false, int.class));
+          methodAdder.add(
+              ACC_PUBLIC | ACC_ABSTRACT, "toString", methodDescriptor(false, String.class));
+        });
+  }
+
+  // Generates a class file for:
+  // <pre>
+  // public class RecordComponent {}
+  // </pre>
+  private static void addRecordComponent(ZipBuilder builder) throws Exception {
+    addClassToZipBuilder(
+        builder, ACC_PUBLIC, "java/lang/reflect/RecordComponent", ConsumerUtils.emptyConsumer());
+  }
+
+  // Generates a class file for:
+  // <pre>
+  // public interface Supplier {
+  //   Object get();
+  // }
+  // </pre>
+  public static byte[] getSupplier() {
+    return createClass(
+        ACC_PUBLIC | ACC_INTERFACE | ACC_ABSTRACT,
+        "java/util/function/Supplier",
+        methodAdder ->
+            methodAdder.add(
+                ACC_PUBLIC | ACC_ABSTRACT, "get", methodDescriptor(false, Object.class)));
+  }
+
+  private static void addClassToZipBuilder(
+      ZipBuilder builder, int access, String binaryName, Consumer<MethodAdder> consumer)
+      throws Exception {
+    builder.addBytes(binaryName + ".class", createClass(access, binaryName, consumer));
+  }
+
+  @FunctionalInterface
+  public interface MethodAdder {
+    void add(int access, String name, String descriptor);
+  }
+
+  public static String descriptor(Class<?> clazz) {
+    return DescriptorUtils.javaTypeToDescriptor(clazz.getTypeName());
+  }
+
+  public static String methodDescriptor(boolean isVoid, Class<?>... clazz) {
+    StringBuilder sb = new StringBuilder();
+    sb.append("(");
+    for (int i = 0; i < clazz.length - (isVoid ? 0 : 1); i++) {
+      sb.append(descriptor(clazz[i]));
+    }
+    sb.append(")");
+    if (!isVoid) {
+      sb.append(descriptor(clazz[clazz.length - 1]));
+    }
+    return sb.toString();
+  }
+
+  public static byte[] createClass(int access, String binaryName, Consumer<MethodAdder> consumer) {
+    ClassWriter cw = new ClassWriter(0);
+    cw.visit(V1_8, access, binaryName, null, "java/lang/Object", null);
+
+    consumer.accept(
+        (access1, name, descriptor1) -> cw.visitMethod(access1, name, descriptor1, null, null));
+    cw.visitEnd();
+    return cw.toByteArray();
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TestLibraryDesugaringSpecification.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TestLibraryDesugaringSpecification.java
index 6eabf06..3e42517 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TestLibraryDesugaringSpecification.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11TestLibraryDesugaringSpecification.java
@@ -9,36 +9,34 @@
 import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK11;
 import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK11_PATH;
 import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK8;
-import static com.android.tools.r8.utils.FileUtils.CLASS_EXTENSION;
 import static com.android.tools.r8.utils.FileUtils.JAVA_EXTENSION;
 
 import com.android.tools.r8.JavaCompilerTool;
 import com.android.tools.r8.TestRuntime;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.nio.file.StandardCopyOption;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
+import java.util.zip.ZipFile;
 import org.junit.rules.TemporaryFolder;
 
 public class Jdk11TestLibraryDesugaringSpecification {
 
-  private static final String EXTENSION_STRING = "build/libs/java_base_extension.jar";
-
   private static final Path JDK_11_JAVA_BASE_EXTENSION_FILES_DIR =
       Paths.get(
           ToolHelper.THIRD_PARTY_DIR, "openjdk/jdk-11-test/lib/testlibrary/bootlib/java.base");
   private static final Path JDK_11_TESTLIBRARY_FILES_DIR =
       Paths.get(ToolHelper.THIRD_PARTY_DIR, "openjdk/jdk-11-test/lib/testlibrary/jdk");
 
-  public static Path EXTENSION_PATH;
+  public static Path EXTENSION_PATH = Paths.get(ToolHelper.LIBS_DIR + "java_base_extension.jar");
 
   public static LibraryDesugaringSpecification JDK8_JAVA_BASE_EXT;
   public static LibraryDesugaringSpecification JDK11_JAVA_BASE_EXT;
@@ -60,7 +58,6 @@
       // The library configuration is not available on windows. Do not run anything.
       return;
     }
-    EXTENSION_PATH = Paths.get(EXTENSION_STRING);
     ensureJavaBaseExtensionsCompiled();
     JDK8_JAVA_BASE_EXT = createSpecification("JDK8_JAVA_BASE_EXT", JDK8);
     JDK11_JAVA_BASE_EXT = createSpecification("JDK11_JAVA_BASE_EXT", JDK11);
@@ -86,11 +83,10 @@
     if (Files.exists(EXTENSION_PATH)) {
       return;
     }
-
     TemporaryFolder folder =
         new TemporaryFolder(ToolHelper.isLinux() ? null : Paths.get("build", "tmp").toFile());
     folder.create();
-    Path output = folder.newFolder("jdk11Ext").toPath();
+    Path output = folder.newFolder().toPath().resolve("temp.jar");
     List<String> options =
         Arrays.asList(
             "--add-reads",
@@ -103,30 +99,14 @@
         .addSourceFiles(getExtensionsFiles())
         .setOutputPath(output)
         .compile();
-    Path[] toCompile = getAllFilesWithSuffixInDirectory(output, CLASS_EXTENSION);
-    assert toCompile.length > 0;
-
-    // Jar the contents.
-    List<String> cmdline = new ArrayList<>();
-    cmdline.add(TestRuntime.getCheckedInJdk11().getJavaExecutable().getParent() + "/jar");
-    cmdline.add("cf");
-    cmdline.add("tmp.jar");
-    for (Path compile : toCompile) {
-      cmdline.add(output.relativize(compile).toString());
-    }
-    ProcessBuilder builder = new ProcessBuilder(cmdline);
-    builder.directory(output.toFile());
-    ProcessResult result = ToolHelper.runProcess(builder);
-    assert result.exitCode == 0;
+    assert new ZipFile(output.toFile()).size() > 0;
 
     // Move the result into the build/libs folder.
-    List<String> cmdlineMv = new ArrayList<>();
-    cmdlineMv.add("mv");
-    cmdlineMv.add(output.resolve("tmp.jar").toString());
-    cmdlineMv.add(EXTENSION_STRING);
-    ProcessResult resultMv = ToolHelper.runProcess(new ProcessBuilder(cmdlineMv));
-    assert resultMv.exitCode == 0;
-
+    Files.move(
+        output,
+        EXTENSION_PATH,
+        StandardCopyOption.REPLACE_EXISTING,
+        StandardCopyOption.ATOMIC_MOVE);
     folder.delete();
   }
 
diff --git a/src/test/java/com/android/tools/r8/desugar/r8bootstrap/Java17R8BootstrapTest.java b/src/test/java/com/android/tools/r8/desugar/r8bootstrap/Java17R8BootstrapTest.java
index 8d2a21e..70c3f2c 100644
--- a/src/test/java/com/android/tools/r8/desugar/r8bootstrap/Java17R8BootstrapTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/r8bootstrap/Java17R8BootstrapTest.java
@@ -7,13 +7,13 @@
 import static com.android.tools.r8.desugar.r8bootstrap.JavaBootstrapUtils.MAIN_KEEP;
 import static junit.framework.TestCase.assertEquals;
 
-import com.android.tools.r8.Jdk11TestUtils;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.cf.bootstrap.BootstrapCurrentEqualityTest;
+import com.android.tools.r8.desugar.LibraryFilesHelper;
 import com.android.tools.r8.examples.hello.HelloTestRunner;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
@@ -70,7 +70,7 @@
   private static Path compileR8(boolean desugar) throws Exception {
     return JavaBootstrapUtils.compileR8(
         ToolHelper.R8_WITH_RELOCATED_DEPS_17_JAR,
-        Jdk11TestUtils.getJdk11LibraryFiles(getStaticTemp()),
+        LibraryFilesHelper.getJdk11LibraryFiles(getStaticTemp()),
         desugar);
   }
 
diff --git a/src/test/java/com/android/tools/r8/desugar/records/RecordInvokeCustomTest.java b/src/test/java/com/android/tools/r8/desugar/records/RecordInvokeCustomTest.java
index 1294b2d..8be5a1d 100644
--- a/src/test/java/com/android/tools/r8/desugar/records/RecordInvokeCustomTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/records/RecordInvokeCustomTest.java
@@ -9,6 +9,7 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.TestRuntime.CfVm;
+import com.android.tools.r8.desugar.LibraryFilesHelper;
 import com.android.tools.r8.utils.StringUtils;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -83,7 +84,7 @@
             .addKeepMainRule(MAIN_TYPE);
     if (parameters.isCfRuntime()) {
       builder
-          .addLibraryFiles(RecordTestUtils.getJdk15LibraryFiles(temp))
+          .addLibraryFiles(LibraryFilesHelper.getJdk15LibraryFiles(temp))
           .compile()
           .inspect(RecordTestUtils::assertRecordsAreRecords)
           .run(parameters.getRuntime(), MAIN_TYPE)
diff --git a/src/test/java/com/android/tools/r8/desugar/records/RecordReflectionTest.java b/src/test/java/com/android/tools/r8/desugar/records/RecordReflectionTest.java
index 055eff8..6a63449 100644
--- a/src/test/java/com/android/tools/r8/desugar/records/RecordReflectionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/records/RecordReflectionTest.java
@@ -8,6 +8,7 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.TestRuntime.CfVm;
+import com.android.tools.r8.desugar.LibraryFilesHelper;
 import com.android.tools.r8.utils.StringUtils;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -57,9 +58,9 @@
         .addProgramClassFileData(PROGRAM_DATA)
         .setMinApi(parameters)
         .addKeepMainRule(MAIN_TYPE)
-        .addKeepRules("-keepattributes *")
+        .addKeepAllAttributes()
         .addKeepRules("-keep class * extends java.lang.Record { private final <fields>; }")
-        .addLibraryFiles(RecordTestUtils.getJdk15LibraryFiles(temp))
+        .addLibraryFiles(LibraryFilesHelper.getJdk15LibraryFiles(temp))
         .compile()
         .inspect(RecordTestUtils::assertRecordsAreRecords)
         .enableJVMPreview()
diff --git a/src/test/java/com/android/tools/r8/desugar/records/RecordTestUtils.java b/src/test/java/com/android/tools/r8/desugar/records/RecordTestUtils.java
index 7008bfe..35725b8 100644
--- a/src/test/java/com/android/tools/r8/desugar/records/RecordTestUtils.java
+++ b/src/test/java/com/android/tools/r8/desugar/records/RecordTestUtils.java
@@ -4,13 +4,12 @@
 
 package com.android.tools.r8.desugar.records;
 
-import static com.android.tools.r8.TestRuntime.getCheckedInJdk8;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertTrue;
 
-import com.android.tools.r8.JavaCompilerTool;
 import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.desugar.LibraryFilesHelper;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
@@ -24,7 +23,6 @@
 import java.util.List;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
-import org.junit.Assume;
 import org.junit.rules.TemporaryFolder;
 
 /**
@@ -40,22 +38,8 @@
     return Paths.get(ToolHelper.TESTS_BUILD_DIR, EXAMPLE_FOLDER, RECORD_FOLDER + ".jar");
   }
 
-
-  public static Path[] getJdk15LibraryFiles(TemporaryFolder temp) throws IOException {
-    Assume.assumeFalse(ToolHelper.isWindows());
-    // TODO(b/169645628): Add JDK-15 runtime jar instead. As a temporary solution we use the jdk 8
-    // runtime with additional stubs.
-    // We use jdk-8 for compilation because in jdk-9 and higher we would need to deal with the
-    // module patching logic.
-    Path recordStubs =
-        JavaCompilerTool.create(getCheckedInJdk8(), temp)
-            .addSourceFiles(Paths.get("src", "test", "javaStubs", "Record.java"))
-            .addSourceFiles(Paths.get("src", "test", "javaStubs", "ObjectMethods.java"))
-            .addSourceFiles(Paths.get("src", "test", "javaStubs", "StringConcatFactory.java"))
-            .addSourceFiles(Paths.get("src", "test", "javaStubs", "TypeDescriptor.java"))
-            .addSourceFiles(Paths.get("src", "test", "javaStubs", "RecordComponent.java"))
-            .compile();
-    return new Path[] {recordStubs, ToolHelper.getJava8RuntimeJar()};
+  public static Path[] getJdk15LibraryFiles(TemporaryFolder temp) throws Exception {
+    return LibraryFilesHelper.getJdk15LibraryFiles(temp);
   }
 
   public static byte[][] getProgramData(String mainClassSimpleName) {
diff --git a/src/test/java/com/android/tools/r8/desugar/softverificationerrorremoval/GetDeclaredMethodsErrorRemovalTest.java b/src/test/java/com/android/tools/r8/desugar/softverificationerrorremoval/GetDeclaredMethodsErrorRemovalTest.java
index cd6ac90..c94680d 100644
--- a/src/test/java/com/android/tools/r8/desugar/softverificationerrorremoval/GetDeclaredMethodsErrorRemovalTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/softverificationerrorremoval/GetDeclaredMethodsErrorRemovalTest.java
@@ -4,7 +4,6 @@
 
 package com.android.tools.r8.desugar.softverificationerrorremoval;
 
-import static com.android.tools.r8.TestRuntime.CfRuntime.getCheckedInJdk8;
 import static org.hamcrest.CoreMatchers.containsString;
 
 import com.android.tools.r8.D8TestRunResult;
@@ -12,8 +11,7 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ToolHelper;
-import java.nio.file.Path;
-import java.nio.file.Paths;
+import com.android.tools.r8.desugar.LibraryFilesHelper;
 import java.util.Arrays;
 import java.util.function.Supplier;
 import org.junit.Test;
@@ -63,13 +61,9 @@
 
   @Test
   public void testWithJavaStub() throws Exception {
-    Path stubs =
-        javac(getCheckedInJdk8())
-            .addSourceFiles(Paths.get("src/test/javaStubs/Supplier.java"))
-            .compile();
     testForD8()
         .addInnerClasses(GetDeclaredMethodsErrorRemovalTest.class)
-        .addProgramFiles(stubs)
+        .addProgramClassFileData(LibraryFilesHelper.getSupplier())
         .setMinApi(parameters)
         .compile()
         .run(parameters.getRuntime(), TestClass.class)
diff --git a/src/test/java/com/android/tools/r8/desugar/softverificationerrorremoval/SoftVerificationErrorRemovalTest.java b/src/test/java/com/android/tools/r8/desugar/softverificationerrorremoval/SoftVerificationErrorRemovalTest.java
index 2fac1a6..ee76b7f 100644
--- a/src/test/java/com/android/tools/r8/desugar/softverificationerrorremoval/SoftVerificationErrorRemovalTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/softverificationerrorremoval/SoftVerificationErrorRemovalTest.java
@@ -4,7 +4,6 @@
 
 package com.android.tools.r8.desugar.softverificationerrorremoval;
 
-import static com.android.tools.r8.TestRuntime.CfRuntime.getCheckedInJdk8;
 import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.D8TestRunResult;
@@ -12,8 +11,7 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ToolHelper;
-import java.nio.file.Path;
-import java.nio.file.Paths;
+import com.android.tools.r8.desugar.LibraryFilesHelper;
 import java.util.function.Supplier;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -60,14 +58,10 @@
 
   @Test
   public void testWithJavaStub() throws Exception {
-    Path stubs =
-        javac(getCheckedInJdk8())
-            .addSourceFiles(Paths.get("src/test/javaStubs/Supplier.java"))
-            .compile();
     D8TestRunResult run =
         testForD8()
             .addInnerClasses(SoftVerificationErrorRemovalTest.class)
-            .addProgramFiles(stubs)
+            .addProgramClassFileData(LibraryFilesHelper.getSupplier())
             .setMinApi(parameters)
             .compile()
             .run(parameters.getRuntime(), TestClass.class);
diff --git a/src/test/java/com/android/tools/r8/jdwp/RunJdwpTests.java b/src/test/java/com/android/tools/r8/jdwp/RunJdwpTests.java
index d843a4c..80ce84a 100644
--- a/src/test/java/com/android/tools/r8/jdwp/RunJdwpTests.java
+++ b/src/test/java/com/android/tools/r8/jdwp/RunJdwpTests.java
@@ -49,9 +49,11 @@
   // Print test output for passing tests (failing tests output is always printed).
   static final boolean PRINT_STREAMS = true;
 
-  static final String RUN_SCRIPT = "tools/run-jdwp-tests.py";
-  static final String DEX_LIB = "third_party/jdwp-tests/apache-harmony-jdwp-tests-hostdex.jar";
-  static final String JAR_LIB = "third_party/jdwp-tests/apache-harmony-jdwp-tests-host.jar";
+  static final String RUN_SCRIPT = ToolHelper.TOOLS_DIR + "run-jdwp-tests.py";
+  static final String DEX_LIB =
+      ToolHelper.THIRD_PARTY_DIR + "jdwp-tests/apache-harmony-jdwp-tests-hostdex.jar";
+  static final String JAR_LIB =
+      ToolHelper.THIRD_PARTY_DIR + "jdwp-tests/apache-harmony-jdwp-tests-host.jar";
 
   interface TestPredicate {
     boolean test(DexVm dexVm, Tool tool);
diff --git a/src/test/java/com/android/tools/r8/profile/art/completeness/TwrCloseResourceDuplicationProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/completeness/TwrCloseResourceDuplicationProfileRewritingTest.java
index 6b83be2..8554ae3 100644
--- a/src/test/java/com/android/tools/r8/profile/art/completeness/TwrCloseResourceDuplicationProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/completeness/TwrCloseResourceDuplicationProfileRewritingTest.java
@@ -4,7 +4,7 @@
 
 package com.android.tools.r8.profile.art.completeness;
 
-import static com.android.tools.r8.Jdk11TestUtils.getJdk11LibraryFiles;
+import static com.android.tools.r8.desugar.LibraryFilesHelper.getJdk11LibraryFiles;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static com.android.tools.r8.utils.codeinspector.Matchers.notIf;
 import static org.hamcrest.MatcherAssert.assertThat;
diff --git a/src/test/javaStubs/ObjectMethods.java b/src/test/javaStubs/ObjectMethods.java
deleted file mode 100644
index 21aff6a..0000000
--- a/src/test/javaStubs/ObjectMethods.java
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package java.lang.runtime;
-
-public class ObjectMethods {}
diff --git a/src/test/javaStubs/Record.java b/src/test/javaStubs/Record.java
deleted file mode 100644
index fcf63e6..0000000
--- a/src/test/javaStubs/Record.java
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package java.lang;
-
-public abstract class Record {
-  protected Record() {}
-
-  @Override
-  public abstract boolean equals(Object obj);
-
-  @Override
-  public abstract int hashCode();
-
-  @Override
-  public abstract String toString();
-}
diff --git a/src/test/javaStubs/RecordComponent.java b/src/test/javaStubs/RecordComponent.java
deleted file mode 100644
index b3e0560..0000000
--- a/src/test/javaStubs/RecordComponent.java
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package java.lang.reflect;
-
-public class RecordComponent {}
diff --git a/src/test/javaStubs/StringConcatFactory.java b/src/test/javaStubs/StringConcatFactory.java
deleted file mode 100644
index 9863857..0000000
--- a/src/test/javaStubs/StringConcatFactory.java
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package java.lang.invoke;
-
-public class StringConcatFactory {}
diff --git a/src/test/javaStubs/Supplier.java b/src/test/javaStubs/Supplier.java
deleted file mode 100644
index f9c4860..0000000
--- a/src/test/javaStubs/Supplier.java
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright (c) 2020, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package java.util.function;
-
-public interface Supplier {
-  Object get();
-}
diff --git a/src/test/javaStubs/TypeDescriptor.java b/src/test/javaStubs/TypeDescriptor.java
deleted file mode 100644
index 643d1e0..0000000
--- a/src/test/javaStubs/TypeDescriptor.java
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package java.lang.invoke;
-
-public interface TypeDescriptor {
-  String descriptorString();
-}
diff --git a/src/test/javaStubs/VarHandle.java b/src/test/javaStubs/VarHandle.java
deleted file mode 100644
index c12d32a..0000000
--- a/src/test/javaStubs/VarHandle.java
+++ /dev/null
@@ -1,7 +0,0 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package java.lang.invoke;
-
-public class VarHandle {}
