diff --git a/.gitignore b/.gitignore
index 4496e10..4008f3e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -96,8 +96,20 @@
 third_party/dependencies_new.tar.gz
 third_party/desugar/desugar_*.tar.gz
 third_party/desugar/desugar_*/
+third_party/examples
+third_party/examples.tar.gz
+third_party/examplesAndroidN
+third_party/examplesAndroidN.tar.gz
+third_party/examplesAndroidO
+third_party/examplesAndroidO.tar.gz
+third_party/examplesAndroidOGenerated
+third_party/examplesAndroidOGenerated.tar.gz
 third_party/examplesAndroidOLegacy
 third_party/examplesAndroidOLegacy.tar.gz
+third_party/examplesAndroidP
+third_party/examplesAndroidP.tar.gz
+third_party/examplesAndroidPGenerated
+third_party/examplesAndroidPGenerated.tar.gz
 third_party/framework
 third_party/framework.tar.gz
 third_party/gmail/*
@@ -155,6 +167,8 @@
 third_party/kotlin/kotlin-compiler-dev
 third_party/kotlinx-coroutines-1.3.6.tar.gz
 third_party/kotlinx-coroutines-1.3.6
+third_party/kotlinR8TestResources
+third_party/kotlinR8TestResources.tar.gz
 third_party/multidex
 third_party/multidex.tar.gz
 third_party/nest/*
diff --git a/build.gradle b/build.gradle
index 41d7c5c..9316f6d 100644
--- a/build.gradle
+++ b/build.gradle
@@ -105,12 +105,6 @@
         }
         output.resourcesDir = 'build/classes/debugTestResourcesJava8'
     }
-    examples {
-        java {
-            srcDirs = ['src/test/examples']
-        }
-        output.resourcesDir = 'build/classes/examples'
-    }
     examplesJava9 {
         java {
             srcDirs = ['src/test/examplesJava9']
@@ -136,30 +130,6 @@
             srcDirs = ['src/test/examplesJava20']
         }
     }
-    examplesAndroidN {
-        java {
-            srcDirs = ['src/test/examplesAndroidN']
-        }
-        output.resourcesDir = 'build/classes/examplesAndroidN'
-    }
-    examplesAndroidO {
-        java {
-            srcDirs = ['src/test/examplesAndroidO']
-        }
-        output.resourcesDir = 'build/classes/examplesAndroidO'
-    }
-    examplesAndroidP {
-        java {
-            srcDirs = ['src/test/examplesAndroidP']
-        }
-        output.resourcesDir = 'build/classes/examplesAndroidP'
-    }
-    kotlinR8TestResources {
-        java {
-            srcDirs = ['src/test/kotlinR8TestResources']
-        }
-        output.resourcesDir = 'build/classes/kotlinR8TestResources'
-    }
     keepanno {
         java {
             srcDirs = ['src/keepanno/java']
@@ -225,7 +195,6 @@
     main17Implementation group: 'org.ow2.asm', name: 'asm-analysis', version: asmVersion
     main17Implementation group: 'org.ow2.asm', name: 'asm-util', version: asmVersion
 
-    testCompile sourceSets.examples.output
     testCompile "junit:junit:$junitVersion"
     testCompile "com.google.guava:guava:$guavaVersion"
     testCompile "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
@@ -242,18 +211,8 @@
     testCompile group: 'it.unimi.dsi', name: 'fastutil', version: fastutilVersion
     testCompile group: 'org.javassist', name: 'javassist', version: javassistVersion
 
-    examplesAndroidOCompile group: 'org.ow2.asm', name: 'asm', version: asmVersion
-    examplesAndroidOCompile files("third_party/android_jar/lib-v26/android.jar")
-    examplesAndroidOCompile files("third_party/examplesAndroidOLegacy")
-
-    examplesAndroidPCompile group: 'org.ow2.asm', name: 'asm', version: asmVersion
-    // Import Guava for @Nullable annotation
-    examplesCompile "com.google.guava:guava:$guavaVersion"
-    examplesCompile "junit:junit:$junitVersion"
-    examplesCompile "org.mockito:mockito-core:$mockitoVersion"
     apiUsageSampleCompile sourceSets.main.output
     apiUsageSampleCompile "com.google.guava:guava:$guavaVersion"
-    kotlinR8TestResourcesCompileOnly "org.jetbrains.kotlin:kotlin-stdlib:$kotlinVersion"
     errorprone("com.google.errorprone:error_prone_core:$errorproneVersion")
 
     keepannoCompile group: 'org.ow2.asm', name: 'asm', version: asmVersion
@@ -307,7 +266,13 @@
                 "dagger/2.41",
                 "dart-sdk",
                 "ddmlib",
+                "examples",
+                "examplesAndroidN",
+                "examplesAndroidO",
                 "examplesAndroidOLegacy",
+                "examplesAndroidOGenerated",
+                "examplesAndroidP",
+                "examplesAndroidPGenerated",
                 "gradle/gradle",
                 "google/google-java-format/1.14.0",
                 "google-java-format",
@@ -329,6 +294,7 @@
                 "kotlin/kotlin-compiler-1.7.0",
                 "kotlin/kotlin-compiler-1.8.0",
                 "kotlinx-coroutines-1.3.6",
+                "kotlinR8TestResources",
                 "multidex",
                 "openjdk/custom_conversion",
                 "openjdk/openjdk-rt-1.8",
@@ -947,7 +913,8 @@
     return baseD8CommandLine(allArgs)
 }
 
-def r8LibCreateTask(name, pgConfs = [], r8Task, output, libs = [], classpath = [], excldeps=false) {
+def r8LibCreateTask(
+    name, pgConfs = [], r8Task, output, libs = [], classpath = [], excldeps=false, debug=false) {
     return tasks.create("r8Lib${name}", Exec) {
         inputs.files ([pgConfs, r8WithRelocatedDeps.outputs, r8Task.outputs])
         outputs.file output
@@ -959,6 +926,7 @@
                 "--r8jar", r8Task.outputs.files[0],
                 "--output", output]
                 + (excldeps ? ['--excldeps-variant'] : [])
+                + (debug ? ['--debug-variant'] : [])
                 + (pgConfs.collectMany { ["--pg-conf", it] })
                 + (libs.collectMany { ["--lib", it] })
                 + (classpath.collectMany { ["--classpath", it] }))
@@ -1071,6 +1039,10 @@
             ["src/main/keep_retrace.txt"],
             R8Lib,
             r8RetracePath,
+            [],
+            [],
+            false,
+            true
     ).dependsOn(R8Lib)
     outputs.file r8RetracePath
 }
@@ -1085,6 +1057,7 @@
             [],
             repackageDeps.outputs.files,
             true,
+            true,
     ).dependsOn(R8LibNoDeps)
     outputs.file r8RetraceExludeDepsPath
 }
@@ -1133,211 +1106,6 @@
     dependsOn buildR8ApiUsageSample
 }
 
-// Proto lite generated code yields warnings when compiling with javac.
-// We change the options passed to javac to ignore it.
-compileExamplesJava.options.compilerArgs = ["-Xlint:none"]
-
-
-task buildExampleJars {
-    def examplesDir = file("src/test/examples")
-    task extractExamplesRuntime(type: Sync) {
-        dependsOn configurations.examplesRuntime
-        from { configurations.examplesRuntime.collect { zipTree(it) } }
-        include "**/*.class"
-        includeEmptyDirs false
-        into "$buildDir/runtime/examples/"
-    }
-
-    task "copy_examples_resources"(type: org.gradle.api.tasks.Copy) {
-        from examplesDir
-        exclude "**/*.java"
-        exclude "**/keep-rules*.txt"
-        into file("build/test/examples/classes")
-    }
-
-    task "compile_examples"(type: JavaCompile) {
-        dependsOn "copy_examples_resources"
-        source examplesDir
-        include "**/*.java"
-        destinationDir = file("build/test/examples/classes")
-        classpath = sourceSets.examples.compileClasspath
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-        options.compilerArgs = ["-g:source,lines", "-Xlint:none"]
-    }
-    task "compile_examples_debuginfo_all"(type: JavaCompile) {
-        source examplesDir
-        include "**/*.java"
-        destinationDir = file("build/test/examples/classes_debuginfo_all")
-        classpath = sourceSets.examples.compileClasspath
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-        options.compilerArgs = ["-g", "-Xlint:none"]
-    }
-    task "compile_examples_debuginfo_none"(type: JavaCompile) {
-        source examplesDir
-        include "**/*.java"
-        destinationDir = file("build/test/examples/classes_debuginfo_none")
-        classpath = sourceSets.examples.compileClasspath
-        sourceCompatibility = JavaVersion.VERSION_1_7
-        targetCompatibility = JavaVersion.VERSION_1_7
-        options.compilerArgs = ["-g:none", "-Xlint:none"]
-    }
-    examplesDir.eachDir { dir ->
-        def name = dir.getName();
-        def exampleOutputDir = file("build/test/examples");
-        def jarName = "${name}.jar"
-        dependsOn "jar_example_${name}"
-        dependsOn "jar_example_${name}_debuginfo_all"
-        dependsOn "jar_example_${name}_debuginfo_none"
-        dependsOn "extractExamplesRuntime"
-        def runtimeDependencies = copySpec { }
-        task "jar_example_${name}"(type: Jar, dependsOn: "compile_examples") {
-            archiveName = "${name}.jar"
-            destinationDir = exampleOutputDir
-            from "build/test/examples/classes"
-            include name + "/**/*"
-            with runtimeDependencies
-            includeEmptyDirs true
-        }
-        task "jar_example_${name}_debuginfo_all"(type: Jar, dependsOn: "compile_examples_debuginfo_all") {
-            archiveName = "${name}_debuginfo_all.jar"
-            destinationDir = exampleOutputDir
-            from "build/test/examples/classes_debuginfo_all"
-            include name + "/**/*.class"
-            with runtimeDependencies
-            includeEmptyDirs false
-        }
-        task "jar_example_${name}_debuginfo_none"(type: Jar, dependsOn: "compile_examples_debuginfo_none") {
-            archiveName = "${name}_debuginfo_none.jar"
-            destinationDir = exampleOutputDir
-            from "build/test/examples/classes_debuginfo_none"
-            include name + "/**/*.class"
-            with runtimeDependencies
-            includeEmptyDirs false
-        }
-    }
-}
-
-task buildExampleAndroidNJars {
-    dependsOn downloadDeps
-    def examplesDir = file("src/test/examplesAndroidN")
-    task "compile_examplesAndroidN"(type: JavaCompile) {
-        source = fileTree(dir: examplesDir, include: '**/*.java')
-        destinationDir = file("build/test/examplesAndroidN/classes")
-        classpath = sourceSets.main.compileClasspath
-        sourceCompatibility = JavaVersion.VERSION_1_8
-        targetCompatibility = JavaVersion.VERSION_1_8
-        options.compilerArgs += ["-Xlint:-options"]
-    }
-    examplesDir.eachDir { dir ->
-        def name = dir.getName();
-        def exampleOutputDir = file("build/test/examplesAndroidN");
-        def jarName = "${name}.jar"
-        dependsOn "jar_examplesAndroidN_${name}"
-        task "jar_examplesAndroidN_${name}"(type: Jar, dependsOn: "compile_examplesAndroidN") {
-            archiveName = jarName
-            destinationDir = exampleOutputDir
-            from "build/test/examplesAndroidN/classes"
-            include "**/" + name + "/**/*.class"
-        }
-    }
-}
-
-
-task buildExampleAndroidOJars {
-    dependsOn downloadDeps
-    def examplesDir = file("src/test/examplesAndroidO")
-    // Compiling the rest of the files as Java 1.8 code.
-    task "compile_examplesAndroidO"(type: JavaCompile) {
-        source = fileTree(dir: examplesDir, include: '**/*.java', exclude: '**/legacy/**/*.java')
-        destinationDir = file("build/test/examplesAndroidO/classes")
-        classpath = sourceSets.main.compileClasspath
-        classpath += files("build/test/examplesAndroidOLegacy/classes")
-        classpath += files("third_party/android_jar/lib-v26/android.jar")
-        classpath += files("third_party/examplesAndroidOLegacy")
-        sourceCompatibility = JavaVersion.VERSION_1_8
-        targetCompatibility = JavaVersion.VERSION_1_8
-        options.compilerArgs += ["-Xlint:-options", "-parameters"]
-    }
-    examplesDir.eachDir { dir ->
-        def name = dir.getName();
-        def destinationDir = file("build/test/examplesAndroidO/classes");
-        if (file("src/test/examplesAndroidO/" + name + "/TestGenerator.java").isFile()) {
-            task "generate_examplesAndroidO_${name}"(type: JavaExec,
-                    dependsOn: "compile_examplesAndroidO") {
-                main = name + ".TestGenerator"
-                classpath = files(destinationDir, sourceSets.main.compileClasspath)
-                args destinationDir, file("build/test/examplesAndroidO/classes/${name}").toString()
-            }
-        } else {
-            task "generate_examplesAndroidO_${name}" () {}
-        }
-    }
-    examplesDir.eachDir { dir ->
-        def name = dir.getName();
-        def exampleOutputDir = file("build/test/examplesAndroidO");
-        def jarName = "${name}.jar"
-        dependsOn "jar_examplesAndroidO_${name}"
-        task "jar_examplesAndroidO_${name}"(type: Jar, dependsOn: ["compile_examplesAndroidO",
-                "generate_examplesAndroidO_${name}"]) {
-            archiveName = jarName
-            destinationDir = exampleOutputDir
-            from "build/test/examplesAndroidO/classes"        // Java 1.8 classes
-            from "build/test/examplesAndroidOLegacy/classes"  // Java 1.6 classes
-            include "**/" + name + "/**/*.class"
-            // Do not include generator into the test runtime jar, it is not useful.
-            // Otherwise, shrinking will need ASM jars.
-            exclude "**/TestGenerator*"
-        }
-    }
-}
-
-task buildExampleAndroidPJars {
-    dependsOn downloadDeps
-    def examplesDir = file("src/test/examplesAndroidP")
-
-    task "compile_examplesAndroidP"(type: JavaCompile) {
-        source = fileTree(dir: examplesDir, include: '**/*.java')
-        destinationDir = file("build/test/examplesAndroidP/classes")
-        classpath = sourceSets.main.compileClasspath
-        sourceCompatibility = JavaVersion.VERSION_1_8
-        targetCompatibility = JavaVersion.VERSION_1_8
-        options.compilerArgs += ["-Xlint:-options"]
-    }
-    examplesDir.eachDir { dir ->
-        def name = dir.getName();
-        def destinationDir = file("build/test/examplesAndroidP/classes");
-        if (file("src/test/examplesAndroidP/" + name + "/TestGenerator.java").isFile()) {
-            task "generate_examplesAndroidP_${name}"(type: JavaExec,
-                    dependsOn: "compile_examplesAndroidP") {
-                main = name + ".TestGenerator"
-                classpath = files(destinationDir.toString(), sourceSets.main.compileClasspath)
-                args destinationDir, file("build/test/examplesAndroidP/classes/${name}").toString()
-            }
-        } else {
-            task "generate_examplesAndroidP_${name}" () {}
-        }
-    }
-    examplesDir.eachDir { dir ->
-        def name = dir.getName();
-        def exampleOutputDir = file("build/test/examplesAndroidP");
-        def jarName = "${name}.jar"
-        dependsOn "jar_examplesAndroidP_${name}"
-        task "jar_examplesAndroidP_${name}"(type: Jar,
-                dependsOn: ["compile_examplesAndroidP",
-                            "generate_examplesAndroidP_${name}"]) {
-            archiveName = jarName
-            destinationDir = exampleOutputDir
-            from "build/test/examplesAndroidP/classes"  // Java 1.8 classes
-            include "**/" + name + "/**/*.class"
-            // Do not include generator into the test runtime jar, it is not useful.
-            // Otherwise, shrinking will need ASM jars.
-            exclude "**/TestGenerator*"
-        }
-    }
-}
-
 def buildExampleJarsCreateTask(javaVersion, sourceSet) {
     return tasks.create("buildExample${javaVersion}Jars") {
         def examplesDir = file("src/test/examples${javaVersion}")
@@ -1362,46 +1130,6 @@
 buildExampleJarsCreateTask("Java17", sourceSets.examplesJava17)
 buildExampleJarsCreateTask("Java20", sourceSets.examplesJava20)
 
-task provideArtFrameworksDependencies {
-    cloudDependencies.tools.forEach({ art ->
-        if (art.contains("art")) {
-            def taskName = art.replace('/','_')
-            dependsOn "patch_${taskName}"
-            task "patch_${taskName}"(type: org.gradle.api.tasks.Copy){
-                from "tools/${art}/framework"
-                include "**.jar"
-                into file("tools/${art}/out/host/linux-x86/framework")
-            }
-        }
-    })
-}
-
-task buildKotlinR8TestResources {
-    def examplesDir = file("src/test/kotlinR8TestResources")
-    examplesDir.eachDir { dir ->
-        def name = dir.getName()
-        def taskName = "jar_kotlinR8TestResources_${name}"
-        def javaOutput = "build/test/kotlinR8TestResources/${name}/java"
-        def javaOutputJarName = "${name}.jar"
-        def javaOutputJarDir = "build/test/kotlinR8TestResources"
-        task "${taskName}Java"(type: JavaCompile) {
-            source = fileTree(dir: file("${examplesDir}/${name}"), include: '**/*.java')
-            destinationDir = file(javaOutput)
-            classpath = sourceSets.main.compileClasspath
-            sourceCompatibility = JavaVersion.VERSION_1_8
-            targetCompatibility = JavaVersion.VERSION_1_8
-            options.compilerArgs += ["-g", "-Xlint:-options"]
-        }
-        task "${taskName}JavaJar"(type: Jar, dependsOn: "${taskName}Java") {
-            archiveName = javaOutputJarName
-            destinationDir = file(javaOutputJarDir)
-            from javaOutput
-            include "**/*.class"
-        }
-        dependsOn "${taskName}JavaJar"
-    }
-}
-
 task buildExamples {
     if (OperatingSystem.current().isMacOsX() || OperatingSystem.current().isWindows()) {
         logger.lifecycle("WARNING: Testing (including building examples) is only partially supported on your " +
@@ -1411,22 +1139,11 @@
           "It is fully supported on Linux and partially supported on Mac OS and Windows")
       return;
     }
-    dependsOn buildExampleJars
-    dependsOn buildExampleAndroidNJars
-    dependsOn buildExampleAndroidOJars
-    dependsOn buildExampleAndroidPJars
     dependsOn buildExampleJava9Jars
     dependsOn buildExampleJava10Jars
     dependsOn buildExampleJava11Jars
     dependsOn buildExampleJava17Jars
     dependsOn buildExampleJava20Jars
-    def examplesDir = file("src/test/examples")
-    examplesDir.eachDir { dir ->
-        def exampleOutputDir = file("build/test/examples/" + dir.getName());
-        if (!exampleOutputDir.exists()) {
-          exampleOutputDir.mkdirs()
-        }
-    }
 }
 
 tasks.withType(Test) {
@@ -1512,8 +1229,10 @@
     delete r8LibTestPath
     from zipTree(buildR8LibCfTestDeps.outputs.files[0])
     def examplesDir = file("build/test")
-    examplesDir.eachDir { dir ->
-        from ("${buildDir}/test/${dir.getName()}/classes")
+    if (examplesDir.exists()) {
+        examplesDir.eachDir { dir ->
+            from ("${buildDir}/test/${dir.getName()}/classes")
+        }
     }
     from ("${buildDir}/runtime/examples")
     into r8LibTestPath
@@ -2023,9 +1742,7 @@
         }
         dependsOn downloadDeps
         dependsOn buildExamples
-        dependsOn buildKotlinR8TestResources
         dependsOn buildPreNJdwpTestsJar
-        dependsOn provideArtFrameworksDependencies
     } else {
         logger.lifecycle("WARNING: Testing in not supported on your platform. Testing is only fully supported on " +
             "Linux and partially supported on Mac OS and Windows. Art does not run on other platforms.")
diff --git a/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt b/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
index e396985..2214408 100644
--- a/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
+++ b/d8_r8/commonBuildSrc/src/main/kotlin/DependenciesPlugin.kt
@@ -6,6 +6,7 @@
 import java.io.File
 import java.net.URI
 import java.nio.file.Paths
+import kotlin.reflect.full.declaredMemberProperties
 import org.gradle.api.JavaVersion
 import org.gradle.api.Plugin
 import org.gradle.api.Project
@@ -86,24 +87,6 @@
   return "****** ${title} ******"
 }
 
-fun Project.ensureThirdPartyDependencies(name : String, deps : List<ThirdPartyDependency>) : Task {
-  val outputFiles : MutableList<File> = mutableListOf()
-  val root = getRoot()
-  val depsTasks = deps.map { tpd ->
-    val projectAndTaskName = "${project.name}-$name"
-    val downloadTaskName = "download-third-party-$projectAndTaskName-${tpd.packageName}"
-    val downloadTask = tasks.register<DownloadDependencyTask>(downloadTaskName) {
-      setDependency(root.resolve(tpd.sha1File), root.resolve(tpd.path), tpd.type, root)
-    }.get()
-    outputFiles.add(tpd.path)
-    downloadTask
-  }
-  return tasks.register("ensure-third-party-$name") {
-    dependsOn(*depsTasks.toTypedArray())
-    outputs.files(outputFiles)
-  }.get()
-}
-
 /**
  * Builds a jar for each sub folder in a test source set.
  *
@@ -274,23 +257,34 @@
   output: File,
   pgConf: List<File>,
   excludingDepsVariant: Boolean,
+  debugVariant: Boolean,
   lib: List<File> = listOf(),
-  classpath: List<File> = listOf()
+  classpath: List<File> = listOf(),
+  pgInputMap: File? = null
 ) : List<String> {
-  val pgList = pgConf.flatMap({ listOf("--pg-conf", "$it") })
-  val libList = lib.flatMap({ listOf("--lib", "$it") })
-  val cpList = classpath.flatMap({ listOf("--classpath", "$it") })
-  val exclList = if (excludingDepsVariant) listOf("--excldeps-variant") else listOf()
-  return listOf(
-    "python3",
-    "${getRoot().resolve("tools").resolve("create_r8lib.py")}",
-    "--r8compiler",
-    "${r8Compiler}",
-    "--r8jar",
-    "${input}",
-    "--output",
-    "${output}",
-  ) + exclList + pgList + libList + cpList
+  return buildList {
+    add("python3")
+    add("${getRoot().resolve("tools").resolve("create_r8lib.py")}")
+    add("--r8compiler")
+    add("${r8Compiler}")
+    add("--r8jar")
+    add("${input}")
+    add("--output")
+    add("${output}")
+    pgConf.forEach { add("--pg-conf"); add("$it") }
+    lib.forEach { add("--lib"); add("$it") }
+    classpath.forEach { add("--classpath"); add("$it") }
+    if (excludingDepsVariant) {
+      add("--excldeps-variant")
+    }
+    if (debugVariant) {
+      add("--debug-variant")
+    }
+    if (pgInputMap != null) {
+      add("--pg-map")
+      add("$pgInputMap")
+    }
+  }
 }
 
 object JvmCompatibility {
@@ -379,10 +373,34 @@
     "ddmlib",
     Paths.get("third_party", "ddmlib").toFile(),
     Paths.get("third_party", "ddmlib.tar.gz.sha1").toFile())
+  val examples = ThirdPartyDependency(
+    "examples",
+    Paths.get("third_party", "examples").toFile(),
+    Paths.get("third_party", "examples.tar.gz.sha1").toFile())
+  val examplesAndroidN = ThirdPartyDependency(
+    "examplesAndroidN",
+    Paths.get("third_party", "examplesAndroidN").toFile(),
+    Paths.get("third_party", "examplesAndroidN.tar.gz.sha1").toFile())
+  val examplesAndroidO = ThirdPartyDependency(
+    "examplesAndroidO",
+    Paths.get("third_party", "examplesAndroidO").toFile(),
+    Paths.get("third_party", "examplesAndroidO.tar.gz.sha1").toFile())
+  val examplesAndroidOGenerated = ThirdPartyDependency(
+    "examplesAndroidOGenerated",
+    Paths.get("third_party", "examplesAndroidOGenerated").toFile(),
+    Paths.get("third_party", "examplesAndroidOGenerated.tar.gz.sha1").toFile())
   val examplesAndroidOLegacy = ThirdPartyDependency(
     "examplesAndroidOLegacy",
     Paths.get("third_party", "examplesAndroidOLegacy").toFile(),
     Paths.get("third_party", "examplesAndroidOLegacy.tar.gz.sha1").toFile())
+  val examplesAndroidP = ThirdPartyDependency(
+    "examplesAndroidP",
+    Paths.get("third_party", "examplesAndroidP").toFile(),
+    Paths.get("third_party", "examplesAndroidP.tar.gz.sha1").toFile())
+  val examplesAndroidPGenerated = ThirdPartyDependency(
+    "examplesAndroidPGenerated",
+    Paths.get("third_party", "examplesAndroidPGenerated").toFile(),
+    Paths.get("third_party", "examplesAndroidPGenerated.tar.gz.sha1").toFile())
   val desugarJdkLibs = ThirdPartyDependency(
     "desugar-jdk-libs",
     Paths.get("third_party", "openjdk", "desugar_jdk_libs").toFile(),
@@ -402,6 +420,10 @@
     "gson",
     Paths.get("third_party", "gson", "gson-2.10.1").toFile(),
     Paths.get("third_party", "gson", "gson-2.10.1.tar.gz.sha1").toFile())
+  val guavaJre = ThirdPartyDependency(
+    "guava-jre",
+    Paths.get("third_party", "guava", "guava-32.1.2-jre").toFile(),
+    Paths.get("third_party", "guava", "guava-32.1.2-jre.tar.gz.sha1").toFile())
   val desugarJdkLibs11 = ThirdPartyDependency(
     "desugar-jdk-libs-11",
     Paths.get("third_party", "openjdk", "desugar_jdk_libs_11").toFile(),
@@ -434,6 +456,10 @@
     Paths.get("third_party", "jdwp-tests").toFile(),
     Paths.get("third_party", "jdwp-tests.tar.gz.sha1").toFile())
   val kotlinCompilers = getThirdPartyKotlinCompilers()
+  val kotlinR8TestResources = ThirdPartyDependency(
+    "kotlinR8TestResources",
+    Paths.get("third_party", "kotlinR8TestResources").toFile(),
+    Paths.get("third_party", "kotlinR8TestResources.tar.gz.sha1").toFile())
   val multidex = ThirdPartyDependency(
     "multidex",
     Paths.get("third_party", "multidex").toFile(),
@@ -629,47 +655,23 @@
       DependencyType.X20)}
 }
 
-val testRuntimeDependencies = (listOf(
-  ThirdPartyDeps.aapt2,
-  ThirdPartyDeps.artTests,
-  ThirdPartyDeps.artTestsLegacy,
-  ThirdPartyDeps.compilerApi,
-  ThirdPartyDeps.coreLambdaStubs,
-  ThirdPartyDeps.customConversion,
-  ThirdPartyDeps.dagger,
-  ThirdPartyDeps.desugarJdkLibs,
-  ThirdPartyDeps.desugarJdkLibsLegacy,
-  ThirdPartyDeps.desugarJdkLibs11,
-  ThirdPartyDeps.examplesAndroidOLegacy,
-  ThirdPartyDeps.gson,
-  ThirdPartyDeps.jacoco,
-  ThirdPartyDeps.java8Runtime,
-  ThirdPartyDeps.jdk11Test,
-  ThirdPartyDeps.jsr223,
-  ThirdPartyDeps.multidex,
-  ThirdPartyDeps.r8,
-  ThirdPartyDeps.r8Mappings,
-  ThirdPartyDeps.r8v2_0_74,
-  ThirdPartyDeps.r8v3_2_54,
-  ThirdPartyDeps.retraceBenchmark,
-  ThirdPartyDeps.retraceBinaryCompatibility,
-  ThirdPartyDeps.rhino,
-  ThirdPartyDeps.rhinoAndroid,
-  ThirdPartyDeps.smali,
-  ThirdPartyDeps.tivi)
-    + ThirdPartyDeps.androidJars
-    + ThirdPartyDeps.androidVMs
-    + ThirdPartyDeps.desugarLibraryReleases
-    + ThirdPartyDeps.jdks
-    + ThirdPartyDeps.kotlinCompilers
-    + ThirdPartyDeps.proguards)
+private fun Project.allDependencies() : List<ThirdPartyDependency> {
+  val allDeps = mutableListOf<ThirdPartyDependency>()
+  ThirdPartyDeps::class.declaredMemberProperties.forEach {
+    val value = it.get(ThirdPartyDeps)
+    if (value is List<*>) {
+      allDeps.addAll(value as List<ThirdPartyDependency>)
+    } else {
+      allDeps.add(value as ThirdPartyDependency)
+    }
+  }
+  return allDeps
+}
 
-val testRuntimeInternalDependencies = (listOf(
-  ThirdPartyDeps.clank,
-  ThirdPartyDeps.framework,
-  ThirdPartyDeps.nest,
-  ThirdPartyDeps.proto,
-  ThirdPartyDeps.protobufLite,
-  ThirdPartyDeps.retraceInternal)
-  + ThirdPartyDeps.internalIssues
-  + ThirdPartyDeps.gmscoreVersions)
\ No newline at end of file
+fun Project.allPublicDependencies() : List<ThirdPartyDependency> {
+  return allDependencies().filter { x -> x.type == DependencyType.GOOGLE_STORAGE }
+}
+
+fun Project.allInternalDependencies() : List<ThirdPartyDependency> {
+  return allDependencies().filter { x -> x.type == DependencyType.X20 }
+}
diff --git a/d8_r8/commonBuildSrc/src/main/kotlin/DownloadAllDependenciesTask.kt b/d8_r8/commonBuildSrc/src/main/kotlin/DownloadAllDependenciesTask.kt
new file mode 100644
index 0000000..92c1af2
--- /dev/null
+++ b/d8_r8/commonBuildSrc/src/main/kotlin/DownloadAllDependenciesTask.kt
@@ -0,0 +1,158 @@
+// 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.
+
+import java.io.BufferedReader
+import java.io.File
+import java.io.IOException
+import java.io.InputStreamReader
+import java.nio.charset.StandardCharsets
+import java.util.Arrays
+import java.util.stream.Collectors
+import javax.inject.Inject
+import org.gradle.api.DefaultTask
+import org.gradle.api.file.RegularFileProperty
+import org.gradle.api.provider.Property
+import org.gradle.api.tasks.InputFiles
+import org.gradle.api.tasks.OutputDirectories
+import org.gradle.api.tasks.TaskAction
+import org.gradle.internal.os.OperatingSystem
+import org.gradle.workers.WorkAction
+import org.gradle.workers.WorkParameters
+import org.gradle.workers.WorkerExecutor
+
+abstract class DownloadAllDependenciesTask : DefaultTask() {
+
+  private var _root: File? = null
+  private var _thirdPartyDeps: List<ThirdPartyDependency>? = null;
+
+  @InputFiles
+  fun getInputFile(): List<File> {
+    return _thirdPartyDeps!!.map { _root!!.resolve(it.sha1File) }
+  }
+
+  @OutputDirectories
+  fun getOutputDir(): List<File> {
+    return _thirdPartyDeps!!.map { _root!!.resolve(it.path) }
+  }
+
+  @Inject
+  protected abstract fun getWorkerExecutor(): WorkerExecutor?
+
+  fun setDependencies(root: File, thirdPartyDeps: List<ThirdPartyDependency>) {
+    this._root = root
+    this._thirdPartyDeps = thirdPartyDeps;
+  }
+
+  @TaskAction
+  fun execute() {
+    val noIsolation = getWorkerExecutor()!!.noIsolation()
+    _thirdPartyDeps?.forEach {
+      val root = _root!!
+      val sha1File = root.resolve(it.sha1File)
+      val tarGzFile = sha1File.resolveSibling(sha1File.name.replace(".sha1", ""))
+      val outputDir = root.resolve(it.path)
+      if (!sha1File.exists()) {
+        throw RuntimeException("Missing sha1 file: $sha1File")
+      }
+      if (shouldExecute(outputDir, tarGzFile, sha1File)) {
+        println("Downloading ${it}")
+        noIsolation.submit(RunDownload::class.java) {
+          type.set(it.type)
+          this.sha1File.set(sha1File)
+          this.outputDir.set(outputDir)
+          this.tarGzFile.set(tarGzFile)
+          this.root.set(root)
+        }
+      }
+    }
+  }
+
+  interface RunDownloadParameters : WorkParameters {
+    val type : Property<DependencyType>
+    val sha1File : RegularFileProperty
+    val outputDir : RegularFileProperty
+    val tarGzFile : RegularFileProperty
+    val root : RegularFileProperty
+  }
+
+  abstract class RunDownload : WorkAction<RunDownloadParameters> {
+    override fun execute() {
+      val sha1File = parameters.sha1File.asFile.get()
+      val outputDir = parameters.outputDir.asFile.get()
+      val tarGzFile = parameters.tarGzFile.asFile.get()
+      if (!shouldExecute(outputDir, tarGzFile, sha1File)) {
+        return;
+      }
+      if (outputDir.exists() && outputDir.isDirectory) {
+        outputDir.delete()
+      }
+      when (parameters.type.get()) {
+        DependencyType.GOOGLE_STORAGE -> {
+          downloadFromGoogleStorage(parameters, sha1File)
+        }
+        DependencyType.X20 -> {
+          downloadFromX20(parameters, sha1File)
+        }
+      }
+    }
+
+    @Throws(IOException::class, InterruptedException::class)
+    private fun downloadFromGoogleStorage(parameters: RunDownloadParameters, sha1File: File) {
+      val args = Arrays.asList("-n", "-b", "r8-deps", "-s", "-u", sha1File.toString())
+      if (OperatingSystem.current().isWindows) {
+        val command: MutableList<String> = ArrayList()
+        command.add("download_from_google_storage.bat")
+        command.addAll(args)
+        runProcess(parameters, ProcessBuilder().command(command))
+      } else {
+        runProcess(
+          parameters,
+          ProcessBuilder()
+            .command("bash",
+                     "-c",
+                     "download_from_google_storage " + java.lang.String.join(" ", args)))
+      }
+    }
+
+    @Throws(IOException::class, InterruptedException::class)
+    private fun downloadFromX20(parameters: RunDownloadParameters, sha1File: File) {
+      if (OperatingSystem.current().isWindows) {
+        throw RuntimeException("Downloading from x20 unsupported on windows")
+      }
+      runProcess(parameters,
+        ProcessBuilder()
+          .command("bash", "-c", "tools/download_from_x20.py $sha1File"))
+    }
+
+    @Throws(IOException::class, InterruptedException::class)
+    private fun runProcess(parameters: RunDownloadParameters, builder: ProcessBuilder) {
+      builder.directory(parameters.root.asFile.get())
+      val command = java.lang.String.join(" ", builder.command())
+      val p = builder.start()
+      val exit = p.waitFor()
+      if (exit != 0) {
+        throw IOException("Process failed for $command\n"
+            + BufferedReader(
+            InputStreamReader(p.errorStream, StandardCharsets.UTF_8))
+            .lines()
+            .collect(Collectors.joining("\n")))
+      }
+    }
+  }
+
+  companion object {
+    fun shouldExecute(outputDir: File, tarGzFile: File, sha1File: File) : Boolean {
+      // First run will write the tar.gz file, causing the second run to still be out-of-date.
+      // Check if the modification time of the tar is newer than the sha in which case we are done.
+      if (outputDir.exists()
+        && outputDir.isDirectory
+        && outputDir.list()!!.isNotEmpty()
+        && tarGzFile.exists()
+        && sha1File.lastModified() <= tarGzFile.lastModified()) {
+        return false
+      }
+      return true
+    }
+  }
+}
\ No newline at end of file
diff --git a/d8_r8/commonBuildSrc/src/main/kotlin/DownloadDependencyTask.kt b/d8_r8/commonBuildSrc/src/main/kotlin/DownloadDependencyTask.kt
deleted file mode 100644
index 370bcad..0000000
--- a/d8_r8/commonBuildSrc/src/main/kotlin/DownloadDependencyTask.kt
+++ /dev/null
@@ -1,201 +0,0 @@
-// 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.
-
-import DependenciesPlugin.Companion.computeRoot
-import java.io.BufferedReader
-import java.io.File
-import java.io.IOException
-import java.io.InputStreamReader
-import java.io.RandomAccessFile
-import java.lang.Thread.sleep
-import java.nio.channels.FileChannel
-import java.nio.channels.FileLock
-import java.nio.channels.OverlappingFileLockException
-import java.nio.charset.StandardCharsets
-import java.util.Arrays
-import java.util.stream.Collectors
-import javax.inject.Inject
-import org.gradle.api.DefaultTask
-import org.gradle.api.file.RegularFileProperty
-import org.gradle.api.provider.Property
-import org.gradle.api.tasks.InputFile
-import org.gradle.api.tasks.OutputDirectory
-import org.gradle.api.tasks.TaskAction
-import org.gradle.api.tasks.options.Option
-import org.gradle.internal.os.OperatingSystem
-import org.gradle.workers.WorkAction
-import org.gradle.workers.WorkParameters
-import org.gradle.workers.WorkerExecutor
-
-abstract class DownloadDependencyTask : DefaultTask() {
-
-  private var dependencyType: DependencyType = DependencyType.GOOGLE_STORAGE
-  private var _outputDir: File? = null
-  private var _tarGzFile: File? = null
-  private var _sha1File: File? = null
-  private var _root: File? = null
-
-  @InputFile
-  fun getInputFile(): File? {
-    return _sha1File
-  }
-
-  @OutputDirectory
-  fun getOutputDir(): File? {
-    return _outputDir
-  }
-
-  @Inject
-  protected abstract fun getWorkerExecutor(): WorkerExecutor?
-
-  @Option(
-    option = "dependency",
-    description = "Sets the dependency information for a cloud stored file")
-  fun setDependency(sha1File: File, outputDir: File, dependencyType: DependencyType, root: File) {
-    _outputDir = outputDir
-    _sha1File = sha1File
-    _tarGzFile = sha1File.resolveSibling(sha1File.name.replace(".sha1", ""))
-    _root = root
-    this.dependencyType = dependencyType
-  }
-
-  @TaskAction
-  fun execute() {
-    val sha1File = _sha1File!!
-    val outputDir = _outputDir!!
-    val tarGzFile = _tarGzFile!!
-    if (!sha1File.exists()) {
-      throw RuntimeException("Missing sha1 file: $sha1File")
-    }
-    if (!shouldExecute(outputDir, tarGzFile, sha1File)) {
-      return
-    }
-    // Create a lock to ensure sequential a single downloader per third party dependency.
-    val lockFile = sha1File.parentFile.resolve(sha1File.name + ".download_deps_lock")
-    if (!lockFile.exists()) {
-      lockFile.createNewFile()
-    }
-    getWorkerExecutor()!!
-      .noIsolation()
-      .submit(RunDownload::class.java) {
-        type.set(dependencyType)
-        this.sha1File.set(sha1File)
-        this.outputDir.set(outputDir)
-        this.tarGzFile.set(tarGzFile)
-        this.lockFile.set(lockFile)
-        this.root.set(_root!!)
-      }
-  }
-
-  interface RunDownloadParameters : WorkParameters {
-    val type : Property<DependencyType>
-    val sha1File : RegularFileProperty
-    val outputDir : RegularFileProperty
-    val tarGzFile : RegularFileProperty
-    val lockFile : RegularFileProperty
-    val root : RegularFileProperty
-  }
-
-  abstract class RunDownload : WorkAction<RunDownloadParameters> {
-    override fun execute() {
-      var lock : FileLock? = null
-      try {
-        val sha1File = parameters.sha1File.asFile.get()
-        val outputDir = parameters.outputDir.asFile.get()
-        val tarGzFile = parameters.tarGzFile.asFile.get()
-        if (!shouldExecute(outputDir, tarGzFile, sha1File)) {
-          return;
-        }
-        val lockFile = parameters.lockFile.asFile.get()
-        val channel: FileChannel = RandomAccessFile(lockFile, "rw").getChannel()
-        // Block until we have the lock.
-        var couldTakeLock = false
-        while (!couldTakeLock) {
-          try {
-            lock = channel.lock()
-            couldTakeLock = true;
-          } catch (ignored: OverlappingFileLockException) {
-            sleep(50);
-          }
-        }
-        if (!shouldExecute(outputDir, tarGzFile, sha1File)) {
-          return;
-        }
-        if (outputDir.exists() && outputDir.isDirectory) {
-          outputDir.delete()
-        }
-        when (parameters.type.get()) {
-          DependencyType.GOOGLE_STORAGE -> {
-            downloadFromGoogleStorage(parameters, sha1File)
-          }
-          DependencyType.X20 -> {
-            downloadFromX20(parameters, sha1File)
-          }
-        }
-      } catch (e: Exception) {
-        throw RuntimeException(e)
-      } finally {
-        lock?.release()
-      }
-    }
-
-    @Throws(IOException::class, InterruptedException::class)
-    private fun downloadFromGoogleStorage(parameters: RunDownloadParameters, sha1File: File) {
-      val args = Arrays.asList("-n", "-b", "r8-deps", "-s", "-u", sha1File.toString())
-      if (OperatingSystem.current().isWindows) {
-        val command: MutableList<String> = ArrayList()
-        command.add("download_from_google_storage.bat")
-        command.addAll(args)
-        runProcess(parameters, ProcessBuilder().command(command))
-      } else {
-        runProcess(
-          parameters,
-          ProcessBuilder()
-            .command("bash",
-                     "-c",
-                     "download_from_google_storage " + java.lang.String.join(" ", args)))
-      }
-    }
-
-    @Throws(IOException::class, InterruptedException::class)
-    private fun downloadFromX20(parameters: RunDownloadParameters, sha1File: File) {
-      if (OperatingSystem.current().isWindows) {
-        throw RuntimeException("Downloading from x20 unsupported on windows")
-      }
-      runProcess(parameters,
-        ProcessBuilder()
-          .command("bash", "-c", "tools/download_from_x20.py $sha1File"))
-    }
-
-    @Throws(IOException::class, InterruptedException::class)
-    private fun runProcess(parameters: RunDownloadParameters, builder: ProcessBuilder) {
-      builder.directory(parameters.root.asFile.get())
-      val command = java.lang.String.join(" ", builder.command())
-      val p = builder.start()
-      val exit = p.waitFor()
-      if (exit != 0) {
-        throw IOException("Process failed for $command\n"
-            + BufferedReader(
-            InputStreamReader(p.errorStream, StandardCharsets.UTF_8))
-            .lines()
-            .collect(Collectors.joining("\n")))
-      }
-    }
-  }
-
-  companion object {
-    fun shouldExecute(outputDir: File, tarGzFile: File, sha1File: File) : Boolean {
-      // First run will write the tar.gz file, causing the second run to still be out-of-date.
-      // Check if the modification time of the tar is newer than the sha in which case we are done.
-      if (outputDir.exists()
-        && outputDir.isDirectory
-        && outputDir.list().isNotEmpty()
-        && tarGzFile.exists()
-        && sha1File.lastModified() <= tarGzFile.lastModified()) {
-        return false
-      }
-      return true
-    }
-  }
-}
\ No newline at end of file
diff --git a/d8_r8/commonBuildSrc/src/main/kotlin/TestConfigurationHelper.kt b/d8_r8/commonBuildSrc/src/main/kotlin/TestConfigurationHelper.kt
index 766bcf8..c63476c 100644
--- a/d8_r8/commonBuildSrc/src/main/kotlin/TestConfigurationHelper.kt
+++ b/d8_r8/commonBuildSrc/src/main/kotlin/TestConfigurationHelper.kt
@@ -48,7 +48,11 @@
 
     fun setupTestTask(test: Test, isR8Lib: Boolean = false, r8Jar: File? = null) {
       val project = test.project
-      test.environment("USE_NEW_GRADLE_SETUP", "true")
+      test.systemProperty("USE_NEW_GRADLE_SETUP", "true")
+      if (project.hasProperty("testfilter")) {
+        val testFilter = project.property("testfilter").toString()
+        test.filter.setIncludePatterns(*(testFilter.split("|").toTypedArray()))
+      }
       if (project.hasProperty("kotlin_compiler_dev")) {
         test.systemProperty("com.android.tools.r8.kotlincompilerdev", "1")
       }
diff --git a/d8_r8/commonBuildSrc/src/main/kotlin/TestingState.kt b/d8_r8/commonBuildSrc/src/main/kotlin/TestingState.kt
index 2ef455f..1b89075 100644
--- a/d8_r8/commonBuildSrc/src/main/kotlin/TestingState.kt
+++ b/d8_r8/commonBuildSrc/src/main/kotlin/TestingState.kt
@@ -8,8 +8,9 @@
 import java.io.PrintStream
 import java.net.URLEncoder
 import java.nio.file.Path
-import java.util.concurrent.TimeUnit
 import org.gradle.api.Project
+import org.gradle.api.logging.Logger
+import org.gradle.api.tasks.Exec
 import org.gradle.api.tasks.testing.Test
 import org.gradle.api.tasks.testing.TestDescriptor
 import org.gradle.api.tasks.testing.TestListener
@@ -17,6 +18,7 @@
 import org.gradle.api.tasks.testing.TestOutputListener
 import org.gradle.api.tasks.testing.TestResult
 import org.gradle.api.tasks.testing.TestResult.ResultType
+import org.gradle.kotlin.dsl.register
 
 // Utility to install tracking of test results in status files.
 class TestingState {
@@ -29,7 +31,7 @@
     enum class Mode { ALL, OUTSTANDING, FAILING, PAST_FAILING }
 
     // These are the files that are allowed for tracking test status.
-    enum class StatusFile { SUCCESS, FAILURE, PAST_FAILURE }
+    enum class StatusType { SUCCESS, FAILURE, PAST_FAILURE }
 
     fun getRerunMode(project: Project) : Mode? {
       val prop = project.findProperty(MODE_PROPERTY) ?: return null
@@ -54,30 +56,57 @@
       val index = indexDir.resolve("index.html")
       val resuming = reportDir.exists()
       if (resuming) {
-        applyTestFilters(testingStateMode, task, reportDir)
+        applyTestFilters(testingStateMode, task, reportDir, indexDir, projectName)
       }
       addTestHandler(task, projectName, index, reportDir)
     }
 
-    private fun applyTestFilters(mode: Mode, task: Test, reportDir: File) {
+    private fun applyTestFilters(
+      mode: Mode,
+      task: Test,
+      reportDir: File,
+      indexDir: File,
+      projectName: String,
+    ) {
       if (mode == Mode.ALL) {
         // Running without filters will (re)run all tests.
         return
       }
-      if (mode == Mode.OUTSTANDING) {
-        task.logger.lifecycle(
-          "Note: the building of an exclude list often times out."
-            + "You may need to simply rerun all tests.")
-        forEachTestReportStatusMatching(task, reportDir, StatusFile.SUCCESS, { clazz, name ->
-          task.filter.excludeTestsMatching("$clazz.$name")
-        })
-        return
+      val statusType = getStatusTypeForMode(mode)
+      val statusOutputFile = indexDir.resolve("${projectName}.${statusType.name}.txt")
+      val findStatusTask = task.project.tasks.register<Exec>("${projectName}-find-status-files")
+      {
+        inputs.dir(reportDir)
+        outputs.file(statusOutputFile)
+        workingDir(reportDir)
+        commandLine(
+          "find", ".", "-name", statusType.name
+        )
+        doFirst {
+          standardOutput = statusOutputFile.outputStream()
+        }
       }
-      assert(mode == Mode.FAILING || mode == Mode.PAST_FAILING)
-      val result = if (mode == Mode.FAILING) StatusFile.FAILURE else StatusFile.PAST_FAILURE
-      forEachTestReportStatusMatching(task, reportDir, result, { clazz, name ->
-        task.filter.includeTestsMatching("$clazz.$name")
-      })
+      task.dependsOn(findStatusTask)
+      task.doFirst {
+        if (mode == Mode.OUTSTANDING) {
+          forEachTestReportStatusMatching(
+            statusType,
+            findStatusTask.get().outputs.files.singleFile,
+            task.logger,
+            { clazz, name -> task.filter.excludeTestsMatching("${clazz}.${name}") })
+        } else {
+          val hasMatch = forEachTestReportStatusMatching(
+            statusType,
+            findStatusTask.get().outputs.files.singleFile,
+            task.logger,
+            { clazz, name -> task.filter.includeTestsMatching("${clazz}.${name}") })
+          if (!hasMatch) {
+            // Add a filter that does not match to ensure the test run is not "without filters"
+            // which would run all tests.
+            task.filter.includeTestsMatching("NON_MATCHING_TEST_FILTER")
+          }
+        }
+      }
     }
 
     private fun addTestHandler(
@@ -181,11 +210,20 @@
       })
     }
 
-    private fun getStatusFile(result: ResultType) : StatusFile {
+    private fun getStatusTypeForMode(mode: Mode) : StatusType {
+      return when (mode) {
+        Mode.OUTSTANDING -> StatusType.SUCCESS
+        Mode.FAILING -> StatusType.FAILURE
+        Mode.PAST_FAILING -> StatusType.PAST_FAILURE
+        Mode.ALL -> throw RuntimeException("Unexpected mode 'all' in status determination")
+      }
+    }
+
+    private fun getStatusTypeForResult(result: ResultType) : StatusType {
       return when (result) {
-        ResultType.FAILURE -> StatusFile.FAILURE
-        ResultType.SUCCESS -> StatusFile.SUCCESS
-        ResultType.SKIPPED -> StatusFile.SUCCESS
+        ResultType.FAILURE -> StatusType.FAILURE
+        ResultType.SUCCESS -> StatusType.SUCCESS
+        ResultType.SKIPPED -> StatusType.SUCCESS
       }
     }
 
@@ -287,18 +325,18 @@
       reportDir: File,
       desc: TestDescriptor,
       result: ResultType) {
-      val statusFile = getStatusFile(result)
+      val statusFile = getStatusTypeForResult(result)
       withTestResultEntryWriter(reportDir, desc, statusFile.name, false, {
         it.append(statusFile.name)
       })
-      if (statusFile == StatusFile.FAILURE) {
-        getTestResultEntryOutputFile(reportDir, desc, StatusFile.SUCCESS.name).delete()
-        val pastFailure = StatusFile.PAST_FAILURE.name
+      if (statusFile == StatusType.FAILURE) {
+        getTestResultEntryOutputFile(reportDir, desc, StatusType.SUCCESS.name).delete()
+        val pastFailure = StatusType.PAST_FAILURE.name
         withTestResultEntryWriter(reportDir, desc, pastFailure, false, {
           it.append(pastFailure)
         })
       } else {
-        getTestResultEntryOutputFile(reportDir, desc, StatusFile.FAILURE.name).delete()
+        getTestResultEntryOutputFile(reportDir, desc, StatusType.FAILURE.name).delete()
       }
     }
 
@@ -313,25 +351,13 @@
       FileWriter(file, append).use(fn)
     }
 
-    fun forEachTestReportStatusMatching(
-      test: Test,
-      reportDir: File,
-      statusFile: StatusFile,
-      onTest: (String, String) -> Unit
-    ): Boolean {
-      val fileName = statusFile.name
-      val logger = test.logger
-      val proc = ProcessBuilder("find", ".", "-name", fileName)
-        .directory(reportDir)
-        .redirectOutput(ProcessBuilder.Redirect.PIPE)
-        .start()
-      val result = proc.waitFor(10, TimeUnit.SECONDS)
-      if (!result) {
-        throw RuntimeException("Unexpected failure to find reports within time limit")
-      }
-      var hadMatch = false
-      for (rawLine in proc.inputStream.bufferedReader().lineSequence()) {
-        // Lines are of the form: ./<class>/<name>/FAILURE
+    private fun forEachTestReportStatusMatching(
+      type: StatusType, file: File, logger: Logger, onTest: (String, String) -> Unit
+    ) : Boolean {
+      val fileName = type.name
+      var hasMatch = false
+      for (rawLine in file.bufferedReader().lineSequence()) {
+        // Lines are of the form: ./<class>/<name>/<mode>
         try {
           val trimmed = rawLine.trim()
           val line = trimmed.substring(2)
@@ -339,12 +365,12 @@
           val clazz = line.substring(0, sep)
           val name = line.substring(sep + 1, line.length - fileName.length - 1)
           onTest(clazz, name)
-          hadMatch = true
+          hasMatch = true
         } catch (e: Exception) {
           logger.lifecycle("WARNING: failed attempt to read test description from: '${rawLine}'")
         }
       }
-      return hadMatch
+      return hasMatch
     }
   }
 }
\ No newline at end of file
diff --git a/d8_r8/keepanno/build.gradle.kts b/d8_r8/keepanno/build.gradle.kts
index d04408d..56d1ea0 100644
--- a/d8_r8/keepanno/build.gradle.kts
+++ b/d8_r8/keepanno/build.gradle.kts
@@ -13,6 +13,7 @@
   }
   sourceCompatibility = JvmCompatibility.sourceCompatibility
   targetCompatibility = JvmCompatibility.targetCompatibility
+  withSourcesJar()
 }
 
 dependencies {
@@ -20,12 +21,11 @@
   compileOnly(Deps.guava)
 }
 
-val thirdPartyCompileDependenciesTask = ensureThirdPartyDependencies(
-  "compileDeps",
-  listOf(Jdk.JDK_11.getThirdPartyDependency()))
-
 tasks {
-  withType<JavaCompile> {
-    dependsOn(thirdPartyCompileDependenciesTask)
+  val keepAnnoJar by registering(Jar::class) {
+    dependsOn(gradle.includedBuild("shared").task(":downloadDeps"))
+    from(sourceSets.main.get().output)
+    destinationDirectory.set(getRoot().resolveAll("build", "libs"))
+    archiveFileName.set("keepanno-annotations.jar")
   }
-}
\ No newline at end of file
+}
diff --git a/d8_r8/keepanno/settings.gradle.kts b/d8_r8/keepanno/settings.gradle.kts
index 3238e39..8159946 100644
--- a/d8_r8/keepanno/settings.gradle.kts
+++ b/d8_r8/keepanno/settings.gradle.kts
@@ -25,3 +25,5 @@
 }
 
 rootProject.name = "keepanno"
+val root = rootProject.projectDir.parentFile
+includeBuild(root.resolve("shared"))
diff --git a/d8_r8/library_desugar/build.gradle.kts b/d8_r8/library_desugar/build.gradle.kts
index d7f32c6..4094e64 100644
--- a/d8_r8/library_desugar/build.gradle.kts
+++ b/d8_r8/library_desugar/build.gradle.kts
@@ -10,7 +10,7 @@
 java {
   sourceSets.main.configure {
     java.srcDir(getRoot().resolveAll("src", "library_desugar", "java"))
-    output.resourcesDir = getRoot().resolveAll("build", "classes", "library_desugar_conversions")
+    output.setResourcesDir(getRoot().resolveAll("build", "classes", "library_desugar_conversions"))
   }
   sourceCompatibility = JavaVersion.VERSION_1_8
   targetCompatibility = JavaVersion.VERSION_1_8
@@ -18,13 +18,3 @@
 
 dependencies {
 }
-
-val thirdPartyCompileDependenciesTask = ensureThirdPartyDependencies(
-  "compileDeps",
-  listOf(Jdk.JDK_11.getThirdPartyDependency()))
-
-tasks {
-  withType<JavaCompile> {
-    dependsOn(thirdPartyCompileDependenciesTask)
-  }
-}
diff --git a/d8_r8/main/build.gradle.kts b/d8_r8/main/build.gradle.kts
index bec7b28..ba2c1a9 100644
--- a/d8_r8/main/build.gradle.kts
+++ b/d8_r8/main/build.gradle.kts
@@ -19,6 +19,7 @@
   }
   sourceCompatibility = JvmCompatibility.sourceCompatibility
   targetCompatibility = JvmCompatibility.targetCompatibility
+  withSourcesJar()
 }
 
 dependencies {
@@ -34,14 +35,6 @@
   errorprone(Deps.errorprone)
 }
 
-val thirdPartyCompileDependenciesTask = ensureThirdPartyDependencies(
-  "compileDeps",
-  listOf(Jdk.JDK_11.getThirdPartyDependency()))
-
-val thirdPartyResourceDependenciesTask = ensureThirdPartyDependencies(
-  "resourceDeps",
-  listOf(ThirdPartyDeps.apiDatabase))
-
 val keepAnnoJarTask = projectTask("keepanno", "jar")
 val resourceShrinkerJarTask = projectTask("resourceshrinker", "jar")
 val resourceShrinkerDepsTask = projectTask("resourceshrinker", "depsJar")
@@ -65,10 +58,11 @@
   }
 
   withType<ProcessResources> {
-    dependsOn(thirdPartyResourceDependenciesTask)
+    dependsOn(gradle.includedBuild("shared").task(":downloadDeps"))
   }
 
   val consolidatedLicense by registering {
+    dependsOn(gradle.includedBuild("shared").task(":downloadDeps"))
     val root = getRoot()
     val r8License = root.resolve("LICENSE")
     val libraryLicense = root.resolve("LIBRARY-LICENSE")
@@ -78,7 +72,7 @@
       libraryLicenseFiles,
       mainJarDependencies().map(::zipTree))
 
-    val license = rootProject.layout.buildDirectory.file("generatedLicense/LICENSE").get().asFile
+    val license = getRoot().resolveAll("build", "generatedLicense", "LICENSE")
     outputs.files(license)
 
     doLast {
@@ -123,23 +117,26 @@
   }
 
   val swissArmyKnife by registering(Jar::class) {
+    dependsOn(keepAnnoJarTask)
+    dependsOn(resourceShrinkerJarTask)
+    dependsOn(gradle.includedBuild("shared").task(":downloadDeps"))
     from(sourceSets.main.get().output)
+    from(keepAnnoJarTask.outputs.files.map(::zipTree))
+    from(resourceShrinkerJarTask.outputs.files.map(::zipTree))
     from(consolidatedLicense)
     manifest {
       attributes["Main-Class"] = "com.android.tools.r8.SwissArmyKnife"
     }
     exclude("META-INF/*.kotlin_module")
     exclude("**/*.kotlin_metadata")
-    archiveFileName.set("r8-swissarmyknife.jar")
+    destinationDirectory.set(getRoot().resolveAll("build", "libs"))
+    archiveFileName.set("r8-full-exclude-deps.jar")
   }
 
   val depsJar by registering(Jar::class) {
-    dependsOn(keepAnnoJarTask)
-    dependsOn(resourceShrinkerJarTask)
+    dependsOn(gradle.includedBuild("shared").task(":downloadDeps"))
     dependsOn(resourceShrinkerDepsTask)
     from(mainJarDependencies().map(::zipTree))
-    from(keepAnnoJarTask.outputs.files.map(::zipTree))
-    from(resourceShrinkerJarTask.outputs.files.map(::zipTree))
     from(resourceShrinkerDepsTask.outputs.files.map(::zipTree))
     exclude("**/module-info.class")
     exclude("**/*.kotlin_metadata")
@@ -168,7 +165,7 @@
     val swissArmy = swissArmyKnife.get().outputs.getFiles().getSingleFile()
     val deps = depsJar.get().outputs.files.getSingleFile()
     inputs.files(listOf(swissArmy, deps))
-    val output = getRoot().resolveAll("build", "libs", "r8-with-relocated-deps.jar")
+    val output = getRoot().resolveAll("build", "libs", "r8.jar")
     outputs.file(output)
     commandLine = baseCompilerCommandLine(
       swissArmy,
@@ -223,7 +220,7 @@
 }
 
 tasks.withType<JavaCompile> {
-  dependsOn(thirdPartyCompileDependenciesTask)
+  dependsOn(gradle.includedBuild("shared").task(":downloadDeps"))
   println("NOTE: Running with JDK: " + org.gradle.internal.jvm.Jvm.current().javaHome)
 
   // Enable error prone for D8/R8 main sources.
diff --git a/d8_r8/main/settings.gradle.kts b/d8_r8/main/settings.gradle.kts
index 34ab9ed..4e1d975 100644
--- a/d8_r8/main/settings.gradle.kts
+++ b/d8_r8/main/settings.gradle.kts
@@ -27,5 +27,6 @@
 rootProject.name = "r8"
 
 val root = rootProject.projectDir.parentFile
+includeBuild(root.resolve("shared"))
 includeBuild(root.resolve("keepanno"))
 includeBuild(root.resolve("resourceshrinker"))
diff --git a/d8_r8/resourceshrinker/build.gradle.kts b/d8_r8/resourceshrinker/build.gradle.kts
index 60a037b..750f076 100644
--- a/d8_r8/resourceshrinker/build.gradle.kts
+++ b/d8_r8/resourceshrinker/build.gradle.kts
@@ -16,6 +16,7 @@
   }
   sourceCompatibility = JvmCompatibility.sourceCompatibility
   targetCompatibility = JvmCompatibility.targetCompatibility
+  withSourcesJar()
 }
 
 fun jarDependencies() : FileCollection {
@@ -29,14 +30,10 @@
     })
 }
 
