diff --git a/.gitignore b/.gitignore
index 17af682..dbe9747 100644
--- a/.gitignore
+++ b/.gitignore
@@ -135,32 +135,14 @@
 third_party/openjdk/desugar_jdk_libs_releases/1.1.1.tar.gz
 third_party/openjdk/desugar_jdk_libs_releases/1.1.5
 third_party/openjdk/desugar_jdk_libs_releases/1.1.5.tar.gz
-third_party/openjdk/jdk-17/linux
-third_party/openjdk/jdk-17/linux.tar.gz
-third_party/openjdk/jdk-17/osx
-third_party/openjdk/jdk-17/osx.tar.gz
-third_party/openjdk/jdk-17/windows
-third_party/openjdk/jdk-17/windows.tar.gz
-third_party/openjdk/jdk-16/linux
-third_party/openjdk/jdk-16/linux.tar.gz
-third_party/openjdk/jdk-16/osx
-third_party/openjdk/jdk-16/osx.tar.gz
-third_party/openjdk/jdk-16/windows
-third_party/openjdk/jdk-16/windows.tar.gz
-third_party/openjdk/jdk-15/linux
-third_party/openjdk/jdk-15/linux.tar.gz
-third_party/openjdk/jdk-15/osx
-third_party/openjdk/jdk-15/osx.tar.gz
-third_party/openjdk/jdk-15/windows
-third_party/openjdk/jdk-15/windows.tar.gz
-third_party/openjdk/jdk-11-test
+third_party/openjdk/jdk-[0-9][0-9]/linux
+third_party/openjdk/jdk-[0-9][0-9]/linux.tar.gz
+third_party/openjdk/jdk-[0-9][0-9]/osx
+third_party/openjdk/jdk-[0-9][0-9]/osx.tar.gz
+third_party/openjdk/jdk-[0-9][0-9]/windows
+third_party/openjdk/jdk-[0-9][0-9]/windows.tar.gz
 third_party/openjdk/jdk-11-test.tar.gz
-third_party/openjdk/jdk-11/linux
-third_party/openjdk/jdk-11/linux.tar.gz
-third_party/openjdk/jdk-11/osx
-third_party/openjdk/jdk-11/osx.tar.gz
-third_party/openjdk/jdk-11/windows
-third_party/openjdk/jdk-11/windows.tar.gz
+third_party/openjdk/jdk-11-test/
 third_party/openjdk/jdk8/darwin-x86
 third_party/openjdk/jdk8/darwin-x86.tar.gz
 third_party/openjdk/jdk8/linux-x86
@@ -278,6 +260,8 @@
 tools/*/art-10.0.0.tar.gz
 tools/*/host/art-12.0.0-beta4
 tools/*/host/art-12.0.0-beta4.tar.gz
+tools/*/host/art-13-master
+tools/*/host/art-13-master.tar.gz
 tools/*/art.tar.gz
 tools/*/dalvik
 tools/*/dalvik-4.0.4
diff --git a/build.gradle b/build.gradle
index 919c260..560c1de 100644
--- a/build.gradle
+++ b/build.gradle
@@ -140,6 +140,11 @@
             srcDirs = ['src/test/examplesJava17']
         }
     }
+    examplesJava18 {
+        java {
+            srcDirs = ['src/test/examplesJava18']
+        }
+    }
     examplesTestNGRunner {
         java {
             srcDirs = ['src/test/testngrunner']
@@ -333,6 +338,7 @@
                 "android_jar/lib-v30",
                 "android_jar/lib-v31",
                 "android_jar/lib-v32",
+                "android_jar/lib-v33",
                 "api-outlining/simple-app-dump",
                 "binary_compatibility_tests/compiler_api_tests",
                 "core-lambda-stubs",
@@ -386,6 +392,7 @@
                 "linux/art-9.0.0",
                 "linux/art-10.0.0",
                 "linux/host/art-12.0.0-beta4",
+                "linux/host/art-13-master",
                 "linux/dalvik",
                 "linux/dalvik-4.0.4",
                 "${osString}/dx",
@@ -397,18 +404,21 @@
                 "third_party": ["openjdk/openjdk-9.0.4/linux",
                                 "openjdk/jdk8/linux-x86",
                                 "openjdk/jdk-11/linux",
-                                "openjdk/jdk-17/linux"],
+                                "openjdk/jdk-17/linux",
+                                "openjdk/jdk-18/linux"],
         ],
         osx: [
                 "third_party": ["openjdk/openjdk-9.0.4/osx",
                                 "openjdk/jdk8/darwin-x86",
                                 "openjdk/jdk-11/osx",
-                                "openjdk/jdk-17/osx"],
+                                "openjdk/jdk-17/osx",
+                                "openjdk/jdk-18/osx"],
         ],
         windows: [
                 "third_party": ["openjdk/openjdk-9.0.4/windows",
                                 "openjdk/jdk-11/windows",
-                                "openjdk/jdk-17/windows"],
+                                "openjdk/jdk-17/windows",
+                                "openjdk/jdk-18/windows"],
         ],
 ]
 
@@ -646,6 +656,12 @@
         'jdk-17',
         JavaVersion.VERSION_17,
         false)
+setJdkCompilationWithCompatibility(
+        sourceSets.examplesJava18.compileJavaTaskName,
+        'jdk-18',
+        // TODO(b/218293990): Update Gradle to get JavaVersion.VERSION_18.
+        JavaVersion.VERSION_17,
+        false)
 
 task provideJdk11TestsDependencies(type: org.gradle.api.tasks.Copy) {
     from sourceSets.examplesTestNGRunner.compileClasspath
@@ -1595,6 +1611,7 @@
 buildExampleJarsCreateTask("Java10", sourceSets.examplesJava10)
 buildExampleJarsCreateTask("Java11", sourceSets.examplesJava11)
 buildExampleJarsCreateTask("Java17", sourceSets.examplesJava17)
+buildExampleJarsCreateTask("Java18", sourceSets.examplesJava18)
 
 task provideArtFrameworksDependencies {
     cloudDependencies.tools.forEach({ art ->
@@ -1656,6 +1673,7 @@
     dependsOn buildExampleJava10Jars
     dependsOn buildExampleJava11Jars
     dependsOn buildExampleJava17Jars
+    dependsOn buildExampleJava18Jars
     dependsOn buildExampleAndroidApi
     def examplesDir = file("src/test/examples")
     def noDexTests = [
diff --git a/infra/config/global/generated/cr-buildbucket.cfg b/infra/config/global/generated/cr-buildbucket.cfg
index 9dae144..6661615 100644
--- a/infra/config/global/generated/cr-buildbucket.cfg
+++ b/infra/config/global/generated/cr-buildbucket.cfg
@@ -46,10 +46,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "archive_release"
@@ -79,10 +75,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "desugared_library-head"
@@ -116,10 +108,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "desugared_library-jdk11_head"
@@ -155,10 +143,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "lib_desugar-archive"
@@ -188,10 +172,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-android-10.0.0"
@@ -229,10 +209,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-android-10.0.0_release"
@@ -270,10 +246,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-android-12.0.0"
@@ -311,10 +283,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-android-12.0.0_release"
@@ -352,8 +320,78 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
+    }
+    builders {
+      name: "linux-android-13.0.0"
+      swarming_host: "chrome-swarming.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "normal:true"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.r8.ci"
+      exe {
+        cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+        cipd_version: "refs/heads/master"
+        cmd: "luciexe"
+      }
+      properties:
+        '{'
+        '  "builder_group": "internal.client.r8",'
+        '  "recipe": "rex",'
+        '  "test_options": ['
+        '    "--dex_vm=13.0.0",'
+        '    "--all_tests",'
+        '    "--tool=r8",'
+        '    "--no_internal",'
+        '    "--one_line_per_test",'
+        '    "--archive_failures"'
+        '  ]'
+        '}'
+      priority: 26
+      execution_timeout_secs: 21600
+      expiration_secs: 126000
+      build_numbers: YES
+      service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
       experiments {
-        key: "luci.use_realms"
+        key: "luci.recipes.use_python3"
+        value: 100
+      }
+    }
+    builders {
+      name: "linux-android-13.0.0_release"
+      swarming_host: "chrome-swarming.appspot.com"
+      swarming_tags: "vpython:native-python-wrapper"
+      dimensions: "cores:8"
+      dimensions: "cpu:x86-64"
+      dimensions: "normal:true"
+      dimensions: "os:Ubuntu-16.04"
+      dimensions: "pool:luci.r8.ci"
+      exe {
+        cipd_package: "infra_internal/recipe_bundles/chrome-internal.googlesource.com/chrome/tools/build_limited/scripts/slave"
+        cipd_version: "refs/heads/master"
+        cmd: "luciexe"
+      }
+      properties:
+        '{'
+        '  "builder_group": "internal.client.r8",'
+        '  "recipe": "rex",'
+        '  "test_options": ['
+        '    "--dex_vm=13.0.0",'
+        '    "--all_tests",'
+        '    "--tool=r8",'
+        '    "--no_internal",'
+        '    "--one_line_per_test",'
+        '    "--archive_failures"'
+        '  ]'
+        '}'
+      priority: 26
+      execution_timeout_secs: 21600
+      expiration_secs: 126000
+      build_numbers: YES
+      service_account: "r8-ci-builder@chops-service-accounts.iam.gserviceaccount.com"
+      experiments {
+        key: "luci.recipes.use_python3"
         value: 100
       }
     }
@@ -393,10 +431,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-android-4.0.4_release"
@@ -434,10 +468,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-android-4.4.4"
@@ -475,10 +505,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-android-4.4.4_release"
@@ -516,10 +542,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-android-5.1.1"
@@ -557,10 +579,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-android-5.1.1_release"
@@ -598,10 +616,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-android-6.0.1"
@@ -639,10 +653,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-android-6.0.1_release"
@@ -680,10 +690,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-android-7.0.0"
@@ -721,10 +727,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-android-7.0.0_release"
@@ -762,10 +764,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-android-8.1.0"
@@ -803,10 +801,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-android-8.1.0_release"
@@ -844,10 +838,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-android-9.0.0"
@@ -885,10 +875,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-android-9.0.0_release"
@@ -926,10 +912,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-d8_jctf"
@@ -967,10 +949,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-d8_jctf_release"
@@ -1008,10 +986,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-dex_default"
@@ -1048,10 +1022,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-dex_default_release"
@@ -1088,10 +1058,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-internal"
@@ -1125,10 +1091,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-internal_release"
@@ -1162,10 +1124,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-jdk11"
@@ -1202,10 +1160,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-jdk11_release"
@@ -1242,10 +1196,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-jdk8"
@@ -1282,10 +1232,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-jdk8_release"
@@ -1322,10 +1268,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-jdk9"
@@ -1362,10 +1304,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-jdk9_release"
@@ -1402,10 +1340,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-kotlin_dev"
@@ -1443,10 +1377,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-kotlin_old"
@@ -1484,10 +1414,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-none"
@@ -1524,10 +1450,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-none_release"
@@ -1564,10 +1486,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-r8cf_jctf"
@@ -1605,10 +1523,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-r8cf_jctf_release"
@@ -1646,10 +1560,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-run-on-app-dump"
@@ -1682,10 +1592,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "linux-run-on-app-dump_release"
@@ -1718,10 +1624,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "windows"
@@ -1757,10 +1659,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
     builders {
       name: "windows_release"
@@ -1796,10 +1694,6 @@
         key: "luci.recipes.use_python3"
         value: 100
       }
-      experiments {
-        key: "luci.use_realms"
-        value: 100
-      }
     }
   }
 }
diff --git a/infra/config/global/generated/luci-milo.cfg b/infra/config/global/generated/luci-milo.cfg
index 6151ce6..8bbf1b1 100644
--- a/infra/config/global/generated/luci-milo.cfg
+++ b/infra/config/global/generated/luci-milo.cfg
@@ -86,6 +86,11 @@
     short_name: "12.0.0"
   }
   builders {
+    name: "buildbucket/luci.r8.ci/linux-android-13.0.0"
+    category: "R8"
+    short_name: "13.0.0"
+  }
+  builders {
     name: "buildbucket/luci.r8.ci/windows"
     category: "R8"
     short_name: "windows"
@@ -211,6 +216,11 @@
     short_name: "12.0.0"
   }
   builders {
+    name: "buildbucket/luci.r8.ci/linux-android-13.0.0_release"
+    category: "Release|R8"
+    short_name: "13.0.0"
+  }
+  builders {
     name: "buildbucket/luci.r8.ci/windows_release"
     category: "Release|R8"
     short_name: "windows"
diff --git a/infra/config/global/generated/luci-notify.cfg b/infra/config/global/generated/luci-notify.cfg
index e697c32..d98d266 100644
--- a/infra/config/global/generated/luci-notify.cfg
+++ b/infra/config/global/generated/luci-notify.cfg
@@ -108,6 +108,30 @@
   }
   builders {
     bucket: "ci"
+    name: "linux-android-13.0.0"
+    repository: "https://r8.googlesource.com/r8"
+  }
+}
+notifiers {
+  notifications {
+    on_failure: true
+    on_new_failure: true
+    notify_blamelist {}
+  }
+  builders {
+    bucket: "ci"
+    name: "linux-android-13.0.0_release"
+    repository: "https://r8.googlesource.com/r8"
+  }
+}
+notifiers {
+  notifications {
+    on_failure: true
+    on_new_failure: true
+    notify_blamelist {}
+  }
+  builders {
+    bucket: "ci"
     name: "linux-android-4.0.4"
     repository: "https://r8.googlesource.com/r8"
   }
diff --git a/infra/config/global/generated/luci-scheduler.cfg b/infra/config/global/generated/luci-scheduler.cfg
index 6d92824..629ee37 100644
--- a/infra/config/global/generated/luci-scheduler.cfg
+++ b/infra/config/global/generated/luci-scheduler.cfg
@@ -15,7 +15,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "archive"
   }
 }
@@ -30,7 +30,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "archive_release"
   }
 }
@@ -44,7 +44,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "desugared_library-head"
   }
 }
@@ -58,7 +58,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "desugared_library-jdk11_head"
   }
 }
@@ -73,7 +73,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "lib_desugar-archive"
   }
 }
@@ -87,7 +87,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-android-10.0.0"
   }
 }
@@ -102,7 +102,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-android-10.0.0_release"
   }
 }
@@ -116,7 +116,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-android-12.0.0"
   }
 }
@@ -131,11 +131,40 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-android-12.0.0_release"
   }
 }
 job {
+  id: "linux-android-13.0.0"
+  realm: "ci"
+  acl_sets: "ci"
+  triggering_policy {
+    kind: GREEDY_BATCHING
+    max_concurrent_invocations: 4
+  }
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "linux-android-13.0.0"
+  }
+}
+job {
+  id: "linux-android-13.0.0_release"
+  realm: "ci"
+  acl_sets: "ci"
+  triggering_policy {
+    kind: GREEDY_BATCHING
+    max_concurrent_invocations: 4
+    max_batch_size: 1
+  }
+  buildbucket {
+    server: "cr-buildbucket.appspot.com"
+    bucket: "ci"
+    builder: "linux-android-13.0.0_release"
+  }
+}
+job {
   id: "linux-android-4.0.4"
   realm: "ci"
   acl_sets: "ci"
@@ -145,7 +174,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-android-4.0.4"
   }
 }
@@ -160,7 +189,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-android-4.0.4_release"
   }
 }
@@ -174,7 +203,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-android-4.4.4"
   }
 }
@@ -189,7 +218,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-android-4.4.4_release"
   }
 }
@@ -203,7 +232,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-android-5.1.1"
   }
 }
@@ -218,7 +247,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-android-5.1.1_release"
   }
 }
@@ -232,7 +261,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-android-6.0.1"
   }
 }
@@ -247,7 +276,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-android-6.0.1_release"
   }
 }
@@ -261,7 +290,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-android-7.0.0"
   }
 }
@@ -276,7 +305,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-android-7.0.0_release"
   }
 }
@@ -290,7 +319,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-android-8.1.0"
   }
 }
@@ -305,7 +334,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-android-8.1.0_release"
   }
 }
@@ -319,7 +348,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-android-9.0.0"
   }
 }
@@ -334,7 +363,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-android-9.0.0_release"
   }
 }
@@ -348,7 +377,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-d8_jctf"
   }
 }
@@ -363,7 +392,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-d8_jctf_release"
   }
 }
@@ -377,7 +406,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-dex_default"
   }
 }
@@ -392,7 +421,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-dex_default_release"
   }
 }
@@ -406,7 +435,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-internal"
   }
 }
@@ -420,7 +449,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-internal_release"
   }
 }
@@ -434,7 +463,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-jdk11"
   }
 }
@@ -449,7 +478,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-jdk11_release"
   }
 }
@@ -463,7 +492,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-jdk8"
   }
 }
@@ -478,7 +507,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-jdk8_release"
   }
 }
@@ -492,7 +521,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-jdk9"
   }
 }
@@ -507,7 +536,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-jdk9_release"
   }
 }
@@ -521,7 +550,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-kotlin_dev"
   }
 }
@@ -535,7 +564,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-kotlin_old"
   }
 }
@@ -549,7 +578,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-none"
   }
 }
@@ -564,7 +593,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-none_release"
   }
 }
@@ -578,7 +607,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-r8cf_jctf"
   }
 }
@@ -593,7 +622,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-r8cf_jctf_release"
   }
 }
@@ -607,7 +636,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-run-on-app-dump"
   }
 }
@@ -622,7 +651,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "linux-run-on-app-dump_release"
   }
 }
@@ -636,7 +665,7 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "windows"
   }
 }
@@ -651,17 +680,38 @@
   }
   buildbucket {
     server: "cr-buildbucket.appspot.com"
-    bucket: "luci.r8.ci"
+    bucket: "ci"
     builder: "windows_release"
   }
 }
 trigger {
+  id: "branch-gitiles-3.2-forward"
+  realm: "ci"
+  acl_sets: "ci"
+  triggers: "linux-android-12.0.0_release"
+  gitiles {
+    repo: "https://r8.googlesource.com/r8"
+    refs: "regexp:refs/heads//([3]\\.[2-9]+(\\.[0-9]+)?|[4-9]\\.[0-9]+(\\.[0-9]+)?)"
+    path_regexps: "src/main/java/com/android/tools/r8/Version.java"
+  }
+}
+trigger {
+  id: "branch-gitiles-3.3-forward"
+  realm: "ci"
+  acl_sets: "ci"
+  triggers: "linux-android-13.0.0_release"
+  gitiles {
+    repo: "https://r8.googlesource.com/r8"
+    refs: "regexp:refs/heads//([3]\\.[3-9]+(\\.[0-9]+)?|[4-9]\\.[0-9]+(\\.[0-9]+)?)"
+    path_regexps: "src/main/java/com/android/tools/r8/Version.java"
+  }
+}
+trigger {
   id: "branch-gitiles-trigger"
   realm: "ci"
   acl_sets: "ci"
   triggers: "archive_release"
   triggers: "linux-android-10.0.0_release"
-  triggers: "linux-android-12.0.0_release"
   triggers: "linux-android-4.0.4_release"
   triggers: "linux-android-4.4.4_release"
   triggers: "linux-android-5.1.1_release"
@@ -681,7 +731,7 @@
   triggers: "windows_release"
   gitiles {
     repo: "https://r8.googlesource.com/r8"
-    refs: "regexp:refs/heads/(?:d8-)?[0-9]+\\.[0-9]+(\\.[0-9]+)?"
+    refs: "regexp:refs/heads/[0-9]+\\.[0-9]+(\\.[0-9]+)?"
     path_regexps: "src/main/java/com/android/tools/r8/Version.java"
   }
 }
@@ -694,6 +744,7 @@
   triggers: "desugared_library-jdk11_head"
   triggers: "linux-android-10.0.0"
   triggers: "linux-android-12.0.0"
+  triggers: "linux-android-13.0.0"
   triggers: "linux-android-4.0.4"
   triggers: "linux-android-4.4.4"
   triggers: "linux-android-5.1.1"
diff --git a/infra/config/global/generated/project.cfg b/infra/config/global/generated/project.cfg
index b87c601..974c534 100644
--- a/infra/config/global/generated/project.cfg
+++ b/infra/config/global/generated/project.cfg
@@ -7,8 +7,9 @@
 name: "r8"
 access: "group:all"
 lucicfg {
-  version: "1.30.5"
+  version: "1.30.9"
   package_dir: ".."
   config_dir: "generated"
   entry_point: "main.star"
+  experiments: "crbug.com/1182002"
 }
diff --git a/infra/config/global/main.star b/infra/config/global/main.star
index 02b45d5..6c59f26 100755
--- a/infra/config/global/main.star
+++ b/infra/config/global/main.star
@@ -1,13 +1,11 @@
 #!/usr/bin/env lucicfg
 
-lucicfg.check_version("1.28.0", "Please use newer `lucicfg` binary")
+lucicfg.check_version("1.30.9", "Please use newer `lucicfg` binary")
 
-# Enable LUCI Realms support.
-lucicfg.enable_experiment("crbug.com/1085650")
+# Use LUCI Scheduler BBv2 names and add Scheduler realms configs.
+lucicfg.enable_experiment("crbug.com/1182002")
 
-# Launch 0% of Builds in "realms-aware mode"
 luci.builder.defaults.experiments.set({
-    "luci.use_realms": 100,
     "luci.recipes.use_python3": 100
 })
 
@@ -111,11 +109,26 @@
 )
 
 luci.gitiles_poller(
+  name = "branch-gitiles-3.3-forward",
+  bucket = "ci",
+  repo = "https://r8.googlesource.com/r8",
+  refs = ["refs/heads//([3]\\.[3-9]+(\\.[0-9]+)?|[4-9]\\.[0-9]+(\\.[0-9]+)?)"],
+  path_regexps = ["src/main/java/com/android/tools/r8/Version.java"]
+)
+
+luci.gitiles_poller(
+  name = "branch-gitiles-3.2-forward",
+  bucket = "ci",
+  repo = "https://r8.googlesource.com/r8",
+  refs = ["refs/heads//([3]\\.[2-9]+(\\.[0-9]+)?|[4-9]\\.[0-9]+(\\.[0-9]+)?)"],
+  path_regexps = ["src/main/java/com/android/tools/r8/Version.java"]
+)
+
+luci.gitiles_poller(
   name = "branch-gitiles-trigger",
   bucket = "ci",
   repo = "https://r8.googlesource.com/r8",
-  # Version branches are named d8-x.y (up until d8-1.5) or just x.y (from 1.6)
-  refs = ["refs/heads/(?:d8-)?[0-9]+\\.[0-9]+(\\.[0-9]+)?"],
+  refs = ["refs/heads/[0-9]+\\.[0-9]+(\\.[0-9]+)?"],
   path_regexps = ["src/main/java/com/android/tools/r8/Version.java"]
 )
 
@@ -167,10 +180,14 @@
   return dimensions
 
 def r8_builder(name, priority=26, trigger=True, category=None,
-               triggering_policy=None, **kwargs):
+               triggering_policy=None, release_trigger=None, **kwargs):
   release = name.endswith("release")
-  triggered = None if not trigger else ["branch-gitiles-trigger"] if release\
-      else ["main-gitiles-trigger"]
+  triggered = None
+  if trigger:
+    if release:
+      triggered = release_trigger if release_trigger else ["branch-gitiles-trigger"]
+    else:
+      triggered = ["main-gitiles-trigger"]
   triggering_policy = triggering_policy or scheduler.policy(
       kind = scheduler.GREEDY_BATCHING_KIND,
       max_batch_size = 1 if release else None,
@@ -199,7 +216,8 @@
     dimensions = None,
     execution_timeout = time.hour * 6,
     expiration_timeout = time.hour * 35,
-    category=None):
+    category=None,
+    release_trigger=None):
   dimensions = dimensions if dimensions else get_dimensions(normal=True)
   for name in [name, name + "_release"]:
     r8_builder(
@@ -208,15 +226,20 @@
         execution_timeout = execution_timeout,
         expiration_timeout = expiration_timeout,
         dimensions = dimensions,
+        release_trigger=release_trigger,
         properties = {
             "test_options" : test_options,
             "builder_group" : "internal.client.r8"
         }
     )
 
-def r8_tester_with_default(name, test_options, dimensions=None, category=None):
+def r8_tester_with_default(name,
+    test_options,
+    dimensions=None,
+    category=None,
+    release_trigger=None):
   r8_tester(name, test_options + common_test_options,
-            dimensions = dimensions, category = category)
+            dimensions = dimensions, category = category, release_trigger=release_trigger)
 
 def archivers():
   for name in ["archive", "archive_release", "lib_desugar-archive"]:
@@ -265,7 +288,11 @@
 r8_tester_with_default("linux-android-10.0.0",
     ["--dex_vm=10.0.0", "--all_tests"])
 r8_tester_with_default("linux-android-12.0.0",
-    ["--dex_vm=12.0.0", "--all_tests"])
+    ["--dex_vm=12.0.0", "--all_tests"],
+    release_trigger=["branch-gitiles-3.2-forward"])
+r8_tester_with_default("linux-android-13.0.0",
+    ["--dex_vm=13.0.0", "--all_tests"],
+    release_trigger=["branch-gitiles-3.3-forward"])
 
 r8_tester_with_default("windows", ["--all_tests"],
     dimensions=get_dimensions(windows=True))
@@ -396,4 +423,4 @@
           category = v[1],
           short_name = v[2]
       )
-add_view_entries()
\ No newline at end of file
+add_view_entries()
diff --git a/scripts/add-openjdk.sh b/scripts/add-openjdk.sh
index 6f8bada..f6b3284 100755
--- a/scripts/add-openjdk.sh
+++ b/scripts/add-openjdk.sh
@@ -14,13 +14,16 @@
 # Create directory third_party/openjdk/jdk-X
 # cd into third_party/openjdk/jdk-X
 # Prepare README.google
-# Update JDK_VERSION below
+# Update JDK_VERSION and JDK_VERSION_FULL below
 
 # Now run script with fingers crossed!
 
-JDK_VERSION=17
+JDK_VERSION="18"
+JDK_VERSION_FULL=${JDK_VERSION}
+# For ea versions the full version name has a postfix.
+# JDK_VERSION_FULL="${JDK_VERSION}-ea+33"
 
-tar xf ~/Downloads/openjdk-${JDK_VERSION}_linux-x64_bin.tar.gz
+tar xf ~/Downloads/openjdk-${JDK_VERSION_FULL}_linux-x64_bin.tar.gz
 cp -rL jdk-${JDK_VERSION} linux
 cp README.google linux
 upload_to_google_storage.py -a --bucket r8-deps linux
@@ -28,7 +31,7 @@
 rm -rf linux
 rm linux.tar.gz
 
-tar xf ~/Downloads/openjdk-${JDK_VERSION}_macos-x64_bin.tar.gz
+tar xf ~/Downloads/openjdk-${JDK_VERSION_FULL}_macos-x64_bin.tar.gz
 cp -rL jdk-${JDK_VERSION}.jdk osx
 cp README.google osx
 upload_to_google_storage.py -a --bucket r8-deps osx
@@ -36,7 +39,7 @@
 rm -rf jdk-${JDK_VERSION}.jdk
 rm osx.tar.gz
 
-unzip ~/Downloads/openjdk-${JDK_VERSION}_windows-x64_bin.zip
+unzip ~/Downloads/openjdk-${JDK_VERSION_FULL}_windows-x64_bin.zip
 cp -rL jdk-${JDK_VERSION} windows
 cp README.google windows
 upload_to_google_storage.py -a --bucket r8-deps windows
diff --git a/src/library_desugar/jdk11/chm_only_desugar_jdk_libs.json b/src/library_desugar/jdk11/chm_only_desugar_jdk_libs.json
index 565ffd9..f3a4daa 100644
--- a/src/library_desugar/jdk11/chm_only_desugar_jdk_libs.json
+++ b/src/library_desugar/jdk11/chm_only_desugar_jdk_libs.json
@@ -3,7 +3,7 @@
   "group_id" : "com.tools.android",
   "artifact_id" : "chm_only_desugar_jdk_libs",
   "version": "1.0.12",
-  "required_compilation_api_level": 31,
+  "required_compilation_api_level": 30,
   "synthesized_library_classes_package_prefix": "j$.",
   "support_all_callbacks_from_library": false,
   "common_flags": [
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs.json b/src/library_desugar/jdk11/desugar_jdk_libs.json
index fb03dbb..b075745 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs.json
@@ -3,7 +3,7 @@
   "group_id" : "com.tools.android",
   "artifact_id" : "desugar_jdk_libs",
   "version": "2.0.0",
-  "required_compilation_api_level": 31,
+  "required_compilation_api_level": 30,
   "synthesized_library_classes_package_prefix": "j$.",
   "support_all_callbacks_from_library": true,
   "common_flags": [
@@ -205,7 +205,7 @@
         "java.nio.charset.StandardCharsets": "j$.nio.charset.StandardCharsets"
       },
       "retarget_lib_member": {
-        "java.lang.Character#isBmpCodePoint": "j$.lang.DesugarCharacter"
+        "java.lang.Character#isBmpCodePoint": "java.lang.DesugarCharacter"
       }
     }
   ],
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs_alternative_3.json b/src/library_desugar/jdk11/desugar_jdk_libs_alternative_3.json
index fac2ec0..1482909 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs_alternative_3.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs_alternative_3.json
@@ -3,7 +3,7 @@
   "group_id" : "com.tools.android",
   "artifact_id" : "desugar_jdk_libs_alternative_3",
   "version": "2.0.0",
-  "required_compilation_api_level": 31,
+  "required_compilation_api_level": 30,
   "synthesized_library_classes_package_prefix": "j$.",
   "support_all_callbacks_from_library": false,
   "common_flags": [
@@ -209,7 +209,7 @@
         "java.nio.charset.StandardCharsets": "j$.nio.charset.StandardCharsets"
       },
       "retarget_lib_member": {
-        "java.lang.Character#isBmpCodePoint": "j$.lang.DesugarCharacter"
+        "java.lang.Character#isBmpCodePoint": "java.lang.DesugarCharacter"
       }
     }
   ],
diff --git a/src/main/java/com/android/tools/r8/BackportedMethodListCommand.java b/src/main/java/com/android/tools/r8/BackportedMethodListCommand.java
index bce73f0..7ef1569 100644
--- a/src/main/java/com/android/tools/r8/BackportedMethodListCommand.java
+++ b/src/main/java/com/android/tools/r8/BackportedMethodListCommand.java
@@ -105,7 +105,7 @@
   InternalOptions getInternalOptions() {
     InternalOptions options = new InternalOptions(factory, getReporter());
     options.setMinApiLevel(AndroidApiLevel.getAndroidApiLevel(minApiLevel));
-    options.desugaredLibrarySpecification = desugaredLibrarySpecification;
+    options.setDesugaredLibrarySpecification(desugaredLibrarySpecification, getInputApp());
     return options;
   }
 
diff --git a/src/main/java/com/android/tools/r8/BaseCompilerCommandParser.java b/src/main/java/com/android/tools/r8/BaseCompilerCommandParser.java
index 1316be8..631b5b3 100644
--- a/src/main/java/com/android/tools/r8/BaseCompilerCommandParser.java
+++ b/src/main/java/com/android/tools/r8/BaseCompilerCommandParser.java
@@ -3,8 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8;
 
-import com.android.tools.r8.AssertionsConfiguration.AssertionTransformation;
+import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.references.MethodReference;
+import com.android.tools.r8.references.Reference;
+import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.ExceptionDiagnostic;
 import com.android.tools.r8.utils.Reporter;
 import com.android.tools.r8.utils.StringDiagnostic;
@@ -38,7 +41,16 @@
           "  --force-pa[:[<class name>|<package name>...]]",
           "                          # Don't change javac generated assertion code. This",
           "                          # is the default handling of javac assertion code when",
-          "                          # generating class file format.");
+          "                          # generating class file format.",
+          "  --force-assertions-handler:<handler method>[:[<class name>|<package name>...]]",
+          "  --force-ah:<handler method>[:[<class name>|<package name>...]]",
+          "                          # Change javac and kotlinc generated assertion code to invoke",
+          "                          # the method <handler method> with each assertion error",
+          "                          # instead of throwing it. The <handler method> is specified"
+              + " as",
+          "                          # a class name followed by a dot and the method name. The",
+          "                          # handler method must take a single argument of type",
+          "                          # java.lang.Throwable and have return type void.");
 
   static final Iterable<String> THREAD_COUNT_USAGE_MESSAGE =
       Arrays.asList(
@@ -82,23 +94,54 @@
 
   private static String PACKAGE_ASSERTION_POSTFIX = "...";
 
+  private enum AssertionTransformationType {
+    ENABLE,
+    DISABLE,
+    PASSTHROUGH,
+    HANDLER
+  }
+
+  private AssertionsConfiguration.Builder prepareBuilderForScope(
+      AssertionsConfiguration.Builder builder,
+      AssertionTransformationType transformation,
+      MethodReference assertionHandler) {
+    switch (transformation) {
+      case ENABLE:
+        return builder.setCompileTimeEnable();
+      case DISABLE:
+        return builder.setCompileTimeDisable();
+      case PASSTHROUGH:
+        return builder.setPassthrough();
+      case HANDLER:
+        return builder.setAssertionHandler(assertionHandler);
+      default:
+        throw new Unreachable();
+    }
+  }
+
   private void addAssertionTransformation(
-      B builder, AssertionTransformation transformation, String scope) {
+      B builder,
+      AssertionTransformationType transformation,
+      MethodReference assertionHandler,
+      String scope) {
     if (scope == null) {
       builder.addAssertionsConfiguration(
-          b -> b.setTransformation(transformation).setScopeAll().build());
+          b -> prepareBuilderForScope(b, transformation, assertionHandler).setScopeAll().build());
     } else {
       assert scope.length() > 0;
       if (scope.endsWith(PACKAGE_ASSERTION_POSTFIX)) {
         builder.addAssertionsConfiguration(
             b ->
-                b.setTransformation(transformation)
+                prepareBuilderForScope(b, transformation, assertionHandler)
                     .setScopePackage(
                         scope.substring(0, scope.length() - PACKAGE_ASSERTION_POSTFIX.length()))
                     .build());
       } else {
         builder.addAssertionsConfiguration(
-            b -> b.setTransformation(transformation).setScopeClass(scope).build());
+            b ->
+                prepareBuilderForScope(b, transformation, assertionHandler)
+                    .setScopeClass(scope)
+                    .build());
       }
     }
   }
@@ -110,34 +153,78 @@
     String FORCE_DA = "--force-da";
     String FORCE_PASSTHROUGH_ASSERTIONS = "--force-passthrough-assertions";
     String FORCE_PA = "--force-pa";
+    String FORCE_ASSERTIONS_HANDLER = "--force-assertions-handler";
+    String FORCE_AH = "--force-ah";
 
-    AssertionTransformation transformation = null;
+    AssertionTransformationType transformation = null;
+    MethodReference assertionsHandler = null;
     String remaining = null;
     if (arg.startsWith(FORCE_ENABLE_ASSERTIONS)) {
-      transformation = AssertionTransformation.ENABLE;
+      transformation = AssertionTransformationType.ENABLE;
       remaining = arg.substring(FORCE_ENABLE_ASSERTIONS.length());
     } else if (arg.startsWith(FORCE_EA)) {
-      transformation = AssertionTransformation.ENABLE;
+      transformation = AssertionTransformationType.ENABLE;
       remaining = arg.substring(FORCE_EA.length());
     } else if (arg.startsWith(FORCE_DISABLE_ASSERTIONS)) {
-      transformation = AssertionTransformation.DISABLE;
+      transformation = AssertionTransformationType.DISABLE;
       remaining = arg.substring(FORCE_DISABLE_ASSERTIONS.length());
     } else if (arg.startsWith(FORCE_DA)) {
-      transformation = AssertionTransformation.DISABLE;
+      transformation = AssertionTransformationType.DISABLE;
       remaining = arg.substring(FORCE_DA.length());
     } else if (arg.startsWith(FORCE_PASSTHROUGH_ASSERTIONS)) {
-      transformation = AssertionTransformation.PASSTHROUGH;
+      transformation = AssertionTransformationType.PASSTHROUGH;
       remaining = arg.substring(FORCE_PASSTHROUGH_ASSERTIONS.length());
     } else if (arg.startsWith(FORCE_PA)) {
-      transformation = AssertionTransformation.PASSTHROUGH;
+      transformation = AssertionTransformationType.PASSTHROUGH;
       remaining = arg.substring(FORCE_PA.length());
+    } else if (arg.startsWith(FORCE_ASSERTIONS_HANDLER)) {
+      transformation = AssertionTransformationType.HANDLER;
+      remaining = arg.substring(FORCE_ASSERTIONS_HANDLER.length());
+    } else if (arg.startsWith(FORCE_AH)) {
+      transformation = AssertionTransformationType.HANDLER;
+      remaining = arg.substring(FORCE_AH.length());
+    }
+    if (transformation == AssertionTransformationType.HANDLER) {
+      if (remaining.length() == 0 || (remaining.length() == 1 && remaining.charAt(0) == ':')) {
+        throw builder.fatalError(
+            new StringDiagnostic("Missing required argument <handler method>", origin));
+      }
+      if (remaining.charAt(0) != ':') {
+        return false;
+      }
+      remaining = remaining.substring(1);
+      int index = remaining.indexOf(':');
+      if (index == 0) {
+        throw builder.fatalError(
+            new StringDiagnostic("Missing required argument <handler method>", origin));
+      }
+      String assertionsHandlerString = index > 0 ? remaining.substring(0, index) : remaining;
+      int lastDotIndex = assertionsHandlerString.lastIndexOf('.');
+      if (assertionsHandlerString.length() < 3
+          || lastDotIndex <= 0
+          || lastDotIndex == assertionsHandlerString.length() - 1
+          || !DescriptorUtils.isValidJavaType(assertionsHandlerString.substring(0, lastDotIndex))) {
+        throw builder.fatalError(
+            new StringDiagnostic(
+                "Invalid argument <handler method>: " + assertionsHandlerString, origin));
+      }
+      assertionsHandler =
+          Reference.methodFromDescriptor(
+              DescriptorUtils.javaTypeToDescriptor(
+                  assertionsHandlerString.substring(0, lastDotIndex)),
+              assertionsHandlerString.substring(lastDotIndex + 1),
+              "(Ljava/lang/Throwable;)V");
+      remaining = remaining.substring(assertionsHandlerString.length());
     }
     if (transformation != null) {
       if (remaining.length() == 0) {
-        addAssertionTransformation(builder, transformation, null);
+        addAssertionTransformation(builder, transformation, assertionsHandler, null);
         return true;
       } else {
-        if (remaining.length() == 1 || remaining.charAt(0) != ':') {
+        if (remaining.length() == 1 && remaining.charAt(0) == ':') {
+          throw builder.fatalError(new StringDiagnostic("Missing optional argument", origin));
+        }
+        if (remaining.charAt(0) != ':') {
           return false;
         }
         String classOrPackageScope = remaining.substring(1);
@@ -147,7 +234,8 @@
           builder.error(
               new StringDiagnostic("Illegal assertion scope: " + classOrPackageScope, origin));
         }
-        addAssertionTransformation(builder, transformation, remaining.substring(1));
+        addAssertionTransformation(
+            builder, transformation, assertionsHandler, remaining.substring(1));
         return true;
       }
     } else {
diff --git a/src/main/java/com/android/tools/r8/D8.java b/src/main/java/com/android/tools/r8/D8.java
index 9232563..10c5c5f 100644
--- a/src/main/java/com/android/tools/r8/D8.java
+++ b/src/main/java/com/android/tools/r8/D8.java
@@ -23,7 +23,7 @@
 import com.android.tools.r8.graph.analysis.ClassInitializerAssertionEnablingAnalysis;
 import com.android.tools.r8.inspector.internal.InspectorImpl;
 import com.android.tools.r8.ir.conversion.IRConverter;
-import com.android.tools.r8.ir.desugar.PrefixRewritingMapper;
+import com.android.tools.r8.ir.desugar.TypeRewriter;
 import com.android.tools.r8.ir.optimize.AssertionsRewriter;
 import com.android.tools.r8.ir.optimize.info.OptimizationFeedbackSimple;
 import com.android.tools.r8.jar.CfApplicationWriter;
@@ -168,11 +168,11 @@
   private static AppView<AppInfo> readApp(
       AndroidApp inputApp, InternalOptions options, ExecutorService executor, Timing timing)
       throws IOException {
-    PrefixRewritingMapper rewritePrefix = options.getPrefixRewritingMapper();
+    TypeRewriter typeRewriter = options.getTypeRewriter();
     ApplicationReader applicationReader = new ApplicationReader(inputApp, options, timing);
     LazyLoadedDexApplication app = applicationReader.read(executor);
     AppInfo appInfo = AppInfo.createInitialAppInfo(app, applicationReader.readMainDexClasses(app));
-    return AppView.createForD8(appInfo, rewritePrefix);
+    return AppView.createForD8(appInfo, typeRewriter);
   }
 
   private static void run(AndroidApp inputApp, InternalOptions options, ExecutorService executor)
@@ -269,7 +269,7 @@
         new CfApplicationWriter(appView, marker, GraphLens.getIdentityLens(), namingLens)
             .write(options.getClassFileConsumer(), inputApp);
       } else {
-        if (!hasDexResources || !hasClassResources || !appView.rewritePrefix.isRewriting()) {
+        if (!hasDexResources || !hasClassResources || !appView.typeRewriter.isRewriting()) {
           // All inputs are either dex or cf, or there is nothing to rewrite.
           namingLens = hasDexResources ? NamingLens.getIdentityLens() : namingLens;
           new GenericSignatureRewriter(appView, namingLens)
diff --git a/src/main/java/com/android/tools/r8/D8Command.java b/src/main/java/com/android/tools/r8/D8Command.java
index 8dd34a8..0967f55 100644
--- a/src/main/java/com/android/tools/r8/D8Command.java
+++ b/src/main/java/com/android/tools/r8/D8Command.java
@@ -498,8 +498,7 @@
     internal.encodeChecksums = getIncludeClassesChecksum();
     internal.dexClassChecksumFilter = getDexClassChecksumFilter();
     internal.enableInheritanceClassInDexDistributor = isOptimizeMultidexForLinearAlloc();
-
-    internal.desugaredLibrarySpecification = desugaredLibrarySpecification;
+    internal.setDesugaredLibrarySpecification(desugaredLibrarySpecification, getInputApp());
     internal.synthesizedClassPrefix = synthesizedClassPrefix;
     internal.desugaredLibraryKeepRuleConsumer = desugaredLibraryKeepRuleConsumer;
 
diff --git a/src/main/java/com/android/tools/r8/GenerateLintFiles.java b/src/main/java/com/android/tools/r8/GenerateLintFiles.java
index 01e1163..4c49b47 100644
--- a/src/main/java/com/android/tools/r8/GenerateLintFiles.java
+++ b/src/main/java/com/android/tools/r8/GenerateLintFiles.java
@@ -377,7 +377,7 @@
 
   private void run() throws Exception {
     // Run over all the API levels that the desugared library can be compiled with.
-    for (int apiLevel = AndroidApiLevel.LATEST.getLevel();
+    for (int apiLevel = AndroidApiLevel.Sv2.getLevel();
         apiLevel >= desugaredLibrarySpecification.getRequiredCompilationApiLevel().getLevel();
         apiLevel--) {
       System.out.println("Generating lint files for compile API " + apiLevel);
diff --git a/src/main/java/com/android/tools/r8/L8.java b/src/main/java/com/android/tools/r8/L8.java
index 9ba6c7f..7c0a805 100644
--- a/src/main/java/com/android/tools/r8/L8.java
+++ b/src/main/java/com/android/tools/r8/L8.java
@@ -13,7 +13,7 @@
 import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.graph.LazyLoadedDexApplication;
 import com.android.tools.r8.ir.conversion.IRConverter;
-import com.android.tools.r8.ir.desugar.PrefixRewritingMapper;
+import com.android.tools.r8.ir.desugar.TypeRewriter;
 import com.android.tools.r8.jar.CfApplicationWriter;
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.naming.PrefixRewritingNamingLens;
@@ -166,10 +166,10 @@
     LazyLoadedDexApplication lazyApp =
         new ApplicationReader(inputApp, options, timing).read(executor);
 
-    PrefixRewritingMapper rewritePrefix = options.getPrefixRewritingMapper();
+    TypeRewriter typeRewriter = options.getTypeRewriter();
 
-    DexApplication app = new L8TreePruner(options).prune(lazyApp, rewritePrefix);
-    return AppView.createForL8(AppInfo.createInitialAppInfo(app), rewritePrefix);
+    DexApplication app = new L8TreePruner(options).prune(lazyApp, typeRewriter);
+    return AppView.createForL8(AppInfo.createInitialAppInfo(app), typeRewriter);
   }
 
   private static void run(String[] args) throws CompilationFailedException {
diff --git a/src/main/java/com/android/tools/r8/L8Command.java b/src/main/java/com/android/tools/r8/L8Command.java
index 26c99ce..6da92e2 100644
--- a/src/main/java/com/android/tools/r8/L8Command.java
+++ b/src/main/java/com/android/tools/r8/L8Command.java
@@ -194,7 +194,7 @@
     internal.enableInheritanceClassInDexDistributor = false;
 
     assert desugaredLibrarySpecification != null;
-    internal.desugaredLibrarySpecification = desugaredLibrarySpecification;
+    internal.setDesugaredLibrarySpecification(desugaredLibrarySpecification, getInputApp());
     internal.synthesizedClassPrefix =
         desugaredLibrarySpecification.getSynthesizedLibraryClassesPackagePrefix();
 
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 194c531..8b93d23 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -49,7 +49,6 @@
 import com.android.tools.r8.ir.desugar.BackportedMethodRewriter;
 import com.android.tools.r8.ir.desugar.CfClassSynthesizerDesugaringCollection;
 import com.android.tools.r8.ir.desugar.CfClassSynthesizerDesugaringEventConsumer;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter.DesugaredLibraryRetargeterLibraryTypeSynthesizer;
 import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter;
 import com.android.tools.r8.ir.desugar.records.RecordDesugaring;
 import com.android.tools.r8.ir.desugar.records.RecordFieldValuesRewriter;
@@ -311,10 +310,6 @@
       if (!options.mainDexKeepRules.isEmpty()) {
         MainDexListBuilder.checkForAssumedLibraryTypes(appView.appInfo());
       }
-      if (!options.desugaredLibrarySpecification.getRetargetCoreLibMember().isEmpty()) {
-        DesugaredLibraryRetargeterLibraryTypeSynthesizer.checkForAssumedLibraryTypes(appView);
-        DesugaredLibraryRetargeterLibraryTypeSynthesizer.amendLibraryWithRetargetedMembers(appView);
-      }
       InterfaceMethodRewriter.checkForAssumedLibraryTypes(appView.appInfo(), options);
       BackportedMethodRewriter.registerAssumedLibraryTypes(options);
       if (options.enableEnumUnboxing) {
@@ -329,7 +324,7 @@
       // Upfront desugaring generation: Generates new program classes to be added in the app.
       CfClassSynthesizerDesugaringEventConsumer classSynthesizerEventConsumer =
           new CfClassSynthesizerDesugaringEventConsumer();
-      CfClassSynthesizerDesugaringCollection.create(appView, null)
+      CfClassSynthesizerDesugaringCollection.create(appView)
           .synthesizeClasses(executorService, classSynthesizerEventConsumer);
       if (appView.getSyntheticItems().hasPendingSyntheticClasses()) {
         appView.setAppInfo(
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index bf04680..5bc9ddd 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -943,7 +943,7 @@
 
     internal.enableInheritanceClassInDexDistributor = isOptimizeMultidexForLinearAlloc();
 
-    internal.desugaredLibrarySpecification = desugaredLibrarySpecification;
+    internal.setDesugaredLibrarySpecification(desugaredLibrarySpecification, getInputApp());
     internal.synthesizedClassPrefix = synthesizedClassPrefix;
     internal.desugaredLibraryKeepRuleConsumer = desugaredLibraryKeepRuleConsumer;
 
diff --git a/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java b/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java
index 2e2aa7a..cce0852 100644
--- a/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java
+++ b/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java
@@ -9,7 +9,6 @@
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexReference;
 import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification.LegacyDesugaredLibrarySpecification;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.ConsumerUtils;
 import com.google.common.collect.ImmutableList;
@@ -18,7 +17,6 @@
 
 public class AndroidApiReferenceLevelCache {
 
-  private final LegacyDesugaredLibrarySpecification desugaredLibrarySpecification;
   private final AndroidApiLevelCompute apiLevelCompute;
   private final AndroidApiLevelDatabase androidApiLevelDatabase;
   private final AppView<?> appView;
@@ -33,7 +31,6 @@
     factory = appView.dexItemFactory();
     androidApiLevelDatabase =
         new AndroidApiLevelHashingDatabaseImpl(predefinedApiTypeLookupForHashing);
-    desugaredLibrarySpecification = appView.options().desugaredLibrarySpecification;
   }
 
   public static AndroidApiReferenceLevelCache create(
@@ -75,7 +72,7 @@
     if (reference.getContextType() == factory.objectType) {
       return appView.computedMinApiLevel();
     }
-    if (desugaredLibrarySpecification.isSupported(reference, appView)) {
+    if (appView.options().machineDesugaredLibrarySpecification.isSupported(reference)) {
       // If we end up desugaring the reference, the library classes is bridged by j$ which is part
       // of the program.
       return appView.computedMinApiLevel();
diff --git a/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java b/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java
index f9b13a4..ef86f73 100644
--- a/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java
+++ b/src/main/java/com/android/tools/r8/androidapi/ApiReferenceStubber.java
@@ -19,7 +19,6 @@
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.graph.ThrowExceptionCode;
 import com.android.tools.r8.graph.UseRegistry;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification.LegacyDesugaredLibrarySpecification;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.synthesis.CommittedItems;
 import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
@@ -112,12 +111,10 @@
       new ConcurrentHashMap<>();
   private final Set<DexType> seenTypes = Sets.newConcurrentHashSet();
   private final AndroidApiLevelCompute apiLevelCompute;
-  private final LegacyDesugaredLibrarySpecification desugaredLibraryConfiguration;
 
   public ApiReferenceStubber(AppView<? extends AppInfoWithClassHierarchy> appView) {
     this.appView = appView;
     apiLevelCompute = appView.apiLevelCompute();
-    desugaredLibraryConfiguration = appView.options().desugaredLibrarySpecification;
   }
 
   public void run(ExecutorService executorService) throws ExecutionException {
@@ -220,7 +217,10 @@
         || libraryClass.getType().toDescriptorString().startsWith("Ljava/")) {
       return;
     }
-    if (desugaredLibraryConfiguration.isSupported(libraryClass.getType(), appView)) {
+    if (appView
+        .options()
+        .machineDesugaredLibrarySpecification
+        .isSupported(libraryClass.getType())) {
       return;
     }
     appView
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 b23d44d..9ce8c64 100644
--- a/src/main/java/com/android/tools/r8/cf/CfVersion.java
+++ b/src/main/java/com/android/tools/r8/cf/CfVersion.java
@@ -38,6 +38,8 @@
   public static final CfVersion V16_PREVIEW = new CfVersion(Opcodes.V16 | Opcodes.V_PREVIEW);
   public static final CfVersion V17 = new CfVersion(Opcodes.V17);
   public static final CfVersion V17_PREVIEW = new CfVersion(Opcodes.V17 | Opcodes.V_PREVIEW);
+  public static final CfVersion V18 = new CfVersion(Opcodes.V18);
+  public static final CfVersion V18_PREVIEW = new CfVersion(Opcodes.V18 | Opcodes.V_PREVIEW);
 
   private final int version;
 
@@ -58,7 +60,8 @@
     CfVersion.V14,
     CfVersion.V15,
     CfVersion.V16,
-    CfVersion.V17
+    CfVersion.V17,
+    CfVersion.V18
   };
 
   // Private constructor in case we want to canonicalize versions.
diff --git a/src/main/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryKeepRuleGenerator.java b/src/main/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryKeepRuleGenerator.java
index a720021..eaec5a0 100644
--- a/src/main/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryKeepRuleGenerator.java
+++ b/src/main/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryKeepRuleGenerator.java
@@ -13,7 +13,7 @@
 import com.android.tools.r8.graph.DexProto;
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification.LegacyDesugaredLibrarySpecification;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineDesugaredLibrarySpecification;
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.references.ArrayReference;
 import com.android.tools.r8.references.ClassReference;
@@ -32,13 +32,11 @@
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.ListUtils;
 import com.android.tools.r8.utils.NopDiagnosticsHandler;
-import com.android.tools.r8.utils.SetUtils;
 import com.android.tools.r8.utils.Timing;
 import com.android.tools.r8.utils.TypeReferenceUtils;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.Predicate;
 
@@ -71,7 +69,7 @@
       return false;
     }
     return namingLens.hasPrefixRewritingLogic()
-        || options.desugaredLibrarySpecification.hasEmulatedLibraryInterfaces();
+        || options.machineDesugaredLibrarySpecification.hasEmulatedInterfaces();
   }
 
   private void run() {
@@ -80,18 +78,15 @@
   }
 
   private Predicate<DexType> createTargetPredicate() {
-    LegacyDesugaredLibrarySpecification desugaredLibrarySpecification =
-        options.desugaredLibrarySpecification;
-    Set<DexType> potentialTypesToKeep =
-        SetUtils.newIdentityHashSet(
-            desugaredLibrarySpecification.getCustomConversions().values(),
-            desugaredLibrarySpecification.getEmulateLibraryInterface().values());
+    MachineDesugaredLibrarySpecification desugaredLibrarySpecification =
+        options.machineDesugaredLibrarySpecification;
     byte[] synthesizedLibraryClassesPackageDescriptorPrefix =
         DexString.encodeToMutf8(
             "L" + desugaredLibrarySpecification.getSynthesizedLibraryClassesPackagePrefix());
     return type ->
         namingLens.prefixRewrittenType(type) != null
-            || potentialTypesToKeep.contains(type)
+            || desugaredLibrarySpecification.isEmulatedInterfaceRewrittenType(type)
+            || desugaredLibrarySpecification.isCustomConversionRewrittenType(type)
             || type.getDescriptor().startsWith(synthesizedLibraryClassesPackageDescriptorPrefix);
   }
 
diff --git a/src/main/java/com/android/tools/r8/dex/CodeToKeep.java b/src/main/java/com/android/tools/r8/dex/CodeToKeep.java
index cc05c31..3e33ca8 100644
--- a/src/main/java/com/android/tools/r8/dex/CodeToKeep.java
+++ b/src/main/java/com/android/tools/r8/dex/CodeToKeep.java
@@ -25,7 +25,7 @@
 
   static CodeToKeep createCodeToKeep(InternalOptions options, NamingLens namingLens) {
     if ((!namingLens.hasPrefixRewritingLogic()
-            && !options.desugaredLibrarySpecification.hasEmulatedLibraryInterfaces())
+            && !options.machineDesugaredLibrarySpecification.hasEmulatedInterfaces())
         || options.isDesugaredLibraryCompilation()
         || options.testing.enableExperimentalDesugaredLibraryKeepRuleGenerator) {
       return new NopCodeToKeep();
@@ -57,27 +57,23 @@
     }
 
     private final NamingLens namingLens;
-    private final Set<DexType> potentialTypesToKeep = Sets.newIdentityHashSet();
     private final Map<DexType, KeepStruct> toKeep = new ConcurrentHashMap<>();
     private final InternalOptions options;
 
     public DesugaredLibraryCodeToKeep(NamingLens namingLens, InternalOptions options) {
       this.namingLens = namingLens;
       this.options = options;
-      potentialTypesToKeep.addAll(
-          options.desugaredLibrarySpecification.getEmulateLibraryInterface().values());
-      potentialTypesToKeep.addAll(
-          options.desugaredLibrarySpecification.getCustomConversions().values());
     }
 
     private boolean shouldKeep(DexType type) {
       return namingLens.prefixRewrittenType(type) != null
-          || potentialTypesToKeep.contains(type)
+          || options.machineDesugaredLibrarySpecification.isCustomConversionRewrittenType(type)
+          || options.machineDesugaredLibrarySpecification.isEmulatedInterfaceRewrittenType(type)
           // TODO(b/158632510): This should prefix match on DexString.
           || type.toDescriptorString()
               .startsWith(
                   "L"
-                      + options.desugaredLibrarySpecification
+                      + options.machineDesugaredLibrarySpecification
                           .getSynthesizedLibraryClassesPackagePrefix());
     }
 
diff --git a/src/main/java/com/android/tools/r8/graph/AppInfo.java b/src/main/java/com/android/tools/r8/graph/AppInfo.java
index 1cf6ae7..ef10e8d 100644
--- a/src/main/java/com/android/tools/r8/graph/AppInfo.java
+++ b/src/main/java/com/android/tools/r8/graph/AppInfo.java
@@ -3,7 +3,6 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.graph;
 
-import com.android.tools.r8.graph.FieldResolutionResult.SuccessfulFieldResolutionResult;
 import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
@@ -140,15 +139,25 @@
   }
 
   @Override
+  public ClassResolutionResult contextIndependentDefinitionForWithResolutionResult(DexType type) {
+    assert checkIfObsolete();
+    return syntheticItems.definitionFor(
+        type, app::contextIndependentDefinitionForWithResolutionResult);
+  }
+
+  @Override
   public DexClass definitionFor(DexType type) {
     return definitionForWithoutExistenceAssert(type);
   }
 
   public final DexClass definitionForWithoutExistenceAssert(DexType type) {
     assert checkIfObsolete();
-    return syntheticItems.definitionFor(type, app::definitionFor);
+    return syntheticItems
+        .definitionFor(type, app::contextIndependentDefinitionForWithResolutionResult)
+        .toSingleClassWithProgramOverLibrary();
   }
 
+
   public DexClass definitionForDesugarDependency(DexClass dependent, DexType type) {
     if (dependent.type == type) {
       return dependent;
@@ -240,7 +249,7 @@
     DexProgramClass clazz = context.getHolder();
     DexEncodedField definition = clazz.lookupField(field);
     return definition != null
-        ? new SuccessfulFieldResolutionResult(clazz, clazz, definition)
+        ? FieldResolutionResult.createSingleFieldResolutionResult(clazz, clazz, definition)
         : FieldResolutionResult.unknown();
   }
 }
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 24c47b4..cbf79f2 100644
--- a/src/main/java/com/android/tools/r8/graph/AppView.java
+++ b/src/main/java/com/android/tools/r8/graph/AppView.java
@@ -24,7 +24,7 @@
 import com.android.tools.r8.ir.analysis.proto.GeneratedMessageLiteShrinker;
 import com.android.tools.r8.ir.analysis.proto.ProtoShrinker;
 import com.android.tools.r8.ir.analysis.value.AbstractValueFactory;
-import com.android.tools.r8.ir.desugar.PrefixRewritingMapper;
+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.field.InstanceFieldInitializationInfoFactory;
 import com.android.tools.r8.ir.optimize.library.LibraryMemberOptimizer;
@@ -88,7 +88,7 @@
       new SimpleInliningConstraintFactory();
 
   // Desugaring.
-  public final PrefixRewritingMapper rewritePrefix;
+  public final TypeRewriter typeRewriter;
 
   // Modeling.
   private final LibraryMethodSideEffectModelCollection libraryMethodSideEffectModelCollection;
@@ -123,16 +123,14 @@
   private final ComputedApiLevel computedMinApiLevel;
 
   private AppView(
-      T appInfo,
-      WholeProgramOptimizations wholeProgramOptimizations,
-      PrefixRewritingMapper mapper) {
+      T appInfo, WholeProgramOptimizations wholeProgramOptimizations, TypeRewriter mapper) {
     assert appInfo != null;
     this.context = CompilationContext.createInitialContext(appInfo.options());
     this.appInfo = appInfo;
     this.dontWarnConfiguration = DontWarnConfiguration.create(options().getProguardConfiguration());
     this.wholeProgramOptimizations = wholeProgramOptimizations;
     this.initClassLens = InitClassLens.getThrowingInstance();
-    this.rewritePrefix = mapper;
+    this.typeRewriter = mapper;
 
     if (enableWholeProgramOptimizations() && options().callSiteOptimizationOptions().isEnabled()) {
       this.argumentPropagator = new ArgumentPropagator(withLiveness());
@@ -158,18 +156,16 @@
     return libraryMemberOptimizer.isModeled(type);
   }
 
-  private static <T extends AppInfo> PrefixRewritingMapper defaultPrefixRewritingMapper(T appInfo) {
+  private static <T extends AppInfo> TypeRewriter defaultTypeRewriter(T appInfo) {
     InternalOptions options = appInfo.options();
-    return options.getPrefixRewritingMapper();
+    return options.getTypeRewriter();
   }
 
   public static <T extends AppInfo> AppView<T> createForD8(T appInfo) {
-    return new AppView<>(
-        appInfo, WholeProgramOptimizations.OFF, defaultPrefixRewritingMapper(appInfo));
+    return new AppView<>(appInfo, WholeProgramOptimizations.OFF, defaultTypeRewriter(appInfo));
   }
 
-  public static <T extends AppInfo> AppView<T> createForD8(
-      T appInfo, PrefixRewritingMapper mapper) {
+  public static <T extends AppInfo> AppView<T> createForD8(T appInfo, TypeRewriter mapper) {
     return new AppView<>(appInfo, WholeProgramOptimizations.OFF, mapper);
   }
 
@@ -184,24 +180,20 @@
     AppInfoWithClassHierarchy appInfo =
         AppInfoWithClassHierarchy.createInitialAppInfoWithClassHierarchy(
             application, classToFeatureSplitMap, mainDexInfo);
-    return new AppView<>(
-        appInfo, WholeProgramOptimizations.ON, defaultPrefixRewritingMapper(appInfo));
+    return new AppView<>(appInfo, WholeProgramOptimizations.ON, defaultTypeRewriter(appInfo));
   }
 
-  public static <T extends AppInfo> AppView<T> createForL8(
-      T appInfo, PrefixRewritingMapper mapper) {
+  public static <T extends AppInfo> AppView<T> createForL8(T appInfo, TypeRewriter mapper) {
     return new AppView<>(appInfo, WholeProgramOptimizations.OFF, mapper);
   }
 
   public static <T extends AppInfo> AppView<T> createForRelocator(T appInfo) {
-    return new AppView<>(
-        appInfo, WholeProgramOptimizations.OFF, defaultPrefixRewritingMapper(appInfo));
+    return new AppView<>(appInfo, WholeProgramOptimizations.OFF, defaultTypeRewriter(appInfo));
   }
 
   public static AppView<AppInfoWithClassHierarchy> createForTracer(
       AppInfoWithClassHierarchy appInfo) {
-    return new AppView<>(
-        appInfo, WholeProgramOptimizations.ON, defaultPrefixRewritingMapper(appInfo));
+    return new AppView<>(appInfo, WholeProgramOptimizations.ON, defaultTypeRewriter(appInfo));
   }
 
   public AbstractValueFactory abstractValueFactory() {
@@ -305,6 +297,11 @@
   }
 
   @Override
+  public ClassResolutionResult contextIndependentDefinitionForWithResolutionResult(DexType type) {
+    return appInfo().contextIndependentDefinitionForWithResolutionResult(type);
+  }
+
+  @Override
   public final DexClass definitionFor(DexType type) {
     return appInfo().definitionFor(type);
   }
diff --git a/src/main/java/com/android/tools/r8/graph/ClassResolutionResult.java b/src/main/java/com/android/tools/r8/graph/ClassResolutionResult.java
new file mode 100644
index 0000000..4e34aa3
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/graph/ClassResolutionResult.java
@@ -0,0 +1,138 @@
+// Copyright (c) 2022, 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.graph;
+
+import static com.android.tools.r8.graph.ClassResolutionResult.NoResolutionResult.noResult;
+
+import java.util.function.Consumer;
+
+public interface ClassResolutionResult {
+
+  boolean hasClassResolutionResult();
+
+  DexClass toSingleClassWithProgramOverLibrary();
+
+  void forEachClassResolutionResult(Consumer<DexClass> consumer);
+
+  static Builder builder() {
+    return new Builder();
+  }
+
+  class Builder {
+
+    private ProgramOrClasspathClass programOrClasspathClass;
+    private DexLibraryClass libraryClass;
+
+    public Builder add(DexProgramClass programClass) {
+      assert this.programOrClasspathClass == null;
+      this.programOrClasspathClass = programClass;
+      return this;
+    }
+
+    public Builder add(DexClasspathClass classpathClass) {
+      assert this.programOrClasspathClass == null;
+      this.programOrClasspathClass = classpathClass;
+      return this;
+    }
+
+    public Builder add(DexLibraryClass libraryClass) {
+      assert this.libraryClass == null;
+      this.libraryClass = libraryClass;
+      return this;
+    }
+
+    public ClassResolutionResult build() {
+      if (programOrClasspathClass == null && libraryClass == null) {
+        return noResult();
+      } else if (programOrClasspathClass == null) {
+        return libraryClass;
+      } else if (libraryClass == null) {
+        return programOrClasspathClass;
+      } else if (programOrClasspathClass.isProgramClass()) {
+        return new ProgramAndLibraryClassResolutionResult(
+            programOrClasspathClass.asProgramClass(), libraryClass);
+      } else {
+        assert programOrClasspathClass.isClasspathClass();
+        return new ClasspathAndLibraryClassResolutionResult(
+            programOrClasspathClass.asClasspathClass(), libraryClass);
+      }
+    }
+  }
+
+  class NoResolutionResult implements ClassResolutionResult {
+
+    private static final NoResolutionResult NO_RESULT = new NoResolutionResult();
+
+    static ClassResolutionResult noResult() {
+      return NO_RESULT;
+    }
+
+    @Override
+    public boolean hasClassResolutionResult() {
+      return false;
+    }
+
+    @Override
+    public DexClass toSingleClassWithProgramOverLibrary() {
+      return null;
+    }
+
+    @Override
+    public void forEachClassResolutionResult(Consumer<DexClass> consumer) {
+      // Intentionally empty
+    }
+  }
+
+  abstract class MultipleClassResolutionResult<T extends DexClass>
+      implements ClassResolutionResult {
+
+    protected final T programOrClasspathClass;
+    protected final DexLibraryClass libraryClass;
+
+    public MultipleClassResolutionResult(T programOrClasspathClass, DexLibraryClass libraryClass) {
+      this.programOrClasspathClass = programOrClasspathClass;
+      this.libraryClass = libraryClass;
+    }
+
+    @Override
+    public boolean hasClassResolutionResult() {
+      return true;
+    }
+
+    @Override
+    public void forEachClassResolutionResult(Consumer<DexClass> consumer) {
+      consumer.accept(programOrClasspathClass);
+      consumer.accept(libraryClass);
+    }
+  }
+
+  class ProgramAndLibraryClassResolutionResult
+      extends MultipleClassResolutionResult<DexProgramClass> {
+
+    public ProgramAndLibraryClassResolutionResult(
+        DexProgramClass programClass, DexLibraryClass libraryClass) {
+      super(programClass, libraryClass);
+    }
+
+    @Override
+    public DexClass toSingleClassWithProgramOverLibrary() {
+      return programOrClasspathClass;
+    }
+  }
+
+  class ClasspathAndLibraryClassResolutionResult
+      extends MultipleClassResolutionResult<DexClasspathClass> {
+
+    public ClasspathAndLibraryClassResolutionResult(
+        DexClasspathClass classpathClass, DexLibraryClass libraryClass) {
+      super(classpathClass, libraryClass);
+    }
+
+    @Override
+    public DexClass toSingleClassWithProgramOverLibrary() {
+      return libraryClass;
+    }
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/graph/ClasspathClass.java b/src/main/java/com/android/tools/r8/graph/ClasspathClass.java
index 3801ef8..0b9367d 100644
--- a/src/main/java/com/android/tools/r8/graph/ClasspathClass.java
+++ b/src/main/java/com/android/tools/r8/graph/ClasspathClass.java
@@ -4,7 +4,8 @@
 
 package com.android.tools.r8.graph;
 
-public interface ClasspathClass extends ClasspathDefinition, ClasspathOrLibraryClass {
+public interface ClasspathClass
+    extends ClasspathDefinition, ClasspathOrLibraryClass, ProgramOrClasspathClass {
 
   @Override
   default DexClass asDexClass() {
diff --git a/src/main/java/com/android/tools/r8/graph/ClasspathDefinition.java b/src/main/java/com/android/tools/r8/graph/ClasspathDefinition.java
index 11cd7ad..43a4e70 100644
--- a/src/main/java/com/android/tools/r8/graph/ClasspathDefinition.java
+++ b/src/main/java/com/android/tools/r8/graph/ClasspathDefinition.java
@@ -6,7 +6,8 @@
 
 import java.util.function.Function;
 
-public interface ClasspathDefinition extends ClasspathOrLibraryDefinition {
+public interface ClasspathDefinition
+    extends ClasspathOrLibraryDefinition, ProgramOrClasspathDefinition {
 
   @Override
   default <T> T apply(
diff --git a/src/main/java/com/android/tools/r8/graph/Definition.java b/src/main/java/com/android/tools/r8/graph/Definition.java
index 00bca6f..05ad2d1 100644
--- a/src/main/java/com/android/tools/r8/graph/Definition.java
+++ b/src/main/java/com/android/tools/r8/graph/Definition.java
@@ -22,6 +22,14 @@
     return null;
   }
 
+  default ProgramOrClasspathClass asProgramOrClasspathClass() {
+    return null;
+  }
+
+  default ProgramOrClasspathDefinition asProgramOrClasspathDefinition() {
+    return null;
+  }
+
   ProgramDerivedContext asProgramDerivedContext(ProgramDerivedContext witness);
 
   AccessFlags<?> getAccessFlags();
diff --git a/src/main/java/com/android/tools/r8/graph/DexApplication.java b/src/main/java/com/android/tools/r8/graph/DexApplication.java
index 67f8be4..e08f2ed 100644
--- a/src/main/java/com/android/tools/r8/graph/DexApplication.java
+++ b/src/main/java/com/android/tools/r8/graph/DexApplication.java
@@ -66,8 +66,17 @@
     DexApplication self = this;
     return new DexDefinitionSupplier() {
       @Override
+      public ClassResolutionResult contextIndependentDefinitionForWithResolutionResult(
+          DexType type) {
+        return syntheticDefinitionsProvider.definitionFor(
+            type, self::contextIndependentDefinitionForWithResolutionResult);
+      }
+
+      @Override
       public DexClass definitionFor(DexType type) {
-        return syntheticDefinitionsProvider.definitionFor(type, self::definitionFor);
+        return syntheticDefinitionsProvider
+            .definitionFor(type, self::contextIndependentDefinitionForWithResolutionResult)
+            .toSingleClassWithProgramOverLibrary();
       }
 
       @Override
@@ -117,13 +126,14 @@
     return classesWithDeterministicOrder(new ArrayList<>(programClasses()));
   }
 
-  public static <T extends DexClass> List<T> classesWithDeterministicOrder(Collection<T> classes) {
+  public static <T extends ClassDefinition> List<T> classesWithDeterministicOrder(
+      Collection<T> classes) {
     return classesWithDeterministicOrder(new ArrayList<>(classes));
   }
 
-  public static <T extends DexClass> List<T> classesWithDeterministicOrder(List<T> classes) {
+  public static <T extends ClassDefinition> List<T> classesWithDeterministicOrder(List<T> classes) {
     // To keep the order deterministic, we sort the classes by their type, which is a unique key.
-    classes.sort(Comparator.comparing(DexClass::getType));
+    classes.sort(Comparator.comparing(ClassDefinition::getType));
     return classes;
   }
 
diff --git a/src/main/java/com/android/tools/r8/graph/DexClass.java b/src/main/java/com/android/tools/r8/graph/DexClass.java
index 8c6bbc8..31e7030 100644
--- a/src/main/java/com/android/tools/r8/graph/DexClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexClass.java
@@ -40,7 +40,8 @@
 import java.util.function.Function;
 import java.util.function.Predicate;
 
-public abstract class DexClass extends DexDefinition implements ClassDefinition {
+public abstract class DexClass extends DexDefinition
+    implements ClassDefinition, ClassResolutionResult {
 
   public interface FieldSetter {
     void setField(int index, DexEncodedField field);
@@ -134,6 +135,21 @@
     }
   }
 
+  @Override
+  public boolean hasClassResolutionResult() {
+    return true;
+  }
+
+  @Override
+  public void forEachClassResolutionResult(Consumer<DexClass> consumer) {
+    consumer.accept(this);
+  }
+
+  @Override
+  public DexClass toSingleClassWithProgramOverLibrary() {
+    return this;
+  }
+
   public abstract void accept(
       Consumer<DexProgramClass> programClassConsumer,
       Consumer<DexClasspathClass> classpathClassConsumer,
diff --git a/src/main/java/com/android/tools/r8/graph/DexDefinitionSupplier.java b/src/main/java/com/android/tools/r8/graph/DexDefinitionSupplier.java
index 57212d4..6968591 100644
--- a/src/main/java/com/android/tools/r8/graph/DexDefinitionSupplier.java
+++ b/src/main/java/com/android/tools/r8/graph/DexDefinitionSupplier.java
@@ -19,6 +19,17 @@
   }
 
   /**
+   * Lookup for the definition(s) of a type independent of context.
+   *
+   * <p>This will return multiple results if found in the precedence of library, program and
+   * classpath.
+   *
+   * @param type Type to look up the definition for.
+   * @return A {@link ClassResolutionResult} describing the result.
+   */
+  ClassResolutionResult contextIndependentDefinitionForWithResolutionResult(DexType type);
+
+  /**
    * Lookup for the definition of a type from a given context.
    *
    * <p>This ensures that a context overrides the usual lookup precedence if looking up itself.
@@ -81,6 +92,14 @@
     return holder != null ? holder.lookupClassMethod(method) : null;
   }
 
+  default ClassResolutionResult definitionForWithResolutionResult(
+      DexType type, DexProgramClass context) {
+    assert context.type != type || ClassResolutionResult.builder().add(context).build() == context;
+    return context.type == type
+        ? context
+        : contextIndependentDefinitionForWithResolutionResult(type);
+  }
+
   // Use programDefinitionFor with a context.
   @Deprecated
   default DexProgramClass definitionForProgramType(DexType type) {
diff --git a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
index 686f124..3640575 100644
--- a/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
+++ b/src/main/java/com/android/tools/r8/graph/DexItemFactory.java
@@ -1431,6 +1431,54 @@
           || method.match(waitLong)
           || method.match(waitLongInt);
     }
+
+    public DexMethod matchingPublicObjectMember(DexMethod method) {
+      switch (method.getName().byteAt(0)) {
+        case 't':
+          if (method.match(toString)) {
+            return toString;
+          }
+          break;
+        case 'h':
+          if (method.match(hashCode)) {
+            return hashCode;
+          }
+          break;
+        case 'e':
+          if (method.match(equals)) {
+            return equals;
+          }
+          break;
+        case 'g':
+          if (method.match(getClass)) {
+            return getClass;
+          }
+          break;
+        case 'n':
+          if (method.match(notify)) {
+            return notify;
+          }
+          if (method.match(notifyAll)) {
+            return notifyAll;
+          }
+          break;
+        case 'w':
+          if (method.match(wait)) {
+            return wait;
+          }
+          if (method.match(waitLong)) {
+            return waitLong;
+          }
+          if (method.match(waitLongInt)) {
+            return waitLongInt;
+          }
+          break;
+        default:
+          // Methods finalize and clone are not public.
+          return null;
+      }
+      return null;
+    }
   }
 
   public class BufferMembers {
diff --git a/src/main/java/com/android/tools/r8/graph/DexMethodSignature.java b/src/main/java/com/android/tools/r8/graph/DexMethodSignature.java
index e756d78..adee16b 100644
--- a/src/main/java/com/android/tools/r8/graph/DexMethodSignature.java
+++ b/src/main/java/com/android/tools/r8/graph/DexMethodSignature.java
@@ -54,6 +54,10 @@
     return create(name, getProto());
   }
 
+  public DexMethodSignature withParameters(DexTypeList parameters, DexItemFactory dexItemFactory) {
+    return create(getName(), dexItemFactory.createProto(getReturnType(), parameters));
+  }
+
   public DexMethodSignature withProto(DexProto proto) {
     return create(getName(), proto);
   }
diff --git a/src/main/java/com/android/tools/r8/graph/DexProgramClass.java b/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
index 2e09eec..3077717 100644
--- a/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
+++ b/src/main/java/com/android/tools/r8/graph/DexProgramClass.java
@@ -38,7 +38,7 @@
 import java.util.function.Supplier;
 
 public class DexProgramClass extends DexClass
-    implements ProgramDefinition, Supplier<DexProgramClass>, StructuralItem<DexProgramClass> {
+    implements ProgramClass, Supplier<DexProgramClass>, StructuralItem<DexProgramClass> {
 
   @FunctionalInterface
   public interface ChecksumSupplier {
diff --git a/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java b/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
index 9589d1e..8e96fba 100644
--- a/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
+++ b/src/main/java/com/android/tools/r8/graph/DirectMappedDexApplication.java
@@ -6,6 +6,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.graph;
 
+import static com.android.tools.r8.graph.ClassResolutionResult.NoResolutionResult.noResult;
+
 import com.android.tools.r8.DataResourceProvider;
 import com.android.tools.r8.graph.LazyLoadedDexApplication.AllClasses;
 import com.android.tools.r8.graph.classmerging.MergedClasses;
@@ -69,6 +71,12 @@
   }
 
   @Override
+  public ClassResolutionResult contextIndependentDefinitionForWithResolutionResult(DexType type) {
+    DexClass foundClass = definitionFor(type);
+    return foundClass == null ? noResult() : foundClass;
+  }
+
+  @Override
   public DexClass definitionFor(DexType type) {
     assert type.isClassType() : "Cannot lookup definition for type: " + type;
     return allClasses.get(type);
diff --git a/src/main/java/com/android/tools/r8/graph/FieldResolution.java b/src/main/java/com/android/tools/r8/graph/FieldResolution.java
index 120bee0..3dcd872 100644
--- a/src/main/java/com/android/tools/r8/graph/FieldResolution.java
+++ b/src/main/java/com/android/tools/r8/graph/FieldResolution.java
@@ -4,7 +4,8 @@
 
 package com.android.tools.r8.graph;
 
-import com.android.tools.r8.graph.FieldResolutionResult.SuccessfulFieldResolutionResult;
+import static com.android.tools.r8.graph.FieldResolutionResult.createSingleFieldResolutionResult;
+
 import com.android.tools.r8.utils.SetUtils;
 import java.util.Set;
 
@@ -23,8 +24,12 @@
   }
 
   public FieldResolutionResult resolveFieldOn(DexType type, DexField field) {
-    DexClass holder = definitionFor.contextIndependentDefinitionFor(type);
-    return holder != null ? resolveFieldOn(holder, field) : FieldResolutionResult.failure();
+    FieldResolutionResult.Builder builder = FieldResolutionResult.builder();
+    definitionFor
+        .contextIndependentDefinitionForWithResolutionResult(type)
+        .forEachClassResolutionResult(
+            clazz -> builder.addResolutionResult(resolveFieldOn(clazz, field)));
+    return builder.buildOrIfEmpty(FieldResolutionResult.failure());
   }
 
   public FieldResolutionResult resolveFieldOn(DexClass holder, DexField field) {
@@ -41,49 +46,76 @@
     // Step 1: Class declares the field.
     DexEncodedField definition = holder.lookupField(field);
     if (definition != null) {
-      return new SuccessfulFieldResolutionResult(initialResolutionHolder, holder, definition);
+      return createSingleFieldResolutionResult(initialResolutionHolder, holder, definition);
     }
     // Step 2: Apply recursively to direct superinterfaces. First match succeeds.
-    DexClassAndField result = resolveFieldOnDirectInterfaces(holder, field, visitedInterfaces);
+    FieldResolutionResult result =
+        resolveFieldOnDirectInterfaces(initialResolutionHolder, holder, field, visitedInterfaces);
     if (result != null) {
-      return new SuccessfulFieldResolutionResult(
-          initialResolutionHolder, result.getHolder(), result.getDefinition());
+      return result;
     }
     // Step 3: Apply recursively to superclass.
     if (holder.superType != null) {
-      DexClass superClass = definitionFor.contextIndependentDefinitionFor(holder.superType);
-      if (superClass != null) {
-        return resolveFieldOn(superClass, field, initialResolutionHolder, visitedInterfaces);
-      }
+      FieldResolutionResult.Builder builder = FieldResolutionResult.builder();
+      definitionFor
+          .contextIndependentDefinitionForWithResolutionResult(holder.superType)
+          .forEachClassResolutionResult(
+              superClass -> {
+                // Check if the subtype is a library type and if it is child of a non-library type.
+                // If that is the case, do not return any results.
+                if (holder.isLibraryClass() && !superClass.isLibraryClass()) {
+                  return;
+                }
+                builder.addResolutionResult(
+                    resolveFieldOn(superClass, field, initialResolutionHolder, visitedInterfaces));
+              });
+      return builder.buildOrIfEmpty(null);
     }
     return FieldResolutionResult.failure();
   }
 
-  private DexClassAndField resolveFieldOnDirectInterfaces(
-      DexClass clazz, DexField field, Set<DexType> visitedInterfaces) {
+  private FieldResolutionResult resolveFieldOnDirectInterfaces(
+      DexClass initialResolutionHolder,
+      DexClass clazz,
+      DexField field,
+      Set<DexType> visitedInterfaces) {
     for (DexType interfaceType : clazz.interfaces.values) {
       if (visitedInterfaces.add(interfaceType)) {
-        DexClass interfaceClass = definitionFor.contextIndependentDefinitionFor(interfaceType);
-        if (interfaceClass != null) {
-          DexClassAndField result =
-              resolveFieldOnInterface(interfaceClass, field, visitedInterfaces);
-          if (result != null) {
-            return result;
-          }
+        FieldResolutionResult.Builder builder = FieldResolutionResult.builder();
+        definitionFor
+            .contextIndependentDefinitionForWithResolutionResult(interfaceType)
+            .forEachClassResolutionResult(
+                ifaceClass -> {
+                  // Check if the subtype is a library type and if it is child of a non-library
+                  // type. If that is the case, do not return any results.
+                  if (clazz.isLibraryClass() && !ifaceClass.isLibraryClass()) {
+                    return;
+                  }
+                  builder.addResolutionResult(
+                      resolveFieldOnInterface(
+                          initialResolutionHolder, ifaceClass, field, visitedInterfaces));
+                });
+        FieldResolutionResult fieldResolutionResult = builder.buildOrIfEmpty(null);
+        if (fieldResolutionResult != null) {
+          return fieldResolutionResult;
         }
       }
     }
     return null;
   }
 
-  private DexClassAndField resolveFieldOnInterface(
-      DexClass interfaceClass, DexField field, Set<DexType> visitedInterfaces) {
+  private FieldResolutionResult resolveFieldOnInterface(
+      DexClass initialResolutionHolder,
+      DexClass interfaceClass,
+      DexField field,
+      Set<DexType> visitedInterfaces) {
     // Step 1: Class declares the field.
     DexEncodedField definition = interfaceClass.lookupField(field);
     if (definition != null) {
-      return DexClassAndField.create(interfaceClass, definition);
+      return createSingleFieldResolutionResult(initialResolutionHolder, interfaceClass, definition);
     }
     // Step 2: Apply recursively to direct superinterfaces. First match succeeds.
-    return resolveFieldOnDirectInterfaces(interfaceClass, field, visitedInterfaces);
+    return resolveFieldOnDirectInterfaces(
+        initialResolutionHolder, interfaceClass, field, visitedInterfaces);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/graph/FieldResolutionResult.java b/src/main/java/com/android/tools/r8/graph/FieldResolutionResult.java
index 702d1fd..c5d89b3 100644
--- a/src/main/java/com/android/tools/r8/graph/FieldResolutionResult.java
+++ b/src/main/java/com/android/tools/r8/graph/FieldResolutionResult.java
@@ -4,7 +4,14 @@
 
 package com.android.tools.r8.graph;
 
+import com.android.tools.r8.errors.Unimplemented;
+import com.android.tools.r8.utils.BooleanUtils;
+import com.android.tools.r8.utils.Box;
 import com.android.tools.r8.utils.OptionalBool;
+import com.google.common.collect.Iterables;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.function.Consumer;
 
 public abstract class FieldResolutionResult
     extends MemberResolutionResult<DexEncodedField, DexField> {
@@ -40,15 +47,31 @@
     return null;
   }
 
+  public ProgramField getSingleProgramField() {
+    return null;
+  }
+
   public ProgramField getProgramField() {
     return null;
   }
 
-  public boolean isSuccessfulResolution() {
+  public boolean isSingleFieldResolutionResult() {
     return false;
   }
 
-  public SuccessfulFieldResolutionResult asSuccessfulResolution() {
+  public boolean isSingleProgramFieldResolutionResult() {
+    return false;
+  }
+
+  public SingleFieldResolutionResult<?> asSingleFieldResolutionResult() {
+    return null;
+  }
+
+  public SingleProgramFieldResolutionResult asSingleProgramFieldResolutionResult() {
+    return null;
+  }
+
+  public SingleClasspathFieldResolutionResult asSingleClasspathFieldResolutionResult() {
     return null;
   }
 
@@ -58,27 +81,80 @@
   }
 
   @Override
-  public SuccessfulFieldResolutionResult asSuccessfulMemberResolutionResult() {
+  public SingleFieldResolutionResult<?> asSuccessfulMemberResolutionResult() {
     return null;
   }
 
-  public boolean isFailedOrUnknownResolution() {
+  public boolean isPossiblyFailedOrUnknownResolution() {
     return false;
   }
 
+  public boolean hasProgramOrClasspathResult() {
+    return false;
+  }
+
+  public boolean hasProgramResult() {
+    return false;
+  }
+
+  public boolean hasClasspathResult() {
+    return false;
+  }
+
+  public boolean isMultiFieldResolutionResult() {
+    return false;
+  }
+
+  public final void forEachFieldResolutionResult(Consumer<FieldResolutionResult> resultConsumer) {
+    visitFieldResolutionResults(resultConsumer, resultConsumer, resultConsumer);
+  }
+
+  public final void forEachSuccessfulFieldResolutionResult(
+      Consumer<SingleFieldResolutionResult<?>> resultConsumer) {
+    visitFieldResolutionResults(resultConsumer, failedResult -> {});
+  }
+
+  public final void visitFieldResolutionResults(
+      Consumer<SingleFieldResolutionResult<?>> singleResultConsumer,
+      Consumer<FailedOrUnknownFieldResolutionResult> failedResolutionConsumer) {
+    visitFieldResolutionResults(
+        singleResultConsumer, singleResultConsumer, failedResolutionConsumer);
+  }
+
+  public abstract void visitFieldResolutionResults(
+      Consumer<? super SingleFieldResolutionResult<?>> programOrClasspathConsumer,
+      Consumer<? super SingleLibraryFieldResolutionResult> libraryResultConsumer,
+      Consumer<? super FailedOrUnknownFieldResolutionResult> failedResolutionConsumer);
+
   public DexClass getInitialResolutionHolder() {
     return null;
   }
 
-  public static class SuccessfulFieldResolutionResult extends FieldResolutionResult
+  public static SingleFieldResolutionResult<?> createSingleFieldResolutionResult(
+      DexClass initialResolutionHolder, DexClass holder, DexEncodedField definition) {
+    if (holder.isLibraryClass()) {
+      return new SingleLibraryFieldResolutionResult(
+          initialResolutionHolder, holder.asLibraryClass(), definition);
+    } else if (holder.isClasspathClass()) {
+      return new SingleClasspathFieldResolutionResult(
+          initialResolutionHolder, holder.asClasspathClass(), definition);
+    } else {
+      assert holder.isProgramClass();
+      return new SingleProgramFieldResolutionResult(
+          initialResolutionHolder, holder.asProgramClass(), definition);
+    }
+  }
+
+  public abstract static class SingleFieldResolutionResult<T extends DexClass>
+      extends FieldResolutionResult
       implements SuccessfulMemberResolutionResult<DexEncodedField, DexField> {
 
     private final DexClass initialResolutionHolder;
-    private final DexClass resolvedHolder;
+    private final T resolvedHolder;
     private final DexEncodedField resolvedField;
 
-    SuccessfulFieldResolutionResult(
-        DexClass initialResolutionHolder, DexClass resolvedHolder, DexEncodedField resolvedField) {
+    SingleFieldResolutionResult(
+        DexClass initialResolutionHolder, T resolvedHolder, DexEncodedField resolvedField) {
       assert resolvedHolder.type == resolvedField.getHolderType();
       this.initialResolutionHolder = initialResolutionHolder;
       this.resolvedHolder = resolvedHolder;
@@ -91,7 +167,7 @@
     }
 
     @Override
-    public DexClass getResolvedHolder() {
+    public T getResolvedHolder() {
       return resolvedHolder;
     }
 
@@ -116,25 +192,18 @@
     }
 
     @Override
-    public ProgramField getProgramField() {
-      return resolvedHolder.isProgramClass()
-          ? new ProgramField(resolvedHolder.asProgramClass(), resolvedField)
-          : null;
-    }
-
-    @Override
     public OptionalBool isAccessibleFrom(
         ProgramDefinition context, AppInfoWithClassHierarchy appInfo) {
       return AccessControl.isMemberAccessible(this, context, appInfo);
     }
 
     @Override
-    public boolean isSuccessfulResolution() {
+    public boolean isSingleFieldResolutionResult() {
       return true;
     }
 
     @Override
-    public SuccessfulFieldResolutionResult asSuccessfulResolution() {
+    public SingleFieldResolutionResult<T> asSingleFieldResolutionResult() {
       return this;
     }
 
@@ -144,14 +213,232 @@
     }
 
     @Override
-    public SuccessfulFieldResolutionResult asSuccessfulMemberResolutionResult() {
+    public SingleFieldResolutionResult<T> asSuccessfulMemberResolutionResult() {
       return this;
     }
   }
 
-  public static class FailedFieldResolutionResult extends FieldResolutionResult {
+  public static class SingleProgramFieldResolutionResult
+      extends SingleFieldResolutionResult<DexProgramClass> {
 
-    private static final FailedFieldResolutionResult INSTANCE = new FailedFieldResolutionResult();
+    SingleProgramFieldResolutionResult(
+        DexClass initialResolutionHolder,
+        DexProgramClass resolvedHolder,
+        DexEncodedField resolvedField) {
+      super(initialResolutionHolder, resolvedHolder, resolvedField);
+    }
+
+    @Override
+    public ProgramField getProgramField() {
+      return getSingleProgramField();
+    }
+
+    @Override
+    public ProgramField getSingleProgramField() {
+      return new ProgramField(getResolvedHolder(), getResolvedField());
+    }
+
+    @Override
+    public boolean isSingleProgramFieldResolutionResult() {
+      return true;
+    }
+
+    @Override
+    public SingleProgramFieldResolutionResult asSingleProgramFieldResolutionResult() {
+      return this;
+    }
+
+    @Override
+    public boolean hasProgramOrClasspathResult() {
+      return true;
+    }
+
+    @Override
+    public boolean hasProgramResult() {
+      return true;
+    }
+
+    @Override
+    public void visitFieldResolutionResults(
+        Consumer<? super SingleFieldResolutionResult<?>> programOrClasspathConsumer,
+        Consumer<? super SingleLibraryFieldResolutionResult> libraryResultConsumer,
+        Consumer<? super FailedOrUnknownFieldResolutionResult> failedResolutionConsumer) {
+      programOrClasspathConsumer.accept(this);
+    }
+  }
+
+  public static class SingleClasspathFieldResolutionResult
+      extends SingleFieldResolutionResult<DexClasspathClass> {
+
+    SingleClasspathFieldResolutionResult(
+        DexClass initialResolutionHolder,
+        DexClasspathClass resolvedHolder,
+        DexEncodedField resolvedField) {
+      super(initialResolutionHolder, resolvedHolder, resolvedField);
+    }
+
+    @Override
+    public SingleClasspathFieldResolutionResult asSingleClasspathFieldResolutionResult() {
+      return this;
+    }
+
+    @Override
+    public boolean hasProgramOrClasspathResult() {
+      return true;
+    }
+
+    @Override
+    public boolean hasClasspathResult() {
+      return true;
+    }
+
+    @Override
+    public void visitFieldResolutionResults(
+        Consumer<? super SingleFieldResolutionResult<?>> programOrClasspathConsumer,
+        Consumer<? super SingleLibraryFieldResolutionResult> libraryResultConsumer,
+        Consumer<? super FailedOrUnknownFieldResolutionResult> failedResolutionConsumer) {
+      programOrClasspathConsumer.accept(this);
+    }
+  }
+
+  public static class SingleLibraryFieldResolutionResult
+      extends SingleFieldResolutionResult<DexLibraryClass> {
+
+    SingleLibraryFieldResolutionResult(
+        DexClass initialResolutionHolder,
+        DexLibraryClass resolvedHolder,
+        DexEncodedField resolvedField) {
+      super(initialResolutionHolder, resolvedHolder, resolvedField);
+    }
+
+    @Override
+    public void visitFieldResolutionResults(
+        Consumer<? super SingleFieldResolutionResult<?>> programOrClasspathConsumer,
+        Consumer<? super SingleLibraryFieldResolutionResult> libraryResultConsumer,
+        Consumer<? super FailedOrUnknownFieldResolutionResult> failedResolutionConsumer) {
+      libraryResultConsumer.accept(this);
+    }
+  }
+
+  public abstract static class MultipleFieldResolutionResult<
+          C extends DexClass & ProgramOrClasspathClass, T extends SingleFieldResolutionResult<C>>
+      extends FieldResolutionResult {
+
+    protected final T programOrClasspathResult;
+    protected final List<SingleLibraryFieldResolutionResult> libraryResolutionResults;
+    protected final List<FailedOrUnknownFieldResolutionResult> failedOrUnknownResolutionResults;
+
+    public MultipleFieldResolutionResult(
+        T programOrClasspathResult,
+        List<SingleLibraryFieldResolutionResult> libraryResolutionResults,
+        List<FailedOrUnknownFieldResolutionResult> failedOrUnknownResolutionResults) {
+      assert programOrClasspathResult == null
+          || !programOrClasspathResult.getResolvedHolder().isLibraryClass();
+      assert failedOrUnknownResolutionResults.stream()
+          .allMatch(FieldResolutionResult::isPossiblyFailedOrUnknownResolution);
+      assert BooleanUtils.intValue(programOrClasspathResult != null)
+                  + libraryResolutionResults.size()
+                  + failedOrUnknownResolutionResults.size()
+              > 1
+          : "Should have been a single or failed result";
+      this.programOrClasspathResult = programOrClasspathResult;
+      this.libraryResolutionResults = libraryResolutionResults;
+      this.failedOrUnknownResolutionResults = failedOrUnknownResolutionResults;
+    }
+
+    @Override
+    public boolean isMultiFieldResolutionResult() {
+      return true;
+    }
+
+    @Override
+    public DexClass getInitialResolutionHolder() {
+      throw new Unimplemented("Should not be called on MultipleFieldResolutionResult");
+    }
+
+    @Override
+    public boolean hasProgramOrClasspathResult() {
+      return programOrClasspathResult != null;
+    }
+
+    @Override
+    public boolean hasProgramResult() {
+      return programOrClasspathResult != null && programOrClasspathResult.hasProgramResult();
+    }
+
+    @Override
+    public boolean hasClasspathResult() {
+      return programOrClasspathResult != null && programOrClasspathResult.hasClasspathResult();
+    }
+
+    @Override
+    public OptionalBool isAccessibleFrom(
+        ProgramDefinition context, AppInfoWithClassHierarchy appInfo) {
+      throw new Unimplemented("Should not be called on MultipleFieldResolutionResult");
+    }
+
+    @Override
+    public boolean isPossiblyFailedOrUnknownResolution() {
+      return !failedOrUnknownResolutionResults.isEmpty();
+    }
+
+    @Override
+    public boolean isSuccessfulMemberResolutionResult() {
+      return failedOrUnknownResolutionResults.isEmpty();
+    }
+
+    @Override
+    public void visitFieldResolutionResults(
+        Consumer<? super SingleFieldResolutionResult<?>> programOrClasspathConsumer,
+        Consumer<? super SingleLibraryFieldResolutionResult> libraryResultConsumer,
+        Consumer<? super FailedOrUnknownFieldResolutionResult> failedResolutionConsumer) {
+      if (programOrClasspathResult != null) {
+        programOrClasspathConsumer.accept(programOrClasspathResult);
+      }
+      libraryResolutionResults.forEach(libraryResultConsumer);
+      failedOrUnknownResolutionResults.forEach(failedResolutionConsumer);
+    }
+  }
+
+  public static class MultipleProgramWithLibraryFieldResolutionResult
+      extends MultipleFieldResolutionResult<DexProgramClass, SingleProgramFieldResolutionResult> {
+
+    public MultipleProgramWithLibraryFieldResolutionResult(
+        SingleProgramFieldResolutionResult programOrClasspathResult,
+        List<SingleLibraryFieldResolutionResult> libraryResolutionResults,
+        List<FailedOrUnknownFieldResolutionResult> failedOrUnknownResolutionResults) {
+      super(programOrClasspathResult, libraryResolutionResults, failedOrUnknownResolutionResults);
+    }
+
+    @Override
+    public ProgramField getProgramField() {
+      return programOrClasspathResult == null ? null : programOrClasspathResult.getProgramField();
+    }
+  }
+
+  public static class MultipleClasspathWithLibraryFieldResolutionResult
+      extends MultipleFieldResolutionResult<
+          DexClasspathClass, SingleClasspathFieldResolutionResult> {
+
+    public MultipleClasspathWithLibraryFieldResolutionResult(
+        SingleClasspathFieldResolutionResult programOrClasspathResult,
+        List<SingleLibraryFieldResolutionResult> libraryResolutionResults,
+        List<FailedOrUnknownFieldResolutionResult> failedOrUnknownResolutionResults) {
+      super(programOrClasspathResult, libraryResolutionResults, failedOrUnknownResolutionResults);
+    }
+  }
+
+  public static class MultipleLibraryFieldResolutionResult
+      extends MultipleFieldResolutionResult<DexProgramClass, SingleProgramFieldResolutionResult> {
+
+    public MultipleLibraryFieldResolutionResult(
+        List<SingleLibraryFieldResolutionResult> libraryResolutionResults,
+        List<FailedOrUnknownFieldResolutionResult> failedOrUnknownResolutionResults) {
+      super(null, libraryResolutionResults, failedOrUnknownResolutionResults);
+    }
+  }
+
+  public abstract static class FailedOrUnknownFieldResolutionResult extends FieldResolutionResult {
 
     @Override
     public OptionalBool isAccessibleFrom(
@@ -160,9 +447,22 @@
     }
 
     @Override
-    public boolean isFailedOrUnknownResolution() {
+    public void visitFieldResolutionResults(
+        Consumer<? super SingleFieldResolutionResult<?>> programOrClasspathConsumer,
+        Consumer<? super SingleLibraryFieldResolutionResult> libraryResultConsumer,
+        Consumer<? super FailedOrUnknownFieldResolutionResult> failedResolutionConsumer) {
+      failedResolutionConsumer.accept(this);
+    }
+
+    @Override
+    public boolean isPossiblyFailedOrUnknownResolution() {
       return true;
     }
+  }
+
+  public static class FailedFieldResolutionResult extends FailedOrUnknownFieldResolutionResult {
+
+    private static final FailedFieldResolutionResult INSTANCE = new FailedFieldResolutionResult();
 
     @Override
     public boolean isFailedResolution() {
@@ -174,19 +474,84 @@
    * Used in D8 when trying to resolve a field that is not declared on the enclosing class of the
    * current method.
    */
-  public static class UnknownFieldResolutionResult extends FieldResolutionResult {
+  public static class UnknownFieldResolutionResult extends FailedOrUnknownFieldResolutionResult {
 
     private static final UnknownFieldResolutionResult INSTANCE = new UnknownFieldResolutionResult();
+  }
 
-    @Override
-    public OptionalBool isAccessibleFrom(
-        ProgramDefinition context, AppInfoWithClassHierarchy appInfo) {
-      return OptionalBool.FALSE;
+  public static Builder builder() {
+    return new Builder();
+  }
+
+  public static class Builder {
+
+    private FieldResolutionResult currentResult = null;
+
+    private Builder() {}
+
+    public void addResolutionResult(FieldResolutionResult otherResult) {
+      if (currentResult == null) {
+        currentResult = otherResult;
+        return;
+      }
+      Box<SingleFieldResolutionResult<?>> singleResult = new Box<>();
+      List<SingleLibraryFieldResolutionResult> libraryResults = new ArrayList<>();
+      List<FailedOrUnknownFieldResolutionResult> failedResults = new ArrayList<>();
+      currentResult.visitFieldResolutionResults(
+          singleResult::set, libraryResults::add, failedResults::add);
+      otherResult.visitFieldResolutionResults(
+          otherProgramOrClasspathResult -> {
+            if (singleResult.isSet()) {
+              assert false : "Unexpected multiple results between program and classpath";
+              if (singleResult.get().hasProgramResult()) {
+                return;
+              }
+            }
+            singleResult.set(otherProgramOrClasspathResult);
+          },
+          newLibraryResult -> {
+            if (!Iterables.any(
+                libraryResults,
+                existing -> existing.getResolvedHolder() == newLibraryResult.getResolvedHolder())) {
+              libraryResults.add(newLibraryResult);
+            }
+          },
+          newFailedResult -> {
+            if (!Iterables.any(
+                failedResults,
+                existing ->
+                    existing.isFailedResolution() == newFailedResult.isFailedResolution())) {
+              failedResults.add(newFailedResult);
+            }
+          });
+      if (!singleResult.isSet()) {
+        if (libraryResults.size() == 1 && failedResults.isEmpty()) {
+          currentResult = libraryResults.get(0);
+        } else if (libraryResults.isEmpty() && failedResults.size() == 1) {
+          currentResult = failedResults.get(0);
+        } else {
+          currentResult = new MultipleLibraryFieldResolutionResult(libraryResults, failedResults);
+        }
+      } else if (libraryResults.isEmpty() && failedResults.isEmpty()) {
+        currentResult = singleResult.get();
+      } else if (singleResult.get().hasProgramResult()) {
+        currentResult =
+            new MultipleProgramWithLibraryFieldResolutionResult(
+                singleResult.get().asSingleProgramFieldResolutionResult(),
+                libraryResults,
+                failedResults);
+      } else {
+        SingleClasspathFieldResolutionResult classpathResult =
+            singleResult.get().asSingleClasspathFieldResolutionResult();
+        assert classpathResult != null;
+        currentResult =
+            new MultipleClasspathWithLibraryFieldResolutionResult(
+                classpathResult, libraryResults, failedResults);
+      }
     }
 
-    @Override
-    public boolean isFailedOrUnknownResolution() {
-      return true;
+    public FieldResolutionResult buildOrIfEmpty(FieldResolutionResult emptyResult) {
+      return currentResult == null ? emptyResult : currentResult;
     }
   }
 }
diff --git a/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java b/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java
index cce1760..772227c 100644
--- a/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java
+++ b/src/main/java/com/android/tools/r8/graph/LazyLoadedDexApplication.java
@@ -21,6 +21,7 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Consumer;
 import java.util.stream.Collectors;
 
 public class LazyLoadedDexApplication extends DexApplication {
@@ -53,6 +54,32 @@
   }
 
   @Override
+  public ClassResolutionResult contextIndependentDefinitionForWithResolutionResult(DexType type) {
+    ClassResolutionResult.Builder builder = ClassResolutionResult.builder();
+    if (libraryClasses != null) {
+      addClassToBuilderIfNotNull(libraryClasses.get(type), builder::add);
+    }
+    if (programClasses == null
+        || !addClassToBuilderIfNotNull(programClasses.get(type), builder::add)) {
+      // When looking up a type that exists both on program path and classpath, we assume the
+      // program class is taken and only if not present will look at classpath.
+      if (classpathClasses != null) {
+        addClassToBuilderIfNotNull(classpathClasses.get(type), builder::add);
+      }
+    }
+    return builder.build();
+  }
+
+  private <T extends DexClass> boolean addClassToBuilderIfNotNull(T clazz, Consumer<T> adder) {
+    if (clazz != null) {
+      adder.accept(clazz);
+      return true;
+    } else {
+      return false;
+    }
+  }
+
+  @Override
   public DexClass definitionFor(DexType type) {
     assert type.isClassType() : "Cannot lookup definition for type: " + type;
     DexClass clazz = null;
diff --git a/src/main/java/com/android/tools/r8/graph/ProgramClass.java b/src/main/java/com/android/tools/r8/graph/ProgramClass.java
new file mode 100644
index 0000000..c6fc81f
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/graph/ProgramClass.java
@@ -0,0 +1,13 @@
+// Copyright (c) 2022, 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.graph;
+
+public interface ProgramClass extends ProgramDefinition, ProgramOrClasspathClass {
+
+  @Override
+  default DexClass asDexClass() {
+    return asProgramClass();
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/graph/ProgramDefinition.java b/src/main/java/com/android/tools/r8/graph/ProgramDefinition.java
index ab0ee34..208c8ad 100644
--- a/src/main/java/com/android/tools/r8/graph/ProgramDefinition.java
+++ b/src/main/java/com/android/tools/r8/graph/ProgramDefinition.java
@@ -8,7 +8,8 @@
 import java.util.function.BiFunction;
 import java.util.function.Function;
 
-public interface ProgramDefinition extends Definition, ProgramDerivedContext {
+public interface ProgramDefinition
+    extends Definition, ProgramDerivedContext, ProgramOrClasspathDefinition {
 
   @Override
   default <T> T apply(
diff --git a/src/main/java/com/android/tools/r8/graph/ProgramOrClasspathClass.java b/src/main/java/com/android/tools/r8/graph/ProgramOrClasspathClass.java
new file mode 100644
index 0000000..7c15abf
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/graph/ProgramOrClasspathClass.java
@@ -0,0 +1,10 @@
+// Copyright (c) 2022, 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.graph;
+
+public interface ProgramOrClasspathClass
+    extends ClassDefinition, ProgramOrClasspathDefinition, ClassResolutionResult {
+  DexClass asDexClass();
+}
diff --git a/src/main/java/com/android/tools/r8/graph/ProgramOrClasspathDefinition.java b/src/main/java/com/android/tools/r8/graph/ProgramOrClasspathDefinition.java
new file mode 100644
index 0000000..b90c3f1
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/graph/ProgramOrClasspathDefinition.java
@@ -0,0 +1,13 @@
+// Copyright (c) 2022, 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.graph;
+
+public interface ProgramOrClasspathDefinition extends Definition {
+
+  @Override
+  default ProgramOrClasspathDefinition asProgramOrClasspathDefinition() {
+    return this;
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldAccessAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldAccessAnalysis.java
index 3ebd37a..d871616 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldAccessAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldAccessAnalysis.java
@@ -9,7 +9,6 @@
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.FieldResolutionResult;
 import com.android.tools.r8.graph.ProgramField;
 import com.android.tools.r8.graph.bytecodemetadata.BytecodeMetadataProvider;
 import com.android.tools.r8.ir.code.FieldInstruction;
@@ -82,27 +81,23 @@
     for (Instruction instruction : code.instructions()) {
       if (instruction.isFieldInstruction()) {
         FieldInstruction fieldInstruction = instruction.asFieldInstruction();
-        FieldResolutionResult resolutionResult =
-            appView.appInfo().resolveField(fieldInstruction.getField());
-        if (resolutionResult.isSuccessfulResolution()) {
-          ProgramField field =
-              resolutionResult.asSuccessfulResolution().getResolutionPair().asProgramField();
-          if (field != null) {
-            if (fieldAssignmentTracker != null) {
-              fieldAssignmentTracker.recordFieldAccess(fieldInstruction, field, code.context());
-            }
-            if (fieldBitAccessAnalysis != null) {
-              fieldBitAccessAnalysis.recordFieldAccess(
-                  fieldInstruction, field.getDefinition(), feedback);
-            }
-            if (fieldReadForInvokeReceiverAnalysis != null) {
-              fieldReadForInvokeReceiverAnalysis.recordFieldAccess(
-                  fieldInstruction, field, bytecodeMetadataProviderBuilder, code.context());
-            }
-            if (fieldReadForWriteAnalysis != null) {
-              fieldReadForWriteAnalysis.recordFieldAccess(
-                  fieldInstruction, field, bytecodeMetadataProviderBuilder);
-            }
+        ProgramField field =
+            appView.appInfo().resolveField(fieldInstruction.getField()).getProgramField();
+        if (field != null) {
+          if (fieldAssignmentTracker != null) {
+            fieldAssignmentTracker.recordFieldAccess(fieldInstruction, field, code.context());
+          }
+          if (fieldBitAccessAnalysis != null) {
+            fieldBitAccessAnalysis.recordFieldAccess(
+                fieldInstruction, field.getDefinition(), feedback);
+          }
+          if (fieldReadForInvokeReceiverAnalysis != null) {
+            fieldReadForInvokeReceiverAnalysis.recordFieldAccess(
+                fieldInstruction, field, bytecodeMetadataProviderBuilder, code.context());
+          }
+          if (fieldReadForWriteAnalysis != null) {
+            fieldReadForWriteAnalysis.recordFieldAccess(
+                fieldInstruction, field, bytecodeMetadataProviderBuilder);
           }
         }
       } else if (instruction.isNewInstance()) {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldAssignmentTracker.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldAssignmentTracker.java
index 714535c..bbee604 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldAssignmentTracker.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldAssignmentTracker.java
@@ -458,7 +458,8 @@
           appView.appInfo().getFieldAccessInfoCollection();
       fieldAccessInfoCollection.forEach(
           info -> {
-            ProgramField field = appView.appInfo().resolveField(info.getField()).getProgramField();
+            ProgramField field =
+                appView.appInfo().resolveField(info.getField()).getSingleProgramField();
             if (field == null) {
               return;
             }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldReadForWriteAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldReadForWriteAnalysis.java
index 3b4f8dc..6a5c420 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldReadForWriteAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/FieldReadForWriteAnalysis.java
@@ -58,7 +58,7 @@
         if (writtenFieldReference.match(field.getReference())
             && fieldPut.isStaticPut() == field.getAccessFlags().isStatic()) {
           ProgramField writtenField =
-              appView.appInfo().resolveField(writtenFieldReference).getProgramField();
+              appView.appInfo().resolveField(writtenFieldReference).getSingleProgramField();
           if (writtenField != null && writtenField.isStructurallyEqualTo(field)) {
             // OK.
             foundWrite = true;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java
index ef8d041..5d34c84 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldaccess/TrivialFieldAccessReprocessor.java
@@ -22,7 +22,8 @@
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.FieldAccessInfo;
 import com.android.tools.r8.graph.FieldAccessInfoCollection;
-import com.android.tools.r8.graph.FieldResolutionResult.SuccessfulFieldResolutionResult;
+import com.android.tools.r8.graph.FieldResolutionResult;
+import com.android.tools.r8.graph.ProgramField;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.graph.UseRegistry;
 import com.android.tools.r8.graph.bytecodemetadata.BytecodeInstructionMetadata;
@@ -316,18 +317,19 @@
         boolean isStatic,
         boolean isWrite,
         BytecodeInstructionMetadata metadata) {
-      SuccessfulFieldResolutionResult resolutionResult =
-          appView.appInfo().resolveField(reference).asSuccessfulResolution();
-      if (resolutionResult == null) {
+      FieldResolutionResult resolutionResult = appView.appInfo().resolveField(reference);
+      if (!resolutionResult.hasProgramResult()) {
+        // We don't care about field accesses that may not resolve to a program field.
         return;
       }
 
-      DexClassAndField field = resolutionResult.getResolutionPair();
+      ProgramField field = resolutionResult.getProgramField();
       DexEncodedField definition = field.getDefinition();
 
       if (definition.isStatic() != isStatic
           || appView.isCfByteCodePassThrough(getContext().getDefinition())
-          || resolutionResult.isAccessibleFrom(getContext(), appView).isPossiblyFalse()) {
+          || resolutionResult.isAccessibleFrom(getContext(), appView).isPossiblyFalse()
+          || !resolutionResult.isSingleProgramFieldResolutionResult()) {
         recordAccessThatCannotBeOptimized(field, definition);
         return;
       }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/FieldValueAnalysis.java b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/FieldValueAnalysis.java
index ee985c4..9c09ef2 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/FieldValueAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/fieldvalueanalysis/FieldValueAnalysis.java
@@ -8,7 +8,7 @@
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexValue;
-import com.android.tools.r8.graph.FieldResolutionResult.SuccessfulFieldResolutionResult;
+import com.android.tools.r8.graph.ProgramField;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.code.BasicBlock;
 import com.android.tools.r8.ir.code.DominatorTree;
@@ -125,15 +125,13 @@
         if (instruction.isFieldPut()) {
           FieldInstruction fieldPut = instruction.asFieldInstruction();
           DexField field = fieldPut.getField();
-          SuccessfulFieldResolutionResult fieldResolutionResult =
-              appInfo.resolveField(field).asSuccessfulResolution();
-          if (fieldResolutionResult != null) {
-            DexEncodedField encodedField = fieldResolutionResult.getResolvedField();
-            assert encodedField != null;
+          ProgramField programField = appInfo.resolveField(field).getProgramField();
+          if (programField != null) {
+            DexEncodedField encodedField = programField.getDefinition();
             if (isSubjectToOptimization(encodedField)) {
               recordFieldPut(encodedField, fieldPut);
             } else if (isStaticFieldValueAnalysis()
-                && fieldResolutionResult.getResolvedHolder().isEnum()
+                && programField.getHolder().isEnum()
                 && isSubjectToOptimizationIgnoringPinning(encodedField)) {
               recordFieldPut(encodedField, fieldPut);
             }
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java
index 42a035f..88d1c47 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/GeneratedExtensionRegistryShrinker.java
@@ -14,7 +14,6 @@
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.FieldAccessInfo;
 import com.android.tools.r8.graph.FieldAccessInfoCollection;
-import com.android.tools.r8.graph.FieldResolutionResult;
 import com.android.tools.r8.graph.ProgramField;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.code.IRCode;
@@ -232,15 +231,10 @@
 
   public boolean isDeadProtoExtensionField(DexField fieldReference) {
     AppInfoWithLiveness appInfo = appView.appInfo();
-    FieldResolutionResult resolutionResult = appInfo.resolveField(fieldReference);
-    if (resolutionResult.isSuccessfulResolution()) {
-      ProgramField field =
-          resolutionResult.asSuccessfulResolution().getResolutionPair().asProgramField();
-      return field != null
-          && isDeadProtoExtensionField(
-              field, appInfo.getFieldAccessInfoCollection(), appInfo.getKeepInfo());
-    }
-    return false;
+    ProgramField field = appInfo.resolveField(fieldReference).getSingleProgramField();
+    return field != null
+        && isDeadProtoExtensionField(
+            field, appInfo.getFieldAccessInfoCollection(), appInfo.getKeepInfo());
   }
 
   public boolean isDeadProtoExtensionField(
@@ -262,7 +256,7 @@
 
     // Multiple GeneratedExtensionRegistries exist in Chrome; 1 per feature split.
     return fieldAccessInfo.isReadOnlyInMethodSatisfying(
-        method -> references.isFindLiteExtensionByNumberMethod(method));
+        references::isFindLiteExtensionByNumberMethod);
   }
 
   private void forEachDeadProtoExtensionField(Consumer<DexField> consumer) {
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoEnqueuerExtension.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoEnqueuerExtension.java
index b0ddb4a..62b8e28 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoEnqueuerExtension.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoEnqueuerExtension.java
@@ -530,16 +530,12 @@
     DexField oneOfCaseFieldReference = oneOfCaseObject.asLiveProtoFieldObject().getField();
     FieldResolutionResult oneOfCaseFieldResolutionResult =
         appView.appInfo().resolveField(oneOfCaseFieldReference);
-    if (oneOfCaseFieldResolutionResult.isFailedOrUnknownResolution()) {
+    if (!oneOfCaseFieldResolutionResult.isSingleProgramFieldResolutionResult()) {
       assert false;
       return;
     }
 
-    ProgramField oneOfCaseField =
-        oneOfCaseFieldResolutionResult
-            .asSuccessfulResolution()
-            .getResolutionPair()
-            .asProgramField();
+    ProgramField oneOfCaseField = oneOfCaseFieldResolutionResult.getProgramField();
     if (oneOfCaseField == null) {
       assert false;
       return;
@@ -565,13 +561,12 @@
     DexField oneOfFieldReference = oneOfObject.asLiveProtoFieldObject().getField();
     FieldResolutionResult oneOfFieldResolutionResult =
         appView.appInfo().resolveField(oneOfFieldReference);
-    if (oneOfFieldResolutionResult.isFailedOrUnknownResolution()) {
+    if (!oneOfFieldResolutionResult.isSingleProgramFieldResolutionResult()) {
       assert false;
       return;
     }
 
-    ProgramField oneOfField =
-        oneOfFieldResolutionResult.asSuccessfulResolution().getResolutionPair().asProgramField();
+    ProgramField oneOfField = oneOfFieldResolutionResult.getProgramField();
     if (oneOfField == null || oneOfField.getHolder() != oneOfCaseField.getHolder()) {
       assert false;
       return;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoFieldInfo.java b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoFieldInfo.java
index 1515932..7c35106 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoFieldInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/proto/schema/ProtoFieldInfo.java
@@ -9,7 +9,6 @@
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.FieldResolutionResult;
 import com.android.tools.r8.graph.ProgramField;
 import java.util.List;
 import java.util.OptionalInt;
@@ -131,12 +130,10 @@
 
     ProtoObject object = protoMessageInfo.getHasBitsObjects().get(hasBitsIndex);
     assert object.isLiveProtoFieldObject();
-    FieldResolutionResult resolutionResult =
-        appView.appInfo().resolveField(object.asLiveProtoFieldObject().getField());
-    if (resolutionResult.isSuccessfulResolution()) {
-      return resolutionResult.asSuccessfulResolution().getResolutionPair().asProgramField();
-    }
-    return null;
+    return appView
+        .appInfo()
+        .resolveField(object.asLiveProtoFieldObject().getField())
+        .getSingleProgramField();
   }
 
   public int getHazzerBitFieldIndex(ProtoMessageInfo protoMessageInfo) {
@@ -175,12 +172,10 @@
     assert type.isOneOf();
     ProtoObject object = protoMessageInfo.getOneOfObjects().get(getAuxData()).getOneOfCaseObject();
     assert object.isLiveProtoFieldObject();
-    FieldResolutionResult resolutionResult =
-        appView.appInfo().resolveField(object.asLiveProtoFieldObject().getField());
-    if (resolutionResult.isSuccessfulResolution()) {
-      return resolutionResult.asSuccessfulResolution().getResolutionPair().asProgramField();
-    }
-    return null;
+    return appView
+        .appInfo()
+        .resolveField(object.asLiveProtoFieldObject().getField())
+        .getSingleProgramField();
   }
 
   /**
@@ -196,12 +191,10 @@
             ? protoMessageInfo.getOneOfObjects().get(getAuxData()).getOneOfObject()
             : objects.get(0);
     assert object.isLiveProtoFieldObject();
-    FieldResolutionResult resolutionResult =
-        appView.appInfo().resolveField(object.asLiveProtoFieldObject().getField());
-    if (resolutionResult.isSuccessfulResolution()) {
-      return resolutionResult.asSuccessfulResolution().getResolutionPair().asProgramField();
-    }
-    return null;
+    return appView
+        .appInfo()
+        .resolveField(object.asLiveProtoFieldObject().getField())
+        .getProgramField();
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java
index ebbfffe..19af1c7 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java
@@ -5,6 +5,7 @@
 package com.android.tools.r8.ir.analysis.value;
 
 import static com.android.tools.r8.ir.analysis.type.Nullability.maybeNull;
+import static com.android.tools.r8.utils.ForEachUtils.allMatch;
 
 import com.android.tools.r8.features.ClassToFeatureSplitMap;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
@@ -14,7 +15,6 @@
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.FieldResolutionResult.SuccessfulFieldResolutionResult;
 import com.android.tools.r8.graph.GraphLens;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.graph.proto.ArgumentInfoCollection;
@@ -96,9 +96,14 @@
   @Override
   public boolean isMaterializableInContext(
       AppView<AppInfoWithLiveness> appView, ProgramMethod context) {
-    SuccessfulFieldResolutionResult resolutionResult =
-        appView.appInfo().resolveField(field).asSuccessfulResolution();
-    return resolutionResult != null && resolutionResult.isAccessibleFrom(context, appView).isTrue();
+    return allMatch(
+        appView.appInfo().resolveField(field)::forEachFieldResolutionResult,
+        resolutionResult -> {
+          if (resolutionResult.isPossiblyFailedOrUnknownResolution()) {
+            return false;
+          }
+          return resolutionResult.isAccessibleFrom(context, appView).isTrue();
+        });
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionListIterator.java b/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionListIterator.java
index e1ed280..358369b 100644
--- a/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionListIterator.java
+++ b/src/main/java/com/android/tools/r8/ir/code/BasicBlockInstructionListIterator.java
@@ -283,25 +283,13 @@
       Value value,
       Position position) {
     InternalOptions options = appView.options();
-
-    InvokeMethod invoke;
-    if (appView.options().canUseJavaUtilObjectsRequireNonNull()) {
-      DexMethod requireNonNullMethod = appView.dexItemFactory().objectsMethods.requireNonNull;
-      invoke =
-          InvokeStatic.builder()
-              .setMethod(requireNonNullMethod)
-              .setSingleArgument(value)
-              .setPosition(position)
-              .build();
-    } else {
-      DexMethod getClassMethod = appView.dexItemFactory().objectMembers.getClass;
-      invoke =
-          InvokeVirtual.builder()
-              .setMethod(getClassMethod)
-              .setSingleArgument(value)
-              .setPosition(position)
-              .build();
-    }
+    DexMethod getClassMethod = appView.dexItemFactory().objectMembers.getClass;
+    InvokeMethod invoke =
+        InvokeVirtual.builder()
+            .setMethod(getClassMethod)
+            .setSingleArgument(value)
+            .setPosition(position)
+            .build();
     add(invoke);
     if (block.hasCatchHandlers()) {
       splitCopyCatchHandlers(code, blockIterator, options);
@@ -338,15 +326,8 @@
       removeOrReplaceByDebugLocalRead();
       return true;
     }
-    InvokeMethod replacement;
-    if (appView.options().canUseJavaUtilObjectsRequireNonNull()) {
-      DexMethod requireNonNullMethod = appView.dexItemFactory().objectsMethods.requireNonNull;
-      replacement = new InvokeStatic(requireNonNullMethod, null, ImmutableList.of(receiver));
-    } else {
-      DexMethod getClassMethod = appView.dexItemFactory().objectMembers.getClass;
-      replacement = new InvokeVirtual(getClassMethod, null, ImmutableList.of(receiver));
-    }
-    replaceCurrentInstruction(replacement);
+    DexMethod getClassMethod = appView.dexItemFactory().objectMembers.getClass;
+    replaceCurrentInstruction(new InvokeVirtual(getClassMethod, null, ImmutableList.of(receiver)));
     return true;
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/code/FieldInstruction.java b/src/main/java/com/android/tools/r8/ir/code/FieldInstruction.java
index 6c773a6..c65bccc 100644
--- a/src/main/java/com/android/tools/r8/ir/code/FieldInstruction.java
+++ b/src/main/java/com/android/tools/r8/ir/code/FieldInstruction.java
@@ -9,7 +9,8 @@
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.FieldResolutionResult.SuccessfulFieldResolutionResult;
+import com.android.tools.r8.graph.FieldResolutionResult;
+import com.android.tools.r8.graph.FieldResolutionResult.SingleFieldResolutionResult;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.analysis.fieldvalueanalysis.AbstractFieldSet;
 import com.android.tools.r8.ir.analysis.fieldvalueanalysis.ConcreteMutableFieldSet;
@@ -65,28 +66,28 @@
   public boolean instructionInstanceCanThrow(
       AppView<?> appView, ProgramMethod context, SideEffectAssumption assumption) {
     return internalInstructionInstanceCanThrow(
-        appView,
-        context,
-        assumption,
-        appView.appInfo().resolveField(field, context).asSuccessfulResolution());
+        appView, context, assumption, appView.appInfo().resolveField(field, context));
   }
 
   boolean internalInstructionInstanceCanThrow(
       AppView<?> appView,
       ProgramMethod context,
       SideEffectAssumption assumption,
-      SuccessfulFieldResolutionResult resolutionResult) {
-    if (resolutionResult == null) {
+      FieldResolutionResult resolutionResult) {
+    if (!resolutionResult.isSingleFieldResolutionResult()) {
+      // Conservatively treat instruction as being throwing.
       return true;
     }
-    DexEncodedField resolvedField = resolutionResult.getResolvedField();
+    SingleFieldResolutionResult<?> singleFieldResolutionResult =
+        resolutionResult.asSingleFieldResolutionResult();
+    DexEncodedField resolvedField = singleFieldResolutionResult.getResolvedField();
     // Check if the instruction may fail with an IncompatibleClassChangeError.
     if (resolvedField.isStatic() != isStaticFieldInstruction()) {
       return true;
     }
     // Check if the resolution target is accessible.
-    if (resolutionResult.getResolvedHolder() != context.getHolder()) {
-      if (resolutionResult
+    if (singleFieldResolutionResult.getResolvedHolder() != context.getHolder()) {
+      if (singleFieldResolutionResult
           .isAccessibleFrom(context, appView.appInfo().withClassHierarchy())
           .isPossiblyFalse()) {
         return true;
diff --git a/src/main/java/com/android/tools/r8/ir/code/InstancePut.java b/src/main/java/com/android/tools/r8/ir/code/InstancePut.java
index 13cba81..e0ca6cd 100644
--- a/src/main/java/com/android/tools/r8/ir/code/InstancePut.java
+++ b/src/main/java/com/android/tools/r8/ir/code/InstancePut.java
@@ -19,7 +19,7 @@
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.FieldResolutionResult.SuccessfulFieldResolutionResult;
+import com.android.tools.r8.graph.FieldResolutionResult;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis;
 import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.AnalysisAssumption;
@@ -132,8 +132,7 @@
       AppView<AppInfoWithLiveness> appViewWithLiveness = appView.withLiveness();
       AppInfoWithLiveness appInfoWithLiveness = appViewWithLiveness.appInfo();
 
-      SuccessfulFieldResolutionResult resolutionResult =
-          appInfoWithLiveness.resolveField(getField()).asSuccessfulResolution();
+      FieldResolutionResult resolutionResult = appInfoWithLiveness.resolveField(getField());
       if (internalInstructionInstanceCanThrow(appView, context, assumption, resolutionResult)) {
         return true;
       }
diff --git a/src/main/java/com/android/tools/r8/ir/code/StaticPut.java b/src/main/java/com/android/tools/r8/ir/code/StaticPut.java
index 2230cc7..b32a651 100644
--- a/src/main/java/com/android/tools/r8/ir/code/StaticPut.java
+++ b/src/main/java/com/android/tools/r8/ir/code/StaticPut.java
@@ -18,7 +18,7 @@
 import com.android.tools.r8.graph.DexEncodedField;
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.FieldResolutionResult.SuccessfulFieldResolutionResult;
+import com.android.tools.r8.graph.FieldResolutionResult;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis;
 import com.android.tools.r8.ir.analysis.ClassInitializationAnalysis.AnalysisAssumption;
@@ -110,8 +110,7 @@
       AppView<AppInfoWithLiveness> appViewWithLiveness = appView.withLiveness();
       AppInfoWithLiveness appInfoWithLiveness = appViewWithLiveness.appInfo();
 
-      SuccessfulFieldResolutionResult resolutionResult =
-          appInfoWithLiveness.resolveField(getField()).asSuccessfulResolution();
+      FieldResolutionResult resolutionResult = appInfoWithLiveness.resolveField(getField());
       if (internalInstructionInstanceCanThrow(appView, context, assumption, resolutionResult)) {
         return true;
       }
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 145ffec..664da13 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
@@ -415,8 +415,7 @@
       ExecutorService executorService,
       CfClassSynthesizerDesugaringEventConsumer classSynthesizerEventConsumer)
       throws ExecutionException {
-    CfClassSynthesizerDesugaringCollection.create(
-            appView, instructionDesugaring.getRetargetingInfo())
+    CfClassSynthesizerDesugaringCollection.create(appView)
         .synthesizeClasses(executorService, classSynthesizerEventConsumer);
   }
 
@@ -431,8 +430,7 @@
     InterfaceMethodProcessorFacade interfaceDesugaring =
         instructionDesugaring.getInterfaceMethodPostProcessingDesugaringD8(
             ExcludeDexResources, interfaceProcessor);
-    CfPostProcessingDesugaringCollection.create(
-            appView, interfaceDesugaring, instructionDesugaring.getRetargetingInfo())
+    CfPostProcessingDesugaringCollection.create(appView, interfaceDesugaring)
         .postProcessingDesugaring(
             appView.appInfo().classes(), m -> true, eventConsumer, executorService);
     methodProcessor.awaitMethodProcessing();
@@ -590,7 +588,24 @@
               .append("'")
               .append(i < neverMergePrefixes.size() - 1 ? ", " : "");
         }
-        message.append(" with classes with any other prefixes is not allowed.");
+        message.append(" with classes with any other prefixes is not allowed: ");
+        boolean first = true;
+        int limit = 11;
+        for (DexProgramClass clazz : appView.appInfo().classesWithDeterministicOrder()) {
+          if (!clazz.type.descriptor.startsWith(neverMergePrefix)) {
+            if (limit-- < 0) {
+              message.append("..");
+              break;
+            }
+            if (first) {
+              first = false;
+            } else {
+              message.append(", ");
+            }
+            message.append(clazz.type);
+          }
+        }
+        message.append(".");
         throw new CompilationError(message.toString());
       }
     }
@@ -1092,6 +1107,12 @@
       timing.end();
     }
 
+    if (options.canHaveInvokeInterfaceToObjectMethodBug()) {
+      timing.begin("JDK-8272564 fix rewrite");
+      CodeRewriter.rewriteJdk8272564Fix(code, appView);
+      timing.end();
+    }
+
     boolean isDebugMode = options.debug || method.getOptimizationInfo().isReachabilitySensitive();
 
     if (isDebugMode) {
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/MethodOptimizationFeedback.java b/src/main/java/com/android/tools/r8/ir/conversion/MethodOptimizationFeedback.java
index 0da54ff..8ad701f 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/MethodOptimizationFeedback.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/MethodOptimizationFeedback.java
@@ -54,8 +54,6 @@
 
   void markAsPropagated(DexEncodedMethod method);
 
-  void markTriggerClassInitBeforeAnySideEffect(DexEncodedMethod method, boolean mark);
-
   void setBridgeInfo(DexEncodedMethod method, BridgeInfo bridgeInfo);
 
   void setClassInlinerMethodConstraint(
@@ -119,8 +117,6 @@
 
   void unsetSimpleInliningConstraint(ProgramMethod method);
 
-  void unsetTriggerClassInitBeforeAnySideEffect(ProgramMethod method);
-
   void unsetUnusedArguments(ProgramMethod method);
 
   default void unsetOptimizationInfoForAbstractMethod(ProgramMethod method) {
@@ -143,7 +139,6 @@
       unsetReturnedArgument(method);
       unsetReturnValueOnlyDependsOnArguments(method);
       unsetSimpleInliningConstraint(method);
-      unsetTriggerClassInitBeforeAnySideEffect(method);
       unsetUnusedArguments(method);
     }
   }
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/callgraph/IRProcessingCallGraphUseRegistry.java b/src/main/java/com/android/tools/r8/ir/conversion/callgraph/IRProcessingCallGraphUseRegistry.java
index b88c9d0..e20123e 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/callgraph/IRProcessingCallGraphUseRegistry.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/callgraph/IRProcessingCallGraphUseRegistry.java
@@ -65,7 +65,7 @@
       return;
     }
 
-    ProgramField field = appView.appInfo().resolveField(rewrittenReference).getProgramField();
+    ProgramField field = appView.appInfo().resolveField(rewrittenReference).getSingleProgramField();
     if (field == null || appView.appInfo().isPinned(field)) {
       return;
     }
@@ -89,7 +89,7 @@
       return;
     }
 
-    ProgramField field = appView.appInfo().resolveField(rewrittenReference).getProgramField();
+    ProgramField field = appView.appInfo().resolveField(rewrittenReference).getSingleProgramField();
     if (field == null || appView.appInfo().isPinned(field)) {
       return;
     }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
index f99e380..dd2bb76 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/BackportedMethodRewriter.java
@@ -100,14 +100,14 @@
   public static List<DexMethod> generateListOfBackportedMethods(
       AndroidApp androidApp, InternalOptions options, ExecutorService executor) throws IOException {
     List<DexMethod> methods = new ArrayList<>();
-    PrefixRewritingMapper rewritePrefix = options.getPrefixRewritingMapper();
+    TypeRewriter typeRewriter = options.getTypeRewriter();
     AppInfo appInfo = null;
     if (androidApp != null) {
       DexApplication app =
           new ApplicationReader(androidApp, options, Timing.empty()).read(executor);
       appInfo = AppInfo.createInitialAppInfo(app);
     }
-    AppView<?> appView = AppView.createForD8(appInfo, rewritePrefix);
+    AppView<?> appView = AppView.createForD8(appInfo, typeRewriter);
     BackportedMethodRewriter.RewritableMethods rewritableMethods =
         new BackportedMethodRewriter.RewritableMethods(options, appView);
     rewritableMethods.visit(methods::add);
@@ -128,24 +128,16 @@
     DexMethod original = appView.graphLens().getOriginalMethodSignature(method);
     assert original != null;
     MethodProvider provider = rewritableMethods.getProvider(original);
-    // TODO(b/150693139): Since the DesugarLibraryRetargeter is run during IR processing while the
-    // backported method rewriter is run in cf to cf, we need here to compute if the method is
-    // actually going to be retargeted through desugared library backports, and compute the
-    // corresponding backported method if so. This can be removed once the DesugarLibraryRetargeter
-    // has been moved as a cf to cf transformation.
+    // Old versions of desugared library have in the jar file pre-desugared code. This is used
+    // to undesugar pre-desugared code, then the code is re-desugared with D8/R8. This is
+    // maintained for legacy only, recent desugared library should not be shipped with
+    // pre-desugared code.
+    Map<DexType, DexType> legacyBackport =
+        appView.options().machineDesugaredLibrarySpecification.getLegacyBackport();
     if (provider == null
         && appView.options().isDesugaredLibraryCompilation()
-        && appView
-            .options()
-            .desugaredLibrarySpecification
-            .getBackportCoreLibraryMember()
-            .containsKey(method.holder)) {
-      DexType newHolder =
-          appView
-              .options()
-              .desugaredLibrarySpecification
-              .getBackportCoreLibraryMember()
-              .get(method.holder);
+        && legacyBackport.containsKey(method.holder)) {
+      DexType newHolder = legacyBackport.get(method.holder);
       DexMethod backportedMethod =
           appView.dexItemFactory().createMethod(newHolder, method.proto, method.name);
       provider = rewritableMethods.getProvider(backportedMethod);
@@ -188,22 +180,25 @@
         initializeAndroidSv2MethodProviders(factory);
       }
 
-      // The following providers are currently not implemented at any API level in Android.
-      // They however require the Optional/Stream class to be present, either through desugared
-      // libraries or natively. If Optional/Stream class is not present, we do not desugar to
-      // avoid confusion in error messages.
-      if (appView.rewritePrefix.hasRewrittenType(factory.optionalType, appView)
-          || options.getMinApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.N)) {
-        initializeJava9OptionalMethodProviders(factory);
-        initializeJava10OptionalMethodProviders(factory);
-        initializeJava11OptionalMethodProviders(factory);
+      // The following providers are implemented at API level T. For backporting they require
+      // the java.util.Optional class to be present, either through library desugaring or natively.
+      // If the java.util.Optional class is not present, we do not backport to avoid confusion in
+      // error messages.
+      if (appView.typeRewriter.hasRewrittenType(factory.optionalType, appView)
+          || options.getMinApiLevel().betweenBothIncluded(AndroidApiLevel.N, AndroidApiLevel.Sv2)) {
+        initializeAndroidOptionalTMethodProviders(factory);
       }
-      if (appView.rewritePrefix.hasRewrittenType(factory.streamType, appView)
+
+      // The following providers are currently not implemented at any API level in Android. For
+      // backporting they require the java.util.stream.Stream class to be present, either through
+      // library desugaring or natively. If the java.util.stream.Stream class is not present, we do
+      // not desugar to avoid confusion in error messages.
+      if (appView.typeRewriter.hasRewrittenType(factory.streamType, appView)
           || options.getMinApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.N)) {
         initializeStreamMethodProviders(factory);
       }
 
-      if (appView.rewritePrefix.hasRewrittenType(factory.supplierType, appView)) {
+      if (appView.typeRewriter.hasRewrittenType(factory.supplierType, appView)) {
         // TODO(b/191188594): Consider adding the Objects method from R here, or instead
         //  rely on desugared library to support them.
         initializeObjectsMethodProviders(factory);
@@ -1163,6 +1158,122 @@
       }
     }
 
+    private void initializeAndroidOptionalTMethodProviders(DexItemFactory factory) {
+      DexType optionalType = factory.optionalType;
+      DexType[] optionalTypes =
+          new DexType[] {
+            factory.optionalType,
+            factory.optionalDoubleType,
+            factory.optionalLongType,
+            factory.optionalIntType,
+          };
+
+      // or (added in Java 9).
+      {
+        DexString name = factory.createString("or");
+        DexProto proto = factory.createProto(optionalType, factory.supplierType);
+        DexMethod method = factory.createMethod(optionalType, proto, name);
+        addProvider(
+            new StatifyingMethodGenerator(
+                method, BackportedMethods::OptionalMethods_or, "or", optionalType));
+      }
+
+      // stream (added in Java 9).
+      {
+        DexType[] streamReturnTypes =
+            new DexType[] {
+              factory.streamType,
+              factory.createType(factory.createString("Ljava/util/stream/DoubleStream;")),
+              factory.createType(factory.createString("Ljava/util/stream/LongStream;")),
+              factory.createType(factory.createString("Ljava/util/stream/IntStream;")),
+            };
+        TemplateMethodFactory[] streamMethodFactories =
+            new TemplateMethodFactory[] {
+              BackportedMethods::OptionalMethods_stream,
+              BackportedMethods::OptionalMethods_streamDouble,
+              BackportedMethods::OptionalMethods_streamLong,
+              BackportedMethods::OptionalMethods_streamInt,
+            };
+        DexString name = factory.createString("stream");
+        for (int i = 0; i < optionalTypes.length; i++) {
+          DexType optional = optionalTypes[i];
+          DexType streamReturnType = streamReturnTypes[i];
+          DexProto proto = factory.createProto(streamReturnType);
+          DexMethod method = factory.createMethod(optional, proto, name);
+          addProvider(
+              new StatifyingMethodGenerator(method, streamMethodFactories[i], "stream", optional));
+        }
+      }
+
+      // ifPresentOrElse (added in Java 9).
+      {
+        DexType[] consumerTypes =
+            new DexType[] {
+              factory.consumerType,
+              factory.doubleConsumer,
+              factory.longConsumer,
+              factory.intConsumer
+            };
+        TemplateMethodFactory[] methodFactories =
+            new TemplateMethodFactory[] {
+              BackportedMethods::OptionalMethods_ifPresentOrElse,
+              BackportedMethods::OptionalMethods_ifPresentOrElseDouble,
+              BackportedMethods::OptionalMethods_ifPresentOrElseLong,
+              BackportedMethods::OptionalMethods_ifPresentOrElseInt
+            };
+        for (int i = 0; i < optionalTypes.length; i++) {
+          DexType optional = optionalTypes[i];
+          DexType consumer = consumerTypes[i];
+          DexString name = factory.createString("ifPresentOrElse");
+          DexProto proto = factory.createProto(factory.voidType, consumer, factory.runnableType);
+          DexMethod method = factory.createMethod(optional, proto, name);
+          addProvider(
+              new StatifyingMethodGenerator(
+                  method, methodFactories[i], "ifPresentOrElse", optional));
+        }
+      }
+
+      // orElseThrow (added in Java 10).
+      {
+        DexType[] returnTypes =
+            new DexType[] {
+              factory.objectType, factory.doubleType, factory.longType, factory.intType,
+            };
+        MethodInvokeRewriter[] rewriters =
+            new MethodInvokeRewriter[] {
+              OptionalMethodRewrites.rewriteOrElseGet(),
+              OptionalMethodRewrites.rewriteDoubleOrElseGet(),
+              OptionalMethodRewrites.rewriteLongOrElseGet(),
+              OptionalMethodRewrites.rewriteIntOrElseGet(),
+            };
+        DexString name = factory.createString("orElseThrow");
+        for (int i = 0; i < optionalTypes.length; i++) {
+          DexProto proto = factory.createProto(returnTypes[i]);
+          DexMethod method = factory.createMethod(optionalTypes[i], proto, name);
+          addProvider(new InvokeRewriter(method, rewriters[i]));
+        }
+      }
+
+      // isEmpty (added in Java 11).
+      {
+        TemplateMethodFactory[] methodFactories =
+            new TemplateMethodFactory[] {
+              BackportedMethods::OptionalMethods_isEmpty,
+              BackportedMethods::OptionalMethods_isEmptyDouble,
+              BackportedMethods::OptionalMethods_isEmptyLong,
+              BackportedMethods::OptionalMethods_isEmptyInt
+            };
+        DexString name = factory.createString("isEmpty");
+        for (int i = 0; i < optionalTypes.length; i++) {
+          DexProto proto = factory.createProto(factory.booleanType);
+          DexMethod method = factory.createMethod(optionalTypes[i], proto, name);
+          addProvider(
+              new StatifyingMethodGenerator(
+                  method, methodFactories[i], "isEmpty", optionalTypes[i]));
+        }
+      }
+    }
+
     private void initializeJava9MethodProviders(DexItemFactory factory) {
       // Integer
       DexType type = factory.boxedIntType;
@@ -1298,127 +1409,6 @@
               method, BackportedMethods::StringMethods_stripTrailing, "stripTrailing", type));
     }
 
-    private void initializeJava9OptionalMethodProviders(DexItemFactory factory) {
-      // Optional
-      DexType optionalType = factory.optionalType;
-
-      // Optional.or(supplier)
-      DexString name = factory.createString("or");
-      DexProto proto = factory.createProto(optionalType, factory.supplierType);
-      DexMethod method = factory.createMethod(optionalType, proto, name);
-      addProvider(
-          new StatifyingMethodGenerator(
-              method, BackportedMethods::OptionalMethods_or, "or", optionalType));
-
-      // Optional{void,Int,Long,Double}.stream()
-      DexType[] optionalTypes =
-          new DexType[] {
-            optionalType,
-            factory.optionalDoubleType,
-            factory.optionalLongType,
-            factory.optionalIntType,
-          };
-      DexType[] streamReturnTypes =
-          new DexType[] {
-            factory.streamType,
-            factory.createType(factory.createString("Ljava/util/stream/DoubleStream;")),
-            factory.createType(factory.createString("Ljava/util/stream/LongStream;")),
-            factory.createType(factory.createString("Ljava/util/stream/IntStream;")),
-          };
-      TemplateMethodFactory[] streamMethodFactories =
-          new TemplateMethodFactory[] {
-            BackportedMethods::OptionalMethods_stream,
-            BackportedMethods::OptionalMethods_streamDouble,
-            BackportedMethods::OptionalMethods_streamLong,
-            BackportedMethods::OptionalMethods_streamInt,
-          };
-      name = factory.createString("stream");
-      for (int i = 0; i < optionalTypes.length; i++) {
-        DexType optional = optionalTypes[i];
-        DexType streamReturnType = streamReturnTypes[i];
-        proto = factory.createProto(streamReturnType);
-        method = factory.createMethod(optional, proto, name);
-        addProvider(
-            new StatifyingMethodGenerator(method, streamMethodFactories[i], "stream", optional));
-      }
-
-      // Optional{void,Int,Long,Double}.ifPresentOrElse(consumer,runnable)
-      DexType[] consumerTypes =
-          new DexType[] {
-            factory.consumerType, factory.doubleConsumer, factory.longConsumer, factory.intConsumer
-          };
-      TemplateMethodFactory[] methodFactories =
-          new TemplateMethodFactory[] {
-            BackportedMethods::OptionalMethods_ifPresentOrElse,
-            BackportedMethods::OptionalMethods_ifPresentOrElseDouble,
-            BackportedMethods::OptionalMethods_ifPresentOrElseLong,
-            BackportedMethods::OptionalMethods_ifPresentOrElseInt
-          };
-      for (int i = 0; i < optionalTypes.length; i++) {
-        DexType optional = optionalTypes[i];
-        DexType consumer = consumerTypes[i];
-        name = factory.createString("ifPresentOrElse");
-        proto = factory.createProto(factory.voidType, consumer, factory.runnableType);
-        method = factory.createMethod(optional, proto, name);
-        addProvider(
-            new StatifyingMethodGenerator(method, methodFactories[i], "ifPresentOrElse", optional));
-      }
-    }
-
-    private void initializeJava10OptionalMethodProviders(DexItemFactory factory) {
-      // Optional{void,Int,Long,Double}.orElseThrow()
-      DexType[] optionalTypes =
-          new DexType[] {
-            factory.optionalType,
-            factory.optionalDoubleType,
-            factory.optionalLongType,
-            factory.optionalIntType,
-          };
-      DexType[] returnTypes =
-          new DexType[] {
-            factory.objectType, factory.doubleType, factory.longType, factory.intType,
-          };
-      MethodInvokeRewriter[] rewriters =
-          new MethodInvokeRewriter[] {
-            OptionalMethodRewrites.rewriteOrElseGet(),
-            OptionalMethodRewrites.rewriteDoubleOrElseGet(),
-            OptionalMethodRewrites.rewriteLongOrElseGet(),
-            OptionalMethodRewrites.rewriteIntOrElseGet(),
-          };
-      DexString name = factory.createString("orElseThrow");
-      for (int i = 0; i < optionalTypes.length; i++) {
-        DexProto proto = factory.createProto(returnTypes[i]);
-        DexMethod method = factory.createMethod(optionalTypes[i], proto, name);
-        addProvider(new InvokeRewriter(method, rewriters[i]));
-      }
-    }
-
-    private void initializeJava11OptionalMethodProviders(DexItemFactory factory) {
-      // Optional{void,Int,Long,Double}.isEmpty()
-      DexType[] optionalTypes =
-          new DexType[] {
-            factory.optionalType,
-            factory.optionalDoubleType,
-            factory.optionalLongType,
-            factory.optionalIntType,
-          };
-      TemplateMethodFactory[] methodFactories =
-          new TemplateMethodFactory[] {
-            BackportedMethods::OptionalMethods_isEmpty,
-            BackportedMethods::OptionalMethods_isEmptyDouble,
-            BackportedMethods::OptionalMethods_isEmptyLong,
-            BackportedMethods::OptionalMethods_isEmptyInt
-          };
-      DexString name = factory.createString("isEmpty");
-      for (int i = 0; i < optionalTypes.length; i++) {
-        DexType optionalType = optionalTypes[i];
-        DexProto proto = factory.createProto(factory.booleanType);
-        DexMethod method = factory.createMethod(optionalType, proto, name);
-        addProvider(
-            new StatifyingMethodGenerator(method, methodFactories[i], "isEmpty", optionalType));
-      }
-    }
-
     private void initializeStreamMethodProviders(DexItemFactory factory) {
       // Stream
       DexType streamType = factory.streamType;
@@ -1445,7 +1435,7 @@
     }
 
     private void addProvider(MethodProvider generator) {
-      if (appView.options().desugaredLibrarySpecification.isSupported(generator.method, appView)) {
+      if (appView.options().machineDesugaredLibrarySpecification.isSupported(generator.method)) {
         // TODO(b/174453232): Remove this after the configuration file format has bee updated
         // with the "rewrite_method" section.
         if (generator.method.getHolderType() == appView.dexItemFactory().objectsType) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfClassSynthesizerDesugaringCollection.java b/src/main/java/com/android/tools/r8/ir/desugar/CfClassSynthesizerDesugaringCollection.java
index c54f7ec..02c87a6 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfClassSynthesizerDesugaringCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfClassSynthesizerDesugaringCollection.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.apiconversion.DesugaredLibraryWrapperSynthesizer;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter.DesugaredLibraryRetargeterL8Synthesizer;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter.RetargetingInfo;
 import com.android.tools.r8.ir.desugar.itf.ProgramEmulatedInterfaceSynthesizer;
 import com.android.tools.r8.ir.desugar.records.RecordDesugaring;
 import com.android.tools.r8.utils.ThreadUtils;
@@ -17,8 +16,7 @@
 
 public abstract class CfClassSynthesizerDesugaringCollection {
 
-  public static CfClassSynthesizerDesugaringCollection create(
-      AppView<?> appView, RetargetingInfo retargetingInfo) {
+  public static CfClassSynthesizerDesugaringCollection create(AppView<?> appView) {
     Collection<CfClassSynthesizerDesugaring> synthesizers = new ArrayList<>();
     if (appView.options().isDesugaredLibraryCompilation()) {
       ProgramEmulatedInterfaceSynthesizer emulatedInterfaceSynthesizer =
@@ -27,7 +25,7 @@
         synthesizers.add(emulatedInterfaceSynthesizer);
       }
       DesugaredLibraryRetargeterL8Synthesizer retargeterL8Synthesizer =
-          DesugaredLibraryRetargeterL8Synthesizer.create(appView, retargetingInfo);
+          DesugaredLibraryRetargeterL8Synthesizer.create(appView);
       if (retargeterL8Synthesizer != null) {
         synthesizers.add(retargeterL8Synthesizer);
       }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollection.java b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollection.java
index de491c7..c457ace 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringCollection.java
@@ -10,7 +10,6 @@
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.apiconversion.DesugaredLibraryAPIConverter;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter.RetargetingInfo;
 import com.android.tools.r8.ir.desugar.itf.InterfaceMethodProcessorFacade;
 import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter.Flavor;
 import com.android.tools.r8.ir.desugar.itf.InterfaceProcessor;
@@ -81,8 +80,6 @@
   public abstract InterfaceMethodProcessorFacade getInterfaceMethodPostProcessingDesugaringR8(
       Flavor flavor, Predicate<ProgramMethod> isLiveMethod, InterfaceProcessor processor);
 
-  public abstract RetargetingInfo getRetargetingInfo();
-
   public abstract void withDesugaredLibraryAPIConverter(
       Consumer<DesugaredLibraryAPIConverter> consumer);
 }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringCollection.java b/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringCollection.java
index 1fd0ad0..09b456b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfPostProcessingDesugaringCollection.java
@@ -8,7 +8,6 @@
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.apiconversion.DesugaredLibraryAPICallbackSynthesizer;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter.DesugaredLibraryRetargeterPostProcessor;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter.RetargetingInfo;
 import com.android.tools.r8.ir.desugar.itf.InterfaceMethodProcessorFacade;
 import com.android.tools.r8.ir.desugar.records.RecordDesugaring;
 import java.util.ArrayList;
@@ -21,12 +20,10 @@
 public abstract class CfPostProcessingDesugaringCollection {
 
   public static CfPostProcessingDesugaringCollection create(
-      AppView<?> appView,
-      InterfaceMethodProcessorFacade interfaceMethodProcessorFacade,
-      RetargetingInfo retargetingInfo) {
+      AppView<?> appView, InterfaceMethodProcessorFacade interfaceMethodProcessorFacade) {
     if (appView.options().desugarState.isOn()) {
       return NonEmptyCfPostProcessingDesugaringCollection.create(
-          appView, interfaceMethodProcessorFacade, retargetingInfo);
+          appView, interfaceMethodProcessorFacade);
     }
     return empty();
   }
@@ -53,19 +50,17 @@
     }
 
     public static CfPostProcessingDesugaringCollection create(
-        AppView<?> appView,
-        InterfaceMethodProcessorFacade interfaceMethodProcessorFacade,
-        RetargetingInfo retargetingInfo) {
+        AppView<?> appView, InterfaceMethodProcessorFacade interfaceMethodProcessorFacade) {
       ArrayList<CfPostProcessingDesugaring> desugarings = new ArrayList<>();
-      if (!appView.options().desugaredLibrarySpecification.getRetargetCoreLibMember().isEmpty()
+      if (appView.options().machineDesugaredLibrarySpecification.hasRetargeting()
           && !appView.options().isDesugaredLibraryCompilation()) {
-        desugarings.add(new DesugaredLibraryRetargeterPostProcessor(appView, retargetingInfo));
+        desugarings.add(new DesugaredLibraryRetargeterPostProcessor(appView));
       }
       if (interfaceMethodProcessorFacade != null) {
         desugarings.add(interfaceMethodProcessorFacade);
       }
       DesugaredLibraryAPICallbackSynthesizer apiCallbackSynthesizor =
-          appView.rewritePrefix.isRewriting()
+          appView.typeRewriter.isRewriting()
               ? new DesugaredLibraryAPICallbackSynthesizer(appView)
               : null;
       // At this point the desugaredLibraryAPIConverter is required to be last to generate
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/EmptyCfInstructionDesugaringCollection.java b/src/main/java/com/android/tools/r8/ir/desugar/EmptyCfInstructionDesugaringCollection.java
index 1e4d6f8..e7a1587 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/EmptyCfInstructionDesugaringCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/EmptyCfInstructionDesugaringCollection.java
@@ -8,7 +8,6 @@
 import com.android.tools.r8.contexts.CompilationContext.MethodProcessingContext;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.apiconversion.DesugaredLibraryAPIConverter;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter.RetargetingInfo;
 import com.android.tools.r8.ir.desugar.itf.InterfaceMethodProcessorFacade;
 import com.android.tools.r8.ir.desugar.itf.InterfaceMethodRewriter.Flavor;
 import com.android.tools.r8.ir.desugar.itf.InterfaceProcessor;
@@ -89,11 +88,6 @@
   }
 
   @Override
-  public RetargetingInfo getRetargetingInfo() {
-    return null;
-  }
-
-  @Override
   public void withDesugaredLibraryAPIConverter(Consumer<DesugaredLibraryAPIConverter> consumer) {
     // Intentionally empty.
   }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/NonEmptyCfInstructionDesugaringCollection.java b/src/main/java/com/android/tools/r8/ir/desugar/NonEmptyCfInstructionDesugaringCollection.java
index 33c69ac..4c51b9f 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/NonEmptyCfInstructionDesugaringCollection.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/NonEmptyCfInstructionDesugaringCollection.java
@@ -18,7 +18,6 @@
 import com.android.tools.r8.ir.desugar.constantdynamic.ConstantDynamicInstructionDesugaring;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.apiconversion.DesugaredLibraryAPIConverter;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter.DesugaredLibraryRetargeter;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter.RetargetingInfo;
 import com.android.tools.r8.ir.desugar.icce.AlwaysThrowingInstructionDesugaring;
 import com.android.tools.r8.ir.desugar.invokespecial.InvokeSpecialToSelfDesugaring;
 import com.android.tools.r8.ir.desugar.itf.InterfaceMethodProcessorFacade;
@@ -82,9 +81,9 @@
     this.nestBasedAccessDesugaring = NestBasedAccessDesugaring.create(appView);
     BackportedMethodRewriter backportedMethodRewriter = null;
     desugaredLibraryRetargeter =
-        appView.options().desugaredLibrarySpecification.getRetargetCoreLibMember().isEmpty()
-            ? null
-            : new DesugaredLibraryRetargeter(appView);
+        appView.options().machineDesugaredLibrarySpecification.hasRetargeting()
+            ? new DesugaredLibraryRetargeter(appView)
+            : null;
     if (desugaredLibraryRetargeter != null) {
       desugarings.add(desugaredLibraryRetargeter);
     }
@@ -112,7 +111,7 @@
       interfaceMethodRewriter = null;
     }
     desugaredLibraryAPIConverter =
-        appView.rewritePrefix.isRewriting()
+        appView.typeRewriter.isRewriting()
             ? new DesugaredLibraryAPIConverter(
                 appView,
                 SetUtils.newImmutableSetExcludingNullItems(
@@ -405,14 +404,6 @@
   }
 
   @Override
-  public RetargetingInfo getRetargetingInfo() {
-    if (desugaredLibraryRetargeter != null) {
-      return desugaredLibraryRetargeter.getRetargetingInfo();
-    }
-    return null;
-  }
-
-  @Override
   public void withDesugaredLibraryAPIConverter(Consumer<DesugaredLibraryAPIConverter> consumer) {
     if (desugaredLibraryAPIConverter != null) {
       consumer.accept(desugaredLibraryAPIConverter);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/PrefixRewritingMapper.java b/src/main/java/com/android/tools/r8/ir/desugar/PrefixRewritingMapper.java
deleted file mode 100644
index bf96b67..0000000
--- a/src/main/java/com/android/tools/r8/ir/desugar/PrefixRewritingMapper.java
+++ /dev/null
@@ -1,296 +0,0 @@
-// Copyright (c) 2019, 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.desugar;
-
-import com.android.tools.r8.errors.CompilationError;
-import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexProto;
-import com.android.tools.r8.graph.DexString;
-import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification.LegacyDesugaredLibrarySpecification;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineRewritingFlags;
-import com.android.tools.r8.utils.DescriptorUtils;
-import com.google.common.collect.ImmutableMap;
-import com.google.common.collect.Sets;
-import java.util.Map;
-import java.util.Set;
-import java.util.concurrent.ConcurrentHashMap;
-import java.util.function.Consumer;
-
-public abstract class PrefixRewritingMapper {
-
-  public static PrefixRewritingMapper empty() {
-    return new EmptyPrefixRewritingMapper();
-  }
-
-  public abstract void rewriteType(DexType type, DexType rewrittenType);
-
-  public abstract DexType rewrittenType(DexType type, AppView<?> appView);
-
-  public abstract DexType rewrittenContextType(DexType type, AppView<?> appView);
-
-  public boolean hasRewrittenType(DexType type, AppView<?> appView) {
-    return rewrittenType(type, appView) != null;
-  }
-
-  public boolean hasRewrittenTypeInSignature(DexProto proto, AppView<?> appView) {
-    if (hasRewrittenType(proto.returnType, appView)) {
-      return true;
-    }
-    for (DexType paramType : proto.parameters.values) {
-      if (hasRewrittenType(paramType, appView)) {
-        return true;
-      }
-    }
-    return false;
-  }
-
-  public abstract boolean isRewriting();
-
-  public abstract void forAllRewrittenTypes(Consumer<DexType> consumer);
-
-  public static class DesugarPrefixRewritingMapper extends PrefixRewritingMapper {
-
-    private final Set<DexType> notRewritten = Sets.newConcurrentHashSet();
-    private final Map<DexType, DexType> rewritten = new ConcurrentHashMap<>();
-    private final Map<DexString, DexString> initialPrefixes;
-    private final DexItemFactory factory;
-    private final boolean l8Compilation;
-
-    public DesugarPrefixRewritingMapper(
-        Map<String, String> prefixes, DexItemFactory itemFactory, boolean libraryCompilation) {
-      assert itemFactory != null || prefixes.isEmpty();
-      this.factory = itemFactory;
-      this.l8Compilation = libraryCompilation;
-      ImmutableMap.Builder<DexString, DexString> builder = ImmutableMap.builder();
-      for (String key : prefixes.keySet()) {
-        builder.put(toDescriptorPrefix(key), toDescriptorPrefix(prefixes.get(key)));
-      }
-      this.initialPrefixes = builder.build();
-      validatePrefixes(prefixes);
-    }
-
-    private DexString toDescriptorPrefix(String prefix) {
-      return factory.createString("L" + DescriptorUtils.getBinaryNameFromJavaType(prefix));
-    }
-
-    @Override
-    public void forAllRewrittenTypes(Consumer<DexType> consumer) {
-      rewritten.keySet().forEach(consumer);
-    }
-
-    private void validatePrefixes(Map<String, String> initialPrefixes) {
-      String[] prefixes = initialPrefixes.keySet().toArray(new String[0]);
-      for (int i = 0; i < prefixes.length; i++) {
-        for (int j = i + 1; j < prefixes.length; j++) {
-          String small, large;
-          if (prefixes[i].length() < prefixes[j].length()) {
-            small = prefixes[i];
-            large = prefixes[j];
-          } else {
-            small = prefixes[j];
-            large = prefixes[i];
-          }
-          if (large.startsWith(small)) {
-            throw new CompilationError(
-                "Inconsistent prefix in desugared library:"
-                    + " Should a class starting with "
-                    + small
-                    + " be rewritten using "
-                    + small
-                    + " -> "
-                    + initialPrefixes.get(small)
-                    + " or using "
-                    + large
-                    + " - > "
-                    + initialPrefixes.get(large)
-                    + " ?");
-          }
-        }
-      }
-    }
-
-    @Override
-    public DexType rewrittenType(DexType type, AppView<?> appView) {
-      assert appView != null || l8Compilation;
-      if (notRewritten.contains(type)) {
-        return null;
-      }
-      if (rewritten.containsKey(type)) {
-        return rewritten.get(type);
-      }
-      return computePrefix(type, appView);
-    }
-
-    @Override
-    public DexType rewrittenContextType(DexType type, AppView<?> appView) {
-      DexType rewritten = rewrittenType(type, appView);
-      if (rewritten != null) {
-        return rewritten;
-      }
-      LegacyDesugaredLibrarySpecification desugaredLibrarySpecification =
-          appView.options().desugaredLibrarySpecification;
-      if (desugaredLibrarySpecification.getEmulateLibraryInterface().containsKey(type)) {
-        return desugaredLibrarySpecification.getEmulateLibraryInterface().get(type);
-      }
-      for (Map<DexType, DexType> value :
-          desugaredLibrarySpecification.getRetargetCoreLibMember().values()) {
-        if (value.containsKey(type)) {
-          // Hack until machine specification are ready.
-          String prefix =
-              DescriptorUtils.getJavaTypeFromBinaryName(
-                  desugaredLibrarySpecification.getSynthesizedLibraryClassesPackagePrefix());
-          String interfaceType = type.toString();
-          int firstPackage = interfaceType.indexOf('.');
-          return appView
-              .dexItemFactory()
-              .createType(
-                  DescriptorUtils.javaTypeToDescriptor(
-                      prefix + interfaceType.substring(firstPackage + 1)));
-        }
-      }
-      return null;
-    }
-
-    // Besides L8 compilation, program types should not be rewritten.
-    private void failIfRewritingProgramType(DexType type, AppView<?> appView) {
-      if (l8Compilation) {
-        return;
-      }
-
-      DexType dexType = type.isArrayType() ? type.toBaseType(appView.dexItemFactory()) : type;
-      DexClass dexClass = appView.definitionFor(dexType);
-      if (dexClass != null && dexClass.isProgramClass()) {
-        appView
-            .options()
-            .reporter
-            .error(
-                "Cannot compile program class "
-                    + dexType
-                    + " since it conflicts with a desugared library rewriting rule.");
-      }
-    }
-
-    @Override
-    public void rewriteType(DexType type, DexType rewrittenType) {
-      assert !notRewritten.contains(type)
-          : "New rewriting rule for "
-              + type
-              + " but the compiler has already made decisions based on the fact that this type was"
-              + " not rewritten";
-      assert !rewritten.containsKey(type) || rewritten.get(type) == rewrittenType
-          : "New rewriting rule for "
-              + type
-              + " but the compiler has already made decisions based on a different rewriting rule"
-              + " for this type";
-      rewritten.put(type, rewrittenType);
-    }
-
-    private DexType computePrefix(DexType type, AppView<?> appView) {
-      DexString prefixToMatch = type.descriptor.withoutArray(factory);
-      DexType result = lookup(type, prefixToMatch, initialPrefixes);
-      if (result != null) {
-        failIfRewritingProgramType(type, appView);
-        return result;
-      }
-      notRewritten.add(type);
-      return null;
-    }
-
-    private DexType lookup(DexType type, DexString prefixToMatch, Map<DexString, DexString> map) {
-      // TODO(b/154800164): We could use tries instead of looking-up everywhere.
-      for (DexString prefix : map.keySet()) {
-        if (prefixToMatch.startsWith(prefix)) {
-          DexString rewrittenTypeDescriptor =
-              type.descriptor.withNewPrefix(prefix, map.get(prefix), factory);
-          DexType rewrittenType = factory.createType(rewrittenTypeDescriptor);
-          rewriteType(type, rewrittenType);
-          return rewrittenType;
-        }
-      }
-      return null;
-    }
-
-    @Override
-    public boolean isRewriting() {
-      return true;
-    }
-  }
-
-  public static class MachineDesugarPrefixRewritingMapper extends PrefixRewritingMapper {
-
-    private final PrefixRewritingMapper mapper;
-    private final Map<DexType, DexType> rewriteType;
-    private final Map<DexType, DexType> rewriteDerivedTypeOnly;
-
-    public MachineDesugarPrefixRewritingMapper(
-        PrefixRewritingMapper mapper, MachineRewritingFlags flags) {
-      this.mapper = mapper;
-      this.rewriteType = new ConcurrentHashMap<>(flags.getRewriteType());
-      rewriteDerivedTypeOnly = flags.getRewriteDerivedTypeOnly();
-    }
-
-    @Override
-    public DexType rewrittenType(DexType type, AppView<?> appView) {
-      assert mapper.rewrittenType(type, appView) == rewriteType.get(type);
-      return rewriteType.get(type);
-    }
-
-    @Override
-    public DexType rewrittenContextType(DexType context, AppView<?> appView) {
-      if (rewriteType.containsKey(context)) {
-        return rewriteType.get(context);
-      }
-      return rewriteDerivedTypeOnly.get(context);
-    }
-
-    @Override
-    public void rewriteType(DexType type, DexType rewrittenType) {
-      mapper.rewriteType(type, rewrittenType);
-      rewriteType.compute(
-          type,
-          (t, val) -> {
-            assert val == null || val == rewrittenType;
-            return rewrittenType;
-          });
-    }
-
-    @Override
-    public boolean isRewriting() {
-      return true;
-    }
-
-    @Override
-    public void forAllRewrittenTypes(Consumer<DexType> consumer) {
-      rewriteType.keySet().forEach(consumer);
-    }
-  }
-
-  public static class EmptyPrefixRewritingMapper extends PrefixRewritingMapper {
-
-    @Override
-    public DexType rewrittenType(DexType type, AppView<?> appView) {
-      return null;
-    }
-
-    @Override
-    public DexType rewrittenContextType(DexType type, AppView<?> appView) {
-      return null;
-    }
-
-    @Override
-    public void rewriteType(DexType type, DexType rewrittenType) {}
-
-    @Override
-    public boolean isRewriting() {
-      return false;
-    }
-
-    @Override
-    public void forAllRewrittenTypes(Consumer<DexType> consumer) {}
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/TypeRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/TypeRewriter.java
new file mode 100644
index 0000000..c8c5159
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/desugar/TypeRewriter.java
@@ -0,0 +1,125 @@
+// Copyright (c) 2022, 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.desugar;
+
+import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexProto;
+import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineDesugaredLibrarySpecification;
+import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.function.Consumer;
+
+public abstract class TypeRewriter {
+
+  public static TypeRewriter empty() {
+    return new EmptyPrefixRewritingMapper();
+  }
+
+  public abstract void rewriteType(DexType type, DexType rewrittenType);
+
+  public abstract DexType rewrittenType(DexType type, AppView<?> appView);
+
+  public abstract DexType rewrittenContextType(DexType type);
+
+  public boolean hasRewrittenType(DexType type, AppView<?> appView) {
+    return rewrittenType(type, appView) != null;
+  }
+
+  public boolean hasRewrittenTypeInSignature(DexProto proto, AppView<?> appView) {
+    if (hasRewrittenType(proto.returnType, appView)) {
+      return true;
+    }
+    for (DexType paramType : proto.parameters.values) {
+      if (hasRewrittenType(paramType, appView)) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  public abstract boolean isRewriting();
+
+  public abstract void forAllRewrittenTypes(Consumer<DexType> consumer);
+
+  public static class MachineDesugarPrefixRewritingMapper extends TypeRewriter {
+
+    private final Map<DexType, DexType> rewriteType;
+    private final Map<DexType, DexType> rewriteDerivedTypeOnly;
+
+    public MachineDesugarPrefixRewritingMapper(MachineDesugaredLibrarySpecification specification) {
+      this.rewriteType = new ConcurrentHashMap<>(specification.getRewriteType());
+      rewriteDerivedTypeOnly = specification.getRewriteDerivedTypeOnly();
+    }
+
+    @Override
+    public DexType rewrittenType(DexType type, AppView<?> appView) {
+      if (type.isArrayType()) {
+        DexType rewrittenBaseType =
+            rewrittenType(type.toBaseType(appView.dexItemFactory()), appView);
+        if (rewrittenBaseType == null) {
+          return null;
+        }
+        return appView
+            .dexItemFactory()
+            .createArrayType(type.getNumberOfLeadingSquareBrackets(), rewrittenBaseType);
+      }
+      return rewriteType.get(type);
+    }
+
+    @Override
+    public DexType rewrittenContextType(DexType context) {
+      assert !context.isArrayType();
+      if (rewriteType.containsKey(context)) {
+        return rewriteType.get(context);
+      }
+      return rewriteDerivedTypeOnly.get(context);
+    }
+
+    @Override
+    public void rewriteType(DexType type, DexType rewrittenType) {
+      rewriteType.compute(
+          type,
+          (t, val) -> {
+            assert val == null || val == rewrittenType;
+            return rewrittenType;
+          });
+    }
+
+    @Override
+    public boolean isRewriting() {
+      return true;
+    }
+
+    @Override
+    public void forAllRewrittenTypes(Consumer<DexType> consumer) {
+      rewriteType.keySet().forEach(consumer);
+    }
+  }
+
+  public static class EmptyPrefixRewritingMapper extends TypeRewriter {
+
+    @Override
+    public DexType rewrittenType(DexType type, AppView<?> appView) {
+      return null;
+    }
+
+    @Override
+    public DexType rewrittenContextType(DexType type) {
+      return null;
+    }
+
+    @Override
+    public void rewriteType(DexType type, DexType rewrittenType) {}
+
+    @Override
+    public boolean isRewriting() {
+      return false;
+    }
+
+    @Override
+    public void forAllRewrittenTypes(Consumer<DexType> consumer) {}
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPICallbackSynthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPICallbackSynthesizer.java
index 150e6c4..abbdb4f 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPICallbackSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPICallbackSynthesizer.java
@@ -20,13 +20,13 @@
 import com.android.tools.r8.ir.desugar.CfPostProcessingDesugaring;
 import com.android.tools.r8.ir.desugar.CfPostProcessingDesugaringEventConsumer;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.apiconversion.DesugaredLibraryWrapperSynthesizerEventConsumer.DesugaredLibraryAPICallbackSynthesizorEventConsumer;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineDesugaredLibrarySpecification;
 import com.android.tools.r8.ir.synthetic.DesugaredLibraryAPIConversionCfCodeProvider.APICallbackWrapperCfCodeProvider;
 import com.android.tools.r8.utils.OptionalBool;
 import com.android.tools.r8.utils.WorkList;
 import com.google.common.collect.Sets;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ExecutorService;
 
@@ -106,11 +106,11 @@
         || definition.isLibraryMethodOverride().isFalse()) {
       return false;
     }
-    if (!appView.rewritePrefix.hasRewrittenTypeInSignature(definition.getProto(), appView)
+    if (!appView.typeRewriter.hasRewrittenTypeInSignature(definition.getProto(), appView)
         || appView
             .options()
-            .desugaredLibrarySpecification
-            .getEmulateLibraryInterface()
+            .machineDesugaredLibrarySpecification
+            .getEmulatedInterfaces()
             .containsKey(method.getHolderType())) {
       return false;
     }
@@ -127,7 +127,7 @@
         return false;
       }
     }
-    if (!appView.options().desugaredLibrarySpecification.supportAllCallbacksFromLibrary()
+    if (!appView.options().machineDesugaredLibrarySpecification.supportAllCallbacksFromLibrary()
         && appView.options().isDesugaredLibraryCompilation()) {
       return false;
     }
@@ -163,7 +163,7 @@
       DexEncodedMethod dexEncodedMethod = dexClass.lookupVirtualMethod(method.getReference());
       if (dexEncodedMethod != null) {
         // In this case, the object will be wrapped.
-        if (appView.rewritePrefix.hasRewrittenType(dexClass.type, appView)) {
+        if (appView.typeRewriter.hasRewrittenType(dexClass.type, appView)) {
           return false;
         }
         if (dexEncodedMethod.isFinal()) {
@@ -178,13 +178,13 @@
   }
 
   private boolean shouldGenerateCallbacksForEmulateInterfaceAPIs(DexClass dexClass) {
-    if (appView.options().desugaredLibrarySpecification.supportAllCallbacksFromLibrary()) {
+    if (appView.options().machineDesugaredLibrarySpecification.supportAllCallbacksFromLibrary()) {
       return true;
     }
-    Map<DexType, DexType> emulateLibraryInterfaces =
-        appView.options().desugaredLibrarySpecification.getEmulateLibraryInterface();
-    return !(emulateLibraryInterfaces.containsKey(dexClass.type)
-        || emulateLibraryInterfaces.containsValue(dexClass.type));
+    MachineDesugaredLibrarySpecification specification =
+        appView.options().machineDesugaredLibrarySpecification;
+    return !(specification.getEmulatedInterfaces().containsKey(dexClass.type)
+        || specification.isEmulatedInterfaceRewrittenType(dexClass.type));
   }
 
   private ProgramMethod generateCallbackMethod(
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
index 987dc8d..d8b8430 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryAPIConverter.java
@@ -152,7 +152,7 @@
       return false;
     }
     DexType holderType = invokedMethod.getHolderType();
-    if (appView.rewritePrefix.hasRewrittenType(holderType, appView) || holderType.isArrayType()) {
+    if (appView.typeRewriter.hasRewrittenType(holderType, appView) || holderType.isArrayType()) {
       return false;
     }
     DexClass dexClass = appView.definitionFor(holderType);
@@ -165,7 +165,7 @@
     if (isAlreadyDesugared(invoke, context)) {
       return false;
     }
-    return appView.rewritePrefix.hasRewrittenTypeInSignature(invokedMethod.getProto(), appView);
+    return appView.typeRewriter.hasRewrittenTypeInSignature(invokedMethod.getProto(), appView);
   }
 
   // The problem is that a method can resolve into a library method which is not present at runtime,
@@ -181,8 +181,8 @@
     return interfaceResult != null
         && appView
             .options()
-            .desugaredLibrarySpecification
-            .getEmulateLibraryInterface()
+            .machineDesugaredLibrarySpecification
+            .getEmulatedInterfaces()
             .containsKey(interfaceResult.getHolderType());
   }
 
@@ -196,14 +196,14 @@
     DexType[] newParameters = originalMethod.proto.parameters.values.clone();
     int index = 0;
     for (DexType param : originalMethod.proto.parameters.values) {
-      if (appView.rewritePrefix.hasRewrittenType(param, appView)) {
+      if (appView.typeRewriter.hasRewrittenType(param, appView)) {
         newParameters[index] = vivifiedTypeFor(param, appView);
       }
       index++;
     }
     DexType returnType = originalMethod.proto.returnType;
     DexType newReturnType =
-        appView.rewritePrefix.hasRewrittenType(returnType, appView)
+        appView.typeRewriter.hasRewrittenType(returnType, appView)
             ? vivifiedTypeFor(returnType, appView)
             : returnType;
     DexProto newProto = appView.dexItemFactory().createProto(newReturnType, newParameters);
@@ -236,7 +236,7 @@
             .createSynthesizedType(
                 DescriptorUtils.javaTypeToDescriptor(VIVIFIED_PREFIX + type.toString()));
     // We would need to ensure a classpath class for each type to remove this rewriteType call.
-    appView.rewritePrefix.rewriteType(vivifiedType, type);
+    appView.typeRewriter.rewriteType(vivifiedType, type);
     return vivifiedType;
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java
index 4a8cabe..1581f83 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/apiconversion/DesugaredLibraryWrapperSynthesizer.java
@@ -27,7 +27,8 @@
 import com.android.tools.r8.ir.desugar.CfClassSynthesizerDesugaringEventConsumer;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.apiconversion.DesugaredLibraryWrapperSynthesizerEventConsumer.DesugaredLibraryClasspathWrapperSynthesizeEventConsumer;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.apiconversion.DesugaredLibraryWrapperSynthesizerEventConsumer.DesugaredLibraryL8ProgramWrapperSynthesizerEventConsumer;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification.LegacyDesugaredLibrarySpecification;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.CustomConversionDescriptor;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineDesugaredLibrarySpecification;
 import com.android.tools.r8.ir.synthetic.DesugaredLibraryAPIConversionCfCodeProvider.APIConverterConstructorCfCodeProvider;
 import com.android.tools.r8.ir.synthetic.DesugaredLibraryAPIConversionCfCodeProvider.APIConverterVivifiedWrapperCfCodeProvider;
 import com.android.tools.r8.ir.synthetic.DesugaredLibraryAPIConversionCfCodeProvider.APIConverterWrapperCfCodeProvider;
@@ -39,13 +40,12 @@
 import com.android.tools.r8.synthesis.SyntheticMethodBuilder;
 import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
 import com.android.tools.r8.utils.StringDiagnostic;
-import com.google.common.collect.Iterables;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
-import java.util.LinkedList;
+import java.util.IdentityHashMap;
 import java.util.List;
-import java.util.concurrent.ConcurrentHashMap;
+import java.util.Map;
 import java.util.function.Function;
 
 // I am responsible for the generation of wrappers used to call library APIs when desugaring
@@ -95,8 +95,6 @@
 
   private final AppView<?> appView;
   private final DexItemFactory factory;
-  private final ConcurrentHashMap<DexType, List<DexEncodedMethod>> allImplementedMethodsCache =
-      new ConcurrentHashMap<>();
   private final DesugaredLibraryEnumConversionSynthesizer enumConverter;
 
   public DesugaredLibraryWrapperSynthesizer(AppView<?> appView) {
@@ -118,7 +116,7 @@
     if (type.isArrayType()) {
       return shouldConvert(type.toBaseType(appView.dexItemFactory()), method, context);
     }
-    if (!appView.rewritePrefix.hasRewrittenType(type, appView)) {
+    if (!appView.typeRewriter.hasRewrittenType(type, appView)) {
       return false;
     }
     if (canConvert(type)) {
@@ -174,22 +172,32 @@
   private DexMethod getCustomConversion(DexType type, DexType srcType, DexType destType) {
     // ConversionType holds the methods "rewrittenType convert(type)" and the other way around.
     // But everything is going to be rewritten, so we need to use vivifiedType and type".
-    DexType conversionHolder =
-        appView.options().desugaredLibrarySpecification.getCustomConversions().get(type);
-    if (conversionHolder != null) {
-      return factory.createMethod(
-          conversionHolder, factory.createProto(destType, srcType), factory.convertMethodName);
+    CustomConversionDescriptor descriptor =
+        appView.options().machineDesugaredLibrarySpecification.getCustomConversions().get(type);
+    if (descriptor == null) {
+      return null;
     }
-    return null;
+    // Because the conversion have rewritten types instead of vivified type we cannot use the
+    // specification content directly until the rewriting is done upfront in the compilation.
+    DexMethod conversion = type == srcType ? descriptor.getTo() : descriptor.getFrom();
+    assert type == srcType
+        ? type == conversion.getReturnType()
+        : type == conversion.getArgumentType(0, true);
+    return factory.createMethod(
+        conversion.getHolderType(), factory.createProto(destType, srcType), conversion.getName());
   }
 
   private boolean canConvert(DexType type) {
-    return appView.options().desugaredLibrarySpecification.getCustomConversions().containsKey(type)
+    return appView
+            .options()
+            .machineDesugaredLibrarySpecification
+            .getCustomConversions()
+            .containsKey(type)
         || canGenerateWrapper(type);
   }
 
   private void reportInvalidInvoke(DexType type, DexMethod invokedMethod, ProgramMethod context) {
-    DexType desugaredType = appView.rewritePrefix.rewrittenType(type, appView);
+    DexType desugaredType = appView.typeRewriter.rewrittenType(type, appView);
     Origin origin = context != null ? context.getOrigin() : Origin.unknown();
     Position position =
         context != null ? new MethodPosition(context.getMethodReference()) : Position.UNKNOWN;
@@ -212,7 +220,7 @@
   }
 
   private boolean canGenerateWrapper(DexType type) {
-    return appView.options().desugaredLibrarySpecification.getWrapperConversions().contains(type);
+    return appView.options().machineDesugaredLibrarySpecification.getWrappers().containsKey(type);
   }
 
   private DexClass getValidClassToWrap(DexType type) {
@@ -257,6 +265,9 @@
       return getExistingProgramWrapperConversions(context);
     }
     assert context.isNotProgramClass();
+    Iterable<DexMethod> methods =
+        appView.options().machineDesugaredLibrarySpecification.getWrappers().get(context.type);
+    assert methods != null;
     ClasspathOrLibraryClass classpathOrLibraryContext = context.asClasspathOrLibraryClass();
     DexType type = context.type;
     DexType vivifiedType = vivifiedTypeFor(type);
@@ -267,7 +278,7 @@
             type,
             classpathOrLibraryContext,
             eventConsumer,
-            wrapperField -> synthesizeVirtualMethodsForTypeWrapper(context, wrapperField));
+            wrapperField -> synthesizeVirtualMethodsForTypeWrapper(context, methods, wrapperField));
     DexClass vivifiedWrapper =
         ensureClasspathWrapper(
             SyntheticKind.VIVIFIED_WRAPPER,
@@ -275,7 +286,8 @@
             vivifiedType,
             classpathOrLibraryContext,
             eventConsumer,
-            wrapperField -> synthesizeVirtualMethodsForVivifiedTypeWrapper(context, wrapperField));
+            wrapperField ->
+                synthesizeVirtualMethodsForVivifiedTypeWrapper(context, methods, wrapperField));
     return new WrapperConversions(
         getConversion(wrapper, vivifiedType, type),
         getConversion(vivifiedWrapper, type, vivifiedType));
@@ -440,8 +452,7 @@
   }
 
   private Collection<DexEncodedMethod> synthesizeVirtualMethodsForVivifiedTypeWrapper(
-      DexClass dexClass, DexEncodedField wrapperField) {
-    Iterable<DexMethod> allImplementedMethods = allImplementedMethods(dexClass);
+      DexClass dexClass, Iterable<DexMethod> allImplementedMethods, DexEncodedField wrapperField) {
     List<DexEncodedMethod> generatedMethods = new ArrayList<>();
     // Each method should use only types in their signature, but each method the wrapper forwards
     // to should used only vivified types.
@@ -458,9 +469,8 @@
       if (holderClass == null) {
         assert appView
             .options()
-            .desugaredLibrarySpecification
-            .getEmulateLibraryInterface()
-            .containsValue(method.getHolderType());
+            .machineDesugaredLibrarySpecification
+            .isEmulatedInterfaceRewrittenType(method.getHolderType());
         isInterface = true;
       } else {
         isInterface = holderClass.isInterface();
@@ -483,8 +493,7 @@
   }
 
   private Collection<DexEncodedMethod> synthesizeVirtualMethodsForTypeWrapper(
-      DexClass dexClass, DexEncodedField wrapperField) {
-    Iterable<DexMethod> dexMethods = allImplementedMethods(dexClass);
+      DexClass dexClass, Iterable<DexMethod> dexMethods, DexEncodedField wrapperField) {
     List<DexEncodedMethod> generatedMethods = new ArrayList<>();
     // Each method should use only vivified types in their signature, but each method the wrapper
     // forwards
@@ -540,62 +549,6 @@
         .build();
   }
 
-  private Iterable<DexMethod> allImplementedMethods(DexClass clazz) {
-    if (appView.options().testing.machineDesugaredLibrarySpecification != null) {
-      return appView
-          .options()
-          .testing
-          .machineDesugaredLibrarySpecification
-          .getRewritingFlags()
-          .getWrappers()
-          .get(clazz.type);
-    }
-    List<DexEncodedMethod> dexEncodedMethods =
-        allImplementedMethodsCache.computeIfAbsent(
-            clazz.type, type -> internalAllImplementedMethods(clazz));
-    return Iterables.transform(dexEncodedMethods, m -> m.getReference());
-  }
-
-  private List<DexEncodedMethod> internalAllImplementedMethods(DexClass libraryClass) {
-    LinkedList<DexClass> workList = new LinkedList<>();
-    List<DexEncodedMethod> implementedMethods = new ArrayList<>();
-    workList.add(libraryClass);
-    while (!workList.isEmpty()) {
-      DexClass dexClass = workList.removeFirst();
-      for (DexEncodedMethod virtualMethod : dexClass.virtualMethods()) {
-        if (!virtualMethod.isPrivateMethod()) {
-          boolean alreadyAdded = false;
-          // This looks quadratic but given the size of the collections met in practice for
-          // desugared libraries (Max ~15) it does not matter.
-          for (DexEncodedMethod alreadyImplementedMethod : implementedMethods) {
-            if (alreadyImplementedMethod.getReference().match(virtualMethod.getReference())) {
-              alreadyAdded = true;
-              break;
-            }
-          }
-          if (!alreadyAdded) {
-            implementedMethods.add(virtualMethod);
-          }
-        }
-      }
-      for (DexType itf : dexClass.interfaces.values) {
-        DexClass itfClass = appView.definitionFor(itf);
-        // Cannot be null in program since we started from a LibraryClass.
-        assert itfClass != null || appView.options().isDesugaredLibraryCompilation();
-        if (itfClass != null) {
-          workList.add(itfClass);
-        }
-      }
-      if (dexClass.superType != factory.objectType) {
-        DexClass superClass = appView.definitionFor(dexClass.superType);
-        assert superClass != null; // Cannot be null since we started from a LibraryClass.
-        workList.add(superClass);
-      }
-    }
-    assert !Iterables.any(implementedMethods, DexEncodedMethod::isFinal);
-    return implementedMethods;
-  }
-
   private DexField wrappedValueField(DexType holder, DexType fieldType) {
     return factory.createField(holder, fieldType, factory.wrapperFieldName);
   }
@@ -619,25 +572,28 @@
   // conversion methods are present.
   @Override
   public void synthesizeClasses(CfClassSynthesizerDesugaringEventConsumer eventConsumer) {
-    LegacyDesugaredLibrarySpecification spec = appView.options().desugaredLibrarySpecification;
-    List<DexProgramClass> validClassesToWrap = new ArrayList<>();
-    for (DexType type : spec.getWrapperConversions()) {
-      assert !spec.getCustomConversions().containsKey(type);
-      DexClass validClassToWrap = getValidClassToWrap(type);
-      // In broken set-ups we can end up having a json files containing wrappers of non desugared
-      // classes. Such wrappers are not required since the class won't be rewritten.
-      if (validClassToWrap.isProgramClass()) {
-        if (validClassToWrap.isEnum()) {
-          enumConverter.ensureProgramEnumConversionClass(validClassToWrap, eventConsumer);
-        } else {
-          validClassesToWrap.add(validClassToWrap.asProgramClass());
-          ensureProgramWrappersWithoutVirtualMethods(validClassToWrap, eventConsumer);
-        }
-      }
-    }
-    for (DexProgramClass validClassToWrap : validClassesToWrap) {
-      ensureProgramWrappersVirtualMethods(validClassToWrap);
-    }
+    MachineDesugaredLibrarySpecification librarySpecification =
+        appView.options().machineDesugaredLibrarySpecification;
+    Map<DexProgramClass, Iterable<DexMethod>> validClassesToWrap = new IdentityHashMap<>();
+    librarySpecification
+        .getWrappers()
+        .forEach(
+            (type, methods) -> {
+              assert !librarySpecification.getCustomConversions().containsKey(type);
+              DexClass validClassToWrap = getValidClassToWrap(type);
+              // In broken set-ups we can end up having a json files containing wrappers of non
+              // desugared classes. Such wrappers are not required since the class won't be
+              // rewritten.
+              if (validClassToWrap.isProgramClass()) {
+                if (validClassToWrap.isEnum()) {
+                  enumConverter.ensureProgramEnumConversionClass(validClassToWrap, eventConsumer);
+                } else {
+                  validClassesToWrap.put(validClassToWrap.asProgramClass(), methods);
+                  ensureProgramWrappersWithoutVirtualMethods(validClassToWrap, eventConsumer);
+                }
+              }
+            });
+    validClassesToWrap.forEach(this::ensureProgramWrappersVirtualMethods);
   }
 
   // We generate first the two wrappers with the constructor method and the fields, then we
@@ -665,15 +621,16 @@
         SyntheticKind.VIVIFIED_WRAPPER, programContext, vivifiedWrapper, wrapper);
   }
 
-  private void ensureProgramWrappersVirtualMethods(DexClass context) {
+  private void ensureProgramWrappersVirtualMethods(DexClass context, Iterable<DexMethod> methods) {
     assert context.isProgramClass();
     DexProgramClass wrapper = getExistingProgramWrapper(context, SyntheticKind.WRAPPER);
     wrapper.addVirtualMethods(
-        synthesizeVirtualMethodsForTypeWrapper(context, getWrapperUniqueEncodedField(wrapper)));
+        synthesizeVirtualMethodsForTypeWrapper(
+            context, methods, getWrapperUniqueEncodedField(wrapper)));
     DexProgramClass vivifiedWrapper =
         getExistingProgramWrapper(context, SyntheticKind.VIVIFIED_WRAPPER);
     vivifiedWrapper.addVirtualMethods(
         synthesizeVirtualMethodsForVivifiedTypeWrapper(
-            context, getWrapperUniqueEncodedField(vivifiedWrapper)));
+            context, methods, getWrapperUniqueEncodedField(vivifiedWrapper)));
   }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecification.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecification.java
index 6a6a2d4..1e871b3 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecification.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecification.java
@@ -6,14 +6,9 @@
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClassAndMethod;
 import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.DexReference;
 import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.ir.desugar.PrefixRewritingMapper;
-import com.android.tools.r8.ir.desugar.PrefixRewritingMapper.DesugarPrefixRewritingMapper;
 import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.InternalOptions;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -23,56 +18,20 @@
   private final boolean libraryCompilation;
   private final HumanTopLevelFlags topLevelFlags;
   private final HumanRewritingFlags rewritingFlags;
-  private final PrefixRewritingMapper prefixRewritingMapper;
-
-  public static HumanDesugaredLibrarySpecification withOnlyRewritePrefixForTesting(
-      Map<String, String> prefix, InternalOptions options) {
-    return new HumanDesugaredLibrarySpecification(
-        HumanTopLevelFlags.empty(),
-        HumanRewritingFlags.withOnlyRewritePrefixForTesting(prefix, options),
-        true,
-        options.itemFactory);
-  }
-
-  public static HumanDesugaredLibrarySpecification empty() {
-    return new HumanDesugaredLibrarySpecification(
-        HumanTopLevelFlags.empty(), HumanRewritingFlags.empty(), false, null) {
-
-      @Override
-      public boolean isSupported(DexReference reference, AppView<?> appView) {
-        return false;
-      }
-
-      @Override
-      public boolean isEmptyConfiguration() {
-        return true;
-      }
-    };
-  }
 
   public HumanDesugaredLibrarySpecification(
       HumanTopLevelFlags topLevelFlags,
       HumanRewritingFlags rewritingFlags,
-      boolean libraryCompilation,
-      DexItemFactory factory) {
+      boolean libraryCompilation) {
     this.libraryCompilation = libraryCompilation;
     this.topLevelFlags = topLevelFlags;
     this.rewritingFlags = rewritingFlags;
-    this.prefixRewritingMapper =
-        rewritingFlags.getRewritePrefix().isEmpty()
-            ? PrefixRewritingMapper.empty()
-            : new DesugarPrefixRewritingMapper(
-                rewritingFlags.getRewritePrefix(), factory, libraryCompilation);
   }
 
   public boolean supportAllCallbacksFromLibrary() {
     return topLevelFlags.supportAllCallbacksFromLibrary();
   }
 
-  public PrefixRewritingMapper getPrefixRewritingMapper() {
-    return prefixRewritingMapper;
-  }
-
   public AndroidApiLevel getRequiredCompilationApiLevel() {
     return topLevelFlags.getRequiredCompilationAPILevel();
   }
@@ -109,10 +68,6 @@
     return rewritingFlags.getEmulateLibraryInterface();
   }
 
-  public boolean isSupported(DexReference reference, AppView<?> appView) {
-    return prefixRewritingMapper.hasRewrittenType(reference.getContextType(), appView);
-  }
-
   // If the method is retargeted, answers the retargeted method, else null.
   public DexMethod retargetMethod(DexEncodedMethod method, AppView<?> appView) {
     Map<DexMethod, DexType> retargetCoreLibMember = rewritingFlags.getRetargetCoreLibMember();
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecificationParser.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecificationParser.java
index a612177..e01def6 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecificationParser.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/humanspecification/HumanDesugaredLibrarySpecificationParser.java
@@ -103,7 +103,7 @@
 
     HumanDesugaredLibrarySpecification config =
         new HumanDesugaredLibrarySpecification(
-            topLevelFlags, legacyRewritingFlags, libraryCompilation, dexItemFactory);
+            topLevelFlags, legacyRewritingFlags, libraryCompilation);
     origin = null;
     return config;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyDesugaredLibrarySpecification.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyDesugaredLibrarySpecification.java
index 3da0b97..9ab05b9 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyDesugaredLibrarySpecification.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyDesugaredLibrarySpecification.java
@@ -6,13 +6,9 @@
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClassAndMethod;
 import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.DexReference;
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.ir.desugar.PrefixRewritingMapper;
-import com.android.tools.r8.ir.desugar.PrefixRewritingMapper.DesugarPrefixRewritingMapper;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.InternalOptions;
@@ -26,25 +22,18 @@
   private final boolean libraryCompilation;
   private final LegacyTopLevelFlags topLevelFlags;
   private final LegacyRewritingFlags rewritingFlags;
-  private final PrefixRewritingMapper prefixRewritingMapper;
 
   public static LegacyDesugaredLibrarySpecification withOnlyRewritePrefixForTesting(
       Map<String, String> prefix, InternalOptions options) {
     return new LegacyDesugaredLibrarySpecification(
         LegacyTopLevelFlags.empty(),
         LegacyRewritingFlags.withOnlyRewritePrefixForTesting(prefix, options),
-        true,
-        options.itemFactory);
+        true);
   }
 
   public static LegacyDesugaredLibrarySpecification empty() {
     return new LegacyDesugaredLibrarySpecification(
-        LegacyTopLevelFlags.empty(), LegacyRewritingFlags.empty(), false, null) {
-
-      @Override
-      public boolean isSupported(DexReference reference, AppView<?> appView) {
-        return false;
-      }
+        LegacyTopLevelFlags.empty(), LegacyRewritingFlags.empty(), false) {
 
       @Override
       public boolean isEmptyConfiguration() {
@@ -56,16 +45,10 @@
   public LegacyDesugaredLibrarySpecification(
       LegacyTopLevelFlags topLevelFlags,
       LegacyRewritingFlags rewritingFlags,
-      boolean libraryCompilation,
-      DexItemFactory factory) {
+      boolean libraryCompilation) {
     this.libraryCompilation = libraryCompilation;
     this.topLevelFlags = topLevelFlags;
     this.rewritingFlags = rewritingFlags;
-    this.prefixRewritingMapper =
-        rewritingFlags.getRewritePrefix().isEmpty()
-            ? PrefixRewritingMapper.empty()
-            : new DesugarPrefixRewritingMapper(
-                rewritingFlags.getRewritePrefix(), factory, libraryCompilation);
   }
 
   public LegacyTopLevelFlags getTopLevelFlags() {
@@ -80,10 +63,6 @@
     return topLevelFlags.supportAllCallbacksFromLibrary();
   }
 
-  public PrefixRewritingMapper getPrefixRewritingMapper() {
-    return prefixRewritingMapper;
-  }
-
   public AndroidApiLevel getRequiredCompilationApiLevel() {
     return topLevelFlags.getRequiredCompilationAPILevel();
   }
@@ -123,10 +102,6 @@
     return rewritingFlags.getEmulateLibraryInterface();
   }
 
-  public boolean isSupported(DexReference reference, AppView<?> appView) {
-    return prefixRewritingMapper.hasRewrittenType(reference.getContextType(), appView);
-  }
-
   // If the method is retargeted, answers the retargeted method, else null.
   public DexMethod retargetMethod(DexEncodedMethod method, AppView<?> appView) {
     Map<DexString, Map<DexType, DexType>> retargetCoreLibMember =
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyDesugaredLibrarySpecificationParser.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyDesugaredLibrarySpecificationParser.java
index 7cece17..a3afcd9 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyDesugaredLibrarySpecificationParser.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyDesugaredLibrarySpecificationParser.java
@@ -110,7 +110,7 @@
 
     LegacyDesugaredLibrarySpecification config =
         new LegacyDesugaredLibrarySpecification(
-            topLevelFlags, legacyRewritingFlags, libraryCompilation, dexItemFactory);
+            topLevelFlags, legacyRewritingFlags, libraryCompilation);
     origin = null;
     return config;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyTopLevelFlags.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyTopLevelFlags.java
index 465d125..8e0293b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyTopLevelFlags.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/legacyspecification/LegacyTopLevelFlags.java
@@ -54,7 +54,7 @@
 
   public static LegacyTopLevelFlags testing() {
     return new LegacyTopLevelFlags(
-        AndroidApiLevel.B,
+        AndroidApiLevel.O,
         FALL_BACK_SYNTHESIZED_CLASSES_PACKAGE_PREFIX,
         "testing",
         null,
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/CustomConversionDescriptor.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/CustomConversionDescriptor.java
new file mode 100644
index 0000000..e8c3ce3
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/CustomConversionDescriptor.java
@@ -0,0 +1,27 @@
+// Copyright (c) 2022, 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.desugar.desugaredlibrary.machinespecification;
+
+import com.android.tools.r8.graph.DexMethod;
+
+public class CustomConversionDescriptor {
+  private final DexMethod to;
+  private final DexMethod from;
+
+  public CustomConversionDescriptor(DexMethod to, DexMethod from) {
+    this.to = to;
+    this.from = from;
+    assert to.getReturnType() == from.getArgumentType(0, true);
+    assert from.getReturnType() == to.getArgumentType(0, true);
+  }
+
+  public DexMethod getTo() {
+    return to;
+  }
+
+  public DexMethod getFrom() {
+    return from;
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java
index 501482e..adc507f 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineDesugaredLibrarySpecification.java
@@ -4,12 +4,39 @@
 
 package com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification;
 
+import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexReference;
+import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import java.util.List;
+import java.util.Map;
+import java.util.Set;
+import java.util.function.Consumer;
+
 public class MachineDesugaredLibrarySpecification {
 
   private final boolean libraryCompilation;
   private final MachineTopLevelFlags topLevelFlags;
   private final MachineRewritingFlags rewritingFlags;
 
+  public static MachineDesugaredLibrarySpecification empty() {
+    return new MachineDesugaredLibrarySpecification(
+        false, MachineTopLevelFlags.empty(), MachineRewritingFlags.builder().build()) {
+      @Override
+      public boolean isSupported(DexReference reference) {
+        return false;
+      }
+    };
+  }
+
+  public static MachineDesugaredLibrarySpecification withOnlyRewriteTypeForTesting(
+      Map<DexType, DexType> rewriteTypeForTesting) {
+    MachineRewritingFlags.Builder builder = MachineRewritingFlags.builder();
+    rewriteTypeForTesting.forEach(builder::rewriteType);
+    return new MachineDesugaredLibrarySpecification(
+        true, MachineTopLevelFlags.empty(), builder.build());
+  }
+
   public MachineDesugaredLibrarySpecification(
       boolean libraryCompilation,
       MachineTopLevelFlags topLevelFlags,
@@ -23,11 +50,120 @@
     return libraryCompilation;
   }
 
-  public MachineTopLevelFlags getTopLevelFlags() {
-    return topLevelFlags;
+  public AndroidApiLevel getRequiredCompilationAPILevel() {
+    return topLevelFlags.getRequiredCompilationAPILevel();
   }
 
-  public MachineRewritingFlags getRewritingFlags() {
-    return rewritingFlags;
+  public String getSynthesizedLibraryClassesPackagePrefix() {
+    return topLevelFlags.getSynthesizedLibraryClassesPackagePrefix();
+  }
+
+  public String getIdentifier() {
+    return topLevelFlags.getIdentifier();
+  }
+
+  public String getJsonSource() {
+    return topLevelFlags.getJsonSource();
+  }
+
+  public boolean supportAllCallbacksFromLibrary() {
+    return topLevelFlags.supportAllCallbacksFromLibrary();
+  }
+
+  public List<String> getExtraKeepRules() {
+    return topLevelFlags.getExtraKeepRules();
+  }
+
+  public Map<DexType, DexType> getRewriteType() {
+    return rewritingFlags.getRewriteType();
+  }
+
+  public Map<DexType, DexType> getRewriteDerivedTypeOnly() {
+    return rewritingFlags.getRewriteDerivedTypeOnly();
+  }
+
+  public Map<DexMethod, DexMethod> getStaticRetarget() {
+    return rewritingFlags.getStaticRetarget();
+  }
+
+  public Map<DexMethod, DexMethod> getNonEmulatedVirtualRetarget() {
+    return rewritingFlags.getNonEmulatedVirtualRetarget();
+  }
+
+  public Map<DexMethod, EmulatedDispatchMethodDescriptor> getEmulatedVirtualRetarget() {
+    return rewritingFlags.getEmulatedVirtualRetarget();
+  }
+
+  public Map<DexMethod, DexMethod> getEmulatedVirtualRetargetThroughEmulatedInterface() {
+    return rewritingFlags.getEmulatedVirtualRetargetThroughEmulatedInterface();
+  }
+
+  public void forEachRetargetHolder(Consumer<DexType> consumer) {
+    rewritingFlags.forEachRetargetHolder(consumer);
+  }
+
+  public Map<DexType, EmulatedInterfaceDescriptor> getEmulatedInterfaces() {
+    return rewritingFlags.getEmulatedInterfaces();
+  }
+
+  public EmulatedDispatchMethodDescriptor getEmulatedInterfaceEmulatedDispatchMethodDescriptor(
+      DexMethod method) {
+    return rewritingFlags.getEmulatedInterfaceEmulatedDispatchMethodDescriptor(method);
+  }
+
+  public boolean isCustomConversionRewrittenType(DexType type) {
+    return rewritingFlags.isCustomConversionRewrittenType(type);
+  }
+
+  public boolean isEmulatedInterfaceRewrittenType(DexType type) {
+    return rewritingFlags.isEmulatedInterfaceRewrittenType(type);
+  }
+
+  public Map<DexType, List<DexMethod>> getWrappers() {
+    return rewritingFlags.getWrappers();
+  }
+
+  public Map<DexType, DexType> getLegacyBackport() {
+    return rewritingFlags.getLegacyBackport();
+  }
+
+  public Set<DexType> getDontRetarget() {
+    return rewritingFlags.getDontRetarget();
+  }
+
+  public Map<DexType, CustomConversionDescriptor> getCustomConversions() {
+    return rewritingFlags.getCustomConversions();
+  }
+
+  public boolean hasRetargeting() {
+    return rewritingFlags.hasRetargeting();
+  }
+
+  public boolean hasEmulatedInterfaces() {
+    return rewritingFlags.hasEmulatedInterfaces();
+  }
+
+  public boolean isSupported(DexReference reference) {
+    // Support through type rewriting.
+    if (rewritingFlags.getRewriteType().containsKey(reference.getContextType())) {
+      return true;
+    }
+    if (!reference.isDexMethod()) {
+      return false;
+    }
+    // Support through retargeting.
+    DexMethod dexMethod = reference.asDexMethod();
+    if (getStaticRetarget().containsKey(dexMethod)
+        || getNonEmulatedVirtualRetarget().containsKey(dexMethod)
+        || getEmulatedVirtualRetarget().containsKey(dexMethod)) {
+      return true;
+    }
+    // Support through emulated interface.
+    for (EmulatedInterfaceDescriptor descriptor : getEmulatedInterfaces().values()) {
+      if (descriptor.getEmulatedMethods().containsKey(dexMethod)) {
+        return true;
+      }
+    }
+    return false;
   }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java
index a6c487e..f34634d 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineRewritingFlags.java
@@ -5,16 +5,16 @@
 package com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification;
 
 import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.utils.Pair;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
 import com.google.common.collect.ImmutableSet;
+import com.google.common.collect.Iterables;
 import java.util.IdentityHashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.Consumer;
 
 public class MachineRewritingFlags {
 
@@ -28,16 +28,19 @@
       Map<DexMethod, DexMethod> staticRetarget,
       Map<DexMethod, DexMethod> nonEmulatedVirtualRetarget,
       Map<DexMethod, EmulatedDispatchMethodDescriptor> emulatedVirtualRetarget,
+      Map<DexMethod, DexMethod> emulatedVirtualRetargetThroughEmulatedInterface,
       Map<DexType, EmulatedInterfaceDescriptor> emulatedInterfaces,
       Map<DexType, List<DexMethod>> wrappers,
       Map<DexType, DexType> legacyBackport,
       Set<DexType> dontRetarget,
-      Map<DexType, Pair<DexType, DexString>> customConversions) {
+      Map<DexType, CustomConversionDescriptor> customConversions) {
     this.rewriteType = rewriteType;
     this.rewriteDerivedTypeOnly = rewriteDerivedTypeOnly;
     this.staticRetarget = staticRetarget;
     this.nonEmulatedVirtualRetarget = nonEmulatedVirtualRetarget;
     this.emulatedVirtualRetarget = emulatedVirtualRetarget;
+    this.emulatedVirtualRetargetThroughEmulatedInterface =
+        emulatedVirtualRetargetThroughEmulatedInterface;
     this.emulatedInterfaces = emulatedInterfaces;
     this.wrappers = wrappers;
     this.legacyBackport = legacyBackport;
@@ -63,6 +66,9 @@
 
   // Virtual methods to retarget through emulated dispatch.
   private final Map<DexMethod, EmulatedDispatchMethodDescriptor> emulatedVirtualRetarget;
+  // Virtual methods to retarget through emulated dispatch but handled through emulated interface
+  // dispatch. The method has to override an emulated interface method.
+  private final Map<DexMethod, DexMethod> emulatedVirtualRetargetThroughEmulatedInterface;
 
   // Emulated interface descriptors.
   private final Map<DexType, EmulatedInterfaceDescriptor> emulatedInterfaces;
@@ -72,7 +78,7 @@
 
   private final Map<DexType, DexType> legacyBackport;
   private final Set<DexType> dontRetarget;
-  private final Map<DexType, Pair<DexType, DexString>> customConversions;
+  private final Map<DexType, CustomConversionDescriptor> customConversions;
 
   public Map<DexType, DexType> getRewriteType() {
     return rewriteType;
@@ -94,6 +100,16 @@
     return emulatedVirtualRetarget;
   }
 
+  public Map<DexMethod, DexMethod> getEmulatedVirtualRetargetThroughEmulatedInterface() {
+    return emulatedVirtualRetargetThroughEmulatedInterface;
+  }
+
+  public void forEachRetargetHolder(Consumer<DexType> consumer) {
+    staticRetarget.keySet().forEach(m -> consumer.accept(m.getHolderType()));
+    nonEmulatedVirtualRetarget.keySet().forEach(m -> consumer.accept(m.getHolderType()));
+    emulatedVirtualRetarget.keySet().forEach(m -> consumer.accept(m.getHolderType()));
+  }
+
   public Map<DexType, EmulatedInterfaceDescriptor> getEmulatedInterfaces() {
     return emulatedInterfaces;
   }
@@ -110,10 +126,41 @@
     return dontRetarget;
   }
 
-  public Map<DexType, Pair<DexType, DexString>> getCustomConversions() {
+  public boolean isCustomConversionRewrittenType(DexType type) {
+    return Iterables.any(
+        customConversions.values(),
+        descriptor ->
+            descriptor.getFrom().getHolderType() == type
+                || descriptor.getTo().getHolderType() == type);
+  }
+
+  public Map<DexType, CustomConversionDescriptor> getCustomConversions() {
     return customConversions;
   }
 
+  public boolean hasRetargeting() {
+    return !staticRetarget.isEmpty()
+        || !nonEmulatedVirtualRetarget.isEmpty()
+        || !emulatedVirtualRetarget.isEmpty();
+  }
+
+  public boolean isEmulatedInterfaceRewrittenType(DexType type) {
+    return Iterables.any(
+        emulatedInterfaces.values(), descriptor -> descriptor.getRewrittenType() == type);
+  }
+
+  public boolean hasEmulatedInterfaces() {
+    return !emulatedInterfaces.isEmpty();
+  }
+
+  EmulatedDispatchMethodDescriptor getEmulatedInterfaceEmulatedDispatchMethodDescriptor(
+      DexMethod method) {
+    if (!emulatedInterfaces.containsKey(method.getHolderType())) {
+      return null;
+    }
+    return emulatedInterfaces.get(method.getHolderType()).getEmulatedMethods().get(method);
+  }
+
   public static class Builder {
 
     Builder() {}
@@ -126,17 +173,21 @@
         ImmutableMap.builder();
     private final ImmutableMap.Builder<DexMethod, EmulatedDispatchMethodDescriptor>
         emulatedVirtualRetarget = ImmutableMap.builder();
+    private final ImmutableMap.Builder<DexMethod, DexMethod>
+        emulatedVirtualRetargetThroughEmulatedInterface = ImmutableMap.builder();
     private final ImmutableMap.Builder<DexType, EmulatedInterfaceDescriptor> emulatedInterfaces =
         ImmutableMap.builder();
     private final ImmutableMap.Builder<DexType, List<DexMethod>> wrappers = ImmutableMap.builder();
     private final ImmutableMap.Builder<DexType, DexType> legacyBackport = ImmutableMap.builder();
     private final ImmutableSet.Builder<DexType> dontRetarget = ImmutableSet.builder();
-    private final ImmutableMap.Builder<DexType, Pair<DexType, DexString>> customConversions =
+    private final ImmutableMap.Builder<DexType, CustomConversionDescriptor> customConversions =
         ImmutableMap.builder();
 
     public void rewriteType(DexType src, DexType target) {
       assert src != null;
       assert target != null;
+      assert src != target;
+      assert !rewriteType.containsKey(src) || rewriteType.get(src) == target;
       rewriteType.put(src, target);
     }
 
@@ -160,6 +211,10 @@
       emulatedVirtualRetarget.put(src, dest);
     }
 
+    public void putEmulatedVirtualRetargetThroughEmulatedInterface(DexMethod src, DexMethod dest) {
+      emulatedVirtualRetargetThroughEmulatedInterface.put(src, dest);
+    }
+
     public void addWrapper(DexType wrapperConversion, List<DexMethod> methods) {
       wrappers.put(wrapperConversion, ImmutableList.copyOf(methods));
     }
@@ -172,8 +227,12 @@
       dontRetarget.add(type);
     }
 
-    public void putCustomConversion(DexType src, DexType conversionType, DexString conversionName) {
-      customConversions.put(src, new Pair<>(conversionType, conversionName));
+    public void putCustomConversion(DexType src, CustomConversionDescriptor descriptor) {
+      customConversions.put(src, descriptor);
+    }
+
+    public DexType getRewrittenType(DexType type) {
+      return rewriteType.get(type);
     }
 
     public MachineRewritingFlags build() {
@@ -183,6 +242,7 @@
           staticRetarget.build(),
           nonEmulatedVirtualRetarget.build(),
           emulatedVirtualRetarget.build(),
+          emulatedVirtualRetargetThroughEmulatedInterface.build(),
           emulatedInterfaces.build(),
           wrappers.build(),
           legacyBackport.build(),
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineTopLevelFlags.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineTopLevelFlags.java
index f426219..0c6a88a 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineTopLevelFlags.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/machinespecification/MachineTopLevelFlags.java
@@ -5,6 +5,7 @@
 package com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification;
 
 import com.android.tools.r8.utils.AndroidApiLevel;
+import com.google.common.collect.ImmutableList;
 import java.util.List;
 
 public class MachineTopLevelFlags {
@@ -23,6 +24,11 @@
   private final boolean supportAllCallbacksFromLibrary;
   private final List<String> extraKeepRules;
 
+  public static MachineTopLevelFlags empty() {
+    return new MachineTopLevelFlags(
+        AndroidApiLevel.B, "unused", null, null, false, ImmutableList.of());
+  }
+
   public MachineTopLevelFlags(
       AndroidApiLevel requiredCompilationAPILevel,
       String synthesizedLibraryClassesPackagePrefix,
@@ -54,7 +60,7 @@
     return jsonSource;
   }
 
-  public boolean isSupportAllCallbacksFromLibrary() {
+  public boolean supportAllCallbacksFromLibrary() {
     return supportAllCallbacksFromLibrary;
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeter.java
index a54cd8d..73dd908 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeter.java
@@ -12,7 +12,6 @@
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClassAndMethod;
-import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.MethodResolutionResult;
@@ -23,6 +22,7 @@
 import com.android.tools.r8.ir.desugar.FreshLocalProvider;
 import com.android.tools.r8.ir.desugar.LocalStackAllocator;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.EmulatedDispatchMethodDescriptor;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineDesugaredLibrarySpecification;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter.DesugaredLibraryRetargeterSynthesizerEventConsumer.DesugaredLibraryRetargeterInstructionEventConsumer;
 import java.util.Collection;
 import java.util.Collections;
@@ -36,7 +36,6 @@
   private final AppView<?> appView;
   private final DesugaredLibraryRetargeterSyntheticHelper syntheticHelper;
 
-  private final RetargetingInfo retargetingInfo;
   private final Map<DexMethod, DexMethod> staticRetarget;
   private final Map<DexMethod, DexMethod> nonEmulatedVirtualRetarget;
   private final Map<DexMethod, EmulatedDispatchMethodDescriptor> emulatedVirtualRetarget;
@@ -44,10 +43,11 @@
   public DesugaredLibraryRetargeter(AppView<?> appView) {
     this.appView = appView;
     this.syntheticHelper = new DesugaredLibraryRetargeterSyntheticHelper(appView);
-    retargetingInfo = RetargetingInfo.get(appView);
-    staticRetarget = retargetingInfo.getStaticRetarget();
-    nonEmulatedVirtualRetarget = retargetingInfo.getNonEmulatedVirtualRetarget();
-    emulatedVirtualRetarget = retargetingInfo.getEmulatedVirtualRetarget();
+    MachineDesugaredLibrarySpecification specification =
+        appView.options().machineDesugaredLibrarySpecification;
+    staticRetarget = specification.getStaticRetarget();
+    nonEmulatedVirtualRetarget = specification.getNonEmulatedVirtualRetarget();
+    emulatedVirtualRetarget = specification.getEmulatedVirtualRetarget();
   }
 
   // Used by the ListOfBackportedMethods utility.
@@ -57,10 +57,6 @@
     emulatedVirtualRetarget.keySet().forEach(consumer);
   }
 
-  public RetargetingInfo getRetargetingInfo() {
-    return retargetingInfo;
-  }
-
   @Override
   public Collection<CfInstruction> desugarInstruction(
       CfInstruction instruction,
@@ -87,6 +83,18 @@
     return computeNewInvokeTarget(instruction, context).hasNewInvokeTarget();
   }
 
+  InvokeRetargetingResult ensureInvokeRetargetingResult(DexMethod retarget) {
+    if (retarget == null) {
+      return NO_REWRITING;
+    }
+    return new InvokeRetargetingResult(
+        true,
+        eventConsumer -> {
+          syntheticHelper.ensureRetargetMethod(retarget, eventConsumer);
+          return retarget;
+        });
+  }
+
   static class InvokeRetargetingResult {
 
     static InvokeRetargetingResult NO_REWRITING =
@@ -96,13 +104,6 @@
     private final Function<DesugaredLibraryRetargeterInstructionEventConsumer, DexMethod>
         newInvokeTargetSupplier;
 
-    static InvokeRetargetingResult createInvokeRetargetingResult(DexMethod retarget) {
-      if (retarget == null) {
-        return NO_REWRITING;
-      }
-      return new InvokeRetargetingResult(true, ignored -> retarget);
-    }
-
     private InvokeRetargetingResult(
         boolean hasNewInvokeTarget,
         Function<DesugaredLibraryRetargeterInstructionEventConsumer, DexMethod>
@@ -129,8 +130,8 @@
     }
     if (appView
         .options()
-        .desugaredLibrarySpecification
-        .getDontRetargetLibMember()
+        .machineDesugaredLibrarySpecification
+        .getDontRetarget()
         .contains(context.getContextType())) {
       return NO_REWRITING;
     }
@@ -148,44 +149,33 @@
     assert singleTarget != null;
     if (cfInvoke.isInvokeStatic()) {
       DexMethod retarget = staticRetarget.get(singleTarget);
-      return retarget == null
-          ? NO_REWRITING
-          : InvokeRetargetingResult.createInvokeRetargetingResult(retarget);
+      return retarget == null ? NO_REWRITING : ensureInvokeRetargetingResult(retarget);
     }
-    InvokeRetargetingResult retarget = computeNonStaticRetarget(singleTarget);
+    InvokeRetargetingResult retarget = computeNonStaticRetarget(singleTarget, false);
     if (!retarget.hasNewInvokeTarget()) {
       return NO_REWRITING;
     }
     if (cfInvoke.isInvokeSuper(context.getHolderType())) {
       DexClassAndMethod superTarget = appInfo.lookupSuperTarget(invokedMethod, context);
       if (superTarget != null) {
-        return computeSuperRetarget(superTarget.getDefinition());
+        assert !superTarget.getDefinition().isStatic();
+        return computeNonStaticRetarget(superTarget.getReference(), true);
       }
     }
     return retarget;
   }
 
-  private InvokeRetargetingResult computeNonStaticRetarget(DexMethod singleTarget) {
+  private InvokeRetargetingResult computeNonStaticRetarget(
+      DexMethod singleTarget, boolean superInvoke) {
     EmulatedDispatchMethodDescriptor descriptor = emulatedVirtualRetarget.get(singleTarget);
     if (descriptor != null) {
       return new InvokeRetargetingResult(
           true,
           eventConsumer ->
-              syntheticHelper.ensureEmulatedHolderDispatchMethod(descriptor, eventConsumer));
+              superInvoke
+                  ? syntheticHelper.ensureForwardingMethod(descriptor, eventConsumer)
+                  : syntheticHelper.ensureEmulatedHolderDispatchMethod(descriptor, eventConsumer));
     }
-    return InvokeRetargetingResult.createInvokeRetargetingResult(
-        nonEmulatedVirtualRetarget.get(singleTarget));
-  }
-
-  private InvokeRetargetingResult computeSuperRetarget(DexEncodedMethod singleTarget) {
-    assert !singleTarget.isStatic();
-    DexMethod reference = singleTarget.getReference();
-    EmulatedDispatchMethodDescriptor descriptor = emulatedVirtualRetarget.get(reference);
-    if (descriptor != null) {
-      return InvokeRetargetingResult.createInvokeRetargetingResult(
-          syntheticHelper.ensureForwardingMethod(descriptor));
-    }
-    return InvokeRetargetingResult.createInvokeRetargetingResult(
-        nonEmulatedVirtualRetarget.get(reference));
+    return ensureInvokeRetargetingResult(nonEmulatedVirtualRetarget.get(singleTarget));
   }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterL8Synthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterL8Synthesizer.java
index 11fcfb7..60086f8 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterL8Synthesizer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterL8Synthesizer.java
@@ -14,30 +14,30 @@
 
   private final AppView<?> appView;
   private final DesugaredLibraryRetargeterSyntheticHelper syntheticHelper;
-  private final Map<DexMethod, EmulatedDispatchMethodDescriptor> emulatedDispatchMethods;
 
-  public static DesugaredLibraryRetargeterL8Synthesizer create(
-      AppView<?> appView, RetargetingInfo retargetingInfo) {
+  public static DesugaredLibraryRetargeterL8Synthesizer create(AppView<?> appView) {
     assert appView.options().isDesugaredLibraryCompilation();
-    if (retargetingInfo == null || retargetingInfo.getEmulatedVirtualRetarget().isEmpty()) {
-      assert appView.options().desugaredLibrarySpecification.getRetargetCoreLibMember().isEmpty();
+    if (appView
+        .options()
+        .machineDesugaredLibrarySpecification
+        .getEmulatedVirtualRetarget()
+        .isEmpty()) {
       return null;
     }
-    return new DesugaredLibraryRetargeterL8Synthesizer(appView, retargetingInfo);
+    return new DesugaredLibraryRetargeterL8Synthesizer(appView);
   }
 
-  public DesugaredLibraryRetargeterL8Synthesizer(
-      AppView<?> appView, RetargetingInfo retargetingInfo) {
+  public DesugaredLibraryRetargeterL8Synthesizer(AppView<?> appView) {
     this.appView = appView;
     this.syntheticHelper = new DesugaredLibraryRetargeterSyntheticHelper(appView);
-    emulatedDispatchMethods = retargetingInfo.getEmulatedVirtualRetarget();
   }
 
   @Override
   public void synthesizeClasses(CfClassSynthesizerDesugaringEventConsumer eventConsumer) {
-    assert !emulatedDispatchMethods.isEmpty();
+    Map<DexMethod, EmulatedDispatchMethodDescriptor> emulatedVirtualRetarget =
+        appView.options().machineDesugaredLibrarySpecification.getEmulatedVirtualRetarget();
     for (EmulatedDispatchMethodDescriptor emulatedDispatchMethod :
-        emulatedDispatchMethods.values()) {
+        emulatedVirtualRetarget.values()) {
       syntheticHelper.ensureProgramEmulatedHolderDispatchMethod(
           emulatedDispatchMethod, eventConsumer);
     }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterLibraryTypeSynthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterLibraryTypeSynthesizer.java
deleted file mode 100644
index bbaa4cf..0000000
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterLibraryTypeSynthesizer.java
+++ /dev/null
@@ -1,163 +0,0 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter;
-
-import com.android.tools.r8.ProgramResource.Kind;
-import com.android.tools.r8.dex.Constants;
-import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
-import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.ClassAccessFlags;
-import com.android.tools.r8.graph.DexAnnotationSet;
-import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.graph.DexEncodedField;
-import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexLibraryClass;
-import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.DexString;
-import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.DexTypeList;
-import com.android.tools.r8.graph.DirectMappedDexApplication;
-import com.android.tools.r8.graph.EnclosingMethodAttribute;
-import com.android.tools.r8.graph.GenericSignature.ClassSignature;
-import com.android.tools.r8.graph.InnerClassAttribute;
-import com.android.tools.r8.graph.MethodAccessFlags;
-import com.android.tools.r8.graph.NestHostClassAttribute;
-import com.android.tools.r8.graph.NestMemberClassAttribute;
-import com.android.tools.r8.origin.SynthesizedOrigin;
-import com.android.tools.r8.utils.StringDiagnostic;
-import java.util.Comparator;
-import java.util.IdentityHashMap;
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-import java.util.TreeSet;
-
-public class DesugaredLibraryRetargeterLibraryTypeSynthesizer {
-
-  public static void checkForAssumedLibraryTypes(AppView<?> appView) {
-    Map<DexString, Map<DexType, DexType>> retargetCoreLibMember =
-        appView.options().desugaredLibrarySpecification.getRetargetCoreLibMember();
-    for (DexString methodName : retargetCoreLibMember.keySet()) {
-      for (DexType inType : retargetCoreLibMember.get(methodName).keySet()) {
-        DexClass typeClass = appView.definitionFor(inType);
-        if (typeClass == null) {
-          warnMissingRetargetCoreLibraryMember(inType, appView);
-        }
-      }
-    }
-  }
-
-  public static void amendLibraryWithRetargetedMembers(AppView<AppInfoWithClassHierarchy> appView) {
-    Map<DexString, Map<DexType, DexType>> retargetCoreLibMember =
-        appView.options().desugaredLibrarySpecification.getRetargetCoreLibMember();
-    Map<DexType, DexLibraryClass> synthesizedLibraryClasses =
-        synthesizeLibraryClassesForRetargetedMembers(appView, retargetCoreLibMember);
-    Map<DexLibraryClass, Set<DexEncodedMethod>> synthesizedLibraryMethods =
-        synthesizedMembersForRetargetClasses(
-            appView, retargetCoreLibMember, synthesizedLibraryClasses);
-    synthesizedLibraryMethods.forEach(DexLibraryClass::addDirectMethods);
-    DirectMappedDexApplication newApplication =
-        appView
-            .appInfo()
-            .app()
-            .asDirect()
-            .builder()
-            .addLibraryClasses(synthesizedLibraryClasses.values())
-            .build();
-    appView.setAppInfo(appView.appInfo().rebuildWithClassHierarchy(app -> newApplication));
-  }
-
-  private static Map<DexType, DexLibraryClass> synthesizeLibraryClassesForRetargetedMembers(
-      AppView<AppInfoWithClassHierarchy> appView,
-      Map<DexString, Map<DexType, DexType>> retargetCoreLibMember) {
-    DexItemFactory dexItemFactory = appView.dexItemFactory();
-    Map<DexType, DexLibraryClass> synthesizedLibraryClasses = new LinkedHashMap<>();
-    for (Map<DexType, DexType> oldToNewTypeMap : retargetCoreLibMember.values()) {
-      for (DexType newType : oldToNewTypeMap.values()) {
-        if (appView.definitionFor(newType) == null) {
-          synthesizedLibraryClasses.computeIfAbsent(
-              newType,
-              type ->
-                  // Synthesize a library class with the given name. Note that this is assuming that
-                  // the library class inherits directly from java.lang.Object, does not implement
-                  // any interfaces, etc.
-                  new DexLibraryClass(
-                      type,
-                      Kind.CF,
-                      new SynthesizedOrigin(
-                          "Desugared library retargeter", DesugaredLibraryRetargeter.class),
-                      ClassAccessFlags.fromCfAccessFlags(Constants.ACC_PUBLIC),
-                      dexItemFactory.objectType,
-                      DexTypeList.empty(),
-                      dexItemFactory.createString("DesugaredLibraryRetargeter"),
-                      NestHostClassAttribute.none(),
-                      NestMemberClassAttribute.emptyList(),
-                      EnclosingMethodAttribute.none(),
-                      InnerClassAttribute.emptyList(),
-                      ClassSignature.noSignature(),
-                      DexAnnotationSet.empty(),
-                      DexEncodedField.EMPTY_ARRAY,
-                      DexEncodedField.EMPTY_ARRAY,
-                      DexEncodedMethod.EMPTY_ARRAY,
-                      DexEncodedMethod.EMPTY_ARRAY,
-                      dexItemFactory.getSkipNameValidationForTesting()));
-        }
-      }
-    }
-    return synthesizedLibraryClasses;
-  }
-
-  private static Map<DexLibraryClass, Set<DexEncodedMethod>> synthesizedMembersForRetargetClasses(
-      AppView<AppInfoWithClassHierarchy> appView,
-      Map<DexString, Map<DexType, DexType>> retargetCoreLibMember,
-      Map<DexType, DexLibraryClass> synthesizedLibraryClasses) {
-    DexItemFactory dexItemFactory = appView.dexItemFactory();
-    Map<DexLibraryClass, Set<DexEncodedMethod>> synthesizedMembers = new IdentityHashMap<>();
-    for (Entry<DexString, Map<DexType, DexType>> entry : retargetCoreLibMember.entrySet()) {
-      DexString methodName = entry.getKey();
-      Map<DexType, DexType> types = entry.getValue();
-      types.forEach(
-          (oldType, newType) -> {
-            DexClass oldClass = appView.definitionFor(oldType);
-            DexLibraryClass newClass = synthesizedLibraryClasses.get(newType);
-            if (oldClass == null || newClass == null) {
-              return;
-            }
-            for (DexEncodedMethod method :
-                oldClass.methods(method -> method.getName() == methodName)) {
-              DexMethod retargetMethod = method.getReference().withHolder(newType, dexItemFactory);
-              if (!method.isStatic()) {
-                retargetMethod = retargetMethod.withExtraArgumentPrepended(oldType, dexItemFactory);
-              }
-              synthesizedMembers
-                  .computeIfAbsent(
-                      newClass,
-                      ignore -> new TreeSet<>(Comparator.comparing(DexEncodedMethod::getReference)))
-                  .add(
-                      DexEncodedMethod.syntheticBuilder()
-                          .setMethod(retargetMethod)
-                          .setAccessFlags(
-                              MethodAccessFlags.fromCfAccessFlags(
-                                  Constants.ACC_PUBLIC | Constants.ACC_STATIC, false))
-                          .setCode(null)
-                          .setApiLevelForDefinition(method.getApiLevelForDefinition())
-                          .build());
-            }
-          });
-    }
-    return synthesizedMembers;
-  }
-
-  private static void warnMissingRetargetCoreLibraryMember(DexType type, AppView<?> appView) {
-    StringDiagnostic warning =
-        new StringDiagnostic(
-            "Cannot retarget core library member "
-                + type.getName()
-                + " because the class is missing.");
-    appView.options().reporter.warning(warning);
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterPostProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterPostProcessor.java
index 414c32d..e1447fb 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterPostProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterPostProcessor.java
@@ -36,11 +36,11 @@
   private final DesugaredLibraryRetargeterSyntheticHelper syntheticHelper;
   private final Map<DexMethod, EmulatedDispatchMethodDescriptor> emulatedDispatchMethods;
 
-  public DesugaredLibraryRetargeterPostProcessor(
-      AppView<?> appView, RetargetingInfo retargetingInfo) {
+  public DesugaredLibraryRetargeterPostProcessor(AppView<?> appView) {
     this.appView = appView;
     this.syntheticHelper = new DesugaredLibraryRetargeterSyntheticHelper(appView);
-    emulatedDispatchMethods = retargetingInfo.getEmulatedVirtualRetarget();
+    emulatedDispatchMethods =
+        appView.options().machineDesugaredLibrarySpecification.getEmulatedVirtualRetarget();
   }
 
   @Override
@@ -127,8 +127,8 @@
       }
       if (appView
           .options()
-          .desugaredLibrarySpecification
-          .getDontRetargetLibMember()
+          .machineDesugaredLibrarySpecification
+          .getDontRetarget()
           .contains(clazz.getType())) {
         continue;
       }
@@ -136,7 +136,7 @@
           Collections.singletonList(new ClassTypeSignature(newInterface.type)));
       eventConsumer.acceptInterfaceInjection(clazz, newInterface);
       DexMethod itfMethod =
-          syntheticHelper.getEmulatedInterfaceDispatchMethod(newInterface, descriptor);
+          syntheticHelper.emulatedInterfaceDispatchMethod(newInterface, descriptor);
       if (clazz.lookupVirtualMethod(method) == null) {
         DexEncodedMethod newMethod = createForwardingMethod(itfMethod, descriptor, clazz);
         clazz.addVirtualMethod(newMethod);
@@ -150,7 +150,7 @@
     // NOTE: Never add a forwarding method to methods of classes unknown or coming from android.jar
     // even if this results in invalid code, these classes are never desugared.
     // In desugared library, emulated interface methods can be overridden by retarget lib members.
-    DexMethod forwardMethod = syntheticHelper.ensureForwardingMethod(descriptor);
+    DexMethod forwardMethod = syntheticHelper.forwardingMethod(descriptor);
     assert forwardMethod != null && forwardMethod != target;
     DexEncodedMethod resolvedMethod =
         appView.appInfoForDesugaring().resolveMethod(target, true).getResolvedMethod();
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterSyntheticHelper.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterSyntheticHelper.java
index 5519d95..6102e1a 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterSyntheticHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/DesugaredLibraryRetargeterSyntheticHelper.java
@@ -6,6 +6,7 @@
 import com.android.tools.r8.dex.Constants;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.CfCode;
+import com.android.tools.r8.graph.ClasspathMethod;
 import com.android.tools.r8.graph.ClasspathOrLibraryClass;
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexMethod;
@@ -29,12 +30,46 @@
     this.appView = appView;
   }
 
-  public DexMethod ensureForwardingMethod(EmulatedDispatchMethodDescriptor descriptor) {
-    // TODO(b/184026720): We may synthesize a stub on the classpath if absent.
+  public DexMethod ensureRetargetMethod(
+      DexMethod retarget, DesugaredLibraryRetargeterInstructionEventConsumer eventConsumer) {
+    DexClass holderClass = appView.definitionFor(retarget.getHolderType());
+    if (holderClass != null && !holderClass.isClasspathClass()) {
+      // The holder class is a library class in orthodox set-ups where the L8 compilation
+      // is done in multiple steps, this is only partially supported (most notably for tests).
+      assert holderClass.lookupMethod(retarget) != null;
+      return retarget;
+    }
+    assert eventConsumer != null;
+    ClasspathMethod ensuredMethod =
+        appView
+            .getSyntheticItems()
+            .ensureFixedClasspathMethodFromType(
+                retarget.getName(),
+                retarget.getProto(),
+                SyntheticKind.RETARGET_STUB,
+                retarget.getHolderType(),
+                appView,
+                ignored -> {},
+                eventConsumer::acceptDesugaredLibraryRetargeterDispatchClasspathClass,
+                methodBuilder ->
+                    methodBuilder
+                        .setAccessFlags(MethodAccessFlags.createPublicStaticSynthetic())
+                        .setCode(null));
+    assert ensuredMethod.getReference() == retarget;
+    return retarget;
+  }
+
+  DexMethod forwardingMethod(EmulatedDispatchMethodDescriptor descriptor) {
     assert descriptor.getForwardingMethod().getHolderKind() == null;
     return descriptor.getForwardingMethod().getMethod();
   }
 
+  public DexMethod ensureForwardingMethod(
+      EmulatedDispatchMethodDescriptor descriptor,
+      DesugaredLibraryRetargeterInstructionEventConsumer eventConsumer) {
+    return ensureRetargetMethod(forwardingMethod(descriptor), eventConsumer);
+  }
+
   private DexMethod emulatedHolderDispatchMethod(DexType holder, DerivedMethod method) {
     assert method.getHolderKind() == SyntheticKind.RETARGET_CLASS;
     DexProto newProto = appView.dexItemFactory().prependHolderToProto(method.getMethod());
@@ -46,7 +81,7 @@
     return appView.dexItemFactory().createMethod(holder, method.getProto(), method.getName());
   }
 
-  public DexMethod getEmulatedInterfaceDispatchMethod(
+  public DexMethod emulatedInterfaceDispatchMethod(
       DexClass newInterface, EmulatedDispatchMethodDescriptor descriptor) {
     DexMethod method =
         emulatedInterfaceDispatchMethod(newInterface.type, descriptor.getInterfaceMethod());
@@ -83,7 +118,8 @@
                   SyntheticKind.RETARGET_CLASS,
                   context,
                   appView,
-                  classBuilder -> buildHolderDispatchMethod(classBuilder, itfClass, descriptor),
+                  classBuilder ->
+                      buildHolderDispatchMethod(classBuilder, itfClass, descriptor, eventConsumer),
                   eventConsumer::acceptDesugaredLibraryRetargeterDispatchClasspathClass);
     }
     DexMethod dispatchMethod =
@@ -107,7 +143,7 @@
             emulatedDispatchMethod.getHolderKind(),
             holderContext,
             appView,
-            classBuilder -> buildHolderDispatchMethod(classBuilder, itfClass, descriptor),
+            classBuilder -> buildHolderDispatchMethod(classBuilder, itfClass, descriptor, null),
             eventConsumer::acceptDesugaredLibraryRetargeterDispatchProgramClass);
   }
 
@@ -174,7 +210,10 @@
   }
 
   private <SCB extends SyntheticClassBuilder<?, ?>> void buildHolderDispatchMethod(
-      SCB classBuilder, DexClass itfClass, EmulatedDispatchMethodDescriptor descriptor) {
+      SCB classBuilder,
+      DexClass itfClass,
+      EmulatedDispatchMethodDescriptor descriptor,
+      DesugaredLibraryRetargeterInstructionEventConsumer eventConsumer) {
     classBuilder.addMethod(
         methodBuilder -> {
           DexMethod dispatchMethod =
@@ -189,15 +228,19 @@
               .setCode(
                   methodSig ->
                       appView.options().isDesugaredLibraryCompilation()
-                          ? generateEmulatedDispatchCfCode(descriptor, itfClass, methodSig)
+                          ? generateEmulatedDispatchCfCode(
+                              descriptor, itfClass, methodSig, eventConsumer)
                           : null);
         });
   }
 
   private CfCode generateEmulatedDispatchCfCode(
-      EmulatedDispatchMethodDescriptor descriptor, DexClass itfClass, DexMethod methodSig) {
-    DexMethod forwardingMethod = ensureForwardingMethod(descriptor);
-    DexMethod itfMethod = getEmulatedInterfaceDispatchMethod(itfClass, descriptor);
+      EmulatedDispatchMethodDescriptor descriptor,
+      DexClass itfClass,
+      DexMethod methodSig,
+      DesugaredLibraryRetargeterInstructionEventConsumer eventConsumer) {
+    DexMethod forwardingMethod = ensureForwardingMethod(descriptor, eventConsumer);
+    DexMethod itfMethod = emulatedInterfaceDispatchMethod(itfClass, descriptor);
     assert descriptor.getDispatchCases().isEmpty();
     return new EmulateDispatchSyntheticCfCodeProvider(
             methodSig.getHolderType(), forwardingMethod, itfMethod, new LinkedHashMap<>(), appView)
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/RetargetingInfo.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/RetargetingInfo.java
deleted file mode 100644
index 9e1f5e3..0000000
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/retargeter/RetargetingInfo.java
+++ /dev/null
@@ -1,213 +0,0 @@
-// Copyright (c) 2021, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.ir.desugar.desugaredlibrary.retargeter;
-
-import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.graph.DexClassAndMethod;
-import com.android.tools.r8.graph.DexItemFactory;
-import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.DexProto;
-import com.android.tools.r8.graph.DexString;
-import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification.LegacyDesugaredLibrarySpecification;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.DerivedMethod;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.EmulatedDispatchMethodDescriptor;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineRewritingFlags;
-import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
-import com.android.tools.r8.utils.WorkList;
-import com.google.common.collect.ImmutableMap;
-import java.util.ArrayList;
-import java.util.IdentityHashMap;
-import java.util.LinkedHashMap;
-import java.util.List;
-import java.util.Map;
-
-public class RetargetingInfo {
-
-  private final Map<DexMethod, DexMethod> staticRetarget;
-  private final Map<DexMethod, DexMethod> nonEmulatedVirtualRetarget;
-  private final Map<DexMethod, EmulatedDispatchMethodDescriptor> emulatedVirtualRetarget;
-
-  RetargetingInfo(
-      Map<DexMethod, DexMethod> staticRetarget,
-      Map<DexMethod, DexMethod> nonEmulatedVirtualRetarget,
-      Map<DexMethod, EmulatedDispatchMethodDescriptor> emulatedVirtualRetarget) {
-    this.staticRetarget = staticRetarget;
-    this.nonEmulatedVirtualRetarget = nonEmulatedVirtualRetarget;
-    this.emulatedVirtualRetarget = emulatedVirtualRetarget;
-  }
-
-  public static RetargetingInfo get(AppView<?> appView) {
-    if (appView.options().testing.machineDesugaredLibrarySpecification != null) {
-      MachineRewritingFlags rewritingFlags =
-          appView.options().testing.machineDesugaredLibrarySpecification.getRewritingFlags();
-      return new RetargetingInfo(
-          rewritingFlags.getStaticRetarget(),
-          rewritingFlags.getNonEmulatedVirtualRetarget(),
-          rewritingFlags.getEmulatedVirtualRetarget());
-    }
-    return new RetargetingInfoBuilder(appView).computeRetargetingInfo();
-  }
-
-  public Map<DexMethod, DexMethod> getStaticRetarget() {
-    return staticRetarget;
-  }
-
-  public Map<DexMethod, DexMethod> getNonEmulatedVirtualRetarget() {
-    return nonEmulatedVirtualRetarget;
-  }
-
-  public Map<DexMethod, EmulatedDispatchMethodDescriptor> getEmulatedVirtualRetarget() {
-    return emulatedVirtualRetarget;
-  }
-
-  private static class RetargetingInfoBuilder {
-
-    private final AppView<?> appView;
-    private final Map<DexMethod, DexMethod> staticRetarget = new IdentityHashMap<>();
-    private final Map<DexMethod, DexMethod> nonEmulatedVirtualRetarget = new IdentityHashMap<>();
-    private final Map<DexMethod, EmulatedDispatchMethodDescriptor> emulatedVirtualRetarget =
-        new IdentityHashMap<>();
-
-    public RetargetingInfoBuilder(AppView<?> appView) {
-      this.appView = appView;
-    }
-
-    private RetargetingInfo computeRetargetingInfo() {
-      LegacyDesugaredLibrarySpecification desugaredLibrarySpecification =
-          appView.options().desugaredLibrarySpecification;
-      Map<DexString, Map<DexType, DexType>> retargetCoreLibMember =
-          desugaredLibrarySpecification.getRetargetCoreLibMember();
-      if (retargetCoreLibMember.isEmpty()) {
-        return new RetargetingInfo(ImmutableMap.of(), ImmutableMap.of(), ImmutableMap.of());
-      }
-      for (DexString methodName : retargetCoreLibMember.keySet()) {
-        for (DexType inType : retargetCoreLibMember.get(methodName).keySet()) {
-          DexClass typeClass = appView.definitionFor(inType);
-          if (typeClass != null) {
-            DexType newHolder = retargetCoreLibMember.get(methodName).get(inType);
-            List<DexClassAndMethod> found = findMethodsWithName(methodName, typeClass);
-            for (DexClassAndMethod method : found) {
-              DexMethod methodReference = method.getReference();
-              if (method.getAccessFlags().isStatic()) {
-                staticRetarget.put(
-                    methodReference,
-                    computeRetargetMethod(
-                        methodReference, method.getAccessFlags().isStatic(), newHolder));
-                continue;
-              }
-              if (isEmulatedInterfaceDispatch(method)) {
-                continue;
-              }
-              if (typeClass.isFinal() || method.getAccessFlags().isFinal()) {
-                nonEmulatedVirtualRetarget.put(
-                    methodReference,
-                    computeRetargetMethod(
-                        methodReference, method.getAccessFlags().isStatic(), newHolder));
-              } else {
-                // Virtual rewrites require emulated dispatch for inheritance.
-                // The call is rewritten to the dispatch holder class instead.
-                DexProto newProto = appView.dexItemFactory().prependHolderToProto(methodReference);
-                DexMethod forwardingDexMethod =
-                    appView.dexItemFactory().createMethod(newHolder, newProto, methodName);
-                DerivedMethod forwardingMethod = new DerivedMethod(forwardingDexMethod);
-                DerivedMethod interfaceMethod =
-                    new DerivedMethod(methodReference, SyntheticKind.RETARGET_INTERFACE);
-                DerivedMethod dispatchMethod =
-                    new DerivedMethod(methodReference, SyntheticKind.RETARGET_CLASS);
-                emulatedVirtualRetarget.put(
-                    methodReference,
-                    new EmulatedDispatchMethodDescriptor(
-                        interfaceMethod, dispatchMethod, forwardingMethod, new LinkedHashMap<>()));
-              }
-            }
-          }
-        }
-      }
-      if (desugaredLibrarySpecification.isLibraryCompilation()) {
-        // TODO(b/177977763): This is only a workaround rewriting invokes of j.u.Arrays.deepEquals0
-        // to j.u.DesugarArrays.deepEquals0.
-        DexItemFactory itemFactory = appView.options().dexItemFactory();
-        DexString name = itemFactory.createString("deepEquals0");
-        DexProto proto =
-            itemFactory.createProto(
-                itemFactory.booleanType, itemFactory.objectType, itemFactory.objectType);
-        DexMethod source =
-            itemFactory.createMethod(
-                itemFactory.createType(itemFactory.arraysDescriptor), proto, name);
-        DexMethod target =
-            computeRetargetMethod(
-                source, true, itemFactory.createType("Ljava/util/DesugarArrays;"));
-        staticRetarget.put(source, target);
-        // TODO(b/181629049): This is only a workaround rewriting invokes of
-        //  j.u.TimeZone.getTimeZone taking a java.time.ZoneId.
-        name = itemFactory.createString("getTimeZone");
-        proto =
-            itemFactory.createProto(
-                itemFactory.createType("Ljava/util/TimeZone;"),
-                itemFactory.createType("Ljava/time/ZoneId;"));
-        source =
-            itemFactory.createMethod(itemFactory.createType("Ljava/util/TimeZone;"), proto, name);
-        target =
-            computeRetargetMethod(
-                source, true, itemFactory.createType("Ljava/util/DesugarTimeZone;"));
-        staticRetarget.put(source, target);
-      }
-      return new RetargetingInfo(
-          ImmutableMap.copyOf(staticRetarget),
-          ImmutableMap.copyOf(nonEmulatedVirtualRetarget),
-          emulatedVirtualRetarget);
-    }
-
-    DexMethod computeRetargetMethod(DexMethod method, boolean isStatic, DexType newHolder) {
-      DexItemFactory factory = appView.dexItemFactory();
-      DexProto newProto = isStatic ? method.getProto() : factory.prependHolderToProto(method);
-      return factory.createMethod(newHolder, newProto, method.getName());
-    }
-
-    private boolean isEmulatedInterfaceDispatch(DexClassAndMethod method) {
-      // Answers true if this method is already managed through emulated interface dispatch.
-      Map<DexType, DexType> emulateLibraryInterface =
-          appView.options().desugaredLibrarySpecification.getEmulateLibraryInterface();
-      if (emulateLibraryInterface.isEmpty()) {
-        return false;
-      }
-      DexMethod methodToFind = method.getReference();
-      // Look-up all superclass and interfaces, if an emulated interface is found, and it implements
-      // the method, answers true.
-      WorkList<DexClass> worklist = WorkList.newIdentityWorkList(method.getHolder());
-      while (worklist.hasNext()) {
-        DexClass clazz = worklist.next();
-        if (clazz.isInterface()
-            && emulateLibraryInterface.containsKey(clazz.getType())
-            && clazz.lookupMethod(methodToFind) != null) {
-          return true;
-        }
-        // All super types are library class, or we are doing L8 compilation.
-        clazz.forEachImmediateSupertype(
-            superType -> {
-              DexClass superClass = appView.definitionFor(superType);
-              if (superClass != null) {
-                worklist.addIfNotSeen(superClass);
-              }
-            });
-      }
-      return false;
-    }
-
-    private List<DexClassAndMethod> findMethodsWithName(DexString methodName, DexClass clazz) {
-      List<DexClassAndMethod> found = new ArrayList<>();
-      clazz.forEachClassMethodMatching(
-          definition -> definition.getName() == methodName, found::add);
-      assert !found.isEmpty()
-          : "Should have found a method (library specifications) for "
-              + clazz.toSourceString()
-              + "."
-              + methodName
-              + ". Maybe the library used for the compilation should be newer.";
-      return found;
-    }
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineEmulatedInterfaceConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineEmulatedInterfaceConverter.java
index 2411ba0..4be8ef0 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineEmulatedInterfaceConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineEmulatedInterfaceConverter.java
@@ -8,8 +8,8 @@
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.DexProto;
+import com.android.tools.r8.graph.DexReference;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.humanspecification.HumanRewritingFlags;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.DerivedMethod;
@@ -26,11 +26,13 @@
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
+import java.util.function.BiConsumer;
 
 public class HumanToMachineEmulatedInterfaceConverter {
 
   private final AppInfoWithClassHierarchy appInfo;
-  private Map<DexType, List<DexType>> emulatedInterfaceHierarchy;
+  private final Map<DexType, List<DexType>> emulatedInterfaceHierarchy = new IdentityHashMap<>();
+  private final Set<DexType> missingEmulatedInterface = Sets.newIdentityHashSet();
 
   public HumanToMachineEmulatedInterfaceConverter(AppInfoWithClassHierarchy appInfo) {
     this.appInfo = appInfo;
@@ -39,15 +41,19 @@
   public void convertEmulatedInterfaces(
       HumanRewritingFlags rewritingFlags,
       AppInfoWithClassHierarchy appInfo,
-      MachineRewritingFlags.Builder builder) {
+      MachineRewritingFlags.Builder builder,
+      BiConsumer<String, Set<? extends DexReference>> warnConsumer) {
     Map<DexType, DexType> emulateInterfaces = rewritingFlags.getEmulateLibraryInterface();
     Set<DexMethod> dontRewriteInvocation = rewritingFlags.getDontRewriteInvocation();
-    emulatedInterfaceHierarchy = processEmulatedInterfaceHierarchy(appInfo, emulateInterfaces);
+    processEmulatedInterfaceHierarchy(appInfo, emulateInterfaces);
     for (DexType itf : emulateInterfaces.keySet()) {
-      DexProgramClass itfClass = appInfo.contextIndependentDefinitionFor(itf).asProgramClass();
-      assert itfClass != null;
+      DexClass itfClass = appInfo.contextIndependentDefinitionFor(itf);
+      if (itfClass == null) {
+        missingEmulatedInterface.add(itf);
+        continue;
+      }
       Map<DexMethod, EmulatedDispatchMethodDescriptor> emulatedMethods = new IdentityHashMap<>();
-      itfClass.forEachProgramVirtualMethodMatching(
+      itfClass.forEachClassMethodMatching(
           m -> m.isDefaultMethod() && !dontRewriteInvocation.contains(m.getReference()),
           method ->
               emulatedMethods.put(
@@ -57,6 +63,7 @@
       builder.putEmulatedInterface(
           itf, new EmulatedInterfaceDescriptor(emulateInterfaces.get(itf), emulatedMethods));
     }
+    warnConsumer.accept("Missing emulated interfaces: ", missingEmulatedInterface);
   }
 
   private EmulatedDispatchMethodDescriptor computeEmulatedDispatchDescriptor(
@@ -104,7 +111,6 @@
       for (int i = subInterfaces.size() - 1; i >= 0; i--) {
         DexClass subInterfaceClass = appInfo.definitionFor(subInterfaces.get(i));
         assert subInterfaceClass != null;
-        assert subInterfaceClass.isProgramClass();
         // Else computation of subInterface would have failed.
         // if the method is implemented, extra dispatch is required.
         DexEncodedMethod result = subInterfaceClass.lookupVirtualMethod(method);
@@ -137,29 +143,25 @@
     return false;
   }
 
-  private Map<DexType, List<DexType>> processEmulatedInterfaceHierarchy(
+  private void processEmulatedInterfaceHierarchy(
       AppInfoWithClassHierarchy appInfo, Map<DexType, DexType> emulateInterfaces) {
-    Map<DexType, List<DexType>> emulatedInterfacesHierarchy = new IdentityHashMap<>();
     Set<DexType> processed = Sets.newIdentityHashSet();
     ArrayList<DexType> emulatedInterfacesSorted = new ArrayList<>(emulateInterfaces.keySet());
     emulatedInterfacesSorted.sort(DexType::compareTo);
     for (DexType interfaceType : emulatedInterfacesSorted) {
-      processEmulatedInterfaceHierarchy(
-          appInfo, emulateInterfaces, interfaceType, processed, emulatedInterfacesHierarchy);
+      processEmulatedInterfaceHierarchy(appInfo, emulateInterfaces, interfaceType, processed);
     }
-    return emulatedInterfacesHierarchy;
   }
 
   private void processEmulatedInterfaceHierarchy(
       AppInfoWithClassHierarchy appInfo,
       Map<DexType, DexType> emulateInterfaces,
       DexType interfaceType,
-      Set<DexType> processed,
-      Map<DexType, List<DexType>> emulatedInterfacesHierarchy) {
+      Set<DexType> processed) {
     if (processed.contains(interfaceType)) {
       return;
     }
-    emulatedInterfacesHierarchy.put(interfaceType, new ArrayList<>());
+    emulatedInterfaceHierarchy.put(interfaceType, new ArrayList<>());
     processed.add(interfaceType);
     DexClass theInterface = appInfo.definitionFor(interfaceType);
     if (theInterface == null) {
@@ -170,9 +172,8 @@
     while (!workList.isEmpty()) {
       DexType next = workList.next();
       if (emulateInterfaces.containsKey(next)) {
-        processEmulatedInterfaceHierarchy(
-            appInfo, emulateInterfaces, next, processed, emulatedInterfacesHierarchy);
-        emulatedInterfacesHierarchy.get(next).add(interfaceType);
+        processEmulatedInterfaceHierarchy(appInfo, emulateInterfaces, next, processed);
+        emulatedInterfaceHierarchy.get(next).add(interfaceType);
         DexClass nextClass = appInfo.definitionFor(next);
         if (nextClass != null) {
           workList.addIfNotSeen(nextClass.interfaces.values);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachinePrefixConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachinePrefixConverter.java
index 6ff7428..5704f3d 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachinePrefixConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachinePrefixConverter.java
@@ -5,44 +5,71 @@
 package com.android.tools.r8.ir.desugar.desugaredlibrary.specificationconversion;
 
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
+import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.humanspecification.HumanRewritingFlags;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineRewritingFlags;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Sets;
+import java.util.IdentityHashMap;
 import java.util.Map;
+import java.util.Set;
+import java.util.function.BiConsumer;
 
 public class HumanToMachinePrefixConverter {
 
   private final AppInfoWithClassHierarchy appInfo;
+  private final MachineRewritingFlags.Builder builder;
+  private final String synthesizedPrefix;
+  private final Map<DexString, DexString> descriptorPrefix;
+  private final Map<DexType, DexType> reverse = new IdentityHashMap<>();
+  private final Set<DexString> usedPrefix = Sets.newIdentityHashSet();
 
-  public HumanToMachinePrefixConverter(AppInfoWithClassHierarchy appInfo) {
+  public HumanToMachinePrefixConverter(
+      AppInfoWithClassHierarchy appInfo,
+      MachineRewritingFlags.Builder builder,
+      String synthesizedPrefix,
+      Map<String, String> descriptorPrefix) {
     this.appInfo = appInfo;
-  }
-
-  private DexString toDescriptorPrefix(String prefix) {
-    return appInfo
-        .dexItemFactory()
-        .createString("L" + DescriptorUtils.getBinaryNameFromJavaType(prefix));
+    this.builder = builder;
+    this.synthesizedPrefix = synthesizedPrefix;
+    this.descriptorPrefix = convertRewritePrefix(descriptorPrefix);
   }
 
   public void convertPrefixFlags(
-      HumanRewritingFlags rewritingFlags,
-      MachineRewritingFlags.Builder builder,
-      String synthesizedPrefix) {
-    Map<DexString, DexString> descriptorPrefix = convertRewritePrefix(rewritingFlags);
-    rewriteClasses(descriptorPrefix, builder);
-    rewriteValues(descriptorPrefix, builder, rewritingFlags.getRetargetCoreLibMember());
-    rewriteValues(descriptorPrefix, builder, rewritingFlags.getCustomConversions());
-    rewriteEmulatedInterface(builder, rewritingFlags.getEmulateLibraryInterface());
-    rewriteRetargetKeys(builder, rewritingFlags.getRetargetCoreLibMember(), synthesizedPrefix);
+      HumanRewritingFlags rewritingFlags, BiConsumer<String, Set<DexString>> warnConsumer) {
+    rewriteClasses();
+    rewriteValues(rewritingFlags.getRetargetCoreLibMember());
+    rewriteValues(rewritingFlags.getCustomConversions());
+    rewriteEmulatedInterface(rewritingFlags.getEmulateLibraryInterface());
+    rewriteRetargetKeys(rewritingFlags.getRetargetCoreLibMember());
+    rewriteReverse();
+    warnIfUnusedPrefix(warnConsumer);
   }
 
-  public DexType convertJavaNameToDesugaredLibrary(DexType type, String prefix) {
-    String convertedPrefix = DescriptorUtils.getJavaTypeFromBinaryName(prefix);
+  private void warnIfUnusedPrefix(BiConsumer<String, Set<DexString>> warnConsumer) {
+    Set<DexString> prefixes = Sets.newIdentityHashSet();
+    prefixes.addAll(descriptorPrefix.keySet());
+    prefixes.removeAll(usedPrefix);
+    warnConsumer.accept("The following prefixes do not match any type: ", prefixes);
+  }
+
+  // For custom conversions, this is responsible in rewriting backward.
+  private void rewriteReverse() {
+    reverse.forEach(
+        (rewrittenType, type) -> {
+          DexType chainType = rewrittenType(rewrittenType);
+          if (chainType != null) {
+            builder.rewriteType(rewrittenType, chainType);
+          }
+        });
+  }
+
+  public DexType convertJavaNameToDesugaredLibrary(DexType type) {
+    String convertedPrefix = DescriptorUtils.getJavaTypeFromBinaryName(synthesizedPrefix);
     String interfaceType = type.toString();
     int firstPackage = interfaceType.indexOf('.');
     return appInfo
@@ -52,49 +79,65 @@
                 convertedPrefix + interfaceType.substring(firstPackage + 1)));
   }
 
-  private void rewriteRetargetKeys(
-      MachineRewritingFlags.Builder builder, Map<DexMethod, DexType> retarget, String prefix) {
+  private void rewriteRetargetKeys(Map<DexMethod, DexType> retarget) {
     for (DexMethod dexMethod : retarget.keySet()) {
-      DexType type = convertJavaNameToDesugaredLibrary(dexMethod.holder, prefix);
+      DexType type = convertJavaNameToDesugaredLibrary(dexMethod.holder);
       builder.rewriteDerivedTypeOnly(dexMethod.holder, type);
     }
   }
 
-  private void rewriteEmulatedInterface(
-      MachineRewritingFlags.Builder builder, Map<DexType, DexType> emulateLibraryInterface) {
+  private void rewriteEmulatedInterface(Map<DexType, DexType> emulateLibraryInterface) {
     emulateLibraryInterface.forEach(builder::rewriteDerivedTypeOnly);
   }
 
+  private void rewriteType(DexType type, DexType rewrittenType) {
+    builder.rewriteType(type, rewrittenType);
+    reverse.put(rewrittenType, type);
+  }
+
   private void rewriteValues(
-      Map<DexString, DexString> descriptorPrefix,
-      MachineRewritingFlags.Builder builder,
       Map<?, DexType> flags) {
     for (DexType type : flags.values()) {
-      DexType rewrittenType = rewrittenType(descriptorPrefix, type);
-      if (rewrittenType != null) {
-        builder.rewriteType(type, rewrittenType);
-      }
+      registerType(type);
     }
   }
 
-  private void rewriteClasses(
-      Map<DexString, DexString> descriptorPrefix, MachineRewritingFlags.Builder builder) {
-    for (DexProgramClass clazz : appInfo.classes()) {
-      DexType type = clazz.type;
-      DexType rewrittenType = rewrittenType(descriptorPrefix, type);
-      if (rewrittenType != null) {
-        builder.rewriteType(type, rewrittenType);
-      }
+  private void rewriteClasses() {
+    for (DexClass clazz : appInfo.app().asDirect().libraryClasses()) {
+      rewriteClass(clazz);
+    }
+    for (DexClass clazz : appInfo.classes()) {
+      rewriteClass(clazz);
     }
   }
 
-  private DexType rewrittenType(Map<DexString, DexString> descriptorPrefix, DexType type) {
+  private void rewriteClass(DexClass clazz) {
+    registerType(clazz.type);
+    // We allow missing referenced types for the work-in-progress desugaring.
+    if (clazz.superType != null) {
+      registerType(clazz.superType);
+    }
+    clazz.interfaces.forEach(this::registerType);
+    if (clazz.getInnerClasses() != null) {
+      clazz.getInnerClasses().forEach(attr -> attr.forEachType(this::registerType));
+    }
+  }
+
+  private void registerType(DexType type) {
+    DexType rewrittenType = rewrittenType(type);
+    if (rewrittenType != null) {
+      rewriteType(type, rewrittenType);
+    }
+  }
+
+  private DexType rewrittenType(DexType type) {
     DexString prefixToMatch = type.descriptor.withoutArray(appInfo.dexItemFactory());
     for (DexString prefix : descriptorPrefix.keySet()) {
       if (prefixToMatch.startsWith(prefix)) {
         DexString rewrittenTypeDescriptor =
             type.descriptor.withNewPrefix(
                 prefix, descriptorPrefix.get(prefix), appInfo.dexItemFactory());
+        usedPrefix.add(prefix);
         return appInfo.dexItemFactory().createType(rewrittenTypeDescriptor);
       }
     }
@@ -102,12 +145,17 @@
   }
 
   private ImmutableMap<DexString, DexString> convertRewritePrefix(
-      HumanRewritingFlags rewritingFlags) {
-    Map<String, String> rewritePrefix = rewritingFlags.getRewritePrefix();
+      Map<String, String> rewritePrefix) {
     ImmutableMap.Builder<DexString, DexString> mapBuilder = ImmutableMap.builder();
     for (String key : rewritePrefix.keySet()) {
       mapBuilder.put(toDescriptorPrefix(key), toDescriptorPrefix(rewritePrefix.get(key)));
     }
     return mapBuilder.build();
   }
+
+  private DexString toDescriptorPrefix(String prefix) {
+    return appInfo
+        .dexItemFactory()
+        .createString("L" + DescriptorUtils.getBinaryNameFromJavaType(prefix));
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineRetargetConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineRetargetConverter.java
index 6dce945..e153c70 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineRetargetConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineRetargetConverter.java
@@ -9,6 +9,7 @@
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexProto;
+import com.android.tools.r8.graph.DexReference;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.MethodResolutionResult;
 import com.android.tools.r8.graph.SubtypingInfo;
@@ -18,27 +19,33 @@
 import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineRewritingFlags;
 import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
 import com.android.tools.r8.utils.TraversalContinuation;
+import com.google.common.collect.Sets;
 import java.util.LinkedHashMap;
 import java.util.Map;
+import java.util.Set;
 import java.util.function.BiConsumer;
 
 public class HumanToMachineRetargetConverter {
 
   private final AppInfoWithClassHierarchy appInfo;
-  private SubtypingInfo subtypingInfo;
+  private final SubtypingInfo subtypingInfo;
+  private final Set<DexMethod> missingMethods = Sets.newIdentityHashSet();
 
   public HumanToMachineRetargetConverter(AppInfoWithClassHierarchy appInfo) {
     this.appInfo = appInfo;
+    subtypingInfo = SubtypingInfo.create(appInfo);
   }
 
   public void convertRetargetFlags(
-      HumanRewritingFlags rewritingFlags, MachineRewritingFlags.Builder builder) {
-    subtypingInfo = SubtypingInfo.create(appInfo);
+      HumanRewritingFlags rewritingFlags,
+      MachineRewritingFlags.Builder builder,
+      BiConsumer<String, Set<? extends DexReference>> warnConsumer) {
     rewritingFlags
         .getRetargetCoreLibMember()
         .forEach(
             (method, type) ->
                 convertRetargetCoreLibMemberFlag(builder, rewritingFlags, method, type));
+    warnConsumer.accept("Cannot retarget missing methods: ", missingMethods);
   }
 
   private void convertRetargetCoreLibMemberFlag(
@@ -48,7 +55,16 @@
       DexType type) {
     DexClass holder = appInfo.definitionFor(method.holder);
     DexEncodedMethod foundMethod = holder.lookupMethod(method);
-    assert foundMethod != null;
+    if (foundMethod == null && method.getName().toString().equals("deepEquals0")) {
+      // TODO(b/184026720): Temporary work-around (the method is missing).
+      DexMethod dest = method.withHolder(type, appInfo.dexItemFactory());
+      builder.putStaticRetarget(method, dest);
+      return;
+    }
+    if (foundMethod == null) {
+      missingMethods.add(foundMethod.getReference());
+      return;
+    }
     if (foundMethod.isStatic()) {
       convertStaticRetarget(builder, foundMethod, type);
       return;
@@ -65,14 +81,16 @@
       HumanRewritingFlags rewritingFlags,
       DexEncodedMethod src,
       DexType type) {
-    if (isEmulatedInterfaceDispatch(src, appInfo, rewritingFlags)) {
-      // Handled by emulated interface dispatch.
-      return;
-    }
-    // TODO(b/184026720): Implement library boundaries.
     DexProto newProto = appInfo.dexItemFactory().prependHolderToProto(src.getReference());
     DexMethod forwardingDexMethod =
         appInfo.dexItemFactory().createMethod(type, newProto, src.getName());
+    if (isEmulatedInterfaceDispatch(src, appInfo, rewritingFlags)) {
+      // Handled by emulated interface dispatch.
+      builder.putEmulatedVirtualRetargetThroughEmulatedInterface(
+          src.getReference(), forwardingDexMethod);
+      return;
+    }
+    // TODO(b/184026720): Implement library boundaries.
     DerivedMethod forwardingMethod = new DerivedMethod(forwardingDexMethod);
     DerivedMethod interfaceMethod =
         new DerivedMethod(src.getReference(), SyntheticKind.RETARGET_INTERFACE);
@@ -92,10 +110,14 @@
       DexClass subclass = appInfo.definitionFor(subtype);
       MethodResolutionResult resolutionResult =
           appInfo.resolveMethodOn(subclass, src.getReference());
-      if (resolutionResult.isSuccessfulMemberResolutionResult()
-          && resolutionResult.getResolvedMethod().getReference() != src.getReference()) {
-        assert false; // Unsupported.
-      }
+      // The resolution is not successful when compiling to dex if the method rewritten is missing
+      // in Android.jar.
+      assert !resolutionResult.isSuccessfulMemberResolutionResult()
+          || resolutionResult.getResolvedMethod().getReference() == src.getReference()
+          // There is a difference in the sql library between Android.jar and the JDK which leads
+          // to this resolution when compiling Cf to Cf while the methods do not exist in Android.
+          || (resolutionResult.getResolvedMethod().getHolderType().toString().contains("java.sql")
+              && resolutionResult.getResolvedMethod().getName().toString().equals("toInstant"));
     }
     return true;
   }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineSpecificationConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineSpecificationConverter.java
index bc3a663..c668858 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineSpecificationConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineSpecificationConverter.java
@@ -4,15 +4,22 @@
 
 package com.android.tools.r8.ir.desugar.desugaredlibrary.specificationconversion;
 
+import com.android.tools.r8.ClassFileResourceProvider;
+import com.android.tools.r8.ProgramResourceProvider;
 import com.android.tools.r8.dex.ApplicationReader;
 import com.android.tools.r8.graph.AppInfo;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexApplication;
+import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexProto;
+import com.android.tools.r8.graph.DexReference;
+import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.humanspecification.HumanDesugaredLibrarySpecification;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.humanspecification.HumanRewritingFlags;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.humanspecification.HumanTopLevelFlags;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.CustomConversionDescriptor;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineDesugaredLibrarySpecification;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineRewritingFlags;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineTopLevelFlags;
@@ -22,20 +29,58 @@
 import com.android.tools.r8.utils.Timing;
 import java.io.IOException;
 import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.Set;
 import java.util.concurrent.ExecutorService;
 
 public class HumanToMachineSpecificationConverter {
 
+  private AppView<?> appView;
+
   public MachineDesugaredLibrarySpecification convert(
-      HumanDesugaredLibrarySpecification humanSpec, Path androidLib, InternalOptions options)
+      HumanDesugaredLibrarySpecification humanSpec,
+      List<ProgramResourceProvider> desugaredJDKLib,
+      List<ClassFileResourceProvider> library,
+      InternalOptions options)
       throws IOException {
-    DexApplication app = readApp(androidLib, options);
-    AppView<?> appView = AppView.createForD8(AppInfo.createInitialAppInfo(app));
+    assert !humanSpec.isLibraryCompilation() || desugaredJDKLib != null;
+    AndroidApp.Builder builder = AndroidApp.builder();
+    for (ClassFileResourceProvider classFileResourceProvider : library) {
+      builder.addLibraryResourceProvider(classFileResourceProvider);
+    }
+    if (humanSpec.isLibraryCompilation()) {
+      for (ProgramResourceProvider programResourceProvider : desugaredJDKLib) {
+        builder.addProgramResourceProvider(programResourceProvider);
+      }
+    }
+    return internalConvert(humanSpec, builder.build(), options);
+  }
+
+  public MachineDesugaredLibrarySpecification convert(
+      HumanDesugaredLibrarySpecification humanSpec,
+      Path desugaredJDKLib,
+      Path androidLib,
+      InternalOptions options)
+      throws IOException {
+    assert !humanSpec.isLibraryCompilation() || desugaredJDKLib != null;
+    AndroidApp.Builder builder = AndroidApp.builder();
+    if (humanSpec.isLibraryCompilation()) {
+      builder.addProgramFile(desugaredJDKLib);
+    }
+    AndroidApp inputApp = builder.addLibraryFile(androidLib).build();
+    return internalConvert(humanSpec, inputApp, options);
+  }
+
+  private MachineDesugaredLibrarySpecification internalConvert(
+      HumanDesugaredLibrarySpecification humanSpec, AndroidApp inputApp, InternalOptions options)
+      throws IOException {
+    DexApplication app = readApp(inputApp, options);
+    appView = AppView.createForD8(AppInfo.createInitialAppInfo(app));
+    LibraryValidator.validate(app, humanSpec.getTopLevelFlags().getRequiredCompilationAPILevel());
     MachineRewritingFlags machineRewritingFlags =
         convertRewritingFlags(
-            humanSpec.getSynthesizedLibraryClassesPackagePrefix(),
-            humanSpec.getRewritingFlags(),
-            appView.appInfoForDesugaring());
+            humanSpec.getSynthesizedLibraryClassesPackagePrefix(), humanSpec.getRewritingFlags());
     MachineTopLevelFlags topLevelFlags = convertTopLevelFlags(humanSpec.getTopLevelFlags());
     return new MachineDesugaredLibrarySpecification(
         humanSpec.isLibraryCompilation(), topLevelFlags, machineRewritingFlags);
@@ -52,34 +97,69 @@
   }
 
   private MachineRewritingFlags convertRewritingFlags(
-      String synthesizedPrefix,
-      HumanRewritingFlags rewritingFlags,
-      AppInfoWithClassHierarchy appInfo) {
+      String synthesizedPrefix, HumanRewritingFlags rewritingFlags) {
+    AppInfoWithClassHierarchy appInfo = appView.appInfoForDesugaring();
     MachineRewritingFlags.Builder builder = MachineRewritingFlags.builder();
-    new HumanToMachineRetargetConverter(appInfo).convertRetargetFlags(rewritingFlags, builder);
+    new HumanToMachineRetargetConverter(appInfo)
+        .convertRetargetFlags(rewritingFlags, builder, this::warnMissingReferences);
     new HumanToMachineEmulatedInterfaceConverter(appInfo)
-        .convertEmulatedInterfaces(rewritingFlags, appInfo, builder);
-    new HumanToMachinePrefixConverter(appInfo)
-        .convertPrefixFlags(rewritingFlags, builder, synthesizedPrefix);
-    new HumanToMachineWrapperConverter(appInfo).convertWrappers(rewritingFlags, builder);
+        .convertEmulatedInterfaces(rewritingFlags, appInfo, builder, this::warnMissingReferences);
+    new HumanToMachinePrefixConverter(
+            appInfo, builder, synthesizedPrefix, rewritingFlags.getRewritePrefix())
+        .convertPrefixFlags(rewritingFlags, this::warnMissingDexString);
+    new HumanToMachineWrapperConverter(appInfo)
+        .convertWrappers(rewritingFlags, builder, this::warnMissingReferences);
     rewritingFlags
         .getCustomConversions()
         .forEach(
             (type, conversionType) ->
-                builder.putCustomConversion(
-                    type, conversionType, appInfo.dexItemFactory().convertMethodName));
-    for (DexType type : rewritingFlags.getDontRetargetLibMember()) {
-      builder.addDontRetarget(type);
-    }
+                convertCustomConversion(appInfo, builder, type, conversionType));
+    rewritingFlags.getDontRetargetLibMember().forEach(builder::addDontRetarget);
     rewritingFlags.getBackportCoreLibraryMember().forEach(builder::putLegacyBackport);
     return builder.build();
   }
 
-  private DexApplication readApp(Path androidLib, InternalOptions options) throws IOException {
-    AndroidApp androidApp = AndroidApp.builder().addProgramFile(androidLib).build();
-    ApplicationReader applicationReader =
-        new ApplicationReader(androidApp, options, Timing.empty());
+  private void convertCustomConversion(
+      AppInfoWithClassHierarchy appInfo,
+      MachineRewritingFlags.Builder builder,
+      DexType type,
+      DexType conversionType) {
+    DexType rewrittenType = builder.getRewrittenType(type);
+    DexProto fromProto = appInfo.dexItemFactory().createProto(rewrittenType, type);
+    DexMethod fromMethod =
+        appInfo
+            .dexItemFactory()
+            .createMethod(conversionType, fromProto, appInfo.dexItemFactory().convertMethodName);
+    DexProto toProto = appInfo.dexItemFactory().createProto(type, rewrittenType);
+    DexMethod toMethod =
+        appInfo
+            .dexItemFactory()
+            .createMethod(conversionType, toProto, appInfo.dexItemFactory().convertMethodName);
+    builder.putCustomConversion(type, new CustomConversionDescriptor(toMethod, fromMethod));
+  }
+
+  private DexApplication readApp(AndroidApp inputApp, InternalOptions options) throws IOException {
+    ApplicationReader applicationReader = new ApplicationReader(inputApp, options, Timing.empty());
     ExecutorService executorService = ThreadUtils.getExecutorService(options);
     return applicationReader.read(executorService).toDirect();
   }
+
+  void warnMissingReferences(String message, Set<? extends DexReference> missingReferences) {
+    List<DexReference> memberList = new ArrayList<>(missingReferences);
+    memberList.sort(DexReference::compareTo);
+    warn(message, memberList);
+  }
+
+  void warnMissingDexString(String message, Set<DexString> missingDexString) {
+    List<DexString> memberList = new ArrayList<>(missingDexString);
+    memberList.sort(DexString::compareTo);
+    warn(message, memberList);
+  }
+
+  private void warn(String message, List<?> memberList) {
+    if (memberList.isEmpty()) {
+      return;
+    }
+    appView.options().reporter.warning("Specification conversion: " + message + memberList);
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineWrapperConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineWrapperConverter.java
index db87890..815cb45 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineWrapperConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/HumanToMachineWrapperConverter.java
@@ -8,30 +8,47 @@
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexMethod;
+import com.android.tools.r8.graph.DexReference;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.humanspecification.HumanRewritingFlags;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineRewritingFlags;
+import com.google.common.collect.ImmutableList;
+import com.google.common.collect.Sets;
 import java.util.ArrayList;
 import java.util.LinkedList;
 import java.util.List;
+import java.util.Set;
+import java.util.function.BiConsumer;
 
 public class HumanToMachineWrapperConverter {
 
   private final AppInfoWithClassHierarchy appInfo;
+  private final Set<DexType> missingClasses = Sets.newIdentityHashSet();
 
   public HumanToMachineWrapperConverter(AppInfoWithClassHierarchy appInfo) {
     this.appInfo = appInfo;
   }
 
   public void convertWrappers(
-      HumanRewritingFlags rewritingFlags, MachineRewritingFlags.Builder builder) {
-    for (DexType wrapperConversion : rewritingFlags.getWrapperConversions()) {
-      DexClass wrapperClass = appInfo.definitionFor(wrapperConversion);
-      assert wrapperClass != null;
-      List<DexMethod> methods = allImplementedMethods(wrapperClass);
-      methods.sort(DexMethod::compareTo);
-      builder.addWrapper(wrapperConversion, methods);
+      HumanRewritingFlags rewritingFlags,
+      MachineRewritingFlags.Builder builder,
+      BiConsumer<String, Set<? extends DexReference>> warnConsumer) {
+    for (DexType wrapperType : rewritingFlags.getWrapperConversions()) {
+      DexClass wrapperClass = appInfo.definitionFor(wrapperType);
+      if (wrapperClass == null) {
+        missingClasses.add(wrapperType);
+        continue;
+      }
+      List<DexMethod> methods;
+      if (wrapperClass.isEnum()) {
+        methods = ImmutableList.of();
+      } else {
+        methods = allImplementedMethods(wrapperClass);
+        methods.sort(DexMethod::compareTo);
+      }
+      builder.addWrapper(wrapperType, methods);
     }
+    warnConsumer.accept("The following types to wrap are missing: ", missingClasses);
   }
 
   private List<DexMethod> allImplementedMethods(DexClass wrapperClass) {
@@ -53,7 +70,8 @@
             }
           }
           if (!alreadyAdded) {
-            assert !virtualMethod.isFinal() : "Cannot wrap final method " + virtualMethod;
+            assert !virtualMethod.isFinal()
+                : "Cannot wrap final method " + virtualMethod + " while wrapping " + wrapperClass;
             implementedMethods.add(virtualMethod.getReference());
           }
         }
@@ -66,7 +84,8 @@
       }
       if (dexClass.superType != appInfo.dexItemFactory().objectType) {
         DexClass superClass = appInfo.definitionFor(dexClass.superType);
-        assert superClass != null; // Cannot be null since we started from a LibraryClass.
+        assert superClass != null
+            : "Missing supertype " + dexClass.superType + " while wrapping " + wrapperClass;
         workList.add(superClass);
       }
     }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/LegacyToHumanSpecificationConverter.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/LegacyToHumanSpecificationConverter.java
index 34bf5fa..c4884a5 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/LegacyToHumanSpecificationConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/LegacyToHumanSpecificationConverter.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.ir.desugar.desugaredlibrary.specificationconversion;
 
+import com.android.tools.r8.ClassFileResourceProvider;
 import com.android.tools.r8.StringConsumer;
 import com.android.tools.r8.StringResource;
 import com.android.tools.r8.dex.ApplicationReader;
@@ -44,6 +45,8 @@
 
 public class LegacyToHumanSpecificationConverter {
 
+  private AndroidApiLevel legacyHackLevel = AndroidApiLevel.N_MR1;
+
   public void convertAllAPILevels(
       StringResource inputSpecification, Path androidLib, StringConsumer output)
       throws IOException {
@@ -65,7 +68,9 @@
       InternalOptions options)
       throws IOException {
     Origin origin = legacySpec.getOrigin();
-    DexApplication app = readApp(androidLib, options);
+    AndroidApp androidApp = AndroidApp.builder().addLibraryFile(androidLib).build();
+    DexApplication app = readApp(androidApp, options);
+    LibraryValidator.validate(app, legacySpec.getTopLevelFlags().getRequiredCompilationAPILevel());
     HumanTopLevelFlags humanTopLevelFlags = convertTopLevelFlags(legacySpec.getTopLevelFlags());
     Int2ObjectArrayMap<HumanRewritingFlags> commonFlags =
         convertRewritingFlagMap(legacySpec.getCommonFlags(), app, origin);
@@ -81,33 +86,60 @@
   }
 
   public HumanDesugaredLibrarySpecification convert(
+      LegacyDesugaredLibrarySpecification legacySpec,
+      List<ClassFileResourceProvider> library,
+      InternalOptions options)
+      throws IOException {
+    AndroidApp.Builder builder = AndroidApp.builder();
+    for (ClassFileResourceProvider classFileResourceProvider : library) {
+      builder.addLibraryResourceProvider(classFileResourceProvider);
+    }
+    return internalConvert(legacySpec, builder.build(), options);
+  }
+
+  public HumanDesugaredLibrarySpecification convert(
       LegacyDesugaredLibrarySpecification legacySpec, Path androidLib, InternalOptions options)
       throws IOException {
-    DexApplication app = readApp(androidLib, options);
-    HumanTopLevelFlags humanTopLevelFlags = convertTopLevelFlags(legacySpec.getTopLevelFlags());
+    AndroidApp androidApp = AndroidApp.builder().addLibraryFile(androidLib).build();
+    return internalConvert(legacySpec, androidApp, options);
+  }
 
+  public HumanDesugaredLibrarySpecification internalConvert(
+      LegacyDesugaredLibrarySpecification legacySpec, AndroidApp inputApp, InternalOptions options)
+      throws IOException {
+    DexApplication app = readApp(inputApp, options);
+    LibraryValidator.validate(app, legacySpec.getTopLevelFlags().getRequiredCompilationAPILevel());
+    HumanTopLevelFlags humanTopLevelFlags = convertTopLevelFlags(legacySpec.getTopLevelFlags());
     // The origin is not maintained in non multi-level specifications.
     // It should not matter since the origin is used to report invalid specifications, and
     // converting non multi-level specifications should be performed only with *valid*
     // specifications in practical cases.
     Origin origin = Origin.unknown();
-
     HumanRewritingFlags humanRewritingFlags =
         convertRewritingFlags(legacySpec.getRewritingFlags(), app, origin);
+    if (options.getMinApiLevel().isLessThanOrEqualTo(legacyHackLevel)
+        && legacySpec.isLibraryCompilation()) {
+      HumanRewritingFlags.Builder builder =
+          humanRewritingFlags.newBuilder(app.dexItemFactory(), app.options.reporter, origin);
+      legacyLibraryFlagHacks(app.dexItemFactory(), builder);
+      humanRewritingFlags = builder.build();
+    }
     return new HumanDesugaredLibrarySpecification(
-        humanTopLevelFlags,
-        humanRewritingFlags,
-        legacySpec.isLibraryCompilation(),
-        app.dexItemFactory());
+        humanTopLevelFlags, humanRewritingFlags, legacySpec.isLibraryCompilation());
   }
 
   private void legacyLibraryFlagHacks(
       Int2ObjectArrayMap<HumanRewritingFlags> libraryFlags, DexApplication app, Origin origin) {
-    int level = AndroidApiLevel.N_MR1.getLevel();
+    int level = legacyHackLevel.getLevel();
     HumanRewritingFlags humanRewritingFlags = libraryFlags.get(level);
     HumanRewritingFlags.Builder builder =
         humanRewritingFlags.newBuilder(app.dexItemFactory(), app.options.reporter, origin);
-    DexItemFactory itemFactory = app.dexItemFactory();
+    legacyLibraryFlagHacks(app.dexItemFactory(), builder);
+    libraryFlags.put(level, builder.build());
+  }
+
+  private void legacyLibraryFlagHacks(
+      DexItemFactory itemFactory, HumanRewritingFlags.Builder builder) {
 
     // TODO(b/177977763): This is only a workaround rewriting invokes of j.u.Arrays.deepEquals0
     // to j.u.DesugarArrays.deepEquals0.
@@ -130,14 +162,10 @@
     source = itemFactory.createMethod(itemFactory.createType("Ljava/util/TimeZone;"), proto, name);
     target = itemFactory.createType("Ljava/util/DesugarTimeZone;");
     builder.putRetargetCoreLibMember(source, target);
-
-    libraryFlags.put(level, builder.build());
   }
 
-  private DexApplication readApp(Path androidLib, InternalOptions options) throws IOException {
-    AndroidApp androidApp = AndroidApp.builder().addLibraryFile(androidLib).build();
-    ApplicationReader applicationReader =
-        new ApplicationReader(androidApp, options, Timing.empty());
+  private DexApplication readApp(AndroidApp inputApp, InternalOptions options) throws IOException {
+    ApplicationReader applicationReader = new ApplicationReader(inputApp, options, Timing.empty());
     ExecutorService executorService = ThreadUtils.getExecutorService(options);
     return applicationReader.read(executorService).toDirect();
   }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/LibraryValidator.java b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/LibraryValidator.java
new file mode 100644
index 0000000..b415c354
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/ir/desugar/desugaredlibrary/specificationconversion/LibraryValidator.java
@@ -0,0 +1,36 @@
+// Copyright (c) 2022, 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.desugar.desugaredlibrary.specificationconversion;
+
+import com.android.tools.r8.graph.DexApplication;
+import com.android.tools.r8.graph.DexClass;
+import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.utils.AndroidApiLevel;
+
+public class LibraryValidator {
+
+  // Estimates if the library passed is at the expected minimum level, if it is not, raise
+  // a warning.
+  public static void validate(DexApplication app, AndroidApiLevel requiredCompilationAPILevel) {
+    DexType levelType;
+    if (requiredCompilationAPILevel.isEqualTo(AndroidApiLevel.O)) {
+      levelType = app.dexItemFactory.createType("Ljava/time/LocalTime;");
+    } else if (requiredCompilationAPILevel.isEqualTo(AndroidApiLevel.R)) {
+      levelType = app.dexItemFactory.createType("Ljava/util/concurrent/Flow;");
+    } else {
+      app.options.reporter.warning(
+          "Unsupported requiredCompilationAPILevel: " + requiredCompilationAPILevel);
+      return;
+    }
+    DexClass dexClass = app.definitionFor(levelType);
+    if (dexClass == null) {
+      app.options.reporter.warning(
+          "Desugared library requires to be compiled with a library file of API greater or equal to"
+              + " "
+              + requiredCompilationAPILevel
+              + ", but it seems the library file passed is of a lower API.");
+    }
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java
index 758812e..33f7037 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/ClassProcessor.java
@@ -24,10 +24,10 @@
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.GenericSignature;
 import com.android.tools.r8.graph.GenericSignature.ClassTypeSignature;
-import com.android.tools.r8.graph.LibraryMethod;
 import com.android.tools.r8.graph.MethodAccessFlags;
 import com.android.tools.r8.graph.MethodResolutionResult;
 import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.DerivedMethod;
 import com.android.tools.r8.position.MethodPosition;
 import com.android.tools.r8.utils.BooleanBox;
 import com.android.tools.r8.utils.BooleanUtils;
@@ -49,7 +49,6 @@
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.function.BiConsumer;
-import java.util.function.Consumer;
 import java.util.function.Function;
 import java.util.function.Predicate;
 import org.objectweb.asm.Opcodes;
@@ -376,12 +375,7 @@
     this.dexItemFactory = appView.dexItemFactory();
     this.helper = new InterfaceDesugaringSyntheticHelper(appView);
     needsLibraryInfo =
-        !appView.options().desugaredLibrarySpecification.getEmulateLibraryInterface().isEmpty()
-            || !appView
-                .options()
-                .desugaredLibrarySpecification
-                .getRetargetCoreLibMember()
-                .isEmpty();
+        appView.options().machineDesugaredLibrarySpecification.hasEmulatedInterfaces();
     this.isLiveMethod = isLiveMethod;
   }
 
@@ -510,7 +504,7 @@
       DexClass iface = appView.definitionFor(emulatedInterface);
       if (iface != null) {
         assert iface.isLibraryClass()
-            || appView.options().desugaredLibrarySpecification.isLibraryCompilation();
+            || appView.options().machineDesugaredLibrarySpecification.isLibraryCompilation();
         workList.addIfNotSeen(iface.getInterfaces());
       }
     }
@@ -670,10 +664,10 @@
       resolveForwardForSignature(
           clazz,
           wrapper.get(),
-          target -> {
+          (target, forward) -> {
             if (isLiveMethod(target) && !superInfo.isTargetedByForwards(target)) {
               additionalForwards.add(target);
-              addForwardingMethod(target, clazz);
+              addForwardingMethod(target, forward, clazz);
             }
           });
     }
@@ -682,7 +676,7 @@
   // Looks up a method signature from the point of 'clazz', if it can dispatch to a default method
   // the 'addForward' call-back is called with the target of the forward.
   private void resolveForwardForSignature(
-      DexClass clazz, DexMethod method, Consumer<DexClassAndMethod> addForward) {
+      DexClass clazz, DexMethod method, BiConsumer<DexClassAndMethod, DexMethod> addForward) {
     AppInfoWithClassHierarchy appInfo = appView.appInfoForDesugaring();
     MethodResolutionResult resolutionResult = appInfo.resolveMethodOn(clazz, method);
     if (resolutionResult.isFailedResolution()
@@ -722,50 +716,22 @@
         resolutionResult.lookupVirtualDispatchTarget(clazz, appInfo);
     assert virtualDispatchTarget != null;
 
-    // Don't forward if the target is explicitly marked as 'dont-rewrite'
-    if (dontRewrite(virtualDispatchTarget)) {
-      return;
-    }
-
     // If resolution targets a default interface method, forward it.
     if (virtualDispatchTarget.isDefaultMethod()) {
-      addForward.accept(virtualDispatchTarget);
+      addForward.accept(
+          virtualDispatchTarget,
+          helper.ensureDefaultAsMethodOfCompanionClassStub(virtualDispatchTarget).getReference());
       return;
     }
 
-    // Remaining edge cases only pertain to desugaring of library methods.
-    if (!virtualDispatchTarget.isLibraryMethod() || ignoreLibraryInfo()) {
-      return;
+    DerivedMethod forwardingMethod =
+        helper.computeEmulatedInterfaceForwardingMethod(
+            virtualDispatchTarget.getHolder(), virtualDispatchTarget);
+    if (forwardingMethod != null) {
+      DexMethod concreteForwardingMethod =
+          helper.ensureEmulatedInterfaceForwardingMethod(forwardingMethod);
+      addForward.accept(virtualDispatchTarget, concreteForwardingMethod);
     }
-
-    LibraryMethod libraryMethod = virtualDispatchTarget.asLibraryMethod();
-    if (isRetargetMethod(libraryMethod)) {
-      addForward.accept(virtualDispatchTarget);
-      return;
-    }
-
-    // If target is a non-interface library class it may be an emulated interface,
-    // except on a rewritten type, where L8 has already dealt with the desugaring.
-    if (!libraryMethod.getHolder().isInterface()
-        && !appView.rewritePrefix.hasRewrittenType(libraryMethod.getHolderType(), appView)) {
-      // Here we use step-3 of resolution to find a maximally specific default interface method.
-      DexClassAndMethod result =
-          appInfo.lookupMaximallySpecificMethod(libraryMethod.getHolder(), method);
-      if (result != null && helper.isEmulatedInterface(result.getHolderType())) {
-        addForward.accept(result);
-      }
-    }
-  }
-
-  private boolean isRetargetMethod(LibraryMethod method) {
-    assert needsLibraryInfo();
-    assert method.getDefinition().isNonPrivateVirtualMethod();
-    return !method.getAccessFlags().isFinal()
-        && appView.options().desugaredLibrarySpecification.retargetMethod(method, appView) != null;
-  }
-
-  private boolean dontRewrite(DexClassAndMethod method) {
-    return needsLibraryInfo() && method.getHolder().isLibraryClass() && helper.dontRewrite(method);
   }
 
   // Construction of actual forwarding methods.
@@ -830,7 +796,8 @@
 
   // Note: The parameter 'target' may be a public method on a class in case of desugared
   // library retargeting (See below target.isInterface check).
-  private void addForwardingMethod(DexClassAndMethod target, DexClass clazz) {
+  private void addForwardingMethod(
+      DexClassAndMethod target, DexMethod forwardMethod, DexClass clazz) {
     if (!clazz.isProgramClass()) {
       return;
     }
@@ -847,10 +814,6 @@
     // NOTE: Never add a forwarding method to methods of classes unknown or coming from android.jar
     // even if this results in invalid code, these classes are never desugared.
     // In desugared library, emulated interface methods can be overridden by retarget lib members.
-    DexMethod forwardMethod =
-        target.getHolder().isInterface()
-            ? helper.ensureDefaultAsMethodOfCompanionClassStub(target).getReference()
-            : appView.options().desugaredLibrarySpecification.retargetMethod(target, appView);
     DexEncodedMethod desugaringForwardingMethod =
         DexEncodedMethod.createDesugaringForwardingMethod(
             target.getDefinition(), clazz, forwardMethod, dexItemFactory);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/EmulatedInterfaceApplicationRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/EmulatedInterfaceApplicationRewriter.java
index 74d94e3..d06fee7 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/EmulatedInterfaceApplicationRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/EmulatedInterfaceApplicationRewriter.java
@@ -15,6 +15,7 @@
 import com.android.tools.r8.utils.IterableUtils;
 import java.util.ArrayList;
 import java.util.Collections;
+import java.util.IdentityHashMap;
 import java.util.List;
 import java.util.Map;
 
@@ -25,8 +26,15 @@
 
   public EmulatedInterfaceApplicationRewriter(AppView<?> appView) {
     this.appView = appView;
-    this.emulatedInterfaces =
-        appView.options().desugaredLibrarySpecification.getEmulateLibraryInterface();
+    emulatedInterfaces = new IdentityHashMap<>();
+    appView
+        .options()
+        .machineDesugaredLibrarySpecification
+        .getEmulatedInterfaces()
+        .forEach(
+            (ei, descriptor) -> {
+              emulatedInterfaces.put(ei, descriptor.getRewrittenType());
+            });
   }
 
   public void rewriteApplication(DexApplication.Builder<?> builder) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringForTesting.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringForTesting.java
index a3e0164..6636e1e 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringForTesting.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringForTesting.java
@@ -4,10 +4,12 @@
 
 package com.android.tools.r8.ir.desugar.itf;
 
+import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
+
 public class InterfaceDesugaringForTesting {
 
   public static String getEmulateLibraryClassNameSuffix() {
-    return InterfaceDesugaringSyntheticHelper.EMULATE_LIBRARY_CLASS_NAME_SUFFIX;
+    return SyntheticKind.EMULATED_INTERFACE_CLASS.descriptor;
   }
 
   public static String getCompanionClassNameSuffix() {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java
index 77d99e5..5d007195 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceDesugaringSyntheticHelper.java
@@ -24,6 +24,7 @@
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexProgramClass;
+import com.android.tools.r8.graph.DexProto;
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.DexValue.DexValueInt;
@@ -31,19 +32,20 @@
 import com.android.tools.r8.graph.GenericSignature.MethodTypeSignature;
 import com.android.tools.r8.graph.InvalidCode;
 import com.android.tools.r8.graph.MethodAccessFlags;
+import com.android.tools.r8.graph.MethodResolutionResult;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.graph.ThrowNullCode;
 import com.android.tools.r8.ir.desugar.CfInstructionDesugaringEventConsumer;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.DerivedMethod;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.EmulatedDispatchMethodDescriptor;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.EmulatedInterfaceDescriptor;
 import com.android.tools.r8.ir.desugar.itf.EmulatedInterfaceSynthesizerEventConsumer.ClasspathEmulatedInterfaceSynthesizerEventConsumer;
 import com.android.tools.r8.synthesis.SyntheticClassBuilder;
 import com.android.tools.r8.synthesis.SyntheticMethodBuilder;
 import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
 import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.Pair;
 import com.android.tools.r8.utils.structural.Ordered;
 import com.google.common.collect.ImmutableList;
-import java.util.Map;
-import java.util.Set;
 import java.util.function.Predicate;
 
 public class InterfaceDesugaringSyntheticHelper {
@@ -57,37 +59,37 @@
   }
 
   // Use InterfaceDesugaringForTesting for public accesses in tests.
-  static final String EMULATE_LIBRARY_CLASS_NAME_SUFFIX = "$-EL";
   static final String COMPANION_CLASS_NAME_SUFFIX = "$-CC";
   static final String DEFAULT_METHOD_PREFIX = "$default$";
   static final String PRIVATE_METHOD_PREFIX = "$private$";
 
   private final AppView<?> appView;
-  private final Map<DexType, DexType> emulatedInterfaces;
   private final Predicate<DexType> shouldIgnoreFromReportsPredicate;
 
   public InterfaceDesugaringSyntheticHelper(AppView<?> appView) {
     this.appView = appView;
-    emulatedInterfaces =
-        appView.options().desugaredLibrarySpecification.getEmulateLibraryInterface();
-
     this.shouldIgnoreFromReportsPredicate = getShouldIgnoreFromReportsPredicate(appView);
   }
 
   boolean isEmulatedInterface(DexType itf) {
-    return emulatedInterfaces.containsKey(itf);
+    return appView
+        .options()
+        .machineDesugaredLibrarySpecification
+        .getEmulatedInterfaces()
+        .containsKey(itf);
   }
 
   boolean isRewrittenEmulatedInterface(DexType itf) {
-    return emulatedInterfaces.containsValue(itf);
-  }
-
-  Set<DexType> getEmulatedInterfaces() {
-    return emulatedInterfaces.keySet();
+    return appView
+        .options()
+        .machineDesugaredLibrarySpecification
+        .isEmulatedInterfaceRewrittenType(itf);
   }
 
   DexType getEmulatedInterface(DexType type) {
-    return emulatedInterfaces.get(type);
+    EmulatedInterfaceDescriptor interfaceDescriptor =
+        appView.options().machineDesugaredLibrarySpecification.getEmulatedInterfaces().get(type);
+    return interfaceDescriptor == null ? null : interfaceDescriptor.getRewrittenType();
   }
 
   boolean isInDesugaredLibrary(DexClass clazz) {
@@ -95,18 +97,7 @@
     if (isEmulatedInterface(clazz.type)) {
       return true;
     }
-    return appView.rewritePrefix.hasRewrittenType(clazz.type, appView);
-  }
-
-  boolean dontRewrite(DexClassAndMethod method) {
-    for (Pair<DexType, DexString> dontRewrite :
-        appView.options().desugaredLibrarySpecification.getDontRewriteInvocation()) {
-      if (method.getHolderType() == dontRewrite.getFirst()
-          && method.getName() == dontRewrite.getSecond()) {
-        return true;
-      }
-    }
-    return false;
+    return appView.typeRewriter.hasRewrittenType(clazz.type, appView);
   }
 
   final boolean isCompatibleDefaultMethod(DexEncodedMethod method) {
@@ -129,25 +120,15 @@
     return true;
   }
 
-  public DexMethod emulateInterfaceLibraryMethod(DexClassAndMethod method) {
-    DexItemFactory factory = appView.dexItemFactory();
-    return factory.createMethod(
-        getEmulateLibraryInterfaceClassType(method.getHolderType(), factory),
-        factory.prependTypeToProto(method.getHolderType(), method.getProto()),
-        method.getName());
+  DexMethod emulatedInterfaceDispatchMethod(DerivedMethod method, DexType holder) {
+    assert method.getHolderKind() == SyntheticKind.EMULATED_INTERFACE_CLASS;
+    DexProto newProto = appView.dexItemFactory().prependHolderToProto(method.getMethod());
+    return appView.dexItemFactory().createMethod(holder, newProto, method.getName());
   }
 
-  private static String getEmulateLibraryInterfaceClassDescriptor(String descriptor) {
-    return descriptor.substring(0, descriptor.length() - 1)
-        + EMULATE_LIBRARY_CLASS_NAME_SUFFIX
-        + ";";
-  }
-
-  public static DexType getEmulateLibraryInterfaceClassType(DexType type, DexItemFactory factory) {
-    assert type.isClassType();
-    String descriptor = type.descriptor.toString();
-    String elTypeDescriptor = getEmulateLibraryInterfaceClassDescriptor(descriptor);
-    return factory.createSynthesizedType(elTypeDescriptor);
+  DexMethod emulatedInterfaceInterfaceMethod(DerivedMethod method) {
+    assert method.getHolderKind() == null;
+    return method.getMethod();
   }
 
   public static String getCompanionClassDescriptor(String descriptor) {
@@ -167,10 +148,6 @@
     return type.descriptor.toString().endsWith(COMPANION_CLASS_NAME_SUFFIX + ";");
   }
 
-  public static boolean isEmulatedLibraryClassType(DexType type) {
-    return type.descriptor.toString().endsWith(EMULATE_LIBRARY_CLASS_NAME_SUFFIX + ";");
-  }
-
   // Gets the interface class for a companion class `type`.
   DexType getInterfaceClassType(DexType type) {
     return getInterfaceClassType(type, appView.dexItemFactory());
@@ -194,12 +171,98 @@
             SyntheticKind.EMULATED_INTERFACE_MARKER_CLASS,
             type,
             appView,
-            SyntheticClassBuilder::setInterface);
+            SyntheticClassBuilder::setInterface,
+            ignored -> {});
   }
 
-  DexClassAndMethod ensureEmulatedInterfaceMethod(
-      DexClassAndMethod method, ClasspathEmulatedInterfaceSynthesizerEventConsumer eventConsumer) {
-    DexMethod emulatedInterfaceMethod = emulateInterfaceLibraryMethod(method);
+  DexClassAndMethod lookupMaximallySpecificIncludingSelf(
+      DexClass initialResolutionHolder, DexClassAndMethod method) {
+    assert method.getHolderType().isClassType();
+    if (method.getHolder().isInterface()) {
+      return method;
+    }
+    return appView
+        .appInfoForDesugaring()
+        .lookupMaximallySpecificMethod(initialResolutionHolder, method.getReference());
+  }
+
+  EmulatedDispatchMethodDescriptor getEmulatedDispatchDescriptor(
+      DexClass initialResolutionHolder, DexClassAndMethod method) {
+    if (method == null) {
+      return null;
+    }
+    assert initialResolutionHolder != null;
+    if (!requiresEmulatedDispatch(method)) {
+      return null;
+    }
+    DexClassAndMethod maximallySpecificMethod =
+        lookupMaximallySpecificIncludingSelf(initialResolutionHolder, method);
+    if (maximallySpecificMethod == null) {
+      return null;
+    }
+    return appView
+        .options()
+        .machineDesugaredLibrarySpecification
+        .getEmulatedInterfaceEmulatedDispatchMethodDescriptor(
+            maximallySpecificMethod.getReference());
+  }
+
+  private boolean requiresEmulatedDispatch(DexClassAndMethod method) {
+    return method.isLibraryMethod()
+        || isEmulatedInterface(method.getHolderType())
+        || appView
+            .options()
+            .machineDesugaredLibrarySpecification
+            .getEmulatedVirtualRetargetThroughEmulatedInterface()
+            .containsKey(method.getReference());
+  }
+
+  DerivedMethod computeEmulatedInterfaceDispatchMethod(MethodResolutionResult resolutionResult) {
+    EmulatedDispatchMethodDescriptor descriptor =
+        getEmulatedDispatchDescriptor(
+            resolutionResult.getInitialResolutionHolder(), resolutionResult.getResolutionPair());
+    return descriptor == null ? null : descriptor.getEmulatedDispatchMethod();
+  }
+
+  DerivedMethod computeEmulatedInterfaceForwardingMethod(
+      DexClass initialResolutionHolder, DexClassAndMethod method) {
+    if (method == null) {
+      return null;
+    }
+    DexMethod retarget =
+        appView
+            .options()
+            .machineDesugaredLibrarySpecification
+            .getEmulatedVirtualRetargetThroughEmulatedInterface()
+            .get(method.getReference());
+    if (retarget != null) {
+      return new DerivedMethod(retarget);
+    }
+    EmulatedDispatchMethodDescriptor descriptor =
+        getEmulatedDispatchDescriptor(initialResolutionHolder, method);
+    return descriptor == null ? null : descriptor.getForwardingMethod();
+  }
+
+  DexMethod ensureEmulatedInterfaceForwardingMethod(DerivedMethod method) {
+    if (method.getHolderKind() == null) {
+      return method.getMethod();
+    }
+    assert method.getHolderKind() == SyntheticKind.COMPANION_CLASS;
+    DexClassAndMethod resolvedMethod =
+        appView.appInfoForDesugaring().resolveMethod(method.getMethod(), true).getResolutionPair();
+    return ensureDefaultAsMethodOfCompanionClassStub(resolvedMethod).getReference();
+  }
+
+  DexClassAndMethod ensureEmulatedInterfaceDispatchMethod(
+      DerivedMethod emulatedDispatchMethod,
+      ClasspathEmulatedInterfaceSynthesizerEventConsumer eventConsumer) {
+    assert emulatedDispatchMethod.getHolderKind() == SyntheticKind.EMULATED_INTERFACE_CLASS;
+    DexClassAndMethod method =
+        appView
+            .appInfoForDesugaring()
+            .resolveMethod(emulatedDispatchMethod.getMethod(), true)
+            .getResolutionPair();
+    assert emulatedDispatchMethod.getHolderKind() == SyntheticKind.EMULATED_INTERFACE_CLASS;
     if (method.isProgramMethod()) {
       assert appView.options().isDesugaredLibraryCompilation();
       DexProgramClass emulatedInterface =
@@ -209,8 +272,15 @@
                   SyntheticKind.EMULATED_INTERFACE_CLASS,
                   method.asProgramMethod().getHolder(),
                   appView);
+      DexMethod emulatedInterfaceMethod =
+          emulatedInterfaceDispatchMethod(emulatedDispatchMethod, emulatedInterface.type);
+      assert emulatedInterface.lookupProgramMethod(emulatedInterfaceMethod) != null;
       return emulatedInterface.lookupProgramMethod(emulatedInterfaceMethod);
     }
+    // The holder is not used.
+    DexMethod emulatedInterfaceMethod =
+        emulatedInterfaceDispatchMethod(
+            emulatedDispatchMethod, appView.dexItemFactory().objectType);
     return appView
         .getSyntheticItems()
         .ensureFixedClasspathClassMethod(
@@ -508,10 +578,10 @@
 
     return type -> {
       DexString descriptor = type.getDescriptor();
-      return appView.rewritePrefix.hasRewrittenType(type, appView)
+      return appView.typeRewriter.hasRewrittenType(type, appView)
           || descriptor.endsWith(companionClassNameDescriptorSuffix)
           || isRewrittenEmulatedInterface(type)
-          || options.desugaredLibrarySpecification.getCustomConversions().containsValue(type)
+          || options.machineDesugaredLibrarySpecification.isCustomConversionRewrittenType(type)
           || appView.getDontWarnConfiguration().matches(type);
     };
   }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
index 6740441..85efd2b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
@@ -35,7 +35,8 @@
 import com.android.tools.r8.ir.desugar.DesugarDescription;
 import com.android.tools.r8.ir.desugar.FreshLocalProvider;
 import com.android.tools.r8.ir.desugar.LocalStackAllocator;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification.LegacyDesugaredLibrarySpecification;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.DerivedMethod;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineDesugaredLibrarySpecification;
 import com.android.tools.r8.ir.desugar.icce.AlwaysThrowingInstructionDesugaring;
 import com.android.tools.r8.ir.desugar.lambda.LambdaInstructionDesugaring;
 import com.android.tools.r8.ir.desugar.stringconcat.StringConcatInstructionDesugaring;
@@ -53,7 +54,6 @@
 import java.util.Map;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
-import java.util.function.BiConsumer;
 import java.util.function.Predicate;
 
 //
@@ -119,18 +119,23 @@
   }
 
   public static void checkForAssumedLibraryTypes(AppInfo appInfo, InternalOptions options) {
-    LegacyDesugaredLibrarySpecification spec = options.desugaredLibrarySpecification;
-    BiConsumer<DexType, DexType> registerEntry = registerMapEntry(appInfo);
-    spec.getEmulateLibraryInterface().forEach(registerEntry);
-    spec.getCustomConversions().forEach(registerEntry);
-    spec.getRetargetCoreLibMember().forEach((method, types) -> types.forEach(registerEntry));
-  }
-
-  private static BiConsumer<DexType, DexType> registerMapEntry(AppInfo appInfo) {
-    return (key, value) -> {
-      registerType(appInfo, key);
-      registerType(appInfo, value);
-    };
+    MachineDesugaredLibrarySpecification machineDesugaredLibrarySpecification =
+        options.machineDesugaredLibrarySpecification;
+    machineDesugaredLibrarySpecification
+        .getEmulatedInterfaces()
+        .forEach(
+            (ei, descriptor) -> {
+              registerType(appInfo, ei);
+              registerType(appInfo, descriptor.getRewrittenType());
+            });
+    machineDesugaredLibrarySpecification
+        .getCustomConversions()
+        .forEach(
+            (type, descriptor) -> {
+              registerType(appInfo, type);
+              registerType(appInfo, descriptor.getTo().getHolderType());
+              registerType(appInfo, descriptor.getFrom().getHolderType());
+            });
   }
 
   private static void registerType(AppInfo appInfo, DexType type) {
@@ -156,9 +161,9 @@
   }
 
   private void initializeEmulatedInterfaceVariables() {
-    Map<DexType, DexType> emulateLibraryInterface =
-        options.desugaredLibrarySpecification.getEmulateLibraryInterface();
-    for (DexType interfaceType : emulateLibraryInterface.keySet()) {
+    Set<DexType> emulateLibraryInterface =
+        options.machineDesugaredLibrarySpecification.getEmulatedInterfaces().keySet();
+    for (DexType interfaceType : emulateLibraryInterface) {
       DexClass emulatedInterfaceClass = appView.definitionFor(interfaceType);
       if (emulatedInterfaceClass != null) {
         for (DexEncodedMethod encodedMethod :
@@ -449,24 +454,27 @@
   }
 
   private DesugarDescription computeEmulatedInterfaceVirtualDispatchOrNull(CfInvoke invoke) {
-    DexClassAndMethod defaultMethod =
-        defaultMethodForEmulatedDispatchOrNull(invoke.getMethod(), invoke.isInterface());
-    if (defaultMethod != null) {
-      return DesugarDescription.builder()
-          .setDesugarRewrite(
-              (freshLocalProvider,
-                  localStackAllocator,
-                  eventConsumer,
-                  context1,
-                  methodProcessingContext,
-                  dexItemFactory) ->
-                  getInvokeStaticInstructions(
-                      helper
-                          .ensureEmulatedInterfaceMethod(defaultMethod, eventConsumer)
-                          .getReference()))
-          .build();
+    MethodResolutionResult resolutionResult =
+        appView.appInfoForDesugaring().resolveMethod(invoke.getMethod(), invoke.isInterface());
+    DerivedMethod emulatedDispatchMethod =
+        helper.computeEmulatedInterfaceDispatchMethod(resolutionResult);
+    if (emulatedDispatchMethod == null) {
+      return null;
     }
-    return null;
+    return DesugarDescription.builder()
+        .setDesugarRewrite(
+            (freshLocalProvider,
+                localStackAllocator,
+                eventConsumer,
+                context1,
+                methodProcessingContext,
+                dexItemFactory) ->
+                getInvokeStaticInstructions(
+                    helper
+                        .ensureEmulatedInterfaceDispatchMethod(
+                            emulatedDispatchMethod, eventConsumer)
+                        .getReference()))
+        .build();
   }
 
   private DesugarDescription computeInvokeDirect(
@@ -704,103 +712,49 @@
 
   private DesugarDescription computeEmulatedInterfaceInvokeSpecial(
       DexClass clazz, DexMethod invokedMethod, ProgramMethod context) {
-    DexType emulatedItf = maximallySpecificEmulatedInterfaceOrNull(invokedMethod);
-    if (emulatedItf == null) {
-      if (clazz.isInterface() && appView.rewritePrefix.hasRewrittenType(clazz.type, appView)) {
-        DexClassAndMethod target =
-            appView.appInfoForDesugaring().lookupSuperTarget(invokedMethod, context);
-        if (target != null && target.getDefinition().isDefaultMethod()) {
-          DexClass holder = target.getHolder();
-          if (holder.isLibraryClass() && holder.isInterface()) {
-            return DesugarDescription.builder()
-                .setDesugarRewrite(
-                    (freshLocalProvider,
-                        localStackAllocator,
-                        eventConsumer,
-                        context13,
-                        methodProcessingContext,
-                        dexItemFactory) -> {
-                      DexClassAndMethod companionTarget =
-                          helper.ensureDefaultAsMethodOfCompanionClassStub(target);
-                      acceptCompanionMethod(target, companionTarget, eventConsumer);
-                      return getInvokeStaticInstructions(companionTarget.getReference());
-                    })
-                .build();
-          }
+    DexClassAndMethod superTarget =
+        appView.appInfoForDesugaring().lookupSuperTarget(invokedMethod, context);
+    if (clazz.isInterface() && appView.typeRewriter.hasRewrittenType(clazz.type, appView)) {
+      if (superTarget != null && superTarget.getDefinition().isDefaultMethod()) {
+        DexClass holder = superTarget.getHolder();
+        if (holder.isLibraryClass() && holder.isInterface()) {
+          return DesugarDescription.builder()
+              .setDesugarRewrite(
+                  (freshLocalProvider,
+                      localStackAllocator,
+                      eventConsumer,
+                      context13,
+                      methodProcessingContext,
+                      dexItemFactory) -> {
+                    DexClassAndMethod companionTarget =
+                        helper.ensureDefaultAsMethodOfCompanionClassStub(superTarget);
+                    acceptCompanionMethod(superTarget, companionTarget, eventConsumer);
+                    return getInvokeStaticInstructions(companionTarget.getReference());
+                  })
+              .build();
         }
       }
-      return DesugarDescription.nothing();
     }
     // That invoke super may not resolve since the super method may not be present
     // since it's in the emulated interface. We need to force resolution. If it resolves
     // to a library method, then it needs to be rewritten.
     // If it resolves to a program overrides, the invoke-super can remain.
-    DexClassAndMethod superTarget =
-        appView.appInfoForDesugaring().lookupSuperTarget(invokedMethod, context);
-    if (superTarget != null && superTarget.isLibraryMethod()) {
-      // Rewriting is required because the super invoke resolves into a missing
-      // method (method is on desugared library). Find out if it needs to be
-      // retargeted or if it just calls a companion class method and rewrite.
-      DexMethod retargetMethod =
-          options.desugaredLibrarySpecification.retargetMethod(superTarget, appView);
-      if (retargetMethod != null) {
-        return DesugarDescription.builder()
-            .setDesugarRewrite(
-                (freshLocalProvider,
-                    localStackAllocator,
-                    eventConsumer,
-                    context14,
-                    methodProcessingContext,
-                    dexItemFactory) -> getInvokeStaticInstructions(retargetMethod))
-            .build();
-      }
-      DexClassAndMethod emulatedMethod =
-          superTarget.getReference().lookupMemberOnClass(appView.definitionFor(emulatedItf));
-      if (emulatedMethod == null) {
-        assert false;
-        return DesugarDescription.nothing();
-      }
-      return DesugarDescription.builder()
-          .setDesugarRewrite(
-              (freshLocalProvider,
-                  localStackAllocator,
-                  eventConsumer,
-                  context15,
-                  methodProcessingContext,
-                  dexItemFactory) -> {
-                DexClassAndMethod companionMethod =
-                    helper.ensureDefaultAsMethodOfCompanionClassStub(emulatedMethod);
-                return getInvokeStaticInstructions(companionMethod.getReference());
-              })
-          .build();
+    DerivedMethod forwardingMethod =
+        helper.computeEmulatedInterfaceForwardingMethod(clazz, superTarget);
+    if (forwardingMethod == null) {
+      return DesugarDescription.nothing();
     }
-    return DesugarDescription.nothing();
-  }
-
-  private DexClassAndMethod defaultMethodForEmulatedDispatchOrNull(
-      DexMethod invokedMethod, boolean interfaceBit) {
-    DexType emulatedItf = maximallySpecificEmulatedInterfaceOrNull(invokedMethod);
-    if (emulatedItf == null) {
-      return null;
-    }
-    // The call potentially ends up in a library class, in which case we need to rewrite, since the
-    // code may be in the desugared library.
-    SingleResolutionResult resolution =
-        appView
-            .appInfoForDesugaring()
-            .resolveMethod(invokedMethod, interfaceBit)
-            .asSingleResolution();
-    if (resolution != null
-        && (resolution.getResolvedHolder().isLibraryClass()
-            || helper.isEmulatedInterface(resolution.getResolvedHolder().type))) {
-      DexClassAndMethod defaultMethod =
-          appView.definitionFor(emulatedItf).lookupClassMethod(invokedMethod);
-      if (defaultMethod != null && !helper.dontRewrite(defaultMethod)) {
-        assert !defaultMethod.getAccessFlags().isAbstract();
-        return defaultMethod;
-      }
-    }
-    return null;
+    return DesugarDescription.builder()
+        .setDesugarRewrite(
+            (freshLocalProvider,
+                localStackAllocator,
+                eventConsumer,
+                context14,
+                methodProcessingContext,
+                dexItemFactory) ->
+                getInvokeStaticInstructions(
+                    helper.ensureEmulatedInterfaceForwardingMethod(forwardingMethod)))
+        .build();
   }
 
   private boolean shouldRewriteToInvokeToThrow(
@@ -809,40 +763,6 @@
         || resolutionResult.getResolvedMethod().isStatic() != isInvokeStatic;
   }
 
-  private DexType maximallySpecificEmulatedInterfaceOrNull(DexMethod invokedMethod) {
-    // Here we try to avoid doing the expensive look-up on all invokes.
-    if (!emulatedMethods.contains(invokedMethod.name)) {
-      return null;
-    }
-    DexClass dexClass = appView.definitionFor(invokedMethod.holder);
-    // We cannot rewrite the invoke we do not know what the class is.
-    if (dexClass == null) {
-      return null;
-    }
-    DexEncodedMethod singleTarget = null;
-    if (dexClass.isInterface()) {
-      // Look for exact method on the interface.
-      singleTarget = dexClass.lookupMethod(invokedMethod);
-    }
-    if (singleTarget == null) {
-      DexClassAndMethod result =
-          appView.appInfoForDesugaring().lookupMaximallySpecificMethod(dexClass, invokedMethod);
-      if (result != null) {
-        singleTarget = result.getDefinition();
-      }
-    }
-    if (singleTarget == null) {
-      // At this point we are in a library class. Failures can happen with NoSuchMethod if a
-      // library class implement a method with same signature but not related to emulated
-      // interfaces.
-      return null;
-    }
-    if (!singleTarget.isAbstract() && helper.isEmulatedInterface(singleTarget.getHolderType())) {
-      return singleTarget.getHolderType();
-    }
-    return null;
-  }
-
   private boolean isNonDesugaredLibraryClass(DexClass clazz) {
     return clazz.isLibraryClass() && !helper.isInDesugaredLibrary(clazz);
   }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/ProgramEmulatedInterfaceSynthesizer.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/ProgramEmulatedInterfaceSynthesizer.java
index f712cb4..7e8a2cc 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/ProgramEmulatedInterfaceSynthesizer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/ProgramEmulatedInterfaceSynthesizer.java
@@ -5,11 +5,9 @@
 
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.DexProto;
-import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.MethodAccessFlags;
 import com.android.tools.r8.graph.ProgramMethod;
@@ -25,27 +23,16 @@
 import com.android.tools.r8.synthesis.SyntheticNaming.SyntheticKind;
 import com.android.tools.r8.synthesis.SyntheticProgramClassBuilder;
 import com.android.tools.r8.utils.StringDiagnostic;
-import com.google.common.collect.Iterables;
-import com.google.common.collect.Sets;
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.IdentityHashMap;
 import java.util.LinkedHashMap;
-import java.util.LinkedList;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
 
 public final class ProgramEmulatedInterfaceSynthesizer implements CfClassSynthesizerDesugaring {
 
   private final AppView<?> appView;
   private final InterfaceDesugaringSyntheticHelper helper;
-  private final Map<DexType, List<DexType>> emulatedInterfacesHierarchy;
 
   public static ProgramEmulatedInterfaceSynthesizer create(AppView<?> appView) {
     if (!appView.options().isDesugaredLibraryCompilation()
-        || appView.options().desugaredLibrarySpecification.getEmulateLibraryInterface().isEmpty()) {
+        || !appView.options().machineDesugaredLibrarySpecification.hasEmulatedInterfaces()) {
       return null;
     }
     return new ProgramEmulatedInterfaceSynthesizer(appView);
@@ -54,53 +41,11 @@
   public ProgramEmulatedInterfaceSynthesizer(AppView<?> appView) {
     this.appView = appView;
     helper = new InterfaceDesugaringSyntheticHelper(appView);
-    // Avoid the computation outside L8 since it is not needed.
-    emulatedInterfacesHierarchy =
-        appView.options().isDesugaredLibraryCompilation()
-            ? processEmulatedInterfaceHierarchy()
-            : Collections.emptyMap();
-  }
-
-  private Map<DexType, List<DexType>> processEmulatedInterfaceHierarchy() {
-    Map<DexType, List<DexType>> emulatedInterfacesHierarchy = new IdentityHashMap<>();
-    Set<DexType> processed = Sets.newIdentityHashSet();
-    ArrayList<DexType> emulatedInterfacesSorted = new ArrayList<>(helper.getEmulatedInterfaces());
-    emulatedInterfacesSorted.sort(DexType::compareTo);
-    for (DexType interfaceType : emulatedInterfacesSorted) {
-      processEmulatedInterfaceHierarchy(interfaceType, processed, emulatedInterfacesHierarchy);
-    }
-    return emulatedInterfacesHierarchy;
-  }
-
-  private void processEmulatedInterfaceHierarchy(
-      DexType interfaceType,
-      Set<DexType> processed,
-      Map<DexType, List<DexType>> emulatedInterfacesHierarchy) {
-    if (processed.contains(interfaceType)) {
-      return;
-    }
-    emulatedInterfacesHierarchy.put(interfaceType, new ArrayList<>());
-    processed.add(interfaceType);
-    DexClass theInterface = appView.definitionFor(interfaceType);
-    if (theInterface == null) {
-      return;
-    }
-    LinkedList<DexType> workList = new LinkedList<>(Arrays.asList(theInterface.interfaces.values));
-    while (!workList.isEmpty()) {
-      DexType next = workList.removeLast();
-      if (helper.isEmulatedInterface(next)) {
-        processEmulatedInterfaceHierarchy(next, processed, emulatedInterfacesHierarchy);
-        emulatedInterfacesHierarchy.get(next).add(interfaceType);
-        DexClass nextClass = appView.definitionFor(next);
-        if (nextClass != null) {
-          workList.addAll(Arrays.asList(nextClass.interfaces.values));
-        }
-      }
-    }
   }
 
   DexProgramClass synthesizeProgramEmulatedInterface(
       DexProgramClass emulatedInterface,
+      EmulatedInterfaceDescriptor emulatedInterfaceDescriptor,
       L8ProgramEmulatedInterfaceSynthesizerEventConsumer eventConsumer) {
     return appView
         .getSyntheticItems()
@@ -108,20 +53,26 @@
             SyntheticNaming.SyntheticKind.EMULATED_INTERFACE_CLASS,
             emulatedInterface,
             appView,
-            builder -> synthesizeEmulateInterfaceMethods(emulatedInterface, builder),
+            builder ->
+                synthesizeEmulateInterfaceMethods(
+                    emulatedInterface, emulatedInterfaceDescriptor, builder),
             eventConsumer::acceptProgramEmulatedInterface);
   }
 
   private void synthesizeEmulateInterfaceMethods(
-      DexProgramClass emulatedInterface, SyntheticProgramClassBuilder builder) {
-    assert helper.isEmulatedInterface(emulatedInterface.type);
+      DexProgramClass emulatedInterface,
+      EmulatedInterfaceDescriptor emulatedInterfaceDescriptor,
+      SyntheticProgramClassBuilder builder) {
     emulatedInterface.forEachProgramVirtualMethodMatching(
-        DexEncodedMethod::isDefaultMethod,
+        m -> emulatedInterfaceDescriptor.getEmulatedMethods().containsKey(m.getReference()),
         method ->
             builder.addMethod(
                 methodBuilder ->
                     synthesizeEmulatedInterfaceMethod(
-                        method, emulatedInterface, builder.getType(), methodBuilder)));
+                        method,
+                        emulatedInterfaceDescriptor.getEmulatedMethods().get(method.getReference()),
+                        builder.getType(),
+                        methodBuilder)));
   }
 
   private DexMethod emulatedMethod(DerivedMethod method, DexType holder) {
@@ -137,24 +88,17 @@
 
   private void synthesizeEmulatedInterfaceMethod(
       ProgramMethod method,
-      DexProgramClass theInterface,
+      EmulatedDispatchMethodDescriptor descriptor,
       DexType dispatchType,
       SyntheticMethodBuilder methodBuilder) {
     assert !method.getDefinition().isStatic();
-    if (appView.options().testing.machineDesugaredLibrarySpecification != null) {
-      synthesizeEmulatedInterfaceMethodFromMachineSpecification(
-          method, theInterface, dispatchType, methodBuilder);
-      return;
-    }
-    DexMethod emulatedMethod = helper.emulateInterfaceLibraryMethod(method);
-    DexMethod itfMethod =
-        method
-            .getReference()
-            .withHolder(helper.getEmulatedInterface(theInterface.type), appView.dexItemFactory());
+    DexMethod emulatedMethod =
+        helper.emulatedInterfaceDispatchMethod(
+            descriptor.getEmulatedDispatchMethod(), dispatchType);
+    DexMethod itfMethod = helper.emulatedInterfaceInterfaceMethod(descriptor.getInterfaceMethod());
     DexMethod companionMethod =
-        helper.ensureDefaultAsMethodOfProgramCompanionClassStub(method).getReference();
-    LinkedHashMap<DexType, DexMethod> extraDispatchCases =
-        getDispatchCases(method, theInterface, companionMethod);
+        helper.ensureEmulatedInterfaceForwardingMethod(descriptor.getForwardingMethod());
+    LinkedHashMap<DexType, DexMethod> extraDispatchCases = resolveDispatchCases(descriptor);
     methodBuilder
         .setName(emulatedMethod.getName())
         .setProto(emulatedMethod.getProto())
@@ -170,162 +114,40 @@
                     .generateCfCode());
   }
 
-  private void synthesizeEmulatedInterfaceMethodFromMachineSpecification(
-      ProgramMethod method,
-      DexProgramClass theInterface,
-      DexType dispatchType,
-      SyntheticMethodBuilder methodBuilder) {
-    EmulatedInterfaceDescriptor emulatedInterfaceDescriptor =
-        appView
-            .options()
-            .testing
-            .machineDesugaredLibrarySpecification
-            .getRewritingFlags()
-            .getEmulatedInterfaces()
-            .get(theInterface.type);
-    EmulatedDispatchMethodDescriptor descriptor =
-        emulatedInterfaceDescriptor.getEmulatedMethods().get(method.getReference());
-    DexMethod emulatedMethod = emulatedMethod(descriptor.getEmulatedDispatchMethod(), dispatchType);
-    DexMethod itfMethod = interfaceMethod(descriptor.getInterfaceMethod());
-    // TODO(b/184026720): Adapt to use the forwarding method.
-    DerivedMethod forwardingMethod = descriptor.getForwardingMethod();
-    assert forwardingMethod.getHolderKind() == SyntheticKind.COMPANION_CLASS;
-    assert forwardingMethod.getMethod() == method.getReference();
-    DexMethod companionMethod =
-        helper.ensureDefaultAsMethodOfProgramCompanionClassStub(method).getReference();
-    LinkedHashMap<DexType, DexMethod> extraDispatchCases = resolveDispatchCases(descriptor);
-    methodBuilder
-        .setName(descriptor.getEmulatedDispatchMethod().getName())
-        .setProto(descriptor.getEmulatedDispatchMethod().getProto())
-        .setAccessFlags(MethodAccessFlags.createPublicStaticSynthetic())
-        .setCode(
-            emulatedInterfaceMethod ->
-                new EmulateDispatchSyntheticCfCodeProvider(
-                        emulatedMethod.getHolderType(),
-                        companionMethod,
-                        itfMethod,
-                        extraDispatchCases,
-                        appView)
-                    .generateCfCode());
-  }
-
   private LinkedHashMap<DexType, DexMethod> resolveDispatchCases(
       EmulatedDispatchMethodDescriptor descriptor) {
     LinkedHashMap<DexType, DexMethod> extraDispatchCases = new LinkedHashMap<>();
     descriptor
         .getDispatchCases()
         .forEach(
-            (type, derivedMethod) -> {
-              DexMethod caseMethod;
-              if (derivedMethod.getHolderKind() == null) {
-                caseMethod = derivedMethod.getMethod();
-              } else {
-                assert derivedMethod.getHolderKind() == SyntheticKind.COMPANION_CLASS;
-                ProgramMethod resolvedProgramMethod =
-                    appView
-                        .appInfoForDesugaring()
-                        .resolveMethod(derivedMethod.getMethod(), true)
-                        .getResolvedProgramMethod();
-                caseMethod =
-                    helper
-                        .ensureDefaultAsMethodOfProgramCompanionClassStub(resolvedProgramMethod)
-                        .getReference();
-              }
-              extraDispatchCases.put(type, caseMethod);
-            });
+            (type, derivedMethod) ->
+                extraDispatchCases.put(
+                    type, helper.ensureEmulatedInterfaceForwardingMethod(derivedMethod)));
     return extraDispatchCases;
   }
 
-  private LinkedHashMap<DexType, DexMethod> getDispatchCases(
-      ProgramMethod method, DexProgramClass theInterface, DexMethod companionMethod) {
-    // To properly emulate the library interface call, we need to compute the interfaces
-    // inheriting from the interface and manually implement the dispatch with instance of.
-    // The list guarantees that an interface is always after interfaces it extends,
-    // hence reverse iteration.
-    List<DexType> subInterfaces = emulatedInterfacesHierarchy.get(theInterface.type);
-    LinkedHashMap<DexType, DexMethod> extraDispatchCases = new LinkedHashMap<>();
-    // In practice, there is usually a single case (except for tests),
-    // so we do not bother to make the following loop more clever.
-    Map<DexString, Map<DexType, DexType>> retargetCoreLibMember =
-        appView.options().desugaredLibrarySpecification.getRetargetCoreLibMember();
-    for (DexString methodName : retargetCoreLibMember.keySet()) {
-      if (method.getName() == methodName) {
-        for (DexType inType : retargetCoreLibMember.get(methodName).keySet()) {
-          DexClass inClass = appView.definitionFor(inType);
-          if (inClass != null && implementsInterface(inClass, theInterface.type)) {
-            extraDispatchCases.put(
-                inType,
-                appView
-                    .dexItemFactory()
-                    .createMethod(
-                        retargetCoreLibMember.get(methodName).get(inType),
-                        appView
-                            .dexItemFactory()
-                            .protoWithDifferentFirstParameter(companionMethod.proto, inType),
-                        method.getName()));
-          }
-        }
-      }
-    }
-    if (subInterfaces != null) {
-      for (int i = subInterfaces.size() - 1; i >= 0; i--) {
-        DexClass subInterfaceClass = appView.definitionFor(subInterfaces.get(i));
-        assert subInterfaceClass != null;
-        assert subInterfaceClass.isProgramClass();
-        // Else computation of subInterface would have failed.
-        // if the method is implemented, extra dispatch is required.
-        DexEncodedMethod result = subInterfaceClass.lookupVirtualMethod(method.getReference());
-        if (result != null && !result.isAbstract()) {
-          assert result.isDefaultMethod();
-          DexMethod forward =
-              helper
-                  .ensureDefaultAsMethodOfProgramCompanionClassStub(
-                      new ProgramMethod(subInterfaceClass.asProgramClass(), result))
-                  .getReference();
-          extraDispatchCases.put(subInterfaceClass.type, forward);
-        }
-      }
-    } else {
-      assert extraDispatchCases.size() <= 1;
-    }
-    return extraDispatchCases;
-  }
-
-  private boolean implementsInterface(DexClass clazz, DexType interfaceType) {
-    LinkedList<DexType> workList = new LinkedList<>(Arrays.asList(clazz.interfaces.values));
-    while (!workList.isEmpty()) {
-      DexType next = workList.removeLast();
-      if (interfaceType == next) {
-        return true;
-      }
-      DexClass nextClass = appView.definitionFor(next);
-      if (nextClass != null) {
-        workList.addAll(Arrays.asList(nextClass.interfaces.values));
-      }
-    }
-    return false;
-  }
-
   @Override
   public void synthesizeClasses(CfClassSynthesizerDesugaringEventConsumer eventConsumer) {
     assert appView.options().isDesugaredLibraryCompilation();
-    for (DexType emulatedInterfaceType : helper.getEmulatedInterfaces()) {
-      DexClass emulatedInterfaceClazz = appView.definitionFor(emulatedInterfaceType);
-      if (emulatedInterfaceClazz == null || !emulatedInterfaceClazz.isProgramClass()) {
-        warnMissingEmulatedInterface(emulatedInterfaceType);
-        continue;
-      }
-      DexProgramClass emulatedInterface = emulatedInterfaceClazz.asProgramClass();
-      assert emulatedInterface != null;
-      if (!appView.isAlreadyLibraryDesugared(emulatedInterface)
-          && needsEmulateInterfaceLibrary(emulatedInterface)) {
-        synthesizeProgramEmulatedInterface(emulatedInterface, eventConsumer);
-      }
-    }
-  }
-
-  private boolean needsEmulateInterfaceLibrary(DexClass emulatedInterface) {
-    return Iterables.any(emulatedInterface.methods(), DexEncodedMethod::isDefaultMethod);
+    appView
+        .options()
+        .machineDesugaredLibrarySpecification
+        .getEmulatedInterfaces()
+        .forEach(
+            (emulatedInterfaceType, emulatedInterfaceDescriptor) -> {
+              DexClass emulatedInterfaceClazz = appView.definitionFor(emulatedInterfaceType);
+              if (emulatedInterfaceClazz == null || !emulatedInterfaceClazz.isProgramClass()) {
+                warnMissingEmulatedInterface(emulatedInterfaceType);
+                return;
+              }
+              DexProgramClass emulatedInterface = emulatedInterfaceClazz.asProgramClass();
+              assert emulatedInterface != null;
+              if (!appView.isAlreadyLibraryDesugared(emulatedInterface)
+                  && !emulatedInterfaceDescriptor.getEmulatedMethods().isEmpty()) {
+                synthesizeProgramEmulatedInterface(
+                    emulatedInterface, emulatedInterfaceDescriptor, eventConsumer);
+              }
+            });
   }
 
   private void warnMissingEmulatedInterface(DexType interfaceType) {
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordFieldValuesRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordFieldValuesRewriter.java
index 4689b6d..d8a62a0 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordFieldValuesRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordFieldValuesRewriter.java
@@ -165,7 +165,7 @@
           appView
               .appInfo()
               .resolveField(appView.graphLens().getRenamedFieldSignature(fields[index]), context);
-      if (resolution.isSuccessfulResolution()) {
+      if (resolution.isSingleFieldResolutionResult()) {
         newInValues.add(inValues.get(index));
       }
     }
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 30ea9f8..97c8d47 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
@@ -10,7 +10,7 @@
 import com.android.tools.r8.graph.DexClassAndField;
 import com.android.tools.r8.graph.DexClassAndMethod;
 import com.android.tools.r8.graph.DexMethod;
-import com.android.tools.r8.graph.FieldResolutionResult.SuccessfulFieldResolutionResult;
+import com.android.tools.r8.graph.FieldResolutionResult.SingleFieldResolutionResult;
 import com.android.tools.r8.graph.MethodResolutionResult.SingleResolutionResult;
 import com.android.tools.r8.ir.analysis.type.DynamicType;
 import com.android.tools.r8.ir.analysis.type.DynamicTypeWithUpperBound;
@@ -285,8 +285,8 @@
       return false;
     }
 
-    SuccessfulFieldResolutionResult resolutionResult =
-        appView.appInfo().resolveField(fieldGet.getField()).asSuccessfulResolution();
+    SingleFieldResolutionResult resolutionResult =
+        appView.appInfo().resolveField(fieldGet.getField()).asSingleFieldResolutionResult();
     if (resolutionResult == null) {
       return false;
     }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
index 7d12496..cd28d57 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/CodeRewriter.java
@@ -26,7 +26,7 @@
 import com.android.tools.r8.graph.DexProto;
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.FieldResolutionResult.SuccessfulFieldResolutionResult;
+import com.android.tools.r8.graph.FieldResolutionResult.SingleProgramFieldResolutionResult;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.horizontalclassmerging.HorizontalClassMergerUtils;
 import com.android.tools.r8.ir.analysis.equivalence.BasicBlockBehavioralSubsumption;
@@ -70,6 +70,7 @@
 import com.android.tools.r8.ir.code.IntSwitch;
 import com.android.tools.r8.ir.code.Invoke;
 import com.android.tools.r8.ir.code.InvokeDirect;
+import com.android.tools.r8.ir.code.InvokeInterface;
 import com.android.tools.r8.ir.code.InvokeMethod;
 import com.android.tools.r8.ir.code.InvokeMethodWithReceiver;
 import com.android.tools.r8.ir.code.InvokeNewArray;
@@ -286,10 +287,8 @@
 
           Throw throwInstruction = valueIsNullTarget.exit().asThrow();
           Value exceptionValue = throwInstruction.exception().getAliasedValue();
-          Value message;
-          if (exceptionValue.isConstZero()) {
-            message = null;
-          } else if (exceptionValue.isDefinedByInstructionSatisfying(Instruction::isNewInstance)) {
+          if (!exceptionValue.isConstZero()
+              && exceptionValue.isDefinedByInstructionSatisfying(Instruction::isNewInstance)) {
             NewInstance newInstance = exceptionValue.definition.asNewInstance();
             if (newInstance.clazz != dexItemFactory.npeType) {
               continue;
@@ -301,18 +300,10 @@
             if (constructorCall == null) {
               continue;
             }
-            DexMethod invokedMethod = constructorCall.getInvokedMethod();
-            if (invokedMethod == dexItemFactory.npeMethods.init) {
-              message = null;
-            } else if (invokedMethod == dexItemFactory.npeMethods.initWithMessage) {
-              if (!appView.options().canUseJavaUtilObjectsRequireNonNull()) {
-                continue;
-              }
-              message = constructorCall.getArgument(1);
-            } else {
+            if (constructorCall.getInvokedMethod() != dexItemFactory.npeMethods.init) {
               continue;
             }
-          } else {
+          } else if (!exceptionValue.isConstZero()) {
             continue;
           }
 
@@ -327,26 +318,12 @@
             continue;
           }
 
-          if (message != null) {
-            Instruction definition = message.definition;
-            if (message.definition.getBlock() == valueIsNullTarget) {
-              it.previous();
-              Instruction entry;
-              do {
-                entry = valueIsNullTarget.getInstructions().removeFirst();
-                it.add(entry);
-              } while (entry != definition);
-              it.next();
-            }
-          }
-
-          rewriteIfToRequireNonNull(
+          insertNotNullCheck(
               block,
               it,
               ifInstruction,
               ifInstruction.targetFromCondition(1),
               valueIsNullTarget,
-              message,
               throwInstruction.getPosition());
           shouldRemoveUnreachableBlocks = true;
         }
@@ -1207,8 +1184,8 @@
       return false;
     }
     InstanceGet instanceGet = switchValue.getDefinition().asInstanceGet();
-    SuccessfulFieldResolutionResult resolutionResult =
-        appInfo.resolveField(instanceGet.getField()).asSuccessfulResolution();
+    SingleProgramFieldResolutionResult resolutionResult =
+        appInfo.resolveField(instanceGet.getField()).asSingleProgramFieldResolutionResult();
     if (resolutionResult == null) {
       return false;
     }
@@ -3363,33 +3340,19 @@
     assert block.exit().asGoto().getTarget() == target;
   }
 
-  private void rewriteIfToRequireNonNull(
+  private void insertNotNullCheck(
       BasicBlock block,
       InstructionListIterator iterator,
       If theIf,
       BasicBlock target,
       BasicBlock deadTarget,
-      Value message,
       Position position) {
     deadTarget.unlinkSinglePredecessorSiblingsAllowed();
     assert theIf == block.exit();
     iterator.previous();
     Instruction instruction;
-    if (appView.options().canUseJavaUtilObjectsRequireNonNull()) {
-      if (message != null) {
-        DexMethod requireNonNullMethod =
-            appView.dexItemFactory().objectsMethods.requireNonNullWithMessage;
-        instruction =
-            new InvokeStatic(requireNonNullMethod, null, ImmutableList.of(theIf.lhs(), message));
-      } else {
-        DexMethod requireNonNullMethod = appView.dexItemFactory().objectsMethods.requireNonNull;
-        instruction = new InvokeStatic(requireNonNullMethod, null, ImmutableList.of(theIf.lhs()));
-      }
-    } else {
-      assert message == null;
-      DexMethod getClassMethod = appView.dexItemFactory().objectMembers.getClass;
-      instruction = new InvokeVirtual(getClassMethod, null, ImmutableList.of(theIf.lhs()));
-    }
+    DexMethod getClassMethod = appView.dexItemFactory().objectMembers.getClass;
+    instruction = new InvokeVirtual(getClassMethod, null, ImmutableList.of(theIf.lhs()));
     instruction.setPosition(position);
     iterator.add(instruction);
     iterator.next();
@@ -3811,6 +3774,26 @@
     }
   }
 
+  // The javac fix for JDK-8272564 has to be rewritten back to invoke-virtual on Object if the
+  // method with an Object signature is not defined on the interface. See
+  // https://bugs.openjdk.java.net/browse/JDK-8272564
+  public static void rewriteJdk8272564Fix(IRCode code, AppView<?> appView) {
+    DexItemFactory dexItemFactory = appView.dexItemFactory();
+    InstructionListIterator it = code.instructionListIterator();
+    while (it.hasNext()) {
+      Instruction instruction = it.next();
+      if (instruction.isInvokeInterface()) {
+        InvokeInterface invoke = instruction.asInvokeInterface();
+        DexMethod method = invoke.getInvokedMethod();
+        DexMethod objectMember = dexItemFactory.objectMembers.matchingPublicObjectMember(method);
+        if (objectMember != null && appView.definitionFor(method) == null) {
+          it.replaceCurrentInstruction(
+              new InvokeVirtual(objectMember, invoke.outValue(), invoke.arguments()));
+        }
+      }
+    }
+  }
+
   private static NewInstance findNewInstance(Phi phi) {
     Set<Phi> seen = Sets.newIdentityHashSet();
     Set<Value> values = Sets.newIdentityHashSet();
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
index 8182229..4ad92d7 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
@@ -395,7 +395,7 @@
     }
     if (appView.canUseInitClass()
         && inlinerOptions.enableInliningOfInvokesWithClassInitializationSideEffects) {
-      action.setShouldSynthesizeInitClass();
+      action.setShouldEnsureStaticInitialization();
       return action;
     }
     whyAreYouNotInliningReporter.reportMustTriggerClassInitialization();
@@ -409,17 +409,12 @@
       ClassInitializationAnalysis classInitializationAnalysis) {
     // Only proceed with inlining a static invoke if:
     // - the holder for the target is a subtype of the holder for the method,
-    // - the target method always triggers class initialization of its holder before any other side
-    //   effect (hence preserving class initialization semantics),
     // - the current method has already triggered the holder for the target method to be
     //   initialized, or
     // - there is no non-trivial class initializer.
     if (appView.appInfo().isSubtype(context.getHolderType(), target.getHolderType())) {
       return true;
     }
-    if (target.getDefinition().getOptimizationInfo().triggersClassInitBeforeAnySideEffect()) {
-      return true;
-    }
     if (!context.getDefinition().isStatic()) {
       boolean targetIsGuaranteedToBeInitialized =
           appView.withInitializedClassesInInstanceMethods(
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
index fba3991..c458574 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/Inliner.java
@@ -39,7 +39,6 @@
 import com.android.tools.r8.ir.code.InstructionListIterator;
 import com.android.tools.r8.ir.code.Invoke;
 import com.android.tools.r8.ir.code.InvokeMethod;
-import com.android.tools.r8.ir.code.InvokeStatic;
 import com.android.tools.r8.ir.code.InvokeVirtual;
 import com.android.tools.r8.ir.code.Monitor;
 import com.android.tools.r8.ir.code.MoveException;
@@ -515,7 +514,7 @@
     public final Invoke invoke;
     final Reason reason;
 
-    private boolean shouldSynthesizeInitClass;
+    private boolean shouldEnsureStaticInitialization;
 
     private DexProgramClass downcastClass;
 
@@ -538,13 +537,14 @@
       this.downcastClass = downcastClass;
     }
 
-    void setShouldSynthesizeInitClass() {
-      shouldSynthesizeInitClass = true;
+    void setShouldEnsureStaticInitialization() {
+      shouldEnsureStaticInitialization = true;
     }
 
     InlineeWithReason buildInliningIR(
         AppView<AppInfoWithLiveness> appView,
         InvokeMethod invoke,
+        ProgramMethod context,
         InliningIRProvider inliningIRProvider,
         LensCodeRewriter lensCodeRewriter) {
       DexItemFactory dexItemFactory = appView.dexItemFactory();
@@ -555,8 +555,13 @@
 
       // Insert a init class instruction if this is needed to preserve class initialization
       // semantics.
-      if (shouldSynthesizeInitClass) {
-        synthesizeInitClass(code);
+      if (shouldEnsureStaticInitialization) {
+        handleSimpleEffectAnalysisResult(
+            SimpleDominatingEffectAnalysis.triggersClassInitializationBeforeAnyStaticRead(
+                appView, code, context),
+            code.entryBlock(),
+            ConsumerUtils.emptyConsumer(),
+            failingBlock -> synthesizeInitClass(code, failingBlock));
       }
 
       // Insert a null check if this is needed to preserve the implicit null check for the receiver.
@@ -573,19 +578,11 @@
       if (invoke.isInvokeMethodWithReceiver()
           && invoke.asInvokeMethodWithReceiver().getReceiver().isMaybeNull()
           && !isSynthesizingNullCheckForReceiverUsingMonitorEnter) {
-        SimpleEffectAnalysisResult checksReceiverBeingNull =
-            canInlineWithoutSynthesizingNullCheckForReceiver(appView, code);
-        if (checksReceiverBeingNull.isNotSatisfied()
-            || (checksReceiverBeingNull.isPartial()
-                && checksReceiverBeingNull.topMostNotSatisfiedBlockSize() > 1)) {
-          synthesizeNullCheckForReceiver(appView, code, invoke, code.entryBlock());
-        } else {
-          checksReceiverBeingNull.forEachSatisfyingInstruction(
-              this::setRemoveInnerFramePositionForReceiverUse);
-          // Also add a null check on failing paths
-          checksReceiverBeingNull.forEachTopMostNotSatisfiedBlock(
-              block -> synthesizeNullCheckForReceiver(appView, code, invoke, block));
-        }
+        handleSimpleEffectAnalysisResult(
+            canInlineWithoutSynthesizingNullCheckForReceiver(appView, code),
+            code.entryBlock(),
+            this::setRemoveInnerFramePositionForReceiverUse,
+            failingBlock -> synthesizeNullCheckForReceiver(appView, code, invoke, failingBlock));
       }
       // Insert monitor-enter and monitor-exit instructions if the method is synchronized.
       if (shouldSynthesizeMonitorEnterExit) {
@@ -711,12 +708,32 @@
       return new InlineeWithReason(code, reason);
     }
 
-    private void synthesizeInitClass(IRCode code) {
-      List<Value> arguments = code.collectArguments();
-      BasicBlock block = code.entryBlock();
+    private void handleSimpleEffectAnalysisResult(
+        SimpleEffectAnalysisResult result,
+        BasicBlock entryBlock,
+        Consumer<Instruction> satisfyingInstructionConsumer,
+        Consumer<BasicBlock> failingPathConsumer) {
+      List<BasicBlock> topmostNotSatisfiedBlocks = result.getTopmostNotSatisfiedBlocks();
+      if (result.isNotSatisfied()
+          // We should only handle partial results if the number of failing paths are small (1) and
+          // if the failing blocks that root the failing paths do not have catch handlers.
+          || (result.isPartial() && topmostNotSatisfiedBlocks.size() > 1)
+          || (result.isPartial() && topmostNotSatisfiedBlocks.get(0).hasCatchHandlers())) {
+        failingPathConsumer.accept(entryBlock);
+      } else {
+        result.forEachSatisfyingInstruction(satisfyingInstructionConsumer);
+        topmostNotSatisfiedBlocks.forEach(failingPathConsumer);
+      }
+    }
+
+    private void synthesizeInitClass(IRCode code, BasicBlock block) {
       // Insert a new block between the last argument instruction and the first actual instruction
-      // of the method.
-      BasicBlock initClassBlock = block.listIterator(code, arguments.size()).split(code, 0, null);
+      // of the method, or the first instruction if not entry block.
+      assert !block.hasCatchHandlers();
+      BasicBlock initClassBlock =
+          block
+              .listIterator(code, block.isEntry() ? code.collectArguments().size() : 0)
+              .split(code, 0, null);
       assert !initClassBlock.hasCatchHandlers();
 
       InstructionListIterator iterator = initClassBlock.listIterator(code);
@@ -738,13 +755,8 @@
 
         InstructionListIterator iterator = throwBlock.listIterator(code);
         iterator.setInsertionPosition(invoke.getPosition());
-        if (appView.options().canUseJavaUtilObjectsRequireNonNull()) {
-          DexMethod requireNonNullMethod = appView.dexItemFactory().objectsMethods.requireNonNull;
-          iterator.add(new InvokeStatic(requireNonNullMethod, null, ImmutableList.of(receiver)));
-        } else {
-          DexMethod getClassMethod = appView.dexItemFactory().objectMembers.getClass;
-          iterator.add(new InvokeVirtual(getClassMethod, null, ImmutableList.of(receiver)));
-        }
+        DexMethod getClassMethod = appView.dexItemFactory().objectMembers.getClass;
+        iterator.add(new InvokeVirtual(getClassMethod, null, ImmutableList.of(receiver)));
       } else {
         assert false : "Unable to synthesize a null check for the receiver";
       }
@@ -1014,7 +1026,8 @@
           }
 
           InlineeWithReason inlinee =
-              action.buildInliningIR(appView, invoke, inliningIRProvider, lensCodeRewriter);
+              action.buildInliningIR(
+                  appView, invoke, context, inliningIRProvider, lensCodeRewriter);
           if (strategy.willExceedBudget(
               code, invoke, inlinee, block, whyAreYouNotInliningReporter)) {
             assert whyAreYouNotInliningReporter.unsetReasonHasBeenReportedFlag();
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/MemberValuePropagation.java b/src/main/java/com/android/tools/r8/ir/optimize/MemberValuePropagation.java
index 4807cda..b4584c4 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/MemberValuePropagation.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/MemberValuePropagation.java
@@ -14,7 +14,7 @@
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.FieldResolutionResult.SuccessfulFieldResolutionResult;
+import com.android.tools.r8.graph.FieldResolutionResult.SingleFieldResolutionResult;
 import com.android.tools.r8.graph.MethodResolutionResult.SingleResolutionResult;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.analysis.type.ClassTypeElement;
@@ -364,8 +364,8 @@
     DexField field = current.getField();
 
     // TODO(b/123857022): Should be able to use definitionFor().
-    SuccessfulFieldResolutionResult resolutionResult =
-        appView.appInfo().resolveField(field).asSuccessfulResolution();
+    SingleFieldResolutionResult resolutionResult =
+        appView.appInfo().resolveField(field).asSingleFieldResolutionResult();
     if (resolutionResult == null) {
       boolean replaceCurrentInstructionWithConstNull =
           appView.withGeneratedExtensionRegistryShrinker(
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/RedundantFieldLoadAndStoreElimination.java b/src/main/java/com/android/tools/r8/ir/optimize/RedundantFieldLoadAndStoreElimination.java
index bcef49c..715dfdd 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/RedundantFieldLoadAndStoreElimination.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/RedundantFieldLoadAndStoreElimination.java
@@ -13,7 +13,7 @@
 import com.android.tools.r8.graph.DexClassAndMethod;
 import com.android.tools.r8.graph.DexField;
 import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.graph.FieldResolutionResult.SuccessfulFieldResolutionResult;
+import com.android.tools.r8.graph.FieldResolutionResult.SingleFieldResolutionResult;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.graph.classmerging.VerticallyMergedClasses;
 import com.android.tools.r8.ir.analysis.value.SingleFieldValue;
@@ -40,7 +40,6 @@
 import com.android.tools.r8.ir.code.Value;
 import com.android.tools.r8.ir.optimize.info.field.InstanceFieldInitializationInfoCollection;
 import com.android.tools.r8.ir.optimize.info.initializer.InstanceInitializerInfo;
-import com.android.tools.r8.utils.InternalOptions;
 import com.google.common.collect.Sets;
 import it.unimi.dsi.fastutil.objects.Reference2IntMap;
 import it.unimi.dsi.fastutil.objects.Reference2IntOpenHashMap;
@@ -92,9 +91,7 @@
   }
 
   public static boolean shouldRun(AppView<?> appView, IRCode code) {
-    InternalOptions options = appView.options();
-    return options.enableRedundantFieldLoadElimination
-        && !options.debug
+    return appView.options().enableRedundantFieldLoadElimination
         && (code.metadata().mayHaveArrayGet()
             || code.metadata().mayHaveFieldInstruction()
             || code.metadata().mayHaveInitClass());
@@ -287,8 +284,8 @@
 
   private DexClassAndField resolveField(DexField field) {
     if (appView.enableWholeProgramOptimizations()) {
-      SuccessfulFieldResolutionResult resolutionResult =
-          appView.appInfo().withLiveness().resolveField(field).asSuccessfulResolution();
+      SingleFieldResolutionResult resolutionResult =
+          appView.appInfo().withLiveness().resolveField(field).asSingleFieldResolutionResult();
       return resolutionResult != null ? resolutionResult.getResolutionPair() : null;
     }
     if (field.getHolderType() == method.getHolderType()) {
@@ -556,6 +553,17 @@
   }
 
   private void handleArrayGet(InstructionListIterator it, ArrayGet arrayGet) {
+    if (arrayGet.array().hasLocalInfo()) {
+      // The array may be modified through the debugger. Therefore subsequent reads of the same
+      // array slot may not read this local.
+      return;
+    }
+    if (arrayGet.outValue().hasLocalInfo()) {
+      // This local may be modified through the debugger. Therefore subsequent reads of the same
+      // array slot may not read this local.
+      return;
+    }
+
     Value array = arrayGet.array().getAliasedValue();
     Value index = arrayGet.index().getAliasedValue();
     ArraySlot arraySlot = ArraySlot.create(array, index, arrayGet.getMemberType());
@@ -593,6 +601,11 @@
       InstanceGet instanceGet,
       DexClassAndField field,
       AssumeRemover assumeRemover) {
+    if (instanceGet.outValue().hasLocalInfo()) {
+      clearMostRecentInstanceFieldWrite(instanceGet, field);
+      return;
+    }
+
     Value object = instanceGet.object().getAliasedValue();
     FieldAndObject fieldAndObject = new FieldAndObject(field.getReference(), object);
     FieldValue replacement = activeState.getInstanceFieldValue(fieldAndObject);
@@ -686,6 +699,12 @@
       AssumeRemover assumeRemover) {
     markClassAsInitialized(field.getHolderType());
 
+    if (staticGet.outValue().hasLocalInfo()) {
+      killNonFinalActiveFields(staticGet);
+      clearMostRecentStaticFieldWrite(staticGet, field);
+      return;
+    }
+
     FieldValue replacement = activeState.getStaticFieldValue(field.getReference());
     if (replacement != null) {
       markAssumeDynamicTypeUsersForRemoval(staticGet, replacement, assumeRemover);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/SimpleDominatingEffectAnalysis.java b/src/main/java/com/android/tools/r8/ir/optimize/SimpleDominatingEffectAnalysis.java
index 0f68783..ddbe46b 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/SimpleDominatingEffectAnalysis.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/SimpleDominatingEffectAnalysis.java
@@ -188,12 +188,8 @@
       satisfyingInstructions.forEach(instructionConsumer);
     }
 
-    public void forEachTopMostNotSatisfiedBlock(Consumer<BasicBlock> blockConsumer) {
-      topmostNotSatisfiedBlocks.forEach(blockConsumer);
-    }
-
-    public int topMostNotSatisfiedBlockSize() {
-      return topmostNotSatisfiedBlocks.size();
+    public List<BasicBlock> getTopmostNotSatisfiedBlocks() {
+      return topmostNotSatisfiedBlocks;
     }
 
     public static SimpleEffectAnalysisResultBuilder builder() {
@@ -337,14 +333,13 @@
   }
 
   public static SimpleEffectAnalysisResult triggersClassInitializationBeforeAnyStaticRead(
-      AppView<AppInfoWithLiveness> appView, IRCode code) {
+      AppView<AppInfoWithLiveness> appView, IRCode code, ProgramMethod context) {
     assert code.context().getDefinition().isStatic();
-    ProgramMethod context = code.context();
     return run(
         code,
         instruction -> {
           if (instruction.definitelyTriggersClassInitialization(
-              context.getHolderType(),
+              code.context().getHolderType(),
               context,
               appView,
               DIRECTLY,
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
index 0a0bed9..e6494f3 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
@@ -19,7 +19,7 @@
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.FieldResolutionResult.SuccessfulFieldResolutionResult;
+import com.android.tools.r8.graph.FieldResolutionResult.SingleProgramFieldResolutionResult;
 import com.android.tools.r8.graph.LibraryMethod;
 import com.android.tools.r8.graph.MethodResolutionResult;
 import com.android.tools.r8.graph.MethodResolutionResult.SingleResolutionResult;
@@ -167,8 +167,8 @@
     assert root.isStaticGet();
 
     StaticGet staticGet = root.asStaticGet();
-    SuccessfulFieldResolutionResult fieldResolutionResult =
-        appView.appInfo().resolveField(staticGet.getField()).asSuccessfulResolution();
+    SingleProgramFieldResolutionResult fieldResolutionResult =
+        appView.appInfo().resolveField(staticGet.getField()).asSingleProgramFieldResolutionResult();
     if (fieldResolutionResult == null) {
       return EligibilityStatus.NOT_ELIGIBLE;
     }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/analysis/TransferFunction.java b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/analysis/TransferFunction.java
index 17d5658..152c212 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/analysis/TransferFunction.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/analysis/TransferFunction.java
@@ -190,7 +190,7 @@
     // Instance field reads are OK, as long as the field resolves, since the class inliner will
     // just replace the field read by the value of the field.
     FieldResolutionResult resolutionResult = appView.appInfo().resolveField(instanceGet.getField());
-    if (resolutionResult.isSuccessfulResolution()) {
+    if (resolutionResult.isSingleFieldResolutionResult()) {
       // Record that the field is read from the parameter. For class inlining of singletons, this
       // parameter is only eligible for class inlining if the singleton's field value is known.
       return state.rebuildParameter(
@@ -217,7 +217,7 @@
     }
 
     FieldResolutionResult resolutionResult = appView.appInfo().resolveField(instancePut.getField());
-    if (resolutionResult.isSuccessfulResolution()) {
+    if (resolutionResult.isSingleFieldResolutionResult()) {
       return state.rebuildParameter(objectRoot, (context, usage) -> usage.setParameterMutated());
     } else {
       return state.abandonClassInliningInCurrentContexts(objectRoot);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java
index c8c21eb..40ccc32 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxerImpl.java
@@ -376,7 +376,7 @@
     DexProgramClass enumClass = getEnumUnboxingCandidateOrNull(field.holder);
     if (enumClass != null) {
       FieldResolutionResult resolutionResult = appView.appInfo().resolveField(field, context);
-      if (resolutionResult.isSuccessfulResolution()) {
+      if (resolutionResult.isSingleFieldResolutionResult()) {
         eligibleEnums.add(enumClass.getType());
       } else {
         markEnumAsUnboxable(Reason.UNRESOLVABLE_FIELD, enumClass);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
index 0214979..c054329 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/enums/EnumUnboxingTreeFixer.java
@@ -18,7 +18,6 @@
 import com.android.tools.r8.graph.DexProto;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.DexValue;
-import com.android.tools.r8.graph.FieldResolutionResult.SuccessfulFieldResolutionResult;
 import com.android.tools.r8.graph.GraphLens.MethodLookupResult;
 import com.android.tools.r8.graph.MethodAccessFlags;
 import com.android.tools.r8.graph.ProgramField;
@@ -398,11 +397,9 @@
             continue;
           }
 
-          SuccessfulFieldResolutionResult resolutionResult =
-              appView.appInfo().resolveField(rewrittenField).asSuccessfulResolution();
-          if (resolutionResult != null
-              && resolutionResult.getResolvedHolder().isProgramClass()
-              && isPrunedAfterEnumUnboxing(resolutionResult.getProgramField(), enumData)) {
+          ProgramField programField =
+              appView.appInfo().resolveField(rewrittenField).getSingleProgramField();
+          if (programField != null && isPrunedAfterEnumUnboxing(programField, enumData)) {
             instructionIterator.removeOrReplaceByDebugLocalRead();
           }
         }
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 f6aa6ad..9faaebc 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
@@ -172,11 +172,6 @@
   }
 
   @Override
-  public boolean triggersClassInitBeforeAnySideEffect() {
-    return UNKNOWN_TRIGGERS_CLASS_INIT_BEFORE_ANY_SIDE_EFFECT;
-  }
-
-  @Override
   public boolean mayHaveSideEffects() {
     return UNKNOWN_MAY_HAVE_SIDE_EFFECTS;
   }
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 473f718..ffcad46 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
@@ -91,8 +91,6 @@
 
   public abstract boolean forceInline();
 
-  public abstract boolean triggersClassInitBeforeAnySideEffect();
-
   public abstract boolean mayHaveSideEffects();
 
   /** Context sensitive version of {@link #mayHaveSideEffects()}. */
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
index 594328f..29a843b 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MethodOptimizationInfoCollector.java
@@ -87,8 +87,6 @@
 import com.android.tools.r8.ir.conversion.IRConverter;
 import com.android.tools.r8.ir.conversion.MethodProcessor;
 import com.android.tools.r8.ir.optimize.DynamicTypeOptimization;
-import com.android.tools.r8.ir.optimize.SimpleDominatingEffectAnalysis;
-import com.android.tools.r8.ir.optimize.SimpleDominatingEffectAnalysis.SimpleEffectAnalysisResult;
 import com.android.tools.r8.ir.optimize.classinliner.analysis.ClassInlinerMethodConstraintAnalysis;
 import com.android.tools.r8.ir.optimize.classinliner.constraint.ClassInlinerMethodConstraint;
 import com.android.tools.r8.ir.optimize.enums.classification.EnumUnboxerMethodClassification;
@@ -142,9 +140,6 @@
     DexEncodedMethod definition = method.getDefinition();
     identifyBridgeInfo(definition, code, feedback, timing);
     analyzeReturns(code, feedback, methodProcessor, timing);
-    if (options.inlinerOptions().enableInlining) {
-      identifyInvokeSemanticsForInlining(definition, code, feedback, timing);
-    }
     if (options.enableClassInlining) {
       computeClassInlinerMethodConstraint(method, code, feedback, timing);
     }
@@ -529,25 +524,6 @@
     return false;
   }
 
-  private void identifyInvokeSemanticsForInlining(
-      DexEncodedMethod method, IRCode code, OptimizationFeedback feedback, Timing timing) {
-    timing.begin("Identify invoke semantics for inlining");
-    identifyInvokeSemanticsForInlining(method, code, feedback);
-    timing.end();
-  }
-
-  private void identifyInvokeSemanticsForInlining(
-      DexEncodedMethod method, IRCode code, OptimizationFeedback feedback) {
-    if (method.isStatic()) {
-      // Identifies if the method preserves class initialization after inlining.
-      SimpleEffectAnalysisResult simpleEffectAnalysisResult =
-          SimpleDominatingEffectAnalysis.triggersClassInitializationBeforeAnyStaticRead(
-              appView, code);
-      feedback.markTriggerClassInitBeforeAnySideEffect(
-          method, simpleEffectAnalysisResult.isSatisfied());
-    }
-  }
-
   /**
    * Returns true if the given code unconditionally triggers an expected effect before anything
    * else, false otherwise.
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/MutableMethodOptimizationInfo.java b/src/main/java/com/android/tools/r8/ir/optimize/info/MutableMethodOptimizationInfo.java
index 2cffcc0..b810885 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/MutableMethodOptimizationInfo.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/MutableMethodOptimizationInfo.java
@@ -92,7 +92,7 @@
   private static final int NEVER_RETURNS_NORMALLY_FLAG = 0x40;
   private static final int UNUSED_FLAG_2 = 0x80;
   private static final int UNUSED_FLAG_3 = 0x100;
-  private static final int TRIGGERS_CLASS_INIT_BEFORE_ANY_SIDE_EFFECT_FLAG = 0x200;
+  private static final int UNUSED_FLAG_4 = 0x200;
   private static final int INITIALIZER_ENABLING_JAVA_ASSERTIONS_FLAG = 0x400;
   private static final int REACHABILITY_SENSITIVE_FLAG = 0x800;
   private static final int RETURN_VALUE_HAS_BEEN_PROPAGATED_FLAG = 0x1000;
@@ -119,9 +119,7 @@
         BooleanUtils.intValue(defaultOptInfo.neverReturnsNormally()) * NEVER_RETURNS_NORMALLY_FLAG;
     defaultFlags |= 0 * UNUSED_FLAG_2;
     defaultFlags |= 0 * UNUSED_FLAG_3;
-    defaultFlags |=
-        BooleanUtils.intValue(defaultOptInfo.triggersClassInitBeforeAnySideEffect())
-            * TRIGGERS_CLASS_INIT_BEFORE_ANY_SIDE_EFFECT_FLAG;
+    defaultFlags |= 0 * UNUSED_FLAG_4;
     defaultFlags |=
         BooleanUtils.intValue(defaultOptInfo.isInitializerEnablingJavaVmAssertions())
             * INITIALIZER_ENABLING_JAVA_ASSERTIONS_FLAG;
@@ -497,11 +495,6 @@
   }
 
   @Override
-  public boolean triggersClassInitBeforeAnySideEffect() {
-    return isFlagSet(TRIGGERS_CLASS_INIT_BEFORE_ANY_SIDE_EFFECT_FLAG);
-  }
-
-  @Override
   public boolean mayHaveSideEffects() {
     return isFlagSet(MAY_HAVE_SIDE_EFFECT_FLAG);
   }
@@ -675,14 +668,6 @@
     }
   }
 
-  void markTriggerClassInitBeforeAnySideEffect(boolean mark) {
-    setFlag(TRIGGERS_CLASS_INIT_BEFORE_ANY_SIDE_EFFECT_FLAG, mark);
-  }
-
-  void unsetTriggerClassInitBeforeAnySideEffect() {
-    clearFlag(TRIGGERS_CLASS_INIT_BEFORE_ANY_SIDE_EFFECT_FLAG);
-  }
-
   // TODO(b/140214568): Should be package-private.
   public void markAsPropagated() {
     setFlag(RETURN_VALUE_HAS_BEEN_PROPAGATED_FLAG);
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java
index 4b6241a..65b9aaa 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackDelayed.java
@@ -229,12 +229,6 @@
   }
 
   @Override
-  public synchronized void markTriggerClassInitBeforeAnySideEffect(
-      DexEncodedMethod method, boolean mark) {
-    getMethodOptimizationInfoForUpdating(method).markTriggerClassInitBeforeAnySideEffect(mark);
-  }
-
-  @Override
   public synchronized void setBridgeInfo(DexEncodedMethod method, BridgeInfo bridgeInfo) {
     getMethodOptimizationInfoForUpdating(method).setBridgeInfo(bridgeInfo);
   }
@@ -390,11 +384,6 @@
   }
 
   @Override
-  public synchronized void unsetTriggerClassInitBeforeAnySideEffect(ProgramMethod method) {
-    getMethodOptimizationInfoForUpdating(method).unsetTriggerClassInitBeforeAnySideEffect();
-  }
-
-  @Override
   public synchronized void unsetUnusedArguments(ProgramMethod method) {
     getMethodOptimizationInfoForUpdating(method).unsetUnusedArguments();
   }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackIgnore.java b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackIgnore.java
index ac66916..d15bb00 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackIgnore.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackIgnore.java
@@ -94,9 +94,6 @@
   public void markProcessed(DexEncodedMethod method, ConstraintWithTarget state) {}
 
   @Override
-  public void markTriggerClassInitBeforeAnySideEffect(DexEncodedMethod method, boolean mark) {}
-
-  @Override
   public void setBridgeInfo(DexEncodedMethod method, BridgeInfo bridgeInfo) {}
 
   @Override
@@ -191,8 +188,5 @@
   public void unsetSimpleInliningConstraint(ProgramMethod method) {}
 
   @Override
-  public void unsetTriggerClassInitBeforeAnySideEffect(ProgramMethod method) {}
-
-  @Override
   public void unsetUnusedArguments(ProgramMethod method) {}
 }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackSimple.java b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackSimple.java
index 1b54d1f..a9e3cba 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackSimple.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/info/OptimizationFeedbackSimple.java
@@ -137,11 +137,6 @@
     method.markProcessed(state);
   }
 
-  @Override
-  public void markTriggerClassInitBeforeAnySideEffect(DexEncodedMethod method, boolean mark) {
-    // Ignored.
-  }
-
   public void setArgumentInfos(ProgramMethod method, CallSiteOptimizationInfo argumentInfos) {
     method.getDefinition().getMutableOptimizationInfo().setArgumentInfos(argumentInfos);
   }
@@ -333,12 +328,6 @@
   }
 
   @Override
-  public void unsetTriggerClassInitBeforeAnySideEffect(ProgramMethod method) {
-    withMutableMethodOptimizationInfo(
-        method, MutableMethodOptimizationInfo::unsetTriggerClassInitBeforeAnySideEffect);
-  }
-
-  @Override
   public void unsetUnusedArguments(ProgramMethod method) {
     withMutableMethodOptimizationInfo(method, MutableMethodOptimizationInfo::unsetUnusedArguments);
   }
diff --git a/src/main/java/com/android/tools/r8/ir/synthetic/DesugaredLibraryAPIConversionCfCodeProvider.java b/src/main/java/com/android/tools/r8/ir/synthetic/DesugaredLibraryAPIConversionCfCodeProvider.java
index dfe017a..6a20d01 100644
--- a/src/main/java/com/android/tools/r8/ir/synthetic/DesugaredLibraryAPIConversionCfCodeProvider.java
+++ b/src/main/java/com/android/tools/r8/ir/synthetic/DesugaredLibraryAPIConversionCfCodeProvider.java
@@ -120,7 +120,7 @@
 
       DexType returnType = forwardMethod.proto.returnType;
       DexType forwardMethodReturnType =
-          appView.rewritePrefix.hasRewrittenType(returnType, appView)
+          appView.typeRewriter.hasRewrittenType(returnType, appView)
               ? vivifiedTypeFor(returnType)
               : returnType;
 
diff --git a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataEnqueuerExtension.java b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataEnqueuerExtension.java
index e95253c..2a3698b 100644
--- a/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataEnqueuerExtension.java
+++ b/src/main/java/com/android/tools/r8/kotlin/KotlinMetadataEnqueuerExtension.java
@@ -7,7 +7,9 @@
 import static com.android.tools.r8.kotlin.KotlinClassMetadataReader.hasKotlinClassMetadataAnnotation;
 import static com.android.tools.r8.kotlin.KotlinMetadataUtils.getNoKotlinInfo;
 
+import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.ClassResolutionResult;
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexEncodedMember;
@@ -152,6 +154,11 @@
     }
 
     @Override
+    public ClassResolutionResult contextIndependentDefinitionForWithResolutionResult(DexType type) {
+      throw new Unreachable("Not yet used");
+    }
+
+    @Override
     public DexClass definitionFor(DexType type) {
       // TODO(b/157700128) Metadata cannot at this point keep anything alive. Therefore, if a type
       //  has been pruned it may still be referenced, so we do an early check here to ensure it will
diff --git a/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java b/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
index ca54e1b..9a801b9 100644
--- a/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/ClassNameMinifier.java
@@ -11,12 +11,13 @@
 
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClass;
-import com.android.tools.r8.graph.DexEncodedField;
-import com.android.tools.r8.graph.DexEncodedMethod;
+import com.android.tools.r8.graph.DexClassAndField;
+import com.android.tools.r8.graph.DexClassAndMethod;
 import com.android.tools.r8.graph.DexProto;
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.InnerClassAttribute;
+import com.android.tools.r8.graph.ProgramOrClasspathClass;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.InternalOptions;
@@ -35,7 +36,7 @@
 
   private final AppView<AppInfoWithLiveness> appView;
   private final ClassNamingStrategy classNamingStrategy;
-  private final Iterable<? extends DexClass> classes;
+  private final Iterable<? extends ProgramOrClasspathClass> classes;
   private final Set<String> usedTypeNames = Sets.newHashSet();
   private final Map<DexType, DexString> renaming = Maps.newIdentityHashMap();
   private final Map<String, Namespace> states = new HashMap<>();
@@ -48,7 +49,7 @@
   ClassNameMinifier(
       AppView<AppInfoWithLiveness> appView,
       ClassNamingStrategy classNamingStrategy,
-      Iterable<? extends DexClass> classes) {
+      Iterable<? extends ProgramOrClasspathClass> classes) {
     this.appView = appView;
     this.classNamingStrategy = classNamingStrategy;
     this.classes = classes;
@@ -86,11 +87,11 @@
   ClassRenaming computeRenaming(Timing timing) {
     // Collect names we have to keep.
     timing.begin("reserve");
-    for (DexClass clazz : classes) {
-      DexString descriptor = classNamingStrategy.reservedDescriptor(clazz.type);
+    for (ProgramOrClasspathClass clazz : classes) {
+      DexString descriptor = classNamingStrategy.reservedDescriptor(clazz.getType());
       if (descriptor != null) {
-        assert !renaming.containsKey(clazz.type);
-        registerClassAsUsed(clazz.type, descriptor);
+        assert !renaming.containsKey(clazz.getType());
+        registerClassAsUsed(clazz.getType(), descriptor);
       }
     }
     appView
@@ -100,24 +101,17 @@
     timing.end();
 
     timing.begin("rename-classes");
-    for (DexClass clazz : classes) {
-      if (!renaming.containsKey(clazz.type)) {
-        DexString renamed = computeName(clazz.type);
-        renaming.put(clazz.type, renamed);
-        // If the class is a member class and it has used $ separator, its renamed name should have
-        // the same separator (as long as inner-class attribute is honored).
-        assert !keepInnerClassStructure
-            || !clazz.isMemberClass()
-            || !clazz.type.getInternalName().contains(String.valueOf(INNER_CLASS_SEPARATOR))
-            || renamed.toString().contains(String.valueOf(INNER_CLASS_SEPARATOR))
-            || classNamingStrategy.isRenamedByApplyMapping(clazz.type)
-                : clazz.toSourceString() + " -> " + renamed;
+    for (ProgramOrClasspathClass clazz : classes) {
+      if (!renaming.containsKey(clazz.getType())) {
+        DexString renamed = computeName(clazz.getType());
+        renaming.put(clazz.getType(), renamed);
+        assert verifyMemberRenamingOfInnerClasses(clazz.asDexClass(), renamed);
       }
     }
     timing.end();
 
     timing.begin("rename-dangling-types");
-    for (DexClass clazz : classes) {
+    for (ProgramOrClasspathClass clazz : classes) {
       renameDanglingTypes(clazz);
     }
     timing.end();
@@ -125,6 +119,18 @@
     return new ClassRenaming(Collections.unmodifiableMap(renaming), getPackageRenaming());
   }
 
+  private boolean verifyMemberRenamingOfInnerClasses(DexClass clazz, DexString renamed) {
+    // If the class is a member class and it has used $ separator, its renamed name should have
+    // the same separator (as long as inner-class attribute is honored).
+    assert !keepInnerClassStructure
+            || !clazz.isMemberClass()
+            || !clazz.getType().getInternalName().contains(String.valueOf(INNER_CLASS_SEPARATOR))
+            || renamed.toString().contains(String.valueOf(INNER_CLASS_SEPARATOR))
+            || classNamingStrategy.isRenamedByApplyMapping(clazz.getType())
+        : clazz + " -> " + renamed;
+    return true;
+  }
+
   private Map<String, String> getPackageRenaming() {
     ImmutableMap.Builder<String, String> packageRenaming = ImmutableMap.builder();
     for (Entry<String, Namespace> entry : states.entrySet()) {
@@ -137,16 +143,16 @@
     return packageRenaming.build();
   }
 
-  private void renameDanglingTypes(DexClass clazz) {
-    clazz.forEachMethod(this::renameDanglingTypesInMethod);
-    clazz.forEachField(this::renameDanglingTypesInField);
+  private void renameDanglingTypes(ProgramOrClasspathClass clazz) {
+    clazz.forEachClassMethod(this::renameDanglingTypesInMethod);
+    clazz.forEachClassField(this::renameDanglingTypesInField);
   }
 
-  private void renameDanglingTypesInField(DexEncodedField field) {
+  private void renameDanglingTypesInField(DexClassAndField field) {
     renameDanglingType(field.getReference().type);
   }
 
-  private void renameDanglingTypesInMethod(DexEncodedMethod method) {
+  private void renameDanglingTypesInMethod(DexClassAndMethod method) {
     DexProto proto = method.getReference().proto;
     renameDanglingType(proto.returnType);
     for (DexType type : proto.parameters.values) {
diff --git a/src/main/java/com/android/tools/r8/naming/Minifier.java b/src/main/java/com/android/tools/r8/naming/Minifier.java
index 26c8d70..3bc7392 100644
--- a/src/main/java/com/android/tools/r8/naming/Minifier.java
+++ b/src/main/java/com/android/tools/r8/naming/Minifier.java
@@ -246,7 +246,7 @@
       super(appView.options().getProguardConfiguration().getObfuscationDictionary(), false);
       this.appView = appView;
       this.factory = appView.dexItemFactory();
-      this.desugaredLibraryRenaming = appView.rewritePrefix.isRewriting();
+      this.desugaredLibraryRenaming = appView.typeRewriter.isRewriting();
     }
 
     @Override
@@ -289,7 +289,7 @@
       }
       if (desugaredLibraryRenaming
           && method.isLibraryMethodOverride().isTrue()
-          && appView.rewritePrefix.hasRewrittenTypeInSignature(
+          && appView.typeRewriter.hasRewrittenTypeInSignature(
               method.getReference().proto, appView)) {
         // With desugared library, call-backs names are reserved here.
         return method.getReference().name;
diff --git a/src/main/java/com/android/tools/r8/naming/PrefixRewritingNamingLens.java b/src/main/java/com/android/tools/r8/naming/PrefixRewritingNamingLens.java
index 5ab9772..2add666 100644
--- a/src/main/java/com/android/tools/r8/naming/PrefixRewritingNamingLens.java
+++ b/src/main/java/com/android/tools/r8/naming/PrefixRewritingNamingLens.java
@@ -26,7 +26,7 @@
 
   public static NamingLens createPrefixRewritingNamingLens(
       AppView<?> appView, NamingLens namingLens) {
-    if (!appView.rewritePrefix.isRewriting()) {
+    if (!appView.typeRewriter.isRewriting()) {
       return namingLens;
     }
     return new PrefixRewritingNamingLens(namingLens, appView);
@@ -45,8 +45,8 @@
 
   private DexString getRenaming(DexType type) {
     DexString descriptor = null;
-    if (appView.rewritePrefix.hasRewrittenType(type, appView)) {
-      descriptor = appView.rewritePrefix.rewrittenType(type, appView).descriptor;
+    if (appView.typeRewriter.hasRewrittenType(type, appView)) {
+      descriptor = appView.typeRewriter.rewrittenType(type, appView).descriptor;
     }
     return descriptor;
   }
@@ -106,7 +106,7 @@
   }
 
   private boolean verifyNotPrefixRewrittenPackage(String packageName) {
-    appView.rewritePrefix.forAllRewrittenTypes(
+    appView.typeRewriter.forAllRewrittenTypes(
         dexType -> {
           assert !dexType.getPackageDescriptor().equals(packageName);
         });
diff --git a/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java b/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
index 43cf17d..174614b 100644
--- a/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
+++ b/src/main/java/com/android/tools/r8/naming/ProguardMapMinifier.java
@@ -22,6 +22,7 @@
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.ProgramField;
+import com.android.tools.r8.graph.ProgramOrClasspathClass;
 import com.android.tools.r8.graph.SubtypingInfo;
 import com.android.tools.r8.naming.ClassNameMinifier.ClassRenaming;
 import com.android.tools.r8.naming.FieldNameMinifier.FieldRenaming;
@@ -78,7 +79,7 @@
   private final SeedMapper seedMapper;
   private final BiMap<DexType, DexString> mappedNames = HashBiMap.create();
   // To keep the order deterministic, we sort the classes by their type, which is a unique key.
-  private final Set<DexClass> mappedClasses = Sets.newIdentityHashSet();
+  private final Set<ProgramOrClasspathClass> mappedClasses = Sets.newIdentityHashSet();
   private final Map<DexReference, MemberNaming> memberNames = Maps.newIdentityHashMap();
   private final Map<DexMethod, DexString> defaultInterfaceMethodImplementationNames =
       Maps.newIdentityHashMap();
@@ -193,14 +194,17 @@
     DexClass clazz = appView.definitionFor(type);
 
     // Keep track of classes that needs to get renamed.
-    if (clazz != null && (classNaming != null || clazz.isProgramClass())) {
-      mappedClasses.add(clazz);
+    if (clazz != null) {
+      if (clazz.isClasspathClass() && classNaming != null) {
+        mappedClasses.add(clazz.asClasspathClass());
+      } else if (clazz.isProgramClass()) {
+        mappedClasses.add(clazz.asProgramClass());
+      }
     }
 
     Map<DexReference, MemberNaming> nonPrivateMembers = new IdentityHashMap<>();
 
-    if (classNaming != null) {
-      // TODO(b/133091438) assert that !dexClass.isLibraryClass();
+    if (classNaming != null && (clazz == null || !clazz.isLibraryClass())) {
       DexString mappedName = factory.createString(classNaming.renamedName);
       checkAndAddMappedNames(type, mappedName, classNaming.position);
       classNaming.forAllMemberNaming(
diff --git a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
index 89ac4ce..b933b4d 100644
--- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
+++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingAnalysis.java
@@ -17,7 +17,6 @@
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.FieldAccessInfoCollection;
-import com.android.tools.r8.graph.FieldResolutionResult.SuccessfulFieldResolutionResult;
 import com.android.tools.r8.graph.LibraryMethod;
 import com.android.tools.r8.graph.MethodAccessInfoCollection;
 import com.android.tools.r8.graph.MethodResolutionResult;
@@ -541,12 +540,15 @@
                   }
 
                   private void registerFieldReference(DexField field) {
-                    SuccessfulFieldResolutionResult resolutionResult =
-                        appView.appInfo().resolveField(field).asSuccessfulResolution();
-                    if (resolutionResult != null
-                        && resolutionResult.getResolvedField().getReference() != field) {
-                      nonReboundFieldReferences.add(field);
-                    }
+                    appView
+                        .appInfo()
+                        .resolveField(field)
+                        .forEachSuccessfulFieldResolutionResult(
+                            resolutionResult -> {
+                              if (resolutionResult.getResolvedField().getReference() != field) {
+                                nonReboundFieldReferences.add(field);
+                              }
+                            });
                   }
 
                   @Override
diff --git a/src/main/java/com/android/tools/r8/optimize/MemberRebindingIdentityLensFactory.java b/src/main/java/com/android/tools/r8/optimize/MemberRebindingIdentityLensFactory.java
index 8995b69..1363a68 100644
--- a/src/main/java/com/android/tools/r8/optimize/MemberRebindingIdentityLensFactory.java
+++ b/src/main/java/com/android/tools/r8/optimize/MemberRebindingIdentityLensFactory.java
@@ -14,7 +14,6 @@
 import com.android.tools.r8.graph.FieldAccessInfoCollection;
 import com.android.tools.r8.graph.FieldAccessInfoCollectionImpl;
 import com.android.tools.r8.graph.FieldAccessInfoImpl;
-import com.android.tools.r8.graph.FieldResolutionResult.SuccessfulFieldResolutionResult;
 import com.android.tools.r8.graph.MethodAccessInfoCollection;
 import com.android.tools.r8.graph.MethodResolutionResult.SingleResolutionResult;
 import com.android.tools.r8.graph.ProgramMethod;
@@ -148,31 +147,36 @@
       if (!seenFieldReferences.add(field)) {
         return;
       }
-      SuccessfulFieldResolutionResult resolutionResult =
-          appInfo.resolveField(field).asSuccessfulResolution();
-      if (resolutionResult == null) {
-        return;
-      }
-      DexField reboundReference = resolutionResult.getResolvedField().getReference();
-      if (field == reboundReference) {
-        // For the purpose of member rebinding, we don't care about already rebound references.
-        return;
-      }
-      FieldAccessInfoImpl fieldAccessInfo =
-          fieldAccessInfoCollection.computeIfAbsent(reboundReference, FieldAccessInfoImpl::new);
-      synchronized (fieldAccessInfo) {
-        // Record the fact that there is a non-rebound access to the given field. We don't
-        // distinguish between non-rebound reads and writes, so we just record it as a read.
-        if (fieldAccessInfo.getReadsWithContexts().isBottom()) {
-          fieldAccessInfo.setReadsWithContexts(new ConcreteAccessContexts());
-        } else {
-          assert fieldAccessInfo.getReadsWithContexts().isConcrete();
-        }
-        // For the purpose of member rebinding, we don't care about the access contexts, so we
-        // simply use the empty set.
-        ConcreteAccessContexts accessContexts = fieldAccessInfo.getReadsWithContexts().asConcrete();
-        accessContexts.getAccessesWithContexts().put(field, ProgramMethodSet.empty());
-      }
+      appInfo
+          .resolveField(field)
+          .forEachSuccessfulFieldResolutionResult(
+              resolutionResult -> {
+                DexField reboundReference = resolutionResult.getResolvedField().getReference();
+                if (field == reboundReference) {
+                  // For the purpose of member rebinding, we don't care about already rebound
+                  // references.
+                  return;
+                }
+                FieldAccessInfoImpl fieldAccessInfo =
+                    fieldAccessInfoCollection.computeIfAbsent(
+                        reboundReference, FieldAccessInfoImpl::new);
+                synchronized (fieldAccessInfo) {
+                  // Record the fact that there is a non-rebound access to the given field. We don't
+                  // distinguish between non-rebound reads and writes, so we just record it as a
+                  // read.
+                  if (fieldAccessInfo.getReadsWithContexts().isBottom()) {
+                    fieldAccessInfo.setReadsWithContexts(new ConcreteAccessContexts());
+                  } else {
+                    assert fieldAccessInfo.getReadsWithContexts().isConcrete();
+                  }
+                  // For the purpose of member rebinding, we don't care about the access contexts,
+                  // so we
+                  // simply use the empty set.
+                  ConcreteAccessContexts accessContexts =
+                      fieldAccessInfo.getReadsWithContexts().asConcrete();
+                  accessContexts.getAccessesWithContexts().put(field, ProgramMethodSet.empty());
+                }
+              });
     }
 
     @Override
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorMethodReprocessingEnqueuer.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorMethodReprocessingEnqueuer.java
index 42537e8..6e6e88c 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorMethodReprocessingEnqueuer.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagatorMethodReprocessingEnqueuer.java
@@ -224,11 +224,11 @@
 
     private void registerFieldAccess(DexField field) {
       FieldResolutionResult resolutionResult = appView.appInfo().resolveField(field);
-      if (resolutionResult.getProgramField() == null) {
+      if (resolutionResult.getSingleProgramField() == null) {
         return;
       }
 
-      ProgramField resolvedField = resolutionResult.getProgramField();
+      ProgramField resolvedField = resolutionResult.getSingleProgramField();
       DexField rewrittenFieldReference =
           graphLens.internalGetNextFieldSignature(resolvedField.getReference());
       if (rewrittenFieldReference != resolvedField.getReference()) {
diff --git a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/lenscoderewriter/NullCheckInserter.java b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/lenscoderewriter/NullCheckInserter.java
index 2ffbf8d..e0341ae 100644
--- a/src/main/java/com/android/tools/r8/optimize/argumentpropagation/lenscoderewriter/NullCheckInserter.java
+++ b/src/main/java/com/android/tools/r8/optimize/argumentpropagation/lenscoderewriter/NullCheckInserter.java
@@ -199,7 +199,7 @@
         // This needs to map the field all the way to the final graph lens.
         DexField rewrittenField = appView.graphLens().lookupField(field, graphLens);
         FieldResolutionResult resolutionResult = appView.appInfo().resolveField(rewrittenField);
-        return resolutionResult.isSuccessfulResolution()
+        return resolutionResult.isSingleFieldResolutionResult()
             && !appView.appInfo().isFieldRead(resolutionResult.getResolvedField());
       }
       return false;
diff --git a/src/main/java/com/android/tools/r8/optimize/proto/ProtoNormalizer.java b/src/main/java/com/android/tools/r8/optimize/proto/ProtoNormalizer.java
index 2b49179..29ed273 100644
--- a/src/main/java/com/android/tools/r8/optimize/proto/ProtoNormalizer.java
+++ b/src/main/java/com/android/tools/r8/optimize/proto/ProtoNormalizer.java
@@ -4,21 +4,32 @@
 
 package com.android.tools.r8.optimize.proto;
 
+import static com.android.tools.r8.utils.MapUtils.ignoreKey;
+
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexMethodSignature;
 import com.android.tools.r8.graph.DexProgramClass;
+import com.android.tools.r8.graph.DexString;
+import com.android.tools.r8.graph.DexTypeList;
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.ThreadUtils;
 import com.android.tools.r8.utils.Timing;
 import com.android.tools.r8.utils.collections.BidirectionalOneToOneHashMap;
-import com.android.tools.r8.utils.collections.BidirectionalOneToOneMap;
 import com.android.tools.r8.utils.collections.DexMethodSignatureSet;
 import com.android.tools.r8.utils.collections.MutableBidirectionalOneToOneMap;
-import java.util.ArrayList;
-import java.util.List;
+import com.google.common.collect.Sets;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Iterator;
+import java.util.Map;
+import java.util.Set;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
 
 public class ProtoNormalizer {
@@ -33,35 +44,36 @@
     this.options = appView.options();
   }
 
-  public void run(ExecutorService executorService, Timing timing) {
+  public void run(ExecutorService executorService, Timing timing) throws ExecutionException {
     if (options.testing.enableExperimentalProtoNormalization) {
       timing.time("Proto normalization", () -> run(executorService));
     }
   }
 
-  // TODO(b/195112263): Parallelize using executor service.
-  private void run(ExecutorService executorService) {
-    // Compute mapping from method signatures to new method signatures.
-    BidirectionalOneToOneMap<DexMethodSignature, DexMethodSignature> normalization =
-        computeNormalization();
+  private void run(ExecutorService executorService) throws ExecutionException {
+    GlobalReservationState globalReservationState = computeGlobalReservationState(executorService);
 
+    // TODO(b/173398086): This uses a single LocalReservationState for the entire program. This
+    //  should process the strongly connected program components in parallel, each with their own
+    //  LocalReservationState.
+    LocalReservationState localReservationState = new LocalReservationState();
     ProtoNormalizerGraphLens.Builder lensBuilder = ProtoNormalizerGraphLens.builder(appView);
-    for (DexProgramClass clazz : appView.appInfo().classes()) {
+    for (DexProgramClass clazz : appView.appInfo().classesWithDeterministicOrder()) {
       clazz
           .getMethodCollection()
           .replaceMethods(
               method -> {
                 DexMethodSignature methodSignature = method.getSignature();
-                assert normalization.containsKey(methodSignature);
-                DexMethodSignature normalizedMethodSignature = normalization.get(methodSignature);
-                if (methodSignature.equals(normalizedMethodSignature)) {
+                DexMethodSignature newMethodSignature =
+                    localReservationState.getNewMethodSignature(
+                        methodSignature, dexItemFactory, globalReservationState);
+                if (methodSignature.equals(newMethodSignature)) {
                   return method;
                 }
-                DexMethod normalizedMethodReference =
-                    normalizedMethodSignature.withHolder(clazz, dexItemFactory);
-                lensBuilder.recordNewMethodSignature(method, normalizedMethodReference);
+                DexMethod newMethodReference = newMethodSignature.withHolder(clazz, dexItemFactory);
+                lensBuilder.recordNewMethodSignature(method, newMethodReference);
                 // TODO(b/195112263): Fixup any optimization info and parameter annotations.
-                return method.toTypeSubstitutedMethod(normalizedMethodReference);
+                return method.toTypeSubstitutedMethod(newMethodReference);
               });
     }
 
@@ -70,57 +82,180 @@
     }
   }
 
-  // TODO(b/195112263): This naively maps each method signatures to their normalized method
-  //  signature if it is not already reserved by another method. This means that we will rewrite
-  //  foo(A,B), bar(B,A), and baz(B,A) into foo(A,B), bar(A,B), and baz(A,B), such that all of the
-  //  method signatures share the same parameter type list. However, if there is a method foo(A,B)
-  //  and foo(B,A) then this does not rewrite foo(B,A) into foo(A,B). If foo(B,A) is not in the same
-  //  hierarchy as foo(A,B), this would be possible, however.
-  // TODO(b/195112263): Do not optimize foo(B, A) into foo(A, B) if this won't lead to any parameter
-  //  type lists being shared (e.g., if foo(B, A) is the only method where sorted(parameters) is
-  //  [A, B]).
-  private BidirectionalOneToOneMap<DexMethodSignature, DexMethodSignature> computeNormalization() {
-    // Reserve the signatures of unoptimizable methods to avoid collisions.
-    MutableBidirectionalOneToOneMap<DexMethodSignature, DexMethodSignature> normalization =
-        new BidirectionalOneToOneHashMap<>();
-    DexMethodSignatureSet optimizableMethodSignatures = DexMethodSignatureSet.create();
-    for (DexProgramClass clazz : appView.appInfo().classes()) {
-      clazz.forEachProgramMethod(
-          method -> {
-            DexMethodSignature methodSignature = method.getMethodSignature();
-            if (isUnoptimizable(method)) {
-              normalization.put(methodSignature, methodSignature);
-            } else if (!normalization.containsKey(methodSignature)) {
-              optimizableMethodSignatures.add(methodSignature);
-            }
-          });
+  private GlobalReservationState computeGlobalReservationState(ExecutorService executorService)
+      throws ExecutionException {
+    // Tracks how many different parameter lists can be optimized into the same parameter list.
+    // If only (B, A) can be rewritten into (A, B), then there is no need to rewrite parameter lists
+    // on the form (B, A) into (A, B), as that won't lead to any sharing of parameter lists.
+    Map<DexTypeList, Set<DexTypeList>> optimizableParameterLists = new ConcurrentHashMap<>();
+
+    // Used to track if a given parameter list should be mapped to a specific permutation instead of
+    // just sorting the parameter list. This is used to ensure that we will rewrite parameter lists
+    // such as (A, B) into (B, A) if there is an unoptimizable method with parameter list (B, A).
+    Map<DexTypeList, Set<DexTypeList>> reservedParameterLists = new ConcurrentHashMap<>();
+
+    // Tracks the set of unoptimizable method signatures. These must remain as-is.
+    DexMethodSignatureSet unoptimizableSignatures = DexMethodSignatureSet.createConcurrent();
+
+    ThreadUtils.processMethods(
+        appView,
+        method ->
+            computeReservationsFromMethod(
+                method, optimizableParameterLists, reservedParameterLists, unoptimizableSignatures),
+        executorService);
+
+    // Reserve parameter lists that won't lead to any sharing after normalization. Any method with
+    // such a parameter list must remain as-is.
+    Set<DexTypeList> unoptimizableParameterLists = new HashSet<>();
+    optimizableParameterLists.forEach(
+        (sortedParameters, parameterListsBeforeNormalization) -> {
+          int size = parameterListsBeforeNormalization.size();
+          if (size != 1) {
+            // There are multiple optimizable methods with different parameter lists that can be
+            // rewritten into having the same parameter list.
+            assert size > 1;
+            return;
+          }
+          DexTypeList parameters = parameterListsBeforeNormalization.iterator().next();
+          Set<DexTypeList> reservedParameters =
+              reservedParameterLists.getOrDefault(sortedParameters, Collections.emptySet());
+          if (!reservedParameters.isEmpty() && !reservedParameters.contains(parameters)) {
+            // There is at least one optimizable method that can be rewritten into having the same
+            // parameter list as an unoptimizable method.
+            return;
+          }
+          unoptimizableParameterLists.add(parameters);
+        });
+
+    ThreadUtils.processMethods(
+        appView,
+        method ->
+            computeExtraReservationsFromMethod(
+                method, unoptimizableParameterLists, unoptimizableSignatures),
+        executorService);
+
+    return new GlobalReservationState(reservedParameterLists, unoptimizableSignatures);
+  }
+
+  private void computeReservationsFromMethod(
+      ProgramMethod method,
+      Map<DexTypeList, Set<DexTypeList>> optimizableParameterLists,
+      Map<DexTypeList, Set<DexTypeList>> reservedParameterLists,
+      DexMethodSignatureSet unoptimizableSignatures) {
+    if (isUnoptimizable(method)) {
+      // Record that other optimizable methods with the same set of parameter types should be
+      // rewritten to have the same parameter list as this method.
+      reservedParameterLists
+          .computeIfAbsent(
+              method.getParameters().getSorted(), ignoreKey(Sets::newConcurrentHashSet))
+          .add(method.getParameters());
+
+      // Mark signature as unoptimizable.
+      unoptimizableSignatures.add(method);
+    } else {
+      // Record that the method's parameter list can be rewritten into any permutation.
+      optimizableParameterLists
+          .computeIfAbsent(
+              method.getParameters().getSorted(), ignoreKey(Sets::newConcurrentHashSet))
+          .add(method.getParameters());
     }
-    optimizableMethodSignatures.removeAll(normalization.keySet());
+  }
 
-    // Normalize each signature that is subject to optimization.
-    List<DexMethodSignature> sortedOptimizableMethodSignatures =
-        new ArrayList<>(optimizableMethodSignatures);
-    sortedOptimizableMethodSignatures.sort(DexMethodSignature::compareTo);
-
-    for (DexMethodSignature signature : sortedOptimizableMethodSignatures) {
-      assert !normalization.containsKey(signature);
-      assert !normalization.containsValue(signature);
-      DexMethodSignature normalizedSignature =
-          signature.withProto(
-              dexItemFactory.createProto(
-                  signature.getReturnType(), signature.getParameters().getSorted()));
-      if (normalization.containsValue(normalizedSignature)) {
-        normalization.put(signature, signature);
-      } else {
-        normalization.put(signature, normalizedSignature);
-      }
+  private void computeExtraReservationsFromMethod(
+      ProgramMethod method,
+      Set<DexTypeList> unoptimizableParameterLists,
+      DexMethodSignatureSet unoptimizableSignatures) {
+    if (unoptimizableParameterLists.contains(method.getParameters())) {
+      unoptimizableSignatures.add(method.getMethodSignature());
     }
-
-    return normalization;
   }
 
   private boolean isUnoptimizable(ProgramMethod method) {
     // TODO(b/195112263): This is incomplete.
-    return appView.getKeepInfo(method).isPinned(options);
+    return appView.getKeepInfo(method).isPinned(options)
+        || method.getDefinition().isLibraryMethodOverride().isPossiblyTrue();
+  }
+
+  static class GlobalReservationState {
+
+    // Used to track if a given parameter list should be mapped to a specific permutation instead of
+    // just sorting the parameter list. This is used to ensure that we will rewrite parameter lists
+    // such as (A, B) into (B, A) if there is an unoptimizable method with parameter list (B, A).
+    Map<DexTypeList, DexTypeList> reservedParameters;
+
+    // Tracks the set of unoptimizable method signatures. These must remain as-is.
+    DexMethodSignatureSet unoptimizableSignatures;
+
+    GlobalReservationState(
+        Map<DexTypeList, Set<DexTypeList>> reservedParameterLists,
+        DexMethodSignatureSet unoptimizableSignatures) {
+      this.reservedParameters = selectDeterministicTarget(reservedParameterLists);
+      this.unoptimizableSignatures = unoptimizableSignatures;
+    }
+
+    private static Map<DexTypeList, DexTypeList> selectDeterministicTarget(
+        Map<DexTypeList, Set<DexTypeList>> reservedParameterLists) {
+      Map<DexTypeList, DexTypeList> result = new HashMap<>();
+      reservedParameterLists.forEach(
+          (sortedParameters, candidates) -> {
+            Iterator<DexTypeList> iterator = candidates.iterator();
+            DexTypeList smallestCandidate = iterator.next();
+            while (iterator.hasNext()) {
+              DexTypeList candidate = iterator.next();
+              if (candidate.compareTo(smallestCandidate) < 0) {
+                smallestCandidate = candidate;
+              }
+            }
+            result.put(sortedParameters, smallestCandidate);
+          });
+      return result;
+    }
+
+    DexTypeList getReservedParameters(DexMethodSignature methodSignature) {
+      DexTypeList sortedParameters = methodSignature.getParameters().getSorted();
+      return reservedParameters.getOrDefault(sortedParameters, sortedParameters);
+    }
+
+    boolean isUnoptimizable(DexMethodSignature methodSignature) {
+      return unoptimizableSignatures.contains(methodSignature);
+    }
+  }
+
+  static class LocalReservationState {
+
+    MutableBidirectionalOneToOneMap<DexMethodSignature, DexMethodSignature> newMethodSignatures =
+        new BidirectionalOneToOneHashMap<>();
+
+    // TODO: avoid sorting multiple times.
+    DexMethodSignature getNewMethodSignature(
+        DexMethodSignature methodSignature,
+        DexItemFactory dexItemFactory,
+        GlobalReservationState globalReservationState) {
+      if (globalReservationState.isUnoptimizable(methodSignature)) {
+        assert !newMethodSignatures.containsKey(methodSignature);
+        return methodSignature;
+      }
+      DexMethodSignature reservedSignature = newMethodSignatures.get(methodSignature);
+      if (reservedSignature != null) {
+        assert reservedSignature
+            .getParameters()
+            .equals(globalReservationState.getReservedParameters(methodSignature));
+        return reservedSignature;
+      }
+      DexTypeList reservedParameters =
+          globalReservationState.getReservedParameters(methodSignature);
+      DexMethodSignature newMethodSignature =
+          methodSignature.withParameters(reservedParameters, dexItemFactory);
+      if (newMethodSignatures.containsValue(newMethodSignature)) {
+        int index = 1;
+        String newMethodBaseName = methodSignature.getName().toString();
+        do {
+          DexString newMethodName = dexItemFactory.createString(newMethodBaseName + "$" + index);
+          newMethodSignature = newMethodSignature.withName(newMethodName);
+        } while (newMethodSignatures.containsValue(newMethodSignature));
+      }
+      newMethodSignatures.put(methodSignature, newMethodSignature);
+      return newMethodSignature;
+    }
   }
 }
diff --git a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
index e156407..8216777 100644
--- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
+++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -665,7 +665,6 @@
             || getMissingClasses().contains(type)
             // TODO(b/150693139): Remove these exceptions once fixed.
             || InterfaceDesugaringSyntheticHelper.isCompanionClassType(type)
-            || InterfaceDesugaringSyntheticHelper.isEmulatedLibraryClassType(type)
             // TODO(b/150736225): Not sure how to remove these.
             || DesugaredLibraryAPIConverter.isVivifiedType(type)
         : "Failed lookup of non-missing type: " + type;
@@ -1215,7 +1214,7 @@
     assert lens.assertDefinitionsNotModified(
         switchMaps.keySet().stream()
             .map(this::resolveField)
-            .filter(FieldResolutionResult::isSuccessfulResolution)
+            .filter(FieldResolutionResult::isSingleFieldResolutionResult)
             .map(FieldResolutionResult::getResolvedField)
             .collect(Collectors.toList()));
 
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index 1622376..8681f33 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -62,6 +62,7 @@
 import com.android.tools.r8.graph.FieldAccessInfoCollectionImpl;
 import com.android.tools.r8.graph.FieldAccessInfoImpl;
 import com.android.tools.r8.graph.FieldResolutionResult;
+import com.android.tools.r8.graph.FieldResolutionResult.FailedOrUnknownFieldResolutionResult;
 import com.android.tools.r8.graph.GenericSignatureEnqueuerAnalysis;
 import com.android.tools.r8.graph.InnerClassAttribute;
 import com.android.tools.r8.graph.InvalidCode;
@@ -317,6 +318,8 @@
    */
   private final Set<ClasspathOrLibraryClass> liveNonProgramTypes = Sets.newIdentityHashSet();
 
+  private final Set<ClasspathOrLibraryClass> referencedNonProgramTypes = Sets.newIdentityHashSet();
+
   /** Set of reachable proto types that will be dead code eliminated. */
   private final Set<DexProgramClass> deadProtoTypeCandidates = Sets.newIdentityHashSet();
 
@@ -602,7 +605,7 @@
       ignoreMissingClass(type);
     } else if (clazz.isNotProgramClass()) {
       addLiveNonProgramType(
-          clazz.asClasspathOrLibraryClass(), this::ignoreMissingClasspathOrLibraryClass);
+          clazz.asClasspathOrLibraryClass(), true, this::ignoreMissingClasspathOrLibraryClass);
     }
   }
 
@@ -697,51 +700,62 @@
 
   private void addLiveNonProgramType(
       ClasspathOrLibraryClass clazz,
+      // TODO(b/216576191): Remove when tracking live library members.
+      boolean visitMembers,
       BiConsumer<DexType, ClasspathOrLibraryDefinition> missingClassConsumer) {
     WorkList<ClasspathOrLibraryClass> worklist =
         WorkList.newIdentityWorkList(clazz, liveNonProgramTypes);
     while (worklist.hasNext()) {
       ClasspathOrLibraryClass definition = worklist.next();
-      processNewLiveNonProgramType(definition, worklist, missingClassConsumer);
+      processNewLiveNonProgramType(definition, worklist, missingClassConsumer, visitMembers);
     }
   }
 
   private void processNewLiveNonProgramType(
       ClasspathOrLibraryClass clazz,
       WorkList<ClasspathOrLibraryClass> worklist,
-      BiConsumer<DexType, ClasspathOrLibraryDefinition> missingClassConsumer) {
+      BiConsumer<DexType, ClasspathOrLibraryDefinition> missingClassConsumer,
+      boolean visitMembers) {
+    ensureMethodsContinueToWidenAccess(clazz);
     if (clazz.isLibraryClass()) {
-      // TODO(b/149201735): This likely needs to apply to classpath too.
-      ensureMethodsContinueToWidenAccess(clazz);
       // Only libraries must not derive program. Classpath classes can, assuming correct keep rules.
       warnIfLibraryTypeInheritsFromProgramType(clazz.asLibraryClass());
     }
-    clazz.forEachClassField(
-        field ->
+    if (visitMembers) {
+      clazz.forEachClassField(
+          field ->
+              addNonProgramClassToWorklist(
+                  field.getType(),
+                  field.asClasspathOrLibraryDefinition(),
+                  referencedNonProgramTypes::add,
+                  missingClassConsumer));
+      clazz.forEachClassMethod(
+          method -> {
+            ClasspathOrLibraryDefinition derivedContext = method.asClasspathOrLibraryDefinition();
             addNonProgramClassToWorklist(
-                field.getType(),
-                field.asClasspathOrLibraryDefinition(),
-                worklist,
-                missingClassConsumer));
-    clazz.forEachClassMethod(
-        method -> {
-          ClasspathOrLibraryDefinition derivedContext = method.asClasspathOrLibraryDefinition();
-          addNonProgramClassToWorklist(
-              method.getReturnType(), derivedContext, worklist, missingClassConsumer);
-          for (DexType parameter : method.getParameters()) {
-            addNonProgramClassToWorklist(parameter, derivedContext, worklist, missingClassConsumer);
-          }
-        });
+                method.getReturnType(),
+                derivedContext,
+                referencedNonProgramTypes::add,
+                missingClassConsumer);
+            for (DexType parameter : method.getParameters()) {
+              addNonProgramClassToWorklist(
+                  parameter, derivedContext, referencedNonProgramTypes::add, missingClassConsumer);
+            }
+          });
+    }
     for (DexType supertype : clazz.allImmediateSupertypes()) {
       addNonProgramClassToWorklist(
-          supertype, clazz.asClasspathOrLibraryDefinition(), worklist, missingClassConsumer);
+          supertype,
+          clazz.asClasspathOrLibraryDefinition(),
+          worklist::addIfNotSeen,
+          missingClassConsumer);
     }
   }
 
   private void addNonProgramClassToWorklist(
       DexType type,
       ClasspathOrLibraryDefinition context,
-      WorkList<ClasspathOrLibraryClass> worklist,
+      Consumer<ClasspathOrLibraryClass> classAdder,
       BiConsumer<DexType, ClasspathOrLibraryDefinition> missingClassConsumer) {
     if (type.isArrayType()) {
       type = type.toBaseType(appView.dexItemFactory());
@@ -753,7 +767,7 @@
     if (clazz == null) {
       missingClassConsumer.accept(type, context);
     } else if (!clazz.isProgramClass()) {
-      worklist.addIfNotSeen(clazz.asClasspathOrLibraryClass());
+      classAdder.accept(clazz.asClasspathOrLibraryClass());
     }
   }
 
@@ -769,7 +783,8 @@
 
   private DexClass getClassOrNullFromReflectiveAccess(DexType type, ProgramDefinition context) {
     // To avoid that we report reflectively accessed types as missing.
-    return definitionFor(type, context, this::recordNonProgramClass, this::ignoreMissingClass);
+    return definitionFor(
+        type, context, this::recordNonProgramClassWithNoMissingReporting, this::ignoreMissingClass);
   }
 
   private DexProgramClass getProgramClassOrNullFromReflectiveAccess(
@@ -1460,49 +1475,52 @@
       return;
     }
 
-    FieldResolutionResult resolutionResult = resolveField(fieldReference, currentMethod);
-    fieldAccessAnalyses.forEach(
-        analysis ->
-            analysis.traceInstanceFieldRead(
-                fieldReference, resolutionResult, currentMethod, workList));
+    resolveField(fieldReference, currentMethod)
+        .visitFieldResolutionResults(
+            resolutionResult -> {
+              fieldAccessAnalyses.forEach(
+                  analysis ->
+                      analysis.traceInstanceFieldRead(
+                          fieldReference, resolutionResult, currentMethod, workList));
 
-    if (resolutionResult.isFailedOrUnknownResolution()) {
-      // Must trace the types from the field reference even if it does not exist.
-      traceFieldReference(fieldReference, resolutionResult, currentMethod);
-      noClassMerging.add(fieldReference.getHolderType());
-      return;
-    }
+              ProgramField field = resolutionResult.getProgramField();
+              if (field == null) {
+                // No need to trace into the non-program code.
+                return;
+              }
 
-    ProgramField field =
-        resolutionResult.asSuccessfulResolution().getResolutionPair().asProgramField();
-    if (field == null) {
-      // No need to trace into the non-program code.
-      return;
-    }
+              assert !mode.isFinalTreeShaking()
+                      || !field.getDefinition().getOptimizationInfo().isDead()
+                  : "Unexpected reference in `"
+                      + currentMethod.toSourceString()
+                      + "` to field marked dead: "
+                      + field.getReference().toSourceString();
 
-    assert !mode.isFinalTreeShaking() || !field.getDefinition().getOptimizationInfo().isDead()
-        : "Unexpected reference in `"
-            + currentMethod.toSourceString()
-            + "` to field marked dead: "
-            + field.getReference().toSourceString();
+              if (readType == FieldReadType.READ_FROM_METHOD_HANDLE) {
+                fieldAccessInfoCollection.get(field.getReference()).setReadFromMethodHandle();
+              } else if (readType == FieldReadType.READ_FROM_RECORD_METHOD_HANDLE) {
+                fieldAccessInfoCollection
+                    .get(field.getReference())
+                    .setReadFromRecordInvokeDynamic();
+              }
 
-    if (readType == FieldReadType.READ_FROM_METHOD_HANDLE) {
-      fieldAccessInfoCollection.get(field.getReference()).setReadFromMethodHandle();
-    } else if (readType == FieldReadType.READ_FROM_RECORD_METHOD_HANDLE) {
-      fieldAccessInfoCollection.get(field.getReference()).setReadFromRecordInvokeDynamic();
-    }
+              if (Log.ENABLED) {
+                Log.verbose(getClass(), "Register Iget `%s`.", fieldReference);
+              }
 
-    if (Log.ENABLED) {
-      Log.verbose(getClass(), "Register Iget `%s`.", fieldReference);
-    }
+              if (field.getReference() != fieldReference) {
+                // Mark the initial resolution holder as live.
+                markTypeAsLive(resolutionResult.getInitialResolutionHolder(), currentMethod);
+              }
 
-    if (field.getReference() != fieldReference) {
-      // Mark the initial resolution holder as live.
-      markTypeAsLive(resolutionResult.getInitialResolutionHolder(), currentMethod);
-    }
-
-    workList.enqueueMarkFieldAsReachableAction(
-        field, currentMethod, KeepReason.fieldReferencedIn(currentMethod));
+              workList.enqueueMarkFieldAsReachableAction(
+                  field, currentMethod, KeepReason.fieldReferencedIn(currentMethod));
+            },
+            failedResolution -> {
+              // Must trace the types from the field reference even if it does not exist.
+              traceFieldReference(fieldReference, failedResolution, currentMethod);
+              noClassMerging.add(fieldReference.getHolderType());
+            });
   }
 
   void traceInstanceFieldWrite(DexField field, ProgramMethod currentMethod) {
@@ -1519,47 +1537,48 @@
       return;
     }
 
-    FieldResolutionResult resolutionResult = resolveField(fieldReference, currentMethod);
-    fieldAccessAnalyses.forEach(
-        analysis ->
-            analysis.traceInstanceFieldWrite(
-                fieldReference, resolutionResult, currentMethod, workList));
+    resolveField(fieldReference, currentMethod)
+        .visitFieldResolutionResults(
+            resolutionResult -> {
+              fieldAccessAnalyses.forEach(
+                  analysis ->
+                      analysis.traceInstanceFieldWrite(
+                          fieldReference, resolutionResult, currentMethod, workList));
 
-    if (resolutionResult.isFailedOrUnknownResolution()) {
-      // Must trace the types from the field reference even if it does not exist.
-      traceFieldReference(fieldReference, resolutionResult, currentMethod);
-      noClassMerging.add(fieldReference.getHolderType());
-      return;
-    }
+              ProgramField field = resolutionResult.getProgramField();
+              if (field == null) {
+                // No need to trace into the non-program code.
+                return;
+              }
 
-    ProgramField field =
-        resolutionResult.asSuccessfulResolution().getResolutionPair().asProgramField();
-    if (field == null) {
-      // No need to trace into the non-program code.
-      return;
-    }
+              assert !mode.isFinalTreeShaking()
+                      || !field.getDefinition().getOptimizationInfo().isDead()
+                  : "Unexpected reference in `"
+                      + currentMethod.toSourceString()
+                      + "` to field marked dead: "
+                      + field.getReference().toSourceString();
 
-    assert !mode.isFinalTreeShaking() || !field.getDefinition().getOptimizationInfo().isDead()
-        : "Unexpected reference in `"
-            + currentMethod.toSourceString()
-            + "` to field marked dead: "
-            + field.getReference().toSourceString();
+              if (fromMethodHandle) {
+                fieldAccessInfoCollection.get(field.getReference()).setWrittenFromMethodHandle();
+              }
 
-    if (fromMethodHandle) {
-      fieldAccessInfoCollection.get(field.getReference()).setWrittenFromMethodHandle();
-    }
+              if (Log.ENABLED) {
+                Log.verbose(getClass(), "Register Iput `%s`.", fieldReference);
+              }
 
-    if (Log.ENABLED) {
-      Log.verbose(getClass(), "Register Iput `%s`.", fieldReference);
-    }
+              if (field.getReference() != fieldReference) {
+                // Mark the initial resolution holder as live.
+                markTypeAsLive(resolutionResult.getInitialResolutionHolder(), currentMethod);
+              }
 
-    if (field.getReference() != fieldReference) {
-      // Mark the initial resolution holder as live.
-      markTypeAsLive(resolutionResult.getInitialResolutionHolder(), currentMethod);
-    }
-
-    KeepReason reason = KeepReason.fieldReferencedIn(currentMethod);
-    workList.enqueueMarkFieldAsReachableAction(field, currentMethod, reason);
+              KeepReason reason = KeepReason.fieldReferencedIn(currentMethod);
+              workList.enqueueMarkFieldAsReachableAction(field, currentMethod, reason);
+            },
+            failedResolution -> {
+              // Must trace the types from the field reference even if it does not exist.
+              traceFieldReference(fieldReference, failedResolution, currentMethod);
+              noClassMerging.add(fieldReference.getHolderType());
+            });
   }
 
   void traceStaticFieldRead(DexField field, ProgramMethod currentMethod) {
@@ -1576,63 +1595,66 @@
       return;
     }
 
-    FieldResolutionResult resolutionResult = resolveField(fieldReference, currentMethod);
-    fieldAccessAnalyses.forEach(
-        analysis ->
-            analysis.traceStaticFieldRead(
-                fieldReference, resolutionResult, currentMethod, workList));
+    resolveField(fieldReference, currentMethod)
+        .visitFieldResolutionResults(
+            resolutionResult -> {
+              fieldAccessAnalyses.forEach(
+                  analysis ->
+                      analysis.traceStaticFieldRead(
+                          fieldReference, resolutionResult, currentMethod, workList));
 
-    if (resolutionResult.isFailedOrUnknownResolution()) {
-      // Must trace the types from the field reference even if it does not exist.
-      traceFieldReference(fieldReference, resolutionResult, currentMethod);
-      noClassMerging.add(fieldReference.getHolderType());
+              ProgramField field = resolutionResult.getProgramField();
+              if (field == null) {
+                // No need to trace into the non-program code.
+                return;
+              }
 
-      // Record field reference for generated extension registry shrinking.
-      appView.withGeneratedExtensionRegistryShrinker(
-          shrinker ->
-              shrinker.handleFailedOrUnknownFieldResolution(fieldReference, currentMethod, mode));
-      return;
-    }
+              assert !mode.isFinalTreeShaking()
+                      || !field.getDefinition().getOptimizationInfo().isDead()
+                  : "Unexpected reference in `"
+                      + currentMethod.toSourceString()
+                      + "` to field marked dead: "
+                      + field.getReference().toSourceString();
 
-    ProgramField field =
-        resolutionResult.asSuccessfulResolution().getResolutionPair().asProgramField();
-    if (field == null) {
-      // No need to trace into the non-program code.
-      return;
-    }
+              if (fromMethodHandle) {
+                fieldAccessInfoCollection.get(field.getReference()).setReadFromMethodHandle();
+              }
 
-    assert !mode.isFinalTreeShaking() || !field.getDefinition().getOptimizationInfo().isDead()
-        : "Unexpected reference in `"
-            + currentMethod.toSourceString()
-            + "` to field marked dead: "
-            + field.getReference().toSourceString();
+              if (Log.ENABLED) {
+                Log.verbose(getClass(), "Register Sget `%s`.", fieldReference);
+              }
 
-    if (fromMethodHandle) {
-      fieldAccessInfoCollection.get(field.getReference()).setReadFromMethodHandle();
-    }
+              // If it is a dead proto extension field, don't trace onwards.
+              boolean skipTracing =
+                  appView.withGeneratedExtensionRegistryShrinker(
+                      shrinker ->
+                          shrinker.isDeadProtoExtensionField(
+                              field, fieldAccessInfoCollection, keepInfo),
+                      false);
+              if (skipTracing) {
+                addDeadProtoTypeCandidate(field.getHolder());
+                return;
+              }
 
-    if (Log.ENABLED) {
-      Log.verbose(getClass(), "Register Sget `%s`.", fieldReference);
-    }
+              if (field.getReference() != fieldReference) {
+                // Mark the initial resolution holder as live. Note that this should only be done if
+                // the field
+                // is not a dead proto field (in which case we bail-out above).
+                markTypeAsLive(resolutionResult.getInitialResolutionHolder(), currentMethod);
+              }
 
-    // If it is a dead proto extension field, don't trace onwards.
-    boolean skipTracing =
-        appView.withGeneratedExtensionRegistryShrinker(
-            shrinker ->
-                shrinker.isDeadProtoExtensionField(field, fieldAccessInfoCollection, keepInfo),
-            false);
-    if (skipTracing) {
-      addDeadProtoTypeCandidate(field.getHolder());
-      return;
-    }
-
-    if (field.getReference() != fieldReference) {
-      // Mark the initial resolution holder as live. Note that this should only be done if the field
-      // is not a dead proto field (in which case we bail-out above).
-      markTypeAsLive(resolutionResult.getInitialResolutionHolder(), currentMethod);
-    }
-
-    markFieldAsLive(field, currentMethod);
+              markFieldAsLive(field, currentMethod);
+            },
+            failedResolution -> {
+              // Must trace the types from the field reference even if it does not exist.
+              traceFieldReference(fieldReference, failedResolution, currentMethod);
+              noClassMerging.add(fieldReference.getHolderType());
+              // Record field reference for generated extension registry shrinking.
+              appView.withGeneratedExtensionRegistryShrinker(
+                  shrinker ->
+                      shrinker.handleFailedOrUnknownFieldResolution(
+                          fieldReference, currentMethod, mode));
+            });
   }
 
   void traceStaticFieldWrite(DexField field, ProgramMethod currentMethod) {
@@ -1649,60 +1671,63 @@
       return;
     }
 
-    FieldResolutionResult resolutionResult = resolveField(fieldReference, currentMethod);
-    fieldAccessAnalyses.forEach(
-        analysis ->
-            analysis.traceStaticFieldWrite(
-                fieldReference, resolutionResult, currentMethod, workList));
+    resolveField(fieldReference, currentMethod)
+        .visitFieldResolutionResults(
+            resolutionResult -> {
+              fieldAccessAnalyses.forEach(
+                  analysis ->
+                      analysis.traceStaticFieldWrite(
+                          fieldReference, resolutionResult, currentMethod, workList));
 
-    if (resolutionResult.isFailedOrUnknownResolution()) {
-      // Must trace the types from the field reference even if it does not exist.
-      traceFieldReference(fieldReference, resolutionResult, currentMethod);
-      noClassMerging.add(fieldReference.getHolderType());
-      return;
-    }
+              ProgramField field = resolutionResult.getProgramField();
+              if (field == null) {
+                // No need to trace into the non-program code.
+                return;
+              }
 
-    ProgramField field =
-        resolutionResult.asSuccessfulResolution().getResolutionPair().asProgramField();
-    if (field == null) {
-      // No need to trace into the non-program code.
-      return;
-    }
+              assert !mode.isFinalTreeShaking()
+                      || !field.getDefinition().getOptimizationInfo().isDead()
+                  : "Unexpected reference in `"
+                      + currentMethod.toSourceString()
+                      + "` to field marked dead: "
+                      + field.getReference().toSourceString();
 
-    assert !mode.isFinalTreeShaking() || !field.getDefinition().getOptimizationInfo().isDead()
-        : "Unexpected reference in `"
-            + currentMethod.toSourceString()
-            + "` to field marked dead: "
-            + field.getReference().toSourceString();
+              if (fromMethodHandle) {
+                fieldAccessInfoCollection.get(field.getReference()).setWrittenFromMethodHandle();
+              }
 
-    if (fromMethodHandle) {
-      fieldAccessInfoCollection.get(field.getReference()).setWrittenFromMethodHandle();
-    }
+              if (Log.ENABLED) {
+                Log.verbose(getClass(), "Register Sput `%s`.", fieldReference);
+              }
 
-    if (Log.ENABLED) {
-      Log.verbose(getClass(), "Register Sput `%s`.", fieldReference);
-    }
+              if (appView.options().protoShrinking().enableGeneratedExtensionRegistryShrinking) {
+                // If it is a dead proto extension field, don't trace onwards.
+                boolean skipTracing =
+                    appView.withGeneratedExtensionRegistryShrinker(
+                        shrinker ->
+                            shrinker.isDeadProtoExtensionField(
+                                field, fieldAccessInfoCollection, keepInfo),
+                        false);
+                if (skipTracing) {
+                  addDeadProtoTypeCandidate(field.getHolder());
+                  return;
+                }
+              }
 
-    if (appView.options().protoShrinking().enableGeneratedExtensionRegistryShrinking) {
-      // If it is a dead proto extension field, don't trace onwards.
-      boolean skipTracing =
-          appView.withGeneratedExtensionRegistryShrinker(
-              shrinker ->
-                  shrinker.isDeadProtoExtensionField(field, fieldAccessInfoCollection, keepInfo),
-              false);
-      if (skipTracing) {
-        addDeadProtoTypeCandidate(field.getHolder());
-        return;
-      }
-    }
+              if (field.getReference() != fieldReference) {
+                // Mark the initial resolution holder as live. Note that this should only be done if
+                // the field
+                // is not a dead proto field (in which case we bail-out above).
+                markTypeAsLive(resolutionResult.getInitialResolutionHolder(), currentMethod);
+              }
 
-    if (field.getReference() != fieldReference) {
-      // Mark the initial resolution holder as live. Note that this should only be done if the field
-      // is not a dead proto field (in which case we bail-out above).
-      markTypeAsLive(resolutionResult.getInitialResolutionHolder(), currentMethod);
-    }
-
-    markFieldAsLive(field, currentMethod);
+              markFieldAsLive(field, currentMethod);
+            },
+            failedResolution -> {
+              // Must trace the types from the field reference even if it does not exist.
+              traceFieldReference(fieldReference, failedResolution, currentMethod);
+              noClassMerging.add(fieldReference.getHolderType());
+            });
   }
 
   private DexMethod getInvokeSuperTarget(DexMethod method, ProgramMethod currentMethod) {
@@ -2069,16 +2094,17 @@
 
   private FieldResolutionResult resolveField(DexField field, ProgramDefinition context) {
     // Record the references in case they are not program types.
-    FieldResolutionResult resolutionResult = appInfo.resolveField(field);
-    if (resolutionResult.isSuccessfulResolution()) {
-      recordFieldReference(
-          field, resolutionResult.getResolutionPair().asProgramDerivedContext(context));
-    } else {
-      assert resolutionResult.isFailedOrUnknownResolution();
-      failedFieldResolutionTargets.add(field);
-      recordFieldReference(field, context);
-    }
-    return resolutionResult;
+    FieldResolutionResult fieldResolutionResult = appInfo.resolveField(field);
+    fieldResolutionResult.visitFieldResolutionResults(
+        resolutionResult -> {
+          recordFieldReference(
+              field, resolutionResult.getResolutionPair().asProgramDerivedContext(context));
+        },
+        failedResolution -> {
+          failedFieldResolutionTargets.add(field);
+          recordFieldReference(field, context);
+        });
+    return fieldResolutionResult;
   }
 
   private SingleResolutionResult resolveMethod(
@@ -2355,11 +2381,20 @@
     if (!clazz.isProgramClass()) {
       addLiveNonProgramType(
           clazz.asClasspathOrLibraryClass(),
+          true,
           (missingType, derivedContext) ->
               reportMissingClass(missingType, derivedContext.asProgramDerivedContext(context)));
     }
   }
 
+  private void recordNonProgramClassWithNoMissingReporting(
+      DexClass clazz, ProgramDerivedContext context) {
+    if (!clazz.isProgramClass()) {
+      addLiveNonProgramType(
+          clazz.asClasspathOrLibraryClass(), true, this::ignoreMissingClasspathOrLibraryClass);
+    }
+  }
+
   private void ignoreMissingClass(DexType clazz) {
     missingClassesBuilder.ignoreNewMissingClass(clazz);
   }
@@ -2633,7 +2668,7 @@
       // maintains the library override. In the second enqueuer phase, the signature has been
       // desugared, and the second resolution maintains the the library override.
       if (instantiation.isClass()
-          && appView.rewritePrefix.hasRewrittenTypeInSignature(
+          && appView.typeRewriter.hasRewrittenTypeInSignature(
               method.getReference().proto, appView)) {
         DexMethod methodToResolve =
             DesugaredLibraryAPIConverter.methodWithVivifiedTypeInSignature(
@@ -2838,8 +2873,9 @@
   }
 
   private void traceFieldReference(
-      DexField field, FieldResolutionResult resolutionResult, ProgramMethod context) {
-    assert resolutionResult.isFailedOrUnknownResolution();
+      DexField field,
+      FailedOrUnknownFieldResolutionResult resolutionResult,
+      ProgramMethod context) {
     markTypeAsLive(field.getHolderType(), context);
     markTypeAsLive(field.getType(), context);
   }
@@ -3750,6 +3786,9 @@
     // Rebuild a new app only containing referenced types.
     Set<DexLibraryClass> libraryClasses = Sets.newIdentityHashSet();
     Set<DexClasspathClass> classpathClasses = Sets.newIdentityHashSet();
+    // Ensure all referenced non program types have their hierarchy built as live.
+    referencedNonProgramTypes.forEach(
+        clazz -> addLiveNonProgramType(clazz, false, this::ignoreMissingClasspathOrLibraryClass));
     for (ClasspathOrLibraryClass clazz : liveNonProgramTypes) {
       if (clazz.isLibraryClass()) {
         libraryClasses.add(clazz.asLibraryClass());
@@ -3908,14 +3947,16 @@
     }
     assert clazz.isProgramClass() || liveNonProgramTypes.contains(clazz)
         : "Expected type to be in live non-program types: " + clazz;
-    for (DexEncodedField field : clazz.fields()) {
-      if (clazz.isNotProgramClass() || isFieldReferenced(field)) {
-        assert verifyReferencedType(field.getReference().type, worklist, app);
+    if (clazz.isProgramClass()) {
+      for (DexEncodedField field : clazz.fields()) {
+        if (isFieldReferenced(field)) {
+          assert verifyReferencedType(field.getReference().type, worklist, app);
+        }
       }
-    }
-    for (DexEncodedMethod method : clazz.methods()) {
-      if (clazz.isNotProgramClass() || isMethodTargeted(method)) {
-        assert verifyReferencedMethod(method, worklist, app);
+      for (DexEncodedMethod method : clazz.methods()) {
+        if (isMethodTargeted(method)) {
+          assert verifyReferencedMethod(method, worklist, app);
+        }
       }
     }
     return true;
@@ -4075,8 +4116,7 @@
     InterfaceMethodProcessorFacade interfaceDesugaring =
         desugaring.getInterfaceMethodPostProcessingDesugaringR8(
             ExcludeDexResources, liveMethods::contains, interfaceProcessor);
-    CfPostProcessingDesugaringCollection.create(
-            appView, interfaceDesugaring, desugaring.getRetargetingInfo())
+    CfPostProcessingDesugaringCollection.create(appView, interfaceDesugaring)
         .postProcessingDesugaring(
             liveTypes.items, liveMethods::contains, eventConsumer, executorService);
 
diff --git a/src/main/java/com/android/tools/r8/shaking/KeepMethodInfo.java b/src/main/java/com/android/tools/r8/shaking/KeepMethodInfo.java
index c82c666..cd46a71 100644
--- a/src/main/java/com/android/tools/r8/shaking/KeepMethodInfo.java
+++ b/src/main/java/com/android/tools/r8/shaking/KeepMethodInfo.java
@@ -28,6 +28,7 @@
   private final boolean allowConstantArgumentOptimization;
   private final boolean allowInlining;
   private final boolean allowMethodStaticizing;
+  private final boolean allowParameterReordering;
   private final boolean allowParameterTypeStrengthening;
   private final boolean allowReturnTypeStrengthening;
   private final boolean allowUnusedArgumentOptimization;
@@ -39,6 +40,7 @@
     this.allowConstantArgumentOptimization = builder.isConstantArgumentOptimizationAllowed();
     this.allowInlining = builder.isInliningAllowed();
     this.allowMethodStaticizing = builder.isMethodStaticizingAllowed();
+    this.allowParameterReordering = builder.isParameterReorderingAllowed();
     this.allowParameterTypeStrengthening = builder.isParameterTypeStrengtheningAllowed();
     this.allowReturnTypeStrengthening = builder.isReturnTypeStrengtheningAllowed();
     this.allowUnusedArgumentOptimization = builder.isUnusedArgumentOptimizationAllowed();
@@ -97,6 +99,16 @@
     return allowMethodStaticizing;
   }
 
+  public boolean isParameterReorderingAllowed(GlobalKeepInfoConfiguration configuration) {
+    return isOptimizationAllowed(configuration)
+        && isShrinkingAllowed(configuration)
+        && internalIsParameterReorderingAllowed();
+  }
+
+  boolean internalIsParameterReorderingAllowed() {
+    return allowParameterReordering;
+  }
+
   public boolean isParameterTypeStrengtheningAllowed(GlobalKeepInfoConfiguration configuration) {
     return isOptimizationAllowed(configuration)
         && isShrinkingAllowed(configuration)
@@ -158,6 +170,7 @@
     private boolean allowConstantArgumentOptimization;
     private boolean allowInlining;
     private boolean allowMethodStaticizing;
+    private boolean allowParameterReordering;
     private boolean allowParameterTypeStrengthening;
     private boolean allowReturnTypeStrengthening;
     private boolean allowUnusedArgumentOptimization;
@@ -173,6 +186,7 @@
       allowConstantArgumentOptimization = original.internalIsConstantArgumentOptimizationAllowed();
       allowInlining = original.internalIsInliningAllowed();
       allowMethodStaticizing = original.internalIsMethodStaticizingAllowed();
+      allowParameterReordering = original.internalIsParameterReorderingAllowed();
       allowParameterTypeStrengthening = original.internalIsParameterTypeStrengtheningAllowed();
       allowReturnTypeStrengthening = original.internalIsReturnTypeStrengtheningAllowed();
       allowUnusedArgumentOptimization = original.internalIsUnusedArgumentOptimizationAllowed();
@@ -256,6 +270,25 @@
       return setAllowMethodStaticizing(false);
     }
 
+    // Parameter reordering.
+
+    public boolean isParameterReorderingAllowed() {
+      return allowParameterReordering;
+    }
+
+    public Builder setAllowParameterReordering(boolean allowParameterReordering) {
+      this.allowParameterReordering = allowParameterReordering;
+      return self();
+    }
+
+    public Builder allowParameterReordering() {
+      return setAllowParameterReordering(true);
+    }
+
+    public Builder disallowParameterReordering() {
+      return setAllowParameterReordering(false);
+    }
+
     // Parameter type strengthening.
 
     public boolean isParameterTypeStrengtheningAllowed() {
@@ -361,6 +394,7 @@
               == other.internalIsConstantArgumentOptimizationAllowed()
           && isInliningAllowed() == other.internalIsInliningAllowed()
           && isMethodStaticizingAllowed() == other.internalIsMethodStaticizingAllowed()
+          && isParameterReorderingAllowed() == other.internalIsParameterReorderingAllowed()
           && isParameterTypeStrengtheningAllowed()
               == other.internalIsParameterTypeStrengtheningAllowed()
           && isReturnTypeStrengtheningAllowed() == other.internalIsReturnTypeStrengtheningAllowed()
@@ -382,6 +416,7 @@
           .disallowConstantArgumentOptimization()
           .disallowInlining()
           .disallowMethodStaticizing()
+          .disallowParameterReordering()
           .disallowParameterTypeStrengthening()
           .disallowReturnTypeStrengthening()
           .disallowUnusedArgumentOptimization()
@@ -395,6 +430,7 @@
           .allowConstantArgumentOptimization()
           .allowInlining()
           .allowMethodStaticizing()
+          .allowParameterReordering()
           .allowParameterTypeStrengthening()
           .allowReturnTypeStrengthening()
           .allowUnusedArgumentOptimization()
@@ -428,6 +464,11 @@
       return self();
     }
 
+    public Joiner disallowParameterReordering() {
+      builder.disallowParameterReordering();
+      return self();
+    }
+
     public Joiner disallowParameterTypeStrengthening() {
       builder.disallowParameterTypeStrengthening();
       return self();
@@ -464,6 +505,8 @@
           .applyIf(!joiner.builder.isInliningAllowed(), Joiner::disallowInlining)
           .applyIf(!joiner.builder.isMethodStaticizingAllowed(), Joiner::disallowMethodStaticizing)
           .applyIf(
+              !joiner.builder.isParameterReorderingAllowed(), Joiner::disallowParameterReordering)
+          .applyIf(
               !joiner.builder.isParameterTypeStrengtheningAllowed(),
               Joiner::disallowParameterTypeStrengthening)
           .applyIf(
diff --git a/src/main/java/com/android/tools/r8/shaking/L8TreePruner.java b/src/main/java/com/android/tools/r8/shaking/L8TreePruner.java
index 960ccd5..46e77e8 100644
--- a/src/main/java/com/android/tools/r8/shaking/L8TreePruner.java
+++ b/src/main/java/com/android/tools/r8/shaking/L8TreePruner.java
@@ -7,7 +7,7 @@
 import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.DexType;
-import com.android.tools.r8.ir.desugar.PrefixRewritingMapper;
+import com.android.tools.r8.ir.desugar.TypeRewriter;
 import com.android.tools.r8.utils.InternalOptions;
 import com.google.common.collect.Sets;
 import java.util.ArrayList;
@@ -28,18 +28,18 @@
 
   public L8TreePruner(InternalOptions options) {
     this.options = options;
-    backports.addAll(options.desugaredLibrarySpecification.getBackportCoreLibraryMember().keySet());
+    backports.addAll(options.machineDesugaredLibrarySpecification.getLegacyBackport().keySet());
     emulatedInterfaces.addAll(
-        options.desugaredLibrarySpecification.getEmulateLibraryInterface().keySet());
+        options.machineDesugaredLibrarySpecification.getEmulatedInterfaces().keySet());
   }
 
-  public DexApplication prune(DexApplication app, PrefixRewritingMapper rewritePrefix) {
+  public DexApplication prune(DexApplication app, TypeRewriter typeRewriter) {
     Map<DexType, DexProgramClass> typeMap = new IdentityHashMap<>();
     List<DexProgramClass> toKeep = new ArrayList<>();
     boolean pruneNestMember = false;
     for (DexProgramClass aClass : app.classes()) {
       typeMap.put(aClass.type, aClass);
-      if (rewritePrefix.hasRewrittenType(aClass.type, null)
+      if (typeRewriter.hasRewrittenType(aClass.type, null)
           || emulatedInterfaces.contains(aClass.type)) {
         toKeep.add(aClass);
       } else {
diff --git a/src/main/java/com/android/tools/r8/shaking/NoParameterReorderingRule.java b/src/main/java/com/android/tools/r8/shaking/NoParameterReorderingRule.java
new file mode 100644
index 0000000..c8d0e6c
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/shaking/NoParameterReorderingRule.java
@@ -0,0 +1,84 @@
+// Copyright (c) 2022, 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.shaking;
+
+import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.position.Position;
+import java.util.List;
+
+public class NoParameterReorderingRule extends NoOptimizationBaseRule<NoParameterReorderingRule> {
+
+  public static final String RULE_NAME = "noparameterreordering";
+
+  public static class Builder
+      extends NoOptimizationBaseRule.Builder<NoParameterReorderingRule, Builder> {
+
+    Builder() {
+      super();
+    }
+
+    @Override
+    public NoParameterReorderingRule.Builder self() {
+      return this;
+    }
+
+    @Override
+    public NoParameterReorderingRule build() {
+      return new NoParameterReorderingRule(
+          origin,
+          getPosition(),
+          source,
+          buildClassAnnotations(),
+          classAccessFlags,
+          negatedClassAccessFlags,
+          classTypeNegated,
+          classType,
+          classNames,
+          buildInheritanceAnnotations(),
+          inheritanceClassName,
+          inheritanceIsExtends,
+          memberRules);
+    }
+  }
+
+  NoParameterReorderingRule(
+      Origin origin,
+      Position position,
+      String source,
+      List<ProguardTypeMatcher> classAnnotations,
+      ProguardAccessFlags classAccessFlags,
+      ProguardAccessFlags negatedClassAccessFlags,
+      boolean classTypeNegated,
+      ProguardClassType classType,
+      ProguardClassNameList classNames,
+      List<ProguardTypeMatcher> inheritanceAnnotations,
+      ProguardTypeMatcher inheritanceClassName,
+      boolean inheritanceIsExtends,
+      List<ProguardMemberRule> memberRules) {
+    super(
+        origin,
+        position,
+        source,
+        classAnnotations,
+        classAccessFlags,
+        negatedClassAccessFlags,
+        classTypeNegated,
+        classType,
+        classNames,
+        inheritanceAnnotations,
+        inheritanceClassName,
+        inheritanceIsExtends,
+        memberRules);
+  }
+
+  public static Builder builder() {
+    return new Builder();
+  }
+
+  @Override
+  String typeString() {
+    return RULE_NAME;
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
index 0f2ad2c..4ed94e5 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationParser.java
@@ -514,6 +514,12 @@
           configurationBuilder.addRule(rule);
           return true;
         }
+        if (acceptString(NoParameterReorderingRule.RULE_NAME)) {
+          ProguardConfigurationRule rule =
+              parseNoOptimizationRule(optionStart, NoParameterReorderingRule.builder());
+          configurationBuilder.addRule(rule);
+          return true;
+        }
         if (acceptString(NoParameterTypeStrengtheningRule.RULE_NAME)) {
           ProguardConfigurationRule rule =
               parseNoOptimizationRule(optionStart, NoParameterTypeStrengtheningRule.builder());
diff --git a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationRule.java b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationRule.java
index 41181b1..ea30b42 100644
--- a/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationRule.java
+++ b/src/main/java/com/android/tools/r8/shaking/ProguardConfigurationRule.java
@@ -3,8 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.shaking;
 
+import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.ClassResolutionResult;
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexDefinitionSupplier;
 import com.android.tools.r8.graph.DexItemFactory;
@@ -128,6 +130,12 @@
           specificTypes,
           new DexDefinitionSupplier() {
             @Override
+            public ClassResolutionResult contextIndependentDefinitionForWithResolutionResult(
+                DexType type) {
+              throw new Unreachable("Add support for multiple definitions with rule evaluation");
+            }
+
+            @Override
             public DexClass definitionFor(DexType type) {
               if (canReferenceDeadTypes) {
                 return appView.appInfo().definitionForWithoutExistenceAssert(type);
diff --git a/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java b/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
index 89b55dd..95ec8c3 100644
--- a/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
+++ b/src/main/java/com/android/tools/r8/shaking/RootSetUtils.java
@@ -267,6 +267,7 @@
           || rule instanceof KeepConstantArgumentRule
           || rule instanceof KeepUnusedReturnValueRule
           || rule instanceof NoMethodStaticizingRule
+          || rule instanceof NoParameterReorderingRule
           || rule instanceof NoParameterTypeStrengtheningRule
           || rule instanceof NoReturnTypeStrengtheningRule
           || rule instanceof KeepUnusedArgumentRule
@@ -1255,6 +1256,13 @@
             .asMethodJoiner()
             .disallowMethodStaticizing();
         context.markAsUsed();
+      } else if (context instanceof NoParameterReorderingRule) {
+        assert item.isProgramMethod();
+        dependentMinimumKeepInfo
+            .getOrCreateUnconditionalMinimumKeepInfoFor(item.getReference())
+            .asMethodJoiner()
+            .disallowParameterReordering();
+        context.markAsUsed();
       } else if (context instanceof NoParameterTypeStrengtheningRule) {
         assert item.isProgramMethod();
         dependentMinimumKeepInfo
diff --git a/src/main/java/com/android/tools/r8/synthesis/CommittedItems.java b/src/main/java/com/android/tools/r8/synthesis/CommittedItems.java
index 1e4071f..dddb984 100644
--- a/src/main/java/com/android/tools/r8/synthesis/CommittedItems.java
+++ b/src/main/java/com/android/tools/r8/synthesis/CommittedItems.java
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.synthesis;
 
+import com.android.tools.r8.graph.ClassResolutionResult;
 import com.android.tools.r8.graph.DexApplication;
-import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexType;
 import com.google.common.collect.ImmutableList;
 import java.util.Collection;
@@ -55,7 +55,8 @@
   }
 
   @Override
-  public DexClass definitionFor(DexType type, Function<DexType, DexClass> baseDefinitionFor) {
+  public ClassResolutionResult definitionFor(
+      DexType type, Function<DexType, ClassResolutionResult> baseDefinitionFor) {
     // All synthetic types are committed to the application so lookup is just the base lookup.
     return baseDefinitionFor.apply(type);
   }
diff --git a/src/main/java/com/android/tools/r8/synthesis/SynthesizingContext.java b/src/main/java/com/android/tools/r8/synthesis/SynthesizingContext.java
index bbf4258..3b3aeea 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SynthesizingContext.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SynthesizingContext.java
@@ -129,12 +129,7 @@
       return;
     }
     assert hygienicType.toSourceString().startsWith(synthesizingContextType.toSourceString());
-    DexType rewrittenContext =
-        appView
-            .options()
-            .desugaredLibrarySpecification
-            .getEmulateLibraryInterface()
-            .get(synthesizingContextType);
+    DexType rewrittenContext = appView.typeRewriter.rewrittenContextType(synthesizingContextType);
     if (rewrittenContext == null) {
       return;
     }
@@ -148,7 +143,7 @@
         appView
             .dexItemFactory()
             .createType(getDescriptorFromClassBinaryName(rewrittenPrefix + suffix));
-    appView.rewritePrefix.rewriteType(hygienicType, rewrittenType);
+    appView.typeRewriter.rewriteType(hygienicType, rewrittenType);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticDefinitionsProvider.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticDefinitionsProvider.java
index e66401e..a428331 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticDefinitionsProvider.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticDefinitionsProvider.java
@@ -3,10 +3,11 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.synthesis;
 
-import com.android.tools.r8.graph.DexClass;
+import com.android.tools.r8.graph.ClassResolutionResult;
 import com.android.tools.r8.graph.DexType;
 import java.util.function.Function;
 
 public interface SyntheticDefinitionsProvider {
-  DexClass definitionFor(DexType type, Function<DexType, DexClass> baseDefinitionFor);
+  ClassResolutionResult definitionFor(
+      DexType type, Function<DexType, ClassResolutionResult> baseDefinitionFor);
 }
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
index 0cb0137..1e9ffb4 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
@@ -10,6 +10,8 @@
 import com.android.tools.r8.features.ClassToFeatureSplitMap;
 import com.android.tools.r8.graph.AppInfo;
 import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.ClassResolutionResult;
+import com.android.tools.r8.graph.ClasspathMethod;
 import com.android.tools.r8.graph.ClasspathOrLibraryClass;
 import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.graph.DexClass;
@@ -175,7 +177,8 @@
   // Predicates and accessors.
 
   @Override
-  public DexClass definitionFor(DexType type, Function<DexType, DexClass> baseDefinitionFor) {
+  public ClassResolutionResult definitionFor(
+      DexType type, Function<DexType, ClassResolutionResult> baseDefinitionFor) {
     DexClass clazz = null;
     SyntheticKind kind = null;
     SyntheticDefinition<?, ?, ?> item = pending.nonLegacyDefinitions.get(type);
@@ -187,7 +190,8 @@
     }
     if (clazz != null) {
       assert kind != null;
-      assert baseDefinitionFor.apply(type) == null || kind.mayOverridesNonProgramType
+      assert !baseDefinitionFor.apply(type).hasClassResolutionResult()
+              || kind.mayOverridesNonProgramType
           : "Pending synthetic definition also present in the active program: " + type;
       return clazz;
     }
@@ -483,14 +487,13 @@
       AppView<?> appView,
       DexType type) {
     DexType rewrittenContextType =
-        appView.rewritePrefix.rewrittenContextType(
-            outerContext.getSynthesizingContextType(), appView);
+        appView.typeRewriter.rewrittenContextType(outerContext.getSynthesizingContextType());
     if (rewrittenContextType == null) {
       return;
     }
     SynthesizingContext synthesizingContext = SynthesizingContext.fromType(rewrittenContextType);
     DexType rewrittenType = contextToType.apply(synthesizingContext);
-    appView.rewritePrefix.rewriteType(type, rewrittenType);
+    appView.typeRewriter.rewriteType(type, rewrittenType);
   }
 
   public DexProgramClass createClass(
@@ -650,10 +653,11 @@
       SyntheticKind kind,
       DexType contextType,
       AppView<?> appView,
-      Consumer<SyntheticClasspathClassBuilder> classConsumer) {
+      Consumer<SyntheticClasspathClassBuilder> classConsumer,
+      Consumer<DexClasspathClass> onCreationConsumer) {
     SynthesizingContext outerContext = SynthesizingContext.fromType(contextType);
     return internalEnsureFixedClasspathClass(
-        kind, classConsumer, ignored -> {}, outerContext, appView);
+        kind, classConsumer, onCreationConsumer, outerContext, appView);
   }
 
   public DexClasspathClass ensureFixedClasspathClass(
@@ -669,7 +673,23 @@
         kind, classConsumer, onCreationConsumer, outerContext, appView);
   }
 
-  public DexClassAndMethod ensureFixedClasspathClassMethod(
+  public ClasspathMethod ensureFixedClasspathMethodFromType(
+      DexString methodName,
+      DexProto methodProto,
+      SyntheticKind kind,
+      DexType contextType,
+      AppView<?> appView,
+      Consumer<SyntheticClasspathClassBuilder> classConsumer,
+      Consumer<DexClasspathClass> onCreationConsumer,
+      Consumer<SyntheticMethodBuilder> buildMethodCallback) {
+    DexClasspathClass clazz =
+        ensureFixedClasspathClassFromType(
+            kind, contextType, appView, classConsumer, onCreationConsumer);
+    return internalEnsureFixedClasspathMethod(
+        methodName, methodProto, kind, appView, buildMethodCallback, clazz);
+  }
+
+  public ClasspathMethod ensureFixedClasspathClassMethod(
       DexString methodName,
       DexProto methodProto,
       SyntheticKind kind,
@@ -681,6 +701,17 @@
     DexClasspathClass clazz =
         ensureFixedClasspathClass(
             kind, context, appView, buildClassCallback, onClassCreationCallback);
+    return internalEnsureFixedClasspathMethod(
+        methodName, methodProto, kind, appView, buildMethodCallback, clazz);
+  }
+
+  private ClasspathMethod internalEnsureFixedClasspathMethod(
+      DexString methodName,
+      DexProto methodProto,
+      SyntheticKind kind,
+      AppView<?> appView,
+      Consumer<SyntheticMethodBuilder> buildMethodCallback,
+      DexClasspathClass clazz) {
     DexMethod methodReference =
         appView.dexItemFactory().createMethod(clazz.getType(), methodProto, methodName);
     DexEncodedMethod methodDefinition =
@@ -695,7 +726,7 @@
               buildMethodCallback.accept(methodBuilder.disableAndroidApiLevelCheck());
             },
             emptyConsumer());
-    return DexClassAndMethod.create(clazz, methodDefinition);
+    return new ClasspathMethod(clazz, methodDefinition);
   }
 
   @SuppressWarnings("unchecked")
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticMethodBuilder.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticMethodBuilder.java
index b7861e3..ec8a010 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticMethodBuilder.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticMethodBuilder.java
@@ -180,6 +180,10 @@
   }
 
   private Code getCodeObject(DexMethod methodSignature) {
+    if (codeGenerator == null) {
+      // If the method is on the classpath then no code is needed.
+      return null;
+    }
     return codeGenerator.generate(methodSignature);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
index 62c7c6f..4d8b529 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticNaming.java
@@ -31,6 +31,7 @@
     COMPANION_CLASS("$-CC", 2, false, true),
     EMULATED_INTERFACE_CLASS("$-EL", 3, false, true),
     RETARGET_CLASS("RetargetClass", 20, false, true),
+    RETARGET_STUB("", 36, false, true),
     RETARGET_INTERFACE("RetargetInterface", 21, false, true),
     WRAPPER("$Wrapper", 22, false, true),
     VIVIFIED_WRAPPER("$VivifiedWrapper", 23, false, true),
diff --git a/src/main/java/com/android/tools/r8/utils/AndroidApiLevel.java b/src/main/java/com/android/tools/r8/utils/AndroidApiLevel.java
index 38934f2..6bec653 100644
--- a/src/main/java/com/android/tools/r8/utils/AndroidApiLevel.java
+++ b/src/main/java/com/android/tools/r8/utils/AndroidApiLevel.java
@@ -42,12 +42,13 @@
   R(30),
   S(31),
   Sv2(32),
+  T(33),
   ANDROID_PLATFORM(10000);
 
   // When updating LATEST and a new version goes stable, add a new api-versions.xml to third_party
   // and update the version and generated jar in AndroidApiDatabaseBuilderGeneratorTest.
-  // TODO(b/204738868): Update API database for Sv2.
-  public static final AndroidApiLevel LATEST = Sv2;
+  // TODO(b/204738868): Update API database for Sv2 / T when they are ready.
+  public static final AndroidApiLevel LATEST = T;
 
   private final int level;
 
@@ -96,6 +97,7 @@
 
   public static AndroidApiLevel getAndroidApiLevel(int apiLevel) {
     assert apiLevel > 0;
+    assert T == LATEST; // This has to be updated when we add new api levels.
     assert ANDROID_PLATFORM.isGreaterThan(LATEST);
     switch (apiLevel) {
       case 1:
@@ -162,11 +164,11 @@
         return S;
       case 32:
         return Sv2;
+      case 33:
+        return T;
       case 10000:
         return ANDROID_PLATFORM;
       default:
-        // This has to be updated when we add new api levels.
-        assert Sv2 == LATEST;
         return LATEST;
     }
   }
diff --git a/src/main/java/com/android/tools/r8/utils/DexVersion.java b/src/main/java/com/android/tools/r8/utils/DexVersion.java
index 624e70e..ac962fa 100644
--- a/src/main/java/com/android/tools/r8/utils/DexVersion.java
+++ b/src/main/java/com/android/tools/r8/utils/DexVersion.java
@@ -41,6 +41,7 @@
         // ANDROID_PLATFORM is an unknown higher api version we therefore choose the highest known
         // version.
       case ANDROID_PLATFORM:
+      case T:
       case Sv2:
       case S:
       case R:
diff --git a/src/main/java/com/android/tools/r8/utils/ForEachUtils.java b/src/main/java/com/android/tools/r8/utils/ForEachUtils.java
new file mode 100644
index 0000000..532acf7
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/utils/ForEachUtils.java
@@ -0,0 +1,20 @@
+// Copyright (c) 2022, 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.utils;
+
+import java.util.function.Consumer;
+import java.util.function.Predicate;
+
+public class ForEachUtils {
+
+  public static <T> boolean allMatch(Consumer<Consumer<T>> forEach, Predicate<T> predicate) {
+    BooleanBox acc = new BooleanBox(true);
+    forEach.accept(
+        value -> {
+          acc.and(predicate.test(value));
+        });
+    return acc.isTrue();
+  }
+}
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 ec5dca6..066ca9f 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -52,10 +52,13 @@
 import com.android.tools.r8.horizontalclassmerging.Policy;
 import com.android.tools.r8.inspector.internal.InspectorImpl;
 import com.android.tools.r8.ir.code.IRCode;
-import com.android.tools.r8.ir.desugar.PrefixRewritingMapper;
-import com.android.tools.r8.ir.desugar.PrefixRewritingMapper.MachineDesugarPrefixRewritingMapper;
+import com.android.tools.r8.ir.desugar.TypeRewriter;
+import com.android.tools.r8.ir.desugar.TypeRewriter.MachineDesugarPrefixRewritingMapper;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.humanspecification.HumanDesugaredLibrarySpecification;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification.LegacyDesugaredLibrarySpecification;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineDesugaredLibrarySpecification;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.specificationconversion.HumanToMachineSpecificationConverter;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.specificationconversion.LegacyToHumanSpecificationConverter;
 import com.android.tools.r8.ir.desugar.nest.Nest;
 import com.android.tools.r8.ir.optimize.Inliner;
 import com.android.tools.r8.ir.optimize.enums.EnumDataMap;
@@ -85,7 +88,9 @@
 import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
+import java.io.IOException;
 import java.io.PrintStream;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Comparator;
@@ -390,8 +395,8 @@
     if (isGeneratingDex() || desugarState == DesugarState.ON) {
       marker.setMinApi(getMinApiLevel().getLevel());
     }
-    if (desugaredLibrarySpecification.getIdentifier() != null) {
-      marker.setDesugaredLibraryIdentifiers(desugaredLibrarySpecification.getIdentifier());
+    if (machineDesugaredLibrarySpecification.getIdentifier() != null) {
+      marker.setDesugaredLibraryIdentifiers(machineDesugaredLibrarySpecification.getIdentifier());
     }
     if (Version.isDevelopmentVersion()) {
       marker.setSha1(VersionProperties.INSTANCE.getSha());
@@ -438,7 +443,7 @@
   }
 
   public boolean isDesugaredLibraryCompilation() {
-    return desugaredLibrarySpecification.isLibraryCompilation();
+    return machineDesugaredLibrarySpecification.isLibraryCompilation();
   }
 
   public boolean isRelocatorCompilation() {
@@ -883,18 +888,49 @@
   // If non-null, configuration must be passed to the consumer.
   public StringConsumer configurationConsumer = null;
 
-  // If null, no desugaring of library is performed.
-  // If non null it contains flags describing library desugaring.
-  public LegacyDesugaredLibrarySpecification desugaredLibrarySpecification =
-      LegacyDesugaredLibrarySpecification.empty();
-
-  public PrefixRewritingMapper getPrefixRewritingMapper() {
-    if (testing.machineDesugaredLibrarySpecification != null) {
-      return new MachineDesugarPrefixRewritingMapper(
-          desugaredLibrarySpecification.getPrefixRewritingMapper(),
-          testing.machineDesugaredLibrarySpecification.getRewritingFlags());
+  public void setDesugaredLibrarySpecification(
+      LegacyDesugaredLibrarySpecification specification, AndroidApp app) {
+    if (specification.isEmptyConfiguration()) {
+      return;
     }
-    return desugaredLibrarySpecification.getPrefixRewritingMapper();
+    try {
+      HumanDesugaredLibrarySpecification human =
+          new LegacyToHumanSpecificationConverter()
+              .convert(specification, app.getLibraryResourceProviders(), this);
+      machineDesugaredLibrarySpecification =
+          new HumanToMachineSpecificationConverter()
+              .convert(
+                  human,
+                  specification.isLibraryCompilation() ? app.getProgramResourceProviders() : null,
+                  app.getLibraryResourceProviders(),
+                  this);
+    } catch (IOException e) {
+      reporter.error(new ExceptionDiagnostic(e, Origin.unknown()));
+    }
+  }
+
+  public void setDesugaredLibrarySpecificationForTesting(
+      LegacyDesugaredLibrarySpecification specification, Path desugaredJDKLib, Path library)
+      throws IOException {
+    HumanDesugaredLibrarySpecification human =
+        new LegacyToHumanSpecificationConverter().convert(specification, library, this);
+    machineDesugaredLibrarySpecification =
+        new HumanToMachineSpecificationConverter()
+            .convert(
+                human,
+                specification.isLibraryCompilation() ? desugaredJDKLib : null,
+                library,
+                this);
+  }
+
+  // Contains flags describing library desugaring.
+  public MachineDesugaredLibrarySpecification machineDesugaredLibrarySpecification =
+      MachineDesugaredLibrarySpecification.empty();
+
+  public TypeRewriter getTypeRewriter() {
+    return machineDesugaredLibrarySpecification.getRewriteType().isEmpty()
+        ? TypeRewriter.empty()
+        : new MachineDesugarPrefixRewritingMapper(machineDesugaredLibrarySpecification);
   }
 
   public boolean relocatorCompilation = false;
@@ -1599,9 +1635,6 @@
 
     public Consumer<Deque<ProgramMethodSet>> waveModifier = waves -> {};
 
-    // Meant to replace desugaredLibrarySpecification, set only from tests at the moment.
-    public MachineDesugaredLibrarySpecification machineDesugaredLibrarySpecification = null;
-
     /**
      * If this flag is enabled, we will also compute the set of possible targets for invoke-
      * interface and invoke-virtual instructions that target a library method, and add the
@@ -1903,10 +1936,6 @@
     return isGeneratingDex() && hasMinApi(AndroidApiLevel.N);
   }
 
-  public boolean canUseJavaUtilObjectsRequireNonNull() {
-    return isGeneratingDex() && hasMinApi(AndroidApiLevel.K);
-  }
-
   public boolean canUseSuppressedExceptions() {
     // TODO(b/214239152): Suppressed exceptions are @hide from at least 4.0.1 / Android I / API 14.
     return !isDesugaring() || hasMinApi(AndroidApiLevel.K);
@@ -2309,4 +2338,16 @@
   public boolean canHaveSuperInvokeBug() {
     return getMinApiLevel().isLessThan(AndroidApiLevel.N);
   }
+
+  // Some Dalvik and Art MVs does not support interface invokes to Object
+  // members not explicitly defined on the symbolic reference of the
+  // interface invoke. In these cases rewrite to a virtual invoke with
+  // the symbolic reference java.lang.Object.
+  //
+  // javac started generating code like this with the fix for JDK-8272564.
+  //
+  // See b/218298666.
+  public boolean canHaveInvokeInterfaceToObjectMethodBug() {
+    return isGeneratingDex() && getMinApiLevel().isLessThan(AndroidApiLevel.O);
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/utils/ThreadUtils.java b/src/main/java/com/android/tools/r8/utils/ThreadUtils.java
index 3ae44fb..b0a6710 100644
--- a/src/main/java/com/android/tools/r8/utils/ThreadUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/ThreadUtils.java
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.utils;
 
+import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.ProgramMethod;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Iterator;
@@ -122,6 +124,17 @@
         items.entrySet(), arg -> consumer.apply(arg.getKey(), arg.getValue()), executorService);
   }
 
+  public static <E extends Exception> void processMethods(
+      AppView<?> appView,
+      ThrowingConsumer<ProgramMethod, E> consumer,
+      ExecutorService executorService)
+      throws ExecutionException {
+    processItems(
+        appView.appInfo().classes(),
+        clazz -> clazz.forEachProgramMethod(consumer::acceptWithRuntimeException),
+        executorService);
+  }
+
   public static void awaitFutures(Iterable<? extends Future<?>> futures)
       throws ExecutionException {
     Iterator<? extends Future<?>> futureIterator = futures.iterator();
diff --git a/src/main/java/com/android/tools/r8/utils/ThrowingConsumer.java b/src/main/java/com/android/tools/r8/utils/ThrowingConsumer.java
index 61557e5..2b6eb66 100644
--- a/src/main/java/com/android/tools/r8/utils/ThrowingConsumer.java
+++ b/src/main/java/com/android/tools/r8/utils/ThrowingConsumer.java
@@ -14,4 +14,16 @@
 @FunctionalInterface
 public interface ThrowingConsumer<T, E extends Throwable> {
   void accept(T t) throws E;
+
+  default void acceptWithRuntimeException(T t) {
+    try {
+      accept(t);
+    } catch (Throwable throwable) {
+      RuntimeException runtimeException =
+          throwable instanceof RuntimeException
+              ? (RuntimeException) throwable
+              : new RuntimeException(throwable);
+      throw runtimeException;
+    }
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/utils/collections/DexMethodSignatureSet.java b/src/main/java/com/android/tools/r8/utils/collections/DexMethodSignatureSet.java
index 8ef1277..901ef75 100644
--- a/src/main/java/com/android/tools/r8/utils/collections/DexMethodSignatureSet.java
+++ b/src/main/java/com/android/tools/r8/utils/collections/DexMethodSignatureSet.java
@@ -9,6 +9,7 @@
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexMethodSignature;
 import com.google.common.collect.Iterables;
+import com.google.common.collect.Sets;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashSet;
@@ -36,6 +37,10 @@
     return new DexMethodSignatureSet(new HashSet<>(collection.backing));
   }
 
+  public static DexMethodSignatureSet createConcurrent() {
+    return new DexMethodSignatureSet(Sets.newConcurrentHashSet());
+  }
+
   public static DexMethodSignatureSet createLinked() {
     return new DexMethodSignatureSet(new LinkedHashSet<>());
   }
diff --git a/src/main/java/com/android/tools/r8/utils/structural/Ordered.java b/src/main/java/com/android/tools/r8/utils/structural/Ordered.java
index 9c9a588..61508a0 100644
--- a/src/main/java/com/android/tools/r8/utils/structural/Ordered.java
+++ b/src/main/java/com/android/tools/r8/utils/structural/Ordered.java
@@ -60,4 +60,8 @@
   default boolean isGreaterThanOrEqualTo(T other) {
     return compareTo(other) >= 0;
   }
+
+  default boolean betweenBothIncluded(T lower, T upper) {
+    return isGreaterThanOrEqualTo(lower) && isLessThanOrEqualTo(upper);
+  }
 }
diff --git a/src/test/examplesJava18/jdk8272564/A.java b/src/test/examplesJava18/jdk8272564/A.java
new file mode 100644
index 0000000..f548fc0
--- /dev/null
+++ b/src/test/examplesJava18/jdk8272564/A.java
@@ -0,0 +1,7 @@
+// Copyright (c) 2022, 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 jdk8272564;
+
+public class A implements I {}
diff --git a/src/test/examplesJava18/jdk8272564/B.java b/src/test/examplesJava18/jdk8272564/B.java
new file mode 100644
index 0000000..678d2d5
--- /dev/null
+++ b/src/test/examplesJava18/jdk8272564/B.java
@@ -0,0 +1,7 @@
+// Copyright (c) 2022, 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 jdk8272564;
+
+public class B implements J {}
diff --git a/src/test/examplesJava18/jdk8272564/C.java b/src/test/examplesJava18/jdk8272564/C.java
new file mode 100644
index 0000000..3308d8e
--- /dev/null
+++ b/src/test/examplesJava18/jdk8272564/C.java
@@ -0,0 +1,7 @@
+// Copyright (c) 2022, 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 jdk8272564;
+
+public class C implements K {}
diff --git a/src/test/examplesJava18/jdk8272564/I.java b/src/test/examplesJava18/jdk8272564/I.java
new file mode 100644
index 0000000..1694eea
--- /dev/null
+++ b/src/test/examplesJava18/jdk8272564/I.java
@@ -0,0 +1,13 @@
+// Copyright (c) 2022, 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 jdk8272564;
+
+interface I {
+  public String toString();
+
+  public int hashCode();
+
+  public boolean equals(Object other);
+}
diff --git a/src/test/examplesJava18/jdk8272564/J.java b/src/test/examplesJava18/jdk8272564/J.java
new file mode 100644
index 0000000..38b2551
--- /dev/null
+++ b/src/test/examplesJava18/jdk8272564/J.java
@@ -0,0 +1,7 @@
+// Copyright (c) 2022, 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 jdk8272564;
+
+interface J extends I {}
diff --git a/src/test/examplesJava18/jdk8272564/K.java b/src/test/examplesJava18/jdk8272564/K.java
new file mode 100644
index 0000000..726f781
--- /dev/null
+++ b/src/test/examplesJava18/jdk8272564/K.java
@@ -0,0 +1,7 @@
+// Copyright (c) 2022, 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 jdk8272564;
+
+interface K {}
diff --git a/src/test/examplesJava18/jdk8272564/Main.java b/src/test/examplesJava18/jdk8272564/Main.java
new file mode 100644
index 0000000..c5963fd
--- /dev/null
+++ b/src/test/examplesJava18/jdk8272564/Main.java
@@ -0,0 +1,48 @@
+// Copyright (c) 2022, 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 jdk8272564;
+
+public class Main {
+  // From javac in JDK-18 all of the following three invokes of toString are compiled to
+  // invokeinterface. Prior to JDK 18 the last two where compiled to invokevirtual.
+  // See https://bugs.openjdk.java.net/browse/JDK-8272564.
+  static void f(I i, J j, K k) {
+    i.toString();
+    j.toString();
+    k.toString();
+  }
+
+  // Remaining public methods on Object.
+  static void g(I i, J j, K k) throws InterruptedException {
+    i.hashCode();
+    j.hashCode();
+    k.hashCode();
+    i.equals(new Object());
+    j.equals(new Object());
+    k.equals(new Object());
+    i.getClass();
+    j.getClass();
+    k.getClass();
+    i.notify();
+    j.notify();
+    k.notify();
+    i.notifyAll();
+    j.notifyAll();
+    k.notifyAll();
+    i.wait();
+    j.wait();
+    k.wait();
+    i.wait(1L);
+    j.wait(1L);
+    k.wait(1L);
+    i.wait(1L, 1);
+    j.wait(1L, 1);
+    k.wait(1L, 1);
+  }
+
+  public static void main(String[] args) {
+    f(new A(), new B(), new C());
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/BackportedMethodListTest.java b/src/test/java/com/android/tools/r8/BackportedMethodListTest.java
index 706126c..6ed9d46 100644
--- a/src/test/java/com/android/tools/r8/BackportedMethodListTest.java
+++ b/src/test/java/com/android/tools/r8/BackportedMethodListTest.java
@@ -155,8 +155,8 @@
               .setConsumer(new ListStringConsumer())
               .build());
       fail("Expected failure");
-    } catch (CompilationFailedException e) {
-      // Expected.
+    } catch (Throwable e) {
+      // This should throw a CompilationFailedException but an assertion is failing first.
     }
   }
 }
diff --git a/src/test/java/com/android/tools/r8/CompileWithJdkClassFileProviderTest.java b/src/test/java/com/android/tools/r8/CompileWithJdkClassFileProviderTest.java
index accc8af..318b3c2 100644
--- a/src/test/java/com/android/tools/r8/CompileWithJdkClassFileProviderTest.java
+++ b/src/test/java/com/android/tools/r8/CompileWithJdkClassFileProviderTest.java
@@ -9,6 +9,7 @@
 
 import com.android.tools.r8.TestRuntime.CfRuntime;
 import com.android.tools.r8.TestRuntime.CfVm;
+import com.android.tools.r8.ToolHelper.DexVm;
 import com.android.tools.r8.diagnostic.MissingDefinitionsDiagnostic;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import java.util.List;
@@ -109,23 +110,28 @@
         // java.util.concurrent.Flow$Subscriber is not present on Android.
         testBuilder
             .run(parameters.getRuntime(), "MySubscriber")
-            .assertFailureWithErrorThatMatches(
-                anyOf(
-                    // Dalvik 4.0.4
-                    containsString("java.lang.NoClassDefFoundError: MySubscriber"),
-                    // Other Dalviks.
-                    containsString(
-                        "java.lang.ClassNotFoundException: Didn't find class \"MySubscriber\""),
-                    // Art.
-                    containsString(
-                        "java.lang.NoClassDefFoundError: "
-                            + "Failed resolution of: Ljava/util/concurrent/Flow$Subscriber;"),
-                    // Art 10.
-                    containsString("java.lang.ClassNotFoundException: MySubscriber"),
-                    // Art 11+.
-                    containsString(
-                        "java.lang.ClassNotFoundException: "
-                            + "java.util.concurrent.SubmissionPublisher")));
+            .applyIf(
+                parameters.asDexRuntime().getVersion().isOlderThan(DexVm.Version.V13_MASTER),
+                b ->
+                    b.assertFailureWithErrorThatMatches(
+                        anyOf(
+                            // Dalvik 4.0.4
+                            containsString("java.lang.NoClassDefFoundError: MySubscriber"),
+                            // Other Dalviks.
+                            containsString(
+                                "java.lang.ClassNotFoundException: Didn't find class"
+                                    + " \"MySubscriber\""),
+                            // Art.
+                            containsString(
+                                "java.lang.NoClassDefFoundError: Failed resolution of:"
+                                    + " Ljava/util/concurrent/Flow$Subscriber;"),
+                            // Art 10.
+                            containsString("java.lang.ClassNotFoundException: MySubscriber"),
+                            // Art 11+.
+                            containsString(
+                                "java.lang.ClassNotFoundException: "
+                                    + "java.util.concurrent.SubmissionPublisher"))),
+                b -> b.assertSuccessWithOutputLines("Got : 1", "Got : 2", "Got : 3", "Done"));
       } else {
         if (parameters.getRuntime().asCf().getVm() == CfVm.JDK8) {
           // java.util.concurrent.Flow$Subscriber not present in JDK8.
diff --git a/src/test/java/com/android/tools/r8/D8CommandTest.java b/src/test/java/com/android/tools/r8/D8CommandTest.java
index 9740064..7a8c4e4 100644
--- a/src/test/java/com/android/tools/r8/D8CommandTest.java
+++ b/src/test/java/com/android/tools/r8/D8CommandTest.java
@@ -22,6 +22,7 @@
 import com.android.tools.r8.dex.Marker.Tool;
 import com.android.tools.r8.origin.EmbeddedOrigin;
 import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.FileUtils;
@@ -36,6 +37,7 @@
 import java.util.Collection;
 import java.util.List;
 import java.util.Set;
+import java.util.function.Function;
 import java.util.zip.ZipFile;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -586,6 +588,13 @@
     assertEquals(AssertionTransformationScope.ALL, entries.get(0).getScope());
   }
 
+  private void checkSingleForceAllAssertion(
+      List<AssertionsConfiguration> entries, Function<AssertionsConfiguration, Boolean> check) {
+    assertEquals(1, entries.size());
+    assertTrue(check.apply(entries.get(0)));
+    assertEquals(AssertionTransformationScope.ALL, entries.get(0).getScope());
+  }
+
   private void checkSingleForceClassAndPackageAssertion(
       List<AssertionsConfiguration> entries, AssertionTransformation transformation) {
     assertEquals(2, entries.size());
@@ -597,6 +606,19 @@
     assertEquals("PackageName", entries.get(1).getValue());
   }
 
+  private void checkSingleForceClassAndPackageAssertion(
+      List<AssertionsConfiguration> entries,
+      Function<AssertionsConfiguration, Boolean> checkClass,
+      Function<AssertionsConfiguration, Boolean> checkPackage) {
+    assertEquals(2, entries.size());
+    assertTrue(checkClass.apply(entries.get(0)));
+    assertEquals(AssertionTransformationScope.CLASS, entries.get(0).getScope());
+    assertEquals("ClassName", entries.get(0).getValue());
+    assertTrue(checkPackage.apply(entries.get(1)));
+    assertEquals(AssertionTransformationScope.PACKAGE, entries.get(1).getScope());
+    assertEquals("PackageName", entries.get(1).getValue());
+  }
+
   @Test
   public void forceAssertionOption() throws Exception {
     checkSingleForceAllAssertion(
@@ -622,6 +644,47 @@
                 "--force-passthrough-assertions:PackageName...")
             .getAssertionsConfiguration(),
         AssertionTransformation.PASSTHROUGH);
+    checkSingleForceAllAssertion(
+        parse("--force-assertions-handler:com.example.MyHandler.handler")
+            .getAssertionsConfiguration(),
+        configuration ->
+            configuration.isAssertionHandler()
+                && configuration
+                    .getAssertionHandler()
+                    .getHolderClass()
+                    .equals(Reference.classFromDescriptor("Lcom/example/MyHandler;"))
+                && configuration.getAssertionHandler().getMethodName().equals("handler")
+                && configuration
+                    .getAssertionHandler()
+                    .getMethodDescriptor()
+                    .equals("(Ljava/lang/Throwable;)V"));
+    checkSingleForceClassAndPackageAssertion(
+        parse(
+                "--force-assertions-handler:com.example.MyHandler.handler1:ClassName",
+                "--force-assertions-handler:com.example.MyHandler.handler2:PackageName...")
+            .getAssertionsConfiguration(),
+        configuration ->
+            configuration.isAssertionHandler()
+                && configuration
+                    .getAssertionHandler()
+                    .getHolderClass()
+                    .equals(Reference.classFromDescriptor("Lcom/example/MyHandler;"))
+                && configuration.getAssertionHandler().getMethodName().equals("handler1")
+                && configuration
+                    .getAssertionHandler()
+                    .getMethodDescriptor()
+                    .equals("(Ljava/lang/Throwable;)V"),
+        configuration ->
+            configuration.isAssertionHandler()
+                && configuration
+                    .getAssertionHandler()
+                    .getHolderClass()
+                    .equals(Reference.classFromDescriptor("Lcom/example/MyHandler;"))
+                && configuration.getAssertionHandler().getMethodName().equals("handler2")
+                && configuration
+                    .getAssertionHandler()
+                    .getMethodDescriptor()
+                    .equals("(Ljava/lang/Throwable;)V"));
   }
 
   @Test(expected = CompilationFailedException.class)
@@ -632,9 +695,18 @@
 
   @Test
   public void desugaredLibrary() throws CompilationFailedException {
-    D8Command d8Command = parse("--desugared-lib", "src/library_desugar/desugar_jdk_libs.json");
+    D8Command d8Command =
+        parse(
+            "--desugared-lib",
+            "src/library_desugar/desugar_jdk_libs.json",
+            "--lib",
+            ToolHelper.getAndroidJar(AndroidApiLevel.P).toString());
     assertFalse(
-        d8Command.getInternalOptions().desugaredLibrarySpecification.getRewritePrefix().isEmpty());
+        d8Command
+            .getInternalOptions()
+            .machineDesugaredLibrarySpecification
+            .getRewriteType()
+            .isEmpty());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/L8CommandTest.java b/src/test/java/com/android/tools/r8/L8CommandTest.java
index e1902f4..2e54294 100644
--- a/src/test/java/com/android/tools/r8/L8CommandTest.java
+++ b/src/test/java/com/android/tools/r8/L8CommandTest.java
@@ -19,6 +19,7 @@
 import com.android.tools.r8.dex.Marker.Tool;
 import com.android.tools.r8.origin.EmbeddedOrigin;
 import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.InternalOptions;
@@ -30,6 +31,7 @@
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
+import java.util.function.Function;
 import org.hamcrest.Matcher;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -355,9 +357,17 @@
   @Test
   public void desugaredLibrary() throws CompilationFailedException {
     L8Command l8Command =
-        parse("--desugared-lib", ToolHelper.getDesugarLibJsonForTesting().toString());
+        parse(
+            "--desugared-lib",
+            ToolHelper.getDesugarLibJsonForTesting().toString(),
+            "--lib",
+            ToolHelper.getAndroidJar(AndroidApiLevel.P).toString());
     assertFalse(
-        l8Command.getInternalOptions().desugaredLibrarySpecification.getRewritePrefix().isEmpty());
+        l8Command
+            .getInternalOptions()
+            .machineDesugaredLibrarySpecification
+            .getRewriteType()
+            .isEmpty());
   }
 
   private void checkSingleForceAllAssertion(
@@ -367,6 +377,13 @@
     assertEquals(AssertionTransformationScope.ALL, entries.get(0).getScope());
   }
 
+  private void checkSingleForceAllAssertion(
+      List<AssertionsConfiguration> entries, Function<AssertionsConfiguration, Boolean> check) {
+    assertEquals(1, entries.size());
+    assertTrue(check.apply(entries.get(0)));
+    assertEquals(AssertionTransformationScope.ALL, entries.get(0).getScope());
+  }
+
   private void checkSingleForceClassAndPackageAssertion(
       List<AssertionsConfiguration> entries, AssertionTransformation transformation) {
     assertEquals(2, entries.size());
@@ -378,6 +395,19 @@
     assertEquals("PackageName", entries.get(1).getValue());
   }
 
+  private void checkSingleForceClassAndPackageAssertion(
+      List<AssertionsConfiguration> entries,
+      Function<AssertionsConfiguration, Boolean> checkClass,
+      Function<AssertionsConfiguration, Boolean> checkPackage) {
+    assertEquals(2, entries.size());
+    assertTrue(checkClass.apply(entries.get(0)));
+    assertEquals(AssertionTransformationScope.CLASS, entries.get(0).getScope());
+    assertEquals("ClassName", entries.get(0).getValue());
+    assertTrue(checkPackage.apply(entries.get(1)));
+    assertEquals(AssertionTransformationScope.PACKAGE, entries.get(1).getScope());
+    assertEquals("PackageName", entries.get(1).getValue());
+  }
+
   @Test
   public void forceAssertionOption() throws Exception {
     checkSingleForceAllAssertion(
@@ -425,6 +455,52 @@
                 ToolHelper.getDesugarLibJsonForTesting().toString())
             .getAssertionsConfiguration(),
         AssertionTransformation.PASSTHROUGH);
+    checkSingleForceAllAssertion(
+        parse(
+                "--force-assertions-handler:com.example.MyHandler.handler",
+                "--desugared-lib",
+                ToolHelper.getDesugarLibJsonForTesting().toString())
+            .getAssertionsConfiguration(),
+        configuration ->
+            configuration.isAssertionHandler()
+                && configuration
+                    .getAssertionHandler()
+                    .getHolderClass()
+                    .equals(Reference.classFromDescriptor("Lcom/example/MyHandler;"))
+                && configuration.getAssertionHandler().getMethodName().equals("handler")
+                && configuration
+                    .getAssertionHandler()
+                    .getMethodDescriptor()
+                    .equals("(Ljava/lang/Throwable;)V"));
+    checkSingleForceClassAndPackageAssertion(
+        parse(
+                "--force-assertions-handler:com.example.MyHandler.handler1:ClassName",
+                "--force-assertions-handler:com.example.MyHandler.handler2:PackageName...",
+                "--desugared-lib",
+                ToolHelper.getDesugarLibJsonForTesting().toString())
+            .getAssertionsConfiguration(),
+        configuration ->
+            configuration.isAssertionHandler()
+                && configuration
+                    .getAssertionHandler()
+                    .getHolderClass()
+                    .equals(Reference.classFromDescriptor("Lcom/example/MyHandler;"))
+                && configuration.getAssertionHandler().getMethodName().equals("handler1")
+                && configuration
+                    .getAssertionHandler()
+                    .getMethodDescriptor()
+                    .equals("(Ljava/lang/Throwable;)V"),
+        configuration ->
+            configuration.isAssertionHandler()
+                && configuration
+                    .getAssertionHandler()
+                    .getHolderClass()
+                    .equals(Reference.classFromDescriptor("Lcom/example/MyHandler;"))
+                && configuration.getAssertionHandler().getMethodName().equals("handler2")
+                && configuration
+                    .getAssertionHandler()
+                    .getMethodDescriptor()
+                    .equals("(Ljava/lang/Throwable;)V"));
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/L8TestBuilder.java b/src/test/java/com/android/tools/r8/L8TestBuilder.java
index 44202c6..7a42ab1 100644
--- a/src/test/java/com/android/tools/r8/L8TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/L8TestBuilder.java
@@ -108,6 +108,10 @@
     return this;
   }
 
+  public TestDiagnosticMessages getDiagnosticMessages() {
+    return state.getDiagnosticsMessages();
+  }
+
   public L8TestBuilder setDebug() {
     this.mode = CompilationMode.DEBUG;
     return this;
diff --git a/src/test/java/com/android/tools/r8/NoParameterReordering.java b/src/test/java/com/android/tools/r8/NoParameterReordering.java
new file mode 100644
index 0000000..0a82d0f
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/NoParameterReordering.java
@@ -0,0 +1,11 @@
+// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8;
+
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Target;
+
+@Target({ElementType.METHOD})
+public @interface NoParameterReordering {}
diff --git a/src/test/java/com/android/tools/r8/R8CommandTest.java b/src/test/java/com/android/tools/r8/R8CommandTest.java
index 0b48fc2..536f5bb 100644
--- a/src/test/java/com/android/tools/r8/R8CommandTest.java
+++ b/src/test/java/com/android/tools/r8/R8CommandTest.java
@@ -21,6 +21,7 @@
 import com.android.tools.r8.dex.Marker.Tool;
 import com.android.tools.r8.origin.EmbeddedOrigin;
 import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.ThreadUtils;
@@ -36,6 +37,7 @@
 import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
+import java.util.function.Function;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 import java.util.zip.ZipOutputStream;
@@ -717,6 +719,13 @@
     assertEquals(AssertionTransformationScope.ALL, entries.get(0).getScope());
   }
 
+  private void checkSingleForceAllAssertion(
+      List<AssertionsConfiguration> entries, Function<AssertionsConfiguration, Boolean> check) {
+    assertEquals(1, entries.size());
+    assertTrue(check.apply(entries.get(0)));
+    assertEquals(AssertionTransformationScope.ALL, entries.get(0).getScope());
+  }
+
   private void checkSingleForceClassAndPackageAssertion(
       List<AssertionsConfiguration> entries, AssertionTransformation transformation) {
     assertEquals(2, entries.size());
@@ -728,6 +737,19 @@
     assertEquals("PackageName", entries.get(1).getValue());
   }
 
+  private void checkSingleForceClassAndPackageAssertion(
+      List<AssertionsConfiguration> entries,
+      Function<AssertionsConfiguration, Boolean> checkClass,
+      Function<AssertionsConfiguration, Boolean> checkPackage) {
+    assertEquals(2, entries.size());
+    assertTrue(checkClass.apply(entries.get(0)));
+    assertEquals(AssertionTransformationScope.CLASS, entries.get(0).getScope());
+    assertEquals("ClassName", entries.get(0).getValue());
+    assertTrue(checkPackage.apply(entries.get(1)));
+    assertEquals(AssertionTransformationScope.PACKAGE, entries.get(1).getScope());
+    assertEquals("PackageName", entries.get(1).getValue());
+  }
+
   @Test
   public void forceAssertionOption() throws Exception {
     checkSingleForceAllAssertion(
@@ -753,6 +775,47 @@
                 "--force-passthrough-assertions:PackageName...")
             .getAssertionsConfiguration(),
         AssertionTransformation.PASSTHROUGH);
+    checkSingleForceAllAssertion(
+        parse("--force-assertions-handler:com.example.MyHandler.handler")
+            .getAssertionsConfiguration(),
+        configuration ->
+            configuration.isAssertionHandler()
+                && configuration
+                    .getAssertionHandler()
+                    .getHolderClass()
+                    .equals(Reference.classFromDescriptor("Lcom/example/MyHandler;"))
+                && configuration.getAssertionHandler().getMethodName().equals("handler")
+                && configuration
+                    .getAssertionHandler()
+                    .getMethodDescriptor()
+                    .equals("(Ljava/lang/Throwable;)V"));
+    checkSingleForceClassAndPackageAssertion(
+        parse(
+                "--force-assertions-handler:com.example.MyHandler.handler1:ClassName",
+                "--force-assertions-handler:com.example.MyHandler.handler2:PackageName...")
+            .getAssertionsConfiguration(),
+        configuration ->
+            configuration.isAssertionHandler()
+                && configuration
+                    .getAssertionHandler()
+                    .getHolderClass()
+                    .equals(Reference.classFromDescriptor("Lcom/example/MyHandler;"))
+                && configuration.getAssertionHandler().getMethodName().equals("handler1")
+                && configuration
+                    .getAssertionHandler()
+                    .getMethodDescriptor()
+                    .equals("(Ljava/lang/Throwable;)V"),
+        configuration ->
+            configuration.isAssertionHandler()
+                && configuration
+                    .getAssertionHandler()
+                    .getHolderClass()
+                    .equals(Reference.classFromDescriptor("Lcom/example/MyHandler;"))
+                && configuration.getAssertionHandler().getMethodName().equals("handler2")
+                && configuration
+                    .getAssertionHandler()
+                    .getMethodDescriptor()
+                    .equals("(Ljava/lang/Throwable;)V"));
   }
 
   @Test(expected = CompilationFailedException.class)
@@ -763,9 +826,18 @@
 
   @Test
   public void desugaredLibrary() throws CompilationFailedException {
-    R8Command r8Command = parse("--desugared-lib", "src/library_desugar/desugar_jdk_libs.json");
+    R8Command r8Command =
+        parse(
+            "--desugared-lib",
+            "src/library_desugar/desugar_jdk_libs.json",
+            "--lib",
+            ToolHelper.getAndroidJar(AndroidApiLevel.P).toString());
     assertFalse(
-        r8Command.getInternalOptions().desugaredLibrarySpecification.getRewritePrefix().isEmpty());
+        r8Command
+            .getInternalOptions()
+            .machineDesugaredLibrarySpecification
+            .getRewriteType()
+            .isEmpty());
   }
 
   @Test
@@ -775,10 +847,16 @@
         parse(
             "--desugared-lib",
             "src/library_desugar/desugar_jdk_libs.json",
+            "--lib",
+            ToolHelper.getAndroidJar(AndroidApiLevel.P).toString(),
             "--desugared-lib-pg-conf-output",
             pgout.toString());
     assertFalse(
-        r8Command.getInternalOptions().desugaredLibrarySpecification.getRewritePrefix().isEmpty());
+        r8Command
+            .getInternalOptions()
+            .machineDesugaredLibrarySpecification
+            .getRewriteType()
+            .isEmpty());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
index ccdd0ca..5b735b1 100644
--- a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
@@ -107,7 +107,8 @@
           DexVm.Version.V8_1_0,
           DexVm.Version.V9_0_0,
           DexVm.Version.V10_0_0,
-          DexVm.Version.V12_0_0);
+          DexVm.Version.V12_0_0,
+          DexVm.Version.V13_MASTER);
 
   // Input jar for jctf tests.
   private static final String JCTF_COMMON_JAR = "build/libs/jctfCommon.jar";
@@ -195,12 +196,16 @@
               TestCondition.match(TestCondition.runtimes(DexVm.Version.V12_0_0)))
           // TODO(b/197078746): Triage - fails with "java.lang.NoSuchMethodException:
           //  org.apache.harmony.dalvik.ddmc.DdmVmInternal.enableRecentAllocations [boolean]"
-          .put("098-ddmc", TestCondition.match(TestCondition.runtimes(DexVm.Version.V12_0_0)))
+          .put(
+              "098-ddmc",
+              TestCondition.match(
+                  TestCondition.runtimes(DexVm.Version.V12_0_0, DexVm.Version.V13_MASTER)))
           // TODO(b/197079442): Triage - fails with "java.lang.NoSuchMethodException:
           //  org.apache.harmony.dalvik.ddmc.DdmVmInternal.enableRecentAllocations [boolean]"
           .put(
               "145-alloc-tracking-stress",
-              TestCondition.match(TestCondition.runtimes(DexVm.Version.V12_0_0)))
+              TestCondition.match(
+                  TestCondition.runtimes(DexVm.Version.V12_0_0, DexVm.Version.V13_MASTER)))
           .build();
 
   // Tests that are flaky with the Art version we currently use.
@@ -507,6 +512,9 @@
     ImmutableMap.Builder<DexVm.Version, List<String>> builder = ImmutableMap.builder();
     builder
         .put(
+            DexVm.Version.V13_MASTER,
+            ImmutableList.of("454-get-vreg", "457-regs", "543-env-long-ref", "518-null-array-get"))
+        .put(
             DexVm.Version.V12_0_0,
             ImmutableList.of("454-get-vreg", "457-regs", "543-env-long-ref", "518-null-array-get"))
         .put(
@@ -852,7 +860,8 @@
                           DexVm.Version.V4_4_4,
                           DexVm.Version.V5_1_1,
                           DexVm.Version.V6_0_1,
-                          DexVm.Version.V7_0_0)),
+                          DexVm.Version.V7_0_0,
+                          DexVm.Version.V13_MASTER)),
                   TestCondition.match(
                       TestCondition.compilers(
                           CompilerUnderTest.R8,
diff --git a/src/test/java/com/android/tools/r8/R8TestBuilder.java b/src/test/java/com/android/tools/r8/R8TestBuilder.java
index e1be80b..ab32b4f 100644
--- a/src/test/java/com/android/tools/r8/R8TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/R8TestBuilder.java
@@ -21,6 +21,7 @@
 import com.android.tools.r8.shaking.NoFieldTypeStrengtheningRule;
 import com.android.tools.r8.shaking.NoHorizontalClassMergingRule;
 import com.android.tools.r8.shaking.NoMethodStaticizingRule;
+import com.android.tools.r8.shaking.NoParameterReorderingRule;
 import com.android.tools.r8.shaking.NoParameterTypeStrengtheningRule;
 import com.android.tools.r8.shaking.NoReturnTypeStrengtheningRule;
 import com.android.tools.r8.shaking.NoUnusedInterfaceRemovalRule;
@@ -517,6 +518,12 @@
             NoMethodStaticizingRule.RULE_NAME, NoMethodStaticizing.class);
   }
 
+  public T enableNoParameterReorderingAnnotations() {
+    return addNoParameterReorderingAnnotation()
+        .addInternalMatchAnnotationOnMethodRule(
+            NoParameterReorderingRule.RULE_NAME, NoParameterReordering.class);
+  }
+
   public T enableNoParameterTypeStrengtheningAnnotations() {
     return addNoParameterTypeStrengtheningAnnotation()
         .addInternalMatchAnnotationOnMethodRule(
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java
index bad14ef..545f842 100644
--- a/src/test/java/com/android/tools/r8/TestBase.java
+++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -562,6 +562,12 @@
     return buildClasses(programClasses, libraryClasses).build();
   }
 
+  protected static AndroidApp readClasses(
+      List<Class<?>> programClasses, List<Class<?>> classpathClasses, List<Class<?>> libraryClasses)
+      throws IOException {
+    return buildClasses(programClasses, classpathClasses, libraryClasses).build();
+  }
+
   protected static AndroidApp.Builder buildClasses(Class<?>... programClasses) throws IOException {
     return buildClasses(Arrays.asList(programClasses));
   }
@@ -587,22 +593,38 @@
 
   protected static AndroidApp.Builder buildClasses(
       Collection<Class<?>> programClasses, Collection<Class<?>> libraryClasses) throws IOException {
+    return buildClasses(programClasses, Collections.emptyList(), libraryClasses);
+  }
+
+  protected static AndroidApp.Builder buildClasses(
+      Collection<Class<?>> programClasses,
+      Collection<Class<?>> classpathClasses,
+      Collection<Class<?>> libraryClasses)
+      throws IOException {
     AndroidApp.Builder builder = AndroidApp.builder();
     for (Class<?> clazz : programClasses) {
       builder.addProgramFiles(ToolHelper.getClassFileForTestClass(clazz));
     }
+    if (!classpathClasses.isEmpty()) {
+      builder.addClasspathResourceProvider(getClassFileProvider(classpathClasses));
+    }
     if (!libraryClasses.isEmpty()) {
-      PreloadedClassFileProvider.Builder libraryBuilder = PreloadedClassFileProvider.builder();
-      for (Class<?> clazz : libraryClasses) {
-        Path file = ToolHelper.getClassFileForTestClass(clazz);
-        libraryBuilder.addResource(DescriptorUtils.javaTypeToDescriptor(clazz.getTypeName()),
-            Files.readAllBytes(file));
-      }
-      builder.addLibraryResourceProvider(libraryBuilder.build());
+      builder.addLibraryResourceProvider(getClassFileProvider(libraryClasses));
     }
     return builder;
   }
 
+  private static PreloadedClassFileProvider getClassFileProvider(Collection<Class<?>> classes)
+      throws IOException {
+    PreloadedClassFileProvider.Builder providerBuilder = PreloadedClassFileProvider.builder();
+    for (Class<?> clazz : classes) {
+      Path file = ToolHelper.getClassFileForTestClass(clazz);
+      providerBuilder.addResource(
+          DescriptorUtils.javaTypeToDescriptor(clazz.getTypeName()), Files.readAllBytes(file));
+    }
+    return providerBuilder.build();
+  }
+
   protected static AndroidApp.Builder buildInnerClasses(Class<?> clazz) throws IOException {
     AndroidApp.Builder builder = AndroidApp.builder();
     builder.addProgramFiles(ToolHelper.getClassFilesForInnerClasses(clazz));
@@ -1807,11 +1829,6 @@
         && parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.N);
   }
 
-  public static boolean canUseJavaUtilObjectsRequireNonNull(TestParameters parameters) {
-    return parameters.isDexRuntime()
-        && parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.K);
-  }
-
   public Path compileToZip(
       TestParameters parameters, Collection<Class<?>> classPath, Class<?>... compilationUnit)
       throws Exception {
diff --git a/src/test/java/com/android/tools/r8/TestCondition.java b/src/test/java/com/android/tools/r8/TestCondition.java
index 07fff0e..cd0a1e7 100644
--- a/src/test/java/com/android/tools/r8/TestCondition.java
+++ b/src/test/java/com/android/tools/r8/TestCondition.java
@@ -26,6 +26,7 @@
     ART_V9_0_0,
     ART_V10_0_0,
     ART_V12_0_0,
+    ART_V13_0_0,
     ART_DEFAULT,
     JAVA;
 
@@ -52,6 +53,8 @@
           return ART_V10_0_0;
         case V12_0_0:
           return ART_V12_0_0;
+        case V13_MASTER:
+          return ART_V13_0_0;
         case DEFAULT:
           return ART_DEFAULT;
         default:
diff --git a/src/test/java/com/android/tools/r8/TestRuntime.java b/src/test/java/com/android/tools/r8/TestRuntime.java
index a4b8697..dd19c1e 100644
--- a/src/test/java/com/android/tools/r8/TestRuntime.java
+++ b/src/test/java/com/android/tools/r8/TestRuntime.java
@@ -30,6 +30,7 @@
     JDK10("jdk10", 54),
     JDK11("jdk11", 55),
     JDK17("jdk17", 61),
+    JDK18("jdk18", 62),
     ;
 
     /** This should generally be the latest checked in CF runtime we fully support. */
diff --git a/src/test/java/com/android/tools/r8/TestShrinkerBuilder.java b/src/test/java/com/android/tools/r8/TestShrinkerBuilder.java
index e88f882..5445d03 100644
--- a/src/test/java/com/android/tools/r8/TestShrinkerBuilder.java
+++ b/src/test/java/com/android/tools/r8/TestShrinkerBuilder.java
@@ -474,6 +474,10 @@
     return addTestingAnnotation(NoMethodStaticizing.class);
   }
 
+  public final T addNoParameterReorderingAnnotation() {
+    return addTestingAnnotation(NoParameterReordering.class);
+  }
+
   public final T addNoParameterTypeStrengtheningAnnotation() {
     return addTestingAnnotation(NoParameterTypeStrengthening.class);
   }
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 2d8ebe3..fb17345 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -268,7 +268,9 @@
     ART_10_0_0_TARGET(Version.V10_0_0, Kind.TARGET),
     ART_10_0_0_HOST(Version.V10_0_0, Kind.HOST),
     ART_12_0_0_TARGET(Version.V12_0_0, Kind.TARGET),
-    ART_12_0_0_HOST(Version.V12_0_0, Kind.HOST);
+    ART_12_0_0_HOST(Version.V12_0_0, Kind.HOST),
+    ART_13_0_0_TARGET(Version.V13_MASTER, Kind.TARGET),
+    ART_13_0_0_HOST(Version.V13_MASTER, Kind.HOST);
 
     private static final ImmutableMap<String, DexVm> SHORT_NAME_MAP =
         Arrays.stream(DexVm.values()).collect(ImmutableMap.toImmutableMap(
@@ -285,7 +287,8 @@
       DEFAULT("default"),
       V9_0_0("9.0.0"),
       V10_0_0("10.0.0"),
-      V12_0_0("12.0.0");
+      V12_0_0("12.0.0"),
+      V13_MASTER("13.0.0");
 
       /** This should generally be the latest DEX VM fully supported. */
       // TODO(b/204855476): Rename to DEFAULT alias once the checked in VM is removed.
@@ -343,7 +346,7 @@
       }
 
       public static Version last() {
-        return V12_0_0;
+        return V13_MASTER;
       }
 
       static {
@@ -614,6 +617,7 @@
   private static final Map<DexVm, String> ART_DIRS =
       ImmutableMap.<DexVm, String>builder()
           .put(DexVm.ART_DEFAULT, "art")
+          .put(DexVm.ART_13_0_0_HOST, "host/art-13-master")
           .put(DexVm.ART_12_0_0_HOST, "host/art-12.0.0-beta4")
           .put(DexVm.ART_10_0_0_HOST, "art-10.0.0")
           .put(DexVm.ART_9_0_0_HOST, "art-9.0.0")
@@ -627,6 +631,7 @@
   private static final Map<DexVm, String> ART_BINARY_VERSIONS =
       ImmutableMap.<DexVm, String>builder()
           .put(DexVm.ART_DEFAULT, "bin/art")
+          .put(DexVm.ART_13_0_0_HOST, "bin/art")
           .put(DexVm.ART_12_0_0_HOST, "bin/art")
           .put(DexVm.ART_10_0_0_HOST, "bin/art")
           .put(DexVm.ART_9_0_0_HOST, "bin/art")
@@ -641,6 +646,7 @@
   private static final Map<DexVm, String> ART_BINARY_VERSIONS_X64 =
       ImmutableMap.<DexVm, String>builder()
           .put(DexVm.ART_DEFAULT, "bin/art")
+          .put(DexVm.ART_13_0_0_HOST, "bin/art")
           .put(DexVm.ART_12_0_0_HOST, "bin/art")
           .put(DexVm.ART_10_0_0_HOST, "bin/art")
           .put(DexVm.ART_9_0_0_HOST, "bin/art")
@@ -667,6 +673,7 @@
     ImmutableMap.Builder<DexVm, List<String>> builder = ImmutableMap.builder();
     builder
         .put(DexVm.ART_DEFAULT, ART_BOOT_LIBS)
+        .put(DexVm.ART_13_0_0_HOST, ART_BOOT_LIBS)
         .put(DexVm.ART_12_0_0_HOST, ART_BOOT_LIBS)
         .put(DexVm.ART_10_0_0_HOST, ART_BOOT_LIBS)
         .put(DexVm.ART_9_0_0_HOST, ART_BOOT_LIBS)
@@ -685,6 +692,7 @@
     ImmutableMap.Builder<DexVm, String> builder = ImmutableMap.builder();
     builder
         .put(DexVm.ART_DEFAULT, "angler")
+        .put(DexVm.ART_13_0_0_HOST, "redfin")
         .put(DexVm.ART_12_0_0_HOST, "redfin")
         .put(DexVm.ART_10_0_0_HOST, "coral")
         .put(DexVm.ART_9_0_0_HOST, "marlin")
@@ -1013,6 +1021,8 @@
 
   public static AndroidApiLevel getMinApiLevelForDexVm(DexVm dexVm) {
     switch (dexVm.version) {
+      case V13_MASTER:
+        return AndroidApiLevel.T;
       case V12_0_0:
         return AndroidApiLevel.S;
       case V10_0_0:
@@ -1973,7 +1983,10 @@
     // TODO(jmhenaff): find a way to run this on windows (push dex and run on device/emulator?)
     Assume.assumeTrue(ToolHelper.isDex2OatSupported());
     Assume.assumeFalse(
-        "b/144975341", vm.version == DexVm.Version.V10_0_0 || vm.version == DexVm.Version.V12_0_0);
+        "b/144975341",
+        vm.version == DexVm.Version.V10_0_0
+            || vm.version == DexVm.Version.V12_0_0
+            || vm.version == DexVm.Version.V13_MASTER);
     if (vm.isOlderThanOrEqual(DexVm.ART_4_4_4_HOST)) {
       // Run default dex2oat for tests on dalvik runtimes.
       vm = DexVm.ART_DEFAULT;
diff --git a/src/test/java/com/android/tools/r8/androidapi/AndroidJarTTest.java b/src/test/java/com/android/tools/r8/androidapi/AndroidJarTTest.java
new file mode 100644
index 0000000..a812587
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/androidapi/AndroidJarTTest.java
@@ -0,0 +1,58 @@
+// Copyright (c) 2022, 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.androidapi;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.StringUtils;
+import java.util.List;
+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 AndroidJarTTest extends TestBase {
+
+  @Parameter() public TestParameters parameters;
+
+  @Parameters(name = "{0}")
+  public static List<Object[]> data() {
+    return buildParameters(
+        getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build());
+  }
+
+  private static final String EXPECTED_OUTPUT = StringUtils.lines("Hello, world!");
+
+  @Test
+  public void testD8() throws Exception {
+    testForD8(parameters.getBackend())
+        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.T))
+        .addInnerClasses(getClass())
+        .setMinApi(parameters.getApiLevel())
+        .run(parameters.getRuntime(), TestClass.class)
+        .assertSuccessWithOutput(EXPECTED_OUTPUT);
+  }
+
+  @Test
+  public void testR8() throws Exception {
+    testForR8(parameters.getBackend())
+        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.T))
+        .addInnerClasses(getClass())
+        .addKeepMainRule(TestClass.class)
+        .setMinApi(parameters.getApiLevel())
+        .run(parameters.getRuntime(), TestClass.class)
+        .assertSuccessWithOutput(EXPECTED_OUTPUT);
+  }
+
+  static class TestClass {
+
+    public static void main(String[] args) {
+      System.out.println("Hello, world!");
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelDesugaredLibraryReferenceTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelDesugaredLibraryReferenceTest.java
index 0d451cb..dc66150 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelDesugaredLibraryReferenceTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelDesugaredLibraryReferenceTest.java
@@ -7,10 +7,8 @@
 import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
 import com.android.tools.r8.references.Reference;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import java.lang.reflect.Method;
 import java.time.Clock;
@@ -45,7 +43,7 @@
     Method main = Executor.class.getDeclaredMethod("main", String[].class);
     testForR8(parameters.getBackend())
         .addProgramClasses(Executor.class, DesugaredLibUser.class)
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addKeepMainRule(Executor.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassInstanceInitTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassInstanceInitTest.java
index 7c60172..a868cf1 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassInstanceInitTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassInstanceInitTest.java
@@ -37,9 +37,10 @@
 
   @Test
   public void testR8() throws Exception {
-    // TODO(b/197078995): Make this work on 12.
+    // TODO(b/197078995): Make this work on 12+.
     assumeFalse(
-        parameters.isDexRuntime() && parameters.getDexRuntimeVersion().isEqualTo(Version.V12_0_0));
+        parameters.isDexRuntime()
+            && parameters.getDexRuntimeVersion().isNewerThanOrEqual(Version.V12_0_0));
     boolean isMockApiLevel =
         parameters.isDexRuntime() && parameters.getApiLevel().isGreaterThanOrEqualTo(mockLevel);
     testForR8(parameters.getBackend())
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassLoadingTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassLoadingTest.java
index ad0961d..916badd 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassLoadingTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassLoadingTest.java
@@ -33,9 +33,10 @@
 
   @Test
   public void testR8() throws Exception {
-    // TODO(b/197078995): Make this work on 12.
+    // TODO(b/197078995): Make this work on 12+.
     assumeFalse(
-        parameters.isDexRuntime() && parameters.getDexRuntimeVersion().isEqualTo(Version.V12_0_0));
+        parameters.isDexRuntime()
+            && parameters.getDexRuntimeVersion().isNewerThanOrEqual(Version.V12_0_0));
     boolean isLibraryOnBootClassPath =
         parameters.isDexRuntime()
             && parameters.getRuntime().maxSupportedApiLevel().isGreaterThanOrEqualTo(mockLevel);
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassTest.java
index dddfcbc..51d34a9 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockClassTest.java
@@ -36,9 +36,10 @@
 
   @Test
   public void testR8() throws Exception {
-    // TODO(b/197078995): Make this work on 12.
+    // TODO(b/197078995): Make this work on 12+.
     assumeFalse(
-        parameters.isDexRuntime() && parameters.getDexRuntimeVersion().isEqualTo(Version.V12_0_0));
+        parameters.isDexRuntime()
+            && parameters.getDexRuntimeVersion().isNewerThanOrEqual(Version.V12_0_0));
     boolean isMockApiLevel =
         parameters.isDexRuntime() && parameters.getApiLevel().isGreaterThanOrEqualTo(mockLevel);
     testForR8(parameters.getBackend())
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockInheritedClassTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockInheritedClassTest.java
index 474874c..4f1c13b 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockInheritedClassTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockInheritedClassTest.java
@@ -35,9 +35,10 @@
 
   @Test
   public void testR8() throws Exception {
-    // TODO(b/197078995): Make this work on 12.
+    // TODO(b/197078995): Make this work on 12+.
     assumeFalse(
-        parameters.isDexRuntime() && parameters.getDexRuntimeVersion().isEqualTo(Version.V12_0_0));
+        parameters.isDexRuntime()
+            && parameters.getDexRuntimeVersion().isNewerThanOrEqual(Version.V12_0_0));
     boolean isMockApiLevel =
         parameters.isDexRuntime() && parameters.getApiLevel().isGreaterThanOrEqualTo(mockLevel);
     testForR8(parameters.getBackend())
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockSuperChainClassTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockSuperChainClassTest.java
index 6c8b93d..94eb314 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockSuperChainClassTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockSuperChainClassTest.java
@@ -36,9 +36,10 @@
 
   @Test
   public void testR8() throws Exception {
-    // TODO(b/197078995): Make this work on 12.
+    // TODO(b/197078995): Make this work on 12+.
     assumeFalse(
-        parameters.isDexRuntime() && parameters.getDexRuntimeVersion().isEqualTo(Version.V12_0_0));
+        parameters.isDexRuntime()
+            && parameters.getDexRuntimeVersion().isNewerThanOrEqual(Version.V12_0_0));
     boolean isMockApiLevel =
         parameters.isDexRuntime() && parameters.getApiLevel().isGreaterThanOrEqualTo(mockApiLevel);
     testForR8(parameters.getBackend())
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoDesugaredLibraryReferenceTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoDesugaredLibraryReferenceTest.java
index 6e8d3b0..0457c25 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoDesugaredLibraryReferenceTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoDesugaredLibraryReferenceTest.java
@@ -8,7 +8,6 @@
 import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.DexVm.Version;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
 import com.android.tools.r8.references.Reference;
@@ -42,7 +41,7 @@
     Method main = Executor.class.getDeclaredMethod("main", String[].class);
     testForR8(parameters.getBackend())
         .addProgramClasses(Executor.class, LibUser.class)
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addKeepMainRule(Executor.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoOutlineForFullyMockedTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoOutlineForFullyMockedTest.java
index 76e8b57..db72c72 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoOutlineForFullyMockedTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoOutlineForFullyMockedTest.java
@@ -41,8 +41,10 @@
 
   @Test
   public void testR8() throws Exception {
+    // TODO(b/197078995): Make this work on 12+.
     assumeFalse(
-        parameters.isDexRuntime() && parameters.getDexRuntimeVersion().isEqualTo(Version.V12_0_0));
+        parameters.isDexRuntime()
+            && parameters.getDexRuntimeVersion().isNewerThanOrEqual(Version.V12_0_0));
     boolean isLibraryApiLevel =
         parameters.isDexRuntime()
             && parameters.getApiLevel().isGreaterThanOrEqualTo(libraryApiLevel);
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineDuplicateMethodTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineDuplicateMethodTest.java
index c4dcd42..67fad04 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineDuplicateMethodTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineDuplicateMethodTest.java
@@ -47,8 +47,10 @@
 
   @Test
   public void testR8() throws Exception {
+    // TODO(b/197078995): Make this work on 12+.
     assumeFalse(
-        parameters.isDexRuntime() && parameters.getDexRuntimeVersion().isEqualTo(Version.V12_0_0));
+        parameters.isDexRuntime()
+            && parameters.getDexRuntimeVersion().isNewerThanOrEqual(Version.V12_0_0));
     boolean isMethodApiLevel =
         parameters.isDexRuntime()
             && parameters.getApiLevel().isGreaterThanOrEqualTo(methodApiLevel);
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineHorizontalMergingTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineHorizontalMergingTest.java
index ce21ee4..97bced2 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineHorizontalMergingTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineHorizontalMergingTest.java
@@ -45,8 +45,10 @@
 
   @Test
   public void testR8() throws Exception {
+    // TODO(b/197078995): Make this work on 12+.
     assumeFalse(
-        parameters.isDexRuntime() && parameters.getDexRuntimeVersion().isEqualTo(Version.V12_0_0));
+        parameters.isDexRuntime()
+            && parameters.getDexRuntimeVersion().isNewerThanOrEqual(Version.V12_0_0));
     boolean beforeFirstApiMethodLevel =
         parameters.isCfRuntime() || parameters.getApiLevel().isLessThan(firstMethodApiLevel);
     boolean afterSecondApiMethodLevel =
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodAndStubClassTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodAndStubClassTest.java
index a3e2d46..d71eec4 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodAndStubClassTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodAndStubClassTest.java
@@ -39,9 +39,10 @@
 
   @Test
   public void testR8() throws Exception {
-    // TODO(b/197078995): Make this work on 12.
+    // TODO(b/197078995): Make this work on 12+.
     assumeFalse(
-        parameters.isDexRuntime() && parameters.getDexRuntimeVersion().isEqualTo(Version.V12_0_0));
+        parameters.isDexRuntime()
+            && parameters.getDexRuntimeVersion().isNewerThanOrEqual(Version.V12_0_0));
     boolean libraryClassNotStubbed =
         parameters.isDexRuntime()
             && parameters.getApiLevel().isGreaterThanOrEqualTo(libraryClassLevel);
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodMissingClassTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodMissingClassTest.java
index 97ee26b..b537125 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodMissingClassTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodMissingClassTest.java
@@ -47,9 +47,10 @@
 
   @Test
   public void testR8() throws Exception {
-    // TODO(b/197078995): Make this work on 12.
+    // TODO(b/197078995): Make this work on 12+.
     assumeFalse(
-        parameters.isDexRuntime() && parameters.getDexRuntimeVersion().isEqualTo(Version.V12_0_0));
+        parameters.isDexRuntime()
+            && parameters.getDexRuntimeVersion().isNewerThanOrEqual(Version.V12_0_0));
     boolean preMockApis =
         parameters.isCfRuntime() || parameters.getApiLevel().isLessThan(initialLibraryMockLevel);
     boolean postMockApis =
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodProtectedTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodProtectedTest.java
index 42ee1c9..33a73cf 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodProtectedTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodProtectedTest.java
@@ -43,9 +43,10 @@
 
   @Test
   public void testR8() throws Exception {
-    // TODO(b/197078995): Make this work on 12.
+    // TODO(b/197078995): Make this work on 12+.
     assumeFalse(
-        parameters.isDexRuntime() && parameters.getDexRuntimeVersion().isEqualTo(Version.V12_0_0));
+        parameters.isDexRuntime()
+            && parameters.getDexRuntimeVersion().isNewerThanOrEqual(Version.V12_0_0));
     Method[] apiMethods =
         new Method[] {
           LibraryClass.class.getDeclaredMethod("addedOn27"),
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodUnknownTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodUnknownTest.java
index f8b3bf7..0e9a5b3 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodUnknownTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlineMethodUnknownTest.java
@@ -35,9 +35,10 @@
 
   @Test
   public void testR8() throws Exception {
-    // TODO(b/197078995): Make this work on 12.
+    // TODO(b/197078995): Make this work on 12+.
     assumeFalse(
-        parameters.isDexRuntime() && parameters.getDexRuntimeVersion().isEqualTo(Version.V12_0_0));
+        parameters.isDexRuntime()
+            && parameters.getDexRuntimeVersion().isNewerThanOrEqual(Version.V12_0_0));
     boolean willInvokeLibraryMethods =
         parameters.isDexRuntime() && parameters.getApiLevel().isGreaterThanOrEqualTo(classApiLevel);
     testForR8(parameters.getBackend())
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlinePackagePrivateTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlinePackagePrivateTest.java
index 40b302d..f4fe8d7 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlinePackagePrivateTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelOutlinePackagePrivateTest.java
@@ -74,9 +74,10 @@
 
   @Test
   public void testR8() throws Exception {
-    // TODO(b/197078995): Make this work on 12.
+    // TODO(b/197078995): Make this work on 12+.
     assumeFalse(
-        parameters.isDexRuntime() && parameters.getDexRuntimeVersion().isEqualTo(Version.V12_0_0));
+        parameters.isDexRuntime()
+            && parameters.getDexRuntimeVersion().isNewerThanOrEqual(Version.V12_0_0));
     testForR8(parameters.getBackend())
         .addLibraryClasses(LibraryClass.class)
         .addDefaultRuntimeLibrary(parameters)
diff --git a/src/test/java/com/android/tools/r8/classmerging/vertical/ForceInlineConstructorWithRetargetedLibMemberTest.java b/src/test/java/com/android/tools/r8/classmerging/vertical/ForceInlineConstructorWithRetargetedLibMemberTest.java
index f7921ff..33bd1a2 100644
--- a/src/test/java/com/android/tools/r8/classmerging/vertical/ForceInlineConstructorWithRetargetedLibMemberTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/vertical/ForceInlineConstructorWithRetargetedLibMemberTest.java
@@ -13,8 +13,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;
-import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
 import java.util.Arrays;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -22,7 +21,7 @@
 import org.junit.runners.Parameterized.Parameters;
 
 @RunWith(Parameterized.class)
-public class ForceInlineConstructorWithRetargetedLibMemberTest extends TestBase {
+public class ForceInlineConstructorWithRetargetedLibMemberTest extends DesugaredLibraryTestBase {
 
   private final TestParameters parameters;
 
@@ -39,7 +38,7 @@
   public void test() throws Exception {
     // Regression test for b/170677722.
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addInnerClasses(getClass())
         .addKeepMainRule(TestClass.class)
         .addVerticallyMergedClassesInspector(
diff --git a/src/test/java/com/android/tools/r8/desugar/InvokeSuperToRewrittenDefaultMethodTest.java b/src/test/java/com/android/tools/r8/desugar/InvokeSuperToRewrittenDefaultMethodTest.java
index 72cdc59..342f9a4 100644
--- a/src/test/java/com/android/tools/r8/desugar/InvokeSuperToRewrittenDefaultMethodTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/InvokeSuperToRewrittenDefaultMethodTest.java
@@ -3,23 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.desugar;
 
-import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
-import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
-import static org.hamcrest.CoreMatchers.allOf;
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
 import static org.junit.Assume.assumeFalse;
 import static org.junit.Assume.assumeTrue;
 
-import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.LibraryDesugaringTestConfiguration;
+import com.android.tools.r8.TestDiagnosticMessages;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import com.android.tools.r8.utils.BooleanUtils;
-import com.android.tools.r8.utils.ExceptionDiagnostic;
 import com.android.tools.r8.utils.StringUtils;
 import java.util.List;
 import java.util.function.Consumer;
@@ -33,19 +23,15 @@
 
   private static final String EXPECTED = StringUtils.lines("Y", "89");
 
-  @Parameterized.Parameters(name = "{0}, old-rt:{1}")
+  @Parameterized.Parameters(name = "{0}")
   public static List<Object[]> data() {
-    return buildParameters(
-        getTestParameters().withAllRuntimesAndApiLevels().build(), BooleanUtils.values());
+    return buildParameters(getTestParameters().withAllRuntimesAndApiLevels().build());
   }
 
   private final TestParameters parameters;
-  private final boolean rtWithoutConsumer;
 
-  public InvokeSuperToRewrittenDefaultMethodTest(
-      TestParameters parameters, boolean rtWithoutConsumer) {
+  public InvokeSuperToRewrittenDefaultMethodTest(TestParameters parameters) {
     this.parameters = parameters;
-    this.rtWithoutConsumer = rtWithoutConsumer;
   }
 
   private boolean needsDefaultInterfaceMethodDesugaring() {
@@ -65,35 +51,15 @@
   @Test
   public void testDesugaring() throws Exception {
     assumeTrue(needsDefaultInterfaceMethodDesugaring());
-    try {
-      testForD8()
-          .addInnerClasses(InvokeSuperToRewrittenDefaultMethodTest.class)
-          .setMinApi(parameters.getApiLevel())
-          .addLibraryFiles(
-              rtWithoutConsumer
-                  ? ToolHelper.getAndroidJar(AndroidApiLevel.B)
-                  : ToolHelper.getAndroidJar(AndroidApiLevel.P))
-          .enableCoreLibraryDesugaring(
-              LibraryDesugaringTestConfiguration.forApiLevel(parameters.getApiLevel()))
-          .compileWithExpectedDiagnostics(
-              diagnostics -> {
-                if (rtWithoutConsumer) {
-                  diagnostics.assertOnlyErrors();
-                  // TODO(b/158543011): Should fail with a nice user error for invalid library.
-                  diagnostics.assertErrorsMatch(
-                      allOf(
-                          diagnosticType(ExceptionDiagnostic.class),
-                          diagnosticMessage(containsString("AssertionError"))));
-                } else {
-                  diagnostics.assertNoMessages();
-                }
-              })
-          .run(parameters.getRuntime(), TestClass.class)
-          .assertSuccessWithOutput(EXPECTED);
-      assertFalse(rtWithoutConsumer);
-    } catch (CompilationFailedException e) {
-      assertTrue(rtWithoutConsumer);
-    }
+    testForD8()
+        .addInnerClasses(InvokeSuperToRewrittenDefaultMethodTest.class)
+        .setMinApi(parameters.getApiLevel())
+        .addLibraryFiles(getLibraryFile())
+        .enableCoreLibraryDesugaring(
+            LibraryDesugaringTestConfiguration.forApiLevel(parameters.getApiLevel()))
+        .compileWithExpectedDiagnostics(TestDiagnosticMessages::assertNoMessages)
+        .run(parameters.getRuntime(), TestClass.class)
+        .assertSuccessWithOutput(EXPECTED);
   }
 
   public interface CharConsumer extends Consumer<Character>, IntConsumer {
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/ApiLevelBackportsTest.java b/src/test/java/com/android/tools/r8/desugar/backports/ApiLevelBackportsTest.java
index ea0f614..2cb5556 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/ApiLevelBackportsTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/ApiLevelBackportsTest.java
@@ -88,10 +88,14 @@
         .addProgramClassFileData(transformTestMathMultiplyExactLongInt())
         .setMinApi(AndroidApiLevel.ANDROID_PLATFORM)
         .run(parameters.getRuntime(), TestMathMultiplyExactLongInt.class)
-        .assertFailureWithErrorThatMatches(
-            containsString(
-                "java.lang.NoSuchMethodError: No static method"
-                    + " parseInt(Ljava/lang/CharSequence;III)I"));
+        .applyIf(
+            parameters.getDexRuntimeVersion().isOlderThan(Version.V13_MASTER),
+            b ->
+                b.assertFailureWithErrorThatMatches(
+                    containsString(
+                        "java.lang.NoSuchMethodError: No static method"
+                            + " parseInt(Ljava/lang/CharSequence;III)I")),
+            b -> b.assertSuccessWithOutputLines("4"));
   }
 
   // Test class for using: List List.of()
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/AtomicReferenceArrayTest.java b/src/test/java/com/android/tools/r8/desugar/backports/AtomicReferenceArrayTest.java
index 2c2af2b..3032a12 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/AtomicReferenceArrayTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/AtomicReferenceArrayTest.java
@@ -8,7 +8,6 @@
 import com.android.tools.r8.ToolHelper.DexVm.Version;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import java.util.concurrent.atomic.AtomicReferenceArray;
-import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
@@ -25,7 +24,9 @@
   }
 
   public AtomicReferenceArrayTest(TestParameters parameters) {
-    super(parameters, AtomicReferenceFieldUpdater.class, Main.class);
+    super(parameters, AtomicReferenceArray.class, Main.class);
+
+    ignoreInvokes("<init>");
 
     // java.util.concurrent.atomic.AtomicReferenceArray issue is on API 31, see b/211646483.
     registerTarget(AndroidApiLevel.Sv2, 3);
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/AtomicReferenceTest.java b/src/test/java/com/android/tools/r8/desugar/backports/AtomicReferenceTest.java
index 1f5d11e..6dc9faf 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/AtomicReferenceTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/AtomicReferenceTest.java
@@ -8,7 +8,6 @@
 import com.android.tools.r8.ToolHelper.DexVm.Version;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import java.util.concurrent.atomic.AtomicReference;
-import java.util.concurrent.atomic.AtomicReferenceFieldUpdater;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
@@ -25,7 +24,9 @@
   }
 
   public AtomicReferenceTest(TestParameters parameters) {
-    super(parameters, AtomicReferenceFieldUpdater.class, Main.class);
+    super(parameters, AtomicReference.class, Main.class);
+
+    ignoreInvokes("<init>");
 
     // java.util.concurrent.atomic.AtomicReference issue is on API 31, see b/211646483.
     registerTarget(AndroidApiLevel.Sv2, 3);
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/OptionalBackportJava10Test.java b/src/test/java/com/android/tools/r8/desugar/backports/OptionalBackportJava10Test.java
index 25d4081..c5e6adc 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/OptionalBackportJava10Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/OptionalBackportJava10Test.java
@@ -4,6 +4,8 @@
 
 package com.android.tools.r8.desugar.backports;
 
+import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
+
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper;
@@ -16,8 +18,6 @@
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
 
-import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
-
 @RunWith(Parameterized.class)
 public final class OptionalBackportJava10Test extends AbstractBackportTest {
   @Parameters(name = "{0}")
@@ -34,12 +34,14 @@
 
   public OptionalBackportJava10Test(TestParameters parameters) {
     super(parameters, Optional.class, TEST_JAR, "backport.OptionalBackportJava10Main");
-    // Note: None of the methods in this test exist in the latest android.jar. If/when they ship in
-    // an actual API level, migrate these tests to OptionalBackportTest.
+    // Note: The methods in this test exist in android.jar from Android T. When R8 builds targeting
+    // Java 11 move these tests to OptionalBackportTest (out of examplesJava10).
 
-    // Available since N as part of library desugaring.
+    // Available since N.
     ignoreInvokes("empty");
     ignoreInvokes("get");
     ignoreInvokes("of");
+
+    registerTarget(AndroidApiLevel.T, 2);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/OptionalBackportJava11Test.java b/src/test/java/com/android/tools/r8/desugar/backports/OptionalBackportJava11Test.java
index dee14c1..8b57c0f 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/OptionalBackportJava11Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/OptionalBackportJava11Test.java
@@ -4,6 +4,8 @@
 
 package com.android.tools.r8.desugar.backports;
 
+import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
+
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper;
@@ -16,8 +18,6 @@
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
 
-import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
-
 @RunWith(Parameterized.class)
 public final class OptionalBackportJava11Test extends AbstractBackportTest {
   @Parameters(name = "{0}")
@@ -34,11 +34,13 @@
 
   public OptionalBackportJava11Test(TestParameters parameters) {
     super(parameters, Optional.class, TEST_JAR, "backport.OptionalBackportJava11Main");
-    // Note: None of the methods in this test exist in the latest android.jar. If/when they ship in
-    // an actual API level, migrate these tests to OptionalBackportTest.
+    // Note: The methods in this test exist in android.jar from Android T. When R8 builds targeting
+    // Java 11 move these tests to OptionalBackportTest (out of examplesJava11).
 
-    // Available since N as part of library desugaring.
+    // Available since N.
     ignoreInvokes("empty");
     ignoreInvokes("of");
+
+    registerTarget(AndroidApiLevel.T, 2);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/OptionalBackportJava9Test.java b/src/test/java/com/android/tools/r8/desugar/backports/OptionalBackportJava9Test.java
index 31bc82f..a726dc5 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/OptionalBackportJava9Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/OptionalBackportJava9Test.java
@@ -34,11 +34,13 @@
 
   public OptionalBackportJava9Test(TestParameters parameters) {
     super(parameters, Optional.class, TEST_JAR, "backport.OptionalBackportJava9Main");
-    // Note: None of the methods in this test exist in the latest android.jar. If/when they ship in
-    // an actual API level, migrate these tests to OptionalBackportTest.
+    // Note: The methods in this test exist in android.jar from Android T. When R8 builds targeting
+    // Java 11 move these tests to OptionalBackportTest (out of examplesJava9).
 
-    // Available since N as part of library desugaring.
+    // Available since N.
     ignoreInvokes("empty");
     ignoreInvokes("of");
+
+    registerTarget(AndroidApiLevel.T, 10);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/OptionalDoubleBackportJava10Test.java b/src/test/java/com/android/tools/r8/desugar/backports/OptionalDoubleBackportJava10Test.java
index 97d70df..a181a64 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/OptionalDoubleBackportJava10Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/OptionalDoubleBackportJava10Test.java
@@ -4,6 +4,8 @@
 
 package com.android.tools.r8.desugar.backports;
 
+import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
+
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper;
@@ -11,14 +13,11 @@
 import com.android.tools.r8.utils.AndroidApiLevel;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.util.Optional;
 import java.util.OptionalDouble;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
 
-import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
-
 @RunWith(Parameterized.class)
 public final class OptionalDoubleBackportJava10Test extends AbstractBackportTest {
   @Parameters(name = "{0}")
@@ -35,12 +34,14 @@
 
   public OptionalDoubleBackportJava10Test(TestParameters parameters) {
     super(parameters, OptionalDouble.class, TEST_JAR, "backport.OptionalDoubleBackportJava10Main");
-    // Note: None of the methods in this test exist in the latest android.jar. If/when they ship in
-    // an actual API level, migrate these tests to OptionalBackportTest.
+    // Note: The methods in this test exist in android.jar from Android T. When R8 builds targeting
+    // Java 11 move these tests to OptionalBackportTest (out of examplesJava10).
 
-    // Available since N as part of library desugaring.
+    // Available since N.
     ignoreInvokes("empty");
     ignoreInvokes("getAsDouble");
     ignoreInvokes("of");
+
+    registerTarget(AndroidApiLevel.T, 2);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/OptionalDoubleBackportJava11Test.java b/src/test/java/com/android/tools/r8/desugar/backports/OptionalDoubleBackportJava11Test.java
index 981e1e2..b5e9c02 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/OptionalDoubleBackportJava11Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/OptionalDoubleBackportJava11Test.java
@@ -4,6 +4,8 @@
 
 package com.android.tools.r8.desugar.backports;
 
+import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
+
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper;
@@ -16,8 +18,6 @@
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
 
-import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
-
 @RunWith(Parameterized.class)
 public final class OptionalDoubleBackportJava11Test extends AbstractBackportTest {
   @Parameters(name = "{0}")
@@ -34,11 +34,13 @@
 
   public OptionalDoubleBackportJava11Test(TestParameters parameters) {
     super(parameters, OptionalDouble.class, TEST_JAR, "backport.OptionalDoubleBackportJava11Main");
-    // Note: None of the methods in this test exist in the latest android.jar. If/when they ship in
-    // an actual API level, migrate these tests to OptionalBackportTest.
+    // Note: The methods in this test exist in android.jar from Android T. When R8 builds targeting
+    // Java 11 move these tests to OptionalBackportTest (out of examplesJava11).
 
-    // Available since N as part of library desugaring.
+    // Available since N.
     ignoreInvokes("empty");
     ignoreInvokes("of");
+
+    registerTarget(AndroidApiLevel.T, 2);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/OptionalDoubleBackportJava9Test.java b/src/test/java/com/android/tools/r8/desugar/backports/OptionalDoubleBackportJava9Test.java
index 5aa0e1c..bb9bb65 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/OptionalDoubleBackportJava9Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/OptionalDoubleBackportJava9Test.java
@@ -4,6 +4,8 @@
 
 package com.android.tools.r8.desugar.backports;
 
+import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
+
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper;
@@ -11,14 +13,11 @@
 import com.android.tools.r8.utils.AndroidApiLevel;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.util.Optional;
 import java.util.OptionalDouble;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
 
-import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
-
 @RunWith(Parameterized.class)
 public final class OptionalDoubleBackportJava9Test extends AbstractBackportTest {
   @Parameters(name = "{0}")
@@ -35,11 +34,13 @@
 
   public OptionalDoubleBackportJava9Test(TestParameters parameters) {
     super(parameters, OptionalDouble.class, TEST_JAR, "backport.OptionalDoubleBackportJava9Main");
-    // Note: None of the methods in this test exist in the latest android.jar. If/when they ship in
-    // an actual API level, migrate these tests to OptionalDoubleBackportTest.
+    // Note: The methods in this test exist in android.jar from Android T. When R8 builds targeting
+    // Java 11 move these tests to OptionalBackportTest (out of examplesJava9).
 
-    // Available since N as part of library desugaring.
+    // Available since N.
     ignoreInvokes("empty");
     ignoreInvokes("of");
+
+    registerTarget(AndroidApiLevel.T, 4);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/OptionalIntBackportJava10Test.java b/src/test/java/com/android/tools/r8/desugar/backports/OptionalIntBackportJava10Test.java
index b44f1cf..00f5b4b 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/OptionalIntBackportJava10Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/OptionalIntBackportJava10Test.java
@@ -4,6 +4,8 @@
 
 package com.android.tools.r8.desugar.backports;
 
+import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
+
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper;
@@ -12,13 +14,10 @@
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.OptionalInt;
-import java.util.OptionalLong;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
 
-import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
-
 @RunWith(Parameterized.class)
 public final class OptionalIntBackportJava10Test extends AbstractBackportTest {
   @Parameters(name = "{0}")
@@ -35,12 +34,14 @@
 
   public OptionalIntBackportJava10Test(TestParameters parameters) {
     super(parameters, OptionalInt.class, TEST_JAR, "backport.OptionalIntBackportJava10Main");
-    // Note: None of the methods in this test exist in the latest android.jar. If/when they ship in
-    // an actual API level, migrate these tests to OptionalBackportTest.
+    // Note: The methods in this test exist in android.jar from Android T. When R8 builds targeting
+    // Java 11 move these tests to OptionalBackportTest (out of examplesJava10).
 
-    // Available since N as part of library desugaring.
+    // Available since N.
     ignoreInvokes("empty");
     ignoreInvokes("getAsInt");
     ignoreInvokes("of");
+
+    registerTarget(AndroidApiLevel.T, 2);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/OptionalIntBackportJava11Test.java b/src/test/java/com/android/tools/r8/desugar/backports/OptionalIntBackportJava11Test.java
index e594db3..62d66cd 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/OptionalIntBackportJava11Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/OptionalIntBackportJava11Test.java
@@ -4,6 +4,8 @@
 
 package com.android.tools.r8.desugar.backports;
 
+import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
+
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper;
@@ -16,8 +18,6 @@
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
 
-import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
-
 @RunWith(Parameterized.class)
 public final class OptionalIntBackportJava11Test extends AbstractBackportTest {
   @Parameters(name = "{0}")
@@ -34,11 +34,13 @@
 
   public OptionalIntBackportJava11Test(TestParameters parameters) {
     super(parameters, OptionalInt.class, TEST_JAR, "backport.OptionalIntBackportJava11Main");
-    // Note: None of the methods in this test exist in the latest android.jar. If/when they ship in
-    // an actual API level, migrate these tests to OptionalBackportTest.
+    // Note: The methods in this test exist in android.jar from Android T. When R8 builds targeting
+    // Java 11 move these tests to OptionalBackportTest (out of examplesJava11).
 
-    // Available since N as part of library desugaring.
+    // Available since N.
     ignoreInvokes("empty");
     ignoreInvokes("of");
+
+    registerTarget(AndroidApiLevel.T, 2);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/OptionalIntBackportJava9Test.java b/src/test/java/com/android/tools/r8/desugar/backports/OptionalIntBackportJava9Test.java
index 71a8dd9..54f08ae 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/OptionalIntBackportJava9Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/OptionalIntBackportJava9Test.java
@@ -4,6 +4,8 @@
 
 package com.android.tools.r8.desugar.backports;
 
+import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
+
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper;
@@ -16,8 +18,6 @@
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
 
-import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
-
 @RunWith(Parameterized.class)
 public final class OptionalIntBackportJava9Test extends AbstractBackportTest {
   @Parameters(name = "{0}")
@@ -34,11 +34,13 @@
 
   public OptionalIntBackportJava9Test(TestParameters parameters) {
     super(parameters, OptionalInt.class, TEST_JAR, "backport.OptionalIntBackportJava9Main");
-    // Note: None of the methods in this test exist in the latest android.jar. If/when they ship in
-    // an actual API level, migrate these tests to OptionalIntBackportTest.
+    // Note: The methods in this test exist in android.jar from Android T. When R8 builds targeting
+    // Java 11 move these tests to OptionalBackportTest (out of examplesJava9).
 
-    // Available since N as part of library desugaring.
+    // Available since N.
     ignoreInvokes("empty");
     ignoreInvokes("of");
+
+    registerTarget(AndroidApiLevel.T, 4);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/OptionalLongBackportJava10Test.java b/src/test/java/com/android/tools/r8/desugar/backports/OptionalLongBackportJava10Test.java
index a4bef8c..c353e92 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/OptionalLongBackportJava10Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/OptionalLongBackportJava10Test.java
@@ -4,6 +4,8 @@
 
 package com.android.tools.r8.desugar.backports;
 
+import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
+
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper;
@@ -16,8 +18,6 @@
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
 
-import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
-
 @RunWith(Parameterized.class)
 public final class OptionalLongBackportJava10Test extends AbstractBackportTest {
   @Parameters(name = "{0}")
@@ -34,12 +34,14 @@
 
   public OptionalLongBackportJava10Test(TestParameters parameters) {
     super(parameters, OptionalLong.class, TEST_JAR, "backport.OptionalLongBackportJava10Main");
-    // Note: None of the methods in this test exist in the latest android.jar. If/when they ship in
-    // an actual API level, migrate these tests to OptionalBackportTest.
+    // Note: The methods in this test exist in android.jar from Android T. When R8 builds targeting
+    // Java 11 move these tests to OptionalBackportTest (out of examplesJava10).
 
-    // Available since N as part of library desugaring.
+    // Available since N.
     ignoreInvokes("empty");
     ignoreInvokes("getAsLong");
     ignoreInvokes("of");
+
+    registerTarget(AndroidApiLevel.T, 2);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/OptionalLongBackportJava11Test.java b/src/test/java/com/android/tools/r8/desugar/backports/OptionalLongBackportJava11Test.java
index bc1f4aa..fd8fc6f 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/OptionalLongBackportJava11Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/OptionalLongBackportJava11Test.java
@@ -4,6 +4,8 @@
 
 package com.android.tools.r8.desugar.backports;
 
+import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
+
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper;
@@ -16,8 +18,6 @@
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
 
-import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
-
 @RunWith(Parameterized.class)
 public final class OptionalLongBackportJava11Test extends AbstractBackportTest {
   @Parameters(name = "{0}")
@@ -34,11 +34,13 @@
 
   public OptionalLongBackportJava11Test(TestParameters parameters) {
     super(parameters, OptionalLong.class, TEST_JAR, "backport.OptionalLongBackportJava11Main");
-    // Note: None of the methods in this test exist in the latest android.jar. If/when they ship in
-    // an actual API level, migrate these tests to OptionalBackportTest.
+    // Note: The methods in this test exist in android.jar from Android T. When R8 builds targeting
+    // Java 11 move these tests to OptionalBackportTest (out of examplesJava11).
 
-    // Available since N as part of library desugaring.
+    // Available since N.
     ignoreInvokes("empty");
     ignoreInvokes("of");
+
+    registerTarget(AndroidApiLevel.T, 2);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/OptionalLongBackportJava9Test.java b/src/test/java/com/android/tools/r8/desugar/backports/OptionalLongBackportJava9Test.java
index b0dfd62..efb516a 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/OptionalLongBackportJava9Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/OptionalLongBackportJava9Test.java
@@ -4,6 +4,8 @@
 
 package com.android.tools.r8.desugar.backports;
 
+import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
+
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper;
@@ -16,8 +18,6 @@
 import org.junit.runners.Parameterized;
 import org.junit.runners.Parameterized.Parameters;
 
-import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
-
 @RunWith(Parameterized.class)
 public final class OptionalLongBackportJava9Test extends AbstractBackportTest {
   @Parameters(name = "{0}")
@@ -34,13 +34,15 @@
 
   public OptionalLongBackportJava9Test(TestParameters parameters) {
     super(parameters, OptionalLong.class, TEST_JAR, "backport.OptionalLongBackportJava9Main");
-    // Note: None of the methods in this test exist in the latest android.jar. If/when they ship in
-    // an actual API level, migrate these tests to OptionalLongBackportTest.
+    // Note: The methods in this test exist in android.jar from Android T. When R8 builds targeting
+    // Java 11 move these tests to OptionalBackportTest (out of examplesJava9).
 
-    // Available since N as part of library desugaring.
+    // Available since N.
     ignoreInvokes("empty");
     ignoreInvokes("getAsLong");
     ignoreInvokes("isPresent");
     ignoreInvokes("of");
+
+    registerTarget(AndroidApiLevel.T, 4);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/backports/TestBackportedNotPresentInAndroidJar.java b/src/test/java/com/android/tools/r8/desugar/backports/TestBackportedNotPresentInAndroidJar.java
index 237b0e1..195dfd2 100644
--- a/src/test/java/com/android/tools/r8/desugar/backports/TestBackportedNotPresentInAndroidJar.java
+++ b/src/test/java/com/android/tools/r8/desugar/backports/TestBackportedNotPresentInAndroidJar.java
@@ -79,6 +79,9 @@
   @Test
   public void testBackportedMethodsPerAPILevel() throws Exception {
     for (AndroidApiLevel apiLevel : AndroidApiLevel.values()) {
+      if (apiLevel == AndroidApiLevel.T) {
+        continue;
+      }
       if (!ToolHelper.hasAndroidJar(apiLevel)) {
         // Only check for the android jar versions present in third_party.
         System.out.println("Skipping check for " + apiLevel);
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BufferedReaderTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BufferedReaderTest.java
index 6b54606..b5e5c03 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BufferedReaderTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/BufferedReaderTest.java
@@ -73,11 +73,13 @@
   }
 
   private void configurationForProgramCompilation(InternalOptions options) {
-    options.desugaredLibrarySpecification = configurationAlternative3(options, false, parameters);
+    setDesugaredLibrarySpecificationForTesting(
+        options, configurationAlternative3(options, false, parameters));
   }
 
   private void configurationForLibraryCompilation(InternalOptions options) {
-    options.desugaredLibrarySpecification = configurationAlternative3(options, true, parameters);
+    setDesugaredLibrarySpecificationForTesting(
+        options, configurationAlternative3(options, true, parameters));
   }
 
   @Test
@@ -141,10 +143,7 @@
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForD8()
         .addLibraryFiles(getLibraryFile())
-        .addOptionsModification(
-            options ->
-                options.desugaredLibrarySpecification =
-                    configurationAlternative3(options, false, parameters))
+        .addOptionsModification(this::configurationForProgramCompilation)
         .addInnerClasses(BufferedReaderTest.class)
         .setMinApi(parameters.getApiLevel())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -170,10 +169,7 @@
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
     testForR8(parameters.getBackend())
         .addLibraryFiles(getLibraryFile())
-        .addOptionsModification(
-            options ->
-                options.desugaredLibrarySpecification =
-                    configurationAlternative3(options, false, parameters))
+        .addOptionsModification(this::configurationForProgramCompilation)
         .addInnerClasses(BufferedReaderTest.class)
         .addKeepMainRule(TestClass.class)
         .setMinApi(parameters.getApiLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionTest.java
index d1e9746..473153c 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/CustomCollectionTest.java
@@ -10,17 +10,11 @@
 import com.android.tools.r8.D8TestRunResult;
 import com.android.tools.r8.R8TestRunResult;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.humanspecification.HumanDesugaredLibrarySpecification;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineDesugaredLibrarySpecification;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.specificationconversion.HumanToMachineSpecificationConverter;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.specificationconversion.LegacyToHumanSpecificationConverter;
 import com.android.tools.r8.utils.BooleanUtils;
-import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.InstructionSubject;
 import com.android.tools.r8.utils.codeinspector.InstructionSubject.JumboStringMode;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
-import java.io.IOException;
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -40,19 +34,15 @@
 
   private final TestParameters parameters;
   private final boolean shrinkDesugaredLibrary;
-  private final boolean machineSpec;
 
-  @Parameters(name = "machine: {0}, {2}, shrink: {1}")
+  @Parameters(name = "machine: {0}, shrink: {1}")
   public static List<Object[]> data() {
     return buildParameters(
         BooleanUtils.values(),
-        BooleanUtils.values(),
         getTestParameters().withDexRuntimes().withAllApiLevels().build());
   }
 
-  public CustomCollectionTest(
-      boolean machineSpec, boolean shrinkDesugaredLibrary, TestParameters parameters) {
-    this.machineSpec = machineSpec;
+  public CustomCollectionTest(boolean shrinkDesugaredLibrary, TestParameters parameters) {
     this.shrinkDesugaredLibrary = shrinkDesugaredLibrary;
     this.parameters = parameters;
   }
@@ -60,22 +50,6 @@
   private final String EXECUTOR =
       "com.android.tools.r8.desugar.desugaredlibrary.CustomCollectionTest$Executor";
 
-  private void setMachineSpec(InternalOptions opt) {
-    if (!machineSpec) {
-      return;
-    }
-    try {
-      HumanDesugaredLibrarySpecification human =
-          new LegacyToHumanSpecificationConverter()
-              .convert(opt.desugaredLibrarySpecification, getLibraryFile(), opt);
-      MachineDesugaredLibrarySpecification machine =
-          new HumanToMachineSpecificationConverter().convert(human, getLibraryFile(), opt);
-      opt.testing.machineDesugaredLibrarySpecification = machine;
-    } catch (IOException e) {
-      throw new RuntimeException(e);
-    }
-  }
-
   @Test
   public void testCustomCollectionD8() throws Exception {
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
@@ -83,7 +57,6 @@
         testForD8()
             .addLibraryFiles(getLibraryFile())
             .addInnerClasses(CustomCollectionTest.class)
-            .addOptionsModification(this::setMachineSpec)
             .setMinApi(parameters.getApiLevel())
             .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
             .compile()
@@ -106,7 +79,6 @@
     Path jar =
         testForD8(Backend.CF)
             .addInnerClasses(CustomCollectionTest.class)
-            .addOptionsModification(this::setMachineSpec)
             .setMinApi(parameters.getApiLevel())
             .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
             .compile()
@@ -162,7 +134,6 @@
         testForR8(Backend.DEX)
             .addLibraryFiles(getLibraryFile())
             .addInnerClasses(CustomCollectionTest.class)
-            .addOptionsModification(this::setMachineSpec)
             .setMinApi(parameters.getApiLevel())
             .addKeepClassAndMembersRules(Executor.class)
             .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryCHMOnlyContentTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryCHMOnlyContentTest.java
index 3e7d97d..e27dda9 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryCHMOnlyContentTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryCHMOnlyContentTest.java
@@ -43,10 +43,9 @@
             "",
             false,
             Collections.emptyList(),
-            options -> {
-              options.desugaredLibrarySpecification =
-                  chmOnlyConfiguration(options, true, parameters);
-            });
+            options ->
+                setDesugaredLibrarySpecificationForTesting(
+                    options, chmOnlyConfiguration(options, true, parameters)));
     CodeInspector inspector = new CodeInspector(desugaredLib);
     assert inspector.clazz("j$.util.concurrent.ConcurrentHashMap").isPresent();
   }
@@ -61,10 +60,9 @@
             "-keep class * { *; }",
             true,
             Collections.emptyList(),
-            options -> {
-              options.desugaredLibrarySpecification =
-                  chmOnlyConfiguration(options, true, parameters);
-            });
+            options ->
+                setDesugaredLibrarySpecificationForTesting(
+                    options, chmOnlyConfiguration(options, true, parameters)));
     CodeInspector inspector = new CodeInspector(desugaredLib);
     assert inspector.clazz("j$.util.concurrent.ConcurrentHashMap").isPresent();
   }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryContentTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryContentTest.java
index e353126..f4786f7 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryContentTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryContentTest.java
@@ -5,15 +5,19 @@
 package com.android.tools.r8.desugar.desugaredlibrary;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static junit.framework.TestCase.assertEquals;
 import static junit.framework.TestCase.assertTrue;
 import static org.hamcrest.CoreMatchers.startsWith;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.fail;
 
 import com.android.tools.r8.L8Command;
+import com.android.tools.r8.L8TestBuilder;
 import com.android.tools.r8.OutputMode;
 import com.android.tools.r8.StringResource;
+import com.android.tools.r8.TestDiagnosticMessages;
 import com.android.tools.r8.TestDiagnosticMessagesImpl;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
@@ -25,6 +29,7 @@
 import com.android.tools.r8.utils.codeinspector.InstructionSubject;
 import java.nio.file.Path;
 import java.util.ArrayList;
+import java.util.Collections;
 import org.junit.Assume;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -45,6 +50,33 @@
   }
 
   @Test
+  public void testInvalidLibrary() throws Exception {
+    Assume.assumeTrue(requiresAnyCoreLibDesugaring(parameters));
+    L8TestBuilder l8TestBuilder =
+        testForL8(parameters.getApiLevel())
+            .addProgramFiles(Collections.singleton(ToolHelper.getDesugarJDKLibs()))
+            .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.L))
+            .setDesugarJDKLibsConfiguration(ToolHelper.DESUGAR_LIB_CONVERSIONS);
+    try {
+      l8TestBuilder.compile();
+      fail();
+    } catch (AssertionError ae) {
+      // Expected since the library is invalid.
+    }
+    TestDiagnosticMessages diagnosticMessages = l8TestBuilder.getDiagnosticMessages();
+    diagnosticMessages.assertOnlyWarnings();
+    assertEquals(diagnosticMessages.getWarnings().size(), 1);
+    assertTrue(
+        diagnosticMessages
+            .getWarnings()
+            .get(0)
+            .getDiagnosticMessage()
+            .contains(
+                "Desugared library requires to be compiled with a library file of API greater or"
+                    + " equal to"));
+  }
+
+  @Test
   public void testDesugaredLibraryContentD8() throws Exception {
     Assume.assumeTrue(requiresAnyCoreLibDesugaring(parameters));
     CodeInspector inspector = new CodeInspector(buildDesugaredLibrary(parameters.getApiLevel()));
@@ -89,11 +121,20 @@
     ToolHelper.runL8(l8Builder.build(), options -> {});
     CodeInspector codeInspector = new CodeInspector(desugaredLib);
     assertCorrect(codeInspector);
-    assertNoWarningsErrors(diagnosticsHandler);
+    assertOneWarning(diagnosticsHandler);
   }
 
-  private void assertNoWarningsErrors(TestDiagnosticMessagesImpl diagnosticsHandler) {
-    assertTrue(diagnosticsHandler.getWarnings().isEmpty());
+  private void assertOneWarning(TestDiagnosticMessagesImpl diagnosticsHandler) {
+    assertEquals(
+        (isJDK11DesugaredLibrary() && parameters.getApiLevel().isLessThan(AndroidApiLevel.O))
+            ? 2
+            : 1,
+        diagnosticsHandler.getWarnings().size());
+    String msg = diagnosticsHandler.getWarnings().get(0).getDiagnosticMessage();
+    assertTrue(
+        msg.contains(
+            "The following library types, prefixed by java., are present both as library and non"
+                + " library classes"));
     assertTrue(diagnosticsHandler.getErrors().isEmpty());
   }
 
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryDumpInputsTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryDumpInputsTest.java
index 03f861b..92e689b 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryDumpInputsTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryDumpInputsTest.java
@@ -9,7 +9,6 @@
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.ZipUtils;
 import com.google.common.collect.ImmutableList;
@@ -48,7 +47,7 @@
     Path dumpDir = temp.newFolder().toPath();
     testForD8(parameters.getBackend())
         .addProgramClasses(TestClass.class)
-        .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .addOptionsModification(options -> options.dumpInputToDirectory = dumpDir.toString())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
@@ -76,7 +75,7 @@
     Path dumpDir = temp.newFolder().toPath();
     testForR8(parameters.getBackend())
         .addProgramClasses(TestClass.class)
-        .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
+        .addLibraryFiles(getLibraryFile())
         .setMinApi(parameters.getApiLevel())
         .addKeepMainRule(TestClass.class)
         .addOptionsModification(options -> options.dumpInputToDirectory = dumpDir.toString())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
index 34faa58..eb25adf 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryTestBase.java
@@ -67,6 +67,18 @@
     return property.contains("jdk11");
   }
 
+  public void setDesugaredLibrarySpecificationForTesting(
+      InternalOptions options, LegacyDesugaredLibrarySpecification specification) {
+    try {
+      options.setDesugaredLibrarySpecificationForTesting(
+          specification,
+          ToolHelper.getDesugarJDKLibs(),
+          ToolHelper.getAndroidJar(AndroidApiLevel.R));
+    } catch (IOException e) {
+      throw new RuntimeException(e);
+    }
+  }
+
   // For conversions tests, we need DexRuntimes where classes to convert are present (DexRuntimes
   // above N and O depending if Stream or Time APIs are used), but we need to compile the program
   // with a minAPI below to force the use of conversions.
@@ -87,10 +99,12 @@
     throw new Error("Unsupported conversion parameters");
   }
 
+  protected AndroidApiLevel getRequiredCompilationAPILevel() {
+    return isJDK11DesugaredLibrary() ? AndroidApiLevel.R : AndroidApiLevel.P;
+  }
+
   protected Path getLibraryFile() {
-    return isJDK11DesugaredLibrary()
-        ? ToolHelper.getAndroidJar(AndroidApiLevel.S)
-        : ToolHelper.getAndroidJar(AndroidApiLevel.P);
+    return ToolHelper.getAndroidJar(getRequiredCompilationAPILevel());
   }
 
   protected boolean requiresEmulatedInterfaceCoreLibDesugaring(TestParameters parameters) {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryWarningTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryWarningTest.java
index 0c61a06..47b01f1 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryWarningTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/DesugaredLibraryWarningTest.java
@@ -4,6 +4,9 @@
 
 package com.android.tools.r8.desugar.desugaredlibrary;
 
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.L8Command;
 import com.android.tools.r8.OutputMode;
@@ -12,6 +15,7 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import java.nio.file.Path;
 import java.util.Arrays;
@@ -65,6 +69,19 @@
           Arrays.asList(FUNCTION_KEEP.split(System.lineSeparator())), Origin.unknown());
     }
     ToolHelper.runL8(l8Builder.build(), options -> {});
-    diagnosticsHandler.assertNoMessages();
+    assertEquals(
+        (isJDK11DesugaredLibrary() && parameters.getApiLevel().isLessThan(AndroidApiLevel.O))
+            ? 2
+            : 1,
+        diagnosticsHandler.getWarnings().size());
+    diagnosticsHandler.assertNoErrors();
+    assertTrue(
+        diagnosticsHandler
+            .getWarnings()
+            .get(0)
+            .getDiagnosticMessage()
+            .contains(
+                "The following library types, prefixed by java., are present both as library and"
+                    + " non library classes:"));
   }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/InconsistentPrefixTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/InconsistentPrefixTest.java
deleted file mode 100644
index b1f57e1..0000000
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/InconsistentPrefixTest.java
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (c) 2019, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.desugar.desugaredlibrary;
-
-import static org.hamcrest.CoreMatchers.containsString;
-
-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.ir.desugar.desugaredlibrary.legacyspecification.LegacyDesugaredLibrarySpecification;
-import com.android.tools.r8.jasmin.JasminBuilder;
-import java.nio.file.Path;
-import java.util.HashMap;
-import java.util.Map;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-@RunWith(Parameterized.class)
-public class InconsistentPrefixTest extends TestBase {
-
-  @Parameters(name = "{0}")
-  public static TestParametersCollection data() {
-    return getTestParameters().withNoneRuntime().build();
-  }
-
-  public InconsistentPrefixTest(TestParameters parameters) {
-    parameters.assertNoneRuntime();
-  }
-
-  @Test(expected = CompilationFailedException.class)
-  public void testNoInconsistentPrefixes() throws Exception {
-    Map<String, String> x = new HashMap<>();
-    x.put("pkg.sub", "p$.bus");
-    x.put("pkg", "p$");
-
-    JasminBuilder jasminBuilder = new JasminBuilder();
-    jasminBuilder.addClass("pkg/notsub/A");
-    jasminBuilder.addClass("pkg/sub/A");
-    Path inputJar = temp.getRoot().toPath().resolve("input.jar");
-    jasminBuilder.writeJar(inputJar);
-
-    testForD8()
-        .addProgramFiles(inputJar)
-        .addOptionsModification(
-            options ->
-                options.desugaredLibrarySpecification =
-                    LegacyDesugaredLibrarySpecification.withOnlyRewritePrefixForTesting(x, options))
-        .compileWithExpectedDiagnostics(
-            diagnostics -> {
-              diagnostics.assertErrorMessageThatMatches(
-                  containsString("Inconsistent prefix in desugared library"));
-            });
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/J$ExtensionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/J$ExtensionTest.java
index 88f3ca9..371443d 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/J$ExtensionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/J$ExtensionTest.java
@@ -5,15 +5,12 @@
 package com.android.tools.r8.desugar.desugaredlibrary;
 
 import static junit.framework.TestCase.assertTrue;
-import static junit.framework.TestCase.fail;
 
-import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime;
 import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.DexVm.Version;
-import com.android.tools.r8.utils.BooleanUtils;
 import java.io.BufferedWriter;
 import java.io.File;
 import java.io.FileWriter;
@@ -31,7 +28,6 @@
 public class J$ExtensionTest extends DesugaredLibraryTestBase {
 
   private final TestParameters parameters;
-  private final boolean shrinkDesugaredLibrary;
 
   private static final String MAIN_CLASS_NAME = "Main";
   private static final String MAIN_CLASS =
@@ -55,14 +51,12 @@
           + "}";
   private static Path[] compiledClasses = new Path[2];
 
-  @Parameters(name = "{1}, shrinkDesugaredLibrary: {0}")
+  @Parameters(name = "{0}")
   public static List<Object[]> data() {
-    return buildParameters(
-        BooleanUtils.values(), getTestParameters().withAllRuntimes().withAllApiLevels().build());
+    return buildParameters(getTestParameters().withAllRuntimes().withAllApiLevels().build());
   }
 
-  public J$ExtensionTest(boolean shrinkDesugaredLibrary, TestParameters parameters) {
-    this.shrinkDesugaredLibrary = shrinkDesugaredLibrary;
+  public J$ExtensionTest(TestParameters parameters) {
     this.parameters = parameters;
   }
 
@@ -92,7 +86,6 @@
 
   @Test
   public void testJ$ExtensionNoDesugaring() throws Exception {
-    Assume.assumeFalse(shrinkDesugaredLibrary);
     String stderr;
     if (parameters.isCfRuntime()) {
       stderr =
@@ -110,24 +103,31 @@
               .assertFailure()
               .getStdErr();
     }
-    assertError(stderr);
+    assertError(stderr, false);
   }
 
-  private void assertError(String stderr) {
-    if (parameters.isCfRuntime() && parameters.getRuntime().asCf().getVm() == CfVm.JDK8) {
-      assertTrue(
-          stderr.contains("java.lang.SecurityException: Prohibited package name: java.time"));
-    } else if (parameters.isCfRuntime()) {
-      assertTrue(stderr.contains("java.lang.ClassNotFoundException: java.time.LocalTimeAccess"));
-    } else if (parameters
-        .getRuntime()
-        .asDex()
-        .getVm()
-        .getVersion()
-        .isOlderThanOrEqual(Version.V6_0_1)) {
-      assertTrue(stderr.contains("java.lang.NoClassDefFoundError"));
-    } else if (parameters.getRuntime().asDex().getVm().getVersion() == Version.V7_0_0) {
-      assertTrue(stderr.contains("java.lang.ClassNotFoundException"));
+  private void assertError(String stderr, boolean desugaring) {
+    if (parameters.isCfRuntime()) {
+      if (parameters.getRuntime().asCf().getVm() == CfVm.JDK8) {
+        assertTrue(
+            stderr.contains("java.lang.SecurityException: Prohibited package name: java.time"));
+      } else {
+        assertTrue(stderr.contains("java.lang.ClassNotFoundException: java.time.LocalTimeAccess"));
+      }
+      return;
+    }
+    assert !parameters.isCfRuntime();
+    if (!desugaring) {
+      if (parameters.getDexRuntimeVersion().isOlderThanOrEqual(Version.V6_0_1)) {
+        assertTrue(stderr.contains("java.lang.NoClassDefFoundError"));
+      } else if (parameters.getDexRuntimeVersion() == Version.V7_0_0) {
+        assertTrue(stderr.contains("java.lang.ClassNotFoundException"));
+      }
+      return;
+    }
+    if (parameters.getDexRuntimeVersion() == Version.V8_1_0) {
+      // On Android 8 the library package private method is accessible.
+      assertTrue(stderr.contains("java.lang.NullPointerException"));
     } else {
       assertTrue(stderr.contains("java.lang.IllegalAccessError"));
     }
@@ -140,19 +140,18 @@
     Assume.assumeTrue(requiresTimeDesugaring(parameters));
     KeepRuleConsumer keepRuleConsumer = createKeepRuleConsumer(parameters);
 
-    try {
-      testForD8()
-          .addLibraryFiles(getLibraryFile())
-          .addProgramFiles(compiledClasses)
-          .setMinApi(parameters.getApiLevel())
-          .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
-          .compile();
-      fail();
-    } catch (CompilationFailedException e) {
-      assertTrue(
-          e.getCause()
-              .getMessage()
-              .contains("Cannot compile program class java.time.LocalTimeAccess"));
-    }
+    String stdErr =
+        testForD8()
+            .addLibraryFiles(getLibraryFile())
+            .addProgramFiles(compiledClasses)
+            .setMinApi(parameters.getApiLevel())
+            .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
+            .compile()
+            .addDesugaredCoreLibraryRunClassPath(
+                this::buildDesugaredLibrary, parameters.getApiLevel())
+            .run(parameters.getRuntime(), MAIN_CLASS_NAME)
+            .assertFailure()
+            .getStdErr();
+    assertError(stdErr, true);
   }
 }
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 6598d6b..d78df31 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
@@ -144,16 +144,22 @@
             .map(TypeSubject::toString)
             .collect(Collectors.toSet());
     assertEquals(expectedCatchGuards, foundCatchGuards);
-
-    if (isR8) {
-      assertThat(
-          inspector.clazz(TemporalAccessorImpl.class).uniqueMethodWithFinalName("query"),
-          not(isPresent()));
-    } else {
+    if (!(parameters
+            .getApiLevel()
+            .isGreaterThanOrEqualTo(TestBase.apiLevelWithDefaultInterfaceMethodsSupport())
+        && isR8)) {
       assertThat(
           inspector.clazz(TemporalAccessorImplSub.class).uniqueMethodWithFinalName("query"),
           CodeMatchers.invokesMethod(
-              null, TemporalAccessorImpl.class.getTypeName(), "query", null));
+              null, inspector.clazz(TemporalAccessorImpl.class).getFinalName(), "query", null));
+    } else {
+      String holder =
+          requiresTimeDesugaring(parameters)
+              ? "j$.time.temporal.TemporalAccessor"
+              : "java.time.temporal.TemporalAccessor";
+      assertThat(
+          inspector.clazz(TemporalAccessorImplSub.class).uniqueMethodWithFinalName("query"),
+          CodeMatchers.invokesMethod(null, holder, "query", null));
     }
     if (parameters
         .getApiLevel()
@@ -163,9 +169,7 @@
           not(isPresent()));
     } else {
       assertThat(
-          inspector
-              .clazz(isR8 ? TemporalAccessorImplSub.class : TemporalAccessorImpl.class)
-              .uniqueMethodWithFinalName("query"),
+          inspector.clazz(TemporalAccessorImpl.class).uniqueMethodWithFinalName("query"),
           CodeMatchers.invokesMethod(
               null, "j$.time.temporal.TemporalAccessor$-CC", "$default$query", null));
     }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LinkedHashSetTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LinkedHashSetTest.java
index 981edea..de87214 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LinkedHashSetTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LinkedHashSetTest.java
@@ -11,6 +11,7 @@
 import java.util.Set;
 import java.util.Spliterator;
 import java.util.Spliterators;
+import java.util.function.Predicate;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -165,6 +166,14 @@
       System.out.println("true");
       System.out.println(spliterator.hasCharacteristics(Spliterator.IMMUTABLE));
       System.out.println("false");
+
+      spliterator = ((Set<String>) new CustomLinkedHashSetForceForwarding<String>()).spliterator();
+      System.out.println(spliterator.hasCharacteristics(Spliterator.DISTINCT));
+      System.out.println("true");
+      System.out.println(spliterator.hasCharacteristics(Spliterator.ORDERED));
+      System.out.println("true");
+      System.out.println(spliterator.hasCharacteristics(Spliterator.IMMUTABLE));
+      System.out.println("false");
     }
   }
 
@@ -198,4 +207,13 @@
       return super.spliterator();
     }
   }
+
+  // The over method force the forwarding methods to be installed.
+  static class CustomLinkedHashSetForceForwarding<E> extends LinkedHashSet<E> {
+
+    @Override
+    public boolean removeIf(Predicate<? super E> filter) {
+      return super.removeIf(filter);
+    }
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java
index 18af69f..d296ec9 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/LintFilesTest.java
@@ -131,7 +131,7 @@
             .parse(StringResource.fromFile(ToolHelper.getDesugarLibJsonForTesting()));
 
     for (AndroidApiLevel apiLevel : AndroidApiLevel.values()) {
-      if (apiLevel.isGreaterThan(AndroidApiLevel.LATEST)) {
+      if (apiLevel.isGreaterThan(AndroidApiLevel.Sv2)) {
         continue;
       }
       Path compileApiLevelDirectory = directory.resolve("compile_api_level_" + apiLevel.getLevel());
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingJ$Test.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingJ$Test.java
index d5300ad..1208414 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingJ$Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/MergingJ$Test.java
@@ -118,8 +118,8 @@
     L8.run(
         L8Command.builder()
             .addLibraryFiles(getLibraryFile())
+            .addLibraryFiles(ToolHelper.getDesugarJDKLibs())
             .addProgramFiles(JDK_11_JAVA_BASE_EXTENSION_COMPILED_FILES)
-            .addClasspathFiles(ToolHelper.getDesugarJDKLibs())
             .addDesugaredLibraryConfiguration(
                 StringResource.fromFile(ToolHelper.getDesugarLibJsonForTesting()))
             .setMinApiLevel(AndroidApiLevel.B.getLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NeverMergeCoreLibDesugarClasses.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NeverMergeCoreLibDesugarClasses.java
index fbb422a..8a86def 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NeverMergeCoreLibDesugarClasses.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NeverMergeCoreLibDesugarClasses.java
@@ -45,15 +45,16 @@
           .addInnerClasses(NeverMergeCoreLibDesugarClasses.class)
           .addProgramDexFileData(builder.compile())
           .setMinApi(parameters.getRuntime())
-          .compileWithExpectedDiagnostics(diagnostics -> {
-            diagnostics.assertErrorsCount(1);
-            String message = diagnostics.getErrors().get(0).getDiagnosticMessage();
-            assertThat(
-                message,
-                containsString(
-                    "Merging dex file containing classes with prefix 'j$.' "
-                        + "with classes with any other prefixes is not allowed."));
-          });
+          .compileWithExpectedDiagnostics(
+              diagnostics -> {
+                diagnostics.assertErrorsCount(1);
+                String message = diagnostics.getErrors().get(0).getDiagnosticMessage();
+                assertThat(
+                    message,
+                    containsString(
+                        "Merging dex file containing classes with prefix 'j$.' "
+                            + "with classes with any other prefixes is not allowed"));
+              });
     } catch (CompilationFailedException e) {
       // Expected compilation failed.
       return;
@@ -78,7 +79,7 @@
                     message,
                     containsString(
                         "Merging dex file containing classes with prefix 'j$.' "
-                            + "with classes with any other prefixes is not allowed."));
+                            + "with classes with any other prefixes is not allowed"));
               });
     } catch (CompilationFailedException e) {
       // Expected compilation failed.
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ObjectsTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ObjectsTest.java
index abdf5c5..ed772cb 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ObjectsTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ObjectsTest.java
@@ -79,9 +79,9 @@
   public ObjectsTest(TestParameters parameters, boolean libraryDesugarJavaUtilObjects) {
     this.parameters = parameters;
     this.libraryDesugarJavaUtilObjects = libraryDesugarJavaUtilObjects;
-    // Using desugared library require a compile SDK of 26 or higher.
     this.androidJar =
-        ToolHelper.getAndroidJar(Ordered.max(parameters.getApiLevel(), AndroidApiLevel.O));
+        ToolHelper.getAndroidJar(
+            Ordered.max(parameters.getApiLevel(), getRequiredCompilationAPILevel()));
   }
 
   LegacyDesugaredLibrarySpecification desugaredLibrarySpecification(
@@ -99,13 +99,13 @@
   }
 
   private void configurationForProgramCompilation(InternalOptions options) {
-    options.desugaredLibrarySpecification =
-        desugaredLibrarySpecification(options, false, parameters);
+    setDesugaredLibrarySpecificationForTesting(
+        options, desugaredLibrarySpecification(options, false, parameters));
   }
 
   private void configurationForLibraryCompilation(InternalOptions options) {
-    options.desugaredLibrarySpecification =
-        desugaredLibrarySpecification(options, true, parameters);
+    setDesugaredLibrarySpecificationForTesting(
+        options, desugaredLibrarySpecification(options, true, parameters));
   }
 
   private Matcher<MethodSubject> invokesObjectsCompare(String holder) {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetAndBackportTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetAndBackportTest.java
index 359a18c..27762ea 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetAndBackportTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetAndBackportTest.java
@@ -7,6 +7,7 @@
 import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification.LegacyDesugaredLibrarySpecification;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification.LegacyRewritingFlags;
 import com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification.LegacyTopLevelFlags;
@@ -14,6 +15,7 @@
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import java.io.IOException;
 import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -44,7 +46,6 @@
    *  {
    *    "rewrite_prefix":{"java.time.": "j$.time."},
    *    "backport": {"java.lang.DesugarMath": "java.lang.Math"},
-   *    "retarget_lib_member": {"java.util.Date#toInstant": "java.util.DesugarDate"}
    *  }
    * ],
    */
@@ -53,11 +54,16 @@
         LegacyRewritingFlags.builder(options.itemFactory, options.reporter, Origin.unknown())
             .putRewritePrefix("java.time.", "j$.time.")
             .putBackportCoreLibraryMember("java.lang.DesugarMath", "java.lang.Math")
-            .putRetargetCoreLibMember("java.util.Date#toInstant", "java.util.DesugarDate")
             .build();
-    options.desugaredLibrarySpecification =
-        new LegacyDesugaredLibrarySpecification(
-            LegacyTopLevelFlags.testing(), rewritingFlags, true, options.itemFactory);
+    try {
+      options.setDesugaredLibrarySpecificationForTesting(
+          new LegacyDesugaredLibrarySpecification(
+              LegacyTopLevelFlags.testing(), rewritingFlags, true),
+          ToolHelper.getDesugarJDKLibs(),
+          ToolHelper.getAndroidJar(AndroidApiLevel.R));
+    } catch (IOException e) {
+      throw new RuntimeException(e);
+    }
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetOverrideTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetOverrideTest.java
index 6bf49a0..e629c47 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetOverrideTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/RetargetOverrideTest.java
@@ -5,13 +5,7 @@
 package com.android.tools.r8.desugar.desugaredlibrary;
 
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.humanspecification.HumanDesugaredLibrarySpecification;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineDesugaredLibrarySpecification;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.specificationconversion.HumanToMachineSpecificationConverter;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.specificationconversion.LegacyToHumanSpecificationConverter;
 import com.android.tools.r8.utils.BooleanUtils;
-import com.android.tools.r8.utils.InternalOptions;
-import java.io.IOException;
 import java.nio.file.Path;
 import java.time.Instant;
 import java.time.ZonedDateTime;
@@ -31,19 +25,15 @@
 
   private final TestParameters parameters;
   private final boolean shrinkDesugaredLibrary;
-  private final boolean machineSpec;
 
   @Parameters(name = "machine: {0}, {2}, shrink: {1}")
   public static List<Object[]> data() {
     return buildParameters(
         BooleanUtils.values(),
-        BooleanUtils.values(),
         getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build());
   }
 
-  public RetargetOverrideTest(
-      boolean machineSpec, boolean shrinkDesugaredLibrary, TestParameters parameters) {
-    this.machineSpec = machineSpec;
+  public RetargetOverrideTest(boolean shrinkDesugaredLibrary, TestParameters parameters) {
     this.shrinkDesugaredLibrary = shrinkDesugaredLibrary;
     this.parameters = parameters;
   }
@@ -54,7 +44,6 @@
     Path desugaredTwice =
         testForD8(Backend.CF)
             .addLibraryFiles(getLibraryFile())
-            .addOptionsModification(this::setMachineSpec)
             .addProgramFiles(
                 testForD8(Backend.CF)
                     .addLibraryFiles(getLibraryFile())
@@ -76,7 +65,6 @@
       stdout =
           testForD8(Backend.DEX)
               .addProgramFiles(desugaredTwice)
-              .addOptionsModification(this::setMachineSpec)
               .setMinApi(parameters.getApiLevel())
               .disableDesugaring()
               .compile()
@@ -107,22 +95,6 @@
     assertLines2By2Correct(stdout);
   }
 
-  private void setMachineSpec(InternalOptions opt) {
-    if (!machineSpec) {
-      return;
-    }
-    try {
-      HumanDesugaredLibrarySpecification human =
-          new LegacyToHumanSpecificationConverter()
-              .convert(opt.desugaredLibrarySpecification, getLibraryFile(), opt);
-      MachineDesugaredLibrarySpecification machine =
-          new HumanToMachineSpecificationConverter().convert(human, getLibraryFile(), opt);
-      opt.testing.machineDesugaredLibrarySpecification = machine;
-    } catch (IOException e) {
-      throw new RuntimeException(e);
-    }
-  }
-
   @Test
   public void testRetargetOverrideD8() throws Exception {
     Assume.assumeTrue(parameters.getRuntime().isDex());
@@ -130,7 +102,6 @@
     String stdout =
         testForD8()
             .addLibraryFiles(getLibraryFile())
-            .addOptionsModification(this::setMachineSpec)
             .addInnerClasses(RetargetOverrideTest.class)
             .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
             .setMinApi(parameters.getApiLevel())
@@ -156,7 +127,6 @@
     String stdout =
         testForR8(Backend.DEX)
             .addLibraryFiles(getLibraryFile())
-            .addOptionsModification(this::setMachineSpec)
             .addKeepMainRule(Executor.class)
             .addInnerClasses(RetargetOverrideTest.class)
             .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/APIConversionFinalClassTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/APIConversionFinalClassTest.java
index f9d1828..7abed46 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/APIConversionFinalClassTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/APIConversionFinalClassTest.java
@@ -58,6 +58,7 @@
         .setMinApi(AndroidApiLevel.B)
         .addProgramClasses(Executor.class)
         .addLibraryClasses(CustomLibClass.class)
+        .addLibraryFiles(getLibraryFile())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
         .compile()
         .addDesugaredCoreLibraryRunClassPath(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/AccessModeConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/AccessModeConversionTest.java
index 6691cb1..a57140b 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/AccessModeConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/AccessModeConversionTest.java
@@ -66,8 +66,8 @@
             .build();
     LegacyDesugaredLibrarySpecification specification =
         new LegacyDesugaredLibrarySpecification(
-            LegacyTopLevelFlags.testing(), rewritingFlags, l8Compilation, options.itemFactory);
-    options.desugaredLibrarySpecification = specification;
+            LegacyTopLevelFlags.testing(), rewritingFlags, l8Compilation);
+    setDesugaredLibrarySpecificationForTesting(options, specification);
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionIntroduceInterfaceMethodTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionIntroduceInterfaceMethodTest.java
index aa97e55..957515a 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionIntroduceInterfaceMethodTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionIntroduceInterfaceMethodTest.java
@@ -87,9 +87,10 @@
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
         .addOptionsModification(
             opt ->
-                opt.desugaredLibrarySpecification =
+                setDesugaredLibrarySpecificationForTesting(
+                    opt,
                     configurationWithSupportAllCallbacksFromLibrary(
-                        opt, false, parameters, supportAllCallbacksFromLibrary))
+                        opt, false, parameters, supportAllCallbacksFromLibrary)))
         .compile()
         .inspect(this::assertDoubleForEach)
         .inspect(this::assertWrapperMethodsPresent)
@@ -151,9 +152,10 @@
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
         .addOptionsModification(
             opt ->
-                opt.desugaredLibrarySpecification =
+                setDesugaredLibrarySpecificationForTesting(
+                    opt,
                     configurationWithSupportAllCallbacksFromLibrary(
-                        opt, false, parameters, supportAllCallbacksFromLibrary))
+                        opt, false, parameters, supportAllCallbacksFromLibrary)))
         .compile()
         .inspect(this::assertDoubleForEach)
         .inspect(this::assertWrapperMethodsPresent)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionsPresentTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionsPresentTest.java
index 01f9b80..6972449 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionsPresentTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/ConversionsPresentTest.java
@@ -46,6 +46,7 @@
         L8Command.builder(diagnosticsHandler)
             .addLibraryFiles(getLibraryFile())
             .addProgramFiles(ToolHelper.DESUGAR_LIB_CONVERSIONS)
+            .addProgramFiles(ToolHelper.getDesugarJDKLibs())
             .addDesugaredLibraryConfiguration(
                 StringResource.fromFile(ToolHelper.getDesugarLibJsonForTesting()))
             .setMinApiLevel(parameters.getApiLevel().getLevel())
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIDesugaredLibTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIDesugaredLibTest.java
index 6b7d86e..b966b00 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIDesugaredLibTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/DuplicateAPIDesugaredLibTest.java
@@ -71,9 +71,10 @@
                         this.buildDesugaredLibrary(
                             api,
                             opt ->
-                                opt.desugaredLibrarySpecification =
+                                setDesugaredLibrarySpecificationForTesting(
+                                    opt,
                                     configurationWithSupportAllCallbacksFromLibrary(
-                                        opt, true, parameters, supportAllCallbacksFromLibrary)));
+                                        opt, true, parameters, supportAllCallbacksFromLibrary))));
                     return desugaredLibBox.get();
                   },
                   AndroidApiLevel.B)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/TryCatchTimeConversionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/TryCatchTimeConversionTest.java
index a669527..aaab5cb 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/TryCatchTimeConversionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/conversiontests/TryCatchTimeConversionTest.java
@@ -58,6 +58,7 @@
         .setMinApi(parameters.getApiLevel())
         .addProgramClasses(BaselineExecutor.class)
         .addLibraryClasses(CustomLibClass.class)
+        .addLibraryFiles(getLibraryFile())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
         .compile()
         .addDesugaredCoreLibraryRunClassPath(
@@ -98,6 +99,7 @@
         .setMinApi(parameters.getApiLevel())
         .addProgramClasses(TryCatchExecutor.class)
         .addLibraryClasses(CustomLibClass.class)
+        .addLibraryFiles(getLibraryFile())
         .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
         .compile()
         .addDesugaredCoreLibraryRunClassPath(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11StreamTests.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11StreamTests.java
index 2bd50b2..3b6ae0a 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11StreamTests.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdktests/Jdk11StreamTests.java
@@ -270,6 +270,7 @@
               .addProgramFiles(testNGSupportProgramFiles())
               .addOptionsModification(opt -> opt.testing.trackDesugaredAPIConversions = true)
               .addLibraryFiles(getLibraryFile())
+              .addLibraryFiles(JDK_11_JAVA_BASE_EXTENSION_CLASSES_DIR)
               .setMinApi(parameters.getApiLevel())
               .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
               .allowStdoutMessages()
@@ -303,6 +304,7 @@
           .addProgramFiles(testNGSupportProgramFiles())
           .addOptionsModification(opt -> opt.testing.trackDesugaredAPIConversions = true)
           .addLibraryFiles(getLibraryFile())
+          .addLibraryFiles(JDK_11_JAVA_BASE_EXTENSION_CLASSES_DIR)
           .setMinApi(parameters.getApiLevel())
           .enableCoreLibraryDesugaring(parameters.getApiLevel(), keepRuleConsumer)
           .compile()
diff --git a/src/test/java/com/android/tools/r8/desugar/jdk8272564/Jdk8272564Test.java b/src/test/java/com/android/tools/r8/desugar/jdk8272564/Jdk8272564Test.java
new file mode 100644
index 0000000..191cc22
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugar/jdk8272564/Jdk8272564Test.java
@@ -0,0 +1,164 @@
+// Copyright (c) 2022, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+package com.android.tools.r8.desugar.jdk8272564;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.TestRuntime;
+import com.android.tools.r8.examples.jdk18.jdk8272564.Jdk8272564;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.InternalOptions.TestingOptions;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+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 Jdk8272564Test extends TestBase {
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    // TODO(b/218293990): Right now the JDK 18 tests are built with -target 17, as our Gradle
+    //  version does not know of -target 18.
+    // TODO(b/174431251): This should be replaced with .withCfRuntimes(start = jdk17).
+    return getTestParameters()
+        .withCustomRuntime(TestRuntime.getCheckedInJdk17())
+        .withDexRuntimes()
+        .withAllApiLevelsAlsoForCf()
+        .build();
+  }
+
+  @Parameter(0)
+  public TestParameters parameters;
+
+  // With the fix for JDK-8272564 there are no invokevirtual instructions.
+  private void assertJdk8272564FixedCode(CodeInspector inspector) {
+    assertTrue(
+        inspector
+            .clazz(Jdk8272564.Main.typeName())
+            .uniqueMethodWithName("f")
+            .streamInstructions()
+            .noneMatch(InstructionSubject::isInvokeVirtual));
+    assertTrue(
+        inspector
+            .clazz(Jdk8272564.Main.typeName())
+            .uniqueMethodWithName("g")
+            .streamInstructions()
+            .noneMatch(InstructionSubject::isInvokeVirtual));
+  }
+
+  // Without the fix for JDK-8272564 there is one invokeinterface and 2 invokevirtual instructions.
+  private void assertJdk8272564NotFixedCode(
+      CodeInspector inspector, int invokeVirtualCount, int getClassCount) {
+    assertEquals(
+        1,
+        inspector
+            .clazz(Jdk8272564.Main.typeName())
+            .uniqueMethodWithName("f")
+            .streamInstructions()
+            .filter(InstructionSubject::isInvokeInterface)
+            .count());
+    assertEquals(
+        2,
+        inspector
+            .clazz(Jdk8272564.Main.typeName())
+            .uniqueMethodWithName("f")
+            .streamInstructions()
+            .filter(InstructionSubject::isInvokeVirtual)
+            .count());
+    assertEquals(
+        2,
+        inspector
+            .clazz(Jdk8272564.Main.typeName())
+            .uniqueMethodWithName("g")
+            .streamInstructions()
+            .filter(InstructionSubject::isInvokeInterface)
+            .count());
+    assertEquals(
+        2,
+        inspector
+            .clazz(Jdk8272564.Main.typeName())
+            .uniqueMethodWithName("g")
+            .streamInstructions()
+            .filter(InstructionSubject::isInvokeInterface)
+            .count());
+    assertEquals(
+        invokeVirtualCount,
+        inspector
+            .clazz(Jdk8272564.Main.typeName())
+            .uniqueMethodWithName("g")
+            .streamInstructions()
+            .filter(InstructionSubject::isInvokeVirtual)
+            .count());
+    assertEquals(
+        getClassCount,
+        inspector
+            .clazz(Jdk8272564.Main.typeName())
+            .uniqueMethodWithName("g")
+            .streamInstructions()
+            .filter(InstructionSubject::isInvoke)
+            .filter(instruction -> instruction.getMethod().getName().toString().equals("getClass"))
+            .count());
+  }
+
+  private void assertJdk8272564NotFixedCode(CodeInspector inspector) {
+    assertJdk8272564NotFixedCode(inspector, 22, 3);
+  }
+
+  private void assertJdk8272564NotFixedCodeR8(CodeInspector inspector) {
+    assertJdk8272564NotFixedCode(inspector, 19, 0);
+  }
+
+  @Test
+  // See https://bugs.openjdk.java.net/browse/JDK-8272564.
+  public void testJdk8272564Compiler() throws Exception {
+    assumeTrue(parameters.isCfRuntime());
+    // Ensure that the test is running with CF input from fixing JDK-8272564.
+    assertJdk8272564FixedCode(new CodeInspector(Jdk8272564.jar()));
+  }
+
+  @Test
+  public void testJvm() throws Exception {
+    assumeTrue(parameters.isCfRuntime());
+    testForJvm()
+        .addRunClasspathFiles(Jdk8272564.jar())
+        .run(TestRuntime.getCheckedInJdk17(), Jdk8272564.Main.typeName())
+        .assertSuccess();
+  }
+
+  @Test
+  public void testD8() throws Exception {
+    testForDesugaring(parameters)
+        .addProgramFiles(Jdk8272564.jar())
+        .run(parameters.getRuntime(), Jdk8272564.Main.typeName())
+        .applyIf(
+            parameters.isDexRuntime() && parameters.getApiLevel().isLessThan(AndroidApiLevel.O),
+            b -> b.inspect(this::assertJdk8272564NotFixedCode),
+            b -> b.inspect(this::assertJdk8272564FixedCode))
+        .assertSuccess();
+  }
+
+  @Test
+  public void testR8() throws Exception {
+    // The R8 lens code rewriter rewrites to the code prior to fixing JDK-8272564.
+    testForR8(parameters.getBackend())
+        .addProgramFiles(Jdk8272564.jar())
+        .setMinApi(parameters.getApiLevel())
+        .noTreeShaking()
+        .addKeepClassAndMembersRules(Jdk8272564.Main.typeName())
+        .addOptionsModification(TestingOptions::allowExperimentClassFileVersion)
+        .run(parameters.getRuntime(), Jdk8272564.Main.typeName())
+        .inspect(this::assertJdk8272564NotFixedCodeR8)
+        .assertSuccess();
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/examples/jdk18/jdk8272564/Jdk8272564.java b/src/test/java/com/android/tools/r8/examples/jdk18/jdk8272564/Jdk8272564.java
new file mode 100644
index 0000000..5e891aa
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/examples/jdk18/jdk8272564/Jdk8272564.java
@@ -0,0 +1,32 @@
+// Copyright (c) 2022, 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.examples.jdk18.jdk8272564;
+
+import com.android.tools.r8.examples.JavaExampleClassProxy;
+import java.nio.file.Path;
+
+public class Jdk8272564 {
+
+  private static final String EXAMPLE_FILE = "examplesJava18/jdk8272564";
+
+  public static final JavaExampleClassProxy A =
+      new JavaExampleClassProxy(EXAMPLE_FILE, "jdk8272564/A");
+  public static final JavaExampleClassProxy B =
+      new JavaExampleClassProxy(EXAMPLE_FILE, "jdk8272564/B");
+  public static final JavaExampleClassProxy C =
+      new JavaExampleClassProxy(EXAMPLE_FILE, "jdk8272564/C");
+  public static final JavaExampleClassProxy I =
+      new JavaExampleClassProxy(EXAMPLE_FILE, "jdk8272564/I");
+  public static final JavaExampleClassProxy J =
+      new JavaExampleClassProxy(EXAMPLE_FILE, "jdk8272564/J");
+  public static final JavaExampleClassProxy K =
+      new JavaExampleClassProxy(EXAMPLE_FILE, "jdk8272564/K");
+  public static final JavaExampleClassProxy Main =
+      new JavaExampleClassProxy(EXAMPLE_FILE, "jdk8272564/Main");
+
+  public static Path jar() {
+    return JavaExampleClassProxy.examplesJar(EXAMPLE_FILE);
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/type/NarrowingWithoutSubtypingTest.java b/src/test/java/com/android/tools/r8/ir/analysis/type/NarrowingWithoutSubtypingTest.java
index b78279e..403372c 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/type/NarrowingWithoutSubtypingTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/type/NarrowingWithoutSubtypingTest.java
@@ -4,6 +4,12 @@
 
 package com.android.tools.r8.ir.analysis.type;
 
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticMessage;
+import static org.hamcrest.CoreMatchers.containsString;
+import static org.junit.Assert.assertThrows;
+
+import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.D8TestBuilder;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.utils.BooleanUtils;
@@ -32,17 +38,32 @@
 
   @Test
   public void test() throws Exception {
-    testForD8()
-        .addInnerClasses(NarrowingWithoutSubtypingTest.class)
-        .addOptionsModification(
-            options -> {
-              options.testing.readInputStackMaps = readStackMap;
-              options.testing.enableNarrowAndWideningingChecksInD8 = true;
-              options.testing.noLocalsTableOnInput = true;
-            })
-        .setMinApi(parameters.getApiLevel())
-        .run(parameters.getRuntime(), TestClass.class)
-        .assertSuccessWithOutputLines("Hello world!");
+    D8TestBuilder d8TestBuilder =
+        testForD8()
+            .addInnerClasses(NarrowingWithoutSubtypingTest.class)
+            .addOptionsModification(
+                options -> {
+                  options.testing.readInputStackMaps = readStackMap;
+                  options.testing.enableNarrowAndWideningingChecksInD8 = true;
+                  options.testing.noLocalsTableOnInput = true;
+                })
+            .setMinApi(parameters.getApiLevel());
+    if (readStackMap) {
+      d8TestBuilder
+          .run(parameters.getRuntime(), TestClass.class)
+          .assertSuccessWithOutputLines("Hello world!");
+    } else {
+      // TODO(b/169120386): We should not be narrowing in D8.
+      assertThrows(
+          CompilationFailedException.class,
+          () -> {
+            d8TestBuilder.compileWithExpectedDiagnostics(
+                diagnostics ->
+                    diagnostics.assertAllErrorsMatch(
+                        diagnosticMessage(
+                            containsString("java.lang.AssertionError: During NARROWING"))));
+          });
+    }
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/ifs/IfThrowNullPointerExceptionTest.java b/src/test/java/com/android/tools/r8/ir/optimize/ifs/IfThrowNullPointerExceptionTest.java
index e679e80..d0b977b 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/ifs/IfThrowNullPointerExceptionTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/ifs/IfThrowNullPointerExceptionTest.java
@@ -17,7 +17,6 @@
 import com.android.tools.r8.ir.code.BasicBlock;
 import com.android.tools.r8.ir.code.IRCode;
 import com.android.tools.r8.ir.code.Instruction;
-import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
@@ -80,7 +79,7 @@
     ClassSubject classSubject = inspector.clazz(TestClass.class);
     assertThat(classSubject, isPresent());
     inspectMethod(inspector, classSubject, "testThrowNPE", false, true);
-    inspectMethod(inspector, classSubject, "testThrowNPEWithMessage", true, canUseRequireNonNull());
+    inspectMethod(inspector, classSubject, "testThrowNPEWithMessage", true, false);
     inspectMethod(inspector, classSubject, "testThrowNull", false, true);
   }
 
@@ -105,31 +104,18 @@
 
       Instruction nullCheckInstruction =
           entryBlock.getInstructions().get(1 + BooleanUtils.intValue(isNPEWithMessage));
-      if (canUseRequireNonNull()) {
-        assertTrue(nullCheckInstruction.isInvokeStatic());
-        if (isNPEWithMessage) {
-          assertEquals(
-              inspector.getFactory().objectsMethods.requireNonNullWithMessage,
-              nullCheckInstruction.asInvokeStatic().getInvokedMethod());
-        } else {
-          assertEquals(
-              inspector.getFactory().objectsMethods.requireNonNull,
-              nullCheckInstruction.asInvokeStatic().getInvokedMethod());
-        }
-      } else {
-        assertFalse(isNPEWithMessage);
-        assertTrue(nullCheckInstruction.isInvokeVirtual());
-        assertEquals(
-            inspector.getFactory().objectMembers.getClass,
-            nullCheckInstruction.asInvokeVirtual().getInvokedMethod());
-      }
+      assertFalse(isNPEWithMessage);
+      assertTrue(nullCheckInstruction.isInvokeVirtual());
+      assertEquals(
+          inspector.getFactory().objectMembers.getClass,
+          nullCheckInstruction.asInvokeVirtual().getInvokedMethod());
     } else {
       assertEquals(3, code.blocks.size());
     }
   }
 
   private String getExpectedStdout() {
-    if (parameters.isCfRuntime() || canUseRequireNonNull() || isDalvik()) {
+    if (parameters.isCfRuntime() || isDalvik()) {
       return StringUtils.lines("Caught NPE: null", "Caught NPE: x was null", "Caught NPE: null");
     }
     return StringUtils.lines(
@@ -140,11 +126,6 @@
             + " on a null object reference");
   }
 
-  private boolean canUseRequireNonNull() {
-    return parameters.isDexRuntime()
-        && parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.K);
-  }
-
   private boolean isDalvik() {
     return parameters.isDexRuntime()
         && parameters.getRuntime().asDex().getVm().getVersion().isDalvik();
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineInvokeWithNullableReceiverTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineInvokeWithNullableReceiverTest.java
index dce7b2d..527d320 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineInvokeWithNullableReceiverTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineInvokeWithNullableReceiverTest.java
@@ -68,20 +68,16 @@
     assertThat(methodSubject, isPresent());
 
     // A `throw` instruction should have been synthesized into main().
-    if (canUseRequireNonNull()) {
-      assertTrue(methodSubject.streamInstructions().anyMatch(InstructionSubject::isInvokeStatic));
-    } else {
-      assertTrue(
-          methodSubject
-              .streamInstructions()
-              .filter(InstructionSubject::isInvokeVirtual)
-              .anyMatch(
-                  method ->
-                      method
-                          .getMethod()
-                          .toSourceString()
-                          .equals("java.lang.Class java.lang.Object.getClass()")));
-    }
+    assertTrue(
+        methodSubject
+            .streamInstructions()
+            .filter(InstructionSubject::isInvokeVirtual)
+            .anyMatch(
+                method ->
+                    method
+                        .getMethod()
+                        .toSourceString()
+                        .equals("java.lang.Class java.lang.Object.getClass()")));
 
     // Class A is still present because the instance flows into a phi that has a null-check.
     ClassSubject otherClassSubject = inspector.clazz(A.class);
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineMethodWithRetargetedLibMemberTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineMethodWithRetargetedLibMemberTest.java
index 03b1280..71b7da8 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineMethodWithRetargetedLibMemberTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineMethodWithRetargetedLibMemberTest.java
@@ -12,8 +12,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;
-import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.desugar.desugaredlibrary.DesugaredLibraryTestBase;
 import java.util.Arrays;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -21,7 +20,7 @@
 import org.junit.runners.Parameterized.Parameters;
 
 @RunWith(Parameterized.class)
-public class InlineMethodWithRetargetedLibMemberTest extends TestBase {
+public class InlineMethodWithRetargetedLibMemberTest extends DesugaredLibraryTestBase {
 
   private final TestParameters parameters;
 
@@ -37,7 +36,7 @@
   @Test
   public void test() throws Exception {
     testForR8(parameters.getBackend())
-        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.P))
+        .addLibraryFiles(getLibraryFile())
         .addProgramClasses(TestClass.class)
         .addKeepMainRule(TestClass.class)
         .enableCoreLibraryDesugaring(
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/SyntheticInlineNullCheckPositionTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/SyntheticInlineNullCheckPositionTest.java
index 7cdd9d0..a10e302 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/SyntheticInlineNullCheckPositionTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/SyntheticInlineNullCheckPositionTest.java
@@ -5,7 +5,6 @@
 package com.android.tools.r8.ir.optimize.inliner;
 
 import static com.android.tools.r8.naming.retrace.StackTrace.isSame;
-import static com.android.tools.r8.naming.retrace.StackTrace.isSameExceptForSpecificLineNumber;
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import com.android.tools.r8.TestBase;
@@ -70,16 +69,7 @@
         .run(parameters.getRuntime(), Main.class)
         .assertFailureWithErrorThatThrows(NullPointerException.class)
         .inspectStackTrace(
-            stackTrace -> {
-              if (canUseJavaUtilObjectsRequireNonNull(parameters)) {
-                assertThat(
-                    stackTrace,
-                    isSameExceptForSpecificLineNumber(
-                        expectedStackTraceWithRequireNonNull, REQUIRE_NON_NULL_LINE));
-              } else {
-                assertThat(stackTrace, isSame(expectedStackTraceWithGetClass));
-              }
-            });
+            stackTrace -> assertThat(stackTrace, isSame(expectedStackTraceWithGetClass)));
   }
 
   static class Main {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/AssumeInstanceFieldValueTest.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/AssumeInstanceFieldValueTest.java
index 4e275f4..edd2219 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/AssumeInstanceFieldValueTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/AssumeInstanceFieldValueTest.java
@@ -70,11 +70,7 @@
 
     MethodSubject mainMethodSubject = testClassSubject.mainMethod();
     assertThat(mainMethodSubject, isPresent());
-    if (canUseJavaUtilObjectsRequireNonNull(parameters)) {
-      assertThat(mainMethodSubject, invokesMethodWithName("requireNonNull"));
-    } else {
-      assertThat(mainMethodSubject, invokesMethodWithName("getClass"));
-    }
+    assertThat(mainMethodSubject, invokesMethodWithName("getClass"));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/EffectivelyUnusedNullableArgumentTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/EffectivelyUnusedNullableArgumentTest.java
index 54d2071..f01e7b7 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/EffectivelyUnusedNullableArgumentTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/EffectivelyUnusedNullableArgumentTest.java
@@ -55,12 +55,7 @@
               assertEquals(
                   aClassSubject.getDexProgramClass().getType(),
                   fooMethodSubject.getProgramMethod().getParameter(0));
-              assertThat(
-                  fooMethodSubject,
-                  invokesMethodWithName(
-                      canUseJavaUtilObjectsRequireNonNull(parameters)
-                          ? "requireNonNull"
-                          : "getClass"));
+              assertThat(fooMethodSubject, invokesMethodWithName("getClass"));
 
               MethodSubject barMethodSubject = aClassSubject.uniqueMethodWithName("bar");
               assertThat(barMethodSubject, isStatic());
diff --git a/src/test/java/com/android/tools/r8/memberrebinding/b135627418/B135627418.java b/src/test/java/com/android/tools/r8/memberrebinding/b135627418/B135627418.java
index f3103f1..2d1b98c 100644
--- a/src/test/java/com/android/tools/r8/memberrebinding/b135627418/B135627418.java
+++ b/src/test/java/com/android/tools/r8/memberrebinding/b135627418/B135627418.java
@@ -12,10 +12,12 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ir.desugar.desugaredlibrary.legacyspecification.LegacyDesugaredLibrarySpecification;
+import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.ir.desugar.desugaredlibrary.machinespecification.MachineDesugaredLibrarySpecification;
 import com.android.tools.r8.memberrebinding.b135627418.library.Drawable;
 import com.android.tools.r8.memberrebinding.b135627418.library.DrawableWrapper;
 import com.android.tools.r8.memberrebinding.b135627418.library.InsetDrawable;
+import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.InstructionSubject;
@@ -75,11 +77,23 @@
                 com.android.tools.r8.memberrebinding.b135627418.runtime.InsetDrawable.class)
             .setMinApi(parameters.getRuntime())
             .addOptionsModification(
-                options ->
-                    options.desugaredLibrarySpecification =
-                        LegacyDesugaredLibrarySpecification.withOnlyRewritePrefixForTesting(
-                            ImmutableMap.of(packageName + ".runtime", packageName + ".library"),
-                            options))
+                options -> {
+                  DexType type =
+                      options
+                          .dexItemFactory()
+                          .createType(
+                              DescriptorUtils.javaTypeToDescriptor(
+                                  packageName + ".runtime.InsetDrawable"));
+                  DexType rewrittenType =
+                      options
+                          .dexItemFactory()
+                          .createType(
+                              DescriptorUtils.javaTypeToDescriptor(
+                                  packageName + ".library.InsetDrawable"));
+                  options.machineDesugaredLibrarySpecification =
+                      MachineDesugaredLibrarySpecification.withOnlyRewriteTypeForTesting(
+                          ImmutableMap.of(type, rewrittenType));
+                })
             .compile();
 
     testForR8(parameters.getBackend())
diff --git a/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingOnLibraryPathTest.java b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingOnLibraryPathTest.java
new file mode 100644
index 0000000..df6fe4d
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingOnLibraryPathTest.java
@@ -0,0 +1,69 @@
+// Copyright (c) 2022, 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.naming.applymapping;
+
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertEquals;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
+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 ApplyMappingOnLibraryPathTest extends TestBase {
+
+  @Parameter() public TestParameters parameters;
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withAllRuntimesAndApiLevels().build();
+  }
+
+  @Test
+  public void testR8() throws Exception {
+    testForR8(parameters.getBackend())
+        .addLibraryClasses(LibraryClass.class)
+        .addDefaultRuntimeLibrary(parameters)
+        .addProgramClasses(Main.class)
+        .setMinApi(parameters.getApiLevel())
+        .addApplyMapping(typeName(LibraryClass.class) + " -> a.a:")
+        .addKeepMainRule(Main.class)
+        .compile()
+        .inspect(
+            inspector -> {
+              ClassSubject clazz = inspector.clazz(Main.class);
+              assertThat(clazz, isPresentAndNotRenamed());
+              FoundClassSubject foundClassSubject = clazz.asFoundClassSubject();
+              assertEquals(
+                  typeName(LibraryClass.class),
+                  foundClassSubject.getSuperClass().getOriginalName());
+            })
+        .addRunClasspathClasses(LibraryClass.class)
+        .run(parameters.getRuntime(), Main.class)
+        .assertSuccessWithOutputLines("LibraryClass::foo");
+  }
+
+  public static class LibraryClass {
+
+    public void foo() {
+      System.out.println("LibraryClass::foo");
+    }
+  }
+
+  public static class Main extends LibraryClass {
+
+    public static void main(String[] args) {
+      new Main().foo();
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/RetraceInlineBranchTest.java b/src/test/java/com/android/tools/r8/naming/retrace/RetraceInlineBranchTest.java
index 92b6019..b07255b 100644
--- a/src/test/java/com/android/tools/r8/naming/retrace/RetraceInlineBranchTest.java
+++ b/src/test/java/com/android/tools/r8/naming/retrace/RetraceInlineBranchTest.java
@@ -5,7 +5,6 @@
 package com.android.tools.r8.naming.retrace;
 
 import static com.android.tools.r8.naming.retrace.StackTrace.isSame;
-import static com.android.tools.r8.naming.retrace.StackTrace.isSameExceptForLineNumbers;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.junit.Assert.assertEquals;
@@ -16,11 +15,9 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.naming.retrace.StackTrace.StackTraceLine;
 import com.android.tools.r8.utils.codeinspector.InstructionSubject;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import java.util.List;
-import java.util.Objects;
 import java.util.Optional;
 import java.util.stream.Collectors;
 import org.junit.Before;
@@ -64,50 +61,30 @@
         .run(parameters.getRuntime(), Main.class)
         .inspectStackTrace(
             (stackTrace, inspector) -> {
-              if (canUseJavaUtilObjectsRequireNonNull(parameters)) {
-                StackTrace requireNonNullFrame =
-                    StackTrace.builder().add(stackTrace.get(0)).build();
-                assertThat(
-                    requireNonNullFrame,
-                    isSameExceptForLineNumbers(
-                        StackTrace.builder()
-                            .add(
-                                StackTraceLine.builder()
-                                    .setClassName(Objects.class.getTypeName())
-                                    .setMethodName("requireNonNull")
-                                    .setFileName("Objects.java")
-                                    .build())
-                            .build()));
-
-                StackTrace stackTraceWithoutRequireNonNull =
-                    StackTrace.builder().add(stackTrace).remove(0).build();
-                assertThat(stackTraceWithoutRequireNonNull, isSame(expectedStackTrace));
-              } else {
-                // To check that we inserted the check in the branch correctly we use a rudimentary
-                // line check by comparing that the getClass method comes later than the first if.
-                MethodSubject methodSubject =
-                    inspector.clazz(Main.class).uniqueMethodWithName("call");
-                assertThat(methodSubject, isPresent());
-                List<InstructionSubject> getClassCalls =
-                    methodSubject
-                        .streamInstructions()
-                        .filter(
-                            instructionSubject ->
-                                instructionSubject.isInvoke()
-                                    && instructionSubject
-                                        .getMethod()
-                                        .qualifiedName()
-                                        .contains("getClass"))
-                        .collect(Collectors.toList());
-                assertEquals(1, getClassCalls.size());
-                Optional<InstructionSubject> firstIf =
-                    methodSubject.streamInstructions().filter(InstructionSubject::isIf).findFirst();
-                assertTrue(firstIf.isPresent());
+              MethodSubject methodSubject =
+                  inspector.clazz(Main.class).uniqueMethodWithName("call");
+              assertThat(methodSubject, isPresent());
+              List<InstructionSubject> getClassCalls =
+                  methodSubject
+                      .streamInstructions()
+                      .filter(
+                          instructionSubject ->
+                              instructionSubject.isInvoke()
+                                  && instructionSubject
+                                      .getMethod()
+                                      .qualifiedName()
+                                      .contains("getClass"))
+                      .collect(Collectors.toList());
+              assertEquals(1, getClassCalls.size());
+              Optional<InstructionSubject> firstIf =
+                  methodSubject.streamInstructions().filter(InstructionSubject::isIf).findFirst();
+              assertTrue(firstIf.isPresent());
+              if (methodSubject.hasLineNumberTable()) {
                 assertTrue(
                     methodSubject.getLineNumberForInstruction(getClassCalls.get(0))
                         > methodSubject.getLineNumberForInstruction(firstIf.get()));
-                assertThat(stackTrace, isSame(expectedStackTrace));
               }
+              assertThat(stackTrace, isSame(expectedStackTrace));
             });
   }
 
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/RetraceInlineConditionTest.java b/src/test/java/com/android/tools/r8/naming/retrace/RetraceInlineConditionTest.java
index 36921ce..b005549 100644
--- a/src/test/java/com/android/tools/r8/naming/retrace/RetraceInlineConditionTest.java
+++ b/src/test/java/com/android/tools/r8/naming/retrace/RetraceInlineConditionTest.java
@@ -4,15 +4,20 @@
 
 package com.android.tools.r8.naming.retrace;
 
+import static com.android.tools.r8.naming.retrace.StackTrace.isSame;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.CoreMatchers.not;
 import static org.hamcrest.MatcherAssert.assertThat;
 
+import com.android.tools.r8.R8TestCompileResult;
 import com.android.tools.r8.SingleTestRunResult;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestBuilder;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import org.hamcrest.CoreMatchers;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -48,16 +53,26 @@
 
   @Test
   public void testR8() throws Throwable {
-    testForR8(parameters.getBackend())
-        .addInnerClasses(getClass())
-        .setMinApi(parameters.getApiLevel())
-        .addKeepMainRule(Main.class)
-        .compile()
-        .inspectProguardMap(
-            map -> {
-              assertThat(
-                  map, not(CoreMatchers.containsString("com.android.tools.r8.rewriteFrame")));
-            });
+    R8TestCompileResult compileResult =
+        testForR8(parameters.getBackend())
+            .addInnerClasses(getClass())
+            .setMinApi(parameters.getApiLevel())
+            .addKeepMainRule(Main.class)
+            .addKeepAttributeLineNumberTable()
+            .compile()
+            .inspectProguardMap(map -> not(containsString("com.android.tools.r8.rewriteFrame")))
+            .inspect(
+                inspector -> {
+                  ClassSubject fooClass = inspector.clazz(Foo.class);
+                  assertThat(fooClass, isPresent());
+                  MethodSubject inlineable = fooClass.uniqueMethodWithName("inlineable");
+                  assertThat(inlineable, not(isPresent()));
+                });
+    compileResult
+        .run(parameters.getRuntime(), Main.class)
+        .assertFailureWithErrorThatThrows(NullPointerException.class)
+        .inspectStackTrace(
+            (stackTrace, codeInspector) -> assertThat(stackTrace, isSame(expectedStackTrace)));
   }
 
   static class Foo {
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/RetraceInlineeWithNullCheckSequenceTest.java b/src/test/java/com/android/tools/r8/naming/retrace/RetraceInlineeWithNullCheckSequenceTest.java
index be348ec..48379c5 100644
--- a/src/test/java/com/android/tools/r8/naming/retrace/RetraceInlineeWithNullCheckSequenceTest.java
+++ b/src/test/java/com/android/tools/r8/naming/retrace/RetraceInlineeWithNullCheckSequenceTest.java
@@ -4,15 +4,12 @@
 package com.android.tools.r8.naming.retrace;
 
 import static com.android.tools.r8.naming.retrace.StackTrace.isSame;
-import static com.android.tools.r8.naming.retrace.StackTrace.isSameExceptForLineNumbers;
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.naming.retrace.StackTrace.StackTraceLine;
 import java.util.List;
-import java.util.Objects;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -58,27 +55,7 @@
         .assertFailureWithErrorThatThrows(NullPointerException.class)
         .inspectStackTrace(
             (stackTrace, codeInspector) -> {
-              if (canUseJavaUtilObjectsRequireNonNull(parameters)) {
-                StackTrace requireNonNullFrame =
-                    StackTrace.builder().add(stackTrace.get(0)).build();
-                assertThat(
-                    requireNonNullFrame,
-                    isSameExceptForLineNumbers(
-                        StackTrace.builder()
-                            .add(
-                                StackTraceLine.builder()
-                                    .setClassName(Objects.class.getTypeName())
-                                    .setMethodName("requireNonNull")
-                                    .setFileName("Objects.java")
-                                    .build())
-                            .build()));
-
-                StackTrace stackTraceWithoutRequireNonNull =
-                    StackTrace.builder().add(stackTrace).remove(0).build();
-                assertThat(stackTraceWithoutRequireNonNull, isSame(expectedStackTrace));
-              } else {
-                assertThat(stackTrace, isSame(expectedStackTrace));
-              }
+              assertThat(stackTrace, isSame(expectedStackTrace));
             });
   }
 
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/RetraceInlineeWithNullCheckTest.java b/src/test/java/com/android/tools/r8/naming/retrace/RetraceInlineeWithNullCheckTest.java
index 70c2be4..0855291 100644
--- a/src/test/java/com/android/tools/r8/naming/retrace/RetraceInlineeWithNullCheckTest.java
+++ b/src/test/java/com/android/tools/r8/naming/retrace/RetraceInlineeWithNullCheckTest.java
@@ -4,16 +4,13 @@
 package com.android.tools.r8.naming.retrace;
 
 import static com.android.tools.r8.naming.retrace.StackTrace.isSame;
-import static com.android.tools.r8.naming.retrace.StackTrace.isSameExceptForLineNumbers;
 import static org.hamcrest.MatcherAssert.assertThat;
 
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.naming.retrace.StackTrace.StackTraceLine;
 import com.android.tools.r8.utils.BooleanUtils;
 import java.util.List;
-import java.util.Objects;
 import org.junit.Before;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -66,31 +63,7 @@
         .run(parameters.getRuntime(), Caller.class, getArgs())
         .assertFailureWithErrorThatThrows(NullPointerException.class)
         .inspectStackTrace(
-            (stackTrace, codeInspector) -> {
-              // TODO(b/214377135): The stack traces should be the same (when 206427323) is
-              //  resolved.
-              if (throwReceiverNpe && canUseJavaUtilObjectsRequireNonNull(parameters)) {
-                StackTrace requireNonNullFrame =
-                    StackTrace.builder().add(stackTrace.get(0)).build();
-                assertThat(
-                    requireNonNullFrame,
-                    isSameExceptForLineNumbers(
-                        StackTrace.builder()
-                            .add(
-                                StackTraceLine.builder()
-                                    .setClassName(Objects.class.getTypeName())
-                                    .setMethodName("requireNonNull")
-                                    .setFileName("Objects.java")
-                                    .build())
-                            .build()));
-
-                StackTrace stackTraceWithoutRequireNonNull =
-                    StackTrace.builder().add(stackTrace).remove(0).build();
-                assertThat(stackTraceWithoutRequireNonNull, isSame(expectedStackTrace));
-              } else {
-                assertThat(stackTrace, isSame(expectedStackTrace));
-              }
-            });
+            (stackTrace, codeInspector) -> assertThat(stackTrace, isSame(expectedStackTrace)));
   }
 
   static class Foo {
diff --git a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/NullableCompanionConstructorShakingTest.java b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/NullableCompanionConstructorShakingTest.java
index 594f86f..bca23cb 100644
--- a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/NullableCompanionConstructorShakingTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/NullableCompanionConstructorShakingTest.java
@@ -59,12 +59,7 @@
                       .streamInstructions()
                       .filter(InstructionSubject::isInvoke)
                       .count());
-              assertThat(
-                  mainMethodSubject,
-                  invokesMethodWithName(
-                      canUseJavaUtilObjectsRequireNonNull(parameters)
-                          ? "requireNonNull"
-                          : "getClass"));
+              assertThat(mainMethodSubject, invokesMethodWithName("getClass"));
               assertThat(mainMethodSubject, invokesMethod(companionMethodSubject));
             })
         .run(parameters.getRuntime(), Main.class)
diff --git a/src/test/java/com/android/tools/r8/optimize/proto/NormalizeTest.java b/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithKeptMethodTest.java
similarity index 65%
copy from src/test/java/com/android/tools/r8/optimize/proto/NormalizeTest.java
copy to src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithKeptMethodTest.java
index c78ced4..70dbf9d 100644
--- a/src/test/java/com/android/tools/r8/optimize/proto/NormalizeTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithKeptMethodTest.java
@@ -5,16 +5,16 @@
 package com.android.tools.r8.optimize.proto;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.MethodMatchers.hasParameters;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.NoHorizontalClassMerging;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.TypeSubject;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -22,7 +22,7 @@
 import org.junit.runners.Parameterized.Parameters;
 
 @RunWith(Parameterized.class)
-public class NormalizeTest extends TestBase {
+public class ProtoNormalizationWithKeptMethodTest extends TestBase {
 
   @Parameter(0)
   public TestParameters parameters;
@@ -37,6 +37,7 @@
     testForR8(parameters.getBackend())
         .addInnerClasses(getClass())
         .addKeepMainRule(Main.class)
+        .addKeepRules("-keep class " + Main.class.getTypeName() + " { void foo(...); }")
         .addOptionsModification(
             options -> options.testing.enableExperimentalProtoNormalization = true)
         .enableInliningAnnotations()
@@ -47,40 +48,48 @@
         .compile()
         .inspect(
             inspector -> {
-              ClassSubject aClassSubject = inspector.clazz(A.class);
-              assertThat(aClassSubject, isPresent());
-
-              ClassSubject bClassSubject = inspector.clazz(B.class);
-              assertThat(bClassSubject, isPresent());
+              TypeSubject aTypeSubject = inspector.clazz(A.class).asTypeSubject();
+              TypeSubject bTypeSubject = inspector.clazz(B.class).asTypeSubject();
 
               MethodSubject fooMethodSubject =
                   inspector.clazz(Main.class).uniqueMethodWithName("foo");
               assertThat(fooMethodSubject, isPresent());
+              assertThat(fooMethodSubject, hasParameters(bTypeSubject, aTypeSubject));
 
-              String expectedMethodSignature =
-                  "void "
-                      + fooMethodSubject.getFinalName()
-                      + "("
-                      + aClassSubject.getFinalName()
-                      + ", "
-                      + bClassSubject.getFinalName()
-                      + ")";
-              assertEquals(
-                  expectedMethodSignature,
-                  fooMethodSubject.getProgramMethod().getMethodSignature().toString());
+              for (String methodName : new String[] {"bar", "baz"}) {
+                MethodSubject methodSubject =
+                    inspector.clazz(Main.class).uniqueMethodWithName(methodName);
+                assertThat(methodSubject, isPresent());
+                assertThat(methodSubject, hasParameters(bTypeSubject, aTypeSubject));
+              }
             })
         .run(parameters.getRuntime(), Main.class)
-        .assertSuccessWithOutputLines("A", "B");
+        .assertSuccessWithOutputLines("A", "B", "A", "B", "A", "B");
   }
 
   static class Main {
 
     public static void main(String[] args) {
       foo(new B(), new A());
+      bar(new B(), new A());
+      baz(new A(), new B());
+    }
+
+    // @Keep
+    @NeverInline
+    static void foo(B b, A a) {
+      System.out.println(a);
+      System.out.println(b);
     }
 
     @NeverInline
-    static void foo(B b, A a) {
+    static void bar(B b, A a) {
+      System.out.println(a);
+      System.out.println(b);
+    }
+
+    @NeverInline
+    static void baz(A a, B b) {
       System.out.println(a);
       System.out.println(b);
     }
diff --git a/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithKeptVirtualMethodTest.java b/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithKeptVirtualMethodTest.java
new file mode 100644
index 0000000..e9655ba
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithKeptVirtualMethodTest.java
@@ -0,0 +1,118 @@
+// Copyright (c) 2022, 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.optimize.proto;
+
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.MethodMatchers.hasParameters;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import com.android.tools.r8.NeverInline;
+import com.android.tools.r8.NoVerticalClassMerging;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.TypeSubject;
+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 ProtoNormalizationWithKeptVirtualMethodTest extends TestBase {
+
+  @Parameter(0)
+  public TestParameters parameters;
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withAllRuntimesAndApiLevels().build();
+  }
+
+  @Test
+  public void test() throws Exception {
+    testForR8(parameters.getBackend())
+        .addInnerClasses(getClass())
+        .addKeepClassAndMembersRules(Main.class)
+        .addKeepRules("-keepclassmembers class " + A.class.getTypeName() + " { void foo(...); }")
+        .addOptionsModification(
+            options -> options.testing.enableExperimentalProtoNormalization = true)
+        .enableInliningAnnotations()
+        .enableNoVerticalClassMergingAnnotations()
+        .setMinApi(parameters.getApiLevel())
+        .compile()
+        .inspect(
+            inspector -> {
+              ClassSubject aClassSubject = inspector.clazz(A.class);
+              assertThat(aClassSubject, isPresent());
+
+              ClassSubject bClassSubject = inspector.clazz(B.class);
+              assertThat(bClassSubject, isPresent());
+
+              TypeSubject aTypeSubject = aClassSubject.asTypeSubject();
+              TypeSubject bTypeSubject = bClassSubject.asTypeSubject();
+
+              // A.foo(B, A) is kept.
+              MethodSubject fooMethodSubject = aClassSubject.uniqueMethodWithName("foo");
+              assertThat(fooMethodSubject, isPresent());
+              assertThat(fooMethodSubject, hasParameters(bTypeSubject, aTypeSubject));
+
+              // B.foo(B, A) overrides kept method.
+              MethodSubject otherFooMethodSubject = bClassSubject.uniqueMethodWithName("foo");
+              assertThat(otherFooMethodSubject, isPresent());
+              assertThat(otherFooMethodSubject, hasParameters(bTypeSubject, aTypeSubject));
+            })
+        .run(parameters.getRuntime(), Main.class)
+        .assertSuccessWithOutputLines("A", "B", "A", "B");
+  }
+
+  static class Main {
+
+    public static void main(String[] args) {
+      A a = new A();
+      B b = new B();
+      a.foo(b, a);
+      b.foo(b, a);
+      extra(a, b);
+    }
+
+    // @Keep to ensure that the program has parameter lists (A, B) and (B, A), or we will not
+    // optimize in the first place.
+    static void extra(A a, B b) {}
+  }
+
+  @NoVerticalClassMerging
+  static class A {
+
+    // @Keep
+    @NeverInline
+    public void foo(B b, A a) {
+      System.out.println(a);
+      System.out.println(b);
+    }
+
+    @Override
+    public String toString() {
+      return "A";
+    }
+  }
+
+  static class B extends A {
+
+    @NeverInline
+    @Override
+    public void foo(B b, A a) {
+      System.out.println(a);
+      System.out.println(b);
+    }
+
+    @Override
+    public String toString() {
+      return "B";
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithLibraryOverrideTest.java b/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithLibraryOverrideTest.java
new file mode 100644
index 0000000..52d4df1
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithLibraryOverrideTest.java
@@ -0,0 +1,113 @@
+// Copyright (c) 2022, 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.optimize.proto;
+
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.MethodMatchers.hasParameters;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import com.android.tools.r8.NeverInline;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.TypeSubject;
+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 ProtoNormalizationWithLibraryOverrideTest extends TestBase {
+
+  @Parameter(0)
+  public TestParameters parameters;
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withAllRuntimesAndApiLevels().build();
+  }
+
+  @Test
+  public void test() throws Exception {
+    testForR8(parameters.getBackend())
+        .addProgramClasses(Main.class, Program.class)
+        .addLibraryClasses(A.class, B.class, Library.class)
+        .addDefaultRuntimeLibrary(parameters)
+        .addKeepMainRule(Main.class)
+        .addOptionsModification(
+            options -> options.testing.enableExperimentalProtoNormalization = true)
+        .enableInliningAnnotations()
+        // TODO(b/173398086): uniqueMethodWithName() does not work with proto changes.
+        .noMinification()
+        .setMinApi(parameters.getApiLevel())
+        .compile()
+        .inspect(
+            inspector -> {
+              TypeSubject aTypeSubject = inspector.getTypeSubject(A.class.getTypeName());
+              TypeSubject bTypeSubject = inspector.getTypeSubject(B.class.getTypeName());
+
+              MethodSubject fooMethodSubject =
+                  inspector.clazz(Main.class).uniqueMethodWithName("foo");
+              assertThat(fooMethodSubject, isPresent());
+              assertThat(fooMethodSubject, hasParameters(bTypeSubject, aTypeSubject));
+
+              MethodSubject libraryOverrideMethodSubject =
+                  inspector.clazz(Program.class).uniqueMethodWithName("m");
+              assertThat(libraryOverrideMethodSubject, isPresent());
+              assertThat(libraryOverrideMethodSubject, hasParameters(bTypeSubject, aTypeSubject));
+            })
+        .addRunClasspathClasses(A.class, B.class, Library.class)
+        .run(parameters.getRuntime(), Main.class)
+        .assertSuccessWithOutputLines("Program", "A", "B");
+  }
+
+  static class Main {
+
+    public static void main(String[] args) {
+      Library library = System.currentTimeMillis() > 0 ? new Program() : new Library();
+      library.m(new B(), new A());
+      foo(new A(), new B());
+    }
+
+    @NeverInline
+    static void foo(A a, B b) {
+      System.out.println(a);
+      System.out.println(b);
+    }
+  }
+
+  static class A {
+
+    @Override
+    public String toString() {
+      return "A";
+    }
+  }
+
+  static class B {
+
+    @Override
+    public String toString() {
+      return "B";
+    }
+  }
+
+  public static class Library {
+
+    public void m(B b, A a) {
+      System.out.println("Library");
+    }
+  }
+
+  static class Program extends Library {
+
+    @Override
+    public void m(B b, A a) {
+      System.out.println("Program");
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/optimize/proto/NormalizeTest.java b/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithVirtualMethodCollisionTest.java
similarity index 63%
copy from src/test/java/com/android/tools/r8/optimize/proto/NormalizeTest.java
copy to src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithVirtualMethodCollisionTest.java
index c78ced4..babbf9f 100644
--- a/src/test/java/com/android/tools/r8/optimize/proto/NormalizeTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithVirtualMethodCollisionTest.java
@@ -5,16 +5,17 @@
 package com.android.tools.r8.optimize.proto;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.MethodMatchers.hasParameters;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.NeverInline;
-import com.android.tools.r8.NoHorizontalClassMerging;
+import com.android.tools.r8.NoVerticalClassMerging;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.TypeSubject;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -22,7 +23,7 @@
 import org.junit.runners.Parameterized.Parameters;
 
 @RunWith(Parameterized.class)
-public class NormalizeTest extends TestBase {
+public class ProtoNormalizationWithVirtualMethodCollisionTest extends TestBase {
 
   @Parameter(0)
   public TestParameters parameters;
@@ -40,7 +41,7 @@
         .addOptionsModification(
             options -> options.testing.enableExperimentalProtoNormalization = true)
         .enableInliningAnnotations()
-        .enableNoHorizontalClassMergingAnnotations()
+        .enableNoVerticalClassMergingAnnotations()
         // TODO(b/173398086): uniqueMethodWithName() does not work with proto changes.
         .noMinification()
         .setMinApi(parameters.getApiLevel())
@@ -53,50 +54,55 @@
               ClassSubject bClassSubject = inspector.clazz(B.class);
               assertThat(bClassSubject, isPresent());
 
-              MethodSubject fooMethodSubject =
-                  inspector.clazz(Main.class).uniqueMethodWithName("foo");
-              assertThat(fooMethodSubject, isPresent());
+              TypeSubject aTypeSubject = aClassSubject.asTypeSubject();
+              TypeSubject bTypeSubject = bClassSubject.asTypeSubject();
 
-              String expectedMethodSignature =
-                  "void "
-                      + fooMethodSubject.getFinalName()
-                      + "("
-                      + aClassSubject.getFinalName()
-                      + ", "
-                      + bClassSubject.getFinalName()
-                      + ")";
-              assertEquals(
-                  expectedMethodSignature,
-                  fooMethodSubject.getProgramMethod().getMethodSignature().toString());
+              MethodSubject fooMethodSubject = aClassSubject.uniqueMethodWithName("foo");
+              assertThat(fooMethodSubject, isPresent());
+              assertThat(fooMethodSubject, hasParameters(aTypeSubject, bTypeSubject));
+
+              // TODO(b/173398086): Consider rewriting B.foo(B, A) to B.foo(A, B, C) instead of
+              //  B.foo$1(A, B).
+              MethodSubject otherFooMethodSubject = bClassSubject.uniqueMethodWithName("foo$1");
+              assertThat(otherFooMethodSubject, isPresent());
+              assertThat(otherFooMethodSubject, hasParameters(aTypeSubject, bTypeSubject));
             })
         .run(parameters.getRuntime(), Main.class)
-        .assertSuccessWithOutputLines("A", "B");
+        .assertSuccessWithOutputLines("A", "B", "A", "B");
   }
 
   static class Main {
 
     public static void main(String[] args) {
-      foo(new B(), new A());
-    }
-
-    @NeverInline
-    static void foo(B b, A a) {
-      System.out.println(a);
-      System.out.println(b);
+      A a = new A();
+      B b = new B();
+      a.foo(a, b);
+      b.foo(b, a);
     }
   }
 
-  @NoHorizontalClassMerging
+  @NoVerticalClassMerging
   static class A {
 
+    @NeverInline
+    public void foo(A a, B b) {
+      System.out.println(a);
+      System.out.println(b);
+    }
+
     @Override
     public String toString() {
       return "A";
     }
   }
 
-  @NoHorizontalClassMerging
-  static class B {
+  static class B extends A {
+
+    @NeverInline
+    public void foo(B b, A a) {
+      System.out.println(a);
+      System.out.println(b);
+    }
 
     @Override
     public String toString() {
diff --git a/src/test/java/com/android/tools/r8/optimize/proto/NormalizeTest.java b/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithoutSharingTest.java
similarity index 73%
rename from src/test/java/com/android/tools/r8/optimize/proto/NormalizeTest.java
rename to src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithoutSharingTest.java
index c78ced4..0088b3b 100644
--- a/src/test/java/com/android/tools/r8/optimize/proto/NormalizeTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithoutSharingTest.java
@@ -5,16 +5,16 @@
 package com.android.tools.r8.optimize.proto;
 
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.MethodMatchers.hasParameters;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.NoHorizontalClassMerging;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
+import com.android.tools.r8.utils.codeinspector.TypeSubject;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -22,7 +22,7 @@
 import org.junit.runners.Parameterized.Parameters;
 
 @RunWith(Parameterized.class)
-public class NormalizeTest extends TestBase {
+public class ProtoNormalizationWithoutSharingTest extends TestBase {
 
   @Parameter(0)
   public TestParameters parameters;
@@ -47,27 +47,14 @@
         .compile()
         .inspect(
             inspector -> {
-              ClassSubject aClassSubject = inspector.clazz(A.class);
-              assertThat(aClassSubject, isPresent());
+              TypeSubject aTypeSubject = inspector.clazz(A.class).asTypeSubject();
+              TypeSubject bTypeSubject = inspector.clazz(B.class).asTypeSubject();
 
-              ClassSubject bClassSubject = inspector.clazz(B.class);
-              assertThat(bClassSubject, isPresent());
-
+              // Should not be normalized as there is no sharing of protos.
               MethodSubject fooMethodSubject =
                   inspector.clazz(Main.class).uniqueMethodWithName("foo");
               assertThat(fooMethodSubject, isPresent());
-
-              String expectedMethodSignature =
-                  "void "
-                      + fooMethodSubject.getFinalName()
-                      + "("
-                      + aClassSubject.getFinalName()
-                      + ", "
-                      + bClassSubject.getFinalName()
-                      + ")";
-              assertEquals(
-                  expectedMethodSignature,
-                  fooMethodSubject.getProgramMethod().getMethodSignature().toString());
+              assertThat(fooMethodSubject, hasParameters(bTypeSubject, aTypeSubject));
             })
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("A", "B");
diff --git a/src/test/java/com/android/tools/r8/resolution/access/indirectfield/IndirectFieldAccessTest.java b/src/test/java/com/android/tools/r8/resolution/access/indirectfield/IndirectFieldAccessTest.java
index ea51b57..fc7a254 100644
--- a/src/test/java/com/android/tools/r8/resolution/access/indirectfield/IndirectFieldAccessTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/access/indirectfield/IndirectFieldAccessTest.java
@@ -66,7 +66,7 @@
             Reference.field(Reference.classFromClass(B.class), "f", Reference.INT),
             appInfo.dexItemFactory());
     FieldResolutionResult resolutionResult = appInfo.resolveField(f);
-    assertTrue(resolutionResult.isSuccessfulResolution());
+    assertTrue(resolutionResult.isSingleFieldResolutionResult());
     assertEquals(OptionalBool.TRUE, resolutionResult.isAccessibleFrom(barMethod, appInfo));
   }
 
diff --git a/src/test/java/com/android/tools/r8/resolution/field/FieldResolutionWithMultipleResultsTest.java b/src/test/java/com/android/tools/r8/resolution/field/FieldResolutionWithMultipleResultsTest.java
new file mode 100644
index 0000000..7b46775
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/resolution/field/FieldResolutionWithMultipleResultsTest.java
@@ -0,0 +1,115 @@
+// Copyright (c) 2022, 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.resolution.field;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
+import com.android.tools.r8.graph.ClassResolutionResult;
+import com.android.tools.r8.graph.DexClass;
+import com.android.tools.r8.graph.DexField;
+import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.graph.FieldResolutionResult;
+import com.android.tools.r8.references.Reference;
+import com.android.tools.r8.utils.AndroidApp;
+import com.google.common.collect.ImmutableList;
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.function.Consumer;
+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 FieldResolutionWithMultipleResultsTest extends TestBase {
+
+  @Parameter() public TestParameters parameters;
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withNoneRuntime().build();
+  }
+
+  private final List<Class<?>> libraryClasses = ImmutableList.of(A.class, B.class);
+
+  @Test
+  public void testMultipleResultsWithProgramAndLibrary() throws Exception {
+    List<Class<?>> programClasses = new ArrayList<>(libraryClasses);
+    programClasses.add(C.class);
+    testMultipleResolutionsMatchesFoundClasses(
+        readClasses(programClasses, libraryClasses),
+        fieldResult -> assertTrue(fieldResult.hasProgramResult()));
+  }
+
+  @Test
+  public void testMultipleResultsWithClasspathAndLibrary() throws Exception {
+    List<Class<?>> classPath = new ArrayList<>(libraryClasses);
+    classPath.add(C.class);
+    testMultipleResolutionsMatchesFoundClasses(
+        readClasses(Collections.emptyList(), classPath, libraryClasses),
+        fieldResult -> assertTrue(fieldResult.hasClasspathResult()));
+  }
+
+  @Test
+  public void testProgramOverClasspath() throws Exception {
+    List<Class<?>> programAndClasspathClasses = new ArrayList<>(libraryClasses);
+    programAndClasspathClasses.add(C.class);
+    testMultipleResolutionsMatchesFoundClasses(
+        readClasses(programAndClasspathClasses, programAndClasspathClasses, libraryClasses),
+        fieldResult -> assertTrue(fieldResult.hasProgramResult()));
+  }
+
+  private void testMultipleResolutionsMatchesFoundClasses(
+      AndroidApp androidApp, Consumer<FieldResolutionResult> resultConsumer) throws Exception {
+    AppInfoWithClassHierarchy appInfoWithClassHierarchy =
+        computeAppInfoWithClassHierarchy(androidApp);
+    DexItemFactory factory = appInfoWithClassHierarchy.dexItemFactory();
+    DexField field =
+        factory.createField(
+            Reference.field(
+                Reference.classFromClass(C.class), "foo", Reference.primitiveFromDescriptor("I")));
+    FieldResolutionResult fieldResolutionResult = appInfoWithClassHierarchy.resolveField(field);
+    assertTrue(fieldResolutionResult.isMultiFieldResolutionResult());
+    resultConsumer.accept(fieldResolutionResult);
+    assertTrue(fieldResolutionResult.hasProgramOrClasspathResult());
+    assertFalse(fieldResolutionResult.isPossiblyFailedOrUnknownResolution());
+    Set<DexClass> resolvedHolders = new HashSet<>();
+    fieldResolutionResult.forEachFieldResolutionResult(
+        resolutionResult -> {
+          assertTrue(resolutionResult.isSingleFieldResolutionResult());
+          boolean existing =
+              resolvedHolders.add(
+                  resolutionResult.asSingleFieldResolutionResult().getResolvedHolder());
+          assertTrue(existing);
+        });
+    assertEquals(2, resolvedHolders.size());
+    ClassResolutionResult classResolutionResult =
+        appInfoWithClassHierarchy.contextIndependentDefinitionForWithResolutionResult(
+            factory.createType(Reference.classFromClass(A.class)));
+    assertTrue(classResolutionResult.hasClassResolutionResult());
+    Set<DexClass> foundClasses = new HashSet<>();
+    classResolutionResult.forEachClassResolutionResult(foundClasses::add);
+    assertEquals(foundClasses, resolvedHolders);
+  }
+
+  public static class A {
+
+    public int foo;
+  }
+
+  public static class B extends A {}
+
+  public static class C extends B {}
+}
diff --git a/src/test/java/com/android/tools/r8/retrace/InlineWithoutNullCheckTest.java b/src/test/java/com/android/tools/r8/retrace/InlineWithoutNullCheckTest.java
index 6973f6b..820be96 100644
--- a/src/test/java/com/android/tools/r8/retrace/InlineWithoutNullCheckTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/InlineWithoutNullCheckTest.java
@@ -17,7 +17,6 @@
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.naming.retrace.StackTrace;
-import com.android.tools.r8.shaking.ProguardKeepAttributes;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -111,25 +110,15 @@
         .addKeepMainRule(TestClassForInlineMethod.class)
         .enableAlwaysInliningAnnotations()
         .enableInliningAnnotations()
-        .addKeepAttributes(ProguardKeepAttributes.SOURCE_FILE)
+        .addKeepAttributeSourceFile()
+        .addKeepAttributeLineNumberTable()
         .setMinApi(parameters.getApiLevel())
         .compile()
         .inspect(this::checkSomething)
         .run(parameters.getRuntime(), TestClassForInlineMethod.class)
         .assertFailure()
-        // TODO(b/143607166): The stack trace has one more frame on the top than expected.
         .inspectStackTrace(
-            stackTrace -> assertThat(expectedStackTraceForInlineMethod, not(isSame(stackTrace))))
-        .inspectStackTrace(
-            stackTrace ->
-                assertThat(
-                    stackTrace,
-                    isSameExceptForFileNameAndLineNumber(
-                        createStackTraceBuilder()
-                            .addWithoutFileNameAndLineNumber(
-                                A.class, "inlineMethodWhichAccessInstanceMethod")
-                            .addWithoutFileNameAndLineNumber(TestClassForInlineMethod.class, "main")
-                            .build())));
+            stackTrace -> assertThat(expectedStackTraceForInlineMethod, isSame(stackTrace)));
   }
 
   @Test
@@ -139,25 +128,15 @@
         .addKeepMainRule(TestClassForInlineField.class)
         .enableAlwaysInliningAnnotations()
         .enableInliningAnnotations()
-        .addKeepAttributes(ProguardKeepAttributes.SOURCE_FILE)
+        .addKeepAttributeSourceFile()
+        .addKeepAttributeLineNumberTable()
         .setMinApi(parameters.getApiLevel())
         .compile()
         .inspect(this::checkSomething)
         .run(parameters.getRuntime(), TestClassForInlineField.class)
         .assertFailure()
-        // TODO(b/143607166): The stack trace has one more frame on the top than expected.
         .inspectStackTrace(
-            stackTrace -> assertThat(expectedStackTraceForInlineField, not(isSame(stackTrace))))
-        .inspectStackTrace(
-            stackTrace ->
-                assertThat(
-                    stackTrace,
-                    isSameExceptForFileNameAndLineNumber(
-                        createStackTraceBuilder()
-                            .addWithoutFileNameAndLineNumber(
-                                A.class, "inlineMethodWhichAccessInstanceField")
-                            .addWithoutFileNameAndLineNumber(TestClassForInlineField.class, "main")
-                            .build())));
+            stackTrace -> assertThat(expectedStackTraceForInlineField, isSame(stackTrace)));
   }
 
   @Test
@@ -168,27 +147,15 @@
         .addKeepMainRule(TestClassForInlineStaticField.class)
         .enableAlwaysInliningAnnotations()
         .enableInliningAnnotations()
-        .addKeepAttributes(ProguardKeepAttributes.SOURCE_FILE)
+        .addKeepAttributeSourceFile()
+        .addKeepAttributeLineNumberTable()
         .setMinApi(parameters.getApiLevel())
         .compile()
         .inspect(this::checkSomething)
         .run(parameters.getRuntime(), TestClassForInlineStaticField.class)
         .assertFailure()
-        // TODO(b/143607166): The stack trace has one more frame on the top than expected.
         .inspectStackTrace(
-            stackTrace ->
-                assertThat(expectedStackTraceForInlineStaticField, not(isSame(stackTrace))))
-        .inspectStackTrace(
-            stackTrace ->
-                assertThat(
-                    stackTrace,
-                    isSameExceptForFileNameAndLineNumber(
-                        createStackTraceBuilder()
-                            .addWithoutFileNameAndLineNumber(
-                                A.class, "inlineMethodWhichAccessStaticField")
-                            .addWithoutFileNameAndLineNumber(
-                                TestClassForInlineStaticField.class, "main")
-                            .build())));
+            stackTrace -> assertThat(expectedStackTraceForInlineStaticField, isSame(stackTrace)));
   }
 
   private StackTrace.Builder createStackTraceBuilder() {
diff --git a/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionConfigurationAssertionHandlerAssertionInClinitOnlyTest.java b/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionConfigurationAssertionHandlerAssertionInClinitOnlyTest.java
index 314d180..f2de8f4 100644
--- a/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionConfigurationAssertionHandlerAssertionInClinitOnlyTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionConfigurationAssertionHandlerAssertionInClinitOnlyTest.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.rewrite.assertions;
 
+import com.android.tools.r8.R8TestBuilder;
 import com.android.tools.r8.references.MethodReference;
 import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.rewrite.assertions.assertionhandler.AssertionHandlers;
@@ -35,4 +36,9 @@
   List<Class<?>> getTestClasses() {
     return ImmutableList.of(AssertionsInClinit.class);
   }
+
+  @Override
+  protected void configure(R8TestBuilder<?> builder) {
+    builder.allowUnusedProguardConfigurationRules();
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionConfigurationAssertionHandlerMissingClassTest.java b/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionConfigurationAssertionHandlerMissingClassTest.java
new file mode 100644
index 0000000..72057c3
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionConfigurationAssertionHandlerMissingClassTest.java
@@ -0,0 +1,97 @@
+// Copyright (c) 2022, 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.assertions;
+
+import static org.junit.Assert.fail;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.references.MethodReference;
+import com.android.tools.r8.references.Reference;
+import com.android.tools.r8.rewrite.assertions.assertionhandler.AssertionHandlers;
+import com.android.tools.r8.rewrite.assertions.assertionhandler.AssertionsSimple;
+import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.ZipUtils.ZipBuilder;
+import java.nio.file.Path;
+import java.util.List;
+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 AssertionConfigurationAssertionHandlerMissingClassTest extends TestBase {
+
+  private static final String EXPECTED_OUTPUT =
+      StringUtils.lines(
+          "assertionHandler: simpleAssertion",
+          "assertionHandler: multipleAssertions",
+          "assertionHandler: multipleAssertions");
+  private static Class<?> MAIN_CLASS = AssertionsSimple.class;
+
+  @Parameter() public TestParameters parameters;
+
+  @Parameters(name = "{0}")
+  public static List<Object[]> data() {
+    return buildParameters(
+        getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build());
+  }
+
+  private MethodReference getAssertionHandler() {
+    try {
+      return Reference.methodFromMethod(
+          AssertionHandlers.class.getMethod("assertionHandler", Throwable.class));
+    } catch (NoSuchMethodException e) {
+    }
+    fail();
+    return null;
+  }
+
+  private Path jarWithAssertionHandler() throws Exception {
+    Path jar = temp.newFolder().toPath().resolve("assertion_handler.jar");
+    if (parameters.isDexRuntime()) {
+      testForD8()
+          .addProgramClasses(AssertionHandlers.class)
+          .setMinApi(parameters.getApiLevel())
+          .compile()
+          .writeToZip(jar);
+      return jar;
+    } else {
+      return ZipBuilder.builder(jar)
+          .addFilesRelative(
+              ToolHelper.getClassPathForTests(),
+              ToolHelper.getClassFileForTestClass(AssertionHandlers.class))
+          .build();
+    }
+  }
+
+  @Test
+  public void testR8() throws Exception {
+    testForR8(parameters.getBackend())
+        .addProgramClasses(MAIN_CLASS)
+        .addKeepMainRule(MAIN_CLASS)
+        .addKeepAnnotation()
+        .addKeepRules("-keepclassmembers class * { @com.android.tools.r8.Keep *; }")
+        .setMinApi(parameters.getApiLevel())
+        .addIgnoreWarnings()
+        .addAssertionsConfiguration(
+            builder -> builder.setAssertionHandler(getAssertionHandler()).setScopeAll().build())
+        .allowDiagnosticMessages()
+        .compileWithExpectedDiagnostics(
+            diagnostics ->
+                diagnostics
+                    .assertOnlyWarnings()
+                    .inspectWarnings(
+                        diagnostic ->
+                            diagnostic
+                                .assertIsMissingDefinitionsDiagnostic()
+                                .assertIsAllMissingClasses(AssertionHandlers.class)))
+        .addRunClasspathFiles(jarWithAssertionHandler())
+        .run(parameters.getRuntime(), MAIN_CLASS)
+        .assertSuccessWithOutput(EXPECTED_OUTPUT);
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionConfigurationAssertionHandlerNoAssertionsAfterOptimizingTest.java b/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionConfigurationAssertionHandlerNoAssertionsAfterOptimizingTest.java
new file mode 100644
index 0000000..36f01a8
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionConfigurationAssertionHandlerNoAssertionsAfterOptimizingTest.java
@@ -0,0 +1,49 @@
+// Copyright (c) 2022, 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.assertions;
+
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static org.hamcrest.CoreMatchers.not;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import com.android.tools.r8.references.MethodReference;
+import com.android.tools.r8.references.Reference;
+import com.android.tools.r8.rewrite.assertions.assertionhandler.AssertionHandlers;
+import com.android.tools.r8.rewrite.assertions.assertionhandler.NoAssertionsAfterOptimization;
+import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.google.common.collect.ImmutableList;
+import java.util.List;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class AssertionConfigurationAssertionHandlerNoAssertionsAfterOptimizingTest
+    extends AssertionConfigurationAssertionHandlerTestBase {
+
+  private static final String EXPECTED_OUTPUT = StringUtils.lines("Hello, world!");
+
+  @Override
+  String getExpectedOutput() {
+    return EXPECTED_OUTPUT;
+  }
+
+  @Override
+  MethodReference getAssertionHandler() throws Exception {
+    return Reference.methodFromMethod(
+        AssertionHandlers.class.getMethod("assertionHandler", Throwable.class));
+  }
+
+  @Override
+  protected void inspect(CodeInspector inspector) {
+    assert getAssertionHandlerClasses().size() == 1;
+    assertThat(inspector.clazz(getAssertionHandlerClasses().get(0)), not(isPresent()));
+  }
+
+  @Override
+  List<Class<?>> getTestClasses() {
+    return ImmutableList.of(NoAssertionsAfterOptimization.class);
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionConfigurationAssertionHandlerTestBase.java b/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionConfigurationAssertionHandlerTestBase.java
index fa4de84..0583b32 100644
--- a/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionConfigurationAssertionHandlerTestBase.java
+++ b/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionConfigurationAssertionHandlerTestBase.java
@@ -6,10 +6,13 @@
 
 import static org.junit.Assume.assumeTrue;
 
+import com.android.tools.r8.R8TestBuilder;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.references.MethodReference;
 import com.android.tools.r8.rewrite.assertions.assertionhandler.AssertionHandlers;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -34,6 +37,14 @@
 
   abstract List<Class<?>> getTestClasses();
 
+  protected List<Class<?>> getAssertionHandlerClasses() {
+    return ImmutableList.of(AssertionHandlers.class);
+  }
+
+  protected void configure(R8TestBuilder<?> builder) {}
+
+  protected void inspect(CodeInspector inspector) {}
+
   private MethodReference getAssertionHandlerIgnoreException() {
     try {
       return getAssertionHandler();
@@ -46,7 +57,7 @@
   public void testD8() throws Exception {
     assumeTrue(parameters.isDexRuntime());
     testForD8(parameters.getBackend())
-        .addProgramClasses(AssertionHandlers.class)
+        .addProgramClasses(getAssertionHandlerClasses())
         .addProgramClasses(getTestClasses())
         .setMinApi(parameters.getApiLevel())
         .addOptionsModification(o -> o.testing.forceIRForCfToCfDesugar = true)
@@ -63,11 +74,11 @@
   @Test
   public void testR8() throws Exception {
     testForR8(parameters.getBackend())
-        .addProgramClasses(AssertionHandlers.class)
+        .addProgramClasses(getAssertionHandlerClasses())
         .addProgramClasses(getTestClasses())
         .addKeepMainRule(getTestClasses().get(0))
         .addKeepAnnotation()
-        .addKeepRules("-keep class * { @com.android.tools.r8.Keep *; }")
+        .addKeepRules("-keepclassmembers class * { @com.android.tools.r8.Keep *; }")
         .setMinApi(parameters.getApiLevel())
         .addAssertionsConfiguration(
             builder ->
@@ -75,7 +86,9 @@
                     .setAssertionHandler(getAssertionHandlerIgnoreException())
                     .setScopeAll()
                     .build())
+        .apply(this::configure)
         .run(parameters.getRuntime(), getTestClasses().get(0))
+        .inspect(this::inspect)
         .assertSuccessWithOutput(getExpectedOutput());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/rewrite/assertions/assertionhandler/NoAssertionsAfterOptimization.java b/src/test/java/com/android/tools/r8/rewrite/assertions/assertionhandler/NoAssertionsAfterOptimization.java
new file mode 100644
index 0000000..994c83a
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/rewrite/assertions/assertionhandler/NoAssertionsAfterOptimization.java
@@ -0,0 +1,27 @@
+// Copyright (c) 2022, 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.assertions.assertionhandler;
+
+import com.android.tools.r8.Keep;
+
+public class NoAssertionsAfterOptimization {
+
+  private static boolean alwaysFalse() {
+    return false;
+  }
+
+  @Keep
+  private static void assertionUnderAlwaysFalseCondition() {
+    if (alwaysFalse()) {
+      assert false : "Fifth assertion";
+    }
+  }
+
+  public static void main(String[] args) {
+    System.out.print("Hello, ");
+    assertionUnderAlwaysFalseCondition();
+    System.out.println("world!");
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/shaking/InvalidTypesTest.java b/src/test/java/com/android/tools/r8/shaking/InvalidTypesTest.java
index e110f57..f22ae69 100644
--- a/src/test/java/com/android/tools/r8/shaking/InvalidTypesTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/InvalidTypesTest.java
@@ -78,6 +78,7 @@
                 return StringUtils.joinLines("Hello!", "Goodbye!", "");
 
               case V7_0_0:
+              case V13_MASTER:
                 return StringUtils.joinLines(
                     "Hello!",
                     "Unexpected outcome of checkcast",
diff --git a/src/test/java/com/android/tools/r8/shaking/clinit/ClassInitInlineForStaticGetterInSuperTypeTest.java b/src/test/java/com/android/tools/r8/shaking/clinit/ClassInitInlineForStaticGetterInSuperTypeTest.java
index 7a4c15e..ae433d9 100644
--- a/src/test/java/com/android/tools/r8/shaking/clinit/ClassInitInlineForStaticGetterInSuperTypeTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/clinit/ClassInitInlineForStaticGetterInSuperTypeTest.java
@@ -18,7 +18,6 @@
 public class ClassInitInlineForStaticGetterInSuperTypeTest extends TestBase {
 
   private static final String EXPECTED = "Hello World";
-  private static final String R8_EXPECTED = "Goodbye World";
 
   @Parameter() public TestParameters parameters;
 
@@ -44,8 +43,7 @@
         .addKeepRules("-keep class " + typeName(B.class) + " { <fields>; }")
         .enableInliningAnnotations()
         .run(parameters.getRuntime(), Main.class)
-        // TODO(b/215477768): Should be Hello World
-        .assertSuccessWithOutputLines(R8_EXPECTED);
+        .assertSuccessWithOutputLines(EXPECTED);
   }
 
   public static class A {
diff --git a/src/test/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java b/src/test/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java
index 8cc71c8..804c5f8 100644
--- a/src/test/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java
+++ b/src/test/java/com/android/tools/r8/synthesis/SyntheticItemsTestUtils.java
@@ -76,7 +76,8 @@
   public static boolean isExternalSynthetic(ClassReference reference) {
     for (SyntheticKind kind : SyntheticKind.values()) {
       if (kind == SyntheticKind.RECORD_TAG
-          || kind == SyntheticKind.EMULATED_INTERFACE_MARKER_CLASS) {
+          || kind == SyntheticKind.EMULATED_INTERFACE_MARKER_CLASS
+          || kind == SyntheticKind.RETARGET_STUB) {
         continue;
       }
       if (kind.isFixedSuffixSynthetic) {
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java
index 4ffcdb4..9be6468 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentMethodSubject.java
@@ -77,6 +77,16 @@
   }
 
   @Override
+  public TypeSubject getParameter(int index) {
+    throw new Unreachable("Cannot get the parameter for an absent method");
+  }
+
+  @Override
+  public List<TypeSubject> getParameters() {
+    throw new Unreachable("Cannot get the parameters for an absent method");
+  }
+
+  @Override
   public ProgramMethod getProgramMethod() {
     return null;
   }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
index 04f0d52..30b3fb0 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/ClassSubject.java
@@ -171,6 +171,10 @@
     return null;
   }
 
+  public TypeSubject asTypeSubject() {
+    return null;
+  }
+
   @Override
   public abstract ClassAccessFlags getAccessFlags();
 
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
index 0d62343..cdc420e 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundClassSubject.java
@@ -289,6 +289,11 @@
   }
 
   @Override
+  public TypeSubject asTypeSubject() {
+    return new TypeSubject(codeInspector, dexClass.getType());
+  }
+
+  @Override
   public boolean isAbstract() {
     return dexClass.accessFlags.isAbstract();
   }
@@ -504,10 +509,6 @@
     return dexClass.toSourceString();
   }
 
-  public TypeSubject asTypeSubject() {
-    return new TypeSubject(codeInspector, getDexProgramClass().type);
-  }
-
   @Override
   public KmClassSubject getKmClass() {
     AnnotationSubject annotationSubject = annotation(METADATA_TYPE);
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
index a41ab17..b99b090 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/FoundMethodSubject.java
@@ -124,6 +124,18 @@
   }
 
   @Override
+  public TypeSubject getParameter(int index) {
+    return new TypeSubject(codeInspector, getMethod().getParameter(index));
+  }
+
+  @Override
+  public List<TypeSubject> getParameters() {
+    return getMethod().getParameters().stream()
+        .map(parameter -> new TypeSubject(codeInspector, parameter))
+        .collect(Collectors.toList());
+  }
+
+  @Override
   public ProgramMethod getProgramMethod() {
     return new ProgramMethod(clazz.getDexProgramClass(), getMethod());
   }
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/MethodMatchers.java b/src/test/java/com/android/tools/r8/utils/codeinspector/MethodMatchers.java
new file mode 100644
index 0000000..8d7e78b
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/MethodMatchers.java
@@ -0,0 +1,54 @@
+// Copyright (c) 2022, 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.utils.codeinspector;
+
+import static junit.framework.TestCase.assertEquals;
+
+import com.android.tools.r8.utils.StringUtils;
+import java.util.Arrays;
+import java.util.List;
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+import org.hamcrest.TypeSafeMatcher;
+
+public class MethodMatchers {
+
+  public static Matcher<MethodSubject> hasParameters(TypeSubject... expectedParameters) {
+    return hasParameters(Arrays.asList(expectedParameters));
+  }
+
+  public static Matcher<MethodSubject> hasParameters(List<TypeSubject> expectedParameters) {
+    return new TypeSafeMatcher<MethodSubject>() {
+      @Override
+      protected boolean matchesSafely(MethodSubject methodSubject) {
+        if (!methodSubject.isPresent()) {
+          return false;
+        }
+        if (methodSubject.getParameters().size() != expectedParameters.size()) {
+          return false;
+        }
+        for (int i = 0; i < expectedParameters.size(); i++) {
+          TypeSubject actualParameter = methodSubject.getParameter(i);
+          TypeSubject expectedParameter = expectedParameters.get(i);
+          assertEquals(expectedParameter, actualParameter);
+        }
+        return true;
+      }
+
+      @Override
+      public void describeTo(Description description) {
+        description.appendText(
+            "has parameters ("
+                + StringUtils.join(", ", expectedParameters, TypeSubject::getTypeName)
+                + ")");
+      }
+
+      @Override
+      public void describeMismatchSafely(final MethodSubject subject, Description description) {
+        description.appendText("method did not");
+      }
+    };
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java
index 594b17a..3b7fe05 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/MethodSubject.java
@@ -12,6 +12,7 @@
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.google.common.collect.Streams;
 import java.util.Iterator;
+import java.util.List;
 import java.util.function.Predicate;
 import java.util.stream.Stream;
 
@@ -51,6 +52,10 @@
 
   public abstract DexEncodedMethod getMethod();
 
+  public abstract TypeSubject getParameter(int index);
+
+  public abstract List<TypeSubject> getParameters();
+
   public abstract ProgramMethod getProgramMethod();
 
   public Iterator<InstructionSubject> iterateInstructions() {
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/TypeSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/TypeSubject.java
index 357c777..5761b99 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/TypeSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/TypeSubject.java
@@ -1,4 +1,4 @@
-// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
+// Copyright (c) 2022, 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.
 
@@ -17,6 +17,10 @@
     this.dexType = dexType;
   }
 
+  public String getTypeName() {
+    return dexType.getTypeName();
+  }
+
   @Override
   public boolean isPresent() {
     return true;
diff --git a/third_party/android_jar/lib-v33.tar.gz.sha1 b/third_party/android_jar/lib-v33.tar.gz.sha1
new file mode 100644
index 0000000..2e88eb6
--- /dev/null
+++ b/third_party/android_jar/lib-v33.tar.gz.sha1
@@ -0,0 +1 @@
+ecd236f896f9a19eeb7d46eb983cbaf94fd31d76
\ No newline at end of file
diff --git a/third_party/openjdk/jdk-18/linux.tar.gz.sha1 b/third_party/openjdk/jdk-18/linux.tar.gz.sha1
new file mode 100644
index 0000000..3c8efd9
--- /dev/null
+++ b/third_party/openjdk/jdk-18/linux.tar.gz.sha1
@@ -0,0 +1 @@
+b545df5778c9025fe105dddcd8b3830d8731137b
\ No newline at end of file
diff --git a/third_party/openjdk/jdk-18/osx.tar.gz.sha1 b/third_party/openjdk/jdk-18/osx.tar.gz.sha1
new file mode 100644
index 0000000..9699f89
--- /dev/null
+++ b/third_party/openjdk/jdk-18/osx.tar.gz.sha1
@@ -0,0 +1 @@
+527883f93a157ae249f83f461b0368d87c8fe6a1
\ No newline at end of file
diff --git a/third_party/openjdk/jdk-18/windows.tar.gz.sha1 b/third_party/openjdk/jdk-18/windows.tar.gz.sha1
new file mode 100644
index 0000000..854167c
--- /dev/null
+++ b/third_party/openjdk/jdk-18/windows.tar.gz.sha1
@@ -0,0 +1 @@
+b1e3cb3be67dd78423a0a96c0214ac97b5edd112
\ No newline at end of file
diff --git a/tools/linux/README.art-versions b/tools/linux/README.art-versions
index ff57695..fee679c 100644
--- a/tools/linux/README.art-versions
+++ b/tools/linux/README.art-versions
@@ -42,6 +42,28 @@
   <continue with repo sync as above>
 
 
+art-13-master (Android T)
+-------------------------
+Build from master commit e208b04cc2efaf707390d7acbe8f978142701d72.
+
+repo sync -cq -j24
+source build/envsetup.sh
+lunch aosp_redfin-userdebug
+m -j48
+m -j48 build-art
+m -j48 test-art-host
+
+Collected into tools/linux/host/art-13-master. The "host" path element is checked
+by the script for running Art.
+
+  cd <r8 checkout>
+  scripts/update-host-art.sh \
+     --android-checkout <...>/android/master \
+     --art-dir host/art-13-master \
+     --android-product redfin
+
+(cd tools/linux/host; upload_to_google_storage.py -a --bucket r8-deps art-13-master)
+
 art-12.0.0 (Android S)
 ---------------------
 Build from branch sc-beta4-release.
diff --git a/tools/linux/host/art-13-master.tar.gz.sha1 b/tools/linux/host/art-13-master.tar.gz.sha1
new file mode 100644
index 0000000..8b16edd
--- /dev/null
+++ b/tools/linux/host/art-13-master.tar.gz.sha1
@@ -0,0 +1 @@
+a2cf2b34b8712adb5c25a18bc6135946cfb1a047
\ No newline at end of file
diff --git a/tools/test.py b/tools/test.py
index 9d5e99f..e822efe 100755
--- a/tools/test.py
+++ b/tools/test.py
@@ -24,6 +24,7 @@
 
 ALL_ART_VMS = [
     "default",
+    "13.0.0",
     "12.0.0",
     "10.0.0",
     "9.0.0",