-val thirdPartyCompileDependenciesTask = ensureThirdPartyDependencies(
-  "compileDeps",
-  listOf(ThirdPartyDeps.r8))
-
 dependencies {
   compileOnly(Deps.asm)
   compileOnly(Deps.guava)
-  compileOnly(files(getRoot().resolve(ThirdPartyDeps.r8.path).resolve("r8lib_8.2.20-dev.jar")))
+  compileOnly(files(resolve(ThirdPartyDeps.r8, "r8lib_8.2.20-dev.jar")))
   implementation("com.android.tools.build:aapt2-proto:8.2.0-alpha10-10154469")
   implementation("com.google.protobuf:protobuf-java:3.19.3")
   implementation("com.android.tools.layoutlib:layoutlib-api:31.2.0-alpha10")
@@ -46,7 +43,7 @@
 
 tasks {
   withType<KotlinCompile> {
-    dependsOn(thirdPartyCompileDependenciesTask)
+    dependsOn(gradle.includedBuild("shared").task(":downloadDeps"))
     kotlinOptions {
       // We cannot use languageVersion.set(JavaLanguageVersion.of(8)) because gradle cannot figure
       // out that the jdk is 1_8 and will try to download it.
diff --git a/d8_r8/resourceshrinker/settings.gradle.kts b/d8_r8/resourceshrinker/settings.gradle.kts
index 604d9cb..d879107 100644
--- a/d8_r8/resourceshrinker/settings.gradle.kts
+++ b/d8_r8/resourceshrinker/settings.gradle.kts
@@ -25,3 +25,6 @@
 }
 
 rootProject.name = "resourceshrinker"
+
+val root = rootProject.projectDir.parentFile
+includeBuild(root.resolve("shared"))
diff --git a/d8_r8/settings.gradle.kts b/d8_r8/settings.gradle.kts
index c3c86b7..f4ff5e0 100644
--- a/d8_r8/settings.gradle.kts
+++ b/d8_r8/settings.gradle.kts
@@ -4,6 +4,8 @@
 
 // TODO(b/270105162): Move this file out the repository root when old gradle is removed.
 
+import org.gradle.internal.os.OperatingSystem
+
 rootProject.name = "d8-r8"
 
 // Bootstrap building by downloading dependencies.
@@ -29,8 +31,12 @@
       return
   }
 
+  var downloadScript = "download_from_google_storage.py"
+  if (OperatingSystem.current().isWindows()) {
+    downloadScript = "download_from_google_storage.bat"
+  }
   val cmd = listOf(
-    "download_from_google_storage.py",
+    downloadScript,
     "--extract",
     "--bucket",
     dependencies_bucket,
@@ -78,8 +84,7 @@
   }
 }
 
-// This project is temporarily located in d8_r8. When moved to root, the parent
-// folder should just be removed.
+includeBuild(root.resolve("shared"))
 includeBuild(root.resolve("keepanno"))
 includeBuild(root.resolve("resourceshrinker"))
 
diff --git a/d8_r8/shared/build.gradle.kts b/d8_r8/shared/build.gradle.kts
new file mode 100644
index 0000000..fa66c14
--- /dev/null
+++ b/d8_r8/shared/build.gradle.kts
@@ -0,0 +1,19 @@
+// 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.
+
+plugins {
+  `kotlin-dsl`
+  id("dependencies-plugin")
+}
+
+tasks {
+
+  val downloadDeps by registering(DownloadAllDependenciesTask::class) {
+    this.setDependencies(getRoot(), allPublicDependencies())
+  }
+
+  val downloadDepsInternal by registering(DownloadAllDependenciesTask::class) {
+    this.setDependencies(getRoot(), allInternalDependencies())
+  }
+}
\ No newline at end of file
diff --git a/d8_r8/test_modules/tests_java_examples/gradle.properties b/d8_r8/shared/gradle.properties
similarity index 100%
rename from d8_r8/test_modules/tests_java_examples/gradle.properties
rename to d8_r8/shared/gradle.properties
diff --git a/d8_r8/shared/settings.gradle.kts b/d8_r8/shared/settings.gradle.kts
new file mode 100644
index 0000000..0de348f
--- /dev/null
+++ b/d8_r8/shared/settings.gradle.kts
@@ -0,0 +1,27 @@
+// 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.
+
+pluginManagement {
+  repositories {
+    maven {
+      url = uri("file:../../third_party/dependencies")
+    }
+    maven {
+      url = uri("file:../../third_party/dependencies_new")
+    }
+  }
+}
+
+dependencyResolutionManagement {
+  repositories {
+    maven {
+      url = uri("file:../../third_party/dependencies")
+    }
+    maven {
+      url = uri("file:../../third_party/dependencies_new")
+    }
+  }
+}
+
+rootProject.name = "shared"
diff --git a/d8_r8/test/build.gradle.kts b/d8_r8/test/build.gradle.kts
index 6cc61e5..b7fd7b5 100644
--- a/d8_r8/test/build.gradle.kts
+++ b/d8_r8/test/build.gradle.kts
@@ -21,21 +21,16 @@
 dependencies { }
 
 val keepAnnoCompileTask = projectTask("keepanno", "compileJava")
+val keepAnnoSourcesTask = projectTask("keepanno", "sourcesJar")
 val mainDepsJarTask = projectTask("main", "depsJar")
-val r8Jar = projectTask("main", "jar")
+val swissArmyKnifeTask = projectTask("main", "swissArmyKnife")
 val r8WithRelocatedDepsTask = projectTask("main", "r8WithRelocatedDeps")
+val mainSourcesTask = projectTask("main", "sourcesJar")
+val resourceShrinkerSourcesTask = projectTask("resourceshrinker", "sourcesJar")
 val java8TestJarTask = projectTask("tests_java_8", "testJar")
 val java8TestsDepsJarTask = projectTask("tests_java_8", "depsJar")
 val bootstrapTestsDepsJarTask = projectTask("tests_bootstrap", "depsJar")
 
-val thirdPartyRuntimeDependenciesTask = ensureThirdPartyDependencies(
-  "runtimeDeps",
-  testRuntimeDependencies)
-
-val thirdPartyRuntimeInternalDependenciesTask = ensureThirdPartyDependencies(
-  "runtimeInternalDeps",
-  testRuntimeInternalDependencies)
-
 tasks {
   withType<Exec> {
     doFirst {
@@ -91,10 +86,10 @@
     dependsOn(mainDepsJarTask)
     dependsOn(r8WithRelocatedDepsTask)
     val r8Compiler = r8WithRelocatedDepsTask.outputs.files.getSingleFile()
-    val r8Jar = r8Jar.outputs.files.getSingleFile()
+    val r8Jar = swissArmyKnifeTask.outputs.files.getSingleFile()
     val deps = mainDepsJarTask.outputs.files.getSingleFile()
     inputs.files(listOf(r8Compiler, r8Jar, deps))
-    val output = file(Paths.get("build", "libs", "r8lib-exclude-deps.jar"))
+    val output = getRoot().resolveAll("build", "libs", "r8lib-exclude-deps.jar")
     outputs.file(output)
     commandLine = createR8LibCommandLine(
       r8Compiler,
@@ -102,9 +97,31 @@
       output,
       listOf(getRoot().resolveAll("src", "main", "keep.txt")),
       true,
+      false,
       listOf(deps))
   }
 
+  val retraceNoDeps by registering(Exec::class) {
+    dependsOn(r8LibNoDeps)
+    val r8Compiler = r8WithRelocatedDepsTask.outputs.files.getSingleFile()
+    val r8Jar = r8LibNoDeps.get().outputs.files.getSingleFile()
+    val deps = mainDepsJarTask.outputs.files.getSingleFile()
+    inputs.files(listOf(r8Compiler, r8Jar, deps))
+    val inputMap = file(r8Jar.toString() + ".map")
+    val output = getRoot().resolveAll("build", "libs", "r8retrace-exclude-deps.jar")
+    outputs.file(output)
+    commandLine = createR8LibCommandLine(
+      r8Compiler,
+      r8Jar,
+      output,
+      listOf(getRoot().resolveAll("src", "main", "keep_retrace.txt")),
+      true,
+      true,
+      listOf(deps),
+      listOf(),
+      inputMap)
+  }
+
   val generateKeepRules by registering(Exec::class) {
     dependsOn(r8WithRelocatedDepsTask)
     dependsOn(mainDepsJarTask)
@@ -153,9 +170,31 @@
       r8,
       output,
       listOf(keepTxt, generatedKeepRules, keepResourceShrinkerTxt),
+      false,
       false)
   }
 
+  val retraceWithRelocatedDeps by registering(Exec::class) {
+    dependsOn(r8LibWithRelocatedDeps)
+    val r8Compiler = r8WithRelocatedDepsTask.outputs.files.getSingleFile()
+    val r8Jar = r8LibWithRelocatedDeps.get().outputs.files.getSingleFile()
+    val deps = mainDepsJarTask.outputs.files.getSingleFile()
+    inputs.files(listOf(r8Compiler, r8Jar, deps))
+    val inputMap = file(r8Jar.toString() + ".map")
+    val output = getRoot().resolveAll("build", "libs", "r8retrace.jar")
+    outputs.file(output)
+    commandLine = createR8LibCommandLine(
+      r8Compiler,
+      r8Jar,
+      output,
+      listOf(getRoot().resolveAll("src", "main", "keep_retrace.txt")),
+      false,
+      true,
+      listOf(),
+      listOf(),
+      inputMap)
+  }
+
   val resourceshrinkercli by registering(Exec::class) {
     dependsOn(r8WithRelocatedDepsTask)
     val r8 = r8WithRelocatedDepsTask.outputs.files.getSingleFile()
@@ -169,6 +208,7 @@
       r8,
       output,
       listOf(keepTxt, cliKeep),
+      false,
       false)
   }
 
@@ -193,7 +233,6 @@
     dependsOn(allTestsJarRelocated)
     dependsOn(r8WithRelocatedDepsTask)
     dependsOn(allTestWithApplyMappingProguardConfiguration)
-    dependsOn(thirdPartyRuntimeDependenciesTask)
     val r8 = r8WithRelocatedDepsTask.outputs.files.singleFile
     val allTests = allTestsJarRelocated.get().outputs.files.singleFile
     val pgConf = allTestWithApplyMappingProguardConfiguration.get().outputs.files.singleFile
@@ -222,30 +261,6 @@
         "$allTests"))
   }
 
-  test {
-    println("NOTE: Number of processors " + Runtime.getRuntime().availableProcessors())
-    println("NOTE: Max parallel forks " + maxParallelForks)
-    val os = DefaultNativePlatform.getCurrentOperatingSystem()
-    if (os.isMacOsX) {
-      logger.lifecycle(
-        "WARNING: Testing in only partially supported on Mac OS. \n" +
-          "Art only runs on Linux and tests requiring Art runs in a Docker container, which must " +
-          "be present. See tools/docker/README.md for details.")
-    } else if (os.isWindows) {
-      logger.lifecycle(
-        "WARNING: Testing in only partially supported on Windows. Art only runs on Linux and " +
-          "tests requiring Art will be skipped")
-    } else if (!os.isLinux) {
-      logger.log(
-        ERROR,
-        "Testing in not supported on your platform. Testing is only fully supported on " +
-          "Linux and partially supported on Mac OS and Windows. Art does not run on other " +
-          "platforms.")
-    }
-    dependsOn(gradle.includedBuild("tests_java_8").task(":test"))
-    dependsOn(gradle.includedBuild("tests_bootstrap").task(":test"))
-  }
-
   val unzipTests by registering(Copy::class) {
     dependsOn(allTestsJar)
     val outputDir = file("${buildDir}/unpacked/test")
@@ -267,9 +282,9 @@
     dependsOn(r8LibWithRelocatedDeps)
     dependsOn(unzipTests)
     dependsOn(unzipRewrittenTests)
-    dependsOn(thirdPartyRuntimeDependenciesTask)
+    dependsOn(gradle.includedBuild("shared").task(":downloadDeps"))
     if (!project.hasProperty("no_internal")) {
-      dependsOn(thirdPartyRuntimeInternalDependenciesTask)
+      dependsOn(gradle.includedBuild("shared").task(":downloadDepsInternal"))
     }
     val r8LibJar = r8LibWithRelocatedDeps.get().outputs.files.singleFile
     this.configure(isR8Lib = true, r8Jar = r8LibJar)
@@ -281,8 +296,7 @@
       r8LibJar,
       unzipRewrittenTests.get().outputs.files)
     testClassesDirs = unzipRewrittenTests.get().outputs.files
-
-    environment.put("TEST_CLASSES_LOCATIONS", unzipTests.get().outputs.files.singleFile)
+    systemProperty("TEST_DATA_LOCATION", unzipTests.get().outputs.files.singleFile)
     systemProperty("KEEP_ANNO_JAVAC_BUILD_DIR", keepAnnoCompileTask.outputs.files.getAsPath())
     systemProperty("EXAMPLES_JAVA_11_JAVAC_BUILD_DIR",
                    getRoot().resolveAll("build", "test", "examplesJava11", "classes"))
@@ -290,5 +304,27 @@
     // TODO(b/270105162): This should change if running with retrace lib/r8lib.
     systemProperty("RETRACE_RUNTIME_PATH", r8LibJar)
     systemProperty("R8_DEPS", mainDepsJarTask.outputs.files.singleFile)
- }
-}
\ No newline at end of file
+    systemProperty("com.android.tools.r8.artprofilerewritingcompletenesscheck", "true")
+  }
+
+  val sourcesJar by registering(Jar::class) {
+    dependsOn(mainSourcesTask)
+    dependsOn(resourceShrinkerSourcesTask)
+    dependsOn(keepAnnoSourcesTask)
+    from(mainSourcesTask.outputs.files.map(::zipTree))
+    from(resourceShrinkerSourcesTask.outputs.files.map(::zipTree))
+    from(keepAnnoSourcesTask.outputs.files.map(::zipTree))
+    archiveClassifier.set("sources")
+    archiveFileName.set("r8-src.jar")
+    destinationDirectory.set(getRoot().resolveAll("build", "libs"))
+  }
+
+  test {
+    if (project.hasProperty("r8lib")) {
+      dependsOn(r8LibTest)
+    } else {
+      dependsOn(gradle.includedBuild("tests_java_8").task(":test"))
+      dependsOn(gradle.includedBuild("tests_bootstrap").task(":test"))
+    }
+  }
+}
diff --git a/d8_r8/test/settings.gradle.kts b/d8_r8/test/settings.gradle.kts
index 5df668c..375809a 100644
--- a/d8_r8/test/settings.gradle.kts
+++ b/d8_r8/test/settings.gradle.kts
@@ -27,7 +27,9 @@
 rootProject.name = "r8-tests"
 
 val root = rootProject.projectDir.parentFile
+includeBuild(root.resolve("shared"))
 includeBuild(root.resolve("keepanno"))
 includeBuild(root.resolve("main"))
+includeBuild(root.resolve("resourceshrinker"))
 includeBuild(root.resolve("test_modules").resolve("tests_java_8"))
 includeBuild(root.resolve("test_modules").resolve("tests_bootstrap"))
diff --git a/d8_r8/test_modules/tests_bootstrap/build.gradle.kts b/d8_r8/test_modules/tests_bootstrap/build.gradle.kts
index 1a8ff99..bf64d96 100644
--- a/d8_r8/test_modules/tests_bootstrap/build.gradle.kts
+++ b/d8_r8/test_modules/tests_bootstrap/build.gradle.kts
@@ -67,15 +67,11 @@
 
   withType<Test> {
     TestingState.setUpTestingState(this)
-
-    environment.put("USE_NEW_GRADLE_SETUP", "true")
-    environment.put("TEST_CLASSES_LOCATIONS", "$buildDir/classes/java/test")
     dependsOn(mainR8RelocatedTask)
-    systemProperty("R8_WITH_RELOCATED_DEPS", mainR8RelocatedTask.outputs.files.getSingleFile())
-    systemProperty("R8_RUNTIME_PATH", mainR8RelocatedTask.outputs.files.getSingleFile())
-
-    // TODO(b/291198792): Remove this exclusion when desugared library runs correctly.
-    exclude("com/android/tools/r8/bootstrap/HelloWorldCompiledOnArtTest**")
+    systemProperty("TEST_DATA_LOCATION",
+                   layout.buildDirectory.dir("classes/java/test").get().toString())
+    systemProperty("R8_WITH_RELOCATED_DEPS", mainR8RelocatedTask.outputs.files.singleFile)
+    systemProperty("R8_RUNTIME_PATH", mainR8RelocatedTask.outputs.files.singleFile)
   }
 
   val testJar by registering(Jar::class) {
@@ -85,6 +81,10 @@
   }
 
   val depsJar by registering(Jar::class) {
+    dependsOn(gradle.includedBuild("shared").task(":downloadDeps"))
+    if (!project.hasProperty("no_internal")) {
+      dependsOn(gradle.includedBuild("shared").task(":downloadDepsInternal"))
+    }
     from(testDependencies().map(::zipTree))
     duplicatesStrategy = DuplicatesStrategy.EXCLUDE
     archiveFileName.set("deps.jar")
diff --git a/d8_r8/test_modules/tests_bootstrap/settings.gradle.kts b/d8_r8/test_modules/tests_bootstrap/settings.gradle.kts
index fba8852..cb05e4f 100644
--- a/d8_r8/test_modules/tests_bootstrap/settings.gradle.kts
+++ b/d8_r8/test_modules/tests_bootstrap/settings.gradle.kts
@@ -27,8 +27,9 @@
 rootProject.name = "tests_bootstrap"
 
 val root = rootProject.projectDir.parentFile.parentFile
-//
+
 // We need to include src/main as a composite-build otherwise our test-modules
 // will compete with the test to compile the source files.
+includeBuild(root.resolve("shared"))
 includeBuild(root.resolve("main"))
 includeBuild(root.resolve("test_modules").resolve("tests_java_8"))
diff --git a/d8_r8/test_modules/tests_java_10/build.gradle.kts b/d8_r8/test_modules/tests_java_10/build.gradle.kts
index 7d653b1..fa6f761 100644
--- a/d8_r8/test_modules/tests_java_10/build.gradle.kts
+++ b/d8_r8/test_modules/tests_java_10/build.gradle.kts
@@ -26,13 +26,9 @@
 // We just need to register the examples jars for it to be referenced by other modules.
 val buildExampleJars = buildExampleJars("examplesJava10")
 
-val thirdPartyCompileDependenciesTask = ensureThirdPartyDependencies(
-  "compileDeps",
-  listOf(Jdk.JDK_11.getThirdPartyDependency()))
-
 tasks {
   withType<JavaCompile> {
-    dependsOn(thirdPartyCompileDependenciesTask)
+    dependsOn(gradle.includedBuild("shared").task(":downloadDeps"))
     options.setFork(true)
     options.forkOptions.memoryMaximumSize = "3g"
     options.forkOptions.executable = getCompilerPath(Jdk.JDK_11)
diff --git a/d8_r8/test_modules/tests_java_10/settings.gradle.kts b/d8_r8/test_modules/tests_java_10/settings.gradle.kts
index 53e69d0..d7b2f9a 100644
--- a/d8_r8/test_modules/tests_java_10/settings.gradle.kts
+++ b/d8_r8/test_modules/tests_java_10/settings.gradle.kts
@@ -25,3 +25,5 @@
 }
 
 rootProject.name = "tests_java_10"
+val root = rootProject.projectDir.parentFile.parentFile
+includeBuild(root.resolve("shared"))
diff --git a/d8_r8/test_modules/tests_java_11/build.gradle.kts b/d8_r8/test_modules/tests_java_11/build.gradle.kts
index f056220..d8f620f 100644
--- a/d8_r8/test_modules/tests_java_11/build.gradle.kts
+++ b/d8_r8/test_modules/tests_java_11/build.gradle.kts
@@ -26,13 +26,9 @@
 // We just need to register the examples jars for it to be referenced by other modules.
 val buildExampleJars = buildExampleJars("examplesJava11")
 
-val thirdPartyCompileDependenciesTask = ensureThirdPartyDependencies(
-  "compileDeps",
-  listOf(Jdk.JDK_11.getThirdPartyDependency()))
-
 tasks {
   withType<JavaCompile> {
-    dependsOn(thirdPartyCompileDependenciesTask)
+    dependsOn(gradle.includedBuild("shared").task(":downloadDeps"))
     options.setFork(true)
     options.forkOptions.memoryMaximumSize = "3g"
     options.forkOptions.executable = getCompilerPath(Jdk.JDK_11)
diff --git a/d8_r8/test_modules/tests_java_11/settings.gradle.kts b/d8_r8/test_modules/tests_java_11/settings.gradle.kts
index 4dc457a..90fa823 100644
--- a/d8_r8/test_modules/tests_java_11/settings.gradle.kts
+++ b/d8_r8/test_modules/tests_java_11/settings.gradle.kts
@@ -25,3 +25,5 @@
 }
 
 rootProject.name = "tests_java_11"
+val root = rootProject.projectDir.parentFile.parentFile
+includeBuild(root.resolve("shared"))
diff --git a/d8_r8/test_modules/tests_java_17/build.gradle.kts b/d8_r8/test_modules/tests_java_17/build.gradle.kts
index 005cb87..92f1dcd 100644
--- a/d8_r8/test_modules/tests_java_17/build.gradle.kts
+++ b/d8_r8/test_modules/tests_java_17/build.gradle.kts
@@ -26,13 +26,9 @@
 // We just need to register the examples jars for it to be referenced by other modules.
 val buildExampleJars = buildExampleJars("examplesJava17")
 
-val thirdPartyCompileDependenciesTask = ensureThirdPartyDependencies(
-  "compileDeps",
-  listOf(Jdk.JDK_17.getThirdPartyDependency()))
-
 tasks {
   withType<JavaCompile> {
-    dependsOn(thirdPartyCompileDependenciesTask)
+    dependsOn(gradle.includedBuild("shared").task(":downloadDeps"))
     options.setFork(true)
     options.forkOptions.memoryMaximumSize = "3g"
     options.forkOptions.executable = getCompilerPath(Jdk.JDK_17)
diff --git a/d8_r8/test_modules/tests_java_17/settings.gradle.kts b/d8_r8/test_modules/tests_java_17/settings.gradle.kts
index 3312a37..fc53d30 100644
--- a/d8_r8/test_modules/tests_java_17/settings.gradle.kts
+++ b/d8_r8/test_modules/tests_java_17/settings.gradle.kts
@@ -25,3 +25,5 @@
 }
 
 rootProject.name = "tests_java_17"
+val root = rootProject.projectDir.parentFile.parentFile
+includeBuild(root.resolve("shared"))
diff --git a/d8_r8/test_modules/tests_java_20/build.gradle.kts b/d8_r8/test_modules/tests_java_20/build.gradle.kts
index f2d2e31..43037f0 100644
--- a/d8_r8/test_modules/tests_java_20/build.gradle.kts
+++ b/d8_r8/test_modules/tests_java_20/build.gradle.kts
@@ -26,13 +26,9 @@
 // We just need to register the examples jars for it to be referenced by other modules.
 val buildExampleJars = buildExampleJars("examplesJava20")
 
-val thirdPartyCompileDependenciesTask = ensureThirdPartyDependencies(
-  "compileDeps",
-  listOf(Jdk.JDK_20.getThirdPartyDependency()))
-
 tasks {
   withType<JavaCompile> {
-    dependsOn(thirdPartyCompileDependenciesTask)
+    dependsOn(gradle.includedBuild("shared").task(":downloadDeps"))
     options.setFork(true)
     options.forkOptions.memoryMaximumSize = "3g"
     options.forkOptions.executable = getCompilerPath(Jdk.JDK_20)
diff --git a/d8_r8/test_modules/tests_java_20/settings.gradle.kts b/d8_r8/test_modules/tests_java_20/settings.gradle.kts
index 0fc5857..85d94d0 100644
--- a/d8_r8/test_modules/tests_java_20/settings.gradle.kts
+++ b/d8_r8/test_modules/tests_java_20/settings.gradle.kts
@@ -25,3 +25,5 @@
 }
 
 rootProject.name = "tests_java_20"
+val root = rootProject.projectDir.parentFile.parentFile
+includeBuild(root.resolve("shared"))
diff --git a/d8_r8/test_modules/tests_java_8/build.gradle.kts b/d8_r8/test_modules/tests_java_8/build.gradle.kts
index f87553a..881089b 100644
--- a/d8_r8/test_modules/tests_java_8/build.gradle.kts
+++ b/d8_r8/test_modules/tests_java_8/build.gradle.kts
@@ -58,33 +58,12 @@
   implementation(Deps.smaliUtil)
 }
 
-val thirdPartyCompileDependenciesTask = ensureThirdPartyDependencies(
-  "compileDeps",
-  listOf(
-    ThirdPartyDeps.apiDatabase,
-    ThirdPartyDeps.ddmLib,
-    ThirdPartyDeps.jasmin,
-    ThirdPartyDeps.jdwpTests))
-
-val thirdPartyRuntimeDependenciesTask = ensureThirdPartyDependencies(
-  "runtimeDeps",
-  testRuntimeDependencies)
-
-val thirdPartyRuntimeInternalDependenciesTask = ensureThirdPartyDependencies(
-  "runtimeInternalDeps",
-  testRuntimeInternalDependencies)
-
 val sourceSetDependenciesTasks = arrayOf(
-  projectTask("tests_java_examples", getExampleJarsTaskName("examples")),
   projectTask("tests_java_9", getExampleJarsTaskName("examplesJava9")),
   projectTask("tests_java_10", getExampleJarsTaskName("examplesJava10")),
   projectTask("tests_java_11", getExampleJarsTaskName("examplesJava11")),
   projectTask("tests_java_17", getExampleJarsTaskName("examplesJava17")),
   projectTask("tests_java_20", getExampleJarsTaskName("examplesJava20")),
-  projectTask("tests_java_examplesAndroidN", getExampleJarsTaskName("examplesAndroidN")),
-  projectTask("tests_java_examplesAndroidO", getExampleJarsTaskName("examplesAndroidO")),
-  projectTask("tests_java_examplesAndroidP", getExampleJarsTaskName("examplesAndroidP")),
-  projectTask("tests_java_kotlinR8TestResources", getExampleJarsTaskName("kotlinR8TestResources")),
 )
 
 fun testDependencies() : FileCollection {
@@ -101,14 +80,14 @@
 
 tasks {
   "compileTestJava" {
-    dependsOn(thirdPartyCompileDependenciesTask)
+    dependsOn(gradle.includedBuild("shared").task(":downloadDeps"))
   }
   withType<JavaCompile> {
     dependsOn(gradle.includedBuild("keepanno").task(":jar"))
     dependsOn(gradle.includedBuild("resourceshrinker").task(":jar"))
     dependsOn(gradle.includedBuild("main").task(":compileJava"))
     dependsOn(gradle.includedBuild("main").task(":processResources"))
-    dependsOn(thirdPartyCompileDependenciesTask)
+    dependsOn(gradle.includedBuild("shared").task(":downloadDeps"))
   }
 
   withType<KotlinCompile> {
@@ -117,14 +96,14 @@
 
   withType<Test> {
     TestingState.setUpTestingState(this)
-    environment.put("USE_NEW_GRADLE_SETUP", "true")
-    environment.put("TEST_CLASSES_LOCATIONS", "$buildDir/classes/java/test")
     dependsOn(mainDepsJarTask)
-    dependsOn(thirdPartyRuntimeDependenciesTask)
+    dependsOn(gradle.includedBuild("shared").task(":downloadDeps"))
     if (!project.hasProperty("no_internal")) {
-      dependsOn(thirdPartyRuntimeInternalDependenciesTask)
+      dependsOn(gradle.includedBuild("shared").task(":downloadDepsInternal"))
     }
     dependsOn(*sourceSetDependenciesTasks)
+    systemProperty("TEST_DATA_LOCATION",
+                   layout.buildDirectory.dir("classes/java/test").get().toString())
     systemProperty("KEEP_ANNO_JAVAC_BUILD_DIR", keepAnnoCompileTask.outputs.files.getAsPath())
     // This path is set when compiling examples jar task in DependenciesPlugin.
     systemProperty("EXAMPLES_JAVA_11_JAVAC_BUILD_DIR",
@@ -138,6 +117,7 @@
       mainCompileTask.outputs.files.getAsPath().split(File.pathSeparator)[0] +
         File.pathSeparator + mainDepsJarTask.outputs.files.singleFile)
     systemProperty("R8_DEPS", mainDepsJarTask.outputs.files.singleFile)
+    systemProperty("com.android.tools.r8.artprofilerewritingcompletenesscheck", "true")
   }
 
   val testJar by registering(Jar::class) {
@@ -149,9 +129,9 @@
   }
 
   val depsJar by registering(Jar::class) {
+    dependsOn(gradle.includedBuild("shared").task(":downloadDeps"))
     dependsOn(gradle.includedBuild("keepanno").task(":jar"))
     dependsOn(gradle.includedBuild("resourceshrinker").task(":jar"))
-    dependsOn(thirdPartyCompileDependenciesTask)
     from(testDependencies().map(::zipTree))
     duplicatesStrategy = DuplicatesStrategy.EXCLUDE
     archiveFileName.set("deps.jar")
diff --git a/d8_r8/test_modules/tests_java_8/settings.gradle.kts b/d8_r8/test_modules/tests_java_8/settings.gradle.kts
index 627a65a..a0cc31c 100644
--- a/d8_r8/test_modules/tests_java_8/settings.gradle.kts
+++ b/d8_r8/test_modules/tests_java_8/settings.gradle.kts
@@ -27,21 +27,15 @@
 rootProject.name = "tests_java_8"
 
 val root = rootProject.projectDir.parentFile.parentFile
+includeBuild(root.resolve("shared"))
 includeBuild(root.resolve("keepanno"))
 includeBuild(root.resolve("resourceshrinker"))
 
 // We need to include src/main as a composite-build otherwise our test-modules
 // will compete with the test to compile the source files.
 includeBuild(root.resolve("main"))
-
 includeBuild(root.resolve("test_modules").resolve("tests_java_9"))
 includeBuild(root.resolve("test_modules").resolve("tests_java_10"))
 includeBuild(root.resolve("test_modules").resolve("tests_java_11"))
 includeBuild(root.resolve("test_modules").resolve("tests_java_17"))
 includeBuild(root.resolve("test_modules").resolve("tests_java_20"))
-includeBuild(root.resolve("test_modules").resolve("tests_java_examples"))
-includeBuild(root.resolve("test_modules").resolve("tests_java_examplesAndroidN"))
-includeBuild(root.resolve("test_modules").resolve("tests_java_examplesAndroidO"))
-includeBuild(root.resolve("test_modules").resolve("tests_java_examplesAndroidP"))
-includeBuild(root.resolve("test_modules").resolve("tests_java_kotlinR8TestResources"))
-
diff --git a/d8_r8/test_modules/tests_java_9/build.gradle.kts b/d8_r8/test_modules/tests_java_9/build.gradle.kts
index bda4b77..136a506 100644
--- a/d8_r8/test_modules/tests_java_9/build.gradle.kts
+++ b/d8_r8/test_modules/tests_java_9/build.gradle.kts
@@ -26,13 +26,9 @@
 // We just need to register the examples jars for it to be referenced by other modules.
 val buildExampleJars = buildExampleJars("examplesJava9")
 
-val thirdPartyCompileDependenciesTask = ensureThirdPartyDependencies(
-  "compileDeps",
-  listOf(Jdk.JDK_9.getThirdPartyDependency()))
-
 tasks {
   withType<JavaCompile> {
-    dependsOn(thirdPartyCompileDependenciesTask)
+    dependsOn(gradle.includedBuild("shared").task(":downloadDeps"))
     options.setFork(true)
     options.forkOptions.memoryMaximumSize = "3g"
     options.forkOptions.executable = getCompilerPath(Jdk.JDK_9)
diff --git a/d8_r8/test_modules/tests_java_9/settings.gradle.kts b/d8_r8/test_modules/tests_java_9/settings.gradle.kts
index 2639b0f..46bc3a8 100644
--- a/d8_r8/test_modules/tests_java_9/settings.gradle.kts
+++ b/d8_r8/test_modules/tests_java_9/settings.gradle.kts
@@ -25,3 +25,5 @@
 }
 
 rootProject.name = "tests_java_9"
+val root = rootProject.projectDir.parentFile.parentFile
+includeBuild(root.resolve("shared"))
diff --git a/d8_r8/test_modules/tests_java_examples/build.gradle.kts b/d8_r8/test_modules/tests_java_examples/build.gradle.kts
deleted file mode 100644
index 95a9105..0000000
--- a/d8_r8/test_modules/tests_java_examples/build.gradle.kts
+++ /dev/null
@@ -1,57 +0,0 @@
-// 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.
-
-import org.gradle.api.JavaVersion
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
-
-plugins {
-  `kotlin-dsl`
-  `java-library`
-  id("dependencies-plugin")
-}
-
-val root = getRoot()
-
-java {
-  sourceSets.test.configure {
-    java.srcDirs.clear()
-    java.srcDir(root.resolveAll("src", "test", "examples"))
-  }
-  sourceCompatibility = JavaVersion.VERSION_1_8
-  targetCompatibility = JavaVersion.VERSION_1_8
-}
-
-dependencies {
-  testCompileOnly(Deps.mockito)
-}
-
-val thirdPartyCompileDependenciesTask = ensureThirdPartyDependencies(
-  "compileDeps",
-  listOf(Jdk.JDK_11.getThirdPartyDependency()))
-
-tasks {
-  compileTestJava {
-    options.compilerArgs = listOf("-g:source,lines")
-  }
-
-  register<JavaCompile>("debuginfo-all") {
-    source = sourceSets.test.get().allSource
-    include("**/*.java")
-    classpath = sourceSets.test.get().compileClasspath
-    destinationDirectory.set(getRoot().resolveAll("build","test","examples","classes_debuginfo_all"))
-    options.compilerArgs = listOf("-g")
-  }
-
-  register<JavaCompile>("debuginfo-none") {
-    source = sourceSets.test.get().allSource
-    include("**/*.java")
-    classpath = sourceSets.test.get().compileClasspath
-    destinationDirectory.set(getRoot().resolveAll("build","test","examples","classes_debuginfo_none"))
-    options.compilerArgs = listOf("-g:none")
-  }
-}
-
-// We just need to register the examples jars for it to be referenced by other modules. This should
-// be placed after all task registrations.
-val buildExampleJars = buildExampleJars("examples")
diff --git a/d8_r8/test_modules/tests_java_examples/settings.gradle.kts b/d8_r8/test_modules/tests_java_examples/settings.gradle.kts
deleted file mode 100644
index 77e513f..0000000
--- a/d8_r8/test_modules/tests_java_examples/settings.gradle.kts
+++ /dev/null
@@ -1,27 +0,0 @@
-// 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.
-
-pluginManagement {
-  repositories {
-    maven {
-      url = uri("file:../../../third_party/dependencies")
-    }
-    maven {
-      url = uri("file:../../../third_party/dependencies_new")
-    }
-  }
-}
-
-dependencyResolutionManagement {
-  repositories {
-    maven {
-      url = uri("file:../../../third_party/dependencies")
-    }
-    maven {
-      url = uri("file:../../../third_party/dependencies_new")
-    }
-  }
-}
-
-rootProject.name = "tests_java_examples"
diff --git a/d8_r8/test_modules/tests_java_examplesAndroidN/build.gradle.kts b/d8_r8/test_modules/tests_java_examplesAndroidN/build.gradle.kts
deleted file mode 100644
index 57b641f..0000000
--- a/d8_r8/test_modules/tests_java_examplesAndroidN/build.gradle.kts
+++ /dev/null
@@ -1,40 +0,0 @@
-// 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.
-
-import org.gradle.api.JavaVersion
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
-
-plugins {
-  `kotlin-dsl`
-  `java-library`
-  id("dependencies-plugin")
-}
-
-val root = getRoot()
-
-java {
-  sourceSets.test.configure {
-    java.srcDirs.clear()
-    java.srcDir(root.resolveAll("src", "test", "examplesAndroidN"))
-  }
-  sourceCompatibility = JavaVersion.VERSION_1_8
-  targetCompatibility = JavaVersion.VERSION_1_8
-}
-
-dependencies {
-  testCompileOnly(Deps.asm)
-}
-
-// We just need to register the examples jars for it to be referenced by other modules.
-val buildExampleJars = buildExampleJars("examplesAndroidN")
-
-val thirdPartyCompileDependenciesTask = ensureThirdPartyDependencies(
-  "compileDeps",
-  listOf(Jdk.JDK_11.getThirdPartyDependency()))
-
-tasks {
-  withType<JavaCompile> {
-    dependsOn(thirdPartyCompileDependenciesTask)
-  }
-}
diff --git a/d8_r8/test_modules/tests_java_examplesAndroidN/gradle.properties b/d8_r8/test_modules/tests_java_examplesAndroidN/gradle.properties
deleted file mode 100644
index a82d85e..0000000
--- a/d8_r8/test_modules/tests_java_examplesAndroidN/gradle.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-# 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.
-
-org.gradle.jvmargs=-Xmx2048M -Dfile.encoding=UTF-8
-kotlin.daemon.jvmargs=-Xmx3g -Dkotlin.js.compiler.legacy.force_enabled=true
-systemProp.file.encoding=UTF-8
-
-# Enable new incremental compilation
-kotlin.incremental.useClasspathSnapshot=true
-
-org.gradle.parallel=true
-org.gradle.caching=false
-org.gradle.configuration-cache=true
-
-# Do not download any jdks or detect them. We provide them.
-org.gradle.java.installations.auto-detect=false
-org.gradle.java.installations.auto-download=false
diff --git a/d8_r8/test_modules/tests_java_examplesAndroidN/settings.gradle.kts b/d8_r8/test_modules/tests_java_examplesAndroidN/settings.gradle.kts
deleted file mode 100644
index 000e19b..0000000
--- a/d8_r8/test_modules/tests_java_examplesAndroidN/settings.gradle.kts
+++ /dev/null
@@ -1,27 +0,0 @@
-// 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.
-
-pluginManagement {
-  repositories {
-    maven {
-      url = uri("file:../../../third_party/dependencies")
-    }
-    maven {
-      url = uri("file:../../../third_party/dependencies_new")
-    }
-  }
-}
-
-dependencyResolutionManagement {
-  repositories {
-    maven {
-      url = uri("file:../../../third_party/dependencies")
-    }
-    maven {
-      url = uri("file:../../../third_party/dependencies_new")
-    }
-  }
-}
-
-rootProject.name = "tests_java_examplesAndroidN"
diff --git a/d8_r8/test_modules/tests_java_examplesAndroidO/build.gradle.kts b/d8_r8/test_modules/tests_java_examplesAndroidO/build.gradle.kts
deleted file mode 100644
index 062128c..0000000
--- a/d8_r8/test_modules/tests_java_examplesAndroidO/build.gradle.kts
+++ /dev/null
@@ -1,52 +0,0 @@
-// 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.
-
-import org.gradle.api.JavaVersion
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
-
-plugins {
-  `kotlin-dsl`
-  `java-library`
-  id("dependencies-plugin")
-}
-
-val root = getRoot()
-
-java {
-  sourceSets.test.configure {
-    java.srcDirs.clear()
-    java.srcDir(root.resolveAll("src", "test", "examplesAndroidO"))
-  }
-  sourceCompatibility = JavaVersion.VERSION_1_8
-  targetCompatibility = JavaVersion.VERSION_1_8
-}
-
-// NOTE: we want to enable a scenario when test needs to reference some classes generated by legacy
-// (1.6) Java compiler to test some specific behaviour. To do so we compile all the java files
-// located in a sub-directory called 'legacy' with Java 1.6, then compile the rest of the files with
-// Java 1.8 and a reference to previously generated 1.6 classes.
-
-dependencies {
-  testCompileOnly(Deps.asm)
-  testCompileOnly(resolve(ThirdPartyDeps.examplesAndroidOLegacy))
-  testCompileOnly(resolve(getThirdPartyAndroidJar("lib-v26"),"android.jar"))
-}
-
-// We just need to register the examples jars for it to be referenced by other modules.
-val buildExampleJars = buildExampleJars("examplesAndroidO")
-
-val thirdPartyCompileDependenciesTask = ensureThirdPartyDependencies(
-  "compileDeps",
-  listOf(
-    ThirdPartyDeps.examplesAndroidOLegacy,
-    Jdk.JDK_11.getThirdPartyDependency(),
-    getThirdPartyAndroidJar("lib-v26")))
-
-tasks {
-  withType<JavaCompile> {
-    dependsOn(thirdPartyCompileDependenciesTask)
-    options.compilerArgs.add("-Xlint:-options")
-    options.compilerArgs.add("-parameters")
-  }
-}
diff --git a/d8_r8/test_modules/tests_java_examplesAndroidO/gradle.properties b/d8_r8/test_modules/tests_java_examplesAndroidO/gradle.properties
deleted file mode 100644
index a82d85e..0000000
--- a/d8_r8/test_modules/tests_java_examplesAndroidO/gradle.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-# 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.
-
-org.gradle.jvmargs=-Xmx2048M -Dfile.encoding=UTF-8
-kotlin.daemon.jvmargs=-Xmx3g -Dkotlin.js.compiler.legacy.force_enabled=true
-systemProp.file.encoding=UTF-8
-
-# Enable new incremental compilation
-kotlin.incremental.useClasspathSnapshot=true
-
-org.gradle.parallel=true
-org.gradle.caching=false
-org.gradle.configuration-cache=true
-
-# Do not download any jdks or detect them. We provide them.
-org.gradle.java.installations.auto-detect=false
-org.gradle.java.installations.auto-download=false
diff --git a/d8_r8/test_modules/tests_java_examplesAndroidO/settings.gradle.kts b/d8_r8/test_modules/tests_java_examplesAndroidO/settings.gradle.kts
deleted file mode 100644
index d508d51..0000000
--- a/d8_r8/test_modules/tests_java_examplesAndroidO/settings.gradle.kts
+++ /dev/null
@@ -1,27 +0,0 @@
-// 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.
-
-pluginManagement {
-  repositories {
-    maven {
-      url = uri("file:../../../third_party/dependencies")
-    }
-    maven {
-      url = uri("file:../../../third_party/dependencies_new")
-    }
-  }
-}
-
-dependencyResolutionManagement {
-  repositories {
-    maven {
-      url = uri("file:../../../third_party/dependencies")
-    }
-    maven {
-      url = uri("file:../../../third_party/dependencies_new")
-    }
-  }
-}
-
-rootProject.name = "tests_java_examplesAndroidO"
diff --git a/d8_r8/test_modules/tests_java_examplesAndroidP/build.gradle.kts b/d8_r8/test_modules/tests_java_examplesAndroidP/build.gradle.kts
deleted file mode 100644
index efed289..0000000
--- a/d8_r8/test_modules/tests_java_examplesAndroidP/build.gradle.kts
+++ /dev/null
@@ -1,40 +0,0 @@
-// 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.
-
-import org.gradle.api.JavaVersion
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
-
-plugins {
-  `kotlin-dsl`
-  `java-library`
-  id("dependencies-plugin")
-}
-
-val root = getRoot()
-
-java {
-  sourceSets.test.configure {
-    java.srcDirs.clear()
-    java.srcDir(root.resolveAll("src", "test", "examplesAndroidP"))
-  }
-  sourceCompatibility = JavaVersion.VERSION_1_8
-  targetCompatibility = JavaVersion.VERSION_1_8
-}
-
-dependencies {
-  testCompileOnly(Deps.asm)
-}
-
-// We just need to register the examples jars for it to be referenced by other modules.
-val buildExampleJars = buildExampleJars("examplesAndroidP")
-
-val thirdPartyCompileDependenciesTask = ensureThirdPartyDependencies(
-  "compileDeps",
-  listOf(Jdk.JDK_11.getThirdPartyDependency()))
-
-tasks {
-  withType<JavaCompile> {
-    dependsOn(thirdPartyCompileDependenciesTask)
-  }
-}
diff --git a/d8_r8/test_modules/tests_java_examplesAndroidP/gradle.properties b/d8_r8/test_modules/tests_java_examplesAndroidP/gradle.properties
deleted file mode 100644
index a82d85e..0000000
--- a/d8_r8/test_modules/tests_java_examplesAndroidP/gradle.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-# 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.
-
-org.gradle.jvmargs=-Xmx2048M -Dfile.encoding=UTF-8
-kotlin.daemon.jvmargs=-Xmx3g -Dkotlin.js.compiler.legacy.force_enabled=true
-systemProp.file.encoding=UTF-8
-
-# Enable new incremental compilation
-kotlin.incremental.useClasspathSnapshot=true
-
-org.gradle.parallel=true
-org.gradle.caching=false
-org.gradle.configuration-cache=true
-
-# Do not download any jdks or detect them. We provide them.
-org.gradle.java.installations.auto-detect=false
-org.gradle.java.installations.auto-download=false
diff --git a/d8_r8/test_modules/tests_java_examplesAndroidP/settings.gradle.kts b/d8_r8/test_modules/tests_java_examplesAndroidP/settings.gradle.kts
deleted file mode 100644
index 1e0be82..0000000
--- a/d8_r8/test_modules/tests_java_examplesAndroidP/settings.gradle.kts
+++ /dev/null
@@ -1,27 +0,0 @@
-// 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.
-
-pluginManagement {
-  repositories {
-    maven {
-      url = uri("file:../../../third_party/dependencies")
-    }
-    maven {
-      url = uri("file:../../../third_party/dependencies_new")
-    }
-  }
-}
-
-dependencyResolutionManagement {
-  repositories {
-    maven {
-      url = uri("file:../../../third_party/dependencies")
-    }
-    maven {
-      url = uri("file:../../../third_party/dependencies_new")
-    }
-  }
-}
-
-rootProject.name = "tests_java_examplesAndroidP"
diff --git a/d8_r8/test_modules/tests_java_kotlinR8TestResources/build.gradle.kts b/d8_r8/test_modules/tests_java_kotlinR8TestResources/build.gradle.kts
deleted file mode 100644
index 06d9518..0000000
--- a/d8_r8/test_modules/tests_java_kotlinR8TestResources/build.gradle.kts
+++ /dev/null
@@ -1,45 +0,0 @@
-// 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.
-
-import org.gradle.api.JavaVersion
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
-
-plugins {
-  `kotlin-dsl`
-  `java-library`
-  id("dependencies-plugin")
-}
-
-val root = getRoot()
-
-java {
-  sourceSets.test.configure {
-    java.srcDirs.clear()
-    java.srcDir(root.resolveAll("src", "test", "kotlinR8TestResources"))
-  }
-  sourceCompatibility = JavaVersion.VERSION_1_8
-  targetCompatibility = JavaVersion.VERSION_1_8
-}
-
-dependencies {
-  testCompileOnly(Deps.asm)
-}
-
-// We just need to register the examples jars for it to be referenced by other modules.
-val buildExampleJars = buildExampleJars("kotlinR8TestResources")
-
-val thirdPartyCompileDependenciesTask = ensureThirdPartyDependencies(
-  "compileDeps",
-  listOf(Jdk.JDK_11.getThirdPartyDependency()))
-
-tasks {
-  withType<JavaCompile> {
-    dependsOn(thirdPartyCompileDependenciesTask)
-  }
-  withType<KotlinCompile> {
-    kotlinOptions {
-      jvmTarget = "1.8"
-    }
-  }
-}
diff --git a/d8_r8/test_modules/tests_java_kotlinR8TestResources/gradle.properties b/d8_r8/test_modules/tests_java_kotlinR8TestResources/gradle.properties
deleted file mode 100644
index a82d85e..0000000
--- a/d8_r8/test_modules/tests_java_kotlinR8TestResources/gradle.properties
+++ /dev/null
@@ -1,18 +0,0 @@
-# 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.
-
-org.gradle.jvmargs=-Xmx2048M -Dfile.encoding=UTF-8
-kotlin.daemon.jvmargs=-Xmx3g -Dkotlin.js.compiler.legacy.force_enabled=true
-systemProp.file.encoding=UTF-8
-
-# Enable new incremental compilation
-kotlin.incremental.useClasspathSnapshot=true
-
-org.gradle.parallel=true
-org.gradle.caching=false
-org.gradle.configuration-cache=true
-
-# Do not download any jdks or detect them. We provide them.
-org.gradle.java.installations.auto-detect=false
-org.gradle.java.installations.auto-download=false
diff --git a/d8_r8/test_modules/tests_java_kotlinR8TestResources/settings.gradle.kts b/d8_r8/test_modules/tests_java_kotlinR8TestResources/settings.gradle.kts
deleted file mode 100644
index 7eb50aa..0000000
--- a/d8_r8/test_modules/tests_java_kotlinR8TestResources/settings.gradle.kts
+++ /dev/null
@@ -1,27 +0,0 @@
-// 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.
-
-pluginManagement {
-  repositories {
-    maven {
-      url = uri("file:../../../third_party/dependencies")
-    }
-    maven {
-      url = uri("file:../../../third_party/dependencies_new")
-    }
-  }
-}
-
-dependencyResolutionManagement {
-  repositories {
-    maven {
-      url = uri("file:../../../third_party/dependencies")
-    }
-    maven {
-      url = uri("file:../../../third_party/dependencies_new")
-    }
-  }
-}
-
-rootProject.name = "tests_java_kotlinR8TestResources"
diff --git a/infra/config/global/generated/cr-buildbucket.cfg b/infra/config/global/generated/cr-buildbucket.cfg
index d929383..1c1f973 100644
--- a/infra/config/global/generated/cr-buildbucket.cfg
+++ b/infra/config/global/generated/cr-buildbucket.cfg
@@ -37,7 +37,7 @@
         '  "test_wrapper": "tools/archive.py"'
         '}'
       priority: 25
-      execution_timeout_secs: 1800
+      execution_timeout_secs: 3600
       expiration_secs: 126000
       build_numbers: YES
       service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
@@ -65,7 +65,7 @@
         '  "test_wrapper": "tools/archive.py"'
         '}'
       priority: 25
-      execution_timeout_secs: 1800
+      execution_timeout_secs: 3600
       expiration_secs: 126000
       build_numbers: YES
       service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
diff --git a/infra/config/global/generated/project.cfg b/infra/config/global/generated/project.cfg
index 3f70a4d..755c550 100644
--- a/infra/config/global/generated/project.cfg
+++ b/infra/config/global/generated/project.cfg
@@ -7,7 +7,7 @@
 name: "r8"
 access: "group:all"
 lucicfg {
-  version: "1.39.14"
+  version: "1.39.15"
   package_dir: ".."
   config_dir: "generated"
   entry_point: "main.star"
diff --git a/infra/config/global/main.star b/infra/config/global/main.star
index 885d58e..aca08c1 100755
--- a/infra/config/global/main.star
+++ b/infra/config/global/main.star
@@ -282,7 +282,7 @@
         priority = 25,
         trigger = not desugar,
         properties = properties,
-        execution_timeout = time.hour * 1 if desugar else time.minute * 30 ,
+        execution_timeout = time.hour * 1,
         expiration_timeout = time.hour * 35,
     )
 archivers()
diff --git a/scripts/update-host-art.sh b/scripts/update-host-art.sh
index 44e5a49..ef7670b 100755
--- a/scripts/update-host-art.sh
+++ b/scripts/update-host-art.sh
@@ -135,7 +135,9 @@
 
 # Required framework files.
 mkdir -p $DEST/framework
+mkdir -p $DEST/out/host/linux-x86/framework
 cp -R $ANDROID_HOST_BUILD/framework/* $DEST/framework
+cp $ANDROID_HOST_BUILD/framework/*.jar $DEST/out/host/linux-x86/framework
 
 # Required library files.
 mkdir -p $DEST/lib64
@@ -202,4 +204,4 @@
 
 echo "Now run"
 echo "(cd $DEST_ROOT; upload_to_google_storage.py -a --bucket r8-deps $ART_DIR)"
-echo "NOTE; If $ART_DIR has several directory elements adjust accordingly."
\ No newline at end of file
+echo "NOTE; If $ART_DIR has several directory elements adjust accordingly."
diff --git a/src/main/java/com/android/tools/r8/D8Command.java b/src/main/java/com/android/tools/r8/D8Command.java
index bd0152e..c210df5 100644
--- a/src/main/java/com/android/tools/r8/D8Command.java
+++ b/src/main/java/com/android/tools/r8/D8Command.java
@@ -147,12 +147,22 @@
       return super.addClasspathResourceProvider(provider);
     }
 
-    /** Set input proguard map used for distribution of classes in multi-dex. */
+    /**
+     * Set input proguard map used for distribution of classes in multi-dex. Use {@link
+     * #setProguardMapInputFile}
+     */
+    @Deprecated()
     public Builder setProguardInputMapFile(Path proguardInputMap) {
       getAppBuilder().setProguardMapInputData(proguardInputMap);
       return self();
     }
 
+    /** Set input proguard map used for distribution of classes in multi-dex. */
+    public Builder setProguardMapInputFile(Path proguardInputMap) {
+      getAppBuilder().setProguardMapInputData(proguardInputMap);
+      return self();
+    }
+
     /**
      * Set a consumer for receiving the proguard-map content.
      *
diff --git a/src/main/java/com/android/tools/r8/D8CommandParser.java b/src/main/java/com/android/tools/r8/D8CommandParser.java
index 8bf79ed..49360fd 100644
--- a/src/main/java/com/android/tools/r8/D8CommandParser.java
+++ b/src/main/java/com/android/tools/r8/D8CommandParser.java
@@ -265,7 +265,7 @@
       } else if (arg.equals("--classfile")) {
         outputMode = OutputMode.ClassFile;
       } else if (arg.equals("--pg-map")) {
-        builder.setProguardInputMapFile(Paths.get(nextArg));
+        builder.setProguardMapInputFile(Paths.get(nextArg));
       } else if (arg.equals("--pg-map-output")) {
         builder.setProguardMapOutputPath(Paths.get(nextArg));
       } else if (arg.equals("--partition-map-output")) {
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index fc1122a..1decde2 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -46,6 +46,7 @@
 import com.android.tools.r8.utils.InternalOptions.DesugarState;
 import com.android.tools.r8.utils.InternalOptions.HorizontalClassMergerOptions;
 import com.android.tools.r8.utils.InternalOptions.LineNumberOptimization;
+import com.android.tools.r8.utils.InternalOptions.MappingComposeOptions;
 import com.android.tools.r8.utils.ProgramClassCollection;
 import com.android.tools.r8.utils.Reporter;
 import com.android.tools.r8.utils.SemanticVersion;
@@ -289,6 +290,12 @@
       return super.setProguardMapOutputPath(proguardMapOutput);
     }
 
+    /** Set input proguard map used for distribution of classes in multi-dex. */
+    public Builder setProguardMapInputFile(Path proguardInputMap) {
+      getAppBuilder().setProguardMapInputData(proguardInputMap);
+      return self();
+    }
+
     /**
      * Set a consumer for receiving the proguard-map content.
      *
@@ -1091,6 +1098,8 @@
         (internal.isOptimizing() || internal.isMinifying())
             ? LineNumberOptimization.ON
             : LineNumberOptimization.OFF;
+    MappingComposeOptions mappingComposeOptions = internal.mappingComposeOptions();
+    mappingComposeOptions.enableExperimentalMappingComposition = true;
 
     HorizontalClassMergerOptions horizontalClassMergerOptions =
         internal.horizontalClassMergerOptions();
diff --git a/src/main/java/com/android/tools/r8/R8CommandParser.java b/src/main/java/com/android/tools/r8/R8CommandParser.java
index f5f22bf..d88314d 100644
--- a/src/main/java/com/android/tools/r8/R8CommandParser.java
+++ b/src/main/java/com/android/tools/r8/R8CommandParser.java
@@ -42,6 +42,7 @@
           "--main-dex-list-output",
           "--pg-conf",
           "--pg-conf-output",
+          "--pg-map",
           "--pg-map-output",
           "--partition-map-output",
           "--desugared-lib",
@@ -71,6 +72,12 @@
         .add(flag0("--pg-compat", "Compile with R8 in Proguard compatibility mode."))
         .add(ParseFlagInfoImpl.getPgConf())
         .add(flag1("--pg-conf-output", "<file>", "Output the collective configuration to <file>."))
+        .add(
+            ParseFlagInfoImpl.flag1(
+                "--pg-map",
+                "<file>",
+                "Use <file> as a mapping file for distribution "
+                    + "and composition with output mapping file."))
         .add(ParseFlagInfoImpl.getPgMapOutput())
         .add(ParseFlagInfoImpl.getPartitionMapOutput())
         .add(ParseFlagInfoImpl.getDesugaredLib())
@@ -113,6 +120,7 @@
                 "  %MAP_HASH: compiler generated mapping hash."))
         .add(ParseFlagInfoImpl.getAndroidPlatformBuild())
         .add(ParseFlagInfoImpl.getArtProfile())
+        .add(ParseFlagInfoImpl.getStartupProfile())
         .add(ParseFlagInfoImpl.getVersion("r8"))
         .add(ParseFlagInfoImpl.getHelp())
         .build();
@@ -294,6 +302,8 @@
       } else if (arg.equals("--pg-conf-output")) {
         FileConsumer consumer = new FileConsumer(Paths.get(nextArg));
         builder.setProguardConfigurationConsumer(consumer);
+      } else if (arg.equals("--pg-map")) {
+        builder.setProguardMapInputFile(Paths.get(nextArg));
       } else if (arg.equals("--pg-map-output")) {
         builder.setProguardMapOutputPath(Paths.get(nextArg));
       } else if (arg.equals("--partition-map-output")) {
diff --git a/src/main/java/com/android/tools/r8/cf/CfVersion.java b/src/main/java/com/android/tools/r8/cf/CfVersion.java
index f69e532..c85f50f 100644
--- a/src/main/java/com/android/tools/r8/cf/CfVersion.java
+++ b/src/main/java/com/android/tools/r8/cf/CfVersion.java
@@ -46,6 +46,8 @@
   public static final CfVersion V20_PREVIEW = new CfVersion(Opcodes.V20 | Opcodes.V_PREVIEW);
   public static final CfVersion V21 = new CfVersion(Opcodes.V21);
   public static final CfVersion V21_PREVIEW = new CfVersion(Opcodes.V21 | Opcodes.V_PREVIEW);
+  public static final CfVersion V22 = new CfVersion(66);
+  public static final CfVersion V22_PREVIEW = new CfVersion(66 | Opcodes.V_PREVIEW);
 
   private final int version;
 
diff --git a/src/main/java/com/android/tools/r8/graph/AppView.java b/src/main/java/com/android/tools/r8/graph/AppView.java
index 30bbe20..4a8b427 100644
--- a/src/main/java/com/android/tools/r8/graph/AppView.java
+++ b/src/main/java/com/android/tools/r8/graph/AppView.java
@@ -31,6 +31,7 @@
 import com.android.tools.r8.ir.analysis.value.AbstractValueJoiner.AbstractValueParameterJoiner;
 import com.android.tools.r8.ir.desugar.TypeRewriter;
 import com.android.tools.r8.ir.optimize.enums.EnumDataMap;
+import com.android.tools.r8.ir.optimize.info.MethodResolutionOptimizationInfoCollection;
 import com.android.tools.r8.ir.optimize.info.field.InstanceFieldInitializationInfoFactory;
 import com.android.tools.r8.ir.optimize.library.LibraryMemberOptimizer;
 import com.android.tools.r8.ir.optimize.library.LibraryMethodSideEffectModelCollection;
@@ -95,6 +96,8 @@
   private NamingLens namingLens = NamingLens.getIdentityLens();
   private ProguardCompatibilityActions proguardCompatibilityActions;
   private RootSet rootSet;
+  private MethodResolutionOptimizationInfoCollection methodResolutionOptimizationInfoCollection =
+      MethodResolutionOptimizationInfoCollection.empty();
   private MainDexRootSet mainDexRootSet = null;
   private StartupProfile startupProfile;
 
@@ -340,6 +343,16 @@
     return abstractValueParameterJoiner;
   }
 
+  public MethodResolutionOptimizationInfoCollection
+      getMethodResolutionOptimizationInfoCollection() {
+    return methodResolutionOptimizationInfoCollection;
+  }
+
+  public void setMethodResolutionOptimizationInfoCollection(
+      MethodResolutionOptimizationInfoCollection getMethodResolutionOptimizationInfoCollection) {
+    this.methodResolutionOptimizationInfoCollection = getMethodResolutionOptimizationInfoCollection;
+  }
+
   public InstanceFieldInitializationInfoFactory instanceFieldInitializationInfoFactory() {
     return instanceFieldInitializationInfoFactory;
   }
diff --git a/src/main/java/com/android/tools/r8/graph/DexDebugEventBuilder.java b/src/main/java/com/android/tools/r8/graph/DexDebugEventBuilder.java
index c4eace2..c154471 100644
--- a/src/main/java/com/android/tools/r8/graph/DexDebugEventBuilder.java
+++ b/src/main/java/com/android/tools/r8/graph/DexDebugEventBuilder.java
@@ -57,6 +57,7 @@
   private int emittedPc = NO_PC_INFO;
   private Position emittedPosition = Position.none();
   private Int2ReferenceMap<DebugLocalInfo> emittedLocals;
+  private final boolean isComposing;
 
   // Emitted events.
   private final List<DexDebugEvent> events = new ArrayList<>();
@@ -66,9 +67,12 @@
 
   public DexDebugEventBuilder(AppView<?> appView, IRCode code) {
     this.appView = appView;
-    this.method = code.method();
-    this.factory = appView.dexItemFactory();
-    this.options = appView.options();
+    method = code.context().getDefinition();
+    factory = appView.dexItemFactory();
+    options = appView.options();
+    isComposing =
+        options.mappingComposeOptions().enableExperimentalMappingComposition
+            && appView.appInfo().app().getProguardMap() != null;
   }
 
   /** Add events at pc for instruction. */
@@ -94,7 +98,9 @@
       updateLocals(instruction.asDebugLocalsChange());
     } else if (pcAdvancing) {
       if (!position.isNone() && !position.equals(emittedPosition)) {
-        if (options.debug || instruction.instructionInstanceCanThrow(appView, context)) {
+        if (options.debug
+            || instruction.instructionInstanceCanThrow(appView, context)
+            || isComposing) {
           emitDebugPosition(pc, position);
         }
       }
diff --git a/src/main/java/com/android/tools/r8/graph/MethodResolutionResult.java b/src/main/java/com/android/tools/r8/graph/MethodResolutionResult.java
index d7362d6..428c57d 100644
--- a/src/main/java/com/android/tools/r8/graph/MethodResolutionResult.java
+++ b/src/main/java/com/android/tools/r8/graph/MethodResolutionResult.java
@@ -8,7 +8,11 @@
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.LookupResult.LookupResultSuccess;
 import com.android.tools.r8.graph.LookupResult.LookupResultSuccess.LookupResultCollectionState;
+import com.android.tools.r8.ir.code.InvokeMethod;
 import com.android.tools.r8.ir.desugar.LambdaDescriptor;
+import com.android.tools.r8.ir.optimize.info.DefaultMethodOptimizationInfo;
+import com.android.tools.r8.ir.optimize.info.MethodOptimizationInfo;
+import com.android.tools.r8.ir.optimize.info.MethodResolutionOptimizationInfoCollection;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.shaking.InstantiatedObject;
 import com.android.tools.r8.utils.BooleanBox;
@@ -283,6 +287,19 @@
     public abstract SingleResolutionResult<T> withInitialResolutionHolder(
         DexClass newInitialResolutionHolder);
 
+    public MethodOptimizationInfo getOptimizationInfo(
+        AppView<?> appView, InvokeMethod invoke, DexClassAndMethod singleTarget) {
+      if (singleTarget != null) {
+        return singleTarget.getOptimizationInfo();
+      }
+      if (invoke.isInvokeMethodWithDynamicDispatch() && resolvedMethod.belongsToVirtualPool()) {
+        MethodResolutionOptimizationInfoCollection methodResolutionOptimizationInfoCollection =
+            appView.getMethodResolutionOptimizationInfoCollection();
+        return methodResolutionOptimizationInfoCollection.get(resolvedMethod, resolvedHolder);
+      }
+      return DefaultMethodOptimizationInfo.getInstance();
+    }
+
     @Override
     public DexClass getInitialResolutionHolder() {
       return initialResolutionHolder;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
index ade2770..0341252 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/IRConverter.java
@@ -801,7 +801,7 @@
     }
 
     // TODO(mkroghj) Test if shorten live ranges is worth it.
-    if (!options.isGeneratingClassFiles()) {
+    if (options.isGeneratingDex()) {
       timing.begin("Canonicalize constants");
       ConstantCanonicalizer constantCanonicalizer =
           new ConstantCanonicalizer(appView, context, code);
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java
index bc66527..cc12b6e 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/PrimaryR8IRConverter.java
@@ -18,6 +18,7 @@
 import com.android.tools.r8.ir.analysis.fieldaccess.TrivialFieldAccessReprocessor;
 import com.android.tools.r8.ir.code.IRCode;
 import com.android.tools.r8.ir.conversion.passes.FilledNewArrayRewriter;
+import com.android.tools.r8.ir.optimize.ConstantCanonicalizer;
 import com.android.tools.r8.ir.optimize.DeadCodeRemover;
 import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackDelayed;
 import com.android.tools.r8.lightir.LirCode;
@@ -336,7 +337,13 @@
       method.setCode(rewrittenLirCode, appView);
     }
     IRCode irCode = method.buildIR(appView, MethodConversionOptions.forPostLirPhase(appView));
-    new FilledNewArrayRewriter(appView).run(irCode, onThreadTiming);
+    FilledNewArrayRewriter filledNewArrayRewriter = new FilledNewArrayRewriter(appView);
+    boolean changed = filledNewArrayRewriter.run(irCode, onThreadTiming).hasChanged().toBoolean();
+    if (appView.options().isGeneratingDex() && changed) {
+      ConstantCanonicalizer constantCanonicalizer =
+          new ConstantCanonicalizer(appView, method, irCode);
+      constantCanonicalizer.canonicalize();
+    }
     // Processing is done and no further uses of the meta-data should arise.
     BytecodeMetadataProvider noMetadata = BytecodeMetadataProvider.empty();
     // During processing optimization info may cause previously live code to become dead.
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/passes/FilledNewArrayRewriter.java b/src/main/java/com/android/tools/r8/ir/conversion/passes/FilledNewArrayRewriter.java
index 13e590b..e269dc1 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/passes/FilledNewArrayRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/passes/FilledNewArrayRewriter.java
@@ -4,10 +4,10 @@
 
 package com.android.tools.r8.ir.conversion.passes;
 
-import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.graph.AppInfo;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
+import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexItem;
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.graph.DexType;
@@ -28,6 +28,7 @@
 import com.android.tools.r8.ir.code.NewArrayFilled;
 import com.android.tools.r8.ir.code.NewArrayFilledData;
 import com.android.tools.r8.ir.code.Position;
+import com.android.tools.r8.ir.code.StaticGet;
 import com.android.tools.r8.ir.code.Value;
 import com.android.tools.r8.ir.conversion.passes.result.CodeRewriterResult;
 import com.android.tools.r8.utils.InternalOptions.RewriteArrayOptions;
@@ -303,13 +304,15 @@
 
   private static class ConstantMaterializingInstructionCache {
 
-    // All DEX aput instructions takes an 8-bit wide register value for the source.
-    private final int MAX_MATERIALIZING_CONSTANTS = Constants.U8BIT_MAX - 16;
+    private final RewriteArrayOptions rewriteArrayOptions;
+
     // Track constants as DexItems, DexString for string constants and DexType for class constants.
     private final Map<DexItem, Integer> constantOccurrences = new IdentityHashMap<>();
     private final Map<DexItem, Value> constantValue = new IdentityHashMap<>();
 
-    private ConstantMaterializingInstructionCache(NewArrayFilled newArrayFilled) {
+    private ConstantMaterializingInstructionCache(
+        RewriteArrayOptions rewriteArrayOptions, NewArrayFilled newArrayFilled) {
+      this.rewriteArrayOptions = rewriteArrayOptions;
       for (Value elementValue : newArrayFilled.inValues()) {
         if (elementValue.hasAnyUsers()) {
           continue;
@@ -318,6 +321,8 @@
           addOccurrence(elementValue.getDefinition().asConstString().getValue());
         } else if (elementValue.isConstClass()) {
           addOccurrence(elementValue.getDefinition().asConstClass().getValue());
+        } else if (elementValue.isDefinedByInstructionSatisfying(Instruction::isStaticGet)) {
+          addOccurrence(elementValue.getDefinition().asStaticGet().getField());
         }
         // Don't canonicalize numbers, as on DEX FilledNewArray is supported for primitives
         // on all versions.
@@ -339,25 +344,45 @@
           seenOcourence(type);
           return value;
         }
+      } else if (elementValue.isDefinedByInstructionSatisfying(Instruction::isStaticGet)) {
+        DexField field = elementValue.getDefinition().asStaticGet().getField();
+        Value value = constantValue.get(field);
+        if (value != null) {
+          seenOcourence(field);
+          return value;
+        }
       }
       return null;
     }
 
+    // Order: String > field > class.
     private DexItem smallestConstant(DexItem c1, DexItem c2) {
       if (c1 instanceof DexString) {
         if (c2 instanceof DexString) {
           return ((DexString) c1).compareTo((DexString) c2) < 0 ? c1 : c2;
         } else {
-          assert c2 instanceof DexType;
-          return c2; // String larger than class.
+          assert c2 instanceof DexField || c2 instanceof DexType;
+          return c2; // String larger than field and class.
+        }
+      } else if (c1 instanceof DexField) {
+        if (c2 instanceof DexField) {
+          return ((DexField) c1).compareTo((DexField) c2) < 0 ? c1 : c2;
+        } else {
+          // Field less than string, larger than class
+          if (c2 instanceof DexString) {
+            return c1;
+          } else {
+            assert c2 instanceof DexType;
+            return c2;
+          }
         }
       } else {
         assert c1 instanceof DexType;
         if (c2 instanceof DexType) {
           return ((DexType) c1).compareTo((DexType) c2) < 0 ? c1 : c2;
         } else {
-          assert c2 instanceof DexString;
-          return c1; // String larger than class.
+          assert c2 instanceof DexString || c2 instanceof DexField;
+          return c1; // Class less than string and field.
         }
       }
     }
@@ -366,6 +391,8 @@
       Instruction instruction = value.getDefinition();
       if (instruction.isConstString()) {
         return instruction.asConstString().getValue();
+      } else if (instruction.isStaticGet()) {
+        return instruction.asStaticGet().getField();
       } else {
         assert instruction.isConstClass();
         return instruction.asConstClass().getValue();
@@ -376,10 +403,10 @@
       DexItem constant = getConstant(value);
       assert constantOccurrences.containsKey(constant);
       assert !constantValue.containsKey(constant);
-      if (constantValue.size() < MAX_MATERIALIZING_CONSTANTS) {
+      if (constantValue.size() < rewriteArrayOptions.maxMaterializingConstants) {
         constantValue.put(constant, value);
       } else {
-        assert constantValue.size() == MAX_MATERIALIZING_CONSTANTS;
+        assert constantValue.size() == rewriteArrayOptions.maxMaterializingConstants;
         // Find the least valuable active constant.
         int leastOccurrences = Integer.MAX_VALUE;
         DexItem valueWithLeastOccurrences = null;
@@ -403,7 +430,7 @@
           constantValue.remove(valueWithLeastOccurrences);
           constantValue.put(constant, value);
         }
-        assert constantValue.size() == MAX_MATERIALIZING_CONSTANTS;
+        assert constantValue.size() == rewriteArrayOptions.maxMaterializingConstants;
       }
       seenOcourence(constant);
     }
@@ -437,7 +464,7 @@
     NewArrayEmpty newArrayEmpty = rewriteToNewArrayEmpty(code, instructionIterator, newArrayFilled);
 
     ConstantMaterializingInstructionCache constantMaterializingInstructionCache =
-        new ConstantMaterializingInstructionCache(newArrayFilled);
+        new ConstantMaterializingInstructionCache(rewriteArrayOptions, newArrayFilled);
 
     int index = 0;
     for (Value elementValue : newArrayFilled.inValues()) {
@@ -484,25 +511,29 @@
     if (elementValue.hasAnyUsers()
         || !(elementValue.isConstString()
             || elementValue.isConstNumber()
-            || elementValue.isConstClass())) {
+            || elementValue.isConstClass()
+            || elementValue.isDefinedByInstructionSatisfying(Instruction::isStaticGet))) {
       return elementValue;
     }
 
     Value existingValue = constantMaterializingInstructionCache.getValue(elementValue);
     if (existingValue != null) {
-      addToRemove(elementValue.definition);
+      addToRemove(elementValue.getDefinition());
       return existingValue;
     }
 
     Instruction copy;
     if (elementValue.isConstNumber()) {
-      copy = ConstNumber.copyOf(code, elementValue.definition.asConstNumber());
+      copy = ConstNumber.copyOf(code, elementValue.getDefinition().asConstNumber());
     } else if (elementValue.isConstString()) {
-      copy = ConstString.copyOf(code, elementValue.definition.asConstString());
+      copy = ConstString.copyOf(code, elementValue.getDefinition().asConstString());
       constantMaterializingInstructionCache.putNewValue(copy.asConstString().outValue());
     } else if (elementValue.isConstClass()) {
-      copy = ConstClass.copyOf(code, elementValue.definition.asConstClass());
+      copy = ConstClass.copyOf(code, elementValue.getDefinition().asConstClass());
       constantMaterializingInstructionCache.putNewValue(copy.asConstClass().outValue());
+    } else if (elementValue.isDefinedByInstructionSatisfying(Instruction::isStaticGet)) {
+      copy = StaticGet.copyOf(code, elementValue.getDefinition().asStaticGet());
+      constantMaterializingInstructionCache.putNewValue(copy.asStaticGet().outValue());
     } else {
       assert false;
       return elementValue;
@@ -510,7 +541,7 @@
     copy.setBlock(instructionIterator.getBlock());
     copy.setPosition(newArrayEmpty.getPosition());
     instructionIterator.add(copy);
-    addToRemove(elementValue.definition);
+    addToRemove(elementValue.getDefinition());
     return copy.outValue();
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/AssumeInserter.java b/src/main/java/com/android/tools/r8/ir/optimize/AssumeInserter.java
index 0680915..21abec1 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/AssumeInserter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/AssumeInserter.java
@@ -250,12 +250,13 @@
       }
     }
 
-    if (singleTarget == null) {
+    MethodOptimizationInfo optimizationInfo =
+        resolutionResult.getOptimizationInfo(appView, invoke, singleTarget);
+    if (optimizationInfo.isDefault()) {
       return false;
     }
 
     boolean needsAssumeInstruction = false;
-    MethodOptimizationInfo optimizationInfo = singleTarget.getDefinition().getOptimizationInfo();
 
     // Case (2), invocations that are guaranteed to return a non-null value.
     if (invoke.hasUsedOutValue()) {
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/ConstantCanonicalizer.java b/src/main/java/com/android/tools/r8/ir/optimize/ConstantCanonicalizer.java
index 6405fb1..cdd49d1 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/ConstantCanonicalizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/ConstantCanonicalizer.java
@@ -74,6 +74,7 @@
   private Set<InstanceGet> ineligibleInstanceGetInstructions;
 
   public ConstantCanonicalizer(AppView<?> appView, ProgramMethod context, IRCode code) {
+    assert appView.options().isGeneratingDex();
     this.appView = appView;
     this.branchSimplifier = new BranchSimplifier(appView);
     this.context = context;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultMethodOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultMethodOptimizationInfo.java
index f596d2a..ea5f65d 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultMethodOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/DefaultMethodOptimizationInfo.java
@@ -33,7 +33,6 @@
   static final int UNKNOWN_RETURNED_ARGUMENT = -1;
   static final boolean UNKNOWN_NEVER_RETURNS_NORMALLY = false;
   static final AbstractValue UNKNOWN_ABSTRACT_RETURN_VALUE = UnknownValue.getInstance();
-  static final boolean UNKNOWN_TRIGGERS_CLASS_INIT_BEFORE_ANY_SIDE_EFFECT = false;
   static final boolean UNKNOWN_INITIALIZER_ENABLING_JAVA_ASSERTIONS = false;
   static final boolean UNKNOWN_MAY_HAVE_SIDE_EFFECTS = true;
   static final boolean UNKNOWN_RETURN_VALUE_ONLY_DEPENDS_ON_ARGUMENTS = false;
@@ -47,6 +46,11 @@
   }
 
   @Override
+  public boolean isDefault() {
+    return true;
+  }
+
+  @Override
   public boolean cannotBeKept() {
     return false;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfo.java
index 31775ae..6a2bc86 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfo.java
@@ -28,6 +28,10 @@
     Default
   }
 
+  public boolean isDefault() {
+    return false;
+  }
+
   public abstract boolean cannotBeKept();
 
   public abstract boolean classInitializerMayBePostponed();
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodResolutionOptimizationInfoCollection.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodResolutionOptimizationInfoCollection.java
new file mode 100644
index 0000000..6c2c13b
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodResolutionOptimizationInfoCollection.java
@@ -0,0 +1,43 @@
+// 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.ir.optimize.info;
+
+import com.android.tools.r8.graph.DexClass;
+import com.android.tools.r8.graph.DexEncodedMethod;
+import com.android.tools.r8.graph.DexReference;
+import java.util.Collections;
+import java.util.Map;
+
+/**
+ * Collection of optimization info for virtual methods with dynamic dispatch.
+ *
+ * <p>When a call to a virtual method does not have a single target, we cannot use the optimization
+ * info we compute for each method. Given the resolved method, this collection returns a piece of
+ * optimization info that is true for all possible dispatch targets (i.e., the join of the
+ * optimization of all possible dispatch targets).
+ */
+public class MethodResolutionOptimizationInfoCollection {
+
+  private static final MethodResolutionOptimizationInfoCollection EMPTY =
+      new MethodResolutionOptimizationInfoCollection(Collections.emptyMap());
+
+  private final Map<DexReference, MethodOptimizationInfo> backing;
+
+  MethodResolutionOptimizationInfoCollection(Map<DexReference, MethodOptimizationInfo> backing) {
+    this.backing = backing;
+  }
+
+  public static MethodResolutionOptimizationInfoCollection empty() {
+    return EMPTY;
+  }
+
+  public MethodOptimizationInfo get(DexEncodedMethod method, DexClass holder) {
+    MethodOptimizationInfo defaultValue = DefaultMethodOptimizationInfo.getInstance();
+    if (!holder.isProgramClass()) {
+      return defaultValue;
+    }
+    return backing.getOrDefault(method.getReference(), defaultValue);
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/StackTraceRegularExpressionParser.java b/src/main/java/com/android/tools/r8/retrace/internal/StackTraceRegularExpressionParser.java
index 720562d..d9935ac 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/StackTraceRegularExpressionParser.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/StackTraceRegularExpressionParser.java
@@ -158,7 +158,10 @@
     }
   }
 
-  private static final String identifierSegment = "[^\\s\\[;(<]+";
+  private static final String notAllowedCharacters = "\\s\\[;:(<";
+  private static final String identifierPrefix = "[^\\d" + notAllowedCharacters + "]";
+  private static final String identifierSuffix = "[^" + notAllowedCharacters + "]*";
+  private static final String identifierSegment = identifierPrefix + identifierSuffix;
 
   private static final String METHOD_NAME_REGULAR_EXPRESSION =
       "(?:(" + identifierSegment + "|\\<init\\>|\\<clinit\\>))";
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index de7a1b5..38bb45b 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -27,6 +27,7 @@
 import com.android.tools.r8.cf.CfVersion;
 import com.android.tools.r8.debuginfo.DebugRepresentation;
 import com.android.tools.r8.dex.ApplicationReader.ProgramClassConflictResolver;
+import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.dex.Marker;
 import com.android.tools.r8.dex.Marker.Backend;
 import com.android.tools.r8.dex.Marker.Tool;
@@ -173,7 +174,7 @@
     }
   }
 
-  public static final CfVersion SUPPORTED_CF_VERSION = CfVersion.V21;
+  public static final CfVersion SUPPORTED_CF_VERSION = CfVersion.V22;
 
   public static final int SUPPORTED_DEX_VERSION =
       AndroidApiLevel.LATEST.getDexVersion().getIntValue();
@@ -1551,6 +1552,8 @@
     public int maxSizeForFilledNewArrayOfInts = 200;
     public int maxSizeForFilledNewArrayOfIntsWhenNewArrayFilledDataApplicable = 5;
     public int maxSizeForFilledNewArrayOfReferences = 200;
+    // All DEX aput instructions takes an 8-bit wide register value for the source.
+    public int maxMaterializingConstants = Constants.U8BIT_MAX - 16;
 
     // Arbitrary limits of number of inputs to fill-array-data.
     public int minSizeForFilledArrayData = 2;
@@ -1747,18 +1750,9 @@
         return simpleInliningInstructionLimit;
       }
       // Allow 4 instructions when using LIR regardless of backend.
-      if (options.testing.useLir) {
-        // TODO(b/288226522): We should reevaluate this for size and other inputs as it regresses
-        //  compared to DEX code with limit 5 for tivi. This is set to 5 to avoid discard errors
-        //  in chrome. Using 5 also improves size for chrome compared to a lower value.
-        return 5;
-      }
-      // Allow 3 instructions when generating to class files.
-      if (options.isGeneratingClassFiles()) {
-        return 3;
-      }
-      // Allow the size of the dex code to be up to 5 bytes.
-      assert options.isGeneratingDex();
+      // TODO(b/288226522): We should reevaluate this for size and other inputs as it regresses
+      //  compared to DEX code with limit 5 for tivi. This is set to 5 to avoid discard errors
+      //  in chrome. Using 5 also improves size for chrome compared to a lower value.
       return 5;
     }
 
@@ -2144,19 +2138,9 @@
   public static class TestingOptions {
 
     public boolean roundtripThroughLir = false;
-    private boolean useLir = System.getProperty("com.android.tools.r8.nolir") == null;
-    private boolean convertLir = System.getProperty("com.android.tools.r8.convertlir") == null;
-
-    public void enableLir() {
-      useLir = true;
-    }
-
-    public void disableLir() {
-      useLir = false;
-    }
 
     public boolean canUseLir(AppView<?> appView) {
-      return useLir && appView.enableWholeProgramOptimizations();
+      return appView.enableWholeProgramOptimizations();
     }
 
     // As part of integrating LIR the compiler is split in three phases: pre, supported, and post.
@@ -2173,7 +2157,7 @@
         throws ExecutionException {
       assert isPreLirPhase();
       currentPhase = LirPhase.SUPPORTED;
-      if (!canUseLir(appView) || !convertLir) {
+      if (!canUseLir(appView)) {
         return;
       }
       // Convert code objects to LIR.
diff --git a/src/main/java/com/android/tools/r8/utils/OptionalBool.java b/src/main/java/com/android/tools/r8/utils/OptionalBool.java
index 4443355..06cd098 100644
--- a/src/main/java/com/android/tools/r8/utils/OptionalBool.java
+++ b/src/main/java/com/android/tools/r8/utils/OptionalBool.java
@@ -15,6 +15,11 @@
         }
 
         @Override
+        public boolean toBoolean() {
+          return true;
+        }
+
+        @Override
         public int ordinal() {
           return 1;
         }
@@ -34,6 +39,11 @@
         }
 
         @Override
+        public boolean toBoolean() {
+          return false;
+        }
+
+        @Override
         public int ordinal() {
           return 0;
         }
@@ -53,6 +63,11 @@
         }
 
         @Override
+        public boolean toBoolean() {
+          throw new IllegalStateException("Cannot convert UNKNOWN to boolean");
+        }
+
+        @Override
         public int ordinal() {
           return 2;
         }
@@ -78,6 +93,8 @@
     return this;
   }
 
+  public abstract boolean toBoolean();
+
   @Override
   public boolean equals(Object other) {
     return this == other;
diff --git a/src/test/bootstrap/com/android/tools/r8/bootstrap/BootstrapCurrentEqualityTest.java b/src/test/bootstrap/com/android/tools/r8/bootstrap/BootstrapCurrentEqualityTest.java
index 34c1623..a6c99f8 100644
--- a/src/test/bootstrap/com/android/tools/r8/bootstrap/BootstrapCurrentEqualityTest.java
+++ b/src/test/bootstrap/com/android/tools/r8/bootstrap/BootstrapCurrentEqualityTest.java
@@ -22,8 +22,6 @@
 import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.ProcessResult;
-import com.android.tools.r8.dex.Marker.Backend;
-import com.android.tools.r8.examples.hello.HelloTestRunner;
 import com.android.tools.r8.retrace.ProguardMapProducer;
 import com.android.tools.r8.retrace.ProguardMappingSupplier;
 import com.android.tools.r8.retrace.Retrace;
@@ -51,17 +49,24 @@
 @RunWith(Parameterized.class)
 public class BootstrapCurrentEqualityTest extends TestBase {
 
+  static class HelloWorldProgram {
+    public static void main(String[] args) {
+      System.out.println("Hello, world!");
+    }
+  }
+
   private static final Path MAIN_KEEP =
       Paths.get(ToolHelper.getProjectRoot(), "src", "main", "keep.txt");
 
-  private static final String HELLO_NAME = HelloTestRunner.getHelloClass().getTypeName();
+  private static final Class<?> HELLO_CLASS = HelloWorldProgram.class;
+  private static final String HELLO_NAME = typeName(HELLO_CLASS);
   private static final String[] KEEP_HELLO = {
     "-keep class " + HELLO_NAME + " {",
     "  public static void main(...);",
     "}",
     "-allowaccessmodification"
   };
-  private static String HELLO_EXPECTED = HelloTestRunner.getExpectedOutput();
+  private static String HELLO_EXPECTED = StringUtils.lines("Hello, world!");
 
   private static Pair<Path, Path> r8R8Debug;
   private static Pair<Path, Path> r8R8Release;
@@ -203,7 +208,8 @@
 
   @Test
   public void test() throws Exception {
-    Path program = HelloTestRunner.writeHelloProgramJar(temp);
+    Path program = testFolder.newFolder().toPath().resolve("hello.jar");
+    writeClassesToJar(program, HELLO_CLASS);
     testForJvm(parameters)
         .addProgramFiles(program)
         .run(parameters.getRuntime(), HELLO_NAME)
diff --git a/src/test/bootstrap/com/android/tools/r8/bootstrap/HelloWorldCompiledOnArtTest.java b/src/test/bootstrap/com/android/tools/r8/bootstrap/HelloWorldCompiledOnArtTest.java
index 9541dd4..31a8108 100644
--- a/src/test/bootstrap/com/android/tools/r8/bootstrap/HelloWorldCompiledOnArtTest.java
+++ b/src/test/bootstrap/com/android/tools/r8/bootstrap/HelloWorldCompiledOnArtTest.java
@@ -19,8 +19,8 @@
 import com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification;
 import com.android.tools.r8.desugar.desugaredlibrary.test.DesugaredLibraryTestCompileResult;
 import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification;
-import com.android.tools.r8.examples.hello.HelloTestRunner;
 import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.StringUtils;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
 import java.nio.file.Path;
@@ -34,6 +34,16 @@
 @RunWith(Parameterized.class)
 public class HelloWorldCompiledOnArtTest extends DesugaredLibraryTestBase {
 
+  static class HelloWorldProgram {
+    public static void main(String[] args) {
+      System.out.println("Hello, world!");
+    }
+  }
+
+  private static final Class<?> HELLO_CLASS = HelloWorldProgram.class;
+  private static final String HELLO_NAME = typeName(HELLO_CLASS);
+  private static String HELLO_EXPECTED = StringUtils.lines("Hello, world!");
+
   private final TestParameters parameters;
   private final CompilationSpecification compilationSpecification;
   private final LibraryDesugaringSpecification libraryDesugaringSpecification;
@@ -62,13 +72,17 @@
     return Paths.get(string).toAbsolutePath().toString();
   }
 
-  private static final String HELLO_NAME = typeName(HelloTestRunner.getHelloClass());
+  private Path writeHelloProgramJar() throws IOException {
+    Path jar = temp.newFolder().toPath().resolve("hello.jar");
+    writeClassesToJar(jar, HELLO_CLASS);
+    return jar;
+  }
 
   @Test
   public void testHelloCompiledWithR8Dex() throws Exception {
     Path keepRules =
         writeTextToTempFile(keepMainProguardConfiguration(HELLO_NAME)).toAbsolutePath();
-    Path helloInput = HelloTestRunner.writeHelloProgramJar(temp);
+    Path helloInput = writeHelloProgramJar().toAbsolutePath();
     Path helloOutput = temp.newFolder("helloOutput").toPath().resolve("out.zip").toAbsolutePath();
     compileR8ToDexWithD8()
         .run(
@@ -88,7 +102,7 @@
 
   @Test
   public void testHelloCompiledWithD8Dex() throws Exception {
-    Path helloInput = HelloTestRunner.writeHelloProgramJar(temp).toAbsolutePath();
+    Path helloInput = writeHelloProgramJar().toAbsolutePath();
     Path helloOutput = temp.newFolder("helloOutput").toPath().resolve("out.zip").toAbsolutePath();
     compileR8ToDexWithD8()
         .run(
@@ -106,7 +120,7 @@
 
   private void verifyResult(Path helloOutput) throws IOException {
     ProcessResult processResult = ToolHelper.runArtRaw(helloOutput.toString(), HELLO_NAME);
-    assertEquals(HelloTestRunner.getExpectedOutput(), processResult.stdout);
+    assertEquals(HELLO_EXPECTED, processResult.stdout);
   }
 
   private DesugaredLibraryTestCompileResult<?> compileR8ToDexWithD8() throws Exception {
diff --git a/src/test/bootstrap/com/android/tools/r8/bootstrap/Java17R8BootstrapTest.java b/src/test/bootstrap/com/android/tools/r8/bootstrap/Java17R8BootstrapTest.java
index 6ef44bf..d410299 100644
--- a/src/test/bootstrap/com/android/tools/r8/bootstrap/Java17R8BootstrapTest.java
+++ b/src/test/bootstrap/com/android/tools/r8/bootstrap/Java17R8BootstrapTest.java
@@ -13,8 +13,8 @@
 import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.LibraryFilesHelper;
-import com.android.tools.r8.examples.hello.HelloTestRunner;
 import com.google.common.collect.ImmutableList;
+import java.io.IOException;
 import java.nio.file.Path;
 import org.junit.Assume;
 import org.junit.BeforeClass;
@@ -33,7 +33,13 @@
 @RunWith(Parameterized.class)
 public class Java17R8BootstrapTest extends TestBase {
 
-  private static final Class<?> HELLO_CLASS = HelloTestRunner.getHelloClass();
+  static class HelloWorldProgram {
+    public static void main(String[] args) {
+      System.out.println("Hello, world!");
+    }
+  }
+
+  private static final Class<?> HELLO_CLASS = HelloWorldProgram.class;
   private static final String[] HELLO_KEEP = {
     "-keep class " + HELLO_CLASS.getTypeName() + " {  public static void main(...);}"
   };
@@ -77,6 +83,12 @@
     return new Path[] {ToolHelper.R8_WITH_RELOCATED_DEPS_17_JAR, r8Lib17NoDesugar, r8Lib17Desugar};
   }
 
+  private Path writeHelloProgramJar() throws IOException {
+    Path jar = temp.newFolder().toPath().resolve("hello.jar");
+    writeClassesToJar(jar, HELLO_CLASS);
+    return jar;
+  }
+
   @Test
   public void testHello() throws Exception {
     Assume.assumeTrue(!ToolHelper.isWindows());
@@ -84,7 +96,7 @@
     Assume.assumeTrue(supportsSealedClassesWhenGeneratingCf());
     Path prevGeneratedJar = null;
     String prevRunResult = null;
-    Path helloJar = HelloTestRunner.writeHelloProgramJar(temp);
+    Path helloJar = writeHelloProgramJar();
     for (Path jar : jarsToCompare()) {
       Path generatedJar =
           testForExternalR8(Backend.CF, parameters.getRuntime())
@@ -119,7 +131,7 @@
     Assume.assumeTrue(JavaBootstrapUtils.exists(ToolHelper.R8_WITH_RELOCATED_DEPS_17_JAR));
     Assume.assumeTrue(supportsSealedClassesWhenGeneratingCf());
     Path prevGeneratedJar = null;
-    Path helloJar = HelloTestRunner.writeHelloProgramJar(temp);
+    Path helloJar = writeHelloProgramJar();
     for (Path jar : jarsToCompare()) {
       Path generatedJar =
           testForExternalR8(Backend.CF, parameters.getRuntime())
diff --git a/src/test/bootstrap/com/android/tools/r8/bootstrap/RetraceStackTraceFunctionalCompositionTest.java b/src/test/bootstrap/com/android/tools/r8/bootstrap/RetraceStackTraceFunctionalCompositionTest.java
index a5c56c1..7fcb455 100644
--- a/src/test/bootstrap/com/android/tools/r8/bootstrap/RetraceStackTraceFunctionalCompositionTest.java
+++ b/src/test/bootstrap/com/android/tools/r8/bootstrap/RetraceStackTraceFunctionalCompositionTest.java
@@ -274,7 +274,7 @@
         .apply(
             b ->
                 b.getBuilder()
-                    .setProguardInputMapFile(previousMappingFile)
+                    .setProguardMapInputFile(previousMappingFile)
                     .setProguardMapConsumer((string, handler) -> mappingComposed.append(string)))
         .compile()
         .writeToZip(jar);
diff --git a/src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java
index d3a155f..1d09697 100644
--- a/src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java
@@ -156,8 +156,7 @@
 
     Path getGeneratedRoot(Path testJarFile) {
       String sourceSet = testJarFile.getParent().toFile().getName();
-      Path parent = testJarFile.getParent().getParent().getParent();
-      return parent.resolve(Paths.get("generated", sourceSet, packageName));
+      return Paths.get(ToolHelper.THIRD_PARTY_DIR, sourceSet + "Generated", packageName);
     }
 
     AndroidApp compileClassFilesInIntermediate(
diff --git a/src/test/java/com/android/tools/r8/D8NonLazyRunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/D8NonLazyRunExamplesAndroidOTest.java
index c87ad97..7fc01c3 100644
--- a/src/test/java/com/android/tools/r8/D8NonLazyRunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/D8NonLazyRunExamplesAndroidOTest.java
@@ -6,8 +6,7 @@
 
 import java.nio.file.Path;
 
-public class D8NonLazyRunExamplesAndroidOTest
-    extends D8IncrementalRunExamplesAndroidOTest {
+public class D8NonLazyRunExamplesAndroidOTest extends D8IncrementalRunExamplesAndroidOTest {
   class D8LazyTestRunner extends D8IncrementalTestRunner {
 
     D8LazyTestRunner(String testName, String packageName, String mainClass) {
diff --git a/src/test/java/com/android/tools/r8/KotlinCompilerTool.java b/src/test/java/com/android/tools/r8/KotlinCompilerTool.java
index 642e319..e549627 100644
--- a/src/test/java/com/android/tools/r8/KotlinCompilerTool.java
+++ b/src/test/java/com/android/tools/r8/KotlinCompilerTool.java
@@ -12,13 +12,20 @@
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.TestRuntime.CfRuntime;
+import com.android.tools.r8.ToolHelper.CacheLookupKey;
+import com.android.tools.r8.ToolHelper.CommandResultCache;
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.errors.Unimplemented;
 import com.android.tools.r8.utils.ArrayUtils;
 import com.android.tools.r8.utils.FileUtils;
+import com.android.tools.r8.utils.Pair;
+import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.ThrowingConsumer;
 import com.android.tools.r8.utils.structural.Ordered;
+import com.google.common.hash.Hasher;
 import java.io.File;
 import java.io.IOException;
+import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -339,7 +346,45 @@
   }
 
   private ProcessResult compileInternal(Path output) throws IOException {
-    List<String> cmdline = new ArrayList<>();
+    CommandLineAndHasherConsumers commandLineAndHasherConsumers =
+        buildCommandLineAndHasherConsumers(output);
+    CacheLookupKey cacheLookupKey = null;
+    if (CommandResultCache.isEnabled()) {
+      cacheLookupKey =
+          new CacheLookupKey(
+              hasher ->
+                  commandLineAndHasherConsumers.hasherConsumers.forEach(
+                      hasherConsumer -> hasherConsumer.acceptWithRuntimeException(hasher)));
+      Pair<ProcessResult, Path> lookupResult =
+          CommandResultCache.getInstance().lookup(cacheLookupKey);
+      if (lookupResult != null
+          && lookupResult.getFirst().exitCode == 0
+          && lookupResult.getSecond() != null) {
+        Files.copy(lookupResult.getSecond(), output);
+        return lookupResult.getFirst();
+      }
+    }
+    ProcessBuilder builder = new ProcessBuilder(commandLineAndHasherConsumers.cmdline);
+    if (ToolHelper.isNewGradleSetup()) {
+      builder.directory(new File(ToolHelper.getProjectRoot()));
+    }
+    ProcessResult processResult = ToolHelper.runProcess(builder);
+    if (CommandResultCache.isEnabled() && output.toFile().isFile()) {
+      CommandResultCache.getInstance().putResult(processResult, cacheLookupKey, output);
+    }
+    return processResult;
+  }
+
+  public static class CommandLineAndHasherConsumers {
+    final List<String> cmdline = new ArrayList<>();
+    final List<ThrowingConsumer<Hasher, IOException>> hasherConsumers = new ArrayList<>();
+  }
+
+  private CommandLineAndHasherConsumers buildCommandLineAndHasherConsumers(Path output)
+      throws IOException {
+    CommandLineAndHasherConsumers commandLineAndHasherConsumers =
+        new CommandLineAndHasherConsumers();
+    List<String> cmdline = commandLineAndHasherConsumers.cmdline;
     cmdline.add(jdk.getJavaExecutable().toString());
     if (enableAssertions) {
       cmdline.add("-ea");
@@ -354,8 +399,15 @@
     cmdline.add(jdk.getJavaHome().toString());
     cmdline.add("-jvm-target");
     cmdline.add(targetVersion.getJvmTargetString());
+    // Until now this is just command line files, no inputs, hash existing command
+    String noneFileCommandLineArguments = StringUtils.join("", cmdline);
+    commandLineAndHasherConsumers.hasherConsumers.add(
+        hasher -> hasher.putString(noneFileCommandLineArguments, StandardCharsets.UTF_8));
+
     for (Path source : sources) {
       cmdline.add(source.toString());
+      commandLineAndHasherConsumers.hasherConsumers.add(
+          hasher -> hasher.putBytes(Files.readAllBytes(source)));
     }
     cmdline.add("-d");
     cmdline.add(output.toString());
@@ -365,12 +417,19 @@
           .stream()
           .map(Path::toString)
           .collect(Collectors.joining(isWindows() ? ";" : ":")));
+      for (Path path : classpath) {
+        commandLineAndHasherConsumers.hasherConsumers.add(
+            hasher -> {
+              hasher.putString("--cp", StandardCharsets.UTF_8);
+              hasher.putBytes(Files.readAllBytes(path));
+            });
+      }
     }
     cmdline.addAll(additionalArguments);
-    ProcessBuilder builder = new ProcessBuilder(cmdline);
-    if (ToolHelper.isNewGradleSetup()) {
-      builder.directory(new File(ToolHelper.getProjectRoot()));
-    }
-    return ToolHelper.runProcess(builder);
+    commandLineAndHasherConsumers.hasherConsumers.add(
+        hasher -> additionalArguments.forEach(s -> hasher.putString(s, StandardCharsets.UTF_8)));
+    return commandLineAndHasherConsumers;
   }
+
+
 }
diff --git a/src/test/java/com/android/tools/r8/KotlinTestBase.java b/src/test/java/com/android/tools/r8/KotlinTestBase.java
index f314547..a98d7f0 100644
--- a/src/test/java/com/android/tools/r8/KotlinTestBase.java
+++ b/src/test/java/com/android/tools/r8/KotlinTestBase.java
@@ -24,7 +24,6 @@
 import java.util.Map;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
-import org.hamcrest.Matcher;
 import org.junit.rules.TemporaryFolder;
 
 public abstract class KotlinTestBase extends TestBase {
@@ -91,15 +90,7 @@
   }
 
   protected Path getJavaJarFile(String folder) {
-    return Paths.get(ToolHelper.TESTS_BUILD_DIR, RSRC, folder + FileUtils.JAR_EXTENSION);
-  }
-
-  protected Path getMappingfile(String folder, String mappingFileName) {
-    return Paths.get(ToolHelper.TESTS_DIR, RSRC, folder, mappingFileName);
-  }
-
-  protected static Matcher<String> expectedInfoMessagesFromKotlinStdLib() {
-    return containsString("No VersionRequirement");
+    return Paths.get(ToolHelper.THIRD_PARTY_DIR, RSRC, folder + FileUtils.JAR_EXTENSION);
   }
 
   protected KotlinCompilerTool kotlinCompilerTool() {
diff --git a/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
index 9acb6cf..f2979f2 100644
--- a/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
@@ -132,7 +132,6 @@
         .run(Paths.get(ToolHelper.THIRD_PARTY_DIR, "examplesAndroidOLegacy"));
 
     test("lambdadesugaring", "lambdadesugaring", "LambdaDesugaring")
-        .withOptionConsumer(o -> o.testing.enableLir())
         .withMinApiLevel(ToolHelper.getMinApiLevelForDexVmNoHigherThan(AndroidApiLevel.K))
         .withBuilderTransformation(
             b -> b.addProguardConfiguration(PROGUARD_OPTIONS, Origin.unknown()))
@@ -173,7 +172,6 @@
 
     test("lambdadesugaring", "lambdadesugaring", "LambdaDesugaring")
         .withMinApiLevel(AndroidApiLevel.N)
-        .withOptionConsumer(opts -> opts.testing.enableLir())
         .withBuilderTransformation(
             b -> b.addProguardConfiguration(PROGUARD_OPTIONS, Origin.unknown()))
         .withDexCheck(inspector -> checkLambdaCount(inspector, 1, "lambdadesugaring"))
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 8f31142..f550b71 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8;
 
+import static com.android.tools.r8.ToolHelper.TestDataSourceSet.computeLegacyOrGradleSpecifiedLocation;
 import static com.android.tools.r8.utils.FileUtils.CLASS_EXTENSION;
 import static com.android.tools.r8.utils.FileUtils.JAVA_EXTENSION;
 import static com.android.tools.r8.utils.FileUtils.isDexFile;
@@ -39,6 +40,7 @@
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.ListUtils;
+import com.android.tools.r8.utils.Pair;
 import com.android.tools.r8.utils.Reporter;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.Timing;
@@ -95,7 +97,7 @@
 public class ToolHelper {
 
   public static boolean isNewGradleSetup() {
-    return "true".equals(System.getenv("USE_NEW_GRADLE_SETUP"));
+    return "true".equals(System.getProperty("USE_NEW_GRADLE_SETUP"));
   }
 
   public static String getProjectRoot() {
@@ -109,12 +111,48 @@
     return current + "/";
   }
 
+  public enum TestDataSourceSet {
+    LEGACY(null),
+    TESTS_JAVA_8("tests_java_8/build/classes/java/test"),
+    TESTS_BOOTSTRAP("tests_bootstrap/build/classes/java/test"),
+    SPECIFIED_BY_GRADLE_PROPERTY(null);
+
+    private final String destination;
+
+    TestDataSourceSet(String destination) {
+      this.destination = destination;
+    }
+
+    public boolean isLegacy() {
+      return this == LEGACY;
+    }
+
+    public boolean isSpecifiedByGradleProperty() {
+      return this == SPECIFIED_BY_GRADLE_PROPERTY;
+    }
+
+    public Path getBuildDir() {
+      if (isLegacy()) {
+        return Paths.get(BUILD_DIR, "classes", "java", "test");
+      } else if (isSpecifiedByGradleProperty()) {
+        assert System.getProperty("TEST_DATA_LOCATION") != null;
+        return Paths.get(System.getProperty("TEST_DATA_LOCATION"));
+      } else {
+        return Paths.get(getProjectRoot(), "d8_r8", "test_modules", destination);
+      }
+    }
+
+    public static TestDataSourceSet computeLegacyOrGradleSpecifiedLocation() {
+      return isNewGradleSetup()
+          ? TestDataSourceSet.SPECIFIED_BY_GRADLE_PROPERTY
+          : TestDataSourceSet.LEGACY;
+    }
+  }
+
   public static final String SOURCE_DIR = getProjectRoot() + "src/";
   public static final String MAIN_SOURCE_DIR = getProjectRoot() + "src/main/java/";
   public static final String LIBRARY_DESUGAR_SOURCE_DIR = getProjectRoot() + "src/library_desugar/";
   public static final String BUILD_DIR = getProjectRoot() + "build/";
-  public static final String TEST_MODULE_DIR = getProjectRoot() + "d8_r8/test_modules/";
-  public static final String GENERATED_TEST_BUILD_DIR = BUILD_DIR + "generated/test/";
   public static final String LIBS_DIR = BUILD_DIR + "libs/";
   public static final String THIRD_PARTY_DIR = getProjectRoot() + "third_party/";
   public static final String DEPENDENCIES = THIRD_PARTY_DIR + "dependencies/";
@@ -125,17 +163,15 @@
   public static final String EXAMPLES_DIR = TESTS_DIR + "examples/";
   public static final String EXAMPLES_ANDROID_O_DIR = TESTS_DIR + "examplesAndroidO/";
   public static final String EXAMPLES_ANDROID_P_DIR = TESTS_DIR + "examplesAndroidP/";
-  public static final String TESTS_BUILD_DIR = BUILD_DIR + "test/";
-  public static final String EXAMPLES_BUILD_DIR = TESTS_BUILD_DIR + "examples/";
+  public static final String EXAMPLES_BUILD_DIR = THIRD_PARTY_DIR + "examples/";
   public static final String EXAMPLES_CF_DIR = EXAMPLES_BUILD_DIR + "classes/";
-  public static final String EXAMPLES_ANDROID_N_BUILD_DIR = TESTS_BUILD_DIR + "examplesAndroidN/";
-  public static final String EXAMPLES_ANDROID_O_BUILD_DIR = TESTS_BUILD_DIR + "examplesAndroidO/";
-  public static final String EXAMPLES_ANDROID_P_BUILD_DIR = TESTS_BUILD_DIR + "examplesAndroidP/";
+  public static final String EXAMPLES_ANDROID_N_BUILD_DIR = THIRD_PARTY_DIR + "examplesAndroidN/";
+  public static final String EXAMPLES_ANDROID_O_BUILD_DIR = THIRD_PARTY_DIR + "examplesAndroidO/";
+  public static final String EXAMPLES_ANDROID_P_BUILD_DIR = THIRD_PARTY_DIR + "examplesAndroidP/";
+  public static final String TESTS_BUILD_DIR = BUILD_DIR + "test/";
   public static final String EXAMPLES_JAVA9_BUILD_DIR = TESTS_BUILD_DIR + "examplesJava9/";
   public static final String EXAMPLES_JAVA10_BUILD_DIR = TESTS_BUILD_DIR + "examplesJava10/";
   public static final String EXAMPLES_JAVA11_JAR_DIR = TESTS_BUILD_DIR + "examplesJava11/";
-  public static final String EXAMPLES_PROTO_BUILD_DIR = TESTS_BUILD_DIR + "examplesProto/";
-  public static final String GENERATED_PROTO_BUILD_DIR = GENERATED_TEST_BUILD_DIR + "proto/";
   public static final String SMALI_BUILD_DIR = THIRD_PARTY_DIR + "smali/";
 
   public static String getExamplesJava11BuildDir() {
@@ -453,7 +489,7 @@
     }
 
     public static DexVm fromVersion(Version version) {
-      return SHORT_NAME_MAP.get(version.shortName + "_" + Kind.HOST.toString());
+      return SHORT_NAME_MAP.get(version.shortName + "_" + Kind.HOST);
     }
 
     public boolean isEqualTo(DexVm other) {
@@ -591,7 +627,7 @@
 
     private DexVm version;
     private boolean withArtFrameworks;
-    private ArtResultCacheLookupKey artResultCacheLookupKey;
+    private CacheLookupKey artResultCacheLookupKey;
     private boolean noCaching = false;
 
     public ArtCommandBuilder() {
@@ -646,7 +682,7 @@
     }
 
     private boolean useCache() {
-      return !noCaching && CommandResultCache.getInstance() != null;
+      return !noCaching && CommandResultCache.isEnabled();
     }
 
     public void cacheResult(ProcessResult result) {
@@ -654,18 +690,20 @@
       // put invalid entries into the cache.
       if (useCache() && result.exitCode == 0) {
         assert artResultCacheLookupKey != null;
-        CommandResultCache.getInstance().putResult(result, artResultCacheLookupKey);
+        CommandResultCache.getInstance().putResult(result, artResultCacheLookupKey, null);
       }
     }
 
-    public ProcessResult getCachedResults() {
+    public ProcessResult getCachedResults() throws IOException {
       if (!useCache()) {
         return null;
       }
       assert artResultCacheLookupKey == null;
       // Reuse the key when storing results if this is not already cached.
-      artResultCacheLookupKey = new ArtResultCacheLookupKey(this::hashParts);
-      return CommandResultCache.getInstance().lookup(artResultCacheLookupKey);
+      artResultCacheLookupKey = new CacheLookupKey(this::hashParts);
+      Pair<ProcessResult, Path> lookup =
+          CommandResultCache.getInstance().lookup(artResultCacheLookupKey);
+      return lookup == null ? null : lookup.getFirst();
     }
 
     private void hashParts(Hasher hasher) {
@@ -696,11 +734,11 @@
     }
   }
 
-  private static class ArtResultCacheLookupKey {
+  public static class CacheLookupKey {
     private final Consumer<Hasher> hasherConsumer;
     private String hash;
 
-    public ArtResultCacheLookupKey(Consumer<Hasher> hasherConsumer) {
+    public CacheLookupKey(Consumer<Hasher> hasherConsumer) {
       this.hasherConsumer = hasherConsumer;
     }
 
@@ -714,7 +752,7 @@
     }
   }
 
-  private static class CommandResultCache {
+  public static class CommandResultCache {
     private static CommandResultCache INSTANCE =
         System.getProperty("command_cache_dir") != null
             ? new CommandResultCache(Paths.get(System.getProperty("command_cache_dir")))
@@ -730,16 +768,24 @@
       return INSTANCE;
     }
 
-    private Path getStdoutFile(ArtResultCacheLookupKey artResultCacheLookupKey) {
-      return path.resolve(artResultCacheLookupKey.getHash() + ".stdout");
+    public static boolean isEnabled() {
+      return getInstance() != null;
     }
 
-    private Path getStderrFile(ArtResultCacheLookupKey artResultCacheLookupKey) {
-      return path.resolve(artResultCacheLookupKey.getHash() + ".stderr");
+    private Path getStdoutFile(CacheLookupKey cacheLookupKey) {
+      return path.resolve(cacheLookupKey.getHash() + ".stdout");
     }
 
-    private Path getExitCodeFile(ArtResultCacheLookupKey artResultCacheLookupKey) {
-      return path.resolve(artResultCacheLookupKey.getHash());
+    private Path getStderrFile(CacheLookupKey cacheLookupKey) {
+      return path.resolve(cacheLookupKey.getHash() + ".stderr");
+    }
+
+    private Path getOutputFile(CacheLookupKey cacheLookupKey) {
+      return path.resolve(cacheLookupKey.getHash() + ".output");
+    }
+
+    private Path getExitCodeFile(CacheLookupKey cacheLookupKey) {
+      return path.resolve(cacheLookupKey.getHash());
     }
 
     private Path getTempFile(Path path) {
@@ -758,38 +804,47 @@
       return "";
     }
 
-    public ProcessResult lookup(ArtResultCacheLookupKey artResultCacheLookupKey) {
+    public Pair<ProcessResult, Path> lookup(CacheLookupKey cacheLookupKey) {
       // TODO Add concurrency handling!
-      Path exitCodeFile = getExitCodeFile(artResultCacheLookupKey);
+      Path exitCodeFile = getExitCodeFile(cacheLookupKey);
       if (exitCodeFile.toFile().exists()) {
         int exitCode = Integer.parseInt(getStringContent(exitCodeFile));
         // Because of the temp files and order of writing we should never get here with an
         // inconsistent state. It is possible, although unlikely, that the stdout/stderr
         // (and even exitcode if art is non deterministic) are from different, process ids etc,
         // but this should have no impact.
-        return new ProcessResult(
-            exitCode,
-            getStringContent(getStdoutFile(artResultCacheLookupKey)),
-            getStringContent(getStderrFile(artResultCacheLookupKey)));
+
+        Path outputFile = getOutputFile(cacheLookupKey);
+        return new Pair(
+            new ProcessResult(
+                exitCode,
+                getStringContent(getStdoutFile(cacheLookupKey)),
+                getStringContent(getStderrFile(cacheLookupKey))),
+            outputFile.toFile().exists() ? outputFile : null);
       }
       return null;
     }
 
-    public void putResult(ProcessResult result, ArtResultCacheLookupKey artResultCacheLookupKey) {
+    public void putResult(ProcessResult result, CacheLookupKey cacheLookupKey, Path output) {
       try {
         String exitCode = "" + result.exitCode;
         // We avoid race conditions of writing vs reading by first writing all 3 files to temp
         // files, then moving these to the result files, moving last the exitcode file (which is
         // what we use as cache present check)
-        Path exitCodeFile = getExitCodeFile(artResultCacheLookupKey);
+        Path exitCodeFile = getExitCodeFile(cacheLookupKey);
         Path exitCodeTempFile = getTempFile(exitCodeFile);
-        Path stdoutFile = getStdoutFile(artResultCacheLookupKey);
+        Path stdoutFile = getStdoutFile(cacheLookupKey);
         Path stdoutTempFile = getTempFile(stdoutFile);
-        Path stderrFile = getStderrFile(artResultCacheLookupKey);
+        Path stderrFile = getStderrFile(cacheLookupKey);
         Path stderrTempFile = getTempFile(stderrFile);
+        Path outputfile = getOutputFile(cacheLookupKey);
+        Path outputTempFile = getTempFile(outputfile);
         Files.write(exitCodeTempFile, exitCode.getBytes(StandardCharsets.UTF_8));
         Files.write(stdoutTempFile, result.stdout.getBytes(StandardCharsets.UTF_8));
         Files.write(stderrTempFile, result.stderr.getBytes(StandardCharsets.UTF_8));
+        if (output != null) {
+          Files.copy(output, outputTempFile);
+        }
         // Order is important, move exitcode file last!
         Files.move(
             stdoutTempFile,
@@ -801,6 +856,13 @@
             stderrFile,
             StandardCopyOption.ATOMIC_MOVE,
             StandardCopyOption.REPLACE_EXISTING);
+        if (output != null) {
+          Files.move(
+              outputTempFile,
+              outputfile,
+              StandardCopyOption.ATOMIC_MOVE,
+              StandardCopyOption.REPLACE_EXISTING);
+        }
         Files.move(
             exitCodeTempFile,
             exitCodeFile,
@@ -1006,11 +1068,16 @@
     }
   }
 
-  public static byte[] getClassAsBytes(Class clazz) throws IOException {
+  public static byte[] getClassAsBytes(Class<?> clazz) throws IOException {
     return Files.readAllBytes(getClassFileForTestClass(clazz));
   }
 
-  public static long getClassByteCrc(Class clazz) {
+  public static byte[] getClassAsBytes(Class<?> clazz, TestDataSourceSet dataSourceSet)
+      throws IOException {
+    return Files.readAllBytes(getClassFileForTestClass(clazz, dataSourceSet));
+  }
+
+  public static long getClassByteCrc(Class<?> clazz) {
     byte[] bytes = null;
     try {
       bytes = getClassAsBytes(clazz);
@@ -1406,12 +1473,11 @@
   }
 
   public static Path getClassPathForTests() {
-    if (isNewGradleSetup()) {
-      assert System.getenv("TEST_CLASSES_LOCATIONS") != null;
-      return Paths.get(System.getenv("TEST_CLASSES_LOCATIONS"));
-    } else {
-      return Paths.get(BUILD_DIR, "classes", "java", "test");
-    }
+    return getClassPathForTestDataSourceSet(computeLegacyOrGradleSpecifiedLocation());
+  }
+
+  public static Path getClassPathForTestDataSourceSet(TestDataSourceSet sourceSet) {
+    return sourceSet.getBuildDir();
   }
 
   private static List<String> getNamePartsForTestPackage(Package pkg) {
@@ -1456,29 +1522,41 @@
   }
 
   public static Path getClassFileForTestClass(Class<?> clazz) {
+    return getClassFileForTestClass(clazz, computeLegacyOrGradleSpecifiedLocation());
+  }
+
+  public static Path getClassFileForTestClass(Class<?> clazz, TestDataSourceSet sourceSet) {
     List<String> parts = getNamePartsForTestClass(clazz);
     Path resolve =
-        getClassPathForTests().resolve(Paths.get("", parts.toArray(StringUtils.EMPTY_ARRAY)));
+        getClassPathForTestDataSourceSet(sourceSet)
+            .resolve(Paths.get("", parts.toArray(StringUtils.EMPTY_ARRAY)));
     if (!Files.exists(resolve)) {
       throw new RuntimeException("Could not find: " + resolve.toString());
     }
     return resolve;
   }
 
-  public static Collection<Path> getClassFilesForInnerClasses(Path path) throws IOException {
-    Set<Path> paths = new HashSet<>();
-    String prefix = path.toString().replace(CLASS_EXTENSION, "$");
-    paths.addAll(
-        ToolHelper.getClassFilesForTestDirectory(
-            path.getParent(), p -> p.toString().startsWith(prefix)));
-    return paths;
-  }
-
   public static Collection<Path> getClassFilesForInnerClasses(Collection<Class<?>> classes)
       throws IOException {
+    return getClassFilesForInnerClasses(computeLegacyOrGradleSpecifiedLocation(), classes);
+  }
+
+  public static Collection<Path> getClassFilesForInnerClasses(Class<?>... classes)
+      throws IOException {
+    return getClassFilesForInnerClasses(
+        computeLegacyOrGradleSpecifiedLocation(), Arrays.asList(classes));
+  }
+
+  public static Collection<Path> getClassFilesForInnerClasses(
+      TestDataSourceSet sourceSet, Class<?>... classes) throws IOException {
+    return getClassFilesForInnerClasses(sourceSet, Arrays.asList(classes));
+  }
+
+  public static Collection<Path> getClassFilesForInnerClasses(
+      TestDataSourceSet sourceSet, Collection<Class<?>> classes) throws IOException {
     Set<Path> paths = new HashSet<>();
     for (Class<?> clazz : classes) {
-      Path path = ToolHelper.getClassFileForTestClass(clazz);
+      Path path = ToolHelper.getClassFileForTestClass(clazz, sourceSet);
       String prefix = path.toString().replace(CLASS_EXTENSION, "$");
       paths.addAll(
           ToolHelper.getClassFilesForTestDirectory(
@@ -1487,17 +1565,12 @@
     return paths;
   }
 
-  public static Collection<Path> getClassFilesForInnerClasses(Class<?>... classes)
-      throws IOException {
-    return getClassFilesForInnerClasses(Arrays.asList(classes));
-  }
-
-  public static Path getFileNameForTestClass(Class clazz) {
+  public static Path getFileNameForTestClass(Class<?> clazz) {
     List<String> parts = getNamePartsForTestClass(clazz);
     return Paths.get("", parts.toArray(StringUtils.EMPTY_ARRAY));
   }
 
-  public static String getJarEntryForTestClass(Class clazz) {
+  public static String getJarEntryForTestClass(Class<?> clazz) {
     List<String> parts = getNamePartsForTestClass(clazz);
     return String.join("/", parts);
   }
diff --git a/src/test/java/com/android/tools/r8/cf/ClassFileVersion66Test.java b/src/test/java/com/android/tools/r8/cf/ClassFileVersion66Test.java
new file mode 100644
index 0000000..d97f14c
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/cf/ClassFileVersion66Test.java
@@ -0,0 +1,53 @@
+// 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.cf;
+
+import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.StringUtils;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class ClassFileVersion66Test extends TestBase {
+
+  static final String EXPECTED = StringUtils.lines("Hello, world");
+
+  private final TestParameters parameters;
+
+  @Parameterized.Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters()
+        .withDefaultRuntimes()
+        .enableApiLevelsForCf()
+        .withApiLevel(AndroidApiLevel.B)
+        .build();
+  }
+
+  public ClassFileVersion66Test(TestParameters parameters) {
+    this.parameters = parameters;
+  }
+
+  // TODO(b/301189814): Update ASM once it has a release with v22 support.
+  @Test(expected = CompilationFailedException.class)
+  public void test() throws Exception {
+    testForD8(parameters.getBackend())
+        .addProgramClassFileData(transformer(TestClass.class).setVersion(CfVersion.V22).transform())
+        .setMinApi(parameters)
+        .run(parameters.getRuntime(), TestClass.class)
+        .assertSuccessWithOutput(EXPECTED);
+  }
+
+  static class TestClass {
+
+    public static void main(String[] args) {
+      System.out.println("Hello, world");
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/cf/bootstrap/BootstrapTest.java b/src/test/java/com/android/tools/r8/cf/bootstrap/BootstrapTest.java
index ee0ff21..c381b0d 100644
--- a/src/test/java/com/android/tools/r8/cf/bootstrap/BootstrapTest.java
+++ b/src/test/java/com/android/tools/r8/cf/bootstrap/BootstrapTest.java
@@ -12,8 +12,8 @@
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.ProcessResult;
-import com.android.tools.r8.examples.hello.HelloTestRunner;
 import com.android.tools.r8.utils.FileUtils;
+import com.android.tools.r8.utils.StringUtils;
 import com.google.common.base.Charsets;
 import java.nio.file.Path;
 import java.nio.file.Paths;
@@ -27,12 +27,18 @@
 @RunWith(Parameterized.class)
 public class BootstrapTest extends TestBase {
 
+  static class HelloWorldProgram {
+    public static void main(String[] args) {
+      System.out.println("Hello, world!");
+    }
+  }
+
+  private static final Class<?> HELLO_CLASS = HelloWorldProgram.class;
+  private static String HELLO_EXPECTED = StringUtils.lines("Hello, world!");
+
   private static final Path R8_STABLE_JAR =
       Paths.get(ToolHelper.THIRD_PARTY_DIR, "r8-releases", "3.2.54", "r8.jar");
 
-  private static final Class<?> HELLO_CLASS = HelloTestRunner.getHelloClass();
-  private static final String HELLO_EXPECTED = HelloTestRunner.getExpectedOutput();
-
   private static class R8Result {
 
     final ProcessResult processResult;
diff --git a/src/test/java/com/android/tools/r8/classmerging/vertical/ExceptionTablesTest.java b/src/test/java/com/android/tools/r8/classmerging/vertical/ExceptionTablesTest.java
index f694cd7..1ba7dcf 100644
--- a/src/test/java/com/android/tools/r8/classmerging/vertical/ExceptionTablesTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/vertical/ExceptionTablesTest.java
@@ -44,7 +44,6 @@
         .addKeepMainRule(TestClass.class)
         .addVerticallyMergedClassesInspector(this::inspectVerticallyMergedClasses)
         .setMinApi(parameters)
-        .addOptionsModification(o -> o.testing.enableLir())
         .compile()
         .inspect(this::inspect)
         .run(parameters.getRuntime(), TestClass.class)
diff --git a/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java b/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java
index 162f678..7ec72c7 100644
--- a/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java
@@ -65,9 +65,9 @@
 public class VerticalClassMergerTest extends TestBase {
 
   private static final Path CF_DIR =
-      Paths.get(ToolHelper.BUILD_DIR).resolve("test/examples/classes/classmerging");
+      Paths.get(ToolHelper.EXAMPLES_BUILD_DIR).resolve("classes/classmerging");
   private static final Path JAVA8_CF_DIR =
-      Paths.get(ToolHelper.BUILD_DIR).resolve("test/examplesAndroidO/classes/classmerging");
+      Paths.get(ToolHelper.THIRD_PARTY_DIR).resolve("examplesAndroidO/classes/classmerging");
   private static final Path EXAMPLE_JAR = Paths.get(ToolHelper.EXAMPLES_BUILD_DIR)
       .resolve("classmerging.jar");
   private static final Path EXAMPLE_KEEP = Paths.get(ToolHelper.EXAMPLES_DIR)
diff --git a/src/test/java/com/android/tools/r8/compilerapi/BinaryCompatibilityTestCollection.java b/src/test/java/com/android/tools/r8/compilerapi/BinaryCompatibilityTestCollection.java
index 2bfee60..f39b8ba 100644
--- a/src/test/java/com/android/tools/r8/compilerapi/BinaryCompatibilityTestCollection.java
+++ b/src/test/java/com/android/tools/r8/compilerapi/BinaryCompatibilityTestCollection.java
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.compilerapi;
 
+import static com.android.tools.r8.ToolHelper.TestDataSourceSet.computeLegacyOrGradleSpecifiedLocation;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
@@ -13,6 +14,7 @@
 import com.android.tools.r8.TestRuntime;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.ProcessResult;
+import com.android.tools.r8.ToolHelper.TestDataSourceSet;
 import com.android.tools.r8.transformers.ClassFileTransformer;
 import com.android.tools.r8.transformers.ClassFileTransformer.InnerClassPredicate;
 import com.android.tools.r8.utils.DescriptorUtils;
@@ -89,7 +91,11 @@
   public void runJunitOnTestClass(Class<? extends T> test) throws Exception {
     List<Class<? extends T>> testClasses = Collections.singletonList(test);
     runJunitOnTestClasses(
-        generateJarForTestClasses(testClasses, getPendingAdditionalClassesForTests()), testClasses);
+        generateJarForTestClasses(
+            computeLegacyOrGradleSpecifiedLocation(),
+            testClasses,
+            getPendingAdditionalClassesForTests()),
+        testClasses);
   }
 
   private void runJunitOnTestClasses(Path testJar, Collection<Class<? extends T>> tests)
@@ -128,35 +134,40 @@
     return ToolHelper.getHamcrestFromDeps();
   }
 
-  public Path generateJarForCheckedInTestClasses() throws Exception {
-    return generateJarForTestClasses(getCheckedInTestClasses(), Collections.emptyList());
+  public Path generateJarForCheckedInTestClasses(TestDataSourceSet testDataSourceSet)
+      throws Exception {
+    return generateJarForTestClasses(
+        testDataSourceSet, getCheckedInTestClasses(), Collections.emptyList());
   }
 
   private Path generateJarForTestClasses(
-      Collection<Class<? extends T>> classes, List<Class<?>> additionalPendingClassesForTest)
+      TestDataSourceSet testDataSourceSet,
+      Collection<Class<? extends T>> classes,
+      List<Class<?>> additionalPendingClassesForTest)
       throws Exception {
     Path jar = getTemp().newFolder().toPath().resolve("test.jar");
     ZipBuilder zipBuilder = ZipBuilder.builder(jar);
     for (Class<? extends T> test : classes) {
       zipBuilder.addFilesRelative(
-          ToolHelper.getClassPathForTests(), ToolHelper.getClassFilesForInnerClasses(test));
+          ToolHelper.getClassPathForTestDataSourceSet(testDataSourceSet),
+          ToolHelper.getClassFilesForInnerClasses(testDataSourceSet, test));
       zipBuilder.addBytes(
           ZipUtils.zipEntryNameForClass(test),
-          ClassFileTransformer.create(test)
+          ClassFileTransformer.create(test, testDataSourceSet)
               .removeInnerClasses(
                   InnerClassPredicate.onName(
                       DescriptorUtils.getBinaryNameFromJavaType(test.getTypeName())))
               .transform());
     }
     zipBuilder.addFilesRelative(
-        ToolHelper.getClassPathForTests(),
+        ToolHelper.getClassPathForTestDataSourceSet(testDataSourceSet),
         getAdditionalClassesForTests().stream()
-            .map(ToolHelper::getClassFileForTestClass)
+            .map(clazz -> ToolHelper.getClassFileForTestClass(clazz, testDataSourceSet))
             .collect(Collectors.toList()));
     zipBuilder.addFilesRelative(
-        ToolHelper.getClassPathForTests(),
+        ToolHelper.getClassPathForTestDataSourceSet(testDataSourceSet),
         additionalPendingClassesForTest.stream()
-            .map(ToolHelper::getClassFileForTestClass)
+            .map(clazz -> ToolHelper.getClassFileForTestClass(clazz, testDataSourceSet))
             .collect(Collectors.toList()));
     return zipBuilder.build();
   }
@@ -166,7 +177,9 @@
     Path checkedInContents = temp.newFolder().toPath();
     Path generatedContents = temp.newFolder().toPath();
     ZipUtils.unzip(getCheckedInTestJar(), checkedInContents);
-    ZipUtils.unzip(generateJarForCheckedInTestClasses(), generatedContents);
+    ZipUtils.unzip(
+        generateJarForCheckedInTestClasses(computeLegacyOrGradleSpecifiedLocation()),
+        generatedContents);
     try (Stream<Path> existingPaths = Files.walk(checkedInContents);
         Stream<Path> generatedPaths = Files.walk(generatedContents)) {
       List<Path> existing =
@@ -185,14 +198,14 @@
     }
   }
 
-  public void replaceJarForCheckedInTestClasses() throws Exception {
+  public void replaceJarForCheckedInTestClasses(TestDataSourceSet sourceSet) throws Exception {
     Path checkedInJar = getCheckedInTestJar();
     Path tarballDir = checkedInJar.getParent();
     Path parentDir = tarballDir.getParent();
     if (!Files.exists(Paths.get(tarballDir + ".tar.gz.sha1"))) {
       throw new RuntimeException("Could not locate the SHA file for " + tarballDir);
     }
-    Path generatedJar = generateJarForCheckedInTestClasses();
+    Path generatedJar = generateJarForCheckedInTestClasses(sourceSet);
     Files.move(generatedJar, checkedInJar, StandardCopyOption.REPLACE_EXISTING);
     System.out.println(
         "Updated file in: "
diff --git a/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTest.java b/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTest.java
index bb72b7a..9441ae2 100644
--- a/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTest.java
+++ b/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTest.java
@@ -107,15 +107,12 @@
         "-keep class " + clazz.getName() + " { public static void main(java.lang.String[]); }");
   }
 
-  public boolean isNewGradleSetup() {
-    return "true".equals(System.getenv("USE_NEW_GRADLE_SETUP"));
-  }
-
   public Path getPathForClass(Class<?> clazz) {
     String file = clazz.getName().replace('.', '/') + ".class";
-    if (isNewGradleSetup()) {
-      return Paths.get(System.getenv("TEST_CLASSES_LOCATIONS"), file);
+    if (System.getProperty("TEST_DATA_LOCATION") != null) {
+      return Paths.get(System.getProperty("TEST_DATA_LOCATION"), file);
     } else {
+      assert System.getProperty("USE_NEW_GRADLE_SETUP") == null;
       return Paths.get("build", "classes", "java", "test", file);
     }
   }
diff --git a/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTestCollection.java b/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTestCollection.java
index 6a28f4d..b1e473f 100644
--- a/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTestCollection.java
+++ b/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTestCollection.java
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.compilerapi;
 
+import static com.android.tools.r8.ToolHelper.getClassPathForTests;
 import static com.android.tools.r8.ToolHelper.isTestingR8Lib;
 
 import com.android.tools.r8.ToolHelper;
@@ -18,6 +19,7 @@
 import com.android.tools.r8.compilerapi.globalsynthetics.GlobalSyntheticsTest;
 import com.android.tools.r8.compilerapi.globalsyntheticsgenerator.GlobalSyntheticsGeneratorTest;
 import com.android.tools.r8.compilerapi.inputdependencies.InputDependenciesTest;
+import com.android.tools.r8.compilerapi.inputmap.InputMapTest;
 import com.android.tools.r8.compilerapi.mapid.CustomMapIdTest;
 import com.android.tools.r8.compilerapi.mockdata.MockClass;
 import com.android.tools.r8.compilerapi.mockdata.MockClassWithAssertion;
@@ -63,7 +65,8 @@
           ExtractMarkerApiTest.ApiTest.class,
           PartitionMapCommandTest.ApiTest.class,
           CancelCompilationCheckerTest.ApiTest.class,
-          GlobalSyntheticsGeneratorTest.ApiTest.class);
+          GlobalSyntheticsGeneratorTest.ApiTest.class,
+          InputMapTest.ApiTest.class);
 
   private static final List<Class<? extends CompilerApiTest>> CLASSES_PENDING_BINARY_COMPATIBILITY =
       ImmutableList.of();
@@ -120,6 +123,7 @@
   public List<String> getVmArgs() {
     return ImmutableList.of(
         makeProperty("com.android.tools.r8.enableTestAssertions", "1"),
+        makeProperty("TEST_DATA_LOCATION", getClassPathForTests().toString()),
         makeProperty(CompilerApiTest.API_TEST_MODE_KEY, CompilerApiTest.API_TEST_MODE_EXTERNAL),
         makeProperty(
             CompilerApiTest.API_TEST_LIB_KEY,
diff --git a/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTestCollectionTest.java b/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTestCollectionTest.java
index a2d7693..e64b136 100644
--- a/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTestCollectionTest.java
+++ b/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTestCollectionTest.java
@@ -6,6 +6,7 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.ToolHelper.TestDataSourceSet;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
 import org.junit.runner.RunWith;
@@ -53,6 +54,7 @@
   public static void main(String[] args) throws Exception {
     TemporaryFolder temp = new TemporaryFolder();
     temp.create();
-    new CompilerApiTestCollection(temp).replaceJarForCheckedInTestClasses();
+    new CompilerApiTestCollection(temp)
+        .replaceJarForCheckedInTestClasses(TestDataSourceSet.TESTS_JAVA_8);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/compilerapi/inputmap/InputMapTest.java b/src/test/java/com/android/tools/r8/compilerapi/inputmap/InputMapTest.java
new file mode 100644
index 0000000..af8c674
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/compilerapi/inputmap/InputMapTest.java
@@ -0,0 +1,123 @@
+// 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.compilerapi.inputmap;
+
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertTrue;
+
+import com.android.tools.r8.D8;
+import com.android.tools.r8.D8Command;
+import com.android.tools.r8.DexIndexedConsumer;
+import com.android.tools.r8.ProgramConsumer;
+import com.android.tools.r8.R8;
+import com.android.tools.r8.R8Command;
+import com.android.tools.r8.StringConsumer;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.compilerapi.CompilerApiTest;
+import com.android.tools.r8.compilerapi.CompilerApiTestRunner;
+import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.utils.BooleanBox;
+import com.android.tools.r8.utils.ThrowingBiConsumer;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.StandardOpenOption;
+import java.util.Arrays;
+import java.util.List;
+import org.junit.Test;
+
+public class InputMapTest extends CompilerApiTestRunner {
+
+  public InputMapTest(TestParameters parameters) {
+    super(parameters);
+  }
+
+  @Override
+  public Class<? extends CompilerApiTest> binaryTestClass() {
+    return ApiTest.class;
+  }
+
+  @Test
+  public void testD8() throws Exception {
+    ApiTest test = new ApiTest(ApiTest.PARAMETERS);
+    runTest(test::runTestD8);
+  }
+
+  @Test
+  public void testR8() throws Exception {
+    ApiTest test = new ApiTest(ApiTest.PARAMETERS);
+    runTest(test::runTestR8);
+  }
+
+  private void runTest(ThrowingBiConsumer<ProgramConsumer, StringConsumer, Exception> test)
+      throws Exception {
+    Path output = temp.newFolder().toPath().resolve("out.jar");
+    StringBuilder mappingBuilder = new StringBuilder();
+    BooleanBox didGetMappingContent = new BooleanBox(false);
+    test.accept(
+        new DexIndexedConsumer.ArchiveConsumer(output),
+        (mappingContent, handler) -> {
+          mappingBuilder.append(mappingContent);
+          didGetMappingContent.set(true);
+        });
+    assertTrue(didGetMappingContent.get());
+
+    // Extract the map hash from the file. This is always set by R8 to a SHA 256 hash.
+    String mappingContent = mappingBuilder.toString();
+    assertThat(mappingContent, containsString("com.android.tools.r8.compilerapi.originaldata ->"));
+  }
+
+  public static class ApiTest extends CompilerApiTest {
+    private static final List<String> mappingLines =
+        Arrays.asList(
+            "# {'id':'com.android.tools.r8.mapping','version':'2.2'}",
+            "com.android.tools.r8.compilerapi.originaldata ->"
+                + " com.android.tools.r8.compilerapi.mockdata:");
+
+    public ApiTest(Object parameters) {
+      super(parameters);
+    }
+
+    public void runTestR8(ProgramConsumer programConsumer, StringConsumer mappingConsumer)
+        throws Exception {
+      temp.create();
+      Path inputMap = temp.newFolder().toPath().resolve("r8inputmapping.txt");
+      Files.write(inputMap, mappingLines, StandardOpenOption.CREATE_NEW);
+      R8.run(
+          R8Command.builder()
+              .addClassProgramData(getBytesForClass(getMockClass()), Origin.unknown())
+              .addProguardConfiguration(getKeepMainRules(getMockClass()), Origin.unknown())
+              .addLibraryFiles(getJava8RuntimeJar())
+              .setProgramConsumer(programConsumer)
+              .setProguardMapConsumer(mappingConsumer)
+              .setProguardMapInputFile(inputMap)
+              .build());
+    }
+
+    public void runTestD8(ProgramConsumer programConsumer, StringConsumer mappingConsumer)
+        throws Exception {
+      temp.create();
+      Path inputMap = temp.newFolder().toPath().resolve("d8inputmap.txt");
+      Files.write(inputMap, mappingLines, StandardOpenOption.CREATE_NEW);
+      D8.run(
+          D8Command.builder()
+              .addClassProgramData(getBytesForClass(getMockClass()), Origin.unknown())
+              .addLibraryFiles(getJava8RuntimeJar())
+              .setProgramConsumer(programConsumer)
+              .setProguardMapConsumer(mappingConsumer)
+              .setProguardMapInputFile(inputMap)
+              .build());
+    }
+
+    @Test
+    public void testD8() throws Exception {
+      runTestD8(DexIndexedConsumer.emptyConsumer(), StringConsumer.emptyConsumer());
+    }
+
+    @Test
+    public void testR8() throws Exception {
+      runTestR8(DexIndexedConsumer.emptyConsumer(), StringConsumer.emptyConsumer());
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/d8/ProguardMapSortByTest.java b/src/test/java/com/android/tools/r8/d8/ProguardMapSortByTest.java
index eac78c0..e7169c3 100644
--- a/src/test/java/com/android/tools/r8/d8/ProguardMapSortByTest.java
+++ b/src/test/java/com/android/tools/r8/d8/ProguardMapSortByTest.java
@@ -58,7 +58,7 @@
         .release()
         .addProgramClasses(A.class, B.class, C.class, D.class, E.class)
         .setMinApi(parameters)
-        .apply(b -> b.getBuilder().setProguardInputMapFile(mappingFile))
+        .apply(b -> b.getBuilder().setProguardMapInputFile(mappingFile))
         .run(parameters.getRuntime(), A.class)
         .assertSuccessWithOutputLines("Hello world!")
         .app()
diff --git a/src/test/java/com/android/tools/r8/dagger/DaggerBasicNotSingletonUsingBindsTest.java b/src/test/java/com/android/tools/r8/dagger/DaggerBasicNotSingletonUsingBindsTest.java
index 173efa1..bffbe9d 100644
--- a/src/test/java/com/android/tools/r8/dagger/DaggerBasicNotSingletonUsingBindsTest.java
+++ b/src/test/java/com/android/tools/r8/dagger/DaggerBasicNotSingletonUsingBindsTest.java
@@ -77,7 +77,6 @@
         .addProgramFiles(getProgramFiles(target))
         .setMinApi(parameters)
         .addKeepMainRule(MAIN_CLASS)
-        .addOptionsModification(o -> o.testing.enableLir())
         .run(parameters.getRuntime(), MAIN_CLASS)
         .inspect(this::inspect)
         .assertSuccessWithOutputLines(EXPECTED_OUTPUT);
diff --git a/src/test/java/com/android/tools/r8/debuginfo/composepc/ComposePcEncodingTest.java b/src/test/java/com/android/tools/r8/debuginfo/composepc/ComposePcEncodingTest.java
index 311ea41..5aca406 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/composepc/ComposePcEncodingTest.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/composepc/ComposePcEncodingTest.java
@@ -111,7 +111,7 @@
         // We only optimize line info in release mode and with a mapping file output enabled.
         .release()
         .internalEnableMappingOutput()
-        .apply(b -> b.getBuilder().setProguardInputMapFile(r8OutputMap))
+        .apply(b -> b.getBuilder().setProguardMapInputFile(r8OutputMap))
         // Forcing jumbo processing will shift the PC values on the methods.
         .addOptionsModification(o -> o.testing.forceJumboStringProcessing = true)
         .compile()
diff --git a/src/test/java/com/android/tools/r8/desugar/b72538146/B72538146.java b/src/test/java/com/android/tools/r8/desugar/b72538146/B72538146.java
index 85362c4..b385299 100644
--- a/src/test/java/com/android/tools/r8/desugar/b72538146/B72538146.java
+++ b/src/test/java/com/android/tools/r8/desugar/b72538146/B72538146.java
@@ -59,7 +59,7 @@
     // Run the classloader test loading the two dex applications.
     testForD8()
         .addProgramFiles(
-            Paths.get(ToolHelper.TESTS_BUILD_DIR)
+            Paths.get(ToolHelper.THIRD_PARTY_DIR)
                 .resolve("examplesAndroidO")
                 .resolve("classes")
                 .resolve("classloader")
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java
index 09d3213..df487eb 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaTimeTest.java
@@ -89,7 +89,6 @@
         .addOptionsModification(
             options -> {
               // The check for $default$query relies on inlining.
-              options.testing.enableLir();
               options.inlinerOptions().simpleInliningInstructionLimit = 5;
             })
         .compile()
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxNull2ArgumentTest.java b/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxNull2ArgumentTest.java
index 1130986..ccff4dc 100644
--- a/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxNull2ArgumentTest.java
+++ b/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxNull2ArgumentTest.java
@@ -31,7 +31,6 @@
         .addInnerClasses(getClass())
         .setMinApi(parameters)
         .addKeepMainRule(Main.class)
-        .addOptionsModification(options -> options.testing.disableLir())
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("true", "null");
   }
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxNullArgumentTest.java b/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxNullArgumentTest.java
index 1f0492d..7df511e 100644
--- a/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxNullArgumentTest.java
+++ b/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxNullArgumentTest.java
@@ -30,7 +30,6 @@
         .addInnerClasses(getClass())
         .setMinApi(parameters)
         .addKeepMainRule(Main.class)
-        .addOptionsModification(options -> options.testing.disableLir())
         .run(parameters.getRuntime(), Main.class)
         .assertFailureWithErrorThatThrows(NullPointerException.class);
   }
diff --git a/src/test/java/com/android/tools/r8/examples/hello/HelloTestRunner.java b/src/test/java/com/android/tools/r8/examples/hello/HelloTestRunner.java
index cb305d2..55baca1 100644
--- a/src/test/java/com/android/tools/r8/examples/hello/HelloTestRunner.java
+++ b/src/test/java/com/android/tools/r8/examples/hello/HelloTestRunner.java
@@ -7,10 +7,7 @@
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.examples.ExamplesTestBase;
 import com.android.tools.r8.utils.StringUtils;
-import java.io.IOException;
-import java.nio.file.Path;
 import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 
@@ -22,34 +19,18 @@
     return getTestParameters().withAllRuntimesAndApiLevels().enableApiLevelsForCf().build();
   }
 
-  // The "hello" program is reused in various tests via these static methods.
-
-  public static Class<?> getHelloClass() {
-    return Hello.class;
-  }
-
-  public static String getExpectedOutput() {
-    return StringUtils.lines("Hello, world");
-  }
-
-  public static Path writeHelloProgramJar(TemporaryFolder temp) throws IOException {
-    Path jar = temp.newFolder().toPath().resolve("hello.jar");
-    writeClassesToJar(jar, Hello.class);
-    return jar;
-  }
-
   public HelloTestRunner(TestParameters parameters) {
     super(parameters);
   }
 
   @Override
   public Class<?> getMainClass() {
-    return getHelloClass();
+    return Hello.class;
   }
 
   @Override
   public String getExpected() {
-    return getExpectedOutput();
+    return StringUtils.lines("Hello, world");
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/internal/proto/Proto2BuilderShrinkingTest.java b/src/test/java/com/android/tools/r8/internal/proto/Proto2BuilderShrinkingTest.java
index 070e9e3..c786a4b 100644
--- a/src/test/java/com/android/tools/r8/internal/proto/Proto2BuilderShrinkingTest.java
+++ b/src/test/java/com/android/tools/r8/internal/proto/Proto2BuilderShrinkingTest.java
@@ -31,6 +31,43 @@
 @RunWith(Parameterized.class)
 public class Proto2BuilderShrinkingTest extends ProtoShrinkingTestBase {
 
+  private enum MainClassesConfig {
+    ALL,
+    BUILDER_WITH_ONE_OF_SETTER_TEST_CLASS,
+    BUILDER_WITH_PRIMITIVE_SETTERS_TEST_CLASS,
+    BUILDER_WITH_PROTO_BUILDER_SETTER_TEST_CLASS,
+    BUILDER_WITH_PROTO_SETTER_TEST_CLASS,
+    BUILDER_WITH_REUSED_SETTERS_TEST_CLASS,
+    HAS_FLAGGED_OFF_EXTENSION_BUILDER_TEST_CLASS;
+
+    List<String> getMainClasses() {
+      switch (this) {
+        case ALL:
+          return ImmutableList.of(
+              "proto2.BuilderWithOneofSetterTestClass",
+              "proto2.BuilderWithPrimitiveSettersTestClass",
+              "proto2.BuilderWithProtoBuilderSetterTestClass",
+              "proto2.BuilderWithProtoSetterTestClass",
+              "proto2.BuilderWithReusedSettersTestClass",
+              "proto2.HasFlaggedOffExtensionBuilderTestClass");
+        case BUILDER_WITH_ONE_OF_SETTER_TEST_CLASS:
+          return ImmutableList.of("proto2.BuilderWithOneofSetterTestClass");
+        case BUILDER_WITH_PRIMITIVE_SETTERS_TEST_CLASS:
+          return ImmutableList.of("proto2.BuilderWithPrimitiveSettersTestClass");
+        case BUILDER_WITH_PROTO_BUILDER_SETTER_TEST_CLASS:
+          return ImmutableList.of("proto2.BuilderWithProtoBuilderSetterTestClass");
+        case BUILDER_WITH_PROTO_SETTER_TEST_CLASS:
+          return ImmutableList.of("proto2.BuilderWithProtoSetterTestClass");
+        case BUILDER_WITH_REUSED_SETTERS_TEST_CLASS:
+          return ImmutableList.of("proto2.BuilderWithReusedSettersTestClass");
+        case HAS_FLAGGED_OFF_EXTENSION_BUILDER_TEST_CLASS:
+          return ImmutableList.of("proto2.HasFlaggedOffExtensionBuilderTestClass");
+        default:
+          throw new Unreachable();
+      }
+    }
+  }
+
   private static final String METHOD_TO_INVOKE_ENUM =
       "com.google.protobuf.GeneratedMessageLite$MethodToInvoke";
 
@@ -38,7 +75,7 @@
       ImmutableList.of(PROTO2_EXAMPLES_JAR, PROTO2_PROTO_JAR, PROTOBUF_LITE_JAR);
 
   @Parameter(0)
-  public List<String> mains;
+  public MainClassesConfig config;
 
   @Parameter(1)
   public TestParameters parameters;
@@ -46,20 +83,7 @@
   @Parameters(name = "{1}, {0}")
   public static List<Object[]> data() {
     return buildParameters(
-        ImmutableList.of(
-            ImmutableList.of("proto2.BuilderWithOneofSetterTestClass"),
-            ImmutableList.of("proto2.BuilderWithPrimitiveSettersTestClass"),
-            ImmutableList.of("proto2.BuilderWithProtoBuilderSetterTestClass"),
-            ImmutableList.of("proto2.BuilderWithProtoSetterTestClass"),
-            ImmutableList.of("proto2.BuilderWithReusedSettersTestClass"),
-            ImmutableList.of("proto2.HasFlaggedOffExtensionBuilderTestClass"),
-            ImmutableList.of(
-                "proto2.BuilderWithOneofSetterTestClass",
-                "proto2.BuilderWithPrimitiveSettersTestClass",
-                "proto2.BuilderWithProtoBuilderSetterTestClass",
-                "proto2.BuilderWithProtoSetterTestClass",
-                "proto2.BuilderWithReusedSettersTestClass",
-                "proto2.HasFlaggedOffExtensionBuilderTestClass")),
+        MainClassesConfig.values(),
         getTestParameters().withDefaultDexRuntime().withAllApiLevels().build());
   }
 
@@ -68,7 +92,7 @@
     R8TestCompileResult result =
         testForR8(parameters.getBackend())
             .addProgramFiles(PROGRAM_FILES)
-            .addKeepMainRules(mains)
+            .addKeepMainRules(config.getMainClasses())
             .addKeepRuleFiles(PROTOBUF_LITE_PROGUARD_RULES)
             .allowAccessModification()
             .allowDiagnosticMessages()
@@ -83,7 +107,7 @@
             .apply(this::inspectWarningMessages)
             .inspect(this::inspect);
 
-    for (String main : mains) {
+    for (String main : config.getMainClasses()) {
       result.run(parameters.getRuntime(), main).assertSuccessWithOutput(getExpectedOutput(main));
     }
   }
@@ -195,7 +219,7 @@
 
     DexType methodToInvokeType =
         outputInspector.clazz(METHOD_TO_INVOKE_ENUM).getDexProgramClass().getType();
-    for (String main : mains) {
+    for (String main : config.getMainClasses()) {
       MethodSubject mainMethodSubject = outputInspector.clazz(main).mainMethod();
       assertThat(mainMethodSubject, isPresent());
 
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java b/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
index 00e0441..b00cc7e 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
@@ -123,7 +123,6 @@
               o.inlinerOptions().enableInlining = inlining;
               o.inlinerOptions().enableInliningOfInvokesWithNullableReceivers = false;
               o.inlinerOptions().simpleInliningInstructionLimit = 7;
-              o.testing.enableLir();
               o.testing.horizontallyMergedClassesConsumer = this::fixInliningNullabilityClass;
               o.testing.horizontalClassMergingTarget =
                   (appView, candidates, target) -> {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerTest.java
index 483ed33..da23b67 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerTest.java
@@ -310,8 +310,6 @@
             .allowAccessModification()
             .enableInliningAnnotations()
             .addDontObfuscate()
-            // Using LIR changes the inlining heuristics so enable it consistently.
-            .addOptionsModification(o -> o.testing.enableLir())
             .setMinApi(parameters)
             .run(parameters.getRuntime(), main)
             .assertSuccessWithOutput(javaOutput);
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineFunctionalInterfaceMethodImplementedByLambdasTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineFunctionalInterfaceMethodImplementedByLambdasTest.java
index ccd59c6..7969f45 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineFunctionalInterfaceMethodImplementedByLambdasTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineFunctionalInterfaceMethodImplementedByLambdasTest.java
@@ -38,7 +38,6 @@
         .addKeepMainRule(TestClass.class)
         .enableNeverClassInliningAnnotations()
         .setMinApi(parameters)
-        .addOptionsModification(o -> o.testing.enableLir())
         .compile()
         .inspect(this::inspect)
         .run(parameters.getRuntime(), TestClass.class)
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningOptimize.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningOptimize.java
index dd9edd7..55230e8 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningOptimize.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningOptimize.java
@@ -30,7 +30,6 @@
         .addKeepRules("-keep,allowoptimization class ** {\n" + "*;\n" + "}")
         .addOptionsModification(
             options -> {
-              options.testing.enableLir();
               options.inlinerOptions().simpleInliningInstructionLimit = 5;
             })
         .compile()
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/FieldReadForWriteTest.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/FieldReadForWriteTest.java
index 37e6c57..8de4937 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/FieldReadForWriteTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/FieldReadForWriteTest.java
@@ -39,7 +39,6 @@
             HorizontallyMergedClassesInspector::assertNoClassesMerged)
         .enableNoHorizontalClassMergingAnnotations()
         .setMinApi(parameters)
-        .addOptionsModification(o -> o.testing.enableLir())
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("42")
         .inspect(inspector -> assertThat(inspector.clazz(anim.class), isAbsent()));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java
index 5c3fe96..e3e4fa2 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java
@@ -298,7 +298,6 @@
             .allowAccessModification()
             .addDontObfuscate()
             .addOptionsModification(this::configure)
-            .addOptionsModification(o -> o.testing.enableLir())
             .setMinApi(parameters)
             .run(parameters.getRuntime(), main)
             .assertSuccessWithOutput(javaOutput);
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/NestedInterfaceMethodTest.java b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/NestedInterfaceMethodTest.java
index 9626829..83c7f4f 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/NestedInterfaceMethodTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/NestedInterfaceMethodTest.java
@@ -60,7 +60,6 @@
             .enableNoVerticalClassMergingAnnotations()
             .addOptionsModification(
                 options -> {
-                  options.testing.enableLir();
                   options.enableDevirtualization = false;
                   options.inlinerOptions().enableInliningOfInvokesWithNullableReceivers = false;
                   // The checks for I being present rely on not simple inlining.
diff --git a/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java b/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java
index e74dd87..aad5246 100644
--- a/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/R8KotlinDataClassTest.java
@@ -129,7 +129,6 @@
             testBuilder ->
                 testBuilder
                     .addKeepRules(keepClassMethod(mainClassName, testMethodSignature))
-                    .addOptionsModification(o -> o.testing.enableLir())
                     .addOptionsModification(disableClassInliner))
         .inspect(
             inspector -> {
diff --git a/src/test/java/com/android/tools/r8/maindexlist/b72312389/B72312389.java b/src/test/java/com/android/tools/r8/maindexlist/b72312389/B72312389.java
index e303689..8c717a0 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/b72312389/B72312389.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/b72312389/B72312389.java
@@ -43,7 +43,7 @@
         .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.O))
         .addProgramFiles(
             Paths.get(
-                ToolHelper.TESTS_BUILD_DIR,
+                ToolHelper.THIRD_PARTY_DIR,
                 "examplesAndroidO",
                 "classes",
                 "instrumentationtest",
diff --git a/src/test/java/com/android/tools/r8/mappingcompose/ComposeUnknownJsonD8Test.java b/src/test/java/com/android/tools/r8/mappingcompose/ComposeUnknownJsonD8Test.java
index 032f5da..a8e22c5 100644
--- a/src/test/java/com/android/tools/r8/mappingcompose/ComposeUnknownJsonD8Test.java
+++ b/src/test/java/com/android/tools/r8/mappingcompose/ComposeUnknownJsonD8Test.java
@@ -53,7 +53,7 @@
         .addOptionsModification(
             options ->
                 assertTrue(options.mappingComposeOptions().enableExperimentalMappingComposition))
-        .apply(b -> b.getBuilder().setProguardInputMapFile(inputMap))
+        .apply(b -> b.getBuilder().setProguardMapInputFile(inputMap))
         .apply(testBuilder)
         .allowStdoutMessages()
         .collectStdout()
diff --git a/src/test/java/com/android/tools/r8/mappingcompose/ComposeWithMissingDebugInfoTest.java b/src/test/java/com/android/tools/r8/mappingcompose/ComposeWithMissingDebugInfoTest.java
index 950abdc..02d145d 100644
--- a/src/test/java/com/android/tools/r8/mappingcompose/ComposeWithMissingDebugInfoTest.java
+++ b/src/test/java/com/android/tools/r8/mappingcompose/ComposeWithMissingDebugInfoTest.java
@@ -57,7 +57,7 @@
         .apply(
             b ->
                 b.getBuilder()
-                    .setProguardInputMapFile(inputMap)
+                    .setProguardMapInputFile(inputMap)
                     .setProguardMapConsumer((string, handler) -> mappingComposed.append(string)))
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("42");
@@ -77,8 +77,7 @@
             .map(method -> method.getRetracedMethod().getMethodName())
             .collect(Collectors.toSet());
     Set<String> expectedMethods = new HashSet<>();
-    expectedMethods.add("a");
-    // TODO(b/297970886): We should observe 'foo' and not 'a'.
+    expectedMethods.add("foo");
     assertEquals(expectedMethods, foundMethods);
   }
 
diff --git a/src/test/java/com/android/tools/r8/regress/Regress160394262Test.java b/src/test/java/com/android/tools/r8/regress/Regress160394262Test.java
index a39c770..e21af03 100644
--- a/src/test/java/com/android/tools/r8/regress/Regress160394262Test.java
+++ b/src/test/java/com/android/tools/r8/regress/Regress160394262Test.java
@@ -50,7 +50,6 @@
         .addKeepMainRule(TestClass.class)
         .addInnerClasses(Regress160394262Test.class)
         .setMinApi(parameters)
-        .addOptionsModification(o -> o.testing.enableLir())
         .run(parameters.getRuntime(), TestClass.class)
         .assertSuccessWithOutput(EXPECTED)
         .inspect(this::checkJoinerIsClassInlined);
diff --git a/src/test/java/com/android/tools/r8/retrace/RetraceTests.java b/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
index 6abc4c7..984d8e2 100644
--- a/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
+++ b/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
@@ -35,6 +35,7 @@
 import com.android.tools.r8.retrace.stacktraces.ClassWithDashStackTrace;
 import com.android.tools.r8.retrace.stacktraces.ColonInFileNameStackTrace;
 import com.android.tools.r8.retrace.stacktraces.DifferentLineNumberSpanStackTrace;
+import com.android.tools.r8.retrace.stacktraces.ExceptionMessageWithClassNameInMessage;
 import com.android.tools.r8.retrace.stacktraces.FileNameExtensionStackTrace;
 import com.android.tools.r8.retrace.stacktraces.FoundMethodVerboseStackTrace;
 import com.android.tools.r8.retrace.stacktraces.IdentityMappingStackTrace;
@@ -46,6 +47,7 @@
 import com.android.tools.r8.retrace.stacktraces.InlineNoLineNumberStackTrace;
 import com.android.tools.r8.retrace.stacktraces.InlineNoLineWithBaseEntryNumberAssumeNoInlineStackTrace;
 import com.android.tools.r8.retrace.stacktraces.InlinePreambleNoOriginalStackTrace;
+import com.android.tools.r8.retrace.stacktraces.InlineRemoveFrameJava17StackTrace;
 import com.android.tools.r8.retrace.stacktraces.InlineSourceFileContextStackTrace;
 import com.android.tools.r8.retrace.stacktraces.InlineSourceFileStackTrace;
 import com.android.tools.r8.retrace.stacktraces.InlineWithLineNumbersStackTrace;
@@ -296,6 +298,11 @@
   }
 
   @Test
+  public void testExceptionMessageWithClassNameInMessage() throws Exception {
+    runRetraceTest(new ExceptionMessageWithClassNameInMessage());
+  }
+
+  @Test
   public void testUnknownSourceStackTrace() throws Exception {
     runRetraceTest(new UnknownSourceStackTrace());
   }
@@ -311,6 +318,11 @@
   }
 
   @Test
+  public void testInlineRemoveFrameJava17StackTrace() throws Exception {
+    runRetraceTest(new InlineRemoveFrameJava17StackTrace());
+  }
+
+  @Test
   public void testColonInSourceFileNameStackTrace() throws Exception {
     runRetraceTest(new ColonInFileNameStackTrace());
   }
diff --git a/src/test/java/com/android/tools/r8/retrace/StackTraceRegularExpressionParserTests.java b/src/test/java/com/android/tools/r8/retrace/StackTraceRegularExpressionParserTests.java
index 480f8bf..abcf319 100644
--- a/src/test/java/com/android/tools/r8/retrace/StackTraceRegularExpressionParserTests.java
+++ b/src/test/java/com/android/tools/r8/retrace/StackTraceRegularExpressionParserTests.java
@@ -1142,6 +1142,60 @@
     runRetraceTest("(?:.*?\\(\\s*%s(?:\\s*:\\s*%l\\s*)?\\)\\s*%c\\.%m)|", new LongLineStackTrace());
   }
 
+  /** This is a regression test for b/300416467. */
+  @Test
+  public void testGraphsModule() {
+    runRetraceTest(
+        "(?:.*, %c,.*)",
+        new StackTraceForTest() {
+          @Override
+          public List<String> obfuscatedStackTrace() {
+            return ImmutableList.of(
+                "TaskGraph@4b0b0f5(\"SomePipeline\") [created at 08-19 18:02:01.531]",
+                "                                     method                 future  (Note: all"
+                    + " times are in ms. relative to TaskGraph creation)",
+                "    requested,   queued,  started, finished (+  latency), finished, task",
+                "        0.057,    1.290,    2.690,    3.408 (+    0.718),    66.376,"
+                    + " foo.bar.baz.c.b.a.c.b.a.a.b, 0, 6, 0",
+                "");
+          }
+
+          @Override
+          public String mapping() {
+            return StringUtils.unixLines("some.original.factory -> foo.bar.baz.c.b.a.c.b.a.a.b:");
+          }
+
+          @Override
+          public List<String> retracedStackTrace() {
+            return ImmutableList.of(
+                "TaskGraph@4b0b0f5(\"SomePipeline\") [created at 08-19 18:02:01.531]",
+                "                                     method                 future  (Note: all"
+                    + " times are in ms. relative to TaskGraph creation)",
+                "    requested,   queued,  started, finished (+  latency), finished, task",
+                "        0.057,    1.290,    2.690,    3.408 (+    0.718),    66.376,"
+                    + " some.original.factory, 0, 6, 0",
+                "");
+          }
+
+          @Override
+          public List<String> retraceVerboseStackTrace() {
+            return ImmutableList.of(
+                "TaskGraph@4b0b0f5(\"SomePipeline\") [created at 08-19 18:02:01.531]",
+                "                                     method                 future  (Note: all"
+                    + " times are in ms. relative to TaskGraph creation)",
+                "    requested,   queued,  started, finished (+  latency), finished, task",
+                "        0.057,    1.290,    2.690,    3.408 (+    0.718),    66.376,"
+                    + " some.original.factory, 0, 6, 0",
+                "");
+          }
+
+          @Override
+          public int expectedWarnings() {
+            return 0;
+          }
+        });
+  }
+
   private TestDiagnosticMessagesImpl runRetraceTest(
       String regularExpression, StackTraceForTest stackTraceForTest) {
     TestDiagnosticMessagesImpl diagnosticsHandler = new TestDiagnosticMessagesImpl();
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiBinaryCompatibilityTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiBinaryCompatibilityTest.java
index a4983b2..bd9e4ec 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiBinaryCompatibilityTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiBinaryCompatibilityTest.java
@@ -7,6 +7,7 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.ToolHelper.TestDataSourceSet;
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
 import org.junit.runner.RunWith;
@@ -42,6 +43,7 @@
   public static void main(String[] args) throws Exception {
     TemporaryFolder temp = new TemporaryFolder();
     temp.create();
-    new RetraceApiTestCollection(temp).replaceJarForCheckedInTestClasses();
+    new RetraceApiTestCollection(temp)
+        .replaceJarForCheckedInTestClasses(TestDataSourceSet.TESTS_JAVA_8);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/retrace/stacktraces/ExceptionMessageWithClassNameInMessage.java b/src/test/java/com/android/tools/r8/retrace/stacktraces/ExceptionMessageWithClassNameInMessage.java
new file mode 100644
index 0000000..496afb3
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/retrace/stacktraces/ExceptionMessageWithClassNameInMessage.java
@@ -0,0 +1,49 @@
+// 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.retrace.stacktraces;
+
+import com.google.common.collect.ImmutableList;
+import java.util.List;
+
+/** This is a reproduction of b/300416467 */
+public class ExceptionMessageWithClassNameInMessage implements StackTraceForTest {
+
+  @Override
+  public List<String> obfuscatedStackTrace() {
+    return ImmutableList.of(
+        "10-26 19:26:24.749 10159 26250 26363 E Tycho.crl: Exception",
+        "10-26 19:26:24.749 10159 26250 26363 E Tycho.crl: java.util.concurrent.ExecutionException:"
+            + " ary: eu: Exception in CronetUrlRequest: net::ERR_CONNECTION_CLOSED, ErrorCode=5,"
+            + " InternalErrorCode=-100, Retryable=true");
+  }
+
+  @Override
+  public String mapping() {
+    return "foo.bar.baz -> net:";
+  }
+
+  @Override
+  public List<String> retracedStackTrace() {
+    return ImmutableList.of(
+        "10-26 19:26:24.749 10159 26250 26363 E Tycho.crl: Exception",
+        "10-26 19:26:24.749 10159 26250 26363 E Tycho.crl: java.util.concurrent.ExecutionException:"
+            + " ary: eu: Exception in CronetUrlRequest: foo.bar.baz::ERR_CONNECTION_CLOSED,"
+            + " ErrorCode=5, InternalErrorCode=-100, Retryable=true");
+  }
+
+  @Override
+  public List<String> retraceVerboseStackTrace() {
+    return ImmutableList.of(
+        "10-26 19:26:24.749 10159 26250 26363 E Tycho.crl: Exception",
+        "10-26 19:26:24.749 10159 26250 26363 E Tycho.crl: java.util.concurrent.ExecutionException:"
+            + " ary: eu: Exception in CronetUrlRequest: foo.bar.baz::ERR_CONNECTION_CLOSED,"
+            + " ErrorCode=5, InternalErrorCode=-100, Retryable=true");
+  }
+
+  @Override
+  public int expectedWarnings() {
+    return 0;
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/retrace/stacktraces/InlineRemoveFrameJava17StackTrace.java b/src/test/java/com/android/tools/r8/retrace/stacktraces/InlineRemoveFrameJava17StackTrace.java
new file mode 100644
index 0000000..b899077
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/retrace/stacktraces/InlineRemoveFrameJava17StackTrace.java
@@ -0,0 +1,59 @@
+// 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.retrace.stacktraces;
+
+import com.android.tools.r8.utils.StringUtils;
+import java.util.Arrays;
+import java.util.List;
+
+/**
+ * Manually throwing an NPE has a different syntax than it happening where there is no message
+ * afterwards.
+ */
+public class InlineRemoveFrameJava17StackTrace implements StackTraceForTest {
+
+  @Override
+  public List<String> obfuscatedStackTrace() {
+    return Arrays.asList(
+        "java.lang.NullPointerException", "\tat A.a(SourceFile:1)", "\tat A.main(SourceFile:1)");
+  }
+
+  @Override
+  public String mapping() {
+    return StringUtils.joinLines(
+        "# {'id':'com.android.tools.r8.mapping','version':'2.2'}",
+        "foo.Class -> A:",
+        "    1:5:void inlinable():90:90 -> a",
+        "    1:5:void caller():97 -> a",
+        "      # {'id':'com.android.tools.r8.rewriteFrame',"
+            + "'conditions':['throws(Ljava/lang/NullPointerException;)'],"
+            + "'actions':['removeInnerFrames(1)']}",
+        "    1:5:void outerCaller():107 -> a",
+        "    1:1:void main():111:111 -> main");
+  }
+
+  @Override
+  public List<String> retracedStackTrace() {
+    return Arrays.asList(
+        "java.lang.NullPointerException",
+        "\tat foo.Class.caller(Class.java:97)",
+        "\tat foo.Class.outerCaller(Class.java:107)",
+        "\tat foo.Class.main(Class.java:111)");
+  }
+
+  @Override
+  public List<String> retraceVerboseStackTrace() {
+    return Arrays.asList(
+        "java.lang.NullPointerException",
+        "\tat foo.Class.void caller()(Class.java:97)",
+        "\tat foo.Class.void outerCaller()(Class.java:107)",
+        "\tat foo.Class.void main()(Class.java:111)");
+  }
+
+  @Override
+  public int expectedWarnings() {
+    return 0;
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/rewrite/arrays/ConstClassArrayWithNonUniqueValuesTest.java b/src/test/java/com/android/tools/r8/rewrite/arrays/ConstClassArrayWithNonUniqueValuesTest.java
index cc339a8..213e3e4 100644
--- a/src/test/java/com/android/tools/r8/rewrite/arrays/ConstClassArrayWithNonUniqueValuesTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/arrays/ConstClassArrayWithNonUniqueValuesTest.java
@@ -9,12 +9,15 @@
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestCompilerBuilder;
 import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.InstructionSubject;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import com.google.common.collect.ImmutableList;
 import java.util.Arrays;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -31,11 +34,15 @@
   @Parameter(1)
   public CompilationMode compilationMode;
 
-  @Parameters(name = "{0}, mode = {1}")
+  @Parameter(2)
+  public Integer maxMaterializingConstants;
+
+  @Parameters(name = "{0}, mode = {1}, maxMaterializingConstants = {2}")
   public static Iterable<?> data() {
     return buildParameters(
         getTestParameters().withDefaultCfRuntime().withDexRuntimesAndAllApiLevels().build(),
-        CompilationMode.values());
+        CompilationMode.values(),
+        ImmutableList.of(Constants.U8BIT_MAX - 16, 2));
   }
 
   private static final String EXPECTED_OUTPUT = StringUtils.lines("100", "104");
@@ -60,9 +67,19 @@
         method.streamInstructions().filter(InstructionSubject::isConstClass).count());
   }
 
-  private void inspect(CodeInspector inspector) {
+  private void configure(TestCompilerBuilder<?, ?, ?, ?, ?> builder) {
+    builder.addOptionsModification(
+        options ->
+            options.rewriteArrayOptions().maxMaterializingConstants = maxMaterializingConstants);
+  }
+
+  private void inspectD8(CodeInspector inspector) {
     inspect(inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("m1"), 1, 100, false);
-    inspect(inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("m2"), 26, 104, false);
+    inspect(
+        inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("m2"),
+        maxMaterializingConstants == 2 ? 98 : 26,
+        104,
+        false);
   }
 
   @Test
@@ -71,11 +88,21 @@
     testForD8(parameters.getBackend())
         .addInnerClasses(getClass())
         .setMinApi(parameters)
+        .apply(this::configure)
         .run(parameters.getRuntime(), TestClass.class)
-        .inspect(this::inspect)
+        .inspect(this::inspectD8)
         .assertSuccessWithOutput(EXPECTED_OUTPUT);
   }
 
+  private void inspectR8(CodeInspector inspector) {
+    inspect(inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("m1"), 1, 100, false);
+    inspect(
+        inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("m2"),
+        maxMaterializingConstants == 2 ? 32 : 26,
+        104,
+        false);
+  }
+
   @Test
   public void testR8() throws Exception {
     testForR8(parameters.getBackend())
@@ -84,8 +111,9 @@
         .setMinApi(parameters)
         .enableInliningAnnotations()
         .addDontObfuscate()
+        .apply(this::configure)
         .run(parameters.getRuntime(), TestClass.class)
-        .inspect(this::inspect)
+        .inspect(this::inspectR8)
         .assertSuccessWithOutput(EXPECTED_OUTPUT);
   }
 
diff --git a/src/test/java/com/android/tools/r8/rewrite/arrays/ConstClassArrayWithUniqueValuesTest.java b/src/test/java/com/android/tools/r8/rewrite/arrays/ConstClassArrayWithUniqueValuesTest.java
index 4dca11b..d8227dc 100644
--- a/src/test/java/com/android/tools/r8/rewrite/arrays/ConstClassArrayWithUniqueValuesTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/arrays/ConstClassArrayWithUniqueValuesTest.java
@@ -10,11 +10,13 @@
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.InstructionSubject;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import com.google.common.collect.ImmutableList;
 import java.util.Arrays;
 import java.util.Iterator;
 import org.junit.Test;
@@ -32,11 +34,15 @@
   @Parameter(1)
   public CompilationMode compilationMode;
 
-  @Parameters(name = "{0}, mode = {1}")
+  @Parameter(2)
+  public Integer maxMaterializingConstants;
+
+  @Parameters(name = "{0}, mode = {1}, maxMaterializingConstants = {2}")
   public static Iterable<?> data() {
     return buildParameters(
         getTestParameters().withDefaultCfRuntime().withDexRuntimesAndAllApiLevels().build(),
-        CompilationMode.values());
+        CompilationMode.values(),
+        ImmutableList.of(Constants.U8BIT_MAX - 16, 2));
   }
 
   private static final String EXPECTED_OUTPUT =
diff --git a/src/test/java/com/android/tools/r8/rewrite/arrays/SimplifyArrayConstructionTest.java b/src/test/java/com/android/tools/r8/rewrite/arrays/SimplifyArrayConstructionTest.java
index 9f67d23..3f75ac1 100644
--- a/src/test/java/com/android/tools/r8/rewrite/arrays/SimplifyArrayConstructionTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/arrays/SimplifyArrayConstructionTest.java
@@ -316,7 +316,7 @@
       twoDimensionalArrays();
       objectArraysFilledNewArrayRange();
       arraysThatUseFilledData();
-      arraysThatUseNewArrayEmpty();
+      arraysThatUseNewArrayEmpty(args.length);
       reversedArray();
       arrayWithCorrectCountButIncompleteCoverage();
       arrayWithExtraInitialPuts();
@@ -536,7 +536,7 @@
     }
 
     @NeverInline
-    private static void arraysThatUseNewArrayEmpty() {
+    private static void arraysThatUseNewArrayEmpty(int trickyZero) {
       // int/object of size zero should not use filled-new-array.
       int[] intArr = {};
       System.out.println(Arrays.toString(intArr));
@@ -569,7 +569,6 @@
       System.out.println(Arrays.toString(partialArray));
 
       // Non-constant array size.
-      int trickyZero = (int) (System.currentTimeMillis() / System.nanoTime());
       Object[] nonConstSize = new Object[trickyZero + 1];
       nonConstSize[0] = "a";
       System.out.println(Arrays.toString(nonConstSize));
diff --git a/src/test/java/com/android/tools/r8/rewrite/arrays/StaticGetArrayWithNonUniqueValuesTest.java b/src/test/java/com/android/tools/r8/rewrite/arrays/StaticGetArrayWithNonUniqueValuesTest.java
new file mode 100644
index 0000000..8623e55
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/rewrite/arrays/StaticGetArrayWithNonUniqueValuesTest.java
@@ -0,0 +1,189 @@
+// 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.rewrite.arrays;
+
+import static org.junit.Assert.assertEquals;
+
+import com.android.tools.r8.CompilationMode;
+import com.android.tools.r8.NeverInline;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestCompilerBuilder;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import com.google.common.collect.ImmutableList;
+import java.util.Arrays;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class StaticGetArrayWithNonUniqueValuesTest extends TestBase {
+
+  @Parameter(0)
+  public TestParameters parameters;
+
+  @Parameter(1)
+  public CompilationMode compilationMode;
+
+  @Parameter(2)
+  public Integer maxMaterializingConstants;
+
+  @Parameters(name = "{0}, mode = {1}, maxMaterializingConstants = {2}")
+  public static Iterable<?> data() {
+    return buildParameters(
+        getTestParameters().withDefaultCfRuntime().withDexRuntimesAndAllApiLevels().build(),
+        CompilationMode.values(),
+        ImmutableList.of(Constants.U8BIT_MAX - 16, 2));
+  }
+
+  private static final String EXPECTED_OUTPUT = StringUtils.lines("100", "50");
+
+  public boolean canUseFilledNewArrayOfObject(TestParameters parameters) {
+    return parameters.isDexRuntime()
+        && parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.N);
+  }
+
+  private void inspect(MethodSubject method, int staticGets, int puts, boolean insideCatchHandler) {
+    boolean expectingFilledNewArray =
+        canUseFilledNewArrayOfObject(parameters) && !insideCatchHandler;
+    assertEquals(
+        expectingFilledNewArray ? 0 : puts,
+        method.streamInstructions().filter(InstructionSubject::isArrayPut).count());
+    assertEquals(
+        expectingFilledNewArray ? 1 : 0,
+        method.streamInstructions().filter(InstructionSubject::isFilledNewArray).count());
+    assertEquals(
+        staticGets, method.streamInstructions().filter(InstructionSubject::isStaticGet).count());
+  }
+
+  private void configure(TestCompilerBuilder<?, ?, ?, ?, ?> builder) {
+    builder.addOptionsModification(
+        options ->
+            options.rewriteArrayOptions().maxMaterializingConstants = maxMaterializingConstants);
+  }
+
+  private void inspectD8(CodeInspector inspector) {
+    inspect(
+        inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("m1"),
+        canUseFilledNewArrayOfObject(parameters) ? 100 : 1,
+        100,
+        false);
+    inspect(
+        inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("m2"),
+        canUseFilledNewArrayOfObject(parameters) ? 50 : (maxMaterializingConstants == 2 ? 42 : 10),
+        50,
+        false);
+  }
+
+  @Test
+  public void testD8() throws Exception {
+    parameters.assumeDexRuntime();
+    testForD8(parameters.getBackend())
+        .addInnerClasses(getClass())
+        .setMinApi(parameters)
+        .apply(this::configure)
+        .run(parameters.getRuntime(), TestClass.class)
+        .inspect(this::inspectD8)
+        .assertSuccessWithOutput(EXPECTED_OUTPUT);
+  }
+
+  private void inspectR8(CodeInspector inspector) {
+    inspect(inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("m1"), 1, 100, false);
+    inspect(
+        inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("m2"),
+        (parameters.isCfRuntime() && maxMaterializingConstants == 2) ? 42 : 10,
+        50,
+        false);
+  }
+
+  @Test
+  public void testR8() throws Exception {
+    testForR8(parameters.getBackend())
+        .addInnerClasses(getClass())
+        .addKeepMainRule(TestClass.class)
+        .setMinApi(parameters)
+        .enableInliningAnnotations()
+        .addDontObfuscate()
+        .apply(this::configure)
+        .run(parameters.getRuntime(), TestClass.class)
+        .inspect(this::inspectR8)
+        .assertSuccessWithOutput(EXPECTED_OUTPUT);
+  }
+
+  public static final class TestClass {
+
+    @NeverInline
+    public static void m1() {
+      A[] array =
+          new A[] {
+            A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00,
+            A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00,
+            A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00,
+            A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00,
+            A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00,
+            A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00,
+            A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00,
+            A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00,
+            A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00,
+            A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00, A.A00,
+          };
+      printArraySize(array);
+    }
+
+    @NeverInline
+    public static void m2() {
+      A[] array =
+          new A[] {
+            A.A00, A.A01, A.A02, A.A03, A.A04, A.A05, A.A06, A.A07, A.A08, A.A09,
+            A.A00, A.A01, A.A02, A.A03, A.A04, A.A05, A.A06, A.A07, A.A08, A.A09,
+            A.A00, A.A01, A.A02, A.A03, A.A04, A.A05, A.A06, A.A07, A.A08, A.A09,
+            A.A00, A.A01, A.A02, A.A03, A.A04, A.A05, A.A06, A.A07, A.A08, A.A09,
+            A.A00, A.A01, A.A02, A.A03, A.A04, A.A05, A.A06, A.A07, A.A08, A.A09,
+          };
+      printArraySize(array);
+    }
+
+    @NeverInline
+    public static void printArraySize(A[] array) {
+      System.out.println(Arrays.asList(array).size());
+    }
+
+    public static void main(String[] args) {
+      m1();
+      m2();
+    }
+  }
+
+  static class A {
+
+    private final String name;
+
+    private A(String name) {
+      this.name = name;
+    }
+
+    public String toString() {
+      return name;
+    }
+
+    static A A00 = new A("A00");
+    static A A01 = new A("A01");
+    static A A02 = new A("A02");
+    static A A03 = new A("A03");
+    static A A04 = new A("A04");
+    static A A05 = new A("A05");
+    static A A06 = new A("A06");
+    static A A07 = new A("A07");
+    static A A08 = new A("A08");
+    static A A09 = new A("A09");
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/rewrite/arrays/StaticGetArrayWithUniqueValuesTest.java b/src/test/java/com/android/tools/r8/rewrite/arrays/StaticGetArrayWithUniqueValuesTest.java
new file mode 100644
index 0000000..b5fe270
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/rewrite/arrays/StaticGetArrayWithUniqueValuesTest.java
@@ -0,0 +1,304 @@
+// 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.rewrite.arrays;
+
+import static org.junit.Assert.assertEquals;
+
+import com.android.tools.r8.CompilationMode;
+import com.android.tools.r8.NeverInline;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import com.google.common.collect.ImmutableList;
+import java.util.Arrays;
+import java.util.Iterator;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class StaticGetArrayWithUniqueValuesTest extends TestBase {
+
+  @Parameter(0)
+  public TestParameters parameters;
+
+  @Parameter(1)
+  public CompilationMode compilationMode;
+
+  @Parameter(2)
+  public Integer maxMaterializingConstants;
+
+  @Parameters(name = "{0}, mode = {1}, maxMaterializingConstants = {2}")
+  public static Iterable<?> data() {
+    return buildParameters(
+        getTestParameters().withDefaultCfRuntime().withDexRuntimesAndAllApiLevels().build(),
+        CompilationMode.values(),
+        ImmutableList.of(Constants.U8BIT_MAX - 16, 2));
+  }
+
+  private static final String EXPECTED_OUTPUT =
+      StringUtils.lines("[A00, A01, A02, A03, A04]", "[A00, A01, A02, A03, A04]", "100");
+
+  public boolean canUseFilledNewArrayOfObject(TestParameters parameters) {
+    return parameters.isDexRuntime()
+        && parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.N);
+  }
+
+  private enum State {
+    EXPECTING_GETSTATIC,
+    EXPECTING_APUTOBJECT
+  }
+
+  private void inspect(MethodSubject method, int puts, boolean insideCatchHandler) {
+    boolean expectingFilledNewArray =
+        canUseFilledNewArrayOfObject(parameters) && !insideCatchHandler;
+    assertEquals(
+        expectingFilledNewArray ? 0 : puts,
+        method.streamInstructions().filter(InstructionSubject::isArrayPut).count());
+    assertEquals(
+        expectingFilledNewArray ? 1 : 0,
+        method.streamInstructions().filter(InstructionSubject::isFilledNewArray).count());
+    assertEquals(puts, method.streamInstructions().filter(InstructionSubject::isStaticGet).count());
+    if (!expectingFilledNewArray) {
+      // Test that sget and aput instructions are interleaved by the lowering of
+      // filled-new-array.
+      int aputCount = 0;
+      State state = State.EXPECTING_GETSTATIC;
+      Iterator<InstructionSubject> iterator = method.iterateInstructions();
+      while (iterator.hasNext()) {
+        InstructionSubject instruction = iterator.next();
+        if (instruction.isStaticGet()) {
+          assertEquals(State.EXPECTING_GETSTATIC, state);
+          state = State.EXPECTING_APUTOBJECT;
+        } else if (instruction.isArrayPut()) {
+          assertEquals(State.EXPECTING_APUTOBJECT, state);
+          state = State.EXPECTING_GETSTATIC;
+          aputCount++;
+        }
+      }
+      assertEquals(State.EXPECTING_GETSTATIC, state);
+      assertEquals(puts, aputCount);
+    }
+  }
+
+  private void inspect(CodeInspector inspector) {
+    inspect(inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("m1"), 5, false);
+    inspect(inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("m2"), 5, true);
+    inspect(inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("m3"), 100, false);
+  }
+
+  @Test
+  public void testD8() throws Exception {
+    parameters.assumeDexRuntime();
+    testForD8(parameters.getBackend())
+        .addInnerClasses(getClass())
+        .setMinApi(parameters)
+        .run(parameters.getRuntime(), TestClass.class)
+        .inspect(this::inspect)
+        .assertSuccessWithOutput(EXPECTED_OUTPUT);
+  }
+
+  @Test
+  public void testR8() throws Exception {
+    testForR8(parameters.getBackend())
+        .addInnerClasses(getClass())
+        .addKeepMainRule(TestClass.class)
+        .setMinApi(parameters)
+        .enableInliningAnnotations()
+        .addDontObfuscate()
+        .run(parameters.getRuntime(), TestClass.class)
+        .inspect(this::inspect)
+        .assertSuccessWithOutput(EXPECTED_OUTPUT);
+  }
+
+  public static final class TestClass {
+
+    @NeverInline
+    public static void m1() {
+      A[] array = {A.A00, A.A01, A.A02, A.A03, A.A04};
+      printArray(array);
+    }
+
+    @NeverInline
+    public static void m2() {
+      try {
+        A[] array = {A.A00, A.A01, A.A02, A.A03, A.A04};
+        printArray(array);
+      } catch (Exception e) {
+        throw new RuntimeException();
+      }
+    }
+
+    @NeverInline
+    public static void m3() {
+      A[] array =
+          new A[] {
+            A.A00, A.A01, A.A02, A.A03, A.A04, A.A05, A.A06, A.A07,
+            A.A08, A.A09, A.A10, A.A11, A.A12, A.A13, A.A14, A.A15,
+            A.A16, A.A17, A.A18, A.A19, A.A20, A.A21, A.A22, A.A23,
+            A.A24, A.A25, A.A26, A.A27, A.A28, A.A29, A.A30, A.A31,
+            A.A32, A.A33, A.A34, A.A35, A.A36, A.A37, A.A38, A.A39,
+            A.A40, A.A41, A.A42, A.A43, A.A44, A.A45, A.A46, A.A47,
+            A.A48, A.A49, A.A50, A.A51, A.A52, A.A53, A.A54, A.A55,
+            A.A56, A.A57, A.A58, A.A59, A.A60, A.A61, A.A62, A.A63,
+            A.A64, A.A65, A.A66, A.A67, A.A68, A.A69, A.A70, A.A71,
+            A.A72, A.A73, A.A74, A.A75, A.A76, A.A77, A.A78, A.A79,
+            A.A80, A.A81, A.A82, A.A83, A.A84, A.A85, A.A86, A.A87,
+            A.A88, A.A89, A.A90, A.A91, A.A92, A.A93, A.A94, A.A95,
+            A.A96, A.A97, A.A98, A.A99,
+          };
+      printArraySize(array);
+    }
+
+    @NeverInline
+    public static void printArray(A[] array) {
+      System.out.print("[");
+      for (A a : array) {
+        if (a != array[0]) {
+          System.out.print(", ");
+        }
+        System.out.print(a);
+      }
+      System.out.println("]");
+    }
+
+    @NeverInline
+    public static void printArraySize(A[] array) {
+      System.out.println(Arrays.asList(array).size());
+    }
+
+    public static void main(String[] args) {
+      m1();
+      m2();
+      m3();
+    }
+  }
+
+  static class A {
+    private final String name;
+
+    private A(String name) {
+      this.name = name;
+    }
+
+    public String toString() {
+      return name;
+    }
+
+    static A A00 = new A("A00");
+    static A A01 = new A("A01");
+    static A A02 = new A("A02");
+    static A A03 = new A("A03");
+    static A A04 = new A("A04");
+    static A A05 = new A("A05");
+    static A A06 = new A("A06");
+    static A A07 = new A("A07");
+    static A A08 = new A("A08");
+    static A A09 = new A("A09");
+    static A A10 = new A("A10");
+    static A A11 = new A("A11");
+    static A A12 = new A("A12");
+    static A A13 = new A("A13");
+    static A A14 = new A("A14");
+    static A A15 = new A("A15");
+    static A A16 = new A("A16");
+    static A A17 = new A("A17");
+    static A A18 = new A("A18");
+    static A A19 = new A("A19");
+    static A A20 = new A("A20");
+    static A A21 = new A("A21");
+    static A A22 = new A("A22");
+    static A A23 = new A("A23");
+    static A A24 = new A("A24");
+    static A A25 = new A("A25");
+    static A A26 = new A("A26");
+    static A A27 = new A("A27");
+    static A A28 = new A("A28");
+    static A A29 = new A("A29");
+    static A A30 = new A("A30");
+    static A A31 = new A("A31");
+    static A A32 = new A("A32");
+    static A A33 = new A("A33");
+    static A A34 = new A("A34");
+    static A A35 = new A("A35");
+    static A A36 = new A("A36");
+    static A A37 = new A("A37");
+    static A A38 = new A("A38");
+    static A A39 = new A("A39");
+    static A A40 = new A("A40");
+    static A A41 = new A("A41");
+    static A A42 = new A("A42");
+    static A A43 = new A("A43");
+    static A A44 = new A("A44");
+    static A A45 = new A("A45");
+    static A A46 = new A("A46");
+    static A A47 = new A("A47");
+    static A A48 = new A("A48");
+    static A A49 = new A("A49");
+    static A A50 = new A("A50");
+    static A A51 = new A("A51");
+    static A A52 = new A("A52");
+    static A A53 = new A("A53");
+    static A A54 = new A("A54");
+    static A A55 = new A("A55");
+    static A A56 = new A("A56");
+    static A A57 = new A("A57");
+    static A A58 = new A("A58");
+    static A A59 = new A("A59");
+    static A A60 = new A("A60");
+    static A A61 = new A("A61");
+    static A A62 = new A("A62");
+    static A A63 = new A("A63");
+    static A A64 = new A("A64");
+    static A A65 = new A("A65");
+    static A A66 = new A("A66");
+    static A A67 = new A("A67");
+    static A A68 = new A("A68");
+    static A A69 = new A("A69");
+    static A A70 = new A("A70");
+    static A A71 = new A("A71");
+    static A A72 = new A("A72");
+    static A A73 = new A("A73");
+    static A A74 = new A("A74");
+    static A A75 = new A("A75");
+    static A A76 = new A("A76");
+    static A A77 = new A("A77");
+    static A A78 = new A("A78");
+    static A A79 = new A("A79");
+    static A A80 = new A("A80");
+    static A A81 = new A("A81");
+    static A A82 = new A("A82");
+    static A A83 = new A("A83");
+    static A A84 = new A("A84");
+    static A A85 = new A("A85");
+    static A A86 = new A("A86");
+    static A A87 = new A("A87");
+    static A A88 = new A("A88");
+    static A A89 = new A("A89");
+    static A A90 = new A("A90");
+    static A A91 = new A("A91");
+    static A A92 = new A("A92");
+    static A A93 = new A("A93");
+    static A A94 = new A("A94");
+    static A A95 = new A("A95");
+    static A A96 = new A("A96");
+    static A A97 = new A("A97");
+    static A A98 = new A("A98");
+    static A A99 = new A("A99");
+  }
+
+  // public static void main(String[] args) {
+  //   for (int i = 0; i < 100; i++) {
+  //     System.out.println("    static A A" + i + " = new A(\"A" + i + "\")");
+  //   }
+  // }
+}
diff --git a/src/test/java/com/android/tools/r8/rewrite/arrays/StringArrayWithNonUniqueValuesTest.java b/src/test/java/com/android/tools/r8/rewrite/arrays/StringArrayWithNonUniqueValuesTest.java
index 220e5dc..9100e39 100644
--- a/src/test/java/com/android/tools/r8/rewrite/arrays/StringArrayWithNonUniqueValuesTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/arrays/StringArrayWithNonUniqueValuesTest.java
@@ -9,12 +9,15 @@
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestCompilerBuilder;
 import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.InstructionSubject;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import com.google.common.collect.ImmutableList;
 import java.util.Arrays;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -31,11 +34,15 @@
   @Parameter(1)
   public CompilationMode compilationMode;
 
-  @Parameters(name = "{0}, mode = {1}")
+  @Parameter(2)
+  public Integer maxMaterializingConstants;
+
+  @Parameters(name = "{0}, mode = {1}, maxMaterializingConstants = {2}")
   public static Iterable<?> data() {
     return buildParameters(
         getTestParameters().withDefaultCfRuntime().withDexRuntimesAndAllApiLevels().build(),
-        CompilationMode.values());
+        CompilationMode.values(),
+        ImmutableList.of(Constants.U8BIT_MAX - 16, 2));
   }
 
   private static final String EXPECTED_OUTPUT = StringUtils.lines("100", "104");
@@ -60,9 +67,19 @@
         method.streamInstructions().filter(InstructionSubject::isConstString).count());
   }
 
+  private void configure(TestCompilerBuilder<?, ?, ?, ?, ?> builder) {
+    builder.addOptionsModification(
+        options ->
+            options.rewriteArrayOptions().maxMaterializingConstants = maxMaterializingConstants);
+  }
+
   private void inspect(CodeInspector inspector) {
     inspect(inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("m1"), 1, 100, false);
-    inspect(inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("m2"), 26, 104, false);
+    inspect(
+        inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("m2"),
+        maxMaterializingConstants == 2 ? 32 : 26,
+        104,
+        false);
   }
 
   @Test
@@ -71,6 +88,7 @@
     testForD8(parameters.getBackend())
         .addInnerClasses(getClass())
         .setMinApi(parameters)
+        .apply(this::configure)
         .run(parameters.getRuntime(), TestClass.class)
         .inspect(this::inspect)
         .assertSuccessWithOutput(EXPECTED_OUTPUT);
@@ -84,6 +102,7 @@
         .setMinApi(parameters)
         .enableInliningAnnotations()
         .addDontObfuscate()
+        .apply(this::configure)
         .run(parameters.getRuntime(), TestClass.class)
         .inspect(this::inspect)
         .assertSuccessWithOutput(EXPECTED_OUTPUT);
diff --git a/src/test/java/com/android/tools/r8/rewrite/arrays/StringArrayWithUniqueValuesTest.java b/src/test/java/com/android/tools/r8/rewrite/arrays/StringArrayWithUniqueValuesTest.java
index c3a70be..2613ca5 100644
--- a/src/test/java/com/android/tools/r8/rewrite/arrays/StringArrayWithUniqueValuesTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/arrays/StringArrayWithUniqueValuesTest.java
@@ -10,11 +10,13 @@
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.InstructionSubject;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import com.google.common.collect.ImmutableList;
 import java.util.Arrays;
 import java.util.Iterator;
 import org.junit.Test;
@@ -32,11 +34,15 @@
   @Parameter(1)
   public CompilationMode compilationMode;
 
-  @Parameters(name = "{0}, mode = {1}")
+  @Parameter(2)
+  public Integer maxMaterializingConstants;
+
+  @Parameters(name = "{0}, mode = {1}, maxMaterializingConstants = {2}")
   public static Iterable<?> data() {
     return buildParameters(
         getTestParameters().withDefaultCfRuntime().withDexRuntimesAndAllApiLevels().build(),
-        CompilationMode.values());
+        CompilationMode.values(),
+        ImmutableList.of(Constants.U8BIT_MAX - 16, 2));
   }
 
   private static final String EXPECTED_OUTPUT =
diff --git a/src/test/java/com/android/tools/r8/rewrite/enums/EnumOptimizationTest.java b/src/test/java/com/android/tools/r8/rewrite/enums/EnumOptimizationTest.java
index 97045ca..7b1c258 100644
--- a/src/test/java/com/android/tools/r8/rewrite/enums/EnumOptimizationTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/enums/EnumOptimizationTest.java
@@ -161,7 +161,6 @@
         .addOptionsModification(this::configure)
         .addOptionsModification(
             o -> {
-              o.testing.enableLir();
               // Not inlining toString depends on simple inlining limit.
               o.inlinerOptions().simpleInliningInstructionLimit = 3;
             })
diff --git a/src/test/java/com/android/tools/r8/shaking/TreeShakingSpecificTest.java b/src/test/java/com/android/tools/r8/shaking/TreeShakingSpecificTest.java
index 1dba3c9..1afb1c3 100644
--- a/src/test/java/com/android/tools/r8/shaking/TreeShakingSpecificTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/TreeShakingSpecificTest.java
@@ -52,10 +52,6 @@
     return Paths.get(EXAMPLES_BUILD_DIR, test + ".jar");
   }
 
-  private byte[] getProgramDexFileData(String test) throws IOException {
-    return Files.readAllBytes(Paths.get(EXAMPLES_BUILD_DIR, test, "classes.dex"));
-  }
-
   @Test
   public void testIgnoreWarnings() throws Exception {
     // Generate R8 processed version without library option.
diff --git a/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java b/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java
index fb55a41..b573cd5 100644
--- a/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java
@@ -156,7 +156,7 @@
       DiagnosticsConsumer diagnosticsConsumer)
       throws Exception {
 
-    String programFile = ToolHelper.TESTS_BUILD_DIR + getName() + ".jar";
+    String programFile = ToolHelper.THIRD_PARTY_DIR + getName() + ".jar";
 
     R8FullTestBuilder testBuilder =
         testForR8(parameters.getBackend())
diff --git a/src/test/java/com/android/tools/r8/shaking/annotations/b137392797/B137392797.java b/src/test/java/com/android/tools/r8/shaking/annotations/b137392797/B137392797.java
index df9580c..c084e8a 100644
--- a/src/test/java/com/android/tools/r8/shaking/annotations/b137392797/B137392797.java
+++ b/src/test/java/com/android/tools/r8/shaking/annotations/b137392797/B137392797.java
@@ -88,7 +88,6 @@
             options -> {
               // The default limit for LIR is 2 at time of writing.
               // The constructor inlining check needs a limit of 4 to trigger.
-              options.testing.enableLir();
               options.inlinerOptions().simpleInliningInstructionLimit = 4;
             })
         .compile()
diff --git a/src/test/java/com/android/tools/r8/transformers/ClassFileTransformer.java b/src/test/java/com/android/tools/r8/transformers/ClassFileTransformer.java
index 5c8821d..e6ba0f6 100644
--- a/src/test/java/com/android/tools/r8/transformers/ClassFileTransformer.java
+++ b/src/test/java/com/android/tools/r8/transformers/ClassFileTransformer.java
@@ -11,6 +11,7 @@
 
 import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.ToolHelper.TestDataSourceSet;
 import com.android.tools.r8.cf.CfVersion;
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.graph.AccessFlags;
@@ -155,6 +156,12 @@
     return create(ToolHelper.getClassAsBytes(clazz), classFromTypeName(clazz.getTypeName()));
   }
 
+  public static ClassFileTransformer create(Class<?> clazz, TestDataSourceSet sourceSet)
+      throws IOException {
+    return create(
+        ToolHelper.getClassAsBytes(clazz, sourceSet), classFromTypeName(clazz.getTypeName()));
+  }
+
   public <E extends Exception> ClassFileTransformer applyIf(
       boolean condition, ThrowingConsumer<ClassFileTransformer, E> consumer) throws E {
     if (condition) {
diff --git a/third_party/binary_compatibility_tests/compiler_api_tests.tar.gz.sha1 b/third_party/binary_compatibility_tests/compiler_api_tests.tar.gz.sha1
index 196cc8a..f514289 100644
--- a/third_party/binary_compatibility_tests/compiler_api_tests.tar.gz.sha1
+++ b/third_party/binary_compatibility_tests/compiler_api_tests.tar.gz.sha1
@@ -1 +1 @@
-089140826fdd80b1b74c5cd9b38627383956963e
\ No newline at end of file
+1274833123c17ea92300f41af2c18bb1a20dcc01
\ No newline at end of file
diff --git a/third_party/dependencies.tar.gz.sha1 b/third_party/dependencies.tar.gz.sha1
index 139251d..cea55a6 100644
--- a/third_party/dependencies.tar.gz.sha1
+++ b/third_party/dependencies.tar.gz.sha1
@@ -1 +1 @@
-d004917502f1b50bedada4bc5cca457ceb237c87
\ No newline at end of file
+3bfa0f5611e2f0e4beed4287cb5f9f9d3458c61b
\ No newline at end of file
diff --git a/third_party/dependencies_new.tar.gz.sha1 b/third_party/dependencies_new.tar.gz.sha1
index 2d9e556..621dd6c 100644
--- a/third_party/dependencies_new.tar.gz.sha1
+++ b/third_party/dependencies_new.tar.gz.sha1
@@ -1 +1 @@
-e2dff12bf95f94797da37f77b274fe222aeda83a
\ No newline at end of file
+4fad35bd436967989be01124889a973aee24ffa1
\ No newline at end of file
diff --git a/third_party/examples.tar.gz.sha1 b/third_party/examples.tar.gz.sha1
new file mode 100644
index 0000000..7cc4607
--- /dev/null
+++ b/third_party/examples.tar.gz.sha1
@@ -0,0 +1 @@
+a64a830bad847a8bcb1b1d441b16876882951960
\ No newline at end of file
diff --git a/third_party/examplesAndroidN.tar.gz.sha1 b/third_party/examplesAndroidN.tar.gz.sha1
new file mode 100644
index 0000000..c7c48ab
--- /dev/null
+++ b/third_party/examplesAndroidN.tar.gz.sha1
@@ -0,0 +1 @@
+3b4abfc288b97b2f592de1528162ffdfa4db76c2
\ No newline at end of file
diff --git a/third_party/examplesAndroidO.tar.gz.sha1 b/third_party/examplesAndroidO.tar.gz.sha1
new file mode 100644
index 0000000..7d28b20
--- /dev/null
+++ b/third_party/examplesAndroidO.tar.gz.sha1
@@ -0,0 +1 @@
+05367865efe55fcbf75c782deddab15ae7c40dad
\ No newline at end of file
diff --git a/third_party/examplesAndroidOGenerated.tar.gz.sha1 b/third_party/examplesAndroidOGenerated.tar.gz.sha1
new file mode 100644
index 0000000..832286b
--- /dev/null
+++ b/third_party/examplesAndroidOGenerated.tar.gz.sha1
@@ -0,0 +1 @@
+ea9220ee4f864517540f693ab0fd371a24607bf2
\ No newline at end of file
diff --git a/third_party/examplesAndroidP.tar.gz.sha1 b/third_party/examplesAndroidP.tar.gz.sha1
new file mode 100644
index 0000000..8b2db07
--- /dev/null
+++ b/third_party/examplesAndroidP.tar.gz.sha1
@@ -0,0 +1 @@
+591f8ee9f40e7a433e951908a22367d2001ff80e
\ No newline at end of file
diff --git a/third_party/examplesAndroidPGenerated.tar.gz.sha1 b/third_party/examplesAndroidPGenerated.tar.gz.sha1
new file mode 100644
index 0000000..28762a8
--- /dev/null
+++ b/third_party/examplesAndroidPGenerated.tar.gz.sha1
@@ -0,0 +1 @@
+8c0a039c70b4b335a017a818d286a9ace420a7ef
\ No newline at end of file
diff --git a/third_party/kotlinR8TestResources.tar.gz.sha1 b/third_party/kotlinR8TestResources.tar.gz.sha1
new file mode 100644
index 0000000..44d30c5
--- /dev/null
+++ b/third_party/kotlinR8TestResources.tar.gz.sha1
@@ -0,0 +1 @@
+4d5ea5f132e98018c5e3ef73ce478e0745d7f998
\ No newline at end of file
diff --git a/third_party/retrace/binary_compatibility.tar.gz.sha1 b/third_party/retrace/binary_compatibility.tar.gz.sha1
index 41a5e04..f1b451d 100644
--- a/third_party/retrace/binary_compatibility.tar.gz.sha1
+++ b/third_party/retrace/binary_compatibility.tar.gz.sha1
@@ -1 +1 @@
-c200df1f5305635d3b26f948a15732af5fefcacf
\ No newline at end of file
+cce7a600b543fcbe53dfeb84e834d389ec9c5421
\ No newline at end of file
diff --git a/tools/archive.py b/tools/archive.py
index 3cebc4a..8b136ec 100755
--- a/tools/archive.py
+++ b/tools/archive.py
@@ -74,27 +74,34 @@
 def GetStorageDestination(storage_prefix,
                           version_or_path,
                           file_name,
-                          is_main):
+                          is_main,
+                          new_gradle=False):
   # We archive main commits under raw/main instead of directly under raw
   version_dir = GetVersionDestination(storage_prefix,
                                       version_or_path,
-                                      is_main)
+                                      is_main,
+                                      new_gradle)
   return '%s/%s' % (version_dir, file_name)
 
-def GetVersionDestination(storage_prefix, version_or_path, is_main):
+def GetVersionDestination(storage_prefix, version_or_path, is_main,
+                          new_gradle=False):
   archive_dir = 'raw/main' if is_main else 'raw'
-  return '%s%s/%s/%s' % (storage_prefix, ARCHIVE_BUCKET,
+  bucket = ARCHIVE_BUCKET if not new_gradle else "r8-test-results"
+  return '%s%s/%s/%s' % (storage_prefix, bucket,
                          archive_dir, version_or_path)
 
-def GetUploadDestination(version_or_path, file_name, is_main):
-  return GetStorageDestination('gs://', version_or_path, file_name, is_main)
+def GetUploadDestination(version_or_path, file_name, is_main,
+                         new_gradle=False):
+  return GetStorageDestination('gs://', version_or_path, file_name, is_main,
+                               new_gradle)
 
-def GetUrl(version_or_path, file_name, is_main):
+def GetUrl(version_or_path, file_name, is_main, new_gradle=False):
   return GetStorageDestination('https://storage.googleapis.com/',
-                               version_or_path, file_name, is_main)
+                               version_or_path, file_name, is_main, new_gradle)
 
-def GetMavenUrl(is_main):
-  return GetVersionDestination('https://storage.googleapis.com/', '', is_main)
+def GetMavenUrl(is_main, new_gradle=False):
+  return GetVersionDestination('https://storage.googleapis.com/', '', is_main,
+                               new_gradle)
 
 def SetRLimitToMax():
   (soft, hard) = resource.getrlimit(resource.RLIMIT_NOFILE)
@@ -105,8 +112,15 @@
   print('INFO: Open files soft limit: %s' % soft)
   print('INFO: Open files hard limit: %s' % hard)
 
+
 def Main():
   (options, args) = ParseOptions()
+  Run(options, False)
+  # Clean to ensure that we actually generate all of the artifacts
+  shutil.rmtree(utils.BUILD)
+  Run(options, True)
+
+def Run(options, new_gradle):
   if not utils.is_bot() and not options.dry_run:
     raise Exception('You are not a bot, don\'t archive builds. '
       + 'Use --dry-run to test locally')
@@ -124,7 +138,6 @@
     PrintResourceInfo()
 
   with utils.TempDir() as temp:
-
     version_file = os.path.join(temp, 'r8-version.properties')
     with open(version_file,'w') as version_writer:
       version_writer.write('version.sha=' + GetGitHash() + '\n')
@@ -134,41 +147,56 @@
       releaser = \
           ("<local developer build>" if options.dry_run
             else 'releaser=go/r8bot ('
-                + os.environ.get('SWARMING_BOT_ID') + ')\n')
+                + (os.environ.get('SWARMING_BOT_ID') or 'foo') + ')\n')
       version_writer.write(releaser)
       version_writer.write('version-file.version.code=1\n')
 
-    # Create maven release which uses a build that exclude dependencies.
-    create_maven_release.generate_r8_maven_zip(
-        utils.MAVEN_ZIP,
-        version_file=version_file,
-        skip_gradle_build=options.skip_gradle_build)
     create_maven_release.generate_r8_maven_zip(
         utils.MAVEN_ZIP_LIB,
-        is_r8lib=True,
         version_file=version_file,
-        skip_gradle_build=options.skip_gradle_build)
+        skip_gradle_build=options.skip_gradle_build,
+        new_gradle=new_gradle)
+
 
     # Generate and copy a full build without dependencies.
     if (not options.skip_gradle_build):
-      gradle.RunGradleExcludeDeps([utils.R8, utils.R8_SRC])
-    shutil.copyfile(utils.R8_JAR, utils.R8_FULL_EXCLUDE_DEPS_JAR)
+      if (new_gradle):
+        gradle.RunGradle([':main:swissArmyKnife'], new_gradle=True)
+      else:
+        gradle.RunGradleExcludeDeps([utils.R8, utils.R8_SRC])
+    if (not new_gradle):
+      shutil.copyfile(utils.R8_JAR, utils.R8_FULL_EXCLUDE_DEPS_JAR)
 
     # Ensure all archived artifacts has been built before archiving.
     # The target tasks postfixed by 'lib' depend on the actual target task so
     # building it invokes the original task first.
     # The '-Pno_internal' flag is important because we generate the lib based on uses in tests.
     if (not options.skip_gradle_build):
-      gradle.RunGradle([
-          utils.R8,
-          utils.R8LIB,
-          utils.R8LIB_NO_DEPS,
-          utils.R8RETRACE,
-          utils.R8RETRACE_NO_DEPS,
-          utils.LIBRARY_DESUGAR_CONVERSIONS,
-          utils.KEEPANNO_ANNOTATIONS_TARGET,
-          '-Pno_internal'
-      ])
+      if (new_gradle):
+        gradle.RunGradle([
+            ':keepanno:keepAnnoJar',
+            ':main:consolidatedLicense',
+            ':main:r8WithRelocatedDeps',
+            ':main:swissArmyKnife',
+            ':test:r8LibNoDeps',
+            ':test:r8LibWithRelocatedDeps',
+            ':test:retraceNoDeps',
+            ':test:retraceWithRelocatedDeps',
+            ':test:sourcesJar',
+            ':test:sourcesJar',
+            '-Pno_internal'
+        ], new_gradle=True)
+      else:
+        gradle.RunGradle([
+            utils.R8,
+            utils.R8LIB,
+            utils.R8LIB_NO_DEPS,
+            utils.R8RETRACE,
+            utils.R8RETRACE_NO_DEPS,
+            utils.LIBRARY_DESUGAR_CONVERSIONS,
+            utils.KEEPANNO_ANNOTATIONS_TARGET,
+            '-Pno_internal'
+        ])
 
     # Create maven release of the desuage_jdk_libs configuration. This require
     # an r8.jar with dependencies to have been built.
@@ -206,49 +234,48 @@
       print('On main, using git hash for archiving')
       version = GetGitHash()
 
-    destination = GetVersionDestination('gs://', version, is_main)
+    destination = GetVersionDestination('gs://', version, is_main, new_gradle)
     if utils.cloud_storage_exists(destination) and not options.dry_run:
       raise Exception('Target archive directory %s already exists' % destination)
 
     # Create pom file for our maven repository that we build for testing.
     default_pom_file = os.path.join(temp, 'r8.pom')
     create_maven_release.write_default_r8_pom_file(default_pom_file, version)
-
-    for file in [
-      utils.R8_JAR,
-      utils.R8LIB_JAR,
-      utils.R8LIB_JAR + '.map',
-      utils.R8LIB_JAR + '_map.zip',
-      utils.R8_SRC_JAR,
-      utils.R8_FULL_EXCLUDE_DEPS_JAR,
-      utils.R8LIB_EXCLUDE_DEPS_JAR,
-      utils.R8LIB_EXCLUDE_DEPS_JAR + '.map',
-      utils.R8LIB_EXCLUDE_DEPS_JAR + '_map.zip',
-      utils.R8RETRACE_JAR,
-      utils.R8RETRACE_JAR + '.map',
-      utils.R8RETRACE_JAR + '_map.zip',
-      utils.R8RETRACE_EXCLUDE_DEPS_JAR,
-      utils.R8RETRACE_EXCLUDE_DEPS_JAR + '.map',
-      utils.R8RETRACE_EXCLUDE_DEPS_JAR + '_map.zip',
-      utils.MAVEN_ZIP,
-      utils.MAVEN_ZIP_LIB,
-      utils.DESUGAR_CONFIGURATION,
-      utils.DESUGAR_CONFIGURATION_MAVEN_ZIP,
-      utils.DESUGAR_CONFIGURATION_JDK11_LEGACY,
-      utils.DESUGAR_CONFIGURATION_JDK11_LEGACY_MAVEN_ZIP,
-      utils.DESUGAR_CONFIGURATION_JDK11_MINIMAL_MAVEN_ZIP,
-      utils.DESUGAR_CONFIGURATION_JDK11_MAVEN_ZIP,
-      utils.DESUGAR_CONFIGURATION_JDK11_NIO_MAVEN_ZIP,
-      utils.KEEPANNO_ANNOTATIONS_JAR,
-      utils.GENERATED_LICENSE,
-    ]:
+    for_archiving = [
+        utils.R8_JAR,
+        utils.R8LIB_JAR,
+        utils.R8LIB_JAR + '.map',
+        utils.R8LIB_JAR + '_map.zip',
+        utils.R8_FULL_EXCLUDE_DEPS_JAR,
+        utils.R8LIB_EXCLUDE_DEPS_JAR,
+        utils.R8LIB_EXCLUDE_DEPS_JAR + '.map',
+        utils.R8LIB_EXCLUDE_DEPS_JAR + '_map.zip',
+        utils.MAVEN_ZIP_LIB,
+        utils.DESUGAR_CONFIGURATION,
+        utils.DESUGAR_CONFIGURATION_MAVEN_ZIP,
+        utils.DESUGAR_CONFIGURATION_JDK11_LEGACY,
+        utils.DESUGAR_CONFIGURATION_JDK11_LEGACY_MAVEN_ZIP,
+        utils.DESUGAR_CONFIGURATION_JDK11_MINIMAL_MAVEN_ZIP,
+        utils.DESUGAR_CONFIGURATION_JDK11_MAVEN_ZIP,
+        utils.DESUGAR_CONFIGURATION_JDK11_NIO_MAVEN_ZIP,
+        utils.R8_SRC_JAR,
+        utils.R8RETRACE_JAR,
+        utils.R8RETRACE_JAR + '.map',
+        utils.R8RETRACE_JAR + '_map.zip',
+        utils.R8RETRACE_EXCLUDE_DEPS_JAR,
+        utils.R8RETRACE_EXCLUDE_DEPS_JAR + '.map',
+        utils.R8RETRACE_EXCLUDE_DEPS_JAR + '_map.zip',
+        utils.KEEPANNO_ANNOTATIONS_JAR,
+        utils.GENERATED_LICENSE]
+    for file in for_archiving:
       file_name = os.path.basename(file)
       tagged_jar = os.path.join(temp, file_name)
       shutil.copyfile(file, tagged_jar)
       if file_name.endswith('.jar') and not file_name.endswith('-src.jar'):
         with zipfile.ZipFile(tagged_jar, 'a') as zip:
           zip.write(version_file, os.path.basename(version_file))
-      destination = GetUploadDestination(version, file_name, is_main)
+      destination = GetUploadDestination(version, file_name, is_main,
+                                         new_gradle=new_gradle)
       print('Uploading %s to %s' % (tagged_jar, destination))
       if options.dry_run:
         if options.dry_run_output:
@@ -260,21 +287,24 @@
           print('Dry run, not actually uploading')
       else:
         utils.upload_file_to_cloud_storage(tagged_jar, destination)
-        print('File available at: %s' % GetUrl(version, file_name, is_main))
+        print('File available at: %s' % GetUrl(version, file_name, is_main,
+                                               new_gradle=new_gradle))
 
       # Upload R8 to a maven compatible location.
       if file == utils.R8_JAR:
         maven_dst = GetUploadDestination(utils.get_maven_path('r8', version),
-                                         'r8-%s.jar' % version, is_main)
+                                         'r8-%s.jar' % version, is_main,
+                                         new_gradle=new_gradle)
         maven_pom_dst = GetUploadDestination(
             utils.get_maven_path('r8', version),
-            'r8-%s.pom' % version, is_main)
+            'r8-%s.pom' % version, is_main, new_gradle=new_gradle)
         if options.dry_run:
           print('Dry run, not actually creating maven repo for R8')
         else:
           utils.upload_file_to_cloud_storage(tagged_jar, maven_dst)
           utils.upload_file_to_cloud_storage(default_pom_file, maven_pom_dst)
-          print('Maven repo root available at: %s' % GetMavenUrl(is_main))
+          print('Maven repo root available at: %s' % GetMavenUrl(
+              is_main, new_gradle=new_gradle))
 
       # Upload desugar_jdk_libs configuration to a maven compatible location.
       if file == utils.DESUGAR_CONFIGURATION:
@@ -282,7 +312,8 @@
         jar_version_name = 'desugar_jdk_libs_configuration-%s.jar' % version
         maven_dst = GetUploadDestination(
             utils.get_maven_path('desugar_jdk_libs_configuration', version),
-                                 jar_version_name, is_main)
+                                 jar_version_name, is_main,
+            new_gradle=new_gradle)
 
         with utils.TempDir() as tmp_dir:
           desugar_jdk_libs_configuration_jar = os.path.join(tmp_dir,
@@ -303,10 +334,11 @@
           else:
             utils.upload_file_to_cloud_storage(
                 desugar_jdk_libs_configuration_jar, maven_dst)
-            print('Maven repo root available at: %s' % GetMavenUrl(is_main))
+            print('Maven repo root available at: %s' % GetMavenUrl(is_main,
+                                                                   new_gradle=new_gradle))
             # Also archive the jar as non maven destination for Google3
             jar_destination = GetUploadDestination(
-                version, jar_basename, is_main)
+                version, jar_basename, is_main, new_gradle=new_gradle)
             utils.upload_file_to_cloud_storage(
                 desugar_jdk_libs_configuration_jar, jar_destination)
 
@@ -317,7 +349,8 @@
         jar_version_name = 'desugar_jdk_libs_configuration-%s-jdk11-legacy.jar' % version
         maven_dst = GetUploadDestination(
             utils.get_maven_path('desugar_jdk_libs_configuration', version),
-                                 jar_version_name, is_main)
+            jar_version_name, is_main,
+            new_gradle=new_gradle)
 
         with utils.TempDir() as tmp_dir:
           desugar_jdk_libs_configuration_jar = os.path.join(tmp_dir,
@@ -338,10 +371,11 @@
           else:
             utils.upload_file_to_cloud_storage(
                 desugar_jdk_libs_configuration_jar, maven_dst)
-            print('Maven repo root available at: %s' % GetMavenUrl(is_main))
+            print('Maven repo root available at: %s' % GetMavenUrl(
+                is_main, new_gradle=new_gradle))
             # Also archive the jar as non maven destination for Google3
             jar_destination = GetUploadDestination(
-                version, jar_basename, is_main)
+                version, jar_basename, is_main, new_gradle=new_gradle)
             utils.upload_file_to_cloud_storage(
                 desugar_jdk_libs_configuration_jar, jar_destination)
 
diff --git a/tools/build_sample_apk.py b/tools/build_sample_apk.py
index 67ead8c..2cc95aa 100755
--- a/tools/build_sample_apk.py
+++ b/tools/build_sample_apk.py
@@ -244,10 +244,10 @@
       time = split[1]
       name = split[0].split()[-1]
       overall_total += int(time)
-      print '%s: %s' % (name, time)
+      print('%s: %s' % (name, time))
       results[name] = time
 
-  print 'Total: %s' % overall_total
+  print('Total: %s' % overall_total)
   if not output:
     return overall_total
   results['total'] = str(overall_total)
@@ -260,7 +260,7 @@
     with open(total_file, 'w') as f:
       f.write(time)
 
-  print 'Result stored in: \n%s' % ('\n'.join(written_files))
+  print('Result stored in: \n%s' % ('\n'.join(written_files)))
   return overall_total
 
 def benchmark(app, output_dir):
@@ -331,7 +331,7 @@
     ensure_no_logcat()
     for _ in range(BENCHMARK_ITERATIONS):
       grand_total += benchmark(options.app, options.benchmark_output_dir)
-  print 'Combined average: %s' % (grand_total/BENCHMARK_ITERATIONS)
+  print('Combined average: %s' % (grand_total/BENCHMARK_ITERATIONS))
 
 if __name__ == '__main__':
   sys.exit(Main())
diff --git a/tools/create_local_maven_with_dependencies.py b/tools/create_local_maven_with_dependencies.py
index 500c480..f9a0383 100755
--- a/tools/create_local_maven_with_dependencies.py
+++ b/tools/create_local_maven_with_dependencies.py
@@ -11,10 +11,13 @@
 
 import utils
 
+# The local_maven_repository_generator orderes the repositories by name, so
+# prefix with X- to control the order, as many dependencies are present
+# in several repositories.
 REPOSITORIES = [
-  'Maven Central=https://repo1.maven.org/maven2/',
-  'Google=https://maven.google.com/',
-  "Gradle Plugins=https://plugins.gradle.org/m2/",
+  'A-Google=https://maven.google.com/',
+  'B-Maven Central=https://repo1.maven.org/maven2/',
+  "C-Gradle Plugins=https://plugins.gradle.org/m2/",
 ]
 
 ANDRDID_SUPPORT_VERSION = '25.4.0'
diff --git a/tools/create_maven_release.py b/tools/create_maven_release.py
index 1ca239e..137f584 100755
--- a/tools/create_maven_release.py
+++ b/tools/create_maven_release.py
@@ -18,14 +18,6 @@
 import utils
 import zipfile
 
-DEPENDENCYTEMPLATE = Template(
-"""
-    <dependency>
-        <groupId>$group</groupId>
-        <artifactId>$artifact</artifactId>
-        <version>$version</version>
-    </dependency>""")
-
 LICENSETEMPLATE = Template(
 """
     <license>
@@ -56,7 +48,7 @@
       <distribution>repo</distribution>
     </license>$library_licenses
   </licenses>
-  <dependencies>$dependencies
+  <dependencies>
   </dependencies>
   <developers>
     <developer>
@@ -116,8 +108,6 @@
   result = argparse.ArgumentParser()
   result.add_argument('--out', help='The zip file to output')
   group = result.add_mutually_exclusive_group()
-  group.add_argument('--r8lib', action='store_true',
-                      help='Build r8 with dependencies included shrunken')
   group.add_argument('--desugar-configuration', action='store_true',
                       help='Build desugar library configuration (original JDK-8)')
   group.add_argument('--desugar-configuration-jdk8', action='store_true',
@@ -199,86 +189,19 @@
     result += LICENSETEMPLATE.substitute(name=name, url=url)
   return result
 
-
-# Generate the dependencies block for the pom file.
-#
-# We ask gradle to list all dependencies. In that output
-# we locate the runtimeClasspath block for 'main' which
-# looks something like:
-#
-# runtimeClasspath - Runtime classpath of source set 'main'.
-# +--- net.sf.jopt-simple:jopt-simple:4.6
-# +--- com.googlecode.json-simple:json-simple:1.1
-# +--- com.google.guava:guava:23.0
-# +--- it.unimi.dsi:fastutil:7.2.0
-# +--- org.ow2.asm:asm:6.0
-# +--- org.ow2.asm:asm-commons:6.0
-# |    \--- org.ow2.asm:asm-tree:6.0
-# |         \--- org.ow2.asm:asm:6.0
-# +--- org.ow2.asm:asm-tree:6.0 (*)
-# +--- org.ow2.asm:asm-analysis:6.0
-# |    \--- org.ow2.asm:asm-tree:6.0 (*)
-# \--- org.ow2.asm:asm-util:6.0
-#      \--- org.ow2.asm:asm-tree:6.0 (*)
-#
-# We filter out the repeats that are marked by '(*)'.
-#
-# For each remaining line, we remove the junk at the start
-# in chunks. As an example:
-#
-# '  |    \--- org.ow2.asm:asm-tree:6.0  '  --strip-->
-# '|    \--- org.ow2.asm:asm-tree:6.0'  -->
-# '\--- org.ow2.asm:asm-tree:6.0'  -->
-# 'org.ow2.asm:asm-tree:6.0'
-#
-# The end result is the dependency we are looking for:
-#
-# groupId: org.ow2.asm
-# artifact: asm-tree
-# version: 6.0
-def generate_dependencies():
-  dependencies = gradle.RunGradleGetOutput(['dependencies'])
-  dependency_lines = []
-  collect = False
-  for line in dependencies.splitlines():
-    if line and 'runtimeClasspath' in line and "'main'" in line:
-      collect = True
-      continue
-    if collect:
-      if not len(line) == 0:
-        if not '(*)' in line:
-          trimmed = line.strip()
-          while trimmed.find(' ') != -1:
-            trimmed = trimmed[trimmed.find(' ') + 1:].strip()
-          if not trimmed in dependency_lines:
-            dependency_lines.append(trimmed)
-      else:
-        break
-  result = ''
-  for dep in dependency_lines:
-    components = dep.split(':')
-    assert len(components) == 3
-    group = components[0]
-    artifact = components[1]
-    version = components[2]
-    result += DEPENDENCYTEMPLATE.substitute(
-        group=group, artifact=artifact, version=version)
-  return result
-
 def write_default_r8_pom_file(pom_file, version):
-  write_pom_file(R8_POMTEMPLATE, pom_file, version, dependencies=generate_dependencies())
+  write_pom_file(R8_POMTEMPLATE, pom_file, version)
 
 def write_pom_file(
-    template, pom_file, version, artifact_id=None, dependencies='', library_licenses=''):
+    template, pom_file, version, artifact_id=None, library_licenses=''):
   version_pom = (
       template.substitute(
           artifactId=artifact_id,
           version=version,
-          dependencies=dependencies,
           library_licenses=library_licenses)
     if artifact_id else
       template.substitute(
-          version=version, dependencies=dependencies, library_licenses=library_licenses))
+          version=version, library_licenses=library_licenses))
   with open(pom_file, 'w') as file:
     file.write(version_pom)
 
@@ -323,18 +246,19 @@
     base_no_zip = out[0:len(out)-4]
     make_archive(base_no_zip, 'zip', tmp_dir)
 
-def generate_r8_maven_zip(out, is_r8lib=False, version_file=None, skip_gradle_build=False):
-  # Build the R8 no deps artifact.
+def generate_r8_maven_zip(out, version_file=None, skip_gradle_build=False,
+                          new_gradle=False):
   if not skip_gradle_build:
-    if not is_r8lib:
-      gradle.RunGradleExcludeDeps([utils.R8])
+    if (new_gradle):
+      gradle.RunGradle([':test:r8LibWithRelocatedDeps',
+                        '-Pno_internal'], new_gradle=True)
     else:
       gradle.RunGradle([utils.R8LIB, '-Pno_internal'])
 
   version = determine_version()
   with utils.TempDir() as tmp_dir:
     file_copy = join(tmp_dir, 'copy_of_jar.jar')
-    copyfile(utils.R8LIB_JAR if is_r8lib else utils.R8_JAR, file_copy)
+    copyfile(utils.R8LIB_JAR, file_copy)
 
     if version_file:
       with zipfile.ZipFile(file_copy, 'a') as zip:
@@ -346,8 +270,7 @@
         R8_POMTEMPLATE,
         pom_file,
         version,
-        dependencies='' if is_r8lib else generate_dependencies(),
-        library_licenses=generate_library_licenses() if is_r8lib else '')
+        library_licenses=generate_library_licenses())
     # Write the maven zip file.
     generate_maven_zip(
         'r8',
@@ -473,7 +396,7 @@
       utils.DESUGAR_IMPLEMENTATION_JDK11,
       utils.LIBRARY_DESUGAR_CONVERSIONS_ZIP)
   else:
-    generate_r8_maven_zip(options.out, options.r8lib)
+    generate_r8_maven_zip(options.out)
 
 if __name__ == "__main__":
   exit(main(sys.argv[1:]))
diff --git a/tools/create_r8lib.py b/tools/create_r8lib.py
index a27cf24..a778ab3 100755
--- a/tools/create_r8lib.py
+++ b/tools/create_r8lib.py
@@ -37,6 +37,11 @@
     default=False,
     help='Mark this artifact as an "excldeps" variant of the compiler')
   parser.add_argument(
+    '--debug-variant',
+    action='store_true',
+    default=False,
+    help='Compile with debug flag')
+  parser.add_argument(
     '--lib',
     action='append',
     help='Additional libraries (JDK 1.8 rt.jar already included)')
@@ -49,6 +54,10 @@
     action='append',
     help='Keep configuration')
   parser.add_argument(
+    '--pg-map',
+    default=None,
+    help='Input map for distribution and composition')
+  parser.add_argument(
     '--r8jar',
     required=True,
     help='The R8 jar to compile')
@@ -95,6 +104,8 @@
     cmd.extend(['-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005'])
   cmd.extend(['-cp', args.r8compiler, 'com.android.tools.r8.R8'])
   cmd.append(args.r8jar)
+  if args.debug_variant:
+    cmd.append('--debug')
   cmd.append('--classfile')
   cmd.extend(['--map-id-template', map_id_template])
   cmd.extend(['--source-file-template', source_file_template])
@@ -111,6 +122,8 @@
   if args.classpath:
     for cp in args.classpath:
       cmd.extend(['--classpath', cp])
+  if args.pg_map:
+    cmd.extend(['--pg-map', args.pg_map])
   print(' '.join(cmd))
   subprocess.check_call(cmd)
 
diff --git a/tools/linux/art-10.0.0.tar.gz.sha1 b/tools/linux/art-10.0.0.tar.gz.sha1
index d64a0d7..5a5883f 100644
--- a/tools/linux/art-10.0.0.tar.gz.sha1
+++ b/tools/linux/art-10.0.0.tar.gz.sha1
@@ -1 +1 @@
-04316aaf3b05ebfe17a35ea5f47d900ac3c32d69
\ No newline at end of file
+913765ddb848e0dc4b9c125f185fe5bdd5eed28a
\ No newline at end of file
diff --git a/tools/linux/art-5.1.1.tar.gz.sha1 b/tools/linux/art-5.1.1.tar.gz.sha1
index d7f86b0..9b01a78 100644
--- a/tools/linux/art-5.1.1.tar.gz.sha1
+++ b/tools/linux/art-5.1.1.tar.gz.sha1
@@ -1 +1 @@
-7c1b10e333a5a028db7f74a989d9edfe168900bf
\ No newline at end of file
+70045aa5878d2f7f750b040d3d05b3acc2984bff
\ No newline at end of file
diff --git a/tools/linux/art-6.0.1.tar.gz.sha1 b/tools/linux/art-6.0.1.tar.gz.sha1
index 8e9cf7f..4e17ca1 100644
--- a/tools/linux/art-6.0.1.tar.gz.sha1
+++ b/tools/linux/art-6.0.1.tar.gz.sha1
@@ -1 +1 @@
-8d46aad0898be3291dffa3c2656a28ffbc155ad4
\ No newline at end of file
+26e3858dab7662047e6c42977be707265c55c87d
\ No newline at end of file
diff --git a/tools/linux/art-7.0.0.tar.gz.sha1 b/tools/linux/art-7.0.0.tar.gz.sha1
index faae6a3..6133be7 100644
--- a/tools/linux/art-7.0.0.tar.gz.sha1
+++ b/tools/linux/art-7.0.0.tar.gz.sha1
@@ -1 +1 @@
-c044d5c8441d8b67e60febce580c252ac7bdde0f
\ No newline at end of file
+67b78c98dc13891f269f33244eb495c6e6f7e5e7
\ No newline at end of file
diff --git a/tools/linux/art-8.1.0.tar.gz.sha1 b/tools/linux/art-8.1.0.tar.gz.sha1
index 91aea2f..a63bd11 100644
--- a/tools/linux/art-8.1.0.tar.gz.sha1
+++ b/tools/linux/art-8.1.0.tar.gz.sha1
@@ -1 +1 @@
-0394edc4e2dbe9e5b04a81efede7578ecf20b853
\ No newline at end of file
+cb3c600221c9d8f753828851cfc855a76b2d0808
\ No newline at end of file
diff --git a/tools/linux/art-9.0.0.tar.gz.sha1 b/tools/linux/art-9.0.0.tar.gz.sha1
index 788e039..15cdcf3 100644
--- a/tools/linux/art-9.0.0.tar.gz.sha1
+++ b/tools/linux/art-9.0.0.tar.gz.sha1
@@ -1 +1 @@
-bfd3d6f4c7d7245d93eecdcc386b41299266e2d1
\ No newline at end of file
+d78bee0e43c83c93cce0776ced2be521e671394c
\ No newline at end of file
diff --git a/tools/linux/art.tar.gz.sha1 b/tools/linux/art.tar.gz.sha1
index 98bc420..a3fe049 100644
--- a/tools/linux/art.tar.gz.sha1
+++ b/tools/linux/art.tar.gz.sha1
@@ -1 +1 @@
-1b4c4528315324c023e888ee5c53fc57edb3d5bf
\ No newline at end of file
+9be36809c39980b104d045e253014be858cf5819
\ No newline at end of file
diff --git a/tools/linux/host/art-12.0.0-beta4.tar.gz.sha1 b/tools/linux/host/art-12.0.0-beta4.tar.gz.sha1
index 9f80774..bd5eea4 100644
--- a/tools/linux/host/art-12.0.0-beta4.tar.gz.sha1
+++ b/tools/linux/host/art-12.0.0-beta4.tar.gz.sha1
@@ -1 +1 @@
-df7267e9eff9cc1812b5a7b4111e7175d5e186e9
\ No newline at end of file
+969c9fb7571ecf198aacbff529c3d3ba352743ca
\ No newline at end of file
diff --git a/tools/linux/host/art-13.0.0.tar.gz.sha1 b/tools/linux/host/art-13.0.0.tar.gz.sha1
index 8ec439c..008bf5b 100644
--- a/tools/linux/host/art-13.0.0.tar.gz.sha1
+++ b/tools/linux/host/art-13.0.0.tar.gz.sha1
@@ -1 +1 @@
-241ecc532b3bf804ef92bdb568ce7d4d85248434
\ No newline at end of file
+2002103b43d57ad52c1e9101c7b1db8e1ba85038
\ No newline at end of file
diff --git a/tools/linux/host/art-14.0.0-beta3.tar.gz.sha1 b/tools/linux/host/art-14.0.0-beta3.tar.gz.sha1
index 42f9f43..2568d10 100644
--- a/tools/linux/host/art-14.0.0-beta3.tar.gz.sha1
+++ b/tools/linux/host/art-14.0.0-beta3.tar.gz.sha1
@@ -1 +1 @@
-c879ddf6410159a4ac7e673fd66a64abe2140ffa
\ No newline at end of file
+599d516cd106605931791d37b862a7404824d44e
\ No newline at end of file
diff --git a/tools/linux/host/art-master.tar.gz.sha1 b/tools/linux/host/art-master.tar.gz.sha1
index 096aa8c..f79fc13 100644
--- a/tools/linux/host/art-master.tar.gz.sha1
+++ b/tools/linux/host/art-master.tar.gz.sha1
@@ -1 +1 @@
-7c795b752ba1edce6c3e9e11d837d31eb78043a3
\ No newline at end of file
+c8f7b9bc4de8b3f019281b656a3bff344341c21f
\ No newline at end of file
diff --git a/tools/r8.py b/tools/r8.py
index 31abcf6..6789787 100755
--- a/tools/r8.py
+++ b/tools/r8.py
@@ -3,8 +3,83 @@
 # 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.
 
+import optparse
 import sys
+
 import toolhelper
+import utils
+
+def ParseOptions(argv):
+  parser = optparse.OptionParser(usage='%prog [options] -- [R8 options]')
+  parser.add_option(
+      '-c',
+      '--commit-hash',
+      '--commit_hash',
+      help='Commit hash of R8 to use.',
+      default=None)
+  parser.add_argument(
+      '--debug-agent',
+      help='Enable Java debug agent and suspend compilation (default disabled)',
+      default=False,
+      action='store_true')
+  parser.add_option(
+    '--ea',
+    help='Enable Java assertions when running the compiler (default disabled)',
+    default=False,
+    action='store_true')
+  parser.add_option(
+    '--lib-android',
+    help='Add the android.jar for the given API level',
+    default=None,
+    type=int)
+  parser.add_option(
+    '--lib-rt',
+    help='Add rt.jar from openjdk-1.8',
+    default=False,
+    action='store_true')
+  parser.add_option(
+    '--no-build', '--no_build',
+    help='Do not build R8',
+    default=False,
+    action='store_true')
+  parser.add_option(
+    '--print-runtimeraw', '--print_runtimeraw',
+    metavar='BENCHMARKNAME',
+    help='Print the line \'<BENCHMARKNAME>(RunTimeRaw):' +
+         ' <elapsed> ms\' at the end where <elapsed> is' +
+         ' the elapsed time in milliseconds.')
+  parser.add_option(
+      '--tag',
+      help='Tag of R8 to use.',
+      default=None)
+  parser.add_option(
+      '--version',
+      help='Version of R8 to use.',
+      default=None)
+  return parser.parse_args(argv)
+
+def main(argv):
+  (options, args) = ParseOptions(sys.argv)
+  r8_args = args[1:]
+  if options.lib_android:
+    r8_args.extend(['--lib', utils.get_android_jar(options.lib_android)])
+  if options.lib_rt:
+    r8_args.extend(['--lib', utils.RT_JAR])
+  time_consumer = lambda duration : print_duration(duration, options)
+  return toolhelper.run(
+      'r8',
+      r8_args,
+      build=not options.no_build,
+      debug=options.ea,
+      debug_agent=options.debug_agent,
+      jar=utils.find_r8_jar_from_options(options),
+      main='com.android.tools.r8.R8',
+      time_consumer=time_consumer)
+
+def print_duration(duration, options):
+  benchmark_name = options.print_runtimeraw
+  if benchmark_name:
+    print('%s-Total(RunTimeRaw): %s ms' % (benchmark_name, duration))
 
 if __name__ == '__main__':
-  sys.exit(toolhelper.run('r8', sys.argv[1:]))
+  sys.exit(main(sys.argv[1:]))
diff --git a/tools/r8_release.py b/tools/r8_release.py
index c5c5f51..347b29b 100755
--- a/tools/r8_release.py
+++ b/tools/r8_release.py
@@ -119,7 +119,10 @@
 
         validate_version_change_diff(version_diff_output, "main", version)
 
-        maybe_check_call(args, ['git', 'cl', 'upload', '--no-squash'])
+        cmd = ['git', 'cl', 'upload', '--no-squash']
+        if args.bypass_hooks:
+           cmd.append('--bypass-hooks')
+        maybe_check_call(args, cmd)
 
         if args.dry_run:
           input(
@@ -966,6 +969,10 @@
                       default=False,
                       action='store_true',
                       help='Delete CL in google3')
+  result.add_argument('--bypass-hooks', '--bypass_hooks',
+                      default=False,
+                      action='store_true',
+                      help="Bypass hooks when uploading")
   result.add_argument('--no-upload', '--no_upload',
                       default=False,
                       action='store_true',
diff --git a/tools/startup/generate_startup_descriptors.py b/tools/startup/generate_startup_descriptors.py
index c94a59c..adae239 100755
--- a/tools/startup/generate_startup_descriptors.py
+++ b/tools/startup/generate_startup_descriptors.py
@@ -63,7 +63,7 @@
       # Clear logcat and start capturing logcat.
       adb_utils.clear_logcat(device.device_id)
       logcat_process = adb_utils.start_logcat(
-          device.device_id, format='tag', filter='r8:I ActivityTaskManager:I *:S')
+          device.device_id, format='tag', filter='R8:I ActivityTaskManager:I *:S')
     else:
       # Clear existing profile data.
       adb_utils.clear_profile_data(options.app_id, device.device_id)
@@ -113,11 +113,13 @@
         print('Entering post startup: %s' % message)
         post_startup = True
         continue
-    elif tag == 'r8':
+    elif tag == 'R8':
       if is_startup_descriptor(message):
         startup_descriptors[message] = {
           'conditional_startup': False,
-          'post_startup': post_startup
+          'hot': False,
+          'post_startup': post_startup,
+          'startup': True
         }
         continue
     # Reaching here means we didn't expect this line.
@@ -318,6 +320,11 @@
                            'synthetic contexts',
                       action='store_true',
                       default=False)
+  result.add_argument('--grant-post-notification-permission',
+                      help='Grants the android.permission.POST_NOTIFICATIONS '
+                           'permission before launching the app',
+                      default=False,
+                      action='store_true')
   result.add_argument('--logcat',
                       action='store_true',
                       default=False)
@@ -401,6 +408,12 @@
   elif options.bundle:
     adb_utils.uninstall(options.app_id, device.device_id)
     adb_utils.install_bundle(options.bundle, device.device_id)
+  # Grant notifications.
+  if options.grant_post_notification_permission:
+    adb_utils.grant(
+        options.app_id,
+        'android.permission.POST_NOTIFICATIONS',
+        device.device_id)
   if options.until_stable:
     iteration = 0
     stable_iterations = 0
diff --git a/tools/test.py b/tools/test.py
index 40dc33c..89b4ee5 100755
--- a/tools/test.py
+++ b/tools/test.py
@@ -296,7 +296,7 @@
     gradle_args.append('-Pslow_tests=1')
   if options.tool:
     gradle_args.append('-Ptool=%s' % options.tool)
-  if options.one_line_per_test:
+  if options.one_line_per_test and not options.new_gradle:
     gradle_args.append('-Pone_line_per_test')
   if options.test_namespace:
     gradle_args.append('-Ptest_namespace=%s' % options.test_namespace)
@@ -342,10 +342,14 @@
     exit(1)
   if not options.no_r8lib:
     gradle_args.append('-Pr8lib')
-    # Force gradle to build a version of r8lib without dependencies for
-    # BootstrapCurrentEqualityTest.
-    gradle_args.append('R8LibNoDeps')
-    gradle_args.append('R8Retrace')
+    if options.new_gradle:
+      gradle_args.append(':test:r8LibNoDeps')
+      gradle_args.append(':test:retraceWithRelocatedDeps')
+    else:
+      # Force gradle to build a version of r8lib without dependencies for
+      # BootstrapCurrentEqualityTest.
+      gradle_args.append('R8LibNoDeps')
+      gradle_args.append('R8Retrace')
   if options.r8lib_no_deps:
     gradle_args.append('-Pr8lib_no_deps')
   if options.worktree:
@@ -372,6 +376,8 @@
     gradle_args.append(':main:r8WithRelocatedDeps')
     gradle_args.append(':test:cleanTest')
     gradle_args.append('test:test')
+    gradle_args.append('--stacktrace')
+    gradle_args.append('-Pprint_full_stacktraces')
   else:
     gradle_args.append('r8WithRelocatedDeps')
     gradle_args.append('r8WithRelocatedDeps17')
@@ -391,9 +397,14 @@
       print("No failing tests")
       return 0
   # Test filtering. Must always follow the 'test' task.
+  testFilterProperty = []
   for testFilter in args:
     gradle_args.append('--tests')
     gradle_args.append(testFilter)
+    testFilterProperty.append(testFilter)
+    assert not ("|" in testFilter), "| is used as separating character"
+  if len(testFilterProperty) > 0:
+    gradle_args.append("-Ptestfilter=" + "|".join(testFilterProperty))
   if options.with_code_coverage:
     # Create Jacoco report after tests.
     gradle_args.append('jacocoTestReport')
diff --git a/tools/testing_state.py b/tools/testing_state.py
index 7c51790..6cda6ca 100644
--- a/tools/testing_state.py
+++ b/tools/testing_state.py
@@ -16,6 +16,7 @@
     return
   if not testing_state_path:
     testing_state_path = os.path.join(DEFAULT_REPORTS_ROOT, utils.get_HEAD_branch())
+  testing_state_path = os.path.abspath(testing_state_path)
   gradle_args.append('-Ptesting-state-mode=%s' % testing_state_mode)
   gradle_args.append('-Ptesting-state-path=%s' % testing_state_path)
   prepare_testing_index(testing_state_mode, testing_state_path)
@@ -39,8 +40,7 @@
     parent_report = fresh_testing_index(testing_state_dir)
     os.rename(index_path, parent_report)
   index = open(index_path, "a")
-  relative_state_dir = os.path.relpath(testing_state_dir)
-  title = relative_state_dir
+  title = f"Testing: {os.path.basename(testing_state_dir)}"
   # Print a console link to the test report for easy access.
   print("=" * 70)
   print("Test report written to:")
@@ -59,6 +59,7 @@
   index.write(f"<p><a href=\"file://{testing_state_dir}\">Test directories</a></p>")
   # git branch/hash and diff for future reference
   index.write(f"<p>Run on: {datetime.datetime.now()}</p>")
+  index.write(f"<p>State path: {testing_state_dir}</p>")
   index.write(f"<p>Git branch: {utils.get_HEAD_branch()}")
   index.write(f"</br>Git SHA: {utils.get_HEAD_sha1()}")
   index.write(f'</br>Git diff summary:\n')
diff --git a/tools/toolhelper.py b/tools/toolhelper.py
index c8d8a08..f08fd49 100644
--- a/tools/toolhelper.py
+++ b/tools/toolhelper.py
@@ -16,7 +16,7 @@
         profile=False, track_memory_file=None, extra_args=None,
         stderr=None, stdout=None, return_stdout=False, timeout=0, quiet=False,
         cmd_prefix=None, jar=None, main=None, time_consumer=None,
-        worker_id=None):
+        debug_agent=None, worker_id=None):
   cmd = []
   if cmd_prefix:
     cmd.extend(cmd_prefix)
@@ -29,8 +29,9 @@
   cmd.append(jdk.GetJavaExecutable())
   if extra_args:
     cmd.extend(extra_args)
-  agent, args = extract_debug_agent_from_args(args)
-  if agent:
+  if debug_agent is None:
+    debug_agent, args = extract_debug_agent_from_args(args)
+  if debug_agent:
     cmd.append(
         '-agentlib:jdwp=transport=dt_socket,server=y,suspend=y,address=*:5005')
   if debug:
diff --git a/tools/utils.py b/tools/utils.py
index fe8b539..4c671b9 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -71,7 +71,6 @@
 R8LIB_TESTS_JAR = os.path.join(LIBS, 'r8libtestdeps-cf.jar')
 R8_TESTS_DEPS_JAR = os.path.join(LIBS, 'test_deps_all.jar')
 R8LIB_TESTS_DEPS_JAR = R8_TESTS_DEPS_JAR
-MAVEN_ZIP = os.path.join(LIBS, 'r8.zip')
 MAVEN_ZIP_LIB = os.path.join(LIBS, 'r8lib.zip')
 LIBRARY_DESUGAR_CONVERSIONS_LEGACY_ZIP = os.path.join(
     CUSTOM_CONVERSION_DIR, 'library_desugar_conversions_legacy.jar')
@@ -312,7 +311,9 @@
   return defines.IsOsX()
 
 def EnsureDepFromGoogleCloudStorage(dep, tgz, sha1, msg):
-  if not os.path.exists(dep) or os.path.getmtime(tgz) < os.path.getmtime(sha1):
+  if (not os.path.exists(dep)
+     or not os.path.exists(tgz)
+     or os.path.getmtime(tgz) < os.path.getmtime(sha1)):
     DownloadFromGoogleCloudStorage(sha1)
     # Update the mtime of the tar file to make sure we do not run again unless
     # there is an update.
