Merge commit 'eeb28eaf9e19fc60331601bb3c80c613e36b6c35' into dev-release
diff --git a/build.gradle b/build.gradle
index db4592a..812b438 100644
--- a/build.gradle
+++ b/build.gradle
@@ -646,6 +646,12 @@
 }
 
 setJdkCompilationWithCompatibility(
+        sourceSets.main.compileJavaTaskName,
+        'jdk-11',
+        JavaVersion.VERSION_11,
+        false);
+
+setJdkCompilationWithCompatibility(
         sourceSets.examplesJava9.compileJavaTaskName,
         'openjdk-9.0.4',
         JavaVersion.VERSION_1_9,
@@ -1037,7 +1043,7 @@
             input,
             "--output", output,
             "--pg-map-output", output + ".map",
-            "--lib", "third_party/openjdk/openjdk-rt-1.8/rt.jar"
+            "--lib", org.gradle.internal.jvm.Jvm.current().javaHome,
     ] + args + libs.collectMany { ["--lib", it] } + pgConfs.collectMany { ["--pg-conf", it] }
     return baseR8CommandLine(allArgs)
 }
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs.json b/src/library_desugar/jdk11/desugar_jdk_libs.json
index 5adf5d1..9332de7 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs.json
@@ -6,6 +6,22 @@
   "support_all_callbacks_from_library": true,
   "common_flags": [
     {
+      "api_level_below_or_equal": 32,
+      "rewrite_prefix": {
+        "java.util.concurrent.DesugarTimeUnit": "j$.util.concurrent.DesugarTimeUnit"
+      },
+      "retarget_method": {
+        "java.util.concurrent.TimeUnit java.util.concurrent.TimeUnit#of(java.time.temporal.ChronoUnit)": "java.util.concurrent.DesugarTimeUnit",
+        "java.time.temporal.ChronoUnit java.util.concurrent.TimeUnit#toChronoUnit()": "java.util.concurrent.DesugarTimeUnit",
+        "long java.util.concurrent.TimeUnit#convert(java.time.Duration)": "java.util.concurrent.DesugarTimeUnit"
+      },
+      "amend_library_method": [
+        "public static java.util.concurrent.TimeUnit java.util.concurrent.TimeUnit#of(java.time.temporal.ChronoUnit)",
+        "public java.time.temporal.ChronoUnit java.util.concurrent.TimeUnit#toChronoUnit()",
+        "public long java.util.concurrent.TimeUnit#convert(java.time.Duration)"
+      ]
+    },
+    {
       "api_level_below_or_equal": 30,
       "rewrite_prefix": {
         "java.time.": "j$.time.",
@@ -20,8 +36,7 @@
         "java.time.ZonedDateTime java.util.GregorianCalendar#toZonedDateTime()": "java.util.DesugarGregorianCalendar"
       },
       "wrapper_conversion": [
-        "java.time.Clock",
-        "java.time.temporal.ChronoUnit"
+        "java.time.Clock"
       ],
       "custom_conversion": {
         "java.time.Duration": "java.time.TimeConversions",
diff --git a/src/library_desugar/jdk11/desugar_jdk_libs_nio.json b/src/library_desugar/jdk11/desugar_jdk_libs_nio.json
index 8d31143..5a1d513 100644
--- a/src/library_desugar/jdk11/desugar_jdk_libs_nio.json
+++ b/src/library_desugar/jdk11/desugar_jdk_libs_nio.json
@@ -10,12 +10,21 @@
       "rewrite_prefix": {
         "java.net.URLDecoder": "j$.net.URLDecoder",
         "java.net.URLEncoder": "j$.net.URLEncoder",
-        "java.io.DesugarInputStream": "j$.io.DesugarInputStream"
+        "java.io.DesugarInputStream": "j$.io.DesugarInputStream",
+        "java.util.concurrent.DesugarTimeUnit": "j$.util.concurrent.DesugarTimeUnit"
+      },
+      "retarget_method": {
+        "java.util.concurrent.TimeUnit java.util.concurrent.TimeUnit#of(java.time.temporal.ChronoUnit)": "java.util.concurrent.DesugarTimeUnit",
+        "java.time.temporal.ChronoUnit java.util.concurrent.TimeUnit#toChronoUnit()": "java.util.concurrent.DesugarTimeUnit",
+        "long java.util.concurrent.TimeUnit#convert(java.time.Duration)": "java.util.concurrent.DesugarTimeUnit"
       },
       "retarget_method_with_emulated_dispatch": {
         "long java.io.InputStream#transferTo(java.io.OutputStream)": "java.io.DesugarInputStream"
       },
       "amend_library_method": [
+        "public static java.util.concurrent.TimeUnit java.util.concurrent.TimeUnit#of(java.time.temporal.ChronoUnit)",
+        "public java.time.temporal.ChronoUnit java.util.concurrent.TimeUnit#toChronoUnit()",
+        "public long java.util.concurrent.TimeUnit#convert(java.time.Duration)",
         "public long java.io.InputStream#transferTo(java.io.OutputStream)"
       ]
     },
@@ -34,8 +43,7 @@
         "java.time.ZonedDateTime java.util.GregorianCalendar#toZonedDateTime()": "java.util.DesugarGregorianCalendar"
       },
       "wrapper_conversion": [
-        "java.time.Clock",
-        "java.time.temporal.ChronoUnit"
+        "java.time.Clock"
       ],
       "custom_conversion": {
         "java.time.Duration": "java.time.TimeConversions",
diff --git a/src/main/java/com/android/tools/r8/D8.java b/src/main/java/com/android/tools/r8/D8.java
index 068f2ec..f578416 100644
--- a/src/main/java/com/android/tools/r8/D8.java
+++ b/src/main/java/com/android/tools/r8/D8.java
@@ -333,7 +333,7 @@
       if (options.isGeneratingClassFiles()) {
         new CfApplicationWriter(appView, marker).write(options.getClassFileConsumer(), inputApp);
       } else {
-        new ApplicationWriter(appView, marker).write(executor, inputApp);
+        ApplicationWriter.create(appView, marker).write(executor, inputApp);
       }
       options.printWarnings();
     } catch (ExecutionException e) {
@@ -428,7 +428,7 @@
     ConvertedCfFiles convertedCfFiles = new ConvertedCfFiles();
     new GenericSignatureRewriter(appView).run(appView.appInfo().classes(), executor);
     new KotlinMetadataRewriter(appView).runForD8(executor);
-    new ApplicationWriter(appView, marker, convertedCfFiles).write(executor);
+    ApplicationWriter.create(appView, marker, convertedCfFiles).write(executor);
     AndroidApp.Builder builder = AndroidApp.builder(inputApp);
     builder.getProgramResourceProviders().clear();
     builder.addProgramResourceProvider(convertedCfFiles);
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 6ef6c416..71898e2 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -217,7 +217,7 @@
       if (options.isGeneratingClassFiles()) {
         new CfApplicationWriter(appView, marker).write(options.getClassFileConsumer(), inputApp);
       } else {
-        new ApplicationWriter(appView, marker).write(executorService, inputApp);
+        ApplicationWriter.create(appView, marker).write(executorService, inputApp);
       }
     } catch (IOException e) {
       throw new RuntimeException("Cannot write application", e);
diff --git a/src/main/java/com/android/tools/r8/bisect/Bisect.java b/src/main/java/com/android/tools/r8/bisect/Bisect.java
index c7547a8..8a196d9 100644
--- a/src/main/java/com/android/tools/r8/bisect/Bisect.java
+++ b/src/main/java/com/android/tools/r8/bisect/Bisect.java
@@ -187,7 +187,7 @@
     StringConsumer proguardMapConsumer = options.proguardMapConsumer;
     AndroidAppConsumers compatSink = new AndroidAppConsumers(options);
     ApplicationWriter writer =
-        new ApplicationWriter(
+        ApplicationWriter.create(
             AppView.createForD8(
                 AppInfo.createInitialAppInfo(app, GlobalSyntheticsStrategy.forNonSynthesizing())),
             null);
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
index 7db4fbd..10acb93 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
@@ -244,19 +244,27 @@
   private AndroidApiLevel validateOrComputeMinApiLevel(
       AndroidApiLevel computedMinApiLevel, DexReader dexReader) {
     DexVersion version = dexReader.getDexVersion();
+    if (!options.testing.dexContainerExperiment
+        && version.getIntValue() == InternalOptions.EXPERIMENTAL_DEX_VERSION) {
+      throwIncompatibleDexVersionAndMinApi(version);
+    }
     if (options.getMinApiLevel() == AndroidApiLevel.getDefault()) {
       computedMinApiLevel = computedMinApiLevel.max(AndroidApiLevel.getMinAndroidApiLevel(version));
     } else if (!version.matchesApiLevel(options.getMinApiLevel())) {
-      throw new CompilationError(
-          "Dex file with version '"
-              + version.getIntValue()
-              + "' cannot be used with min sdk level '"
-              + options.getMinApiLevel()
-              + "'.");
+      throwIncompatibleDexVersionAndMinApi(version);
     }
     return computedMinApiLevel;
   }
 
+  private void throwIncompatibleDexVersionAndMinApi(DexVersion version) {
+    throw new CompilationError(
+        "Dex file with version '"
+            + version.getIntValue()
+            + "' cannot be used with min sdk level '"
+            + options.getMinApiLevel()
+            + "'.");
+  }
+
   private void readProguardMap(
       StringResource map,
       DexApplication.Builder<?> builder,
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
index 96b00bf..5f0d225 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
@@ -95,6 +95,7 @@
 
   public final AppView<?> appView;
   public final InternalOptions options;
+
   private final CodeToKeep desugaredLibraryCodeToKeep;
   private final Predicate<DexType> isTypeMissing;
   private final Optional<Marker> currentMarker;
@@ -174,11 +175,7 @@
     }
   }
 
-  public ApplicationWriter(AppView<?> appView, Marker marker) {
-    this(appView, marker, null);
-  }
-
-  public ApplicationWriter(AppView<?> appView, Marker marker, DexIndexedConsumer consumer) {
+  protected ApplicationWriter(AppView<?> appView, Marker marker, DexIndexedConsumer consumer) {
     this.appView = appView;
     this.options = appView.options();
     this.desugaredLibraryCodeToKeep = CodeToKeep.createCodeToKeep(appView);
@@ -189,10 +186,27 @@
     this.previousMarkers = appView.dexItemFactory().extractMarkers();
   }
 
+  public static ApplicationWriter create(AppView<?> appView, Marker marker) {
+    return ApplicationWriter.create(appView, marker, null);
+  }
+
+  public static ApplicationWriter create(
+      AppView<?> appView, Marker marker, DexIndexedConsumer consumer) {
+    if (appView.options().testing.dexContainerExperiment) {
+      return new ApplicationWriterExperimental(appView, marker, consumer);
+    } else {
+      return new ApplicationWriter(appView, marker, consumer);
+    }
+  }
+
   private NamingLens getNamingLens() {
     return appView.getNamingLens();
   }
 
+  public CodeToKeep getDesugaredLibraryCodeToKeep() {
+    return desugaredLibraryCodeToKeep;
+  }
+
   private List<VirtualFile> distribute(ExecutorService executorService)
       throws ExecutionException, IOException {
     Collection<DexProgramClass> classes = appView.appInfo().classes();
@@ -283,6 +297,52 @@
     write(executorService, null);
   }
 
+  protected Timing rewriteJumboStringsAndComputeDebugRepresentation(
+      VirtualFile virtualFile, List<LazyDexString> lazyDexStrings) {
+    Timing fileTiming = Timing.create("VirtualFile " + virtualFile.getId(), options);
+    computeOffsetMappingAndRewriteJumboStrings(virtualFile, lazyDexStrings, fileTiming);
+    DebugRepresentation.computeForFile(appView, virtualFile);
+    fileTiming.end();
+    return fileTiming;
+  }
+
+  protected Collection<Timing> rewriteJumboStringsAndComputeDebugRepresentation(
+      ExecutorService executorService,
+      List<VirtualFile> virtualFiles,
+      List<LazyDexString> lazyDexStrings)
+      throws ExecutionException {
+    return ThreadUtils.processItemsWithResults(
+        virtualFiles,
+        virtualFile ->
+            rewriteJumboStringsAndComputeDebugRepresentation(virtualFile, lazyDexStrings),
+        executorService);
+  }
+
+  protected void writeVirtualFiles(
+      ExecutorService executorService,
+      List<VirtualFile> virtualFiles,
+      List<DexString> forcedStrings,
+      Timing timing)
+      throws ExecutionException {
+    TimingMerger merger =
+        timing.beginMerger("Write files", ThreadUtils.getNumberOfThreads(executorService));
+    Collection<Timing> timings =
+        ThreadUtils.processItemsWithResults(
+            virtualFiles,
+            virtualFile -> {
+              Timing fileTiming = Timing.create("VirtualFile " + virtualFile.getId(), options);
+              writeVirtualFile(virtualFile, fileTiming, forcedStrings);
+              fileTiming.end();
+              return fileTiming;
+            },
+            executorService);
+    merger.add(timings);
+    merger.end();
+    if (globalsSyntheticsConsumer != null) {
+      globalsSyntheticsConsumer.finished(appView);
+    }
+  }
+
   public void write(ExecutorService executorService, AndroidApp inputApp)
       throws IOException, ExecutionException {
     Timing timing = appView.appInfo().app().timing;
@@ -337,17 +397,8 @@
         TimingMerger merger =
             timing.beginMerger("Pre-write phase", ThreadUtils.getNumberOfThreads(executorService));
         Collection<Timing> timings =
-            ThreadUtils.processItemsWithResults(
-                virtualFiles,
-                virtualFile -> {
-                  Timing fileTiming = Timing.create("VirtualFile " + virtualFile.getId(), options);
-                  computeOffsetMappingAndRewriteJumboStrings(
-                      virtualFile, lazyDexStrings, fileTiming);
-                  DebugRepresentation.computeForFile(appView, virtualFile);
-                  fileTiming.end();
-                  return fileTiming;
-                },
-                executorService);
+            rewriteJumboStringsAndComputeDebugRepresentation(
+                executorService, virtualFiles, lazyDexStrings);
         merger.add(timings);
         merger.end();
       }
@@ -370,26 +421,8 @@
       }
       timing.end();
 
-      {
-        // Write the actual dex code.
-        TimingMerger merger =
-            timing.beginMerger("Write files", ThreadUtils.getNumberOfThreads(executorService));
-        Collection<Timing> timings =
-            ThreadUtils.processItemsWithResults(
-                virtualFiles,
-                virtualFile -> {
-                  Timing fileTiming = Timing.create("VirtualFile " + virtualFile.getId(), options);
-                  writeVirtualFile(virtualFile, fileTiming, forcedStrings);
-                  fileTiming.end();
-                  return fileTiming;
-                },
-                executorService);
-        merger.add(timings);
-        merger.end();
-        if (globalsSyntheticsConsumer != null) {
-          globalsSyntheticsConsumer.finished(appView);
-        }
-      }
+      // Write the actual dex code.
+      writeVirtualFiles(executorService, virtualFiles, forcedStrings, timing);
 
       // A consumer can manage the generated keep rules.
       if (options.desugaredLibraryKeepRuleConsumer != null && !desugaredLibraryCodeToKeep.isNop()) {
@@ -881,7 +914,7 @@
    * <p>If run multiple times on a class, the lowest index that is required to be a JumboString will
    * be used.
    */
-  private void rewriteCodeWithJumboStrings(
+  protected void rewriteCodeWithJumboStrings(
       ObjectToOffsetMapping mapping,
       Collection<DexProgramClass> classes,
       DexApplication application) {
@@ -923,7 +956,7 @@
     // Collect the non-fixed sections.
     timing.time("collect", fileWriter::collect);
     // Generate and write the bytes.
-    return timing.time("generate", fileWriter::generate);
+    return timing.time("generate", () -> fileWriter.generate());
   }
 
   private static String mapMainDexListName(DexType type, NamingLens namingLens) {
@@ -956,7 +989,7 @@
     }
   }
 
-  private void printItemUseInfo(VirtualFile virtualFile) {
+  protected void printItemUseInfo(VirtualFile virtualFile) {
     if (options.testing.calculateItemUseCountInDex) {
       synchronized (System.out) {
         System.out.print("\"Item\"");
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationWriterExperimental.java b/src/main/java/com/android/tools/r8/dex/ApplicationWriterExperimental.java
new file mode 100644
index 0000000..021a904
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationWriterExperimental.java
@@ -0,0 +1,209 @@
+// 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.dex;
+
+import com.android.tools.r8.ByteBufferProvider;
+import com.android.tools.r8.ByteDataView;
+import com.android.tools.r8.DexFilePerClassFileConsumer;
+import com.android.tools.r8.DexIndexedConsumer;
+import com.android.tools.r8.ProgramConsumer;
+import com.android.tools.r8.debuginfo.DebugRepresentation;
+import com.android.tools.r8.dex.FileWriter.ByteBufferResult;
+import com.android.tools.r8.dex.FileWriter.DexContainerSection;
+import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexString;
+import com.android.tools.r8.graph.ObjectToOffsetMapping;
+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.Timing.TimingMerger;
+import com.google.common.collect.Sets;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
+
+class ApplicationWriterExperimental extends ApplicationWriter {
+  protected ApplicationWriterExperimental(
+      AppView<?> appView, Marker marker, DexIndexedConsumer consumer) {
+    super(appView, marker, consumer);
+  }
+
+  @Override
+  protected Collection<Timing> rewriteJumboStringsAndComputeDebugRepresentation(
+      ExecutorService executorService,
+      List<VirtualFile> virtualFiles,
+      List<LazyDexString> lazyDexStrings)
+      throws ExecutionException {
+    // Collect strings from all virtual files into the last DEX section.
+    VirtualFile lastFile = virtualFiles.get(virtualFiles.size() - 1);
+    List<VirtualFile> allExceptLastFile = virtualFiles.subList(0, virtualFiles.size() - 1);
+    for (VirtualFile virtualFile : allExceptLastFile) {
+      lastFile.indexedItems.addStrings(virtualFile.indexedItems.getStrings());
+    }
+    Collection<Timing> timings = new ArrayList<>(virtualFiles.size());
+    // Compute string layout and handle jumbo strings for the last DEX section.
+    timings.add(rewriteJumboStringsAndComputeDebugRepresentation(lastFile, lazyDexStrings));
+    // Handle jumbo strings for the remaining DEX sections using the string ids in the last DEX
+    // section.
+    timings.addAll(
+        ThreadUtils.processItemsWithResults(
+            allExceptLastFile,
+            virtualFile ->
+                rewriteJumboStringsAndComputeDebugRepresentationWithExternalStringIds(
+                    virtualFile, lazyDexStrings, lastFile.getObjectMapping()),
+            executorService));
+    return timings;
+  }
+
+  private Timing rewriteJumboStringsAndComputeDebugRepresentationWithExternalStringIds(
+      VirtualFile virtualFile, List<LazyDexString> lazyDexStrings, ObjectToOffsetMapping mapping) {
+    Timing fileTiming = Timing.create("VirtualFile " + virtualFile.getId(), options);
+    computeOffsetMappingAndRewriteJumboStringsWithExternalStringIds(
+        virtualFile, lazyDexStrings, fileTiming, mapping);
+    DebugRepresentation.computeForFile(appView, virtualFile);
+    fileTiming.end();
+    return fileTiming;
+  }
+
+  private void computeOffsetMappingAndRewriteJumboStringsWithExternalStringIds(
+      VirtualFile virtualFile,
+      List<LazyDexString> lazyDexStrings,
+      Timing timing,
+      ObjectToOffsetMapping mapping) {
+    if (virtualFile.isEmpty()) {
+      return;
+    }
+    timing.begin("Compute object offset mapping");
+    virtualFile.computeMapping(appView, lazyDexStrings.size(), timing, mapping);
+    timing.end();
+    timing.begin("Rewrite jumbo strings");
+    rewriteCodeWithJumboStrings(
+        virtualFile.getObjectMapping(), virtualFile.classes(), appView.appInfo().app());
+    timing.end();
+  }
+
+  @Override
+  protected void writeVirtualFiles(
+      ExecutorService executorService,
+      List<VirtualFile> virtualFiles,
+      List<DexString> forcedStrings,
+      Timing timing)
+      throws ExecutionException {
+    TimingMerger merger =
+        timing.beginMerger("Write files", ThreadUtils.getNumberOfThreads(executorService));
+    Collection<Timing> timings;
+    // TODO(b/249922554): Current limitations for the experimental flag.
+    assert globalsSyntheticsConsumer == null;
+    assert programConsumer == null;
+    virtualFiles.forEach(
+        virtualFile -> {
+          assert virtualFile.getPrimaryClassDescriptor() == null;
+          assert virtualFile.getFeatureSplit() == null;
+        });
+
+    ProgramConsumer consumer = options.getDexIndexedConsumer();
+    ByteBufferProvider byteBufferProvider = options.getDexIndexedConsumer();
+    DexOutputBuffer dexOutputBuffer = new DexOutputBuffer(byteBufferProvider);
+    byte[] tempForAssertions = new byte[] {};
+
+    int offset = 0;
+    timings = new ArrayList<>();
+    List<DexContainerSection> sections = new ArrayList<>();
+
+    // TODO(b/249922554): Write in parallel.
+    for (int i = 0; i < virtualFiles.size(); i++) {
+      VirtualFile virtualFile = virtualFiles.get(i);
+      Timing fileTiming = Timing.create("VirtualFile " + virtualFile.getId(), options);
+      assert forcedStrings.size() == 0;
+      DexContainerSection section =
+          writeVirtualFileSection(
+              virtualFile,
+              fileTiming,
+              forcedStrings,
+              offset,
+              dexOutputBuffer,
+              i == virtualFiles.size() - 1);
+
+      if (InternalOptions.assertionsEnabled()) {
+        // Check that writing did not modify already written sections.
+        byte[] outputSoFar = dexOutputBuffer.asArray();
+        for (int j = 0; j < offset; j++) {
+          assert tempForAssertions[j] == outputSoFar[j];
+        }
+        // Copy written sections including the one just written
+        tempForAssertions = new byte[section.getLayout().getEndOfFile()];
+        for (int j = 0; j < section.getLayout().getEndOfFile(); j++) {
+          tempForAssertions[j] = outputSoFar[j];
+        }
+      }
+
+      offset = section.getLayout().getEndOfFile();
+      sections.add(section);
+      fileTiming.end();
+      timings.add(fileTiming);
+    }
+    merger.add(timings);
+    merger.end();
+
+    ByteBufferResult result =
+        new ByteBufferResult(
+            dexOutputBuffer.stealByteBuffer(),
+            sections.get(sections.size() - 1).getLayout().getEndOfFile());
+    ByteDataView data =
+        new ByteDataView(result.buffer.array(), result.buffer.arrayOffset(), result.length);
+    // TODO(b/249922554): Add timing of passing to consumer.
+    if (consumer instanceof DexFilePerClassFileConsumer) {
+      assert false;
+    } else {
+      ((DexIndexedConsumer) consumer).accept(0, data, Sets.newIdentityHashSet(), options.reporter);
+    }
+  }
+
+  private DexContainerSection writeVirtualFileSection(
+      VirtualFile virtualFile,
+      Timing timing,
+      List<DexString> forcedStrings,
+      int offset,
+      DexOutputBuffer outputBuffer,
+      boolean last) {
+    if (virtualFile.isEmpty()) {
+      return null;
+    }
+    printItemUseInfo(virtualFile);
+
+    timing.begin("Reindex for lazy strings");
+    ObjectToOffsetMapping objectMapping = virtualFile.getObjectMapping();
+    objectMapping.computeAndReindexForLazyDexStrings(forcedStrings);
+    timing.end();
+
+    timing.begin("Write bytes");
+    DexContainerSection section =
+        writeDexFile(objectMapping, outputBuffer, virtualFile, timing, offset, last);
+    timing.end();
+    return section;
+  }
+
+  protected DexContainerSection writeDexFile(
+      ObjectToOffsetMapping objectMapping,
+      DexOutputBuffer dexOutputBuffer,
+      VirtualFile virtualFile,
+      Timing timing,
+      int offset,
+      boolean includeStringData) {
+    FileWriter fileWriter =
+        new FileWriter(
+            appView,
+            dexOutputBuffer,
+            objectMapping,
+            getDesugaredLibraryCodeToKeep(),
+            virtualFile,
+            includeStringData);
+    // Collect the non-fixed sections.
+    timing.time("collect", fileWriter::collect);
+    // Generate and write the bytes.
+    return timing.time("generate", () -> fileWriter.generate(offset));
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/dex/DexOutputBuffer.java b/src/main/java/com/android/tools/r8/dex/DexOutputBuffer.java
index 08f8cad..e552456 100644
--- a/src/main/java/com/android/tools/r8/dex/DexOutputBuffer.java
+++ b/src/main/java/com/android/tools/r8/dex/DexOutputBuffer.java
@@ -39,7 +39,7 @@
     if (byteBuffer.remaining() < bytes) {
       int newSize = byteBuffer.capacity() + Math.max(byteBuffer.capacity(), bytes * 2);
       CompatByteBuffer newBuffer = allocateByteBuffer(newSize);
-      System.arraycopy(byteBuffer.array(), 0, newBuffer.array(), 0, position());
+      System.arraycopy(byteBuffer.array(), 0, newBuffer.array(), 0, byteBuffer.capacity());
       newBuffer.position(byteBuffer.position());
       freeByteBuffer(byteBuffer);
       byteBuffer = newBuffer;
@@ -126,6 +126,14 @@
     byteBuffer.putInt(anInteger);
   }
 
+  public boolean assertZero() {
+    int pos = byteBuffer.position();
+    int i = byteBuffer.getInt();
+    assert i == 0;
+    byteBuffer.position(pos);
+    return true;
+  }
+
   /**
    * Moves the position in the bytebuffer forward until it is aligned.
    *
diff --git a/src/main/java/com/android/tools/r8/dex/FileWriter.java b/src/main/java/com/android/tools/r8/dex/FileWriter.java
index a6f6a52..9ddc2d2 100644
--- a/src/main/java/com/android/tools/r8/dex/FileWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/FileWriter.java
@@ -84,7 +84,7 @@
     public final CompatByteBuffer buffer;
     public final int length;
 
-    private ByteBufferResult(CompatByteBuffer buffer, int length) {
+    protected ByteBufferResult(CompatByteBuffer buffer, int length) {
       this.buffer = buffer;
       this.length = length;
     }
@@ -98,6 +98,7 @@
   private final MixedSectionOffsets mixedSectionOffsets;
   private final CodeToKeep desugaredLibraryCodeToKeep;
   private final VirtualFile virtualFile;
+  private final boolean includeStringData;
 
   public FileWriter(
       AppView<?> appView,
@@ -105,20 +106,41 @@
       ObjectToOffsetMapping mapping,
       CodeToKeep desugaredLibraryCodeToKeep,
       VirtualFile virtualFile) {
+    this(
+        appView,
+        new DexOutputBuffer(provider),
+        mapping,
+        desugaredLibraryCodeToKeep,
+        virtualFile,
+        true);
+  }
+
+  public FileWriter(
+      AppView<?> appView,
+      DexOutputBuffer dexOutputBuffer,
+      ObjectToOffsetMapping mapping,
+      CodeToKeep desugaredLibraryCodeToKeep,
+      VirtualFile virtualFile,
+      boolean includeStringData) {
     this.appView = appView;
     this.graphLens = appView.graphLens();
     this.mapping = mapping;
     this.options = appView.options();
-    this.dest = new DexOutputBuffer(provider);
+    this.dest = dexOutputBuffer;
     this.mixedSectionOffsets = new MixedSectionOffsets(options);
     this.desugaredLibraryCodeToKeep = desugaredLibraryCodeToKeep;
     this.virtualFile = virtualFile;
+    this.includeStringData = includeStringData;
   }
 
   private NamingLens getNamingLens() {
     return appView.getNamingLens();
   }
 
+  public MixedSectionOffsets getMixedSectionOffsets() {
+    return mixedSectionOffsets;
+  }
+
   public static void writeEncodedAnnotation(
       DexEncodedAnnotation annotation, DexOutputBuffer dest, ObjectToOffsetMapping mapping) {
     if (Log.ENABLED) {
@@ -158,14 +180,43 @@
     return this;
   }
 
+  public static class DexContainerSection {
+    private final FileWriter writer;
+    private final DexOutputBuffer buffer;
+    private final Layout layout;
+
+    public DexContainerSection(FileWriter writer, DexOutputBuffer buffer, Layout layout) {
+      this.writer = writer;
+      this.buffer = buffer;
+      this.layout = layout;
+    }
+
+    public FileWriter getFileWriter() {
+      return writer;
+    }
+
+    public DexOutputBuffer getBuffer() {
+      return buffer;
+    }
+
+    public Layout getLayout() {
+      return layout;
+    }
+  }
+
   public ByteBufferResult generate() {
+    DexContainerSection res = generate(0);
+    return new ByteBufferResult(res.getBuffer().stealByteBuffer(), res.getLayout().getEndOfFile());
+  }
+
+  public DexContainerSection generate(int offset) {
     // Check restrictions on interface methods.
     checkInterfaceMethods();
 
     // Check restriction on the names of fields, methods and classes
     assert verifyNames();
 
-    Layout layout = Layout.from(mapping);
+    Layout layout = Layout.from(mapping, offset, includeStringData);
     layout.setCodesOffset(layout.dataSectionOffset);
 
     // Sort the codes first, as their order might impact size due to alignment constraints.
@@ -205,10 +256,14 @@
         mixedSectionLayoutStrategy.getTypeListLayout(),
         layout::alreadySetOffset,
         this::writeTypeList);
-    writeItems(
-        mixedSectionLayoutStrategy.getStringDataLayout(),
-        layout::setStringDataOffsets,
-        this::writeStringData);
+    if (includeStringData) {
+      writeItems(
+          mixedSectionLayoutStrategy.getStringDataLayout(),
+          layout::setStringDataOffsets,
+          this::writeStringData);
+    } else {
+      layout.stringDataOffsets = 0; // Empty string data section.
+    }
     writeItems(
         mixedSectionLayoutStrategy.getAnnotationLayout(),
         layout::setAnnotationsOffset,
@@ -243,8 +298,12 @@
     layout.setEndOfFile(dest.position());
 
     // Now that we have all mixedSectionOffsets, lets write the indexed items.
-    dest.moveTo(Constants.TYPE_HEADER_ITEM_SIZE);
-    writeFixedSectionItems(mapping.getStrings(), layout.stringIdsOffset, this::writeStringItem);
+    dest.moveTo(layout.headerOffset + Constants.TYPE_HEADER_ITEM_SIZE);
+    if (includeStringData) {
+      writeFixedSectionItems(mapping.getStrings(), layout.stringIdsOffset, this::writeStringItem);
+    } else {
+      assert layout.stringIdsOffset == layout.typeIdsOffset;
+    }
     writeFixedSectionItems(mapping.getTypes(), layout.typeIdsOffset, this::writeTypeItem);
     writeFixedSectionItems(mapping.getProtos(), layout.protoIdsOffset, this::writeProtoItem);
     writeFixedSectionItems(mapping.getFields(), layout.fieldIdsOffset, this::writeFieldItem);
@@ -260,7 +319,7 @@
     writeChecksum(layout);
 
     // Wrap backing buffer with actual length.
-    return new ByteBufferResult(dest.stealByteBuffer(), layout.getEndOfFile());
+    return new DexContainerSection(this, dest, layout);
   }
 
   private void checkInterfaceMethods() {
@@ -759,8 +818,11 @@
         mixedSectionOffsets.getDebugInfos().size());
     size += writeMapItem(Constants.TYPE_TYPE_LIST, layout.getTypeListsOffset(),
         mixedSectionOffsets.getTypeLists().size());
-    size += writeMapItem(Constants.TYPE_STRING_DATA_ITEM, layout.getStringDataOffsets(),
-        mixedSectionOffsets.getStringData().size());
+    size +=
+        writeMapItem(
+            Constants.TYPE_STRING_DATA_ITEM,
+            layout.getStringDataOffsets(),
+            layout.getStringDataOffsets() == 0 ? 0 : mixedSectionOffsets.getStringData().size());
     size += writeMapItem(Constants.TYPE_ANNOTATION_ITEM, layout.getAnnotationsOffset(),
         mixedSectionOffsets.getAnnotations().size());
     size += writeMapItem(Constants.TYPE_CLASS_DATA_ITEM, layout.getClassDataOffset(),
@@ -784,16 +846,22 @@
     dest.forward(size * Constants.TYPE_MAP_LIST_ITEM_SIZE);
   }
 
+  private byte[] dexVersionBytes() {
+    if (options.testing.dexContainerExperiment) {
+      return DexVersion.V40.getBytes();
+    }
+    return options.testing.forceDexVersionBytes != null
+        ? options.testing.forceDexVersionBytes
+        : DexVersion.getDexVersion(options.getMinApiLevel()).getBytes();
+  }
+
   private void writeHeader(Layout layout) {
-    dest.moveTo(0);
+    dest.moveTo(layout.headerOffset);
     dest.putBytes(Constants.DEX_FILE_MAGIC_PREFIX);
-    dest.putBytes(
-        options.testing.forceDexVersionBytes != null
-            ? options.testing.forceDexVersionBytes
-            : DexVersion.getDexVersion(options.getMinApiLevel()).getBytes());
+    dest.putBytes(dexVersionBytes());
     dest.putByte(Constants.DEX_FILE_MAGIC_SUFFIX);
     // Leave out checksum and signature for now.
-    dest.moveTo(Constants.FILE_SIZE_OFFSET);
+    dest.moveTo(layout.headerOffset + Constants.FILE_SIZE_OFFSET);
     dest.putInt(layout.getEndOfFile());
     dest.putInt(Constants.TYPE_HEADER_ITEM_SIZE);
     dest.putInt(Constants.ENDIAN_CONSTANT);
@@ -826,9 +894,11 @@
   private void writeSignature(Layout layout) {
     try {
       MessageDigest md = MessageDigest.getInstance("SHA-1");
-      md.update(dest.asArray(), Constants.FILE_SIZE_OFFSET,
-          layout.getEndOfFile() - Constants.FILE_SIZE_OFFSET);
-      md.digest(dest.asArray(), Constants.SIGNATURE_OFFSET, 20);
+      md.update(
+          dest.asArray(),
+          layout.headerOffset + Constants.FILE_SIZE_OFFSET,
+          layout.getEndOfFile() - layout.headerOffset - Constants.FILE_SIZE_OFFSET);
+      md.digest(dest.asArray(), layout.headerOffset + Constants.SIGNATURE_OFFSET, 20);
     } catch (Exception e) {
       throw new RuntimeException(e);
     }
@@ -836,9 +906,11 @@
 
   private void writeChecksum(Layout layout) {
     Adler32 adler = new Adler32();
-    adler.update(dest.asArray(), Constants.SIGNATURE_OFFSET,
-        layout.getEndOfFile() - Constants.SIGNATURE_OFFSET);
-    dest.moveTo(Constants.CHECKSUM_OFFSET);
+    adler.update(
+        dest.asArray(),
+        layout.headerOffset + Constants.SIGNATURE_OFFSET,
+        layout.getEndOfFile() - layout.headerOffset - Constants.SIGNATURE_OFFSET);
+    dest.moveTo(layout.headerOffset + Constants.CHECKSUM_OFFSET);
     dest.putInt((int) adler.getValue());
   }
 
@@ -847,11 +919,12 @@
     return (value + mask) & ~mask;
   }
 
-  private static class Layout {
+  public static class Layout {
 
     private static final int NOT_SET = -1;
 
     // Fixed size constant pool sections
+    final int headerOffset;
     final int stringIdsOffset;
     final int typeIdsOffset;
     final int protoIdsOffset;
@@ -878,6 +951,7 @@
     private int endOfFile = NOT_SET;
 
     private Layout(
+        int headerOffset,
         int stringIdsOffset,
         int typeIdsOffset,
         int protoIdsOffset,
@@ -887,6 +961,7 @@
         int callSiteIdsOffset,
         int methodHandleIdsOffset,
         int dataSectionOffset) {
+      this.headerOffset = headerOffset;
       this.stringIdsOffset = stringIdsOffset;
       this.typeIdsOffset = typeIdsOffset;
       this.protoIdsOffset = protoIdsOffset;
@@ -907,10 +982,17 @@
     }
 
     static Layout from(ObjectToOffsetMapping mapping) {
-      int offset = 0;
+      return from(mapping, 0, true);
+    }
+
+    static Layout from(ObjectToOffsetMapping mapping, int offset, boolean includeStringData) {
       return new Layout(
-          offset = Constants.TYPE_HEADER_ITEM_SIZE,
-          offset += mapping.getStrings().size() * Constants.TYPE_STRING_ID_ITEM_SIZE,
+          offset,
+          offset += Constants.TYPE_HEADER_ITEM_SIZE,
+          offset +=
+              includeStringData
+                  ? mapping.getStrings().size() * Constants.TYPE_STRING_ID_ITEM_SIZE
+                  : 0,
           offset += mapping.getTypes().size() * Constants.TYPE_TYPE_ID_ITEM_SIZE,
           offset += mapping.getProtos().size() * Constants.TYPE_PROTO_ID_ITEM_SIZE,
           offset += mapping.getFields().size() * Constants.TYPE_FIELD_ID_ITEM_SIZE,
@@ -1049,6 +1131,95 @@
     public void setEndOfFile(int endOfFile) {
       this.endOfFile = endOfFile;
     }
+
+    @Override
+    public String toString() {
+      StringBuilder builder = new StringBuilder();
+      if (false) {
+        builder.append("headerOffset: ").append(headerOffset).append("\n");
+        builder.append("stringIdsOffset: ").append(stringIdsOffset).append("\n");
+        builder.append("typeIdsOffset: ").append(typeIdsOffset).append("\n");
+        builder.append("protoIdsOffset: ").append(protoIdsOffset).append("\n");
+        builder.append("fieldIdsOffset: ").append(fieldIdsOffset).append("\n");
+        builder.append("methodIdsOffset: ").append(methodIdsOffset).append("\n");
+        builder.append("classDefsOffset: ").append(classDefsOffset).append("\n");
+        builder.append("callSiteIdsOffset: ").append(callSiteIdsOffset).append("\n");
+        builder.append("methodHandleIdsOffset: ").append(methodHandleIdsOffset).append("\n");
+        builder.append("dataSectionOffset: ").append(dataSectionOffset).append("\n");
+
+        // Mixed size sections
+        builder.append("codesOffset: ").append(codesOffset).append("\n");
+        builder.append("debugInfosOffset: ").append(debugInfosOffset).append("\n");
+
+        builder.append("typeListsOffset: ").append(typeListsOffset).append("\n");
+        builder.append("stringDataOffsets: ").append(stringDataOffsets).append("\n");
+        builder.append("annotationsOffset: ").append(annotationsOffset).append("\n");
+        builder.append("annotationSetsOffset: ").append(annotationSetsOffset).append("\n");
+        builder
+            .append("annotationSetRefListsOffset: ")
+            .append(annotationSetRefListsOffset)
+            .append("\n");
+        builder
+            .append("annotationDirectoriesOffset: ")
+            .append(annotationDirectoriesOffset)
+            .append("\n");
+        builder.append("classDataOffset: ").append(classDataOffset).append("\n");
+        builder.append("encodedArraysOffset: ").append(encodedArraysOffset).append("\n");
+        builder.append("mapOffset: ").append(mapOffset).append("\n");
+        builder.append("endOfFile: ").append(endOfFile).append("\n");
+      } else {
+        builder.append("Header: ").append(stringIdsOffset - headerOffset).append("\n");
+        builder.append("StringIds: ").append(typeIdsOffset - stringIdsOffset).append("\n");
+        builder.append("typeIds: ").append(protoIdsOffset - typeIdsOffset).append("\n");
+        builder.append("protoIds: ").append(fieldIdsOffset - protoIdsOffset).append("\n");
+        builder.append("fieldIds: ").append(methodIdsOffset - fieldIdsOffset).append("\n");
+        builder.append("methodIds: ").append(classDefsOffset - methodIdsOffset).append("\n");
+        builder.append("classDefs: ").append(callSiteIdsOffset - classDefsOffset).append("\n");
+        builder
+            .append("callSiteIds: ")
+            .append(methodHandleIdsOffset - callSiteIdsOffset)
+            .append("\n");
+        builder
+            .append("methodHandleIds: ")
+            .append(dataSectionOffset - methodHandleIdsOffset)
+            .append("\n");
+
+        // Mixed size sections
+        builder.append("code: ").append(debugInfosOffset - codesOffset).append("\n");
+        builder.append("debugInfo: ").append(typeListsOffset - debugInfosOffset).append("\n");
+
+        builder
+            .append("typeList: ")
+            .append(
+                (stringDataOffsets > 0 ? stringDataOffsets : annotationsOffset) - typeListsOffset)
+            .append("\n");
+        builder
+            .append("stringData: ")
+            .append(stringDataOffsets > 0 ? annotationsOffset - stringDataOffsets : 0)
+            .append("\n");
+        builder.append("annotations: ").append(classDataOffset - annotationsOffset).append("\n");
+        builder.append("classData: ").append(encodedArraysOffset - classDataOffset).append("\n");
+        builder
+            .append("encodedArrays: ")
+            .append(mapOffset - annotationSetRefListsOffset)
+            .append("\n");
+        builder
+            .append("annotationSets: ")
+            .append(annotationSetRefListsOffset - annotationSetsOffset)
+            .append("\n");
+        builder
+            .append("annotationSetRefLists: ")
+            .append(annotationDirectoriesOffset - annotationSetRefListsOffset)
+            .append("\n");
+        builder
+            .append("annotationDirectories: ")
+            .append(mapOffset - annotationDirectoriesOffset)
+            .append("\n");
+        builder.append("map: ").append(endOfFile - mapOffset).append("\n");
+        builder.append("endOfFile: ").append(endOfFile).append("\n");
+      }
+      return builder.toString();
+    }
   }
 
   /**
diff --git a/src/main/java/com/android/tools/r8/dex/VirtualFile.java b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
index f6b057a..436f365 100644
--- a/src/main/java/com/android/tools/r8/dex/VirtualFile.java
+++ b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
@@ -203,11 +203,20 @@
       AppView<?> appView,
       int lazyDexStringsCount,
       Timing timing) {
+    computeMapping(appView, lazyDexStringsCount, timing, null);
+  }
+
+  public void computeMapping(
+      AppView<?> appView,
+      int lazyDexStringsCount,
+      Timing timing,
+      ObjectToOffsetMapping sharedMapping) {
     assert transaction.isEmpty();
     assert objectMapping == null;
     objectMapping =
         new ObjectToOffsetMapping(
             appView,
+            sharedMapping,
             transaction.rewriter,
             indexedItems.classes,
             indexedItems.protos,
@@ -663,6 +672,10 @@
       return strings.add(string);
     }
 
+    public boolean addStrings(Collection<DexString> additionalStrings) {
+      return strings.addAll(additionalStrings);
+    }
+
     @Override
     public boolean addProto(DexProto proto) {
       return protos.add(proto);
@@ -691,6 +704,10 @@
     int getNumberOfFields() {
       return fields.size();
     }
+
+    Collection<DexString> getStrings() {
+      return strings;
+    }
   }
 
   public static class IndexedItemTransaction implements IndexedItemCollection {
diff --git a/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java b/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java
index 6173bef..028617e 100644
--- a/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java
+++ b/src/main/java/com/android/tools/r8/graph/ObjectToOffsetMapping.java
@@ -53,6 +53,7 @@
 
   public ObjectToOffsetMapping(
       AppView<?> appView,
+      ObjectToOffsetMapping sharedMapping,
       LensCodeRewriterUtils lensCodeRewriter,
       Collection<DexProgramClass> classes,
       Collection<DexProto> protos,
@@ -80,9 +81,14 @@
     this.initClassLens = appView.initClassLens();
     this.lensCodeRewriter = lensCodeRewriter;
     timing.begin("Sort strings");
-    this.strings =
-        createSortedMap(
-            strings, DexString::compareTo, this::setFirstJumboString, lazyDexStringsCount);
+    if (sharedMapping == null) {
+      this.strings =
+          createSortedMap(
+              strings, DexString::compareTo, this::setFirstJumboString, lazyDexStringsCount);
+    } else {
+      this.strings = sharedMapping.strings;
+      this.firstJumboString = sharedMapping.firstJumboString;
+    }
     CompareToVisitor visitor =
         new CompareToVisitorWithStringTable(namingLens, this.strings::getInt);
     timing.end();
diff --git a/src/main/java/com/android/tools/r8/naming/ClassNaming.java b/src/main/java/com/android/tools/r8/naming/ClassNaming.java
index 6083e8b..138e738 100644
--- a/src/main/java/com/android/tools/r8/naming/ClassNaming.java
+++ b/src/main/java/com/android/tools/r8/naming/ClassNaming.java
@@ -18,7 +18,7 @@
 
   abstract class Builder {
 
-    public abstract Builder addMemberEntry(MemberNaming entry, Signature residualSignature);
+    public abstract Builder addMemberEntry(MemberNaming entry);
 
     public abstract ClassNaming build();
 
diff --git a/src/main/java/com/android/tools/r8/naming/ClassNamingForMapApplier.java b/src/main/java/com/android/tools/r8/naming/ClassNamingForMapApplier.java
index 93a5666..cbfb5e3 100644
--- a/src/main/java/com/android/tools/r8/naming/ClassNamingForMapApplier.java
+++ b/src/main/java/com/android/tools/r8/naming/ClassNamingForMapApplier.java
@@ -19,6 +19,7 @@
 import com.google.common.collect.ImmutableMap;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -55,7 +56,7 @@
     }
 
     @Override
-    public ClassNaming.Builder addMemberEntry(MemberNaming entry, Signature residualSignature) {
+    public ClassNaming.Builder addMemberEntry(MemberNaming entry) {
       // Unlike {@link ClassNamingForNameMapper.Builder#addMemberEntry},
       // the key is original signature.
       if (entry.isMethodNaming()) {
@@ -170,32 +171,26 @@
   public MemberNaming lookup(Signature renamedSignature) {
     // As the key is inverted, this looks a lot like
     //   {@link ClassNamingForNameMapper#lookupByOriginalSignature}.
-    if (renamedSignature.kind() == SignatureKind.METHOD) {
-      for (MemberNaming memberNaming : methodMembers.values()) {
-        if (memberNaming.getResidualSignatureInternal().equals(renamedSignature)) {
-          return memberNaming;
-        }
+    Collection<MemberNaming> memberNamings =
+        renamedSignature.kind() == SignatureKind.METHOD
+            ? methodMembers.values()
+            : fieldMembers.values();
+    for (MemberNaming memberNaming : memberNamings) {
+      if (memberNaming.getResidualSignature().equals(renamedSignature)) {
+        return memberNaming;
       }
-      return null;
-    } else {
-      assert renamedSignature.kind() == SignatureKind.FIELD;
-      for (MemberNaming memberNaming : fieldMembers.values()) {
-        if (memberNaming.getResidualSignatureInternal().equals(renamedSignature)) {
-          return memberNaming;
-        }
-      }
-      return null;
     }
+    return null;
   }
 
   @Override
   public MemberNaming lookupByOriginalSignature(Signature original) {
     // As the key is inverted, this looks a lot like {@link ClassNamingForNameMapper#lookup}.
     if (original.kind() == SignatureKind.METHOD) {
-      return methodMembers.get(original);
+      return methodMembers.get(original.asMethodSignature());
     } else {
       assert original.kind() == SignatureKind.FIELD;
-      return fieldMembers.get(original);
+      return fieldMembers.get(original.asFieldSignature());
     }
   }
 
diff --git a/src/main/java/com/android/tools/r8/naming/ClassNamingForNameMapper.java b/src/main/java/com/android/tools/r8/naming/ClassNamingForNameMapper.java
index 8fb8ae6..0f09fdf 100644
--- a/src/main/java/com/android/tools/r8/naming/ClassNamingForNameMapper.java
+++ b/src/main/java/com/android/tools/r8/naming/ClassNamingForNameMapper.java
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.naming;
 
+import static com.android.tools.r8.naming.MappedRangeUtils.addAllInlineFramesUntilOutermostCaller;
+
 import com.android.tools.r8.naming.MemberNaming.FieldSignature;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.naming.MemberNaming.Signature;
@@ -11,9 +13,11 @@
 import com.android.tools.r8.naming.mappinginformation.OutlineCallsiteMappingInformation;
 import com.android.tools.r8.naming.mappinginformation.RewriteFrameMappingInformation;
 import com.android.tools.r8.utils.ChainableStringConsumer;
+import com.android.tools.r8.utils.ListUtils;
 import com.android.tools.r8.utils.ThrowingConsumer;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
 import com.google.common.collect.Maps;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -59,11 +63,11 @@
     }
 
     @Override
-    public ClassNaming.Builder addMemberEntry(MemberNaming entry, Signature residualSignature) {
+    public ClassNaming.Builder addMemberEntry(MemberNaming entry) {
       if (entry.isMethodNaming()) {
-        methodMembers.put(residualSignature.asMethodSignature(), entry);
+        methodMembers.put(entry.getResidualSignature().asMethodSignature(), entry);
       } else {
-        fieldMembers.put(residualSignature.asFieldSignature(), entry);
+        fieldMembers.put(entry.getResidualSignature().asFieldSignature(), entry);
         mappedFieldNamingsByName
             .computeIfAbsent(entry.getRenamedName(), ignored -> new ArrayList<>())
             .add(entry);
@@ -218,6 +222,48 @@
     public int hashCode() {
       return mappedRanges.hashCode();
     }
+
+    public List<MappedRangesOfName> partitionOnMethodSignature() {
+      if (mappedRanges.size() <= 1) {
+        return Collections.singletonList(this);
+      }
+      List<MappedRangesOfName> partitionedMappings = new ArrayList<>();
+      int index = 0;
+      List<MappedRange> currentMappedRanges = new ArrayList<>();
+      index = addAllInlineFramesUntilOutermostCaller(mappedRanges, index, currentMappedRanges);
+      // Do a fast check to see if the last one is the same signature as the first one.
+      if (ListUtils.last(currentMappedRanges)
+          .getOriginalSignature()
+          .equals(ListUtils.last(mappedRanges).getOriginalSignature())) {
+        return Collections.singletonList(this);
+      }
+      // Otherwise the signature changes which means we have overloads.
+      while (index < mappedRanges.size()) {
+        List<MappedRange> newMappedRanges = new ArrayList<>();
+        index = addAllInlineFramesUntilOutermostCaller(mappedRanges, index, newMappedRanges);
+        if (!ListUtils.last(currentMappedRanges)
+            .getOriginalSignature()
+            .equals(ListUtils.last(newMappedRanges).getOriginalSignature())) {
+          partitionedMappings.add(new MappedRangesOfName(currentMappedRanges));
+          currentMappedRanges = new ArrayList<>();
+        }
+        currentMappedRanges.addAll(newMappedRanges);
+      }
+      partitionedMappings.add(new MappedRangesOfName(currentMappedRanges));
+      return partitionedMappings;
+    }
+
+    public MemberNaming getMemberNaming(
+        ClassNamingForNameMapper classNamingForNameMapper, boolean hasMultipleResults) {
+      MappedRange lastMappedRange = ListUtils.last(mappedRanges);
+      if (hasMultipleResults) {
+        return null;
+      }
+      MethodSignature signature = lastMappedRange.getResidualSignature();
+      MemberNaming memberNaming = classNamingForNameMapper.methodMembers.get(signature);
+      assert memberNaming != null;
+      return memberNaming;
+    }
   }
 
   static Builder builder(
@@ -425,7 +471,7 @@
     mappedRangesSorted.sort(Comparator.comparingInt(range -> range.sequenceNumber));
     for (MappedRange range : mappedRangesSorted) {
       consumer.accept("    ").accept(range.toString()).accept("\n");
-      for (MappingInformation info : range.additionalMappingInfo) {
+      for (MappingInformation info : range.getAdditionalMappingInformation()) {
         consumer.accept("      # ").accept(info.serialize()).accept("\n");
       }
     }
@@ -499,13 +545,19 @@
 
     private MethodSignature residualSignature = null;
 
+    private boolean hasComputedHashCode = false;
+
     /**
      * The sole purpose of {@link #sequenceNumber} is to preserve the order of members read from a
      * Proguard-map.
      */
     private final int sequenceNumber = getNextSequenceNumber();
 
-    private List<MappingInformation> additionalMappingInfo = EMPTY_MAPPING_INFORMATION;
+    /**
+     * We never emit member namings for methods so mapped ranges has to account for both positional
+     * and referential mapping information.
+     */
+    private List<MappingInformation> additionalMappingInformation = EMPTY_MAPPING_INFORMATION;
 
     MappedRange(
         Range minifiedRange, MethodSignature signature, Range originalRange, String renamedName) {
@@ -522,40 +574,17 @@
 
     public void addMappingInformation(
         MappingInformation info, Consumer<MappingInformation> onProhibitedAddition) {
-      if (additionalMappingInfo == EMPTY_MAPPING_INFORMATION) {
-        additionalMappingInfo = new ArrayList<>();
+      if (additionalMappingInformation == EMPTY_MAPPING_INFORMATION) {
+        additionalMappingInformation = new ArrayList<>();
       }
-      for (MappingInformation existing : additionalMappingInfo) {
-        if (!existing.allowOther(info)) {
-          onProhibitedAddition.accept(existing);
-          return;
-        }
-      }
-      additionalMappingInfo.add(info);
+      MappingInformation.addMappingInformation(
+          additionalMappingInformation, info, onProhibitedAddition);
     }
 
-    public boolean isCompilerSynthesized() {
-      for (MappingInformation info : additionalMappingInfo) {
-        if (info.isCompilerSynthesizedMappingInformation() || info.isOutlineMappingInformation()) {
-          return true;
-        }
-      }
-      return false;
-    }
-
-    public boolean isOutlineFrame() {
-      for (MappingInformation info : additionalMappingInfo) {
-        if (info.isOutlineMappingInformation()) {
-          return true;
-        }
-      }
-      return false;
-    }
-
-    public <T> List<T> filter(
+    private <T> List<T> filter(
         Predicate<MappingInformation> predicate, Function<MappingInformation, T> mapper) {
       ImmutableList.Builder<T> builder = ImmutableList.builder();
-      for (MappingInformation mappingInformation : additionalMappingInfo) {
+      for (MappingInformation mappingInformation : additionalMappingInformation) {
         if (predicate.test(mappingInformation)) {
           builder.add(mapper.apply(mappingInformation));
         }
@@ -607,20 +636,41 @@
       return signature;
     }
 
-    @Override
-    public boolean hasResidualSignature() {
-      return residualSignature != null;
+    public boolean isCompilerSynthesized() {
+      for (MappingInformation info : additionalMappingInformation) {
+        if (info.isCompilerSynthesizedMappingInformation() || info.isOutlineMappingInformation()) {
+          return true;
+        }
+      }
+      return false;
+    }
+
+    public boolean isOutlineFrame() {
+      for (MappingInformation info : additionalMappingInformation) {
+        if (info.isOutlineMappingInformation()) {
+          return true;
+        }
+      }
+      return false;
     }
 
     @Override
-    public MethodSignature getResidualSignatureInternal() {
-      return residualSignature;
+    public boolean hasResidualSignatureMappingInformation() {
+      return Iterables.any(
+          additionalMappingInformation, MappingInformation::isResidualSignatureMappingInformation);
+    }
+
+    public void setResidualSignatureInternal(MethodSignature signature) {
+      assert !hasComputedHashCode;
+      this.residualSignature = signature;
     }
 
     @Override
-    public void setResidualSignatureInternal(Signature residualSignature) {
-      assert residualSignature.isMethodSignature();
-      this.residualSignature = residualSignature.asMethodSignature();
+    public MethodSignature getResidualSignature() {
+      if (residualSignature != null) {
+        return residualSignature;
+      }
+      return signature.asRenamed(renamedName).asMethodSignature();
     }
 
     public int getLastPositionOfOriginalRange() {
@@ -662,7 +712,8 @@
           && Objects.equals(originalRange, that.originalRange)
           && signature.equals(that.signature)
           && renamedName.equals(that.renamedName)
-          && Objects.equals(residualSignature, that.residualSignature);
+          && Objects.equals(residualSignature, that.residualSignature)
+          && Objects.equals(additionalMappingInformation, that.additionalMappingInformation);
     }
 
     @Override
@@ -673,11 +724,13 @@
       result = 31 * result + signature.hashCode();
       result = 31 * result + renamedName.hashCode();
       result = 31 * result + Objects.hashCode(residualSignature);
+      result = 31 * result + Objects.hashCode(additionalMappingInformation);
+      hasComputedHashCode = true;
       return result;
     }
 
-    public List<MappingInformation> getAdditionalMappingInfo() {
-      return Collections.unmodifiableList(additionalMappingInfo);
+    public List<MappingInformation> getAdditionalMappingInformation() {
+      return Collections.unmodifiableList(additionalMappingInformation);
     }
   }
 }
diff --git a/src/main/java/com/android/tools/r8/naming/ComposingBuilder.java b/src/main/java/com/android/tools/r8/naming/ComposingBuilder.java
index 5b3e838..cc7f927 100644
--- a/src/main/java/com/android/tools/r8/naming/ComposingBuilder.java
+++ b/src/main/java/com/android/tools/r8/naming/ComposingBuilder.java
@@ -4,6 +4,8 @@
 
 package com.android.tools.r8.naming;
 
+import static com.android.tools.r8.naming.MappedRangeUtils.addAllInlineFramesUntilOutermostCaller;
+import static com.android.tools.r8.naming.MappedRangeUtils.isInlineMappedRange;
 import static com.android.tools.r8.utils.FunctionUtils.ignoreArgument;
 
 import com.android.tools.r8.naming.ClassNamingForNameMapper.MappedRange;
@@ -595,7 +597,8 @@
         // Register mapping information that is dependent on the residual naming to allow updating
         // later on.
         for (MappedRange mappedRange : mappedRangesForThisInterval) {
-          for (MappingInformation mappingInformation : mappedRange.getAdditionalMappingInfo()) {
+          for (MappingInformation mappingInformation :
+              mappedRange.getAdditionalMappingInformation()) {
             if (mappingInformation.isRewriteFrameMappingInformation()) {
               RewriteFrameMappingInformation rewriteFrameMappingInformation =
                   mappingInformation.asRewriteFrameMappingInformation();
@@ -631,16 +634,6 @@
           seenMappedRanges);
     }
 
-    private int addAllInlineFramesUntilOutermostCaller(
-        List<MappedRange> mappedRanges, int index, List<MappedRange> seenMappedRanges) {
-      assert index < mappedRanges.size();
-      while (isInlineMappedRange(mappedRanges, index)) {
-        seenMappedRanges.add(mappedRanges.get(index++));
-      }
-      seenMappedRanges.add(mappedRanges.get(index++));
-      return index;
-    }
-
     private List<MappedRange> composeMappedRangesForMethod(
         List<MappedRange> existingRanges, List<MappedRange> newRanges)
         throws MappingComposeException {
@@ -687,8 +680,8 @@
               new MappedRange(
                   null, lastExistingRange.signature, originalRange.get(), newRange.renamedName);
           composeMappingInformation(
-              newComposedRange.getAdditionalMappingInfo(),
-              lastExistingRange.getAdditionalMappingInfo(),
+              newComposedRange.getAdditionalMappingInformation(),
+              lastExistingRange.getAdditionalMappingInformation(),
               info -> newComposedRange.addMappingInformation(info, ConsumerUtils.emptyConsumer()));
           newComposedRanges.add(newComposedRange);
         } else {
@@ -789,7 +782,7 @@
                           newOriginalRange,
                           lastExistingMappedRange.renamedName);
                   nonExistingMappedRange.setResidualSignatureInternal(
-                      lastExistingRange.getResidualSignatureInternal());
+                      lastExistingRange.getResidualSignature());
                   lastExistingMappedRange = nonExistingMappedRange;
                   existingMappedRanges = Collections.singletonList(nonExistingMappedRange);
                   position += (endOriginalPosition - startOriginalPosition) - 1;
@@ -938,7 +931,7 @@
                 newMappedRange.renamedName);
         List<MappingInformation> mappingInformationToCompose = new ArrayList<>();
         existingMappedRange
-            .getAdditionalMappingInfo()
+            .getAdditionalMappingInformation()
             .forEach(
                 info -> {
                   if (info.isOutlineMappingInformation()) {
@@ -952,7 +945,7 @@
                   }
                 });
         composeMappingInformation(
-            computedRange.getAdditionalMappingInfo(),
+            computedRange.getAdditionalMappingInformation(),
             mappingInformationToCompose,
             info -> computedRange.addMappingInformation(info, ConsumerUtils.emptyConsumer()));
         newComposedRanges.add(computedRange);
@@ -989,16 +982,6 @@
           });
     }
 
-    private boolean isInlineMappedRange(List<MappedRange> mappedRanges, int index) {
-      // We are comparing against the next entry so we need a buffer of one.
-      if (index + 1 >= mappedRanges.size()) {
-        return false;
-      }
-      MappedRange mappedRange = mappedRanges.get(index);
-      return mappedRange.minifiedRange != null
-          && mappedRange.minifiedRange.equals(mappedRanges.get(index + 1).minifiedRange);
-    }
-
     public void write(ChainableStringConsumer consumer) {
       consumer.accept(originalName).accept(" -> ").accept(renamedName).accept(":\n");
       additionalMappingInfo.forEach(info -> consumer.accept("# " + info.serialize()).accept("\n"));
@@ -1018,7 +1001,7 @@
       methodsWithoutPosition.forEach(
           (ignored, mapped) -> {
             consumer.accept(INDENTATION).accept(mapped.toString()).accept("\n");
-            for (MappingInformation info : mapped.getAdditionalMappingInfo()) {
+            for (MappingInformation info : mapped.getAdditionalMappingInformation()) {
               consumer.accept(INDENTATION).accept("# ").accept(info.serialize()).accept("\n");
             }
           });
@@ -1043,7 +1026,7 @@
             .forEach(
                 mappedRange -> {
                   consumer.accept(INDENTATION).accept(mappedRange.toString()).accept("\n");
-                  for (MappingInformation info : mappedRange.getAdditionalMappingInfo()) {
+                  for (MappingInformation info : mappedRange.getAdditionalMappingInformation()) {
                     consumer.accept(INDENTATION).accept("# ").accept(info.serialize()).accept("\n");
                   }
                 });
diff --git a/src/main/java/com/android/tools/r8/naming/MappedRangeUtils.java b/src/main/java/com/android/tools/r8/naming/MappedRangeUtils.java
new file mode 100644
index 0000000..7dff280
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/naming/MappedRangeUtils.java
@@ -0,0 +1,31 @@
+// 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;
+
+import com.android.tools.r8.naming.ClassNamingForNameMapper.MappedRange;
+import java.util.List;
+
+public class MappedRangeUtils {
+
+  static int addAllInlineFramesUntilOutermostCaller(
+      List<MappedRange> mappedRanges, int index, List<MappedRange> listToAdd) {
+    assert index < mappedRanges.size();
+    while (isInlineMappedRange(mappedRanges, index)) {
+      listToAdd.add(mappedRanges.get(index++));
+    }
+    listToAdd.add(mappedRanges.get(index++));
+    return index;
+  }
+
+  static boolean isInlineMappedRange(List<MappedRange> mappedRanges, int index) {
+    // We are comparing against the next entry so we need a buffer of one.
+    if (index + 1 >= mappedRanges.size()) {
+      return false;
+    }
+    MappedRange mappedRange = mappedRanges.get(index);
+    return mappedRange.minifiedRange != null
+        && mappedRange.minifiedRange.equals(mappedRanges.get(index + 1).minifiedRange);
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/naming/MappingWithResidualInfo.java b/src/main/java/com/android/tools/r8/naming/MappingWithResidualInfo.java
index 7e7bcd0..77e145b 100644
--- a/src/main/java/com/android/tools/r8/naming/MappingWithResidualInfo.java
+++ b/src/main/java/com/android/tools/r8/naming/MappingWithResidualInfo.java
@@ -13,19 +13,16 @@
 
   Signature getOriginalSignature();
 
-  boolean hasResidualSignature();
+  boolean hasResidualSignatureMappingInformation();
 
-  Signature getResidualSignatureInternal();
+  Signature getResidualSignature();
 
-  void setResidualSignatureInternal(Signature signature);
-
+  /** Should be removed when R8 emits residual information for alpha renamed signatures. */
+  @Deprecated()
   default Signature computeResidualSignature(Function<String, String> typeNameMapper) {
-    if (hasResidualSignature()) {
-      return getResidualSignatureInternal();
+    if (hasResidualSignatureMappingInformation()) {
+      return getResidualSignature();
     }
-    Signature residualSignature =
-        getOriginalSignature().computeResidualSignature(getRenamedName(), typeNameMapper);
-    setResidualSignatureInternal(residualSignature);
-    return residualSignature;
+    return getOriginalSignature().computeResidualSignature(getRenamedName(), typeNameMapper);
   }
 }
diff --git a/src/main/java/com/android/tools/r8/naming/MemberNaming.java b/src/main/java/com/android/tools/r8/naming/MemberNaming.java
index 043bb4c..12606ff 100644
--- a/src/main/java/com/android/tools/r8/naming/MemberNaming.java
+++ b/src/main/java/com/android/tools/r8/naming/MemberNaming.java
@@ -13,6 +13,8 @@
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.naming.MemberNaming.Signature.SignatureKind;
+import com.android.tools.r8.naming.mappinginformation.MappingInformation;
+import com.android.tools.r8.naming.mappinginformation.MappingInformation.ReferentialMappingInformation;
 import com.android.tools.r8.position.Position;
 import com.android.tools.r8.references.FieldReference;
 import com.android.tools.r8.references.MethodReference;
@@ -21,12 +23,16 @@
 import com.android.tools.r8.utils.CollectionUtils;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.StringUtils;
+import com.google.common.collect.Iterables;
 import java.io.IOException;
 import java.io.StringWriter;
 import java.io.Writer;
+import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Objects;
+import java.util.Collections;
+import java.util.List;
+import java.util.function.Consumer;
 import java.util.function.Function;
 import org.objectweb.asm.Type;
 
@@ -37,6 +43,9 @@
  */
 public class MemberNaming implements MappingWithResidualInfo {
 
+  private static final List<ReferentialMappingInformation> EMPTY_MAPPING_INFORMATION =
+      Collections.emptyList();
+
   @Override
   public boolean equals(Object o) {
     if (this == o) {
@@ -45,55 +54,41 @@
     if (!(o instanceof MemberNaming)) {
       return false;
     }
-
     MemberNaming that = (MemberNaming) o;
-    return signature.equals(that.signature)
-        && renamedName.equals(that.renamedName)
-        && Objects.equals(residualSignature, that.residualSignature);
+    return signature.equals(that.signature) && residualSignature.equals(that.residualSignature);
   }
 
   @Override
   public int hashCode() {
     int result = signature.hashCode();
-    result = 31 * result + renamedName.hashCode();
-    result = 31 * result + Objects.hashCode(residualSignature);
+    result = 31 * result + residualSignature.hashCode();
     return result;
   }
 
   /** Original signature of the member. */
   private final Signature signature;
   /** Residual signature where types and names could be changed. */
-  private Signature residualSignature = null;
-  /**
-   * Renamed name in the mapping file. This value will always be present even if the residual
-   * signature is not.
-   */
-  private final String renamedName;
+  private final Signature residualSignature;
   /** Position of the member in the file. */
   private final Position position;
 
-  public MemberNaming(Signature signature, String renamedName) {
-    this(signature, renamedName, Position.UNKNOWN);
-  }
+  private List<ReferentialMappingInformation> additionalMappingInformation =
+      EMPTY_MAPPING_INFORMATION;
 
   public MemberNaming(Signature signature, Signature residualSignature) {
-    this(signature, residualSignature.getName(), Position.UNKNOWN);
-    this.residualSignature = residualSignature;
+    this(signature, residualSignature, Position.UNKNOWN);
   }
 
-  public MemberNaming(Signature signature, String renamedName, Position position) {
+  public MemberNaming(Signature signature, Signature residualSignature, Position position) {
     this.signature = signature;
-    this.renamedName = renamedName;
+    this.residualSignature = residualSignature;
     this.position = position;
   }
 
   /** This is used internally in google3. */
   @Deprecated
   public Signature getRenamedSignature() {
-    if (residualSignature != null) {
-      return residualSignature;
-    }
-    return getOriginalSignature().asRenamed(renamedName);
+    return residualSignature;
   }
 
   @Override
@@ -106,13 +101,14 @@
   }
 
   @Override
-  public boolean hasResidualSignature() {
-    return residualSignature != null;
+  public boolean hasResidualSignatureMappingInformation() {
+    return Iterables.any(
+        additionalMappingInformation, MappingInformation::isResidualSignatureMappingInformation);
   }
 
   @Override
   public String getRenamedName() {
-    return renamedName;
+    return residualSignature.getName();
   }
 
   public boolean isMethodNaming() {
@@ -129,17 +125,50 @@
 
   @Override
   public String toString() {
-    return signature.toString() + " -> " + renamedName;
+    return signature.toString() + " -> " + residualSignature.getName();
   }
 
   @Override
-  public Signature getResidualSignatureInternal() {
+  public Signature getResidualSignature() {
     return residualSignature;
   }
 
-  @Override
-  public void setResidualSignatureInternal(Signature signature) {
-    this.residualSignature = signature;
+  public void addMappingInformation(
+      ReferentialMappingInformation info, Consumer<MappingInformation> onProhibitedAddition) {
+    if (additionalMappingInformation == EMPTY_MAPPING_INFORMATION) {
+      additionalMappingInformation = new ArrayList<>();
+    }
+    MappingInformation.addMappingInformation(
+        additionalMappingInformation, info, onProhibitedAddition);
+  }
+
+  void addAllMappingInformationInternal(List<ReferentialMappingInformation> otherInfo) {
+    if (additionalMappingInformation == EMPTY_MAPPING_INFORMATION) {
+      additionalMappingInformation = new ArrayList<>();
+    }
+    additionalMappingInformation.addAll(otherInfo);
+  }
+
+  public boolean isCompilerSynthesized() {
+    for (MappingInformation info : additionalMappingInformation) {
+      if (info.isCompilerSynthesizedMappingInformation() || info.isOutlineMappingInformation()) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  public boolean isOutlineFrame() {
+    for (MappingInformation info : additionalMappingInformation) {
+      if (info.isOutlineMappingInformation()) {
+        return true;
+      }
+    }
+    return false;
+  }
+
+  public List<ReferentialMappingInformation> getAdditionalMappingInformation() {
+    return additionalMappingInformation;
   }
 
   public abstract static class Signature {
diff --git a/src/main/java/com/android/tools/r8/naming/ProguardMapReader.java b/src/main/java/com/android/tools/r8/naming/ProguardMapReader.java
index 80cc8e6..cd8bd3f 100644
--- a/src/main/java/com/android/tools/r8/naming/ProguardMapReader.java
+++ b/src/main/java/com/android/tools/r8/naming/ProguardMapReader.java
@@ -12,11 +12,15 @@
 import com.android.tools.r8.naming.PositionRangeAllocator.NonCardinalPositionRangeAllocator;
 import com.android.tools.r8.naming.mappinginformation.MapVersionMappingInformation;
 import com.android.tools.r8.naming.mappinginformation.MappingInformation;
+import com.android.tools.r8.naming.mappinginformation.MappingInformation.ReferentialMappingInformation;
 import com.android.tools.r8.naming.mappinginformation.MappingInformationDiagnostics;
+import com.android.tools.r8.naming.mappinginformation.ResidualSignatureMappingInformation;
+import com.android.tools.r8.naming.mappinginformation.ResidualSignatureMappingInformation.ResidualFieldSignatureMappingInformation;
 import com.android.tools.r8.naming.mappinginformation.ResidualSignatureMappingInformation.ResidualMethodSignatureMappingInformation;
 import com.android.tools.r8.position.Position;
 import com.android.tools.r8.utils.ArrayUtils;
 import com.android.tools.r8.utils.BooleanBox;
+import com.android.tools.r8.utils.Box;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.IdentifierUtils;
 import com.android.tools.r8.utils.StringUtils;
@@ -334,14 +338,20 @@
   private void parseMemberMappings(
       ProguardMap.Builder mapBuilder, ClassNaming.Builder classNamingBuilder) throws IOException {
     MemberNaming lastAddedNaming = null;
-    MemberNaming activeMemberNaming = null;
+    // To ensure we only commit a member if we have the residual signature, we delay creating the
+    // object and have the variables out here.
+    Signature previousOriginalSignature = null;
+    String previousRenamedName = null;
+    int previousLineNumber = -1;
+    Range previousRange = null;
+    Box<Signature> currentResidualSignature = new Box<>();
+    Box<List<ReferentialMappingInformation>> currentMappingInfoForMemberNaming = new Box<>();
     MappedRange activeMappedRange = null;
-    Range previousMappedRange = null;
     do {
       Range originalRange = null;
       // Try to parse any information added in comments above member namings
       if (isCommentLineWithJsonBrace()) {
-        final MemberNaming currentMember = activeMemberNaming;
+        final String currentRenamedNameFinal = previousRenamedName;
         final MappedRange currentRange = activeMappedRange;
         // Reading global info should cause member mapping to return since we are now reading
         // headers pertaining to what could be a concatinated file.
@@ -349,38 +359,44 @@
         parseMappingInformation(
             info -> {
               readGlobalInfo.set(info.isGlobalMappingInformation());
-              // TODO(b/242673239): Support additional information for fields.
-              if (currentMember == null) {
+              if (currentRenamedNameFinal == null) {
                 classNamingBuilder.addMappingInformation(
                     info,
                     conflictingInfo ->
                         diagnosticsHandler.warning(
                             MappingInformationDiagnostics.notAllowedCombination(
                                 info, conflictingInfo, lineNo)));
-              } else if (currentRange != null) {
+                return;
+              }
+              // Always add information to the current range, this will ensure that additional
+              // information is always placed the same place.
+              if (currentRange != null) {
                 currentRange.addMappingInformation(
                     info,
                     conflictingInfo ->
                         diagnosticsHandler.warning(
                             MappingInformationDiagnostics.notAllowedCombination(
                                 info, conflictingInfo, lineNo)));
-                if (info.isResidualMethodSignatureMappingInformation()) {
-                  ResidualMethodSignatureMappingInformation residualSignatureInfo =
-                      info.asResidualMethodSignatureMappingInformation();
-                  MethodSignature residualSignature =
-                      new MethodSignature(
-                          currentMember.getRenamedName(),
-                          DescriptorUtils.descriptorToJavaType(
-                              residualSignatureInfo.getReturnType()),
-                          ArrayUtils.mapToStringArray(
-                              residualSignatureInfo.getParameters(),
-                              DescriptorUtils::descriptorToJavaType));
-                  residualSignature =
-                      signatureCache
-                          .computeIfAbsent(residualSignature, Function.identity())
-                          .asMethodSignature();
-                  currentMember.setResidualSignatureInternal(residualSignature);
-                  currentRange.setResidualSignatureInternal(residualSignature);
+              }
+              if (info.isReferentialMappingInformation()) {
+                ReferentialMappingInformation referentialMappingInformation =
+                    info.asReferentialMappingInformation();
+                MappingInformation.addMappingInformation(
+                    currentMappingInfoForMemberNaming.computeIfAbsent(ArrayList::new),
+                    referentialMappingInformation,
+                    conflictingInfo ->
+                        diagnosticsHandler.warning(
+                            MappingInformationDiagnostics.notAllowedCombination(
+                                info, conflictingInfo, lineNo)));
+                if (info.isResidualSignatureMappingInformation()) {
+                  Signature residualSignature =
+                      getResidualSignatureFromMappingInformation(
+                          info.asResidualSignatureMappingInformation(), currentRenamedNameFinal);
+                  currentResidualSignature.set(residualSignature);
+                  if (currentRange != null) {
+                    currentRange.setResidualSignatureInternal(
+                        residualSignature.asMethodSignature());
+                  }
                 }
               }
             });
@@ -431,7 +447,7 @@
         if (activeMappedRange != null
             && activeMappedRange.signature == signature
             && activeMappedRange.renamedName.equals(renamedName)) {
-          residualSignature = activeMappedRange.getResidualSignatureInternal();
+          residualSignature = activeMappedRange.getResidualSignature();
         }
         activeMappedRange =
             classNamingBuilder.addMappedRange(
@@ -442,51 +458,114 @@
       }
 
       assert mappedRange == null || signature.isMethodSignature();
-
-      // If this line refers to a member that should be added to classNamingBuilder (as opposed to
-      // an inner inlined callee) and it's different from the the previous activeMemberNaming, then
-      // flush (add) the current activeMemberNaming.
-      if (activeMemberNaming != null) {
-        boolean changedName = !activeMemberNaming.getRenamedName().equals(renamedName);
-        boolean changedMappedRange = !Objects.equals(previousMappedRange, mappedRange);
+      if (previousOriginalSignature != null) {
+        boolean changedName = !previousRenamedName.equals(renamedName);
+        boolean changedMappedRange =
+            previousRange == null || !Objects.equals(previousRange, mappedRange);
         boolean originalRangeChange = originalRange == null || !originalRange.isCardinal;
-        if (changedName
-            || previousMappedRange == null
-            || changedMappedRange
-            || originalRangeChange) {
-          if (lastAddedNaming == null
-              || !lastAddedNaming
-                  .getOriginalSignature()
-                  .equals(activeMemberNaming.getOriginalSignature())) {
-            classNamingBuilder.addMemberEntry(
-                activeMemberNaming, getResidualSignatureForMemberNaming(activeMemberNaming));
-            lastAddedNaming = activeMemberNaming;
-          }
+        if (changedName || changedMappedRange || originalRangeChange) {
+          lastAddedNaming =
+              addMemberEntryOrCopyInformation(
+                  lastAddedNaming,
+                  previousOriginalSignature,
+                  previousRenamedName,
+                  previousLineNumber,
+                  currentResidualSignature,
+                  currentMappingInfoForMemberNaming,
+                  previousRange,
+                  classNamingBuilder);
         }
       }
-      activeMemberNaming = new MemberNaming(signature, renamedName, getPosition());
-      previousMappedRange = mappedRange;
+      previousOriginalSignature = signature;
+      previousRenamedName = renamedName;
+      previousLineNumber = lineNo;
+      previousRange = mappedRange;
     } while (nextLine(mapBuilder));
 
-    if (activeMemberNaming != null) {
-      boolean notAdded =
-          lastAddedNaming == null
-              || !lastAddedNaming
-                  .getOriginalSignature()
-                  .equals(activeMemberNaming.getOriginalSignature());
-      if (previousMappedRange == null || notAdded) {
-        classNamingBuilder.addMemberEntry(
-            activeMemberNaming, getResidualSignatureForMemberNaming(activeMemberNaming));
-      }
+    if (previousOriginalSignature != null) {
+      addMemberEntryOrCopyInformation(
+          lastAddedNaming,
+          previousOriginalSignature,
+          previousRenamedName,
+          previousLineNumber,
+          currentResidualSignature,
+          currentMappingInfoForMemberNaming,
+          previousRange,
+          classNamingBuilder);
     }
   }
 
-  private Signature getResidualSignatureForMemberNaming(MemberNaming memberNaming) {
-    if (memberNaming.hasResidualSignature()) {
-      return memberNaming.getResidualSignatureInternal();
+  private MemberNaming addMemberEntryOrCopyInformation(
+      MemberNaming lastAddedNaming,
+      Signature originalSignature,
+      String renamedName,
+      int lineNumber,
+      Box<Signature> residualSignature,
+      Box<List<ReferentialMappingInformation>> additionalMappingInformation,
+      Range previousMappedRange,
+      ClassNaming.Builder classNamingBuilder) {
+    // If this line refers to a member that should be added to classNamingBuilder (as opposed to
+    // an inner inlined callee) and it's different from the the previous activeMemberNaming, then
+    // flush (add) the current activeMemberNaming.
+    if (previousMappedRange == null
+        || lastAddedNaming == null
+        || !lastAddedNaming.getRenamedName().equals(renamedName)
+        || !lastAddedNaming.getOriginalSignature().equals(originalSignature)) {
+      MemberNaming newMemberNaming =
+          new MemberNaming(
+              originalSignature,
+              getResidualSignatureForMemberNaming(
+                  residualSignature, originalSignature, renamedName),
+              new LinePosition(lineNumber));
+      if (additionalMappingInformation.isSet()) {
+        newMemberNaming.addAllMappingInformationInternal(additionalMappingInformation.get());
+      }
+      classNamingBuilder.addMemberEntry(newMemberNaming);
+      residualSignature.clear();
+      additionalMappingInformation.clear();
+      return newMemberNaming;
     }
-    Signature signature =
-        memberNaming.getOriginalSignature().asRenamed(memberNaming.getRenamedName());
+    if (additionalMappingInformation.isSet()) {
+      lastAddedNaming.addAllMappingInformationInternal(additionalMappingInformation.get());
+      additionalMappingInformation.clear();
+    }
+    residualSignature.clear();
+    return lastAddedNaming;
+  }
+
+  private Signature getResidualSignatureFromMappingInformation(
+      ResidualSignatureMappingInformation mappingInformation, String renamedName) {
+    if (mappingInformation.isResidualMethodSignatureMappingInformation()) {
+      ResidualMethodSignatureMappingInformation residualSignatureInfo =
+          mappingInformation.asResidualMethodSignatureMappingInformation();
+      MethodSignature residualSignature =
+          new MethodSignature(
+              renamedName,
+              DescriptorUtils.descriptorToJavaType(residualSignatureInfo.getReturnType()),
+              ArrayUtils.mapToStringArray(
+                  residualSignatureInfo.getParameters(), DescriptorUtils::descriptorToJavaType));
+      return signatureCache
+          .computeIfAbsent(residualSignature, Function.identity())
+          .asMethodSignature();
+    } else {
+      assert mappingInformation.isResidualFieldSignatureMappingInformation();
+      ResidualFieldSignatureMappingInformation residualSignatureInfo =
+          mappingInformation.asResidualFieldSignatureMappingInformation();
+      FieldSignature residualSignature =
+          new FieldSignature(
+              renamedName, DescriptorUtils.descriptorToJavaType(residualSignatureInfo.getType()));
+      return signatureCache
+          .computeIfAbsent(residualSignature, Function.identity())
+          .asFieldSignature();
+    }
+  }
+
+  private Signature getResidualSignatureForMemberNaming(
+      Box<Signature> residualSignature, Signature originalSignature, String renamedName) {
+    if (residualSignature.isSet()) {
+      return residualSignature.get();
+    }
+    Signature signature = originalSignature.asRenamed(renamedName);
     signature = signatureCache.computeIfAbsent(signature, Function.identity());
     return signature;
   }
diff --git a/src/main/java/com/android/tools/r8/naming/mappinginformation/CompilerSynthesizedMappingInformation.java b/src/main/java/com/android/tools/r8/naming/mappinginformation/CompilerSynthesizedMappingInformation.java
index b1d1eff..8ddef2b 100644
--- a/src/main/java/com/android/tools/r8/naming/mappinginformation/CompilerSynthesizedMappingInformation.java
+++ b/src/main/java/com/android/tools/r8/naming/mappinginformation/CompilerSynthesizedMappingInformation.java
@@ -6,11 +6,12 @@
 
 import com.android.tools.r8.naming.MapVersion;
 import com.android.tools.r8.naming.MappingComposeException;
+import com.android.tools.r8.naming.mappinginformation.MappingInformation.ReferentialMappingInformation;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonPrimitive;
 import java.util.function.Consumer;
 
-public class CompilerSynthesizedMappingInformation extends MappingInformation {
+public class CompilerSynthesizedMappingInformation extends ReferentialMappingInformation {
 
   public static final MapVersion SUPPORTED_VERSION = MapVersion.MAP_VERSION_1_0;
   public static final String ID = "com.android.tools.r8.synthesized";
@@ -55,7 +56,7 @@
 
   @Override
   public boolean allowOther(MappingInformation information) {
-    return !information.isCompilerSynthesizedMappingInformation();
+    return true;
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/naming/mappinginformation/FileNameInformation.java b/src/main/java/com/android/tools/r8/naming/mappinginformation/FileNameInformation.java
index 828b5d8..7535bd3 100644
--- a/src/main/java/com/android/tools/r8/naming/mappinginformation/FileNameInformation.java
+++ b/src/main/java/com/android/tools/r8/naming/mappinginformation/FileNameInformation.java
@@ -7,12 +7,13 @@
 import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.naming.MapVersion;
 import com.android.tools.r8.naming.MappingComposeException;
+import com.android.tools.r8.naming.mappinginformation.MappingInformation.ReferentialMappingInformation;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonPrimitive;
 import java.util.function.Consumer;
 
-public class FileNameInformation extends MappingInformation {
+public class FileNameInformation extends ReferentialMappingInformation {
 
   private final String fileName;
 
diff --git a/src/main/java/com/android/tools/r8/naming/mappinginformation/MappingInformation.java b/src/main/java/com/android/tools/r8/naming/mappinginformation/MappingInformation.java
index c62d4e6..6680142 100644
--- a/src/main/java/com/android/tools/r8/naming/mappinginformation/MappingInformation.java
+++ b/src/main/java/com/android/tools/r8/naming/mappinginformation/MappingInformation.java
@@ -11,6 +11,7 @@
 import com.android.tools.r8.naming.mappinginformation.ResidualSignatureMappingInformation.ResidualMethodSignatureMappingInformation;
 import com.google.gson.JsonElement;
 import com.google.gson.JsonObject;
+import java.util.List;
 import java.util.function.Consumer;
 
 public abstract class MappingInformation {
@@ -89,6 +90,10 @@
     return null;
   }
 
+  public ResidualSignatureMappingInformation asResidualSignatureMappingInformation() {
+    return null;
+  }
+
   public ResidualMethodSignatureMappingInformation asResidualMethodSignatureMappingInformation() {
     return null;
   }
@@ -177,6 +182,39 @@
     }
   }
 
+  public boolean isPositionalMappingInformation() {
+    return false;
+  }
+
+  public boolean isReferentialMappingInformation() {
+    return false;
+  }
+
+  public ReferentialMappingInformation asReferentialMappingInformation() {
+    return null;
+  }
+
+  public abstract static class ReferentialMappingInformation extends MappingInformation {
+
+    @Override
+    public boolean isReferentialMappingInformation() {
+      return true;
+    }
+
+    @Override
+    public ReferentialMappingInformation asReferentialMappingInformation() {
+      return this;
+    }
+  }
+
+  public abstract static class PositionalMappingInformation extends MappingInformation {
+
+    @Override
+    public boolean isPositionalMappingInformation() {
+      return true;
+    }
+  }
+
   static JsonElement getJsonElementFromObject(
       JsonObject object,
       DiagnosticsHandler diagnosticsHandler,
@@ -190,4 +228,15 @@
     }
     return element;
   }
+
+  public static <T extends MappingInformation> void addMappingInformation(
+      List<T> existingInfos, T newInfo, Consumer<MappingInformation> onProhibitedAddition) {
+    for (MappingInformation existing : existingInfos) {
+      if (!existing.allowOther(newInfo)) {
+        onProhibitedAddition.accept(existing);
+        return;
+      }
+    }
+    existingInfos.add(newInfo);
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/naming/mappinginformation/OutlineCallsiteMappingInformation.java b/src/main/java/com/android/tools/r8/naming/mappinginformation/OutlineCallsiteMappingInformation.java
index b38d707..238a9dd 100644
--- a/src/main/java/com/android/tools/r8/naming/mappinginformation/OutlineCallsiteMappingInformation.java
+++ b/src/main/java/com/android/tools/r8/naming/mappinginformation/OutlineCallsiteMappingInformation.java
@@ -7,6 +7,7 @@
 import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.naming.MapVersion;
 import com.android.tools.r8.naming.MappingComposeException;
+import com.android.tools.r8.naming.mappinginformation.MappingInformation.PositionalMappingInformation;
 import com.android.tools.r8.references.MethodReference;
 import com.android.tools.r8.utils.MethodReferenceUtils;
 import com.google.gson.JsonElement;
@@ -16,7 +17,7 @@
 import it.unimi.dsi.fastutil.ints.Int2IntSortedMap;
 import java.util.function.Consumer;
 
-public class OutlineCallsiteMappingInformation extends MappingInformation {
+public class OutlineCallsiteMappingInformation extends PositionalMappingInformation {
 
   public static final MapVersion SUPPORTED_VERSION = MapVersion.MAP_VERSION_2_0;
   public static final MapVersion SUPPORTED_WITH_OUTLINE_VERSION = MapVersion.MAP_VERSION_2_1;
diff --git a/src/main/java/com/android/tools/r8/naming/mappinginformation/OutlineMappingInformation.java b/src/main/java/com/android/tools/r8/naming/mappinginformation/OutlineMappingInformation.java
index 09c60d9..72b3b8f 100644
--- a/src/main/java/com/android/tools/r8/naming/mappinginformation/OutlineMappingInformation.java
+++ b/src/main/java/com/android/tools/r8/naming/mappinginformation/OutlineMappingInformation.java
@@ -6,11 +6,12 @@
 
 import com.android.tools.r8.naming.MapVersion;
 import com.android.tools.r8.naming.MappingComposeException;
+import com.android.tools.r8.naming.mappinginformation.MappingInformation.ReferentialMappingInformation;
 import com.google.gson.JsonObject;
 import com.google.gson.JsonPrimitive;
 import java.util.function.Consumer;
 
-public class OutlineMappingInformation extends MappingInformation {
+public class OutlineMappingInformation extends ReferentialMappingInformation {
 
   public static final MapVersion SUPPORTED_VERSION = MapVersion.MAP_VERSION_2_0;
   public static final String ID = "com.android.tools.r8.outline";
@@ -40,7 +41,7 @@
 
   @Override
   public boolean allowOther(MappingInformation information) {
-    return !information.isOutlineMappingInformation();
+    return true;
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/naming/mappinginformation/ResidualSignatureMappingInformation.java b/src/main/java/com/android/tools/r8/naming/mappinginformation/ResidualSignatureMappingInformation.java
index 1c94da9..79c4023 100644
--- a/src/main/java/com/android/tools/r8/naming/mappinginformation/ResidualSignatureMappingInformation.java
+++ b/src/main/java/com/android/tools/r8/naming/mappinginformation/ResidualSignatureMappingInformation.java
@@ -10,6 +10,7 @@
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.naming.MapVersion;
 import com.android.tools.r8.naming.MappingComposeException;
+import com.android.tools.r8.naming.mappinginformation.MappingInformation.ReferentialMappingInformation;
 import com.android.tools.r8.utils.ArrayUtils;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.StringUtils;
@@ -20,7 +21,7 @@
 import java.util.Arrays;
 import java.util.function.Consumer;
 
-public abstract class ResidualSignatureMappingInformation extends MappingInformation {
+public abstract class ResidualSignatureMappingInformation extends ReferentialMappingInformation {
 
   public static final MapVersion SUPPORTED_VERSION = MapVersion.MAP_VERSION_EXPERIMENTAL;
   public static final String ID = "com.android.tools.r8.residualsignature";
@@ -41,11 +42,6 @@
 
   protected abstract String serializeInternal();
 
-  @Override
-  public boolean allowOther(MappingInformation information) {
-    return !information.isResidualSignatureMappingInformation();
-  }
-
   public static boolean isSupported(MapVersion version) {
     return version.isGreaterThanOrEqualTo(SUPPORTED_VERSION);
   }
@@ -67,6 +63,16 @@
     }
   }
 
+  @Override
+  public boolean isResidualSignatureMappingInformation() {
+    return true;
+  }
+
+  @Override
+  public ResidualSignatureMappingInformation asResidualSignatureMappingInformation() {
+    return this;
+  }
+
   public static class ResidualMethodSignatureMappingInformation
       extends ResidualSignatureMappingInformation {
 
@@ -122,6 +128,16 @@
       assert existing.isResidualMethodSignatureMappingInformation();
       return this;
     }
+
+    @Override
+    public boolean allowOther(MappingInformation information) {
+      if (!information.isResidualMethodSignatureMappingInformation()) {
+        return true;
+      }
+      ResidualMethodSignatureMappingInformation other =
+          information.asResidualMethodSignatureMappingInformation();
+      return returnType.equals(other.returnType) && Arrays.equals(parameters, other.parameters);
+    }
   }
 
   public static class ResidualFieldSignatureMappingInformation
@@ -138,6 +154,10 @@
       return new ResidualFieldSignatureMappingInformation(field.getType().toDescriptorString());
     }
 
+    public String getType() {
+      return type;
+    }
+
     @Override
     protected String serializeInternal() {
       return type;
@@ -163,5 +183,11 @@
       assert existing.isResidualFieldSignatureMappingInformation();
       return this;
     }
+
+    @Override
+    public boolean allowOther(MappingInformation information) {
+      return !information.isResidualFieldSignatureMappingInformation()
+          || type.equals(information.asResidualFieldSignatureMappingInformation().getType());
+    }
   }
 }
diff --git a/src/main/java/com/android/tools/r8/naming/mappinginformation/RewriteFrameMappingInformation.java b/src/main/java/com/android/tools/r8/naming/mappinginformation/RewriteFrameMappingInformation.java
index da0c1f3..589a743 100644
--- a/src/main/java/com/android/tools/r8/naming/mappinginformation/RewriteFrameMappingInformation.java
+++ b/src/main/java/com/android/tools/r8/naming/mappinginformation/RewriteFrameMappingInformation.java
@@ -10,6 +10,7 @@
 import com.android.tools.r8.errors.Unimplemented;
 import com.android.tools.r8.naming.MapVersion;
 import com.android.tools.r8.naming.MappingComposeException;
+import com.android.tools.r8.naming.mappinginformation.MappingInformation.PositionalMappingInformation;
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.Reference;
 import com.android.tools.r8.retrace.internal.RetraceStackTraceContextImpl;
@@ -25,7 +26,7 @@
 import java.util.List;
 import java.util.function.Consumer;
 
-public class RewriteFrameMappingInformation extends MappingInformation {
+public class RewriteFrameMappingInformation extends PositionalMappingInformation {
 
   public static final MapVersion SUPPORTED_VERSION = MapVersion.MAP_VERSION_2_0;
   public static final String ID = "com.android.tools.r8.rewriteFrame";
diff --git a/src/main/java/com/android/tools/r8/naming/mappinginformation/UnknownJsonMappingInformation.java b/src/main/java/com/android/tools/r8/naming/mappinginformation/UnknownJsonMappingInformation.java
index 3348063..98699b2 100644
--- a/src/main/java/com/android/tools/r8/naming/mappinginformation/UnknownJsonMappingInformation.java
+++ b/src/main/java/com/android/tools/r8/naming/mappinginformation/UnknownJsonMappingInformation.java
@@ -6,10 +6,11 @@
 
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.naming.MappingComposeException;
+import com.android.tools.r8.naming.mappinginformation.MappingInformation.PositionalMappingInformation;
 import com.google.gson.JsonObject;
 import java.util.function.Consumer;
 
-public class UnknownJsonMappingInformation extends MappingInformation {
+public class UnknownJsonMappingInformation extends PositionalMappingInformation {
 
   private final String id;
   private final String payload;
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/MemberNamingWithMappedRangesOfName.java b/src/main/java/com/android/tools/r8/retrace/internal/MemberNamingWithMappedRangesOfName.java
new file mode 100644
index 0000000..26d5a16
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/retrace/internal/MemberNamingWithMappedRangesOfName.java
@@ -0,0 +1,40 @@
+// 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.retrace.internal;
+
+import com.android.tools.r8.naming.ClassNamingForNameMapper.MappedRange;
+import com.android.tools.r8.naming.ClassNamingForNameMapper.MappedRangesOfName;
+import com.android.tools.r8.naming.MemberNaming;
+import com.android.tools.r8.utils.ListUtils;
+import java.util.List;
+
+class MemberNamingWithMappedRangesOfName {
+
+  private final MappedRangesOfName mappedRangesOfName;
+  private final MemberNaming methodMemberNaming;
+
+  MemberNamingWithMappedRangesOfName(
+      MemberNaming methodMemberNaming, MappedRangesOfName mappedRangesOfName) {
+    this.methodMemberNaming = methodMemberNaming;
+    this.mappedRangesOfName = mappedRangesOfName;
+  }
+
+  List<MappedRange> allRangesForLine(int line) {
+    return mappedRangesOfName.allRangesForLine(line, false);
+  }
+
+  List<MappedRange> mappedRangesWithNoMinifiedRange() {
+    return ListUtils.filter(
+        mappedRangesOfName.getMappedRanges(), mappedRange -> mappedRange.minifiedRange == null);
+  }
+
+  List<MappedRange> getMappedRanges() {
+    return mappedRangesOfName.getMappedRanges();
+  }
+
+  public MemberNaming getMemberNaming() {
+    return methodMemberNaming;
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetraceClassResultImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetraceClassResultImpl.java
index 1b2be6a..45ad91a 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetraceClassResultImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetraceClassResultImpl.java
@@ -10,7 +10,6 @@
 import com.android.tools.r8.naming.MemberNaming;
 import com.android.tools.r8.naming.MemberNaming.FieldSignature;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
-import com.android.tools.r8.naming.MemberNaming.Signature;
 import com.android.tools.r8.naming.mappinginformation.MappingInformation;
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.FieldReference;
@@ -23,8 +22,8 @@
 import com.android.tools.r8.retrace.RetraceStackTraceContext;
 import com.android.tools.r8.retrace.RetraceUnknownJsonMappingInformationResult;
 import com.android.tools.r8.retrace.RetracedSourceFile;
+import com.android.tools.r8.utils.ListUtils;
 import com.android.tools.r8.utils.Pair;
-import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.OptionalInt;
@@ -63,6 +62,32 @@
     return lookupField(FieldDefinition.create(fieldReference));
   }
 
+  private RetraceFieldResultImpl lookupField(FieldDefinition fieldDefinition) {
+    return lookup(
+        fieldDefinition,
+        RetraceClassResultImpl::lookupMemberNamingsForFieldDefinition,
+        RetraceFieldResultImpl::new);
+  }
+
+  private static List<MemberNaming> lookupMemberNamingsForFieldDefinition(
+      ClassNamingForNameMapper mapper, FieldDefinition fieldDefinition) {
+    List<MemberNaming> memberNamings =
+        mapper.mappedFieldNamingsByName.get(fieldDefinition.getName());
+    if (memberNamings == null || memberNamings.isEmpty()) {
+      return null;
+    }
+    if (fieldDefinition.isFullFieldDefinition()) {
+      FieldSignature fieldSignature =
+          FieldSignature.fromFieldReference(
+              fieldDefinition.asFullFieldDefinition().getFieldReference());
+      memberNamings =
+          ListUtils.filter(
+              memberNamings,
+              memberNaming -> memberNaming.getResidualSignature().equals(fieldSignature));
+    }
+    return memberNamings;
+  }
+
   @Override
   public RetraceMethodResultImpl lookupMethod(String methodName) {
     return lookupMethod(MethodDefinition.create(obfuscatedReference, methodName));
@@ -79,82 +104,64 @@
     return lookupMethod(MethodDefinition.create(reference));
   }
 
-  private static MethodSignature getSignature(
-      ClassNamingForNameMapper mapper, MethodDefinition definition) {
-    if (mapper != null && definition.isFullMethodDefinition()) {
-      MemberNaming lookup =
-          mapper.lookup(
-              MethodSignature.fromMethodReference(
-                  definition.asFullMethodDefinition().getMethodReference()));
-      if (lookup != null) {
-        return lookup.getOriginalSignature().asMethodSignature();
-      }
-    }
-    return null;
-  }
-
-  private static FieldSignature getSignature(
-      ClassNamingForNameMapper mapper, FieldDefinition definition) {
-    if (mapper != null && definition.isFullFieldDefinition()) {
-      MemberNaming lookup =
-          mapper.lookup(
-              FieldSignature.fromFieldReference(
-                  definition.asFullFieldDefinition().getFieldReference()));
-      if (lookup != null) {
-        return lookup.getOriginalSignature().asFieldSignature();
-      }
-    }
-    return null;
-  }
-
-  private RetraceFieldResultImpl lookupField(FieldDefinition fieldDefinition) {
-    return lookup(
-        fieldDefinition,
-        getSignature(mapper, fieldDefinition),
-        (mapper, name) -> {
-          List<MemberNaming> memberNamings = mapper.mappedFieldNamingsByName.get(name);
-          if (memberNamings == null || memberNamings.isEmpty()) {
-            return null;
-          }
-          return memberNamings;
-        },
-        RetraceFieldResultImpl::new);
-  }
-
   private RetraceMethodResultImpl lookupMethod(MethodDefinition methodDefinition) {
     return lookup(
         methodDefinition,
-        getSignature(mapper, methodDefinition),
-        (mapper, name) -> {
-          MappedRangesOfName mappedRanges = mapper.mappedRangesByRenamedName.get(name);
-          if (mappedRanges == null || mappedRanges.getMappedRanges().isEmpty()) {
-            return null;
-          }
-          return mappedRanges.getMappedRanges();
-        },
+        RetraceClassResultImpl::lookupMappedRangesForMethodDefinition,
         RetraceMethodResultImpl::new);
   }
 
-  private <T, R, D extends Definition, S extends Signature> R lookup(
+  private static List<MemberNamingWithMappedRangesOfName> lookupMappedRangesForMethodDefinition(
+      ClassNamingForNameMapper mapper, MethodDefinition methodDefinition) {
+    MappedRangesOfName mappedRanges =
+        mapper.mappedRangesByRenamedName.get(methodDefinition.getName());
+    if (mappedRanges == null || mappedRanges.getMappedRanges().isEmpty()) {
+      return null;
+    }
+    List<MappedRangesOfName> partitions = mappedRanges.partitionOnMethodSignature();
+    if (methodDefinition.isFullMethodDefinition()) {
+      MethodSignature methodSignature =
+          MethodSignature.fromMethodReference(
+              methodDefinition.asFullMethodDefinition().getMethodReference());
+      partitions =
+          ListUtils.filter(
+              partitions,
+              partition ->
+                  ListUtils.last(partition.getMappedRanges())
+                      .getResidualSignature()
+                      .equals(methodSignature));
+    }
+    boolean isAmbiguous = partitions.size() > 1;
+    return ListUtils.map(
+        partitions,
+        mappedRangesOfName ->
+            new MemberNamingWithMappedRangesOfName(
+                mappedRangesOfName.getMemberNaming(mapper, isAmbiguous), mappedRangesOfName));
+  }
+
+  private static <T, D extends Definition> void lookupElement(
+      RetraceClassElementImpl element,
       D definition,
-      S originalSignature,
-      BiFunction<ClassNamingForNameMapper, String, T> lookupFunction,
-      ResultConstructor<T, R, D, S> constructor) {
+      List<Pair<RetraceClassElementImpl, T>> mappings,
+      BiFunction<ClassNamingForNameMapper, D, T> lookupFunction) {
+    if (element.mapper != null) {
+      T mappedElements = lookupFunction.apply(element.mapper, definition);
+      if (mappedElements != null) {
+        mappings.add(new Pair<>(element, mappedElements));
+        return;
+      }
+    }
+    mappings.add(new Pair<>(element, null));
+  }
+
+  private <T, R, D extends Definition> R lookup(
+      D definition,
+      BiFunction<ClassNamingForNameMapper, D, T> lookupFunction,
+      ResultConstructor<T, R, D> constructor) {
     List<Pair<RetraceClassElementImpl, T>> mappings = new ArrayList<>();
     internalStream()
-        .forEach(
-            element -> {
-              if (mapper != null) {
-                assert element.mapper != null;
-                T mappedElements = lookupFunction.apply(element.mapper, definition.getName());
-                if (mappedElements != null) {
-                  mappings.add(new Pair<>(element, mappedElements));
-                  return;
-                }
-              }
-              mappings.add(new Pair<>(element, null));
-            });
-    return constructor.create(this, mappings, definition, originalSignature, retracer);
+        .forEach(element -> lookupElement(element, definition, mappings, lookupFunction));
+    return constructor.create(this, mappings, definition, retracer);
   }
 
   @Override
@@ -212,12 +219,11 @@
         mapper);
   }
 
-  private interface ResultConstructor<T, R, D, S> {
+  private interface ResultConstructor<T, R, D> {
     R create(
         RetraceClassResultImpl classResult,
         List<Pair<RetraceClassElementImpl, T>> mappings,
         D definition,
-        S originalSignature,
         RetracerImpl retracer);
   }
 
@@ -271,14 +277,7 @@
     private RetraceFieldResultImpl lookupField(FieldDefinition fieldDefinition) {
       return lookup(
           fieldDefinition,
-          getSignature(mapper, fieldDefinition),
-          (mapper, name) -> {
-            List<MemberNaming> memberNamings = mapper.mappedFieldNamingsByName.get(name);
-            if (memberNamings == null || memberNamings.isEmpty()) {
-              return null;
-            }
-            return memberNamings;
-          },
+          RetraceClassResultImpl::lookupMemberNamingsForFieldDefinition,
           RetraceFieldResultImpl::new);
     }
 
@@ -290,34 +289,17 @@
     private RetraceMethodResultImpl lookupMethod(MethodDefinition methodDefinition) {
       return lookup(
           methodDefinition,
-          getSignature(mapper, methodDefinition),
-          (mapper, name) -> {
-            MappedRangesOfName mappedRanges = mapper.mappedRangesByRenamedName.get(name);
-            if (mappedRanges == null || mappedRanges.getMappedRanges().isEmpty()) {
-              return null;
-            }
-            return mappedRanges.getMappedRanges();
-          },
+          RetraceClassResultImpl::lookupMappedRangesForMethodDefinition,
           RetraceMethodResultImpl::new);
     }
 
-    private <T, R, D extends Definition, S extends Signature> R lookup(
+    private <T, R, D extends Definition> R lookup(
         D definition,
-        S originalSignature,
-        BiFunction<ClassNamingForNameMapper, String, T> lookupFunction,
-        ResultConstructor<T, R, D, S> constructor) {
-      List<Pair<RetraceClassElementImpl, T>> mappings = ImmutableList.of();
-      if (mapper != null) {
-        T result = lookupFunction.apply(mapper, definition.getName());
-        if (result != null) {
-          mappings = ImmutableList.of(new Pair<>(this, result));
-        }
-      }
-      if (mappings.isEmpty()) {
-        mappings = ImmutableList.of(new Pair<>(this, null));
-      }
-      return constructor.create(
-          classResult, mappings, definition, originalSignature, classResult.retracer);
+        BiFunction<ClassNamingForNameMapper, D, T> lookupFunction,
+        ResultConstructor<T, R, D> constructor) {
+      List<Pair<RetraceClassElementImpl, T>> mappings = new ArrayList<>();
+      RetraceClassResultImpl.lookupElement(this, definition, mappings, lookupFunction);
+      return constructor.create(classResult, mappings, definition, classResult.retracer);
     }
 
     @Override
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetraceFieldResultImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetraceFieldResultImpl.java
index d1d7203..afade35 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetraceFieldResultImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetraceFieldResultImpl.java
@@ -4,7 +4,6 @@
 
 package com.android.tools.r8.retrace.internal;
 
-import com.android.tools.r8.errors.Unimplemented;
 import com.android.tools.r8.naming.MemberNaming;
 import com.android.tools.r8.naming.MemberNaming.FieldSignature;
 import com.android.tools.r8.references.Reference;
@@ -23,19 +22,16 @@
   private final RetraceClassResultImpl classResult;
   private final List<Pair<RetraceClassElementImpl, List<MemberNaming>>> memberNamings;
   private final FieldDefinition fieldDefinition;
-  private final FieldSignature originalFieldSignature;
   private final Retracer retracer;
 
   RetraceFieldResultImpl(
       RetraceClassResultImpl classResult,
       List<Pair<RetraceClassElementImpl, List<MemberNaming>>> memberNamings,
       FieldDefinition fieldDefinition,
-      FieldSignature originalFieldSignature,
       Retracer retracer) {
     this.classResult = classResult;
     this.memberNamings = memberNamings;
     this.fieldDefinition = fieldDefinition;
-    this.originalFieldSignature = originalFieldSignature;
     this.retracer = retracer;
     assert classResult != null;
     assert !memberNamings.isEmpty();
@@ -55,7 +51,8 @@
                         classElement,
                         RetracedFieldReferenceImpl.create(
                             fieldDefinition.substituteHolder(
-                                classElement.getRetracedClass().getClassReference()))));
+                                classElement.getRetracedClass().getClassReference())),
+                        null));
               }
               return memberNamings.stream()
                   .map(
@@ -78,7 +75,8 @@
                                     fieldSignature.isQualified()
                                         ? fieldSignature.toUnqualifiedName()
                                         : fieldSignature.name,
-                                    Reference.typeFromTypeName(fieldSignature.type))));
+                                    Reference.typeFromTypeName(fieldSignature.type))),
+                            memberNaming);
                       });
             });
   }
@@ -105,23 +103,27 @@
     private final RetracedFieldReferenceImpl fieldReference;
     private final RetraceFieldResultImpl retraceFieldResult;
     private final RetraceClassElementImpl classElement;
+    private final MemberNaming memberNaming;
 
     private ElementImpl(
         RetraceFieldResultImpl retraceFieldResult,
         RetraceClassElementImpl classElement,
-        RetracedFieldReferenceImpl fieldReference) {
+        RetracedFieldReferenceImpl fieldReference,
+        MemberNaming memberNaming) {
       this.classElement = classElement;
       this.fieldReference = fieldReference;
       this.retraceFieldResult = retraceFieldResult;
+      this.memberNaming = memberNaming;
     }
 
     @Override
     public boolean isCompilerSynthesized() {
-      throw new Unimplemented("b/172014416");
+      return memberNaming != null && memberNaming.isCompilerSynthesized();
     }
 
     @Override
     public boolean isUnknown() {
+      assert (memberNaming == null) == fieldReference.isUnknown();
       return fieldReference.isUnknown();
     }
 
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetraceFrameResultImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetraceFrameResultImpl.java
index 9d22b04..cfaa06e 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetraceFrameResultImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetraceFrameResultImpl.java
@@ -8,6 +8,7 @@
 
 import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.naming.ClassNamingForNameMapper.MappedRange;
+import com.android.tools.r8.naming.MemberNaming;
 import com.android.tools.r8.naming.Range;
 import com.android.tools.r8.references.MethodReference;
 import com.android.tools.r8.retrace.RetraceFrameElement;
@@ -36,7 +37,8 @@
   private final RetraceClassResultImpl classResult;
   private final MethodDefinition methodDefinition;
   private final OptionalInt obfuscatedPosition;
-  private final List<Pair<RetraceClassElementImpl, List<MappedRange>>> mappedRanges;
+  private final List<Pair<RetraceClassElementImpl, List<MemberNamingWithMappedRangesOfName>>>
+      mappedRanges;
   private final RetracerImpl retracer;
   private final RetraceStackTraceContextImpl context;
 
@@ -44,7 +46,7 @@
 
   public RetraceFrameResultImpl(
       RetraceClassResultImpl classResult,
-      List<Pair<RetraceClassElementImpl, List<MappedRange>>> mappedRanges,
+      List<Pair<RetraceClassElementImpl, List<MemberNamingWithMappedRangesOfName>>> mappedRanges,
       MethodDefinition methodDefinition,
       OptionalInt obfuscatedPosition,
       RetracerImpl retracer,
@@ -55,35 +57,46 @@
     this.mappedRanges = mappedRanges;
     this.retracer = retracer;
     this.context = context;
+    assert !mappedRanges.isEmpty();
   }
 
   @Override
   public boolean isAmbiguous() {
     if (isAmbiguousCache.isUnknown()) {
-      if (mappedRanges.size() > 1) {
-        isAmbiguousCache = OptionalBool.TRUE;
-        return true;
-      }
-      List<MappedRange> methodRanges = mappedRanges.get(0).getSecond();
-      if (methodRanges != null && !methodRanges.isEmpty()) {
-        MappedRange initialRange = methodRanges.get(0);
-        for (MappedRange mappedRange : methodRanges) {
-          if (isMappedRangeAmbiguous(mappedRange)) {
-            isAmbiguousCache = OptionalBool.TRUE;
-            return true;
-          }
-          if (mappedRange != initialRange
-              && (mappedRange.minifiedRange == null
-                  || !mappedRange.minifiedRange.equals(initialRange.minifiedRange))) {
-            isAmbiguousCache = OptionalBool.TRUE;
-            return true;
-          }
+      isAmbiguousCache = OptionalBool.of(computeIsAmbiguous());
+      assert !isAmbiguousCache.isUnknown();
+    }
+    return isAmbiguousCache.isTrue();
+  }
+
+  private boolean computeIsAmbiguous() {
+    if (mappedRanges.size() > 1) {
+      return true;
+    }
+    List<MemberNamingWithMappedRangesOfName> memberNamingWithMappedRanges =
+        mappedRanges.get(0).getSecond();
+    if (memberNamingWithMappedRanges == null) {
+      return false;
+    }
+    if (memberNamingWithMappedRanges.size() > 1) {
+      return true;
+    }
+    assert !memberNamingWithMappedRanges.isEmpty();
+    List<MappedRange> methodRanges = memberNamingWithMappedRanges.get(0).getMappedRanges();
+    if (methodRanges != null && !methodRanges.isEmpty()) {
+      MappedRange initialRange = methodRanges.get(0);
+      for (MappedRange mappedRange : methodRanges) {
+        if (isMappedRangeAmbiguous(mappedRange)) {
+          return true;
+        }
+        if (mappedRange != initialRange
+            && (mappedRange.minifiedRange == null
+                || !mappedRange.minifiedRange.equals(initialRange.minifiedRange))) {
+          return true;
         }
       }
-      isAmbiguousCache = OptionalBool.FALSE;
     }
-    assert !isAmbiguousCache.isUnknown();
-    return isAmbiguousCache.isTrue();
+    return false;
   }
 
   private boolean isMappedRangeAmbiguous(MappedRange mappedRange) {
@@ -102,8 +115,10 @@
         .flatMap(
             mappedRangePair -> {
               RetraceClassElementImpl classElement = mappedRangePair.getFirst();
-              List<MappedRange> mappedRanges = mappedRangePair.getSecond();
-              if (mappedRanges == null || mappedRanges.isEmpty()) {
+              List<MemberNamingWithMappedRangesOfName> memberNamingWithMappedRangesOfNames =
+                  mappedRangePair.getSecond();
+              if (memberNamingWithMappedRangesOfNames == null
+                  || memberNamingWithMappedRangesOfNames.isEmpty()) {
                 return Stream.of(
                     new ElementImpl(
                         this,
@@ -112,32 +127,46 @@
                             methodDefinition.substituteHolder(
                                 classElement.getRetracedClass().getClassReference())),
                         ImmutableList.of(),
+                        null,
                         obfuscatedPosition,
                         retracer));
               }
               // Iterate over mapped ranges that may have different positions than specified.
               List<ElementImpl> ambiguousFrames = new ArrayList<>();
-              Range minifiedRange = mappedRanges.get(0).minifiedRange;
-              List<MappedRange> mappedRangesForElement = Lists.newArrayList(mappedRanges.get(0));
-              for (int i = 1; i < mappedRanges.size(); i++) {
-                MappedRange mappedRange = mappedRanges.get(i);
-                if (minifiedRange == null || !minifiedRange.equals(mappedRange.minifiedRange)) {
-                  // This is a new frame
-                  separateAmbiguousOriginalPositions(
-                      classElement, mappedRangesForElement, ambiguousFrames);
-                  mappedRangesForElement = new ArrayList<>();
-                  minifiedRange = mappedRange.minifiedRange;
+              for (MemberNamingWithMappedRangesOfName memberNamingWithMappedRangesOfName :
+                  memberNamingWithMappedRangesOfNames) {
+                List<MappedRange> mappedRangesForMemberNaming =
+                    memberNamingWithMappedRangesOfName.getMappedRanges();
+                MappedRange firstMappedRange = mappedRangesForMemberNaming.get(0);
+                Range minifiedRange = firstMappedRange.minifiedRange;
+                List<MappedRange> mappedRangesForElement = Lists.newArrayList(firstMappedRange);
+                for (int i = 1; i < mappedRangesForMemberNaming.size(); i++) {
+                  MappedRange mappedRange = mappedRangesForMemberNaming.get(i);
+                  if (minifiedRange == null || !minifiedRange.equals(mappedRange.minifiedRange)) {
+                    // This is a new frame
+                    separateAmbiguousOriginalPositions(
+                        classElement,
+                        memberNamingWithMappedRangesOfName.getMemberNaming(),
+                        mappedRangesForElement,
+                        ambiguousFrames);
+                    mappedRangesForElement = new ArrayList<>();
+                    minifiedRange = mappedRange.minifiedRange;
+                  }
+                  mappedRangesForElement.add(mappedRange);
                 }
-                mappedRangesForElement.add(mappedRange);
+                separateAmbiguousOriginalPositions(
+                    classElement,
+                    memberNamingWithMappedRangesOfName.getMemberNaming(),
+                    mappedRangesForElement,
+                    ambiguousFrames);
               }
-              separateAmbiguousOriginalPositions(
-                  classElement, mappedRangesForElement, ambiguousFrames);
               return ambiguousFrames.stream();
             });
   }
 
   private void separateAmbiguousOriginalPositions(
       RetraceClassElementImpl classElement,
+      MemberNaming memberNaming,
       List<MappedRange> frames,
       List<ElementImpl> allAmbiguousElements) {
     // We have a single list of frames where minified positional information may produce ambiguous
@@ -145,7 +174,7 @@
     if (!isAmbiguous() || !isMappedRangeAmbiguous(frames.get(0))) {
       allAmbiguousElements.add(
           elementFromMappedRanges(
-              ListUtils.map(frames, MappedRangeForFrame::create), classElement));
+              memberNaming, ListUtils.map(frames, MappedRangeForFrame::create), classElement));
       return;
     }
     assert frames.size() > 0;
@@ -165,19 +194,19 @@
             }
           } else {
             newFrames.forEach(
-                ambiguousFrames -> {
-                  ambiguousFrames.add(MappedRangeForFrame.create(frame));
-                });
+                ambiguousFrames -> ambiguousFrames.add(MappedRangeForFrame.create(frame)));
           }
         });
     newFrames.forEach(
-        ambiguousFrames -> {
-          allAmbiguousElements.add(elementFromMappedRanges(ambiguousFrames, classElement));
-        });
+        ambiguousFrames ->
+            allAmbiguousElements.add(
+                elementFromMappedRanges(memberNaming, ambiguousFrames, classElement)));
   }
 
   private ElementImpl elementFromMappedRanges(
-      List<MappedRangeForFrame> mappedRangesForElement, RetraceClassElementImpl classElement) {
+      MemberNaming memberNaming,
+      List<MappedRangeForFrame> mappedRangesForElement,
+      RetraceClassElementImpl classElement) {
     MappedRangeForFrame topFrame = mappedRangesForElement.get(0);
     MethodReference methodReference =
         methodReferenceFromMappedRange(
@@ -187,6 +216,7 @@
         classElement,
         getRetracedMethod(methodReference, topFrame, obfuscatedPosition),
         mappedRangesForElement,
+        memberNaming,
         obfuscatedPosition,
         retracer);
   }
@@ -221,7 +251,8 @@
 
   @Override
   public boolean isEmpty() {
-    return mappedRanges.isEmpty();
+    List<MemberNamingWithMappedRangesOfName> mappedRangesOfNames = mappedRanges.get(0).getSecond();
+    return mappedRangesOfNames == null || mappedRangesOfNames.isEmpty();
   }
 
   public static class ElementImpl implements RetraceFrameElement {
@@ -230,6 +261,7 @@
     private final RetraceFrameResultImpl retraceFrameResult;
     private final RetraceClassElementImpl classElement;
     private final List<MappedRangeForFrame> mappedRanges;
+    private final MemberNaming memberNaming;
     private final OptionalInt obfuscatedPosition;
     private final RetracerImpl retracer;
 
@@ -238,12 +270,14 @@
         RetraceClassElementImpl classElement,
         RetracedMethodReferenceImpl methodReference,
         List<MappedRangeForFrame> mappedRanges,
+        MemberNaming memberNaming,
         OptionalInt obfuscatedPosition,
         RetracerImpl retracer) {
       this.methodReference = methodReference;
       this.retraceFrameResult = retraceFrameResult;
       this.classElement = classElement;
       this.mappedRanges = mappedRanges;
+      this.memberNaming = memberNaming;
       this.obfuscatedPosition = obfuscatedPosition;
       this.retracer = retracer;
     }
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/RetraceMethodResultImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/RetraceMethodResultImpl.java
index 19b2c15..1a6ca9a 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/RetraceMethodResultImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/RetraceMethodResultImpl.java
@@ -4,9 +4,9 @@
 
 package com.android.tools.r8.retrace.internal;
 
-import com.android.tools.r8.errors.Unimplemented;
 import com.android.tools.r8.naming.ClassNamingForNameMapper.MappedRange;
 import com.android.tools.r8.naming.ClassNamingForNameMapper.MappedRangesOfName;
+import com.android.tools.r8.naming.MemberNaming;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.naming.mappinginformation.OutlineCallsiteMappingInformation;
 import com.android.tools.r8.references.MethodReference;
@@ -19,30 +19,26 @@
 import com.android.tools.r8.utils.ListUtils;
 import com.android.tools.r8.utils.Pair;
 import java.util.ArrayList;
-import java.util.HashSet;
 import java.util.List;
 import java.util.OptionalInt;
-import java.util.Set;
 import java.util.stream.Stream;
 
 public class RetraceMethodResultImpl implements RetraceMethodResult {
 
   private final MethodDefinition methodDefinition;
-  private final MethodSignature originalMethodSignature;
   private final RetraceClassResultImpl classResult;
-  private final List<Pair<RetraceClassElementImpl, List<MappedRange>>> mappedRanges;
+  private final List<Pair<RetraceClassElementImpl, List<MemberNamingWithMappedRangesOfName>>>
+      mappedRanges;
   private final RetracerImpl retracer;
 
   RetraceMethodResultImpl(
       RetraceClassResultImpl classResult,
-      List<Pair<RetraceClassElementImpl, List<MappedRange>>> mappedRanges,
+      List<Pair<RetraceClassElementImpl, List<MemberNamingWithMappedRangesOfName>>> mappedRanges,
       MethodDefinition methodDefinition,
-      MethodSignature originalMethodSignature,
       RetracerImpl retracer) {
     this.classResult = classResult;
     this.mappedRanges = mappedRanges;
     this.methodDefinition = methodDefinition;
-    this.originalMethodSignature = originalMethodSignature;
     this.retracer = retracer;
     assert classResult != null;
     assert !mappedRanges.isEmpty();
@@ -53,73 +49,71 @@
     if (mappedRanges.size() > 1) {
       return true;
     }
-    if (originalMethodSignature != null) {
-      return false;
-    }
-    List<MappedRange> methodRanges = mappedRanges.get(0).getSecond();
-    if (methodRanges == null || methodRanges.isEmpty()) {
-      return false;
-    }
-    MappedRange lastRange = methodRanges.get(0);
-    for (MappedRange mappedRange : methodRanges) {
-      if (mappedRange != lastRange
-          && (mappedRange.minifiedRange == null
-              || !mappedRange.minifiedRange.equals(lastRange.minifiedRange))) {
-        return true;
-      }
-    }
-    return false;
+    List<MemberNamingWithMappedRangesOfName> mappedRangesOfNames = mappedRanges.get(0).getSecond();
+    return mappedRangesOfNames != null && mappedRangesOfNames.size() > 1;
   }
 
   @Override
   public boolean isEmpty() {
-    return mappedRanges == null || mappedRanges.isEmpty();
+    List<MemberNamingWithMappedRangesOfName> mappedRangesOfNames = mappedRanges.get(0).getSecond();
+    return mappedRangesOfNames == null || mappedRangesOfNames.isEmpty();
   }
 
   @Override
   public RetraceFrameResultImpl narrowByPosition(
       RetraceStackTraceContext context, OptionalInt position) {
-    List<Pair<RetraceClassElementImpl, List<MappedRange>>> narrowedRanges = new ArrayList<>();
+    List<Pair<RetraceClassElementImpl, List<MemberNamingWithMappedRangesOfName>>> narrowedRanges =
+        new ArrayList<>();
     RetraceStackTraceContextImpl stackTraceContext = null;
     if (context instanceof RetraceStackTraceContextImpl) {
       stackTraceContext = (RetraceStackTraceContextImpl) context;
     }
-    for (Pair<RetraceClassElementImpl, List<MappedRange>> mappedRange : mappedRanges) {
-      if (mappedRange.getSecond() == null) {
+    for (Pair<RetraceClassElementImpl, List<MemberNamingWithMappedRangesOfName>> mappedRange :
+        mappedRanges) {
+      List<MemberNamingWithMappedRangesOfName> memberNamingWithMappedRanges =
+          mappedRange.getSecond();
+      if (memberNamingWithMappedRanges == null) {
         narrowedRanges.add(new Pair<>(mappedRange.getFirst(), null));
         continue;
       }
-      MappedRangesOfName mappedRangesOfElement = new MappedRangesOfName(mappedRange.getSecond());
-      List<MappedRange> mappedRangesForPosition = null;
       boolean hasPosition = position.isPresent() && position.getAsInt() >= 0;
-      if (hasPosition) {
-        mappedRangesForPosition =
-            mappedRangesOfElement.allRangesForLine(position.getAsInt(), false);
-      }
-      if (mappedRangesForPosition == null || mappedRangesForPosition.isEmpty()) {
-        mappedRangesForPosition =
-            hasPosition
-                ? ListUtils.filter(
-                    mappedRangesOfElement.getMappedRanges(), range -> range.minifiedRange == null)
-                : mappedRangesOfElement.getMappedRanges();
-      }
-      if (mappedRangesForPosition != null && !mappedRangesForPosition.isEmpty()) {
-        if (stackTraceContext != null && stackTraceContext.hasRewritePosition()) {
-          List<OutlineCallsiteMappingInformation> outlineCallsiteInformation =
-              ListUtils.last(mappedRangesForPosition).getOutlineCallsiteInformation();
-          if (!outlineCallsiteInformation.isEmpty()) {
-            assert outlineCallsiteInformation.size() == 1
-                : "There can only be one outline entry for a line";
-            return narrowByPosition(
-                stackTraceContext.buildFromThis().clearRewritePosition().build(),
-                OptionalInt.of(
-                    outlineCallsiteInformation
-                        .get(0)
-                        .rewritePosition(stackTraceContext.getRewritePosition())));
+      List<MemberNamingWithMappedRangesOfName> newMemberNamingsResult = new ArrayList<>();
+      for (MemberNamingWithMappedRangesOfName memberNamingWithMappedRange :
+          memberNamingWithMappedRanges) {
+        List<MappedRange> mappedRangesForPosition = null;
+        if (hasPosition) {
+          mappedRangesForPosition =
+              memberNamingWithMappedRange.allRangesForLine(position.getAsInt());
+        }
+        if (mappedRangesForPosition == null || mappedRangesForPosition.isEmpty()) {
+          mappedRangesForPosition =
+              hasPosition
+                  ? memberNamingWithMappedRange.mappedRangesWithNoMinifiedRange()
+                  : memberNamingWithMappedRange.getMappedRanges();
+        }
+        if (mappedRangesForPosition != null && !mappedRangesForPosition.isEmpty()) {
+          MemberNamingWithMappedRangesOfName newMemberNaming =
+              new MemberNamingWithMappedRangesOfName(
+                  memberNamingWithMappedRange.getMemberNaming(),
+                  new MappedRangesOfName(mappedRangesForPosition));
+          newMemberNamingsResult.add(newMemberNaming);
+          if (stackTraceContext != null && stackTraceContext.hasRewritePosition()) {
+            List<OutlineCallsiteMappingInformation> outlineCallsiteInformation =
+                ListUtils.last(mappedRangesForPosition).getOutlineCallsiteInformation();
+            if (!outlineCallsiteInformation.isEmpty()) {
+              assert outlineCallsiteInformation.size() == 1
+                  : "There can only be one outline entry for a line";
+              return narrowByPosition(
+                  stackTraceContext.buildFromThis().clearRewritePosition().build(),
+                  OptionalInt.of(
+                      outlineCallsiteInformation
+                          .get(0)
+                          .rewritePosition(stackTraceContext.getRewritePosition())));
+            }
           }
         }
-        narrowedRanges.add(new Pair<>(mappedRange.getFirst(), mappedRangesForPosition));
       }
+      narrowedRanges.add(new Pair<>(mappedRange.getFirst(), newMemberNamingsResult));
     }
     return new RetraceFrameResultImpl(
         classResult,
@@ -132,48 +126,43 @@
 
   @Override
   public Stream<RetraceMethodElement> stream() {
-    if (originalMethodSignature != null) {
-      // Even if we know exactly the retraced residual definition, the class element
-      // may still be ambiguous.
-      return mappedRanges.stream()
-          .map(
-              mappedRangePair -> {
-                RetraceClassElementImpl classElement = mappedRangePair.getFirst();
-                MethodReference methodReference =
-                    RetraceUtils.methodReferenceFromMethodSignature(
-                        originalMethodSignature,
-                        classElement.getRetracedClass().getClassReference());
-                return new ElementImpl(
-                    this, classElement, RetracedMethodReferenceImpl.create(methodReference));
-              });
-    }
     return mappedRanges.stream()
         .flatMap(
             mappedRangePair -> {
               RetraceClassElementImpl classElement = mappedRangePair.getFirst();
-              List<MappedRange> mappedRanges = mappedRangePair.getSecond();
-              if (mappedRanges == null || mappedRanges.isEmpty()) {
+              List<MemberNamingWithMappedRangesOfName> memberNamingsWithMappedRange =
+                  mappedRangePair.getSecond();
+              if (memberNamingsWithMappedRange == null || memberNamingsWithMappedRange.isEmpty()) {
                 return Stream.of(
                     new ElementImpl(
                         this,
                         classElement,
                         RetracedMethodReferenceImpl.create(
                             methodDefinition.substituteHolder(
-                                classElement.getRetracedClass().getClassReference()))));
+                                classElement.getRetracedClass().getClassReference())),
+                        null));
               }
-              List<ElementImpl> results = new ArrayList<>();
-              Set<MethodReference> seenMethodReferences = new HashSet<>();
-              for (MappedRange mappedRange : mappedRanges) {
-                MethodReference methodReference =
-                    RetraceUtils.methodReferenceFromMappedRange(
-                        mappedRange, classElement.getRetracedClass().getClassReference());
-                if (seenMethodReferences.add(methodReference)) {
-                  results.add(
-                      new ElementImpl(
-                          this, classElement, RetracedMethodReferenceImpl.create(methodReference)));
-                }
-              }
-              return results.stream();
+              return ListUtils.map(
+                  memberNamingsWithMappedRange,
+                  memberNamingWithMappedRangesOfName -> {
+                    MemberNaming memberNaming =
+                        memberNamingWithMappedRangesOfName.getMemberNaming();
+                    MethodSignature originalSignature =
+                        memberNaming != null
+                            ? memberNaming.getOriginalSignature().asMethodSignature()
+                            : ListUtils.last(memberNamingWithMappedRangesOfName.getMappedRanges())
+                                .getOriginalSignature()
+                                .asMethodSignature();
+                    MethodReference methodReference =
+                        RetraceUtils.methodReferenceFromMethodSignature(
+                            originalSignature, classElement.getRetracedClass().getClassReference());
+                    return new ElementImpl(
+                        this,
+                        classElement,
+                        RetracedMethodReferenceImpl.create(methodReference),
+                        memberNamingWithMappedRangesOfName);
+                  })
+                  .stream();
             });
   }
 
@@ -182,19 +171,28 @@
     private final RetracedMethodReferenceImpl methodReference;
     private final RetraceMethodResultImpl retraceMethodResult;
     private final RetraceClassElementImpl classElement;
+    private final MemberNamingWithMappedRangesOfName mapping;
 
     private ElementImpl(
         RetraceMethodResultImpl retraceMethodResult,
         RetraceClassElementImpl classElement,
-        RetracedMethodReferenceImpl methodReference) {
+        RetracedMethodReferenceImpl methodReference,
+        MemberNamingWithMappedRangesOfName mapping) {
       this.classElement = classElement;
       this.retraceMethodResult = retraceMethodResult;
       this.methodReference = methodReference;
+      this.mapping = mapping;
+      assert mapping != null;
     }
 
     @Override
     public boolean isCompilerSynthesized() {
-      throw new Unimplemented("b/172014416");
+      if (mapping.getMemberNaming() != null) {
+        return mapping.getMemberNaming().isCompilerSynthesized();
+      } else {
+        List<MappedRange> mappedRanges = mapping.getMappedRanges();
+        return !mappedRanges.isEmpty() && ListUtils.last(mappedRanges).isCompilerSynthesized();
+      }
     }
 
     @Override
diff --git a/src/main/java/com/android/tools/r8/shaking/MissingClasses.java b/src/main/java/com/android/tools/r8/shaking/MissingClasses.java
index fe4baac..7d23fa4 100644
--- a/src/main/java/com/android/tools/r8/shaking/MissingClasses.java
+++ b/src/main/java/com/android/tools/r8/shaking/MissingClasses.java
@@ -139,7 +139,7 @@
         if (appView.options().ignoreMissingClasses) {
           appView.reporter().warning(diagnostic);
         } else {
-          throw appView.reporter().fatalError(diagnostic);
+          appView.reporter().error(diagnostic);
         }
       }
       return build();
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 cd7460b..69c9714 100644
--- a/src/main/java/com/android/tools/r8/utils/AndroidApiLevel.java
+++ b/src/main/java/com/android/tools/r8/utils/AndroidApiLevel.java
@@ -95,6 +95,8 @@
         return AndroidApiLevel.O;
       case V39:
         return AndroidApiLevel.P;
+      case V40:
+        return AndroidApiLevel.ANDROID_PLATFORM;
       default:
         throw new Unreachable();
     }
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 492c87b..cdac93d 100644
--- a/src/main/java/com/android/tools/r8/utils/DexVersion.java
+++ b/src/main/java/com/android/tools/r8/utils/DexVersion.java
@@ -10,10 +10,11 @@
  * Android dex version
  */
 public enum DexVersion {
-  V35(35, new byte[]{'0', '3', '5'}),
-  V37(37, new byte[]{'0', '3', '7'}),
-  V38(38, new byte[]{'0', '3', '8'}),
-  V39(39, new byte[]{'0', '3', '9'});
+  V35(35, new byte[] {'0', '3', '5'}),
+  V37(37, new byte[] {'0', '3', '7'}),
+  V38(38, new byte[] {'0', '3', '8'}),
+  V39(39, new byte[] {'0', '3', '9'}),
+  V40(40, new byte[] {'0', '4', '0'});
 
   private final int dexVersion;
 
@@ -94,15 +95,23 @@
         return Optional.of(V38);
       case 39:
         return Optional.of(V39);
+      case 40:
+        return Optional.of(V40);
       default:
         return Optional.empty();
     }
   }
 
   public static Optional<DexVersion> getDexVersion(char b0, char b1, char b2) {
-    if (b0 != '0' || b1 != '3' || b2 < '5' || '9' < b2) {
+    if (b0 != '0') {
       return Optional.empty();
     }
-    return getDexVersion(100 * (b0 - '0') + 10 * (b1 - '0') + (b2 - '0'));
+    for (DexVersion candidate : DexVersion.values()) {
+      assert candidate.getBytes()[0] == '0';
+      if (candidate.getBytes()[2] == b2 && candidate.getBytes()[1] == b1) {
+        return Optional.of(candidate);
+      }
+    }
+    return Optional.empty();
   }
 }
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 6bf0a8f..ebd5a13 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -153,6 +153,7 @@
 
   public static final int SUPPORTED_DEX_VERSION =
       AndroidApiLevel.LATEST.getDexVersion().getIntValue();
+  public static final int EXPERIMENTAL_DEX_VERSION = DexVersion.V40.getIntValue();
 
   public static final int ASM_VERSION = Opcodes.ASM9;
 
@@ -1879,6 +1880,8 @@
     private boolean hasReadCheckDeterminism = false;
     private DeterminismChecker determinismChecker = null;
     public boolean usePcEncodingInCfForTesting = false;
+    public boolean dexContainerExperiment =
+        System.getProperty("com.android.tools.r8.dexContainerExperiment") != null;
 
     // Testing options to analyse locality of items in DEX files when they are generated.
     public boolean calculateItemUseCountInDex = false;
diff --git a/src/main/java/com/android/tools/r8/utils/positions/MappedPositionToClassNameMapperBuilder.java b/src/main/java/com/android/tools/r8/utils/positions/MappedPositionToClassNameMapperBuilder.java
index b87a2b5..646e09e 100644
--- a/src/main/java/com/android/tools/r8/utils/positions/MappedPositionToClassNameMapperBuilder.java
+++ b/src/main/java/com/android/tools/r8/utils/positions/MappedPositionToClassNameMapperBuilder.java
@@ -179,7 +179,7 @@
                   FieldSignature.fromDexField(originalField, originalField.holder != originalType);
               FieldSignature residualSignature = FieldSignature.fromDexField(residualField);
               MemberNaming memberNaming = new MemberNaming(originalSignature, residualSignature);
-              getBuilder().addMemberEntry(memberNaming, residualSignature);
+              getBuilder().addMemberEntry(memberNaming);
             }
           });
       return this;
@@ -227,7 +227,7 @@
       MethodSignature residualSignature = MethodSignature.fromDexMethod(residualMethod);
 
       MemberNaming memberNaming = new MemberNaming(originalSignature, residualSignature);
-      getBuilder().addMemberEntry(memberNaming, residualSignature);
+      getBuilder().addMemberEntry(memberNaming);
 
       // Add simple "a() -> b" mapping if we won't have any other with concrete line numbers
       if (mappedPositions.isEmpty()) {
diff --git a/src/test/examplesJava9/timeunit/Example.java b/src/test/examplesJava11/timeunit/Example.java
similarity index 85%
rename from src/test/examplesJava9/timeunit/Example.java
rename to src/test/examplesJava11/timeunit/Example.java
index 09e1d0c..003f8a4 100644
--- a/src/test/examplesJava9/timeunit/Example.java
+++ b/src/test/examplesJava11/timeunit/Example.java
@@ -4,6 +4,7 @@
 
 package timeunit;
 
+import java.time.Duration;
 import java.time.temporal.ChronoUnit;
 import java.util.concurrent.TimeUnit;
 
@@ -12,5 +13,6 @@
   public static void main(String[] args) {
     TimeUnit timeUnit = TimeUnit.of(ChronoUnit.NANOS);
     System.out.println(timeUnit.toChronoUnit());
+    System.out.println(timeUnit.convert(Duration.ZERO));
   }
 }
diff --git a/src/test/examplesJava9/stringconcatfactory/StringConcatFactoryUsage.java b/src/test/examplesJava9/stringconcatfactory/StringConcatFactoryUsage.java
new file mode 100644
index 0000000..3c9713d
--- /dev/null
+++ b/src/test/examplesJava9/stringconcatfactory/StringConcatFactoryUsage.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 stringconcatfactory;
+
+public class StringConcatFactoryUsage {
+
+  public static void main(String[] args) {
+    System.out.println("Hello " + args.length);
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/CompileWithJdkClassFileProviderTest.java b/src/test/java/com/android/tools/r8/CompileWithJdkClassFileProviderTest.java
index 8ba7823..92604de 100644
--- a/src/test/java/com/android/tools/r8/CompileWithJdkClassFileProviderTest.java
+++ b/src/test/java/com/android/tools/r8/CompileWithJdkClassFileProviderTest.java
@@ -12,6 +12,7 @@
 import com.android.tools.r8.ToolHelper.DexVm;
 import com.android.tools.r8.diagnostic.MissingDefinitionsDiagnostic;
 import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.UnverifiableCfCodeDiagnostic;
 import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -95,7 +96,9 @@
             diagnostics -> {
               diagnostics.assertErrorsMatch(
                   diagnosticMessage(containsString("java.util.concurrent.Flow$Subscriber")));
-              diagnostics.assertOnlyErrors();
+              // TODO(b/251482856): Unexpected unverifiable code.
+              diagnostics.assertWarningsMatch(diagnosticType(UnverifiableCfCodeDiagnostic.class));
+              diagnostics.assertNoInfos();
               if (parameters.isDexRuntime()) {
                 // TODO(b/175659048): This should likely be a desugar diagnostic.
                 diagnostics.assertErrorsMatch(diagnosticType(MissingDefinitionsDiagnostic.class));
diff --git a/src/test/java/com/android/tools/r8/FailCompilationOnFutureVersionsTest.java b/src/test/java/com/android/tools/r8/FailCompilationOnFutureVersionsTest.java
index f7be6ca..b6f5848 100644
--- a/src/test/java/com/android/tools/r8/FailCompilationOnFutureVersionsTest.java
+++ b/src/test/java/com/android/tools/r8/FailCompilationOnFutureVersionsTest.java
@@ -22,7 +22,7 @@
 public class FailCompilationOnFutureVersionsTest extends TestBase {
 
   static final int UNSUPPORTED_CF_VERSION = InternalOptions.SUPPORTED_CF_VERSION.major() + 1;
-  static final int UNSUPPORTED_DEX_VERSION = InternalOptions.SUPPORTED_DEX_VERSION + 1;
+  static final int UNSUPPORTED_DEX_VERSION = InternalOptions.EXPERIMENTAL_DEX_VERSION + 1;
 
   private final TestParameters parameters;
 
@@ -68,6 +68,40 @@
   }
 
   @Test
+  public void testExperimentatDexVersion() throws CompilationFailedException, IOException {
+    // Generate a DEX file with a version higher than the supported one.
+    Path out =
+        testForD8()
+            .addProgramClasses(TestClass.class)
+            .setMinApi(parameters.getApiLevel())
+            .addOptionsModification(
+                options ->
+                    options.testing.forceDexVersionBytes =
+                        ("0" + InternalOptions.EXPERIMENTAL_DEX_VERSION).getBytes())
+            .compile()
+            .writeToZip();
+    try {
+      testForD8()
+          .addProgramFiles(out)
+          .setMinApi(parameters.getApiLevel())
+          .compileWithExpectedDiagnostics(
+              diagnotics -> {
+                diagnotics.assertOnlyErrors();
+                diagnotics.assertErrorsCount(1);
+                assertThat(
+                    diagnotics.getErrors().get(0).getDiagnosticMessage(),
+                    containsString(
+                        "Dex file with version '"
+                            + InternalOptions.EXPERIMENTAL_DEX_VERSION
+                            + "' cannot be used with min sdk level "));
+              });
+    } catch (CompilationFailedException e) {
+      return;
+    }
+    fail("Expected compilation error");
+  }
+
+  @Test
   public void testCf() {
     try {
       testForD8()
diff --git a/src/test/java/com/android/tools/r8/L8TestCompileResult.java b/src/test/java/com/android/tools/r8/L8TestCompileResult.java
index fd5af1c..30744c3 100644
--- a/src/test/java/com/android/tools/r8/L8TestCompileResult.java
+++ b/src/test/java/com/android/tools/r8/L8TestCompileResult.java
@@ -77,7 +77,7 @@
   }
 
   public <E extends Throwable> L8TestCompileResult inspectKeepRules(
-      ThrowingConsumer<List<String>, E> consumer) throws Throwable {
+      ThrowingConsumer<List<String>, E> consumer) throws E {
     consumer.accept(allKeepRules);
     return self();
   }
diff --git a/src/test/java/com/android/tools/r8/R8CfVersionTest.java b/src/test/java/com/android/tools/r8/R8CfVersionTest.java
index fcc29c1..d7ab6c8 100644
--- a/src/test/java/com/android/tools/r8/R8CfVersionTest.java
+++ b/src/test/java/com/android/tools/r8/R8CfVersionTest.java
@@ -18,7 +18,7 @@
 @RunWith(Parameterized.class)
 public class R8CfVersionTest extends TestBase {
 
-  private final CfVersion targetVersion = CfVersion.V1_8;
+  private final CfVersion targetVersion = CfVersion.V11;
 
   @Parameters(name = "{0}")
   public static TestParametersCollection data() {
diff --git a/src/test/java/com/android/tools/r8/R8TestCompileResult.java b/src/test/java/com/android/tools/r8/R8TestCompileResult.java
index 2d25b7c..688ab43 100644
--- a/src/test/java/com/android/tools/r8/R8TestCompileResult.java
+++ b/src/test/java/com/android/tools/r8/R8TestCompileResult.java
@@ -178,7 +178,7 @@
         "Did you forget a keep rule for the run method?", mainFeatureClassSubject, isPresent());
     assertThat(
         "Did you forget a keep rule for the run method?",
-        mainFeatureClassSubject.uniqueMethodWithName("run"),
+        mainFeatureClassSubject.uniqueMethodWithOriginalName("run"),
         isPresent());
     String[] args = new String[2 + featureDependencies.length];
     args[0] = mainFeatureClassSubject.getFinalName();
diff --git a/src/test/java/com/android/tools/r8/TestBase.java b/src/test/java/com/android/tools/r8/TestBase.java
index a575af1..93f6288 100644
--- a/src/test/java/com/android/tools/r8/TestBase.java
+++ b/src/test/java/com/android/tools/r8/TestBase.java
@@ -46,7 +46,6 @@
 import com.android.tools.r8.jasmin.JasminBuilder;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.origin.PathOrigin;
-import com.android.tools.r8.profile.art.ArtProfileCollection;
 import com.android.tools.r8.references.ClassReference;
 import com.android.tools.r8.references.FieldReference;
 import com.android.tools.r8.references.MethodReference;
@@ -174,6 +173,11 @@
     return ExternalR8TestBuilder.create(new TestState(temp), backend, runtime);
   }
 
+  public static ExternalR8TestBuilder testForExternalR8(TemporaryFolder temp, Backend backend) {
+    return ExternalR8TestBuilder.create(
+        new TestState(temp), backend, TestRuntime.getSystemRuntime());
+  }
+
   public static D8TestBuilder testForD8(TemporaryFolder temp, Backend backend) {
     return D8TestBuilder.create(new TestState(temp), backend);
   }
@@ -214,6 +218,10 @@
     return testForExternalR8(temp, backend, runtime);
   }
 
+  public ExternalR8TestBuilder testForExternalR8(Backend backend) {
+    return testForExternalR8(temp, backend, TestRuntime.getSystemRuntime());
+  }
+
   public D8TestBuilder testForD8() {
     return testForD8(temp, Backend.DEX);
   }
diff --git a/src/test/java/com/android/tools/r8/TestCompilerBuilder.java b/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
index 165cd83..cd6df4f 100644
--- a/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
+++ b/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
@@ -10,7 +10,6 @@
 
 import com.android.tools.r8.TestBase.Backend;
 import com.android.tools.r8.benchmarks.BenchmarkResults;
-import com.android.tools.r8.debug.DebugTestConfig;
 import com.android.tools.r8.optimize.argumentpropagation.ArgumentPropagatorEventConsumer;
 import com.android.tools.r8.optimize.argumentpropagation.codescanner.MethodStateCollectionByReference;
 import com.android.tools.r8.testing.AndroidBuildVersion;
@@ -32,6 +31,7 @@
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import java.util.Optional;
 import java.util.Set;
@@ -226,6 +226,18 @@
     return internalCompileAndBenchmark(null);
   }
 
+  private Collection<Path> getDefaultLibraryFiles() {
+    if (backend == Backend.DEX) {
+      assert builder.isMinApiLevelSet();
+      return Collections.singletonList(
+          ToolHelper.getFirstSupportedAndroidJar(
+              AndroidApiLevel.getAndroidApiLevel(builder.getMinApiLevel())));
+    } else {
+      assert backend == Backend.CF;
+      return Collections.singletonList(ToolHelper.getJava8RuntimeJar());
+    }
+  }
+
   private CR internalCompileAndBenchmark(BenchmarkResults benchmark)
       throws CompilationFailedException {
     AndroidAppConsumers sink = new AndroidAppConsumers();
@@ -249,14 +261,7 @@
     }
     builder.setOptimizeMultidexForLinearAlloc(optimizeMultidexForLinearAlloc);
     if (useDefaultRuntimeLibrary) {
-      if (backend == Backend.DEX) {
-        assert builder.isMinApiLevelSet();
-        builder.addLibraryFiles(
-            ToolHelper.getFirstSupportedAndroidJar(
-                AndroidApiLevel.getAndroidApiLevel(builder.getMinApiLevel())));
-      } else {
-        builder.addLibraryFiles(TestBase.runtimeJar(backend));
-      }
+      builder.addLibraryFiles(getDefaultLibraryFiles());
     }
     assertNull(oldStdout);
     oldStdout = System.out;
diff --git a/src/test/java/com/android/tools/r8/TestRuntime.java b/src/test/java/com/android/tools/r8/TestRuntime.java
index 3524d63..0d937dd 100644
--- a/src/test/java/com/android/tools/r8/TestRuntime.java
+++ b/src/test/java/com/android/tools/r8/TestRuntime.java
@@ -10,6 +10,7 @@
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.ListUtils;
+import com.android.tools.r8.utils.structural.Ordered;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableList.Builder;
 import com.google.common.collect.ImmutableMap;
@@ -28,7 +29,7 @@
 public abstract class TestRuntime {
 
   // Enum describing the possible/supported CF runtimes.
-  public enum CfVm {
+  public enum CfVm implements Ordered<CfVm> {
     JDK8("jdk8", 52),
     JDK9("jdk9", 53),
     JDK10("jdk10", 54),
@@ -66,17 +67,21 @@
     }
 
     public boolean lessThan(CfVm other) {
-      return this.ordinal() < other.ordinal();
+      return isLessThan(other);
     }
 
     public boolean lessThanOrEqual(CfVm other) {
-      return this.ordinal() <= other.ordinal();
+      return isLessThanOrEqualTo(other);
     }
 
     @Override
     public String toString() {
       return name;
     }
+
+    public static CfVm getMinimumSystemVersion() {
+      return JDK11;
+    }
   }
 
   private static final Path JDK8_PATH = Paths.get(ToolHelper.THIRD_PARTY_DIR, "openjdk", "jdk8");
diff --git a/src/test/java/com/android/tools/r8/TestState.java b/src/test/java/com/android/tools/r8/TestState.java
index 601208f..6b01a75 100644
--- a/src/test/java/com/android/tools/r8/TestState.java
+++ b/src/test/java/com/android/tools/r8/TestState.java
@@ -12,7 +12,7 @@
 public class TestState {
 
   private final TemporaryFolder temp;
-  private final TestDiagnosticMessagesImpl messages = new TestDiagnosticMessagesImpl();
+  private final TestDiagnosticMessagesImpl messages;
 
   private Set<String> mainDexClasses;
 
@@ -20,7 +20,12 @@
   private String stderr;
 
   public TestState(TemporaryFolder temp) {
+    this(temp, new TestDiagnosticMessagesImpl());
+  }
+
+  public TestState(TemporaryFolder temp, TestDiagnosticMessagesImpl handler) {
     this.temp = temp;
+    this.messages = handler;
   }
 
   public TemporaryFolder getTempFolder() {
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationProguardCompatTest.java b/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationProguardCompatTest.java
index 1307d62..0381e87 100644
--- a/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationProguardCompatTest.java
+++ b/src/test/java/com/android/tools/r8/accessrelaxation/AccessRelaxationProguardCompatTest.java
@@ -70,7 +70,7 @@
     ClassSubject classSubject = inspector.clazz(clazzWithGetter);
     assertThat(classSubject, isPresent());
 
-    FieldSubject fieldSubject = classSubject.uniqueFieldWithName("field");
+    FieldSubject fieldSubject = classSubject.uniqueFieldWithOriginalName("field");
     assertThat(fieldSubject, isPresent());
 
     // Although this field was explicitly kept, it is no longer private.
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/EffectiveFinalFieldMarkedFinalTest.java b/src/test/java/com/android/tools/r8/accessrelaxation/EffectiveFinalFieldMarkedFinalTest.java
index b1c5fc8..ce4dc72 100644
--- a/src/test/java/com/android/tools/r8/accessrelaxation/EffectiveFinalFieldMarkedFinalTest.java
+++ b/src/test/java/com/android/tools/r8/accessrelaxation/EffectiveFinalFieldMarkedFinalTest.java
@@ -49,10 +49,10 @@
               ClassSubject mainClassSubject = inspector.clazz(Main.class);
               assertThat(mainClassSubject, isPresent());
               assertThat(
-                  mainClassSubject.uniqueFieldWithName("instanceField"),
+                  mainClassSubject.uniqueFieldWithOriginalName("instanceField"),
                   allOf(isPresent(), onlyIf(allowAccessModification, isFinal())));
               assertThat(
-                  mainClassSubject.uniqueFieldWithName("staticField"),
+                  mainClassSubject.uniqueFieldWithOriginalName("staticField"),
                   allOf(isPresent(), onlyIf(allowAccessModification, isFinal())));
             })
         .run(parameters.getRuntime(), Main.class)
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/PackagePrivateOverridePublicizerBottomTest.java b/src/test/java/com/android/tools/r8/accessrelaxation/PackagePrivateOverridePublicizerBottomTest.java
index 45ddf3e..3358771 100644
--- a/src/test/java/com/android/tools/r8/accessrelaxation/PackagePrivateOverridePublicizerBottomTest.java
+++ b/src/test/java/com/android/tools/r8/accessrelaxation/PackagePrivateOverridePublicizerBottomTest.java
@@ -70,7 +70,8 @@
               ClassSubject subViewModelSubject =
                   inspector.clazz(DescriptorUtils.descriptorToJavaType(NEW_DESCRIPTOR));
               assertThat(subViewModelSubject, isPresent());
-              MethodSubject clearSubject = subViewModelSubject.uniqueMethodWithName("clear");
+              MethodSubject clearSubject =
+                  subViewModelSubject.uniqueMethodWithOriginalName("clear");
               assertThat(clearSubject, isPresent());
               assertTrue(clearSubject.isPublic());
             });
diff --git a/src/test/java/com/android/tools/r8/accessrelaxation/PrivateKeptMembersPublicizerTest.java b/src/test/java/com/android/tools/r8/accessrelaxation/PrivateKeptMembersPublicizerTest.java
index 61c1d77..3aeeb72 100644
--- a/src/test/java/com/android/tools/r8/accessrelaxation/PrivateKeptMembersPublicizerTest.java
+++ b/src/test/java/com/android/tools/r8/accessrelaxation/PrivateKeptMembersPublicizerTest.java
@@ -71,11 +71,11 @@
     ClassSubject classSubject = inspector.clazz(TestClass.class);
     assertThat(classSubject, isPresent());
     if (withKeepAllowAccessModification) {
-      assertThat(classSubject.uniqueFieldWithName("greeting"), isPublic());
-      assertThat(classSubject.uniqueMethodWithName("greet"), isPublic());
+      assertThat(classSubject.uniqueFieldWithOriginalName("greeting"), isPublic());
+      assertThat(classSubject.uniqueMethodWithOriginalName("greet"), isPublic());
     } else {
-      assertThat(classSubject.uniqueFieldWithName("greeting"), isPrivate());
-      assertThat(classSubject.uniqueMethodWithName("greet"), isPrivate());
+      assertThat(classSubject.uniqueFieldWithOriginalName("greeting"), isPrivate());
+      assertThat(classSubject.uniqueMethodWithOriginalName("greet"), isPrivate());
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/annotations/DalvikAnnotationOptimizationTest.java b/src/test/java/com/android/tools/r8/annotations/DalvikAnnotationOptimizationTest.java
index 59e8923..af2e5df 100644
--- a/src/test/java/com/android/tools/r8/annotations/DalvikAnnotationOptimizationTest.java
+++ b/src/test/java/com/android/tools/r8/annotations/DalvikAnnotationOptimizationTest.java
@@ -81,7 +81,7 @@
             : ImmutableSet.of();
     assertEquals(
         expected,
-        inspector.clazz(TestClass.class).uniqueMethodWithName("main").annotations().stream()
+        inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("main").annotations().stream()
             .map(s -> s.getAnnotation().type.getDescriptor().toSourceString())
             .collect(Collectors.toSet()));
   }
diff --git a/src/test/java/com/android/tools/r8/apimodel/AndroidApiVersionsXmlParser.java b/src/test/java/com/android/tools/r8/apimodel/AndroidApiVersionsXmlParser.java
index 8e8f4ee..97f6cd0 100644
--- a/src/test/java/com/android/tools/r8/apimodel/AndroidApiVersionsXmlParser.java
+++ b/src/test/java/com/android/tools/r8/apimodel/AndroidApiVersionsXmlParser.java
@@ -86,7 +86,7 @@
               getMaxAndroidApiLevelFromNode(memberNode, apiLevel));
         } else if (isField(memberNode)) {
           // The field do not have descriptors and are supposed to be unique.
-          FieldSubject fieldSubject = clazz.uniqueFieldWithName(getName(memberNode));
+          FieldSubject fieldSubject = clazz.uniqueFieldWithOriginalName(getName(memberNode));
           if (!fieldSubject.isPresent()) {
             assert hasRemoved(memberNode);
             assert getRemoved(memberNode).isLessThanOrEqualTo(maxApiLevel);
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelInlineInSameClassTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelInlineInSameClassTest.java
index f351779..284fbd5 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelInlineInSameClassTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelInlineInSameClassTest.java
@@ -63,7 +63,7 @@
               if (parameters.isDexRuntime()
                   && parameters.getApiLevel().isGreaterThanOrEqualTo(L_MR1)) {
                 ClassSubject mainSubject = inspector.clazz(Main.class);
-                MethodSubject mainMethodSubject = mainSubject.uniqueMethodWithName("main");
+                MethodSubject mainMethodSubject = mainSubject.uniqueMethodWithOriginalName("main");
                 assertThat(mainMethodSubject, isPresent());
                 assertThat(mainMethodSubject, CodeMatchers.invokesMethodWithName("apiLevel22"));
               }
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockMergeProgramDefinedDuplicateTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockMergeProgramDefinedDuplicateTest.java
index c8c4fe2..409cd9b 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockMergeProgramDefinedDuplicateTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockMergeProgramDefinedDuplicateTest.java
@@ -135,8 +135,8 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject libraryClassSubject = inspector.clazz(LibraryClass.class);
     assertThat(libraryClassSubject, isPresent());
-    assertThat(libraryClassSubject.uniqueMethodWithName("foo"), isPresent());
-    assertThat(libraryClassSubject.uniqueMethodWithName("bar"), isPresent());
+    assertThat(libraryClassSubject.uniqueMethodWithOriginalName("foo"), isPresent());
+    assertThat(libraryClassSubject.uniqueMethodWithOriginalName("bar"), isPresent());
   }
 
   private void checkOutput(SingleTestRunResult<?> runResult) {
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockMergeTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockMergeTest.java
index dea3e93..b2611de 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelMockMergeTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelMockMergeTest.java
@@ -136,8 +136,8 @@
       assertThat(libraryClassSubject, isAbsent());
     } else {
       assertThat(libraryClassSubject, isPresent());
-      assertThat(libraryClassSubject.uniqueMethodWithName("foo"), isAbsent());
-      assertThat(libraryClassSubject.uniqueMethodWithName("bar"), isAbsent());
+      assertThat(libraryClassSubject.uniqueMethodWithOriginalName("foo"), isAbsent());
+      assertThat(libraryClassSubject.uniqueMethodWithOriginalName("bar"), isAbsent());
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfDefaultInterfaceMethodsTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfDefaultInterfaceMethodsTest.java
index 9a243d3..c69756a 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfDefaultInterfaceMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfDefaultInterfaceMethodsTest.java
@@ -67,7 +67,8 @@
                   assert parameters.canUseDefaultAndStaticInterfaceMethods();
                   assertThat(apiCaller, isPresent());
                   assertThat(aSubject, isPresent());
-                  MethodSubject callApiLevel = apiCaller.uniqueMethodWithName("callApiLevel");
+                  MethodSubject callApiLevel =
+                      apiCaller.uniqueMethodWithOriginalName("callApiLevel");
                   assertThat(callApiLevel, CodeMatchers.invokesMethodWithName("apiLevel22"));
                 } else {
                   assert parameters.isDexRuntime();
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfLambdaTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfLambdaTest.java
index ed7b9eb..e5967cd 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfLambdaTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelNoInliningOfLambdaTest.java
@@ -77,13 +77,13 @@
               } else {
                 assertThat(action, isPresent());
                 MethodSubject action$lambda$getAction$0 =
-                    action.uniqueMethodWithName("lambda$getAction$0");
+                    action.uniqueMethodWithOriginalName("lambda$getAction$0");
                 assertThat(action$lambda$getAction$0, isPresent());
                 assertThat(
                     action$lambda$getAction$0, CodeMatchers.invokesMethodWithName("apiLevel22"));
 
                 assertThat(apiCaller, isPresent());
-                MethodSubject callApi = apiCaller.uniqueMethodWithName("callApi");
+                MethodSubject callApi = apiCaller.uniqueMethodWithOriginalName("callApi");
                 assertThat(callApi, isPresent());
                 assertThat(callApi, CodeMatchers.invokesMethodWithName("apiLevel22"));
               }
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelTypeStrengtheningAboveMinApiTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelTypeStrengtheningAboveMinApiTest.java
index d974c7a..e2f517c 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelTypeStrengtheningAboveMinApiTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelTypeStrengtheningAboveMinApiTest.java
@@ -51,7 +51,8 @@
         .compile()
         .inspect(
             inspector -> {
-              FieldSubject fieldSubject = inspector.clazz(Main.class).uniqueFieldWithName("FIELD");
+              FieldSubject fieldSubject =
+                  inspector.clazz(Main.class).uniqueFieldWithOriginalName("FIELD");
               assertThat(fieldSubject, isPresent());
               assertEquals(
                   ApiLevel22.class.getTypeName(), fieldSubject.getField().getType().getTypeName());
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelTypeStrengtheningTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelTypeStrengtheningTest.java
index 1d17e5c..aea9a60 100644
--- a/src/test/java/com/android/tools/r8/apimodel/ApiModelTypeStrengtheningTest.java
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelTypeStrengtheningTest.java
@@ -56,7 +56,8 @@
             inspector -> {
               Class<?> expectedFieldType =
                   isTypeStrengtheningSafe ? ApiLevel23.class : ApiLevel22.class;
-              FieldSubject fieldSubject = inspector.clazz(Main.class).uniqueFieldWithName("FIELD");
+              FieldSubject fieldSubject =
+                  inspector.clazz(Main.class).uniqueFieldWithOriginalName("FIELD");
               assertThat(fieldSubject, isPresent());
               assertEquals(
                   expectedFieldType.getTypeName(), fieldSubject.getField().getType().getTypeName());
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/KeepAbstractMethodShadowingTest.java b/src/test/java/com/android/tools/r8/bridgeremoval/KeepAbstractMethodShadowingTest.java
index 04cacdf..d151f76 100644
--- a/src/test/java/com/android/tools/r8/bridgeremoval/KeepAbstractMethodShadowingTest.java
+++ b/src/test/java/com/android/tools/r8/bridgeremoval/KeepAbstractMethodShadowingTest.java
@@ -57,7 +57,7 @@
             inspector -> {
               ClassSubject clazz = inspector.clazz(B.class);
               assertThat(clazz, isPresent());
-              MethodSubject foo = clazz.uniqueMethodWithName("foo");
+              MethodSubject foo = clazz.uniqueMethodWithOriginalName("foo");
               assertThat(foo, isPresent());
             });
   }
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/bridgestokeep/KeepNonVisibilityBridgeMethodsTest.java b/src/test/java/com/android/tools/r8/bridgeremoval/bridgestokeep/KeepNonVisibilityBridgeMethodsTest.java
index 2472119..b63a54d 100644
--- a/src/test/java/com/android/tools/r8/bridgeremoval/bridgestokeep/KeepNonVisibilityBridgeMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/bridgeremoval/bridgestokeep/KeepNonVisibilityBridgeMethodsTest.java
@@ -71,7 +71,7 @@
               ClassSubject classSubject = inspector.clazz(SimpleDataAdapter.class);
               assertThat(classSubject, isPresent());
 
-              MethodSubject subject = classSubject.uniqueMethodWithName("registerObserver");
+              MethodSubject subject = classSubject.uniqueMethodWithOriginalName("registerObserver");
               assertThat(subject, isPresent());
             })
         .run(parameters.getRuntime(), Main.class)
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/BridgeHoistingAccessibilityTest.java b/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/BridgeHoistingAccessibilityTest.java
index eac0142..f0e4af3 100644
--- a/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/BridgeHoistingAccessibilityTest.java
+++ b/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/BridgeHoistingAccessibilityTest.java
@@ -91,20 +91,20 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject aClassSubject = inspector.clazz(BridgeHoistingAccessibilityTestClasses.A.class);
     assertThat(aClassSubject, isPresent());
-    assertThat(aClassSubject.uniqueMethodWithName("m"), isPresent());
-    assertThat(aClassSubject.uniqueMethodWithName("bridgeC"), isPresent());
+    assertThat(aClassSubject.uniqueMethodWithOriginalName("m"), isPresent());
+    assertThat(aClassSubject.uniqueMethodWithOriginalName("bridgeC"), isPresent());
 
     ClassSubject bClassSubject = inspector.clazz(B.class);
     assertThat(bClassSubject, isPresent());
-    assertThat(bClassSubject.uniqueMethodWithName("bridgeB"), isPresent());
+    assertThat(bClassSubject.uniqueMethodWithOriginalName("bridgeB"), isPresent());
 
     ClassSubject cClassSubject = inspector.clazz(C.class);
     assertThat(cClassSubject, isPresent());
 
     ClassSubject axClassSubject = inspector.clazz(AWithRangedInvoke.class);
     assertThat(axClassSubject, isPresent());
-    assertThat(axClassSubject.uniqueMethodWithName("m"), isPresent());
-    assertThat(axClassSubject.uniqueMethodWithName("bridgeC"), isPresent());
+    assertThat(axClassSubject.uniqueMethodWithOriginalName("m"), isPresent());
+    assertThat(axClassSubject.uniqueMethodWithOriginalName("bridgeC"), isPresent());
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/BridgeToPackagePrivateMethodThatOverridesPublicMethodTest.java b/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/BridgeToPackagePrivateMethodThatOverridesPublicMethodTest.java
index b273533..af36954 100644
--- a/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/BridgeToPackagePrivateMethodThatOverridesPublicMethodTest.java
+++ b/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/BridgeToPackagePrivateMethodThatOverridesPublicMethodTest.java
@@ -71,7 +71,7 @@
               assertThat(baseClassSubject, isPresent());
 
               MethodSubject bridgeOnBaseMethodSubject =
-                  baseClassSubject.uniqueMethodWithName("bridge");
+                  baseClassSubject.uniqueMethodWithOriginalName("bridge");
               assertThat(bridgeOnBaseMethodSubject, isPresent());
 
               // Inspect A. This should have the bridge method unless it is removed by the
@@ -79,7 +79,8 @@
               ClassSubject aClassSubject = inspector.clazz(A.class);
               assertThat(aClassSubject, isPresent());
 
-              MethodSubject bridgeOnAMethodSubject = aClassSubject.uniqueMethodWithName("bridge");
+              MethodSubject bridgeOnAMethodSubject =
+                  aClassSubject.uniqueMethodWithOriginalName("bridge");
               assertThat(bridgeOnAMethodSubject, notIf(isPresent(), removeBridgeMethodFromA));
 
               // Inspect B. This should not have a bridge method, as the bridge in C is not eligible
@@ -88,17 +89,19 @@
                   inspector.clazz(DescriptorUtils.descriptorToJavaType(TRANSFORMED_B_DESCRIPTOR));
               assertThat(bClassSubject, isPresent());
 
-              MethodSubject bridgeMethodSubject = bClassSubject.uniqueMethodWithName("bridge");
+              MethodSubject bridgeMethodSubject =
+                  bClassSubject.uniqueMethodWithOriginalName("bridge");
               assertThat(bridgeMethodSubject, isAbsent());
 
-              MethodSubject testMethodSubject = bClassSubject.uniqueMethodWithName("test");
+              MethodSubject testMethodSubject = bClassSubject.uniqueMethodWithOriginalName("test");
               assertThat(testMethodSubject, isPresent());
 
               // Inspect C. The method C.bridge() is never eligible for hoisting.
               ClassSubject cClassSubject = inspector.clazz(C.class);
               assertThat(cClassSubject, isPresent());
 
-              MethodSubject bridgeOnCMethodSubject = cClassSubject.uniqueMethodWithName("bridge");
+              MethodSubject bridgeOnCMethodSubject =
+                  cClassSubject.uniqueMethodWithOriginalName("bridge");
               assertThat(bridgeOnCMethodSubject, isPresent());
             })
         .run(parameters.getRuntime(), Main.class)
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/FinalBridgeHoistingTest.java b/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/FinalBridgeHoistingTest.java
index bf958f8..34ea8d3 100644
--- a/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/FinalBridgeHoistingTest.java
+++ b/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/FinalBridgeHoistingTest.java
@@ -56,16 +56,16 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject aClassSubject = inspector.clazz(A.class);
     assertThat(aClassSubject, isPresent());
-    assertThat(aClassSubject.uniqueMethodWithName("m"), isPresent());
-    assertThat(aClassSubject.uniqueMethodWithName("virtualBridge"), isPresent());
+    assertThat(aClassSubject.uniqueMethodWithOriginalName("m"), isPresent());
+    assertThat(aClassSubject.uniqueMethodWithOriginalName("virtualBridge"), isPresent());
 
     ClassSubject b1ClassSubject = inspector.clazz(B1.class);
     assertThat(b1ClassSubject, isPresent());
-    assertThat(b1ClassSubject.uniqueMethodWithName("virtualBridge"), isPresent());
+    assertThat(b1ClassSubject.uniqueMethodWithOriginalName("virtualBridge"), isPresent());
 
     ClassSubject b2ClassSubject = inspector.clazz(B2.class);
     assertThat(b2ClassSubject, isPresent());
-    assertThat(b2ClassSubject.uniqueMethodWithName("virtualBridge"), not(isPresent()));
+    assertThat(b2ClassSubject.uniqueMethodWithOriginalName("virtualBridge"), not(isPresent()));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/KeptBridgeHoistingTest.java b/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/KeptBridgeHoistingTest.java
index 458a8d2..13cd7b4 100644
--- a/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/KeptBridgeHoistingTest.java
+++ b/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/KeptBridgeHoistingTest.java
@@ -57,11 +57,11 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject aClassSubject = inspector.clazz(A.class);
     assertThat(aClassSubject, isPresent());
-    assertThat(aClassSubject.uniqueMethodWithName("m"), isPresent());
+    assertThat(aClassSubject.uniqueMethodWithOriginalName("m"), isPresent());
 
     ClassSubject bClassSubject = inspector.clazz(B.class);
     assertThat(bClassSubject, isPresent());
-    assertThat(bClassSubject.uniqueMethodWithName("bridge"), isPresent());
+    assertThat(bClassSubject.uniqueMethodWithOriginalName("bridge"), isPresent());
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/NonReboundBridgeHoistingTest.java b/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/NonReboundBridgeHoistingTest.java
index 02c948c..dd3f482 100644
--- a/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/NonReboundBridgeHoistingTest.java
+++ b/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/NonReboundBridgeHoistingTest.java
@@ -55,16 +55,16 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject aClassSubject = inspector.clazz(NonReboundBridgeHoistingTestClasses.getClassA());
     assertThat(aClassSubject, isPresent());
-    assertThat(aClassSubject.uniqueMethodWithName("m"), isPresent());
-    assertThat(aClassSubject.uniqueMethodWithName("bridge"), isPresent());
+    assertThat(aClassSubject.uniqueMethodWithOriginalName("m"), isPresent());
+    assertThat(aClassSubject.uniqueMethodWithOriginalName("bridge"), isPresent());
 
     ClassSubject bClassSubject = inspector.clazz(NonReboundBridgeHoistingTestClasses.B.class);
     assertThat(bClassSubject, isPresent());
-    assertThat(bClassSubject.uniqueMethodWithName("bridge"), not(isPresent()));
+    assertThat(bClassSubject.uniqueMethodWithOriginalName("bridge"), not(isPresent()));
 
     ClassSubject cClassSubject = inspector.clazz(C.class);
     assertThat(cClassSubject, isPresent());
-    assertThat(cClassSubject.uniqueMethodWithName("bridge"), not(isPresent()));
+    assertThat(cClassSubject.uniqueMethodWithOriginalName("bridge"), not(isPresent()));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/NonSuperclassBridgeHoistingTest.java b/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/NonSuperclassBridgeHoistingTest.java
index ff05bfd..6264e0c 100644
--- a/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/NonSuperclassBridgeHoistingTest.java
+++ b/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/NonSuperclassBridgeHoistingTest.java
@@ -63,8 +63,8 @@
 
     ClassSubject b1ClassSubject = inspector.clazz(B.class);
     assertThat(b1ClassSubject, isPresent());
-    assertThat(b1ClassSubject.uniqueMethodWithName("m"), isPresent());
-    assertThat(b1ClassSubject.uniqueMethodWithName("bridge"), isPresent());
+    assertThat(b1ClassSubject.uniqueMethodWithOriginalName("m"), isPresent());
+    assertThat(b1ClassSubject.uniqueMethodWithOriginalName("bridge"), isPresent());
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/PositiveBridgeHoistingTest.java b/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/PositiveBridgeHoistingTest.java
index 2ac940a..156c74b 100644
--- a/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/PositiveBridgeHoistingTest.java
+++ b/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/PositiveBridgeHoistingTest.java
@@ -70,29 +70,29 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject aClassSubject = inspector.clazz(A.class);
     assertThat(aClassSubject, isPresent());
-    assertThat(aClassSubject.uniqueMethodWithName("m"), isPresent());
-    assertThat(aClassSubject.uniqueMethodWithName("superBridge"), isPresent());
-    assertThat(aClassSubject.uniqueMethodWithName("virtualBridge"), isPresent());
+    assertThat(aClassSubject.uniqueMethodWithOriginalName("m"), isPresent());
+    assertThat(aClassSubject.uniqueMethodWithOriginalName("superBridge"), isPresent());
+    assertThat(aClassSubject.uniqueMethodWithOriginalName("virtualBridge"), isPresent());
 
     ClassSubject b1ClassSubject = inspector.clazz(B1.class);
     assertThat(b1ClassSubject, isPresent());
-    assertThat(b1ClassSubject.uniqueMethodWithName("superBridge"), not(isPresent()));
-    assertThat(b1ClassSubject.uniqueMethodWithName("virtualBridge"), not(isPresent()));
+    assertThat(b1ClassSubject.uniqueMethodWithOriginalName("superBridge"), not(isPresent()));
+    assertThat(b1ClassSubject.uniqueMethodWithOriginalName("virtualBridge"), not(isPresent()));
 
     ClassSubject b2ClassSubject = inspector.clazz(B2.class);
     assertThat(b2ClassSubject, isPresent());
-    assertThat(b2ClassSubject.uniqueMethodWithName("superBridge"), not(isPresent()));
-    assertThat(b2ClassSubject.uniqueMethodWithName("virtualBridge"), not(isPresent()));
+    assertThat(b2ClassSubject.uniqueMethodWithOriginalName("superBridge"), not(isPresent()));
+    assertThat(b2ClassSubject.uniqueMethodWithOriginalName("virtualBridge"), not(isPresent()));
 
     ClassSubject b4ClassSubject = inspector.clazz(B4.class);
     assertThat(b4ClassSubject, isPresent());
-    assertThat(b4ClassSubject.uniqueMethodWithName("superBridge"), isPresent());
-    assertThat(b4ClassSubject.uniqueMethodWithName("virtualBridge"), isPresent());
+    assertThat(b4ClassSubject.uniqueMethodWithOriginalName("superBridge"), isPresent());
+    assertThat(b4ClassSubject.uniqueMethodWithOriginalName("virtualBridge"), isPresent());
 
     ClassSubject b5ClassSubject = inspector.clazz(B5.class);
     assertThat(b5ClassSubject, isPresent());
-    assertThat(b5ClassSubject.uniqueMethodWithName("superBridge"), isPresent());
-    assertThat(b5ClassSubject.uniqueMethodWithName("virtualBridge"), isPresent());
+    assertThat(b5ClassSubject.uniqueMethodWithOriginalName("superBridge"), isPresent());
+    assertThat(b5ClassSubject.uniqueMethodWithOriginalName("virtualBridge"), isPresent());
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/SingleBridgeToPackagePrivateMethodThatOverridesPublicMethodTest.java b/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/SingleBridgeToPackagePrivateMethodThatOverridesPublicMethodTest.java
index 91ddda8..a353ff8 100644
--- a/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/SingleBridgeToPackagePrivateMethodThatOverridesPublicMethodTest.java
+++ b/src/test/java/com/android/tools/r8/bridgeremoval/hoisting/SingleBridgeToPackagePrivateMethodThatOverridesPublicMethodTest.java
@@ -89,7 +89,8 @@
               ClassSubject aClassSubject = inspector.clazz(A.class);
               assertThat(aClassSubject, isPresent());
 
-              MethodSubject bridgeOnAMethodSubject = aClassSubject.uniqueMethodWithName("bridge");
+              MethodSubject bridgeOnAMethodSubject =
+                  aClassSubject.uniqueMethodWithOriginalName("bridge");
               assertThat(bridgeOnAMethodSubject, onlyIf(enableBridgeHoistingFromB, isPresent()));
 
               // Inspect B.
@@ -97,14 +98,16 @@
                   inspector.clazz(DescriptorUtils.descriptorToJavaType(TRANSFORMED_B_DESCRIPTOR));
               assertThat(bClassSubject, isPresent());
 
-              MethodSubject bridgeOnBMethodSubject = bClassSubject.uniqueMethodWithName("bridge");
+              MethodSubject bridgeOnBMethodSubject =
+                  bClassSubject.uniqueMethodWithOriginalName("bridge");
               assertThat(bridgeOnBMethodSubject, notIf(isPresent(), enableBridgeHoistingFromB));
 
               // Inspect C.
               ClassSubject cClassSubject = inspector.clazz(C.class);
               assertThat(cClassSubject, isPresent());
 
-              MethodSubject bridgeOnCMethodSubject = cClassSubject.uniqueMethodWithName("bridge");
+              MethodSubject bridgeOnCMethodSubject =
+                  cClassSubject.uniqueMethodWithOriginalName("bridge");
               assertThat(bridgeOnCMethodSubject, isAbsent());
             })
         .run(parameters.getRuntime(), Main.class)
diff --git a/src/test/java/com/android/tools/r8/cf/GetClassLdcClassTest.java b/src/test/java/com/android/tools/r8/cf/GetClassLdcClassTest.java
index 07d16af..0b4e818 100644
--- a/src/test/java/com/android/tools/r8/cf/GetClassLdcClassTest.java
+++ b/src/test/java/com/android/tools/r8/cf/GetClassLdcClassTest.java
@@ -113,7 +113,7 @@
               assertTrue(
                   inspector
                       .clazz(Runner.class)
-                      .uniqueMethodWithName("run")
+                      .uniqueMethodWithOriginalName("run")
                       .streamInstructions()
                       .anyMatch(i -> i.isConstClass(Runner.class.getTypeName())));
             });
diff --git a/src/test/java/com/android/tools/r8/cf/KeepDeserializeLambdaMethodTestRunner.java b/src/test/java/com/android/tools/r8/cf/KeepDeserializeLambdaMethodTestRunner.java
index 0bdb4f8..193e5b5 100644
--- a/src/test/java/com/android/tools/r8/cf/KeepDeserializeLambdaMethodTestRunner.java
+++ b/src/test/java/com/android/tools/r8/cf/KeepDeserializeLambdaMethodTestRunner.java
@@ -101,7 +101,8 @@
 
   private void checkPresenceOfDeserializedLambdas(CodeInspector inspector) {
     for (Class<?> clazz : getClasses()) {
-      MethodSubject method = inspector.clazz(clazz).uniqueMethodWithName("$deserializeLambda$");
+      MethodSubject method =
+          inspector.clazz(clazz).uniqueMethodWithOriginalName("$deserializeLambda$");
       assertEquals(
           "Unexpected status for $deserializedLambda$ on " + clazz.getSimpleName(),
           parameters.isCfRuntime(),
diff --git a/src/test/java/com/android/tools/r8/cf/PrintSeedsWithDeserializeLambdaMethodTest.java b/src/test/java/com/android/tools/r8/cf/PrintSeedsWithDeserializeLambdaMethodTest.java
index 255e2be..8b0251f 100644
--- a/src/test/java/com/android/tools/r8/cf/PrintSeedsWithDeserializeLambdaMethodTest.java
+++ b/src/test/java/com/android/tools/r8/cf/PrintSeedsWithDeserializeLambdaMethodTest.java
@@ -67,7 +67,8 @@
 
   private void checkPresenceOfDeserializedLambdas(CodeInspector inspector) {
     for (Class<?> clazz : getClasses()) {
-      MethodSubject method = inspector.clazz(clazz).uniqueMethodWithName("$deserializeLambda$");
+      MethodSubject method =
+          inspector.clazz(clazz).uniqueMethodWithOriginalName("$deserializeLambda$");
       assertEquals(
           "Unexpected status for $deserializedLambda$ on " + clazz.getSimpleName(),
           parameters.isCfRuntime(),
diff --git a/src/test/java/com/android/tools/r8/cf/TryRangeTestRunner.java b/src/test/java/com/android/tools/r8/cf/TryRangeTestRunner.java
index 7c9d4ac..5927841 100644
--- a/src/test/java/com/android/tools/r8/cf/TryRangeTestRunner.java
+++ b/src/test/java/com/android/tools/r8/cf/TryRangeTestRunner.java
@@ -72,7 +72,7 @@
     // L1: ; locals:
     // 11:   pop
     ClassSubject clazz = inspector.clazz("com.android.tools.r8.cf.TryRangeTestLimitRange");
-    CfCode cfCode = clazz.uniqueMethodWithName("main").getMethod().getCode().asCfCode();
+    CfCode cfCode = clazz.uniqueMethodWithOriginalName("main").getMethod().getCode().asCfCode();
     List<CfInstruction> instructions = cfCode.getInstructions();
     CfLabel startLabel = cfCode.getTryCatchRanges().get(0).start;
     int index = 0;
diff --git a/src/test/java/com/android/tools/r8/cf/bootstrap/BootstrapCurrentEqualityTest.java b/src/test/java/com/android/tools/r8/cf/bootstrap/BootstrapCurrentEqualityTest.java
index b26a1cf..f41ac28 100644
--- a/src/test/java/com/android/tools/r8/cf/bootstrap/BootstrapCurrentEqualityTest.java
+++ b/src/test/java/com/android/tools/r8/cf/bootstrap/BootstrapCurrentEqualityTest.java
@@ -14,10 +14,12 @@
 
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.ExternalR8TestCompileResult;
+import com.android.tools.r8.JdkClassFileProvider;
 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.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.ProcessResult;
 import com.android.tools.r8.retrace.ProguardMapProducer;
@@ -56,6 +58,7 @@
     "}",
     "-allowaccessmodification"
   };
+  private static String HELLO_EXPECTED = StringUtils.lines("Hello, world");
 
   private static Pair<Path, Path> r8R8Debug;
   private static Pair<Path, Path> r8R8Release;
@@ -75,7 +78,9 @@
 
   @Parameters(name = "{0}")
   public static TestParametersCollection data() {
-    return getTestParameters().withCfRuntimes().build();
+    return getTestParameters()
+        .withCfRuntimesStartingFromIncluding(CfVm.getMinimumSystemVersion())
+        .build();
   }
 
   public BootstrapCurrentEqualityTest(TestParameters parameters) {
@@ -87,10 +92,11 @@
     final Path jar = testFolder.newFolder().toPath().resolve("out.jar");
     final Path map = testFolder.newFolder().toPath().resolve("out.map");
     if (testExternal) {
-      testForExternalR8(newTempFolder(), Backend.CF, TestRuntime.getCheckedInJdk9())
+      testForExternalR8(newTempFolder(), Backend.CF)
           .useR8WithRelocatedDeps()
           .setMode(mode)
           .addProgramFiles(ToolHelper.R8_WITH_RELOCATED_DEPS_JAR)
+          .addLibraryFiles(TestRuntime.getSystemRuntime().getJavaHome())
           .addKeepRuleFiles(MAIN_KEEP)
           .compile()
           .apply(c -> FileUtils.writeTextFile(map, c.getProguardMap()))
@@ -99,6 +105,7 @@
       testForR8(newTempFolder(), Backend.CF)
           .setMode(mode)
           .addProgramFiles(ToolHelper.R8_WITH_RELOCATED_DEPS_JAR)
+          .addLibraryProvider(JdkClassFileProvider.fromSystemJdk())
           .addKeepRuleFiles(MAIN_KEEP)
           .compile()
           .apply(c -> FileUtils.writeTextFile(map, c.getProguardMap()))
@@ -167,6 +174,7 @@
         testForExternalR8(parameters.getBackend(), parameters.getRuntime())
             .useProvidedR8(ToolHelper.R8LIB_JAR)
             .addProgramFiles(ToolHelper.R8_WITH_RELOCATED_DEPS_JAR)
+            .addLibraryFiles(parameters.asCfRuntime().getJavaHome())
             .addKeepRuleFiles(MAIN_KEEP)
             .setMode(CompilationMode.RELEASE)
             .compile()
@@ -176,6 +184,7 @@
             .useProvidedR8(ToolHelper.R8LIB_EXCLUDE_DEPS_JAR)
             .addR8ExternalDepsToClasspath()
             .addProgramFiles(ToolHelper.R8_WITH_RELOCATED_DEPS_JAR)
+            .addLibraryFiles(parameters.asCfRuntime().getJavaHome())
             .addKeepRuleFiles(MAIN_KEEP)
             .setMode(CompilationMode.RELEASE)
             .compile()
@@ -190,13 +199,15 @@
 
   @Test
   public void test() throws Exception {
-    Path helloJar = Paths.get(ToolHelper.EXAMPLES_BUILD_DIR, "hello" + JAR_EXTENSION);
-    ProcessResult runResult = ToolHelper.runJava(helloJar, "hello.Hello");
-    assertEquals(0, runResult.exitCode);
-    compareR8(helloJar, runResult, KEEP_HELLO, "hello.Hello");
+    Path program = Paths.get(ToolHelper.EXAMPLES_BUILD_DIR, "hello" + JAR_EXTENSION);
+    testForJvm()
+        .addProgramFiles(program)
+        .run(parameters.getRuntime(), HELLO_NAME)
+        .assertSuccessWithOutput(HELLO_EXPECTED)
+        .apply(r -> compareR8(program, HELLO_EXPECTED, KEEP_HELLO, HELLO_NAME));
   }
 
-  private void compareR8(Path program, ProcessResult runResult, String[] keep, String... args)
+  private void compareR8(Path program, String expectedOutput, String[] keep, String main)
       throws Exception {
     ExternalR8TestCompileResult runR8Debug =
         testForExternalR8(newTempFolder(), parameters.getBackend(), parameters.getRuntime())
@@ -205,7 +216,10 @@
             .addKeepRules(keep)
             .setMode(CompilationMode.DEBUG)
             .compile();
-    assertEquals(runResult.toString(), ToolHelper.runJava(runR8Debug.outputJar(), args).toString());
+    testForJvm()
+        .addProgramFiles(runR8Debug.outputJar())
+        .run(parameters.getRuntime(), main)
+        .assertSuccessWithOutput(expectedOutput);
     ExternalR8TestCompileResult runR8Release =
         testForExternalR8(newTempFolder(), parameters.getBackend(), parameters.getRuntime())
             .useR8WithRelocatedDeps()
@@ -213,8 +227,10 @@
             .addKeepRules(keep)
             .setMode(CompilationMode.RELEASE)
             .compile();
-    assertEquals(
-        runResult.toString(), ToolHelper.runJava(runR8Release.outputJar(), args).toString());
+    testForJvm()
+        .addProgramFiles(runR8Release.outputJar())
+        .run(parameters.getRuntime(), main)
+        .assertSuccessWithOutput(expectedOutput);
     RunR8AndCheck(r8R8Debug, program, runR8Debug, keep, CompilationMode.DEBUG);
     RunR8AndCheck(r8R8Debug, program, runR8Release, keep, CompilationMode.RELEASE);
     RunR8AndCheck(r8R8Release, program, runR8Debug, keep, CompilationMode.DEBUG);
diff --git a/src/test/java/com/android/tools/r8/cf/stringconcatfactory/StringConcatFactoryTest.java b/src/test/java/com/android/tools/r8/cf/stringconcatfactory/StringConcatFactoryTest.java
new file mode 100644
index 0000000..3bc8a3d
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/cf/stringconcatfactory/StringConcatFactoryTest.java
@@ -0,0 +1,169 @@
+// 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.cf.stringconcatfactory;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.Diagnostic;
+import com.android.tools.r8.DiagnosticsLevel;
+import com.android.tools.r8.DiagnosticsMatcher;
+import com.android.tools.r8.JdkClassFileProvider;
+import com.android.tools.r8.R8FullTestBuilder;
+import com.android.tools.r8.R8TestCompileResult;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestDiagnosticMessagesImpl;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.TestState;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.diagnostic.MissingDefinitionsDiagnostic;
+import com.android.tools.r8.examples.JavaExampleClassProxy;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class StringConcatFactoryTest extends TestBase {
+
+  private static final String PKG = "stringconcatfactory";
+  private static final String EXAMPLE = "examplesJava9/" + PKG;
+  private final JavaExampleClassProxy MAIN =
+      new JavaExampleClassProxy(EXAMPLE, PKG + "/StringConcatFactoryUsage");
+
+  static final String EXPECTED = StringUtils.lines("Hello 0");
+
+  private final TestParameters parameters;
+
+  @Parameterized.Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withDefaultRuntimes().withApiLevel(AndroidApiLevel.B).build();
+  }
+
+  public StringConcatFactoryTest(TestParameters parameters) {
+    this.parameters = parameters;
+  }
+
+  private void checkInvokeDynamic(CodeInspector inspector) {
+    assertEquals(
+        parameters.isCfRuntime(),
+        inspector
+            .clazz(MAIN.typeName())
+            .uniqueMethodWithOriginalName("main")
+            .streamInstructions()
+            .anyMatch(InstructionSubject::isInvokeDynamic));
+  }
+
+  @Test
+  public void testReference() throws Exception {
+    testForRuntime(parameters)
+        .addProgramClassFileData(MAIN.bytes())
+        .run(parameters.getRuntime(), MAIN.typeName())
+        .assertSuccessWithOutput(EXPECTED)
+        .inspect(this::checkInvokeDynamic);
+  }
+
+  @Test
+  public void testJdk8NoIgnoreR8() throws Exception {
+    R8FullTestBuilder builder =
+        testForR8(parameters.getBackend())
+            .setMinApi(parameters.getApiLevel())
+            .addProgramClassFileData(MAIN.bytes())
+            // Always link to the JDK8 rt.jar which has no definition of StringConcatFactory.
+            .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
+            .addKeepMainRule(MAIN.typeName());
+    R8TestCompileResult compileResult;
+    try {
+      compileResult =
+          builder.compileWithExpectedDiagnostics(
+              diagnostics -> {
+                if (parameters.isDexRuntime()) {
+                  diagnostics.assertNoMessages();
+                } else {
+                  diagnostics.assertErrorsMatch(
+                      DiagnosticsMatcher.diagnosticType(MissingDefinitionsDiagnostic.class));
+                  diagnostics.assertOnlyErrors();
+                }
+              });
+    } catch (CompilationFailedException e) {
+      assertTrue(parameters.isCfRuntime());
+      return;
+    }
+    assertTrue(parameters.isDexRuntime());
+    compileResult
+        .run(parameters.getRuntime(), MAIN.typeName())
+        .assertSuccessWithOutput(EXPECTED)
+        .inspect(this::checkInvokeDynamic);
+  }
+
+  @Test
+  public void testJdk8WithIgnoreR8() throws Exception {
+    testForR8(parameters.getBackend())
+        .setMinApi(parameters.getApiLevel())
+        .addProgramClassFileData(MAIN.bytes())
+        // Always link to the JDK8 rt.jar which has no definition of StringConcatFactory.
+        .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
+        .addKeepMainRule(MAIN.typeName())
+        .applyIf(
+            parameters.isCfRuntime(), b -> b.addDontWarn("java.lang.invoke.StringConcatFactory"))
+        .compile()
+        .run(parameters.getRuntime(), MAIN.typeName())
+        .assertSuccessWithOutput(EXPECTED)
+        .inspect(this::checkInvokeDynamic);
+  }
+
+  @Test
+  public void testJdk8WithMapDiagnostic() throws Exception {
+    TestDiagnosticMessagesImpl handler =
+        new TestDiagnosticMessagesImpl() {
+          @Override
+          public DiagnosticsLevel modifyDiagnosticsLevel(
+              DiagnosticsLevel level, Diagnostic diagnostic) {
+            if (diagnostic instanceof MissingDefinitionsDiagnostic) {
+              return DiagnosticsLevel.WARNING;
+            }
+            return super.modifyDiagnosticsLevel(level, diagnostic);
+          }
+        };
+    R8FullTestBuilder.create(new TestState(temp, handler), parameters.getBackend())
+        .setMinApi(parameters.getApiLevel())
+        .addProgramClassFileData(MAIN.bytes())
+        // Always link to the JDK8 rt.jar which has no definition of StringConcatFactory.
+        .addLibraryFiles(ToolHelper.getJava8RuntimeJar())
+        .addKeepMainRule(MAIN.typeName())
+        .allowDiagnosticWarningMessages(parameters.isCfRuntime())
+        .compileWithExpectedDiagnostics(
+            diagnostics -> {
+              if (parameters.isDexRuntime()) {
+                diagnostics.assertNoMessages();
+              } else {
+                diagnostics
+                    .assertWarningsMatch(
+                        DiagnosticsMatcher.diagnosticType(MissingDefinitionsDiagnostic.class))
+                    .assertOnlyWarnings();
+              }
+            })
+        .run(parameters.getRuntime(), MAIN.typeName())
+        .assertSuccessWithOutput(EXPECTED)
+        .inspect(this::checkInvokeDynamic);
+  }
+
+  @Test
+  public void testSystemJdkNoIgnoreClassesR8() throws Exception {
+    testForR8(parameters.getBackend())
+        .setMinApi(parameters.getApiLevel())
+        .addProgramClassFileData(MAIN.bytes())
+        // The system runtime has StringConcatFactory so link to its bootclasspath.
+        .addLibraryProvider(JdkClassFileProvider.fromSystemJdk())
+        .addKeepMainRule(MAIN.typeName())
+        .run(parameters.getRuntime(), MAIN.typeName())
+        .assertSuccessWithOutput(EXPECTED)
+        .inspect(this::checkInvokeDynamic);
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/checkdiscarded/B162969014.java b/src/test/java/com/android/tools/r8/checkdiscarded/B162969014.java
index f19d1c1..ad0af4b 100644
--- a/src/test/java/com/android/tools/r8/checkdiscarded/B162969014.java
+++ b/src/test/java/com/android/tools/r8/checkdiscarded/B162969014.java
@@ -88,8 +88,8 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject logClassSubject = inspector.clazz(Log.class);
     assertThat(logClassSubject, isPresent());
-    assertThat(logClassSubject.uniqueMethodWithName("foo"), isPresent());
-    assertThat(logClassSubject.uniqueMethodWithName("bar"), not(isPresent()));
+    assertThat(logClassSubject.uniqueMethodWithOriginalName("foo"), isPresent());
+    assertThat(logClassSubject.uniqueMethodWithOriginalName("bar"), not(isPresent()));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/checkdiscarded/CheckSubclassDiscardedEntirelyTest.java b/src/test/java/com/android/tools/r8/checkdiscarded/CheckSubclassDiscardedEntirelyTest.java
index 0b2fa97..fe6cd7e 100644
--- a/src/test/java/com/android/tools/r8/checkdiscarded/CheckSubclassDiscardedEntirelyTest.java
+++ b/src/test/java/com/android/tools/r8/checkdiscarded/CheckSubclassDiscardedEntirelyTest.java
@@ -15,8 +15,6 @@
 import com.android.tools.r8.NoVerticalClassMerging;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.checkdiscarded.CheckClassDiscardedEntirelyTest.Main;
-import com.android.tools.r8.checkdiscarded.CheckClassDiscardedEntirelyTest.Secret;
 import com.android.tools.r8.errors.CheckDiscardDiagnostic;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
@@ -105,9 +103,11 @@
                       ClassSubject publicClassSubject = inspector.clazz(Public.class);
                       assertThat(publicClassSubject, isPresent());
                       assertThat(
-                          publicClassSubject.uniqueMethodWithName("printPublic"), isPresent());
+                          publicClassSubject.uniqueMethodWithOriginalName("printPublic"),
+                          isPresent());
                       assertThat(
-                          publicClassSubject.uniqueMethodWithName("printPublicAllowInlining"),
+                          publicClassSubject.uniqueMethodWithOriginalName(
+                              "printPublicAllowInlining"),
                           isAbsent());
 
                       assertThat(inspector.clazz(Secret.class), isAbsent());
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/ClassesWithDifferentVisibilityFieldsTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/ClassesWithDifferentVisibilityFieldsTest.java
index 269b793..05698dc 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/ClassesWithDifferentVisibilityFieldsTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/ClassesWithDifferentVisibilityFieldsTest.java
@@ -12,9 +12,6 @@
 import com.android.tools.r8.NeverClassInline;
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.classmerging.horizontal.EmptyClassTest.A;
-import com.android.tools.r8.classmerging.horizontal.EmptyClassTest.B;
-import com.android.tools.r8.classmerging.horizontal.EmptyClassTest.Main;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.FieldSubject;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
@@ -45,23 +42,23 @@
               assertThat(codeInspector.clazz(B.class), isAbsent());
               assertThat(codeInspector.clazz(C.class), isPresent());
 
-              FieldSubject v1Subject = aClassSubject.uniqueFieldWithName("v1");
-              FieldSubject v2Subject = aClassSubject.uniqueFieldWithName("v2");
+              FieldSubject v1Subject = aClassSubject.uniqueFieldWithOriginalName("v1");
+              FieldSubject v2Subject = aClassSubject.uniqueFieldWithOriginalName("v2");
 
-              MethodSubject methodSubject = aClassSubject.uniqueMethodWithName("getAV1");
+              MethodSubject methodSubject = aClassSubject.uniqueMethodWithOriginalName("getAV1");
               assertThat(methodSubject, isPresent());
               assertThat(methodSubject, readsInstanceField(v1Subject.getDexField()));
 
-              methodSubject = aClassSubject.uniqueMethodWithName("getAV2");
+              methodSubject = aClassSubject.uniqueMethodWithOriginalName("getAV2");
               assertThat(methodSubject, isPresent());
               assertThat(methodSubject, readsInstanceField(v2Subject.getDexField()));
 
               // The fields v1 and v2 are swapped, because their access modifiers are swapped.
-              methodSubject = aClassSubject.uniqueMethodWithName("getBV1");
+              methodSubject = aClassSubject.uniqueMethodWithOriginalName("getBV1");
               assertThat(methodSubject, isPresent());
               assertThat(methodSubject, readsInstanceField(v2Subject.getDexField()));
 
-              methodSubject = aClassSubject.uniqueMethodWithName("getBV2");
+              methodSubject = aClassSubject.uniqueMethodWithOriginalName("getBV2");
               assertThat(methodSubject, isPresent());
               assertThat(methodSubject, readsInstanceField(v1Subject.getDexField()));
             });
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/ConstructorMergingOverlapTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/ConstructorMergingOverlapTest.java
index 93bfcef..a4dd321 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/ConstructorMergingOverlapTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/ConstructorMergingOverlapTest.java
@@ -40,7 +40,7 @@
               ClassSubject aClassSubject = codeInspector.clazz(A.class);
               assertThat(aClassSubject, isPresent());
               FieldSubject classIdFieldSubject =
-                  aClassSubject.uniqueFieldWithName(ClassMerger.CLASS_ID_FIELD_NAME);
+                  aClassSubject.uniqueFieldWithOriginalName(ClassMerger.CLASS_ID_FIELD_NAME);
               assertThat(classIdFieldSubject, isPresent());
 
               MethodSubject firstInitSubject = aClassSubject.init("int");
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/ConstructorMergingPreoptimizedTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/ConstructorMergingPreoptimizedTest.java
index e5a169b..9f0bb44 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/ConstructorMergingPreoptimizedTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/ConstructorMergingPreoptimizedTest.java
@@ -49,7 +49,7 @@
               ClassSubject aClassSubject = codeInspector.clazz(A.class);
               assertThat(aClassSubject, isPresent());
               FieldSubject classIdFieldSubject =
-                  aClassSubject.uniqueFieldWithName(ClassMerger.CLASS_ID_FIELD_NAME);
+                  aClassSubject.uniqueFieldWithOriginalName(ClassMerger.CLASS_ID_FIELD_NAME);
               assertThat(classIdFieldSubject, isPresent());
 
               MethodSubject firstInitSubject = aClassSubject.init("int");
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/ConstructorMergingTrivialOverlapTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/ConstructorMergingTrivialOverlapTest.java
index 61432d2..38119c1 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/ConstructorMergingTrivialOverlapTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/ConstructorMergingTrivialOverlapTest.java
@@ -40,7 +40,7 @@
               ClassSubject aClassSubject = codeInspector.clazz(A.class);
               assertThat(aClassSubject, isPresent());
               FieldSubject classIdFieldSubject =
-                  aClassSubject.uniqueFieldWithName(ClassMerger.CLASS_ID_FIELD_NAME);
+                  aClassSubject.uniqueFieldWithOriginalName(ClassMerger.CLASS_ID_FIELD_NAME);
               assertThat(classIdFieldSubject, isPresent());
 
               MethodSubject firstInitSubject = aClassSubject.init("int");
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/FieldTypeMergedTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/FieldTypeMergedTest.java
index e688559..3f32311 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/FieldTypeMergedTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/FieldTypeMergedTest.java
@@ -42,11 +42,11 @@
               ClassSubject cClassSubject = codeInspector.clazz(C.class);
               assertThat(codeInspector.clazz(C.class), isPresent());
 
-              FieldSubject fieldSubject = cClassSubject.uniqueFieldWithName("fieldB");
+              FieldSubject fieldSubject = cClassSubject.uniqueFieldWithOriginalName("fieldB");
               assertThat(fieldSubject, isPresent());
               assertThat(fieldSubject, isFieldOfType(aClassSubject.getDexProgramClass().getType()));
 
-              fieldSubject = cClassSubject.uniqueFieldWithName("fieldArrayB");
+              fieldSubject = cClassSubject.uniqueFieldWithOriginalName("fieldArrayB");
               assertThat(fieldSubject, isPresent());
               assertTrue(fieldSubject.getDexField().type.isArrayType());
               assertThat(
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/MergedConstructorForwardingTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/MergedConstructorForwardingTest.java
index 817c786..1c03f26 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/MergedConstructorForwardingTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/MergedConstructorForwardingTest.java
@@ -42,7 +42,7 @@
               ClassSubject aClassSubject = codeInspector.clazz(A.class);
               assertThat(aClassSubject, isPresent());
               FieldSubject classIdFieldSubject =
-                  aClassSubject.uniqueFieldWithName(ClassMerger.CLASS_ID_FIELD_NAME);
+                  aClassSubject.uniqueFieldWithOriginalName(ClassMerger.CLASS_ID_FIELD_NAME);
               assertThat(classIdFieldSubject, isPresent());
 
               MethodSubject firstInitSubject = aClassSubject.init("int");
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/NonFinalOverrideOfFinalMethodNonTrivialMergeTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/NonFinalOverrideOfFinalMethodNonTrivialMergeTest.java
index 5e95a1e..8709f49 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/NonFinalOverrideOfFinalMethodNonTrivialMergeTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/NonFinalOverrideOfFinalMethodNonTrivialMergeTest.java
@@ -47,7 +47,7 @@
               ClassSubject classSubject = inspector.clazz(A.class);
               assertThat(classSubject, isPresent());
 
-              MethodSubject methodSubject = classSubject.uniqueMethodWithName("foo$bridge");
+              MethodSubject methodSubject = classSubject.uniqueMethodWithOriginalName("foo$bridge");
               assertThat(methodSubject, isPresent());
               assertFalse(methodSubject.isFinal());
             })
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/NonFinalOverrideOfFinalMethodTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/NonFinalOverrideOfFinalMethodTest.java
index 6287174..b0ef0f0 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/NonFinalOverrideOfFinalMethodTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/NonFinalOverrideOfFinalMethodTest.java
@@ -46,7 +46,7 @@
               ClassSubject classSubject = inspector.clazz(A.class);
               assertThat(classSubject, isPresent());
 
-              MethodSubject methodSubject = classSubject.uniqueMethodWithName("foo");
+              MethodSubject methodSubject = classSubject.uniqueMethodWithOriginalName("foo");
               assertThat(methodSubject, isPresent());
               assertFalse(methodSubject.isFinal());
             })
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/NonPublicOverrideOfPublicMethodAfterAbstractClassMergingTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/NonPublicOverrideOfPublicMethodAfterAbstractClassMergingTest.java
index d96c16c..3790be6 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/NonPublicOverrideOfPublicMethodAfterAbstractClassMergingTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/NonPublicOverrideOfPublicMethodAfterAbstractClassMergingTest.java
@@ -57,13 +57,15 @@
             inspector -> {
               ClassSubject iClassSubject = inspector.clazz(I.class);
               assertThat(iClassSubject, isPresent());
-              assertThat(iClassSubject.uniqueMethodWithName("m"), allOf(isPresent(), isPublic()));
+              assertThat(
+                  iClassSubject.uniqueMethodWithOriginalName("m"), allOf(isPresent(), isPublic()));
 
               ClassSubject aClassSubject = inspector.clazz(A.class);
               assertThat(aClassSubject, isPresent());
               assertThat(aClassSubject, not(isImplementing(iClassSubject)));
               assertThat(
-                  aClassSubject.uniqueMethodWithName("m"), allOf(isPresent(), isPackagePrivate()));
+                  aClassSubject.uniqueMethodWithOriginalName("m"),
+                  allOf(isPresent(), isPackagePrivate()));
             })
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("A.m()", "Y.m()");
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/NonPublicOverrideOfPublicMethodAfterClassMergingTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/NonPublicOverrideOfPublicMethodAfterClassMergingTest.java
index 8093d0c..79b840f 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/NonPublicOverrideOfPublicMethodAfterClassMergingTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/NonPublicOverrideOfPublicMethodAfterClassMergingTest.java
@@ -56,13 +56,15 @@
             inspector -> {
               ClassSubject iClassSubject = inspector.clazz(I.class);
               assertThat(iClassSubject, isPresent());
-              assertThat(iClassSubject.uniqueMethodWithName("m"), allOf(isPresent(), isPublic()));
+              assertThat(
+                  iClassSubject.uniqueMethodWithOriginalName("m"), allOf(isPresent(), isPublic()));
 
               ClassSubject aClassSubject = inspector.clazz(A.class);
               assertThat(aClassSubject, isPresent());
               assertThat(aClassSubject, isExtending(iClassSubject));
               assertThat(
-                  aClassSubject.uniqueMethodWithName("m"), allOf(isPresent(), isPackagePrivate()));
+                  aClassSubject.uniqueMethodWithOriginalName("m"),
+                  allOf(isPresent(), isPackagePrivate()));
             })
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("A.m()", "B.m()");
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/StrictMethodMergingTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/StrictMethodMergingTest.java
index 4d793a4..3b1e8c1 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/StrictMethodMergingTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/StrictMethodMergingTest.java
@@ -47,7 +47,7 @@
               assertThat(aClassSubject, isPresent());
 
               MethodSubject synchronizedMethodSubject =
-                  aClassSubject.uniqueMethodWithName("m$bridge");
+                  aClassSubject.uniqueMethodWithOriginalName("m$bridge");
               assertThat(synchronizedMethodSubject, isPresent());
               assertTrue(synchronizedMethodSubject.getAccessFlags().isStrict());
 
@@ -55,7 +55,7 @@
               assertThat(cClassSubject, isPresent());
 
               MethodSubject unsynchronizedMethodSubject =
-                  cClassSubject.uniqueMethodWithName("m$bridge");
+                  cClassSubject.uniqueMethodWithOriginalName("m$bridge");
               assertThat(unsynchronizedMethodSubject, isPresent());
               assertFalse(unsynchronizedMethodSubject.getAccessFlags().isStrict());
             })
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/SynchronizedMethodMergingTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/SynchronizedMethodMergingTest.java
index 4811a41..374e568 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/SynchronizedMethodMergingTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/SynchronizedMethodMergingTest.java
@@ -47,7 +47,7 @@
               assertThat(aClassSubject, isPresent());
 
               MethodSubject synchronizedMethodSubject =
-                  aClassSubject.uniqueMethodWithName("m$bridge");
+                  aClassSubject.uniqueMethodWithOriginalName("m$bridge");
               assertThat(synchronizedMethodSubject, isPresent());
               assertTrue(synchronizedMethodSubject.isSynchronized());
 
@@ -55,7 +55,7 @@
               assertThat(cClassSubject, isPresent());
 
               MethodSubject unsynchronizedMethodSubject =
-                  cClassSubject.uniqueMethodWithName("m$bridge");
+                  cClassSubject.uniqueMethodWithOriginalName("m$bridge");
               assertThat(unsynchronizedMethodSubject, isPresent());
               assertFalse(unsynchronizedMethodSubject.isSynchronized());
             })
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/TreeFixerInterfaceCollisionTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/TreeFixerInterfaceCollisionTest.java
index 07f3fce..3417654 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/TreeFixerInterfaceCollisionTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/TreeFixerInterfaceCollisionTest.java
@@ -47,12 +47,12 @@
               ClassSubject parentClassSubject = codeInspector.clazz(Parent.class);
               assertThat(parentClassSubject, isPresent());
               // Parent#foo is renamed to Parent#foo1 to prevent collision.
-              assertThat(parentClassSubject.uniqueMethodWithName("foo$1"), isPresent());
+              assertThat(parentClassSubject.uniqueMethodWithOriginalName("foo$1"), isPresent());
 
               ClassSubject cClassSubject = codeInspector.clazz(C.class);
               assertThat(cClassSubject, isPresent());
               // C#foo is not renamed to match interface.
-              assertThat(cClassSubject.uniqueMethodWithName("foo"), isPresent());
+              assertThat(cClassSubject.uniqueMethodWithOriginalName("foo"), isPresent());
 
               ClassSubject iClassSubject = codeInspector.clazz(I.class);
               assertThat(iClassSubject, isPresent());
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/TreeFixerInterfaceFixedCollisionTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/TreeFixerInterfaceFixedCollisionTest.java
index 43bbf33..e346353 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/TreeFixerInterfaceFixedCollisionTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/TreeFixerInterfaceFixedCollisionTest.java
@@ -52,7 +52,7 @@
               ClassSubject cClassSubject = codeInspector.clazz(C.class);
               assertThat(cClassSubject, isPresent());
               // C#foo is not renamed to match interface.
-              assertThat(cClassSubject.uniqueMethodWithName("foo"), isPresent());
+              assertThat(cClassSubject.uniqueMethodWithOriginalName("foo"), isPresent());
 
               ClassSubject iClassSubject = codeInspector.clazz(I.class);
               assertThat(iClassSubject, isPresent());
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/interfaces/IllegalOverrideAfterInterfaceMergingTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/interfaces/IllegalOverrideAfterInterfaceMergingTest.java
index f58252e..d904b01 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/interfaces/IllegalOverrideAfterInterfaceMergingTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/interfaces/IllegalOverrideAfterInterfaceMergingTest.java
@@ -58,13 +58,14 @@
             inspector -> {
               ClassSubject iClassSubject = inspector.clazz(I.class);
               assertThat(iClassSubject, isPresent());
-              assertThat(iClassSubject.uniqueMethodWithName("m"), isAbsent());
+              assertThat(iClassSubject.uniqueMethodWithOriginalName("m"), isAbsent());
 
               ClassSubject aClassSubject = inspector.clazz(A.class);
               assertThat(aClassSubject, isPresent());
               assertThat(aClassSubject, isImplementing(iClassSubject));
               assertThat(
-                  aClassSubject.uniqueMethodWithName("m"), allOf(isPresent(), isPackagePrivate()));
+                  aClassSubject.uniqueMethodWithOriginalName("m"),
+                  allOf(isPresent(), isPackagePrivate()));
             })
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("A.m()", "B.m()");
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/interfaces/IllegalSiblingAfterInterfaceMergingTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/interfaces/IllegalSiblingAfterInterfaceMergingTest.java
index 420ccaa..d4094c5 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/interfaces/IllegalSiblingAfterInterfaceMergingTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/interfaces/IllegalSiblingAfterInterfaceMergingTest.java
@@ -59,12 +59,13 @@
             inspector -> {
               ClassSubject iClassSubject = inspector.clazz(I.class);
               assertThat(iClassSubject, isPresent());
-              assertThat(iClassSubject.uniqueMethodWithName("m"), isAbsent());
+              assertThat(iClassSubject.uniqueMethodWithOriginalName("m"), isAbsent());
 
               ClassSubject a0ClassSubject = inspector.clazz(A0.class);
               assertThat(a0ClassSubject, isPresent());
               assertThat(
-                  a0ClassSubject.uniqueMethodWithName("m"), allOf(isPresent(), isPackagePrivate()));
+                  a0ClassSubject.uniqueMethodWithOriginalName("m"),
+                  allOf(isPresent(), isPackagePrivate()));
 
               ClassSubject aClassSubject = inspector.clazz(A.class);
               assertThat(aClassSubject, isPresent());
diff --git a/src/test/java/com/android/tools/r8/classmerging/vertical/B141942381.java b/src/test/java/com/android/tools/r8/classmerging/vertical/B141942381.java
index 5ab767d..6156017 100644
--- a/src/test/java/com/android/tools/r8/classmerging/vertical/B141942381.java
+++ b/src/test/java/com/android/tools/r8/classmerging/vertical/B141942381.java
@@ -70,10 +70,10 @@
 
     ClassSubject boxImpl = inspector.clazz(BoxImpl.class);
     assertThat(boxImpl, isPresent());
-    FieldSubject storage = boxImpl.uniqueFieldWithName("_storage");
+    FieldSubject storage = boxImpl.uniqueFieldWithOriginalName("_storage");
     assertThat(storage, isPresent());
 
-    MethodSubject set = boxImpl.uniqueMethodWithName("set");
+    MethodSubject set = boxImpl.uniqueMethodWithOriginalName("set");
     assertThat(set, isPresent());
 
     assertEquals(
diff --git a/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java b/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java
index da6cb32..1f9e6c7 100644
--- a/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergerTest.java
@@ -53,7 +53,6 @@
 import java.util.List;
 import java.util.Set;
 import java.util.function.Consumer;
-import java.util.function.Function;
 import java.util.function.Predicate;
 import org.junit.Assume;
 import org.junit.Test;
@@ -540,7 +539,7 @@
                             .toString()
                             .equals("java.lang.String classmerging.ProguardFieldMapTest$A.f")
                         && fieldNaming
-                            .computeResidualSignature(Function.identity())
+                            .getResidualSignature()
                             .toString()
                             .equals("java.lang.String f")));
   }
@@ -588,10 +587,7 @@
                     methodNaming
                         .getOriginalSignature()
                         .toString()
-                        .equals(
-                            methodNaming
-                                .computeResidualSignature(Function.identity())
-                                .toString())));
+                        .equals(methodNaming.getResidualSignature().toString())));
 
     // Try with vertical class merging.
     Set<String> preservedClassNames =
@@ -624,7 +620,7 @@
                             .toString()
                             .equals("void classmerging.ProguardMethodMapTest$A.method()")
                         && methodNaming
-                            .computeResidualSignature(Function.identity())
+                            .getResidualSignature()
                             .toString()
                             .equals("void method$classmerging$ProguardMethodMapTest$A()")));
   }
diff --git a/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergingWithMissingTypeArgsSubstitutionTest.java b/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergingWithMissingTypeArgsSubstitutionTest.java
index d4d1355..69d794e 100644
--- a/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergingWithMissingTypeArgsSubstitutionTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/vertical/VerticalClassMergingWithMissingTypeArgsSubstitutionTest.java
@@ -56,7 +56,7 @@
               assertEquals(
                   "<T:Ljava/lang/Object;>L" + binaryName(A.class) + "<Ljava/lang/Object;>;",
                   classSubject.getFinalSignatureAttribute());
-              MethodSubject bar = classSubject.uniqueMethodWithName("bar");
+              MethodSubject bar = classSubject.uniqueMethodWithOriginalName("bar");
               assertThat(bar, isPresentAndRenamed());
               assertEquals("(TT;)V", bar.getFinalSignatureAttribute());
               // The NeverInline is transferred to the private vertically merged method but also
diff --git a/src/test/java/com/android/tools/r8/compatproguard/CompatKeepClassMemberNamesTestRunner.java b/src/test/java/com/android/tools/r8/compatproguard/CompatKeepClassMemberNamesTestRunner.java
index dba64d3..a733112 100644
--- a/src/test/java/com/android/tools/r8/compatproguard/CompatKeepClassMemberNamesTestRunner.java
+++ b/src/test/java/com/android/tools/r8/compatproguard/CompatKeepClassMemberNamesTestRunner.java
@@ -91,11 +91,11 @@
   }
 
   private static void assertBarGetInstanceIsNotInlined(CodeInspector inspector) {
-    assertTrue(inspector.clazz(BAR_CLASS).uniqueMethodWithName("instance").isPresent());
+    assertTrue(inspector.clazz(BAR_CLASS).uniqueMethodWithOriginalName("instance").isPresent());
     assertTrue(
         inspector
             .clazz(MAIN_CLASS)
-            .uniqueMethodWithName("main")
+            .uniqueMethodWithOriginalName("main")
             .streamInstructions()
             .anyMatch(i -> i.isInvoke() && i.getMethod().qualifiedName().contains("instance")));
   }
@@ -154,8 +154,9 @@
               assertTrue(inspector.clazz(MAIN_CLASS).isPresent());
               assertTrue(inspector.clazz(BAR_CLASS).isPresent());
               assertBarGetInstanceIsNotInlined(inspector);
-              assertTrue(inspector.clazz(BAR_CLASS).uniqueFieldWithName("i").isPresent());
-              assertTrue(inspector.clazz(BAR_CLASS).uniqueMethodWithName("<init>").isPresent());
+              assertTrue(inspector.clazz(BAR_CLASS).uniqueFieldWithOriginalName("i").isPresent());
+              assertTrue(
+                  inspector.clazz(BAR_CLASS).uniqueMethodWithOriginalName("<init>").isPresent());
             })
         .run(parameters.getRuntime(), MAIN_CLASS)
         .assertSuccessWithOutput(EXPECTED);
@@ -184,7 +185,7 @@
               assertTrue(inspector.clazz(BAR_CLASS).isPresent());
               assertBarGetInstanceIsNotInlined(inspector);
               assertThat(inspector.clazz(BAR_CLASS).init(), isPresent());
-              assertThat(inspector.clazz(BAR_CLASS).uniqueFieldWithName("i"), isPresent());
+              assertThat(inspector.clazz(BAR_CLASS).uniqueFieldWithOriginalName("i"), isPresent());
             });
   }
 
@@ -256,13 +257,13 @@
               // Bar is renamed but its member names are kept.
               ClassSubject bar = inspector.clazz(BAR_CLASS);
               assertTrue(bar.isRenamed());
-              FieldSubject barI = bar.uniqueFieldWithName("i");
+              FieldSubject barI = bar.uniqueFieldWithOriginalName("i");
               assertTrue(barI.isPresent());
               assertFalse(barI.isRenamed());
-              MethodSubject barInit = bar.uniqueMethodWithName("<init>");
+              MethodSubject barInit = bar.uniqueMethodWithOriginalName("<init>");
               assertTrue(barInit.isPresent());
               assertFalse(barInit.isRenamed());
-              MethodSubject barInstance = bar.uniqueMethodWithName("instance");
+              MethodSubject barInstance = bar.uniqueMethodWithOriginalName("instance");
               assertTrue(barInstance.isPresent());
               assertFalse(barInstance.isRenamed());
             })
@@ -296,8 +297,9 @@
               assertTrue(inspector.clazz(MAIN_CLASS).isPresent());
               assertTrue(inspector.clazz(BAR_CLASS).isPresent());
               assertBarGetInstanceIsNotInlined(inspector);
-              assertThat(inspector.clazz(BAR_CLASS).uniqueMethodWithName("<init>"), isPresent());
-              assertThat(inspector.clazz(BAR_CLASS).uniqueFieldWithName("i"), isPresent());
+              assertThat(
+                  inspector.clazz(BAR_CLASS).uniqueMethodWithOriginalName("<init>"), isPresent());
+              assertThat(inspector.clazz(BAR_CLASS).uniqueFieldWithOriginalName("i"), isPresent());
             });
   }
 
@@ -356,10 +358,10 @@
               assertBarGetInstanceIsNotInlined(inspector);
               ClassSubject bar = inspector.clazz(BAR_CLASS);
               assertTrue(bar.isPresent());
-              assertTrue(bar.uniqueMethodWithName("instance").isPresent());
+              assertTrue(bar.uniqueMethodWithOriginalName("instance").isPresent());
               // Reflected on fields are not kept.
-              assertFalse(bar.uniqueMethodWithName("<init>").isPresent());
-              assertFalse(bar.uniqueFieldWithName("i").isPresent());
+              assertFalse(bar.uniqueMethodWithOriginalName("<init>").isPresent());
+              assertFalse(bar.uniqueFieldWithOriginalName("i").isPresent());
             })
         .run(parameters.getRuntime(), MAIN_CLASS)
         // Keeping the instance and its accessed members does not keep the reflected <init> and i.
@@ -414,9 +416,9 @@
               ClassSubject bar = inspector.clazz(BAR_CLASS);
               assertTrue(bar.isPresent());
               assertTrue(bar.isRenamed());
-              assertFalse(bar.uniqueFieldWithName("i").isPresent());
-              assertFalse(bar.uniqueMethodWithName("<init>").isPresent());
-              MethodSubject barInstance = bar.uniqueMethodWithName("instance");
+              assertFalse(bar.uniqueFieldWithOriginalName("i").isPresent());
+              assertFalse(bar.uniqueMethodWithOriginalName("<init>").isPresent());
+              MethodSubject barInstance = bar.uniqueMethodWithOriginalName("instance");
               assertTrue(barInstance.isPresent());
               assertFalse(barInstance.isRenamed());
             })
diff --git a/src/test/java/com/android/tools/r8/compatproguard/KeepClassMemberNamesMinificationTest.java b/src/test/java/com/android/tools/r8/compatproguard/KeepClassMemberNamesMinificationTest.java
index 009cf9f..70aaa93 100644
--- a/src/test/java/com/android/tools/r8/compatproguard/KeepClassMemberNamesMinificationTest.java
+++ b/src/test/java/com/android/tools/r8/compatproguard/KeepClassMemberNamesMinificationTest.java
@@ -78,8 +78,8 @@
             inspector -> {
               ClassSubject aClass = inspector.clazz(A.class);
               assertThat(aClass, isPresentAndRenamed());
-              assertThat(aClass.uniqueFieldWithName("foo"), isPresentAndNotRenamed());
-              assertThat(aClass.uniqueMethodWithName("foo"), isPresentAndNotRenamed());
+              assertThat(aClass.uniqueFieldWithOriginalName("foo"), isPresentAndNotRenamed());
+              assertThat(aClass.uniqueMethodWithOriginalName("foo"), isPresentAndNotRenamed());
             })
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("Hello World!", "Hello World!");
diff --git a/src/test/java/com/android/tools/r8/compatproguard/KeepRuleConnectivesTestRunner.java b/src/test/java/com/android/tools/r8/compatproguard/KeepRuleConnectivesTestRunner.java
index 0f82a73..4c7b46c 100644
--- a/src/test/java/com/android/tools/r8/compatproguard/KeepRuleConnectivesTestRunner.java
+++ b/src/test/java/com/android/tools/r8/compatproguard/KeepRuleConnectivesTestRunner.java
@@ -41,21 +41,22 @@
           RR extends TestRunResult<RR>,
           T extends TestShrinkerBuilder<C, B, CR, RR, T>>
       void testKeepIsDisjunction(TestShrinkerBuilder<C, B, CR, RR, T> builder) throws Exception {
-        builder
-            .addProgramClassesAndInnerClasses(KeepRuleConnectivesTest.class)
-            .addKeepRules("-keep class * { public long foo(); public long bar(); }")
-            .compile()
-            .inspect(inspector -> {
+    builder
+        .addProgramClassesAndInnerClasses(KeepRuleConnectivesTest.class)
+        .addKeepRules("-keep class * { public long foo(); public long bar(); }")
+        .compile()
+        .inspect(
+            inspector -> {
               ClassSubject bothFooAndBar = inspector.clazz(BothFooAndBar.class);
               ClassSubject justFoo = inspector.clazz(JustFoo.class);
               ClassSubject justBar = inspector.clazz(JustBar.class);
               assertTrue(bothFooAndBar.isPresent());
-              assertTrue(bothFooAndBar.uniqueMethodWithName("foo").isPresent());
-              assertTrue(bothFooAndBar.uniqueMethodWithName("bar").isPresent());
+              assertTrue(bothFooAndBar.uniqueMethodWithOriginalName("foo").isPresent());
+              assertTrue(bothFooAndBar.uniqueMethodWithOriginalName("bar").isPresent());
               assertTrue(justFoo.isPresent());
-              assertTrue(justFoo.uniqueMethodWithName("foo").isPresent());
+              assertTrue(justFoo.uniqueMethodWithOriginalName("foo").isPresent());
               assertTrue(justBar.isPresent());
-              assertTrue(justBar.uniqueMethodWithName("bar").isPresent());
+              assertTrue(justBar.uniqueMethodWithOriginalName("bar").isPresent());
             });
   }
 
@@ -86,16 +87,17 @@
         .addProgramClassesAndInnerClasses(KeepRuleConnectivesTest.class)
         .addKeepRules("-keepclasseswithmembers class * { public long foo(); public long bar(); }")
         .compile()
-        .inspect(inspector -> {
-          ClassSubject bothFooAndBar = inspector.clazz(BothFooAndBar.class);
-          ClassSubject justFoo = inspector.clazz(JustFoo.class);
-          ClassSubject justBar = inspector.clazz(JustBar.class);
-          assertTrue(bothFooAndBar.isPresent());
-          assertTrue(bothFooAndBar.uniqueMethodWithName("foo").isPresent());
-          assertTrue(bothFooAndBar.uniqueMethodWithName("bar").isPresent());
-          assertFalse(justFoo.isPresent());
-          assertFalse(justBar.isPresent());
-        });
+        .inspect(
+            inspector -> {
+              ClassSubject bothFooAndBar = inspector.clazz(BothFooAndBar.class);
+              ClassSubject justFoo = inspector.clazz(JustFoo.class);
+              ClassSubject justBar = inspector.clazz(JustBar.class);
+              assertTrue(bothFooAndBar.isPresent());
+              assertTrue(bothFooAndBar.uniqueMethodWithOriginalName("foo").isPresent());
+              assertTrue(bothFooAndBar.uniqueMethodWithOriginalName("bar").isPresent());
+              assertFalse(justFoo.isPresent());
+              assertFalse(justBar.isPresent());
+            });
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/compilerapi/assertionconfiguration/AssertionConfigurationTest.java b/src/test/java/com/android/tools/r8/compilerapi/assertionconfiguration/AssertionConfigurationTest.java
index 5a17702..11c8aed 100644
--- a/src/test/java/com/android/tools/r8/compilerapi/assertionconfiguration/AssertionConfigurationTest.java
+++ b/src/test/java/com/android/tools/r8/compilerapi/assertionconfiguration/AssertionConfigurationTest.java
@@ -75,7 +75,7 @@
     assertTrue(
         new CodeInspector(output)
             .clazz(MockClassWithAssertion.class)
-            .uniqueMethodWithName("main")
+            .uniqueMethodWithOriginalName("main")
             .streamInstructions()
             .anyMatch(this::invokesAssertionHandler));
   }
diff --git a/src/test/java/com/android/tools/r8/d8/DuplicateAnnotationTest.java b/src/test/java/com/android/tools/r8/d8/DuplicateAnnotationTest.java
index 962cec0..f09071f 100644
--- a/src/test/java/com/android/tools/r8/d8/DuplicateAnnotationTest.java
+++ b/src/test/java/com/android/tools/r8/d8/DuplicateAnnotationTest.java
@@ -93,7 +93,7 @@
     ClassSubject testA = inspector.clazz(TestA.class);
     assertThat(testA, isPresent());
 
-    MethodSubject foo = testA.uniqueMethodWithName("foo");
+    MethodSubject foo = testA.uniqueMethodWithOriginalName("foo");
     assertThat(foo, isPresent());
     AnnotationSubject annotation = foo.annotation(TestKeep.class.getName());
     assertThat(annotation, isPresent());
@@ -110,17 +110,17 @@
     ClassSubject testB = inspector.clazz(TestB.class);
     assertThat(testB, isPresent());
 
-    FieldSubject instance = testB.uniqueFieldWithName("instance");
+    FieldSubject instance = testB.uniqueFieldWithOriginalName("instance");
     assertThat(instance, isPresent());
     annotation = instance.annotation(TestKeep.class.getName());
     assertThat(annotation, isPresent());
 
-    foo = testB.uniqueMethodWithName("foo");
+    foo = testB.uniqueMethodWithOriginalName("foo");
     assertThat(foo, isPresent());
     annotation = foo.annotation(TestKeep.class.getName());
     assertThat(annotation, isPresent());
 
-    MethodSubject bar = testB.uniqueMethodWithName("bar");
+    MethodSubject bar = testB.uniqueMethodWithOriginalName("bar");
     assertThat(bar, isPresent());
     annotation = bar.annotation(TestKeep.class.getName());
     assertThat(annotation, isPresent());
diff --git a/src/test/java/com/android/tools/r8/debuginfo/CanonicalizeWithInline.java b/src/test/java/com/android/tools/r8/debuginfo/CanonicalizeWithInline.java
index a8eb9cc..053f4b3 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/CanonicalizeWithInline.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/CanonicalizeWithInline.java
@@ -67,7 +67,7 @@
     result.inspect(
         inspector -> {
           DexEncodedMethod method =
-              inspector.clazz(ClassA.class).uniqueMethodWithName("call").getMethod();
+              inspector.clazz(ClassA.class).uniqueMethodWithOriginalName("call").getMethod();
           DexDebugInfo debugInfo = method.getCode().asDexCode().getDebugInfo();
           assertNull(debugInfo);
         });
diff --git a/src/test/java/com/android/tools/r8/debuginfo/EnsureNoDebugInfoEmittedForPcOnlyTestRunner.java b/src/test/java/com/android/tools/r8/debuginfo/EnsureNoDebugInfoEmittedForPcOnlyTestRunner.java
index f3a22bf..c6f0994 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/EnsureNoDebugInfoEmittedForPcOnlyTestRunner.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/EnsureNoDebugInfoEmittedForPcOnlyTestRunner.java
@@ -137,13 +137,13 @@
   private void checkNoDebugInfo(CodeInspector inspector, int expectedMethodsInMain) {
     ClassSubject clazz = inspector.clazz(MAIN);
     assertEquals(expectedMethodsInMain, clazz.allMethods().size());
-    MethodSubject main = clazz.uniqueMethodWithName("main");
+    MethodSubject main = clazz.uniqueMethodWithOriginalName("main");
     assertNull(main.getMethod().getCode().asDexCode().getDebugInfo());
   }
 
   private void checkHasLineNumberInfo(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz(MAIN);
-    MethodSubject main = clazz.uniqueMethodWithName("main");
+    MethodSubject main = clazz.uniqueMethodWithOriginalName("main");
     List<DexDebugEntry> entries =
         new DexDebugEntryBuilder(main.getMethod(), inspector.getFactory()).build();
     Set<Integer> lines = entries.stream().map(e -> e.line).collect(Collectors.toSet());
diff --git a/src/test/java/com/android/tools/r8/debuginfo/NopLineRegression230337727Test.java b/src/test/java/com/android/tools/r8/debuginfo/NopLineRegression230337727Test.java
index ccdac2d..377df99 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/NopLineRegression230337727Test.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/NopLineRegression230337727Test.java
@@ -41,7 +41,8 @@
         .run(parameters.getRuntime(), TestClass.class)
         .inspect(
             inspector -> {
-              MethodSubject foo = inspector.clazz(TestClass.class).uniqueMethodWithName("foo");
+              MethodSubject foo =
+                  inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("foo");
               assertTrue(
                   foo.getLineNumberTable().getLines().toString(),
                   foo.getLineNumberTable().getLines().contains(11));
diff --git a/src/test/java/com/android/tools/r8/debuginfo/Regress233857593Test.java b/src/test/java/com/android/tools/r8/debuginfo/Regress233857593Test.java
index 596707f..46d76ca 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/Regress233857593Test.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/Regress233857593Test.java
@@ -38,7 +38,7 @@
                     1,
                     inspector
                         .clazz(TestClass.class)
-                        .uniqueMethodWithName("testLoopPhiWithNullFirstInput")
+                        .uniqueMethodWithOriginalName("testLoopPhiWithNullFirstInput")
                         .streamInstructions()
                         .filter(InstructionSubject::isGoto)
                         .count()));
diff --git a/src/test/java/com/android/tools/r8/debuginfo/SingleLineInfoInlineRemoveTest.java b/src/test/java/com/android/tools/r8/debuginfo/SingleLineInfoInlineRemoveTest.java
index f83d077..c577259 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/SingleLineInfoInlineRemoveTest.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/SingleLineInfoInlineRemoveTest.java
@@ -67,9 +67,9 @@
               assertThat(stackTrace, isSame(expectedStackTrace));
               ClassSubject mainSubject = inspector.clazz(Main.class);
               assertThat(mainSubject, isPresent());
-              assertThat(mainSubject.uniqueMethodWithName("inlinee"), not(isPresent()));
+              assertThat(mainSubject.uniqueMethodWithOriginalName("inlinee"), not(isPresent()));
               assertThat(
-                  mainSubject.uniqueMethodWithName("shouldRemoveLineNumberForInline"),
+                  mainSubject.uniqueMethodWithOriginalName("shouldRemoveLineNumberForInline"),
                   notIf(hasLineNumberTable(), parameters.isDexRuntime()));
             });
   }
@@ -91,9 +91,9 @@
               assertThat(stackTrace, isSame(expectedStackTrace));
               ClassSubject mainSubject = inspector.clazz(Main.class);
               assertThat(mainSubject, isPresent());
-              assertThat(mainSubject.uniqueMethodWithName("inlinee"), not(isPresent()));
+              assertThat(mainSubject.uniqueMethodWithOriginalName("inlinee"), not(isPresent()));
               assertThat(
-                  mainSubject.uniqueMethodWithName("shouldRemoveLineNumberForInline"),
+                  mainSubject.uniqueMethodWithOriginalName("shouldRemoveLineNumberForInline"),
                   notIf(hasLineNumberTable(), parameters.isDexRuntime()));
             });
   }
@@ -115,9 +115,9 @@
               assertThat(stackTrace, isSame(expectedStackTrace));
               ClassSubject mainSubject = inspector.clazz(Main.class);
               assertThat(mainSubject, isPresent());
-              assertThat(mainSubject.uniqueMethodWithName("inlinee"), not(isPresent()));
+              assertThat(mainSubject.uniqueMethodWithOriginalName("inlinee"), not(isPresent()));
               assertThat(
-                  mainSubject.uniqueMethodWithName("shouldRemoveLineNumberForInline"),
+                  mainSubject.uniqueMethodWithOriginalName("shouldRemoveLineNumberForInline"),
                   notIf(hasLineNumberTable(), parameters.isDexRuntime()));
             });
   }
@@ -139,9 +139,9 @@
               assertThat(stackTrace, isSame(expectedStackTrace));
               ClassSubject mainSubject = inspector.clazz(Main.class);
               assertThat(mainSubject, isPresent());
-              assertThat(mainSubject.uniqueMethodWithName("inlinee"), not(isPresent()));
+              assertThat(mainSubject.uniqueMethodWithOriginalName("inlinee"), not(isPresent()));
               assertThat(
-                  mainSubject.uniqueMethodWithName("shouldRemoveLineNumberForInline"),
+                  mainSubject.uniqueMethodWithOriginalName("shouldRemoveLineNumberForInline"),
                   // TODO(b/146565491): Update to allow dropping the table once supported by ART.
                   hasLineNumberTable());
             });
diff --git a/src/test/java/com/android/tools/r8/debuginfo/SingleLineInfoMultipleCallsRemoveTest.java b/src/test/java/com/android/tools/r8/debuginfo/SingleLineInfoMultipleCallsRemoveTest.java
index d7a5df3..542cfb6 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/SingleLineInfoMultipleCallsRemoveTest.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/SingleLineInfoMultipleCallsRemoveTest.java
@@ -70,10 +70,11 @@
               ClassSubject mainSubject = inspector.clazz(Main.class);
               assertThat(mainSubject, isPresent());
               assertThat(
-                  mainSubject.uniqueMethodWithName("shouldRemoveLineNumberForMultipleInvokes"),
+                  mainSubject.uniqueMethodWithOriginalName(
+                      "shouldRemoveLineNumberForMultipleInvokes"),
                   notIf(hasLineNumberTable(), parameters.isDexRuntime()));
               assertThat(
-                  mainSubject.uniqueMethodWithName("main"),
+                  mainSubject.uniqueMethodWithOriginalName("main"),
                   notIf(hasLineNumberTable(), parameters.isDexRuntime()));
             });
   }
diff --git a/src/test/java/com/android/tools/r8/debuginfo/SingleLineInfoMultipleInlineTest.java b/src/test/java/com/android/tools/r8/debuginfo/SingleLineInfoMultipleInlineTest.java
index bc0d012..c547357 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/SingleLineInfoMultipleInlineTest.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/SingleLineInfoMultipleInlineTest.java
@@ -67,9 +67,9 @@
               assertThat(stackTrace, isSame(expectedStackTrace));
               ClassSubject mainSubject = inspector.clazz(Main.class);
               assertThat(mainSubject, isPresent());
-              assertThat(mainSubject.uniqueMethodWithName("inlinee"), not(isPresent()));
+              assertThat(mainSubject.uniqueMethodWithOriginalName("inlinee"), not(isPresent()));
               assertThat(
-                  mainSubject.uniqueMethodWithName("shouldNotRemoveLineNumberForInline"),
+                  mainSubject.uniqueMethodWithOriginalName("shouldNotRemoveLineNumberForInline"),
                   notIf(
                       hasLineNumberTable(),
                       parameters.isDexRuntime()
diff --git a/src/test/java/com/android/tools/r8/debuginfo/SingleLineInfoRemoveTest.java b/src/test/java/com/android/tools/r8/debuginfo/SingleLineInfoRemoveTest.java
index b881f55..8076acf 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/SingleLineInfoRemoveTest.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/SingleLineInfoRemoveTest.java
@@ -92,7 +92,7 @@
               ClassSubject mainSubject = inspector.clazz(Main.class);
               assertThat(mainSubject, isPresent());
               assertThat(
-                  mainSubject.uniqueMethodWithName("shouldRemoveLineNumber"),
+                  mainSubject.uniqueMethodWithOriginalName("shouldRemoveLineNumber"),
                   notIf(hasLineNumberTable(), canSingleLineDebugInfoBeDiscarded()));
             });
   }
diff --git a/src/test/java/com/android/tools/r8/debuginfo/pc2pc/SharedPc2PcDebugInfo.java b/src/test/java/com/android/tools/r8/debuginfo/pc2pc/SharedPc2PcDebugInfo.java
index 0bbdf46..0cc3e5b 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/pc2pc/SharedPc2PcDebugInfo.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/pc2pc/SharedPc2PcDebugInfo.java
@@ -57,7 +57,7 @@
               // normal encodings.
               DexDebugInfo shared = null;
               for (String name : METHODS) {
-                DexEncodedMethod method = clazz.uniqueMethodWithName(name).getMethod();
+                DexEncodedMethod method = clazz.uniqueMethodWithOriginalName(name).getMethod();
                 DexDebugInfo debugInfo = method.getCode().asDexCode().getDebugInfo();
                 assertTrue(debugInfo.isPcBasedInfo());
                 // The DEX parser should allocate the same shared instance to each method.
diff --git a/src/test/java/com/android/tools/r8/desugar/DesugarLambdaWithAnonymousClass.java b/src/test/java/com/android/tools/r8/desugar/DesugarLambdaWithAnonymousClass.java
index 23436d3..9fd70ef 100644
--- a/src/test/java/com/android/tools/r8/desugar/DesugarLambdaWithAnonymousClass.java
+++ b/src/test/java/com/android/tools/r8/desugar/DesugarLambdaWithAnonymousClass.java
@@ -75,7 +75,7 @@
             assertEquals(
                 testClassSubject, inspector.clazz(enclosingMethod.holder.toSourceString()));
             assertThat(
-                testClassSubject.uniqueMethodWithName(enclosingMethod.name.toString()),
+                testClassSubject.uniqueMethodWithOriginalName(enclosingMethod.name.toString()),
                 isPresent());
           }
         });
@@ -90,8 +90,8 @@
     String outer = DesugarLambdaWithAnonymousClass.class.getTypeName();
     ClassSubject testClass = inspector.clazz(outer + "$TestClass");
     assertThat(testClass, isPresent());
-    assertThat(testClass.uniqueMethodWithName("lambda$test$0"), isPresent());
-    assertThat(testClass.uniqueMethodWithName("lambda$testStatic$1"), isPresent());
+    assertThat(testClass.uniqueMethodWithOriginalName("lambda$test$0"), isPresent());
+    assertThat(testClass.uniqueMethodWithOriginalName("lambda$testStatic$1"), isPresent());
     assertThat(inspector.clazz(outer + "$TestClass$1"), isPresent());
     assertThat(inspector.clazz(outer + "$TestClass$2"), isPresent());
   }
diff --git a/src/test/java/com/android/tools/r8/desugar/DesugarLambdaWithLocalClass.java b/src/test/java/com/android/tools/r8/desugar/DesugarLambdaWithLocalClass.java
index 60fde2f..76eb3d7 100644
--- a/src/test/java/com/android/tools/r8/desugar/DesugarLambdaWithLocalClass.java
+++ b/src/test/java/com/android/tools/r8/desugar/DesugarLambdaWithLocalClass.java
@@ -73,7 +73,7 @@
             assertEquals(
                 testClassSubject, inspector.clazz(enclosingMethod.holder.toSourceString()));
             assertThat(
-                testClassSubject.uniqueMethodWithName(enclosingMethod.name.toString()),
+                testClassSubject.uniqueMethodWithOriginalName(enclosingMethod.name.toString()),
                 isPresent());
           }
         });
@@ -88,8 +88,8 @@
     String outer = DesugarLambdaWithLocalClass.class.getTypeName();
     ClassSubject testClass = inspector.clazz(outer + "$TestClass");
     assertThat(testClass, isPresent());
-    assertThat(testClass.uniqueMethodWithName("lambda$test$0"), isPresent());
-    assertThat(testClass.uniqueMethodWithName("lambda$testStatic$1"), isPresent());
+    assertThat(testClass.uniqueMethodWithOriginalName("lambda$test$0"), isPresent());
+    assertThat(testClass.uniqueMethodWithOriginalName("lambda$testStatic$1"), isPresent());
     assertThat(inspector.clazz(outer + "$TestClass$1MyConsumerImpl"), isPresent());
     assertThat(inspector.clazz(outer + "$TestClass$2MyConsumerImpl"), isPresent());
   }
diff --git a/src/test/java/com/android/tools/r8/desugar/DesugarToClassFileBackport.java b/src/test/java/com/android/tools/r8/desugar/DesugarToClassFileBackport.java
index 9444833..b1fae08 100644
--- a/src/test/java/com/android/tools/r8/desugar/DesugarToClassFileBackport.java
+++ b/src/test/java/com/android/tools/r8/desugar/DesugarToClassFileBackport.java
@@ -61,7 +61,8 @@
   }
 
   private void checkBackportingNotRequired(CodeInspector inspector) {
-    MethodSubject methodSubject = inspector.clazz(TestClass.class).uniqueMethodWithName("main");
+    MethodSubject methodSubject =
+        inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("main");
     if (methodSubject.getProgramMethod().getDefinition().getCode().isCfCode()) {
       CfCode code = methodSubject.getProgramMethod().getDefinition().getCode().asCfCode();
       assertTrue(code.getInstructions().stream().noneMatch(this::isCfLAdd));
@@ -73,7 +74,8 @@
   }
 
   private void checkBackportingRequired(CodeInspector inspector) {
-    MethodSubject methodSubject = inspector.clazz(TestClass.class).uniqueMethodWithName("main");
+    MethodSubject methodSubject =
+        inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("main");
     if (methodSubject.getProgramMethod().getDefinition().getCode().isCfCode()) {
       CfCode code = methodSubject.getProgramMethod().getDefinition().getCode().asCfCode();
       assertTrue(code.getInstructions().stream().anyMatch(this::isCfLAdd));
diff --git a/src/test/java/com/android/tools/r8/desugar/constantdynamic/JacocoConstantDynamicGetDeclaredMethods.java b/src/test/java/com/android/tools/r8/desugar/constantdynamic/JacocoConstantDynamicGetDeclaredMethods.java
index 8524f5d..f90490d 100644
--- a/src/test/java/com/android/tools/r8/desugar/constantdynamic/JacocoConstantDynamicGetDeclaredMethods.java
+++ b/src/test/java/com/android/tools/r8/desugar/constantdynamic/JacocoConstantDynamicGetDeclaredMethods.java
@@ -140,7 +140,9 @@
         .inspect(
             inspector -> {
               assertThat(
-                  inspector.clazz(TestRunner.class).uniqueMethodWithName(jacocoBootstrapMethodName),
+                  inspector
+                      .clazz(TestRunner.class)
+                      .uniqueMethodWithOriginalName(jacocoBootstrapMethodName),
                   isAbsent());
             })
         .assertSuccessWithOutputLines("No " + jacocoBootstrapMethodName + " method");
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 6b61085..872ca85 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
@@ -80,7 +80,8 @@
     if (compilationSpecification.isProgramShrink()) {
       return;
     }
-    MethodSubject direct = inspector.clazz(Executor.class).uniqueMethodWithName("directTypes");
+    MethodSubject direct =
+        inspector.clazz(Executor.class).uniqueMethodWithOriginalName("directTypes");
     if (libraryDesugaringSpecification.hasEmulatedInterfaceDesugaring(parameters)) {
       assertTrue(
           direct
@@ -95,7 +96,7 @@
       assertTrue(direct.streamInstructions().noneMatch(instr -> instr.toString().contains("$-EL")));
     }
     MethodSubject inherited =
-        inspector.clazz(Executor.class).uniqueMethodWithName("inheritedTypes");
+        inspector.clazz(Executor.class).uniqueMethodWithOriginalName("inheritedTypes");
     if (!libraryDesugaringSpecification.hasEmulatedInterfaceDesugaring(parameters)) {
       assertTrue(
           inherited.streamInstructions().noneMatch(instr -> instr.toString().contains("$-EL")));
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 8d8f669..d6ede8b 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
@@ -118,7 +118,7 @@
     }
     ClassSubject classSubject = inspector.clazz(TestClass.class);
     assertThat(classSubject, isPresent());
-    MethodSubject main = classSubject.uniqueMethodWithName("main");
+    MethodSubject main = classSubject.uniqueMethodWithOriginalName("main");
     Set<String> foundInvokeHolders =
         main.streamInstructions()
             .filter(InstructionSubject::isInvoke)
@@ -177,7 +177,7 @@
             .isGreaterThanOrEqualTo(TestBase.apiLevelWithDefaultInterfaceMethodsSupport())
         || isR8) {
       assertThat(
-          inspector.clazz(TemporalAccessorImpl.class).uniqueMethodWithName("query"),
+          inspector.clazz(TemporalAccessorImpl.class).uniqueMethodWithOriginalName("query"),
           not(isPresent()));
     } else {
       assertThat(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaUtilFunctionTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaUtilFunctionTest.java
index 2f146bb..db9a6f1 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaUtilFunctionTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaUtilFunctionTest.java
@@ -69,7 +69,7 @@
     assertEquals(
         function,
         classSubject
-            .uniqueMethodWithName("applyFunction")
+            .uniqueMethodWithOriginalName("applyFunction")
             .getMethod()
             .getReference()
             .proto
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaUtilOptionalTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaUtilOptionalTest.java
index 23a13b6..6951b62 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaUtilOptionalTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/JavaUtilOptionalTest.java
@@ -65,7 +65,7 @@
     assertThat(classSubject, isPresent());
     Iterator<InvokeInstructionSubject> iterator =
         classSubject
-            .uniqueMethodWithName("main")
+            .uniqueMethodWithOriginalName("main")
             .iterateInstructions(InstructionSubject::isInvokeStatic);
     assertTrue(iterator.next().holder().is("j$.util.Optional"));
     assertTrue(iterator.next().holder().is("j$.util.Optional"));
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoDesugaredLibraryDexFileTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoDesugaredLibraryDexFileTest.java
index a3f36be..0cf1b01 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoDesugaredLibraryDexFileTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoDesugaredLibraryDexFileTest.java
@@ -64,8 +64,10 @@
   }
 
   private void assertNoForwardingStreamMethod(CodeInspector inspector) {
-    assertTrue(inspector.clazz(CustomArrayList.class).uniqueMethodWithName("stream").isAbsent());
-    assertTrue(inspector.clazz(CustomSortedSet.class).uniqueMethodWithName("stream").isAbsent());
+    assertTrue(
+        inspector.clazz(CustomArrayList.class).uniqueMethodWithOriginalName("stream").isAbsent());
+    assertTrue(
+        inspector.clazz(CustomSortedSet.class).uniqueMethodWithOriginalName("stream").isAbsent());
   }
 
   static class Executor {
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoForwardingMethodsTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoForwardingMethodsTest.java
index c799716..a695eba 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoForwardingMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/NoForwardingMethodsTest.java
@@ -61,8 +61,10 @@
   }
 
   private void assertNoForwardingStreamMethod(CodeInspector inspector) {
-    assertTrue(inspector.clazz(CustomArrayList.class).uniqueMethodWithName("stream").isAbsent());
-    assertTrue(inspector.clazz(CustomSortedSet.class).uniqueMethodWithName("stream").isAbsent());
+    assertTrue(
+        inspector.clazz(CustomArrayList.class).uniqueMethodWithOriginalName("stream").isAbsent());
+    assertTrue(
+        inspector.clazz(CustomSortedSet.class).uniqueMethodWithOriginalName("stream").isAbsent());
   }
 
   static class Executor {
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 2306edf..bd8d7c5 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
@@ -202,95 +202,95 @@
             : "java.util.function.Supplier";
 
     assertThat(
-        testClass.uniqueMethodWithName("objectsCompare"),
+        testClass.uniqueMethodWithOriginalName("objectsCompare"),
         onlyIf(invokeJavaUtilObjects, invokesObjectsCompare("java.util.Objects")));
     assertThat(
-        testClass.uniqueMethodWithName("objectsCompare"),
+        testClass.uniqueMethodWithOriginalName("objectsCompare"),
         onlyIf(invokeJDollarUtilObjects, invokesObjectsCompare("j$.util.Objects")));
 
     assertThat(
-        testClass.uniqueMethodWithName("objectsDeepEquals"),
+        testClass.uniqueMethodWithOriginalName("objectsDeepEquals"),
         onlyIf(invokeJavaUtilObjects, invokesObjectsDeepEquals("java.util.Objects")));
     assertThat(
-        testClass.uniqueMethodWithName("objectsDeepEquals"),
+        testClass.uniqueMethodWithOriginalName("objectsDeepEquals"),
         onlyIf(invokeJDollarUtilObjects, invokesObjectsDeepEquals("j$.util.Objects")));
 
     assertThat(
-        testClass.uniqueMethodWithName("objectsEquals"),
+        testClass.uniqueMethodWithOriginalName("objectsEquals"),
         onlyIf(invokeJavaUtilObjects, invokesObjectsEquals("java.util.Objects")));
     assertThat(
-        testClass.uniqueMethodWithName("objectsEquals"),
+        testClass.uniqueMethodWithOriginalName("objectsEquals"),
         onlyIf(invokeJDollarUtilObjects, invokesObjectsEquals("j$.util.Objects")));
 
     assertThat(
-        testClass.uniqueMethodWithName("objectsHash"),
+        testClass.uniqueMethodWithOriginalName("objectsHash"),
         onlyIf(invokeJavaUtilObjects, invokesObjectsHash("java.util.Objects")));
     assertThat(
-        testClass.uniqueMethodWithName("objectsHash"),
+        testClass.uniqueMethodWithOriginalName("objectsHash"),
         onlyIf(invokeJDollarUtilObjects, invokesObjectsHash("j$.util.Objects")));
 
     assertThat(
-        testClass.uniqueMethodWithName("objectsHashCode"),
+        testClass.uniqueMethodWithOriginalName("objectsHashCode"),
         onlyIf(invokeJavaUtilObjects, invokesObjectsHashCode("java.util.Objects")));
     assertThat(
-        testClass.uniqueMethodWithName("objectsHashCode"),
+        testClass.uniqueMethodWithOriginalName("objectsHashCode"),
         onlyIf(invokeJDollarUtilObjects, invokesObjectsHashCode("j$.util.Objects")));
 
     assertThat(
-        testClass.uniqueMethodWithName("objectsRequireNonNull"),
+        testClass.uniqueMethodWithOriginalName("objectsRequireNonNull"),
         onlyIf(invokeJavaUtilObjects, invokesObjectsRequireNonNull("java.util.Objects")));
     assertThat(
-        testClass.uniqueMethodWithName("objectsRequireNonNull"),
+        testClass.uniqueMethodWithOriginalName("objectsRequireNonNull"),
         onlyIf(invokeJDollarUtilObjects, invokesObjectsRequireNonNull("j$.util.Objects")));
 
     assertThat(
-        testClass.uniqueMethodWithName("objectsRequireNonNullWithMessage"),
+        testClass.uniqueMethodWithOriginalName("objectsRequireNonNullWithMessage"),
         onlyIf(
             invokeJavaUtilObjects, invokesObjectsRequireNonNullWithMessage("java.util.Objects")));
     assertThat(
-        testClass.uniqueMethodWithName("objectsRequireNonNullWithMessage"),
+        testClass.uniqueMethodWithOriginalName("objectsRequireNonNullWithMessage"),
         onlyIf(
             invokeJDollarUtilObjects, invokesObjectsRequireNonNullWithMessage("j$.util.Objects")));
 
     assertThat(
-        testClass.uniqueMethodWithName("objectsRequireNonNullWithSupplier"),
+        testClass.uniqueMethodWithOriginalName("objectsRequireNonNullWithSupplier"),
         onlyIf(
             invokeJavaUtilObjectsWithSupplier,
             invokesObjectsRequireNonNullWithSupplier("java.util.Objects", supplier)));
     assertThat(
-        testClass.uniqueMethodWithName("objectsRequireNonNullWithSupplier"),
+        testClass.uniqueMethodWithOriginalName("objectsRequireNonNullWithSupplier"),
         onlyIf(
             invokeJDollarUtilObjectsWithSupplier,
             invokesObjectsRequireNonNullWithSupplier("j$.util.Objects", supplier)));
 
     assertThat(
-        testClass.uniqueMethodWithName("objectsToString"),
+        testClass.uniqueMethodWithOriginalName("objectsToString"),
         onlyIf(invokeJavaUtilObjects, invokesObjectsToString("java.util.Objects")));
     assertThat(
-        testClass.uniqueMethodWithName("objectsToString"),
+        testClass.uniqueMethodWithOriginalName("objectsToString"),
         onlyIf(invokeJDollarUtilObjects, invokesObjectsToString("j$.util.Objects")));
 
     assertThat(
-        testClass.uniqueMethodWithName("objectsToStringWithNullDefault"),
+        testClass.uniqueMethodWithOriginalName("objectsToStringWithNullDefault"),
         onlyIf(invokeJavaUtilObjects, invokesObjectsToStringWithNullDefault("java.util.Objects")));
     assertThat(
-        testClass.uniqueMethodWithName("objectsToStringWithNullDefault"),
+        testClass.uniqueMethodWithOriginalName("objectsToStringWithNullDefault"),
         onlyIf(invokeJDollarUtilObjects, invokesObjectsToStringWithNullDefault("j$.util.Objects")));
 
     invokeJavaUtilObjects = parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.N);
 
     assertThat(
-        testClass.uniqueMethodWithName("objectsIsNull"),
+        testClass.uniqueMethodWithOriginalName("objectsIsNull"),
         onlyIf(invokeJavaUtilObjects, invokesObjectsIsNull("java.util.Objects")));
     assertThat(
-        testClass.uniqueMethodWithName("objectsIsNull"),
+        testClass.uniqueMethodWithOriginalName("objectsIsNull"),
         onlyIf(invokeJDollarUtilObjects, invokesObjectsIsNull("j$.util.Objects")));
 
     assertThat(
-        testClass.uniqueMethodWithName("objectsNonNull"),
+        testClass.uniqueMethodWithOriginalName("objectsNonNull"),
         onlyIf(invokeJavaUtilObjects, invokesObjectsNonNull("java.util.Objects")));
     assertThat(
-        testClass.uniqueMethodWithName("objectsNonNull"),
+        testClass.uniqueMethodWithOriginalName("objectsNonNull"),
         onlyIf(invokeJDollarUtilObjects, invokesObjectsNonNull("j$.util.Objects")));
   }
 
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramRewritingTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramRewritingTest.java
index 51222b2..535da2a 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/ProgramRewritingTest.java
@@ -144,7 +144,7 @@
     assertThat(classSubject, isPresent());
     List<InstructionSubject> invokes =
         classSubject
-            .uniqueMethodWithName("main")
+            .uniqueMethodWithOriginalName("main")
             .streamInstructions()
             .filter(instr -> instr.isInvokeInterface() || instr.isInvokeStatic())
             .collect(Collectors.toList());
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 91721e2..bf335b8 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
@@ -79,7 +79,7 @@
               assertTrue(
                   inspector
                       .clazz("j$.time.Duration")
-                      .uniqueMethodWithName("toMillis")
+                      .uniqueMethodWithOriginalName("toMillis")
                       .streamInstructions()
                       .filter(InstructionSubject::isInvokeStatic)
                       .map(InstructionSubject::toString)
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/ConcurrentHashMapFileSerializationTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/ConcurrentHashMapFileSerializationTest.java
index 1009f56..91669ae 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/ConcurrentHashMapFileSerializationTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/gson/ConcurrentHashMapFileSerializationTest.java
@@ -84,7 +84,7 @@
     ClassSubject mapClass = inspector.clazz("j$.util.concurrent.ConcurrentHashMap");
     if (parameters.getApiLevel().isLessThan(AndroidApiLevel.N)) {
       assertTrue(mapClass.isPresent());
-      FieldSubject serialVersionUID = mapClass.uniqueFieldWithName("serialVersionUID");
+      FieldSubject serialVersionUID = mapClass.uniqueFieldWithOriginalName("serialVersionUID");
       assertTrue(serialVersionUID.isPresent());
     } else {
       assertFalse(mapClass.isPresent());
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/TimeUnitTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/TimeUnitTest.java
index 54b3bc9..2e2e8fb 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/TimeUnitTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/jdk11/TimeUnitTest.java
@@ -5,16 +5,17 @@
 package com.android.tools.r8.desugar.desugaredlibrary.jdk11;
 
 import static com.android.tools.r8.desugar.desugaredlibrary.test.CompilationSpecification.DEFAULT_SPECIFICATIONS;
-import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.getJdk8Jdk11;
+import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK11;
+import static com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification.JDK11_PATH;
 
 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.desugar.desugaredlibrary.test.CompilationSpecification;
 import com.android.tools.r8.desugar.desugaredlibrary.test.LibraryDesugaringSpecification;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.StringUtils;
+import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.List;
@@ -31,18 +32,15 @@
   private final CompilationSpecification compilationSpecification;
 
   private static final Path INPUT_JAR =
-      Paths.get(ToolHelper.EXAMPLES_JAVA9_BUILD_DIR + "timeunit.jar");
-  private static final String EXPECTED_OUTPUT = StringUtils.lines("Nanos");
+      Paths.get(ToolHelper.EXAMPLES_JAVA11_JAR_DIR + "timeunit.jar");
+  private static final String EXPECTED_OUTPUT = StringUtils.lines("Nanos", "0");
   private static final String MAIN_CLASS = "timeunit.Example";
 
   @Parameters(name = "{0}, spec: {1}, {2}")
   public static List<Object[]> data() {
     return buildParameters(
-        getTestParameters()
-            .withDexRuntimesStartingFromIncluding(Version.V13_0_0)
-            .withApiLevel(AndroidApiLevel.B)
-            .build(),
-        getJdk8Jdk11(),
+        getTestParameters().withDexRuntimes().withAllApiLevels().build(),
+        ImmutableList.of(JDK11, JDK11_PATH),
         DEFAULT_SPECIFICATIONS);
   }
 
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java
index b67d511..6ef6b8b 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestBuilder.java
@@ -38,6 +38,7 @@
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
+import java.util.concurrent.ExecutionException;
 import java.util.function.Consumer;
 import java.util.function.Function;
 import org.junit.Assume;
@@ -344,14 +345,16 @@
     builder.addLibraryFiles(libraryDesugaringSpecification.getLibraryFiles());
   }
 
-  public DesugaredLibraryTestCompileResult<T> compile() throws Exception {
+  public DesugaredLibraryTestCompileResult<T> compile()
+      throws CompilationFailedException, IOException, ExecutionException {
     prepareCompilation();
     TestCompileResult<?, ? extends SingleTestRunResult<?>> compile = builder.compile();
     return internalCompile(compile);
   }
 
   public DesugaredLibraryTestCompileResult<T> compileWithExpectedDiagnostics(
-      DiagnosticsConsumer consumer) throws Exception {
+      DiagnosticsConsumer consumer)
+      throws CompilationFailedException, IOException, ExecutionException {
     prepareCompilation();
     TestCompileResult<?, ? extends SingleTestRunResult<?>> compile =
         builder.compileWithExpectedDiagnostics(consumer);
@@ -359,7 +362,8 @@
   }
 
   private DesugaredLibraryTestCompileResult<T> internalCompile(
-      TestCompileResult<?, ? extends SingleTestRunResult<?>> compile) throws Exception {
+      TestCompileResult<?, ? extends SingleTestRunResult<?>> compile)
+      throws CompilationFailedException, IOException, ExecutionException {
     L8TestCompileResult l8Compile = compileDesugaredLibrary(compile, keepRuleConsumer);
     D8TestCompileResult customLibCompile = compileCustomLib();
     return new DesugaredLibraryTestCompileResult<>(
@@ -382,7 +386,7 @@
   private L8TestCompileResult compileDesugaredLibrary(
       TestCompileResult<?, ? extends SingleTestRunResult<?>> compile,
       KeepRuleConsumer keepRuleConsumer)
-      throws Exception {
+      throws CompilationFailedException, IOException, ExecutionException {
     if (!compilationSpecification.isL8Shrink()) {
       return compileDesugaredLibrary(null);
     }
@@ -401,7 +405,8 @@
     return compileDesugaredLibrary(keepRules);
   }
 
-  private L8TestCompileResult compileDesugaredLibrary(String keepRule) throws Exception {
+  private L8TestCompileResult compileDesugaredLibrary(String keepRule)
+      throws CompilationFailedException, IOException, ExecutionException {
     assert !compilationSpecification.isL8Shrink() || keepRule != null;
     return test.testForL8(parameters.getApiLevel(), parameters.getBackend())
         .apply(
@@ -427,7 +432,8 @@
   }
 
   public String collectKeepRulesWithTraceReferences(
-      Path desugaredProgramClassFile, Path desugaredLibraryClassFile) throws Exception {
+      Path desugaredProgramClassFile, Path desugaredLibraryClassFile)
+      throws CompilationFailedException, IOException {
     Path generatedKeepRules = test.temp.newFile().toPath();
     ArrayList<String> args = new ArrayList<>();
     args.add("--keep-rules");
@@ -449,12 +455,12 @@
   }
 
   public SingleTestRunResult<?> run(TestRuntime runtime, Class<?> mainClass, String... args)
-      throws Exception {
+      throws ExecutionException, IOException, CompilationFailedException {
     return compile().run(runtime, mainClass.getTypeName(), args);
   }
 
   public SingleTestRunResult<?> run(TestRuntime runtime, String mainClass, String... args)
-      throws Exception {
+      throws ExecutionException, IOException, CompilationFailedException {
     return compile().run(runtime, mainClass, args);
   }
 
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestCompileResult.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestCompileResult.java
index bd11465..3172876 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestCompileResult.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/test/DesugaredLibraryTestCompileResult.java
@@ -18,6 +18,7 @@
 import java.io.IOException;
 import java.nio.file.Path;
 import java.util.List;
+import java.util.concurrent.ExecutionException;
 import java.util.function.Consumer;
 
 public class DesugaredLibraryTestCompileResult<T extends DesugaredLibraryTestBase> {
@@ -41,7 +42,7 @@
       CompilationSpecification compilationSpecification,
       D8TestCompileResult customLibCompile,
       L8TestCompileResult l8Compile)
-      throws Exception {
+      throws CompilationFailedException, IOException {
     this.test = test;
     this.compileResult = compileResult;
     this.parameters = parameters;
@@ -53,26 +54,26 @@
   }
 
   public <E extends Throwable> DesugaredLibraryTestCompileResult<T> inspectCustomLib(
-      ThrowingConsumer<CodeInspector, E> consumer) throws Throwable {
+      ThrowingConsumer<CodeInspector, E> consumer) throws IOException, E {
     assert customLibCompile != null;
     customLibCompile.inspect(consumer);
     return this;
   }
 
   public <E extends Throwable> DesugaredLibraryTestCompileResult<T> inspectL8(
-      ThrowingConsumer<CodeInspector, E> consumer) throws Throwable {
+      ThrowingConsumer<CodeInspector, E> consumer) throws IOException, E {
     l8Compile.inspect(consumer);
     return this;
   }
 
   public <E extends Throwable> DesugaredLibraryTestCompileResult<T> inspect(
-      ThrowingConsumer<CodeInspector, E> consumer) throws Throwable {
+      ThrowingConsumer<CodeInspector, E> consumer) throws IOException, E {
     compileResult.inspect(consumer);
     return this;
   }
 
   public <E extends Throwable> DesugaredLibraryTestCompileResult<T> inspectKeepRules(
-      ThrowingConsumer<List<String>, E> consumer) throws Throwable {
+      ThrowingConsumer<List<String>, E> consumer) throws E {
     if (compilationSpecification.isL8Shrink()) {
       l8Compile.inspectKeepRules(consumer);
     }
@@ -80,21 +81,21 @@
   }
 
   public <E extends Throwable> DesugaredLibraryTestCompileResult<T> apply(
-      ThrowingConsumer<DesugaredLibraryTestCompileResult<T>, E> consumer) throws Throwable {
+      ThrowingConsumer<DesugaredLibraryTestCompileResult<T>, E> consumer) throws E {
     consumer.accept(this);
     return this;
   }
 
-  public CodeInspector customLibInspector() throws Throwable {
+  public CodeInspector customLibInspector() throws IOException {
     assert customLibCompile != null;
     return customLibCompile.inspector();
   }
 
-  public CodeInspector l8Inspector() throws Throwable {
+  public CodeInspector l8Inspector() throws IOException {
     return l8Compile.inspector();
   }
 
-  public CodeInspector inspector() throws Throwable {
+  public CodeInspector inspector() throws IOException {
     return compileResult.inspector();
   }
 
@@ -105,17 +106,17 @@
   }
 
   public SingleTestRunResult<?> run(TestRuntime runtime, Class<?> mainClass, String... args)
-      throws Exception {
+      throws ExecutionException, IOException {
     return run(runtime, mainClass.getTypeName(), args);
   }
 
   public SingleTestRunResult<?> run(TestRuntime runtime, String mainClassName, String... args)
-      throws Exception {
+      throws ExecutionException, IOException {
     return runnableCompiledResult.run(runtime, mainClassName, args);
   }
 
   private TestCompileResult<?, ? extends SingleTestRunResult<?>> computeRunnableCompiledResult()
-      throws Exception {
+      throws CompilationFailedException, IOException {
     TestCompileResult<?, ? extends SingleTestRunResult<?>> runnable = convertToDexIfNeeded();
     if (customLibCompile != null) {
       runnable.addRunClasspathFiles(customLibCompile.writeToZip());
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
index 5e4e61a..7ee4955 100644
--- a/src/test/java/com/android/tools/r8/desugar/jdk8272564/Jdk8272564Test.java
+++ b/src/test/java/com/android/tools/r8/desugar/jdk8272564/Jdk8272564Test.java
@@ -44,13 +44,13 @@
     assertTrue(
         inspector
             .clazz(Jdk8272564.Main.typeName())
-            .uniqueMethodWithName("f")
+            .uniqueMethodWithOriginalName("f")
             .streamInstructions()
             .noneMatch(InstructionSubject::isInvokeVirtual));
     assertTrue(
         inspector
             .clazz(Jdk8272564.Main.typeName())
-            .uniqueMethodWithName("g")
+            .uniqueMethodWithOriginalName("g")
             .streamInstructions()
             .noneMatch(InstructionSubject::isInvokeVirtual));
   }
@@ -62,7 +62,7 @@
         1,
         inspector
             .clazz(Jdk8272564.Main.typeName())
-            .uniqueMethodWithName("f")
+            .uniqueMethodWithOriginalName("f")
             .streamInstructions()
             .filter(InstructionSubject::isInvokeInterface)
             .count());
@@ -70,7 +70,7 @@
         2,
         inspector
             .clazz(Jdk8272564.Main.typeName())
-            .uniqueMethodWithName("f")
+            .uniqueMethodWithOriginalName("f")
             .streamInstructions()
             .filter(InstructionSubject::isInvokeVirtual)
             .count());
@@ -78,7 +78,7 @@
         2,
         inspector
             .clazz(Jdk8272564.Main.typeName())
-            .uniqueMethodWithName("g")
+            .uniqueMethodWithOriginalName("g")
             .streamInstructions()
             .filter(InstructionSubject::isInvokeInterface)
             .count());
@@ -86,7 +86,7 @@
         2,
         inspector
             .clazz(Jdk8272564.Main.typeName())
-            .uniqueMethodWithName("g")
+            .uniqueMethodWithOriginalName("g")
             .streamInstructions()
             .filter(InstructionSubject::isInvokeInterface)
             .count());
@@ -94,7 +94,7 @@
         invokeVirtualCount,
         inspector
             .clazz(Jdk8272564.Main.typeName())
-            .uniqueMethodWithName("g")
+            .uniqueMethodWithOriginalName("g")
             .streamInstructions()
             .filter(InstructionSubject::isInvokeVirtual)
             .count());
@@ -102,7 +102,7 @@
         getClassCount,
         inspector
             .clazz(Jdk8272564.Main.typeName())
-            .uniqueMethodWithName("g")
+            .uniqueMethodWithOriginalName("g")
             .streamInstructions()
             .filter(InstructionSubject::isInvoke)
             .filter(instruction -> instruction.getMethod().getName().toString().equals("getClass"))
diff --git a/src/test/java/com/android/tools/r8/desugar/lambdas/LambdaMethodsWithModifiedAccessTest.java b/src/test/java/com/android/tools/r8/desugar/lambdas/LambdaMethodsWithModifiedAccessTest.java
index 61b75de..5802f93 100644
--- a/src/test/java/com/android/tools/r8/desugar/lambdas/LambdaMethodsWithModifiedAccessTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/lambdas/LambdaMethodsWithModifiedAccessTest.java
@@ -50,16 +50,20 @@
         new CodeInspector(ToolHelper.getClassFileForTestClass(LambdaTest.class));
     inspector.forAllClasses(clazz -> clazz.forAllMethods(System.out::println));
     assertThat(
-        inspector.clazz(LambdaTest.class).uniqueMethodWithName(LAMBDA_TO_PUBLIC), isPrivate());
+        inspector.clazz(LambdaTest.class).uniqueMethodWithOriginalName(LAMBDA_TO_PUBLIC),
+        isPrivate());
     assertThat(
-        inspector.clazz(LambdaTest.class).uniqueMethodWithName(LAMBDA_TO_NATIVE), isPrivate());
+        inspector.clazz(LambdaTest.class).uniqueMethodWithOriginalName(LAMBDA_TO_NATIVE),
+        isPrivate());
   }
 
   private void inspect(CodeInspector inspector) {
     assertThat(
-        inspector.clazz(LambdaTest.class).uniqueMethodWithName(LAMBDA_TO_PUBLIC), isPublic());
+        inspector.clazz(LambdaTest.class).uniqueMethodWithOriginalName(LAMBDA_TO_PUBLIC),
+        isPublic());
     assertThat(
-        inspector.clazz(LambdaTest.class).uniqueMethodWithName(LAMBDA_TO_NATIVE), isNative());
+        inspector.clazz(LambdaTest.class).uniqueMethodWithOriginalName(LAMBDA_TO_NATIVE),
+        isNative());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeInterfaceTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeInterfaceTest.java
index b3d4ca5..34fec39 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeInterfaceTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeInterfaceTest.java
@@ -94,15 +94,15 @@
               assertEquals(
                   2,
                   nonConstructorInvokeDirectCount(
-                      inspector.clazz("Host").uniqueMethodWithName("h1")));
+                      inspector.clazz("Host").uniqueMethodWithOriginalName("h1")));
               assertEquals(
                   1,
                   nonConstructorInvokeDirectCount(
-                      inspector.clazz("Host$Member1").uniqueMethodWithName("m")));
+                      inspector.clazz("Host$Member1").uniqueMethodWithOriginalName("m")));
               assertEquals(
                   1,
                   nonConstructorInvokeDirectCount(
-                      inspector.clazz("Host$Member2").uniqueMethodWithName("m")));
+                      inspector.clazz("Host$Member2").uniqueMethodWithOriginalName("m")));
             })
         .run(parameters.getRuntime(), "HostImpl")
         .assertFailureWithErrorThatThrows(IllegalAccessError.class);
@@ -126,7 +126,7 @@
                   assertEquals(
                       2,
                       nonConstructorInvokeDirectCount(
-                          inspector.clazz("Host").uniqueMethodWithName("h1")));
+                          inspector.clazz("Host").uniqueMethodWithOriginalName("h1")));
                 })
             .writeToZip();
 
@@ -142,7 +142,7 @@
                   assertEquals(
                       1,
                       nonConstructorInvokeDirectCount(
-                          inspector.clazz("Host$Member1").uniqueMethodWithName("m")));
+                          inspector.clazz("Host$Member1").uniqueMethodWithOriginalName("m")));
                 })
             .writeToZip();
 
@@ -158,7 +158,7 @@
                   assertEquals(
                       1,
                       nonConstructorInvokeDirectCount(
-                          inspector.clazz("Host$Member2").uniqueMethodWithName("m")));
+                          inspector.clazz("Host$Member2").uniqueMethodWithOriginalName("m")));
                 })
             .writeToZip();
 
@@ -182,15 +182,15 @@
               assertEquals(
                   2,
                   nonConstructorInvokeDirectCount(
-                      inspector.clazz("Host").uniqueMethodWithName("h1")));
+                      inspector.clazz("Host").uniqueMethodWithOriginalName("h1")));
               assertEquals(
                   1,
                   nonConstructorInvokeDirectCount(
-                      inspector.clazz("Host$Member1").uniqueMethodWithName("m")));
+                      inspector.clazz("Host$Member1").uniqueMethodWithOriginalName("m")));
               assertEquals(
                   1,
                   nonConstructorInvokeDirectCount(
-                      inspector.clazz("Host$Member2").uniqueMethodWithName("m")));
+                      inspector.clazz("Host$Member2").uniqueMethodWithOriginalName("m")));
             })
         .run(parameters.getRuntime(), "HostImpl")
         .assertFailureWithErrorThatThrows(IllegalAccessError.class);
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeVirtualTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeVirtualTest.java
index 4d47a29..715989f 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeVirtualTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexRewriteInvokeVirtualTest.java
@@ -80,19 +80,19 @@
               assertEquals(
                   1,
                   nonConstructorInvokeDirectCount(
-                      inspector.clazz("Host").uniqueMethodWithName("main")));
+                      inspector.clazz("Host").uniqueMethodWithOriginalName("main")));
               assertEquals(
                   2,
                   nonConstructorInvokeDirectCount(
-                      inspector.clazz("Host").uniqueMethodWithName("h1")));
+                      inspector.clazz("Host").uniqueMethodWithOriginalName("h1")));
               assertEquals(
                   1,
                   nonConstructorInvokeDirectCount(
-                      inspector.clazz("Host$Member1").uniqueMethodWithName("m")));
+                      inspector.clazz("Host$Member1").uniqueMethodWithOriginalName("m")));
               assertEquals(
                   1,
                   nonConstructorInvokeDirectCount(
-                      inspector.clazz("Host$Member2").uniqueMethodWithName("m")));
+                      inspector.clazz("Host$Member2").uniqueMethodWithOriginalName("m")));
             })
         .run(parameters.getRuntime(), "Host")
         .assertFailureWithErrorThatThrows(IllegalAccessError.class);
@@ -116,11 +116,11 @@
                   assertEquals(
                       1,
                       nonConstructorInvokeDirectCount(
-                          inspector.clazz("Host").uniqueMethodWithName("main")));
+                          inspector.clazz("Host").uniqueMethodWithOriginalName("main")));
                   assertEquals(
                       2,
                       nonConstructorInvokeDirectCount(
-                          inspector.clazz("Host").uniqueMethodWithName("h1")));
+                          inspector.clazz("Host").uniqueMethodWithOriginalName("h1")));
                 })
             .writeToZip();
 
@@ -136,7 +136,7 @@
                   assertEquals(
                       1,
                       nonConstructorInvokeDirectCount(
-                          inspector.clazz("Host$Member1").uniqueMethodWithName("m")));
+                          inspector.clazz("Host$Member1").uniqueMethodWithOriginalName("m")));
                 })
             .writeToZip();
 
@@ -152,7 +152,7 @@
                   assertEquals(
                       1,
                       nonConstructorInvokeDirectCount(
-                          inspector.clazz("Host$Member2").uniqueMethodWithName("m")));
+                          inspector.clazz("Host$Member2").uniqueMethodWithOriginalName("m")));
                 })
             .writeToZip();
 
@@ -167,19 +167,19 @@
               assertEquals(
                   1,
                   nonConstructorInvokeDirectCount(
-                      inspector.clazz("Host").uniqueMethodWithName("main")));
+                      inspector.clazz("Host").uniqueMethodWithOriginalName("main")));
               assertEquals(
                   2,
                   nonConstructorInvokeDirectCount(
-                      inspector.clazz("Host").uniqueMethodWithName("h1")));
+                      inspector.clazz("Host").uniqueMethodWithOriginalName("h1")));
               assertEquals(
                   1,
                   nonConstructorInvokeDirectCount(
-                      inspector.clazz("Host$Member1").uniqueMethodWithName("m")));
+                      inspector.clazz("Host$Member1").uniqueMethodWithOriginalName("m")));
               assertEquals(
                   1,
                   nonConstructorInvokeDirectCount(
-                      inspector.clazz("Host$Member2").uniqueMethodWithName("m")));
+                      inspector.clazz("Host$Member2").uniqueMethodWithOriginalName("m")));
             })
         .run(parameters.getRuntime(), "Host")
         .assertFailureWithErrorThatThrows(IllegalAccessError.class);
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestMethodInlinedTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestMethodInlinedTest.java
index a235beb..155d082 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestMethodInlinedTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestMethodInlinedTest.java
@@ -84,13 +84,13 @@
                       method.toString().contains("nestPvtCallToInline")
                           || method.toString().contains("methodWithPvtCallToInline")));
       // Inlining nest access should transform virtual/ift invokes -> direct.
-      MethodSubject methodSubject = subj.uniqueMethodWithName("dispatchInlining");
+      MethodSubject methodSubject = subj.uniqueMethodWithOriginalName("dispatchInlining");
       if (methodSubject.isPresent()) {
         nbDispatchInlining++;
         assertTrue(
             methodSubject.streamInstructions().noneMatch(InstructionSubject::isInvokeVirtual));
       }
-      methodSubject = subj.uniqueMethodWithName("notInlinedPvtCall");
+      methodSubject = subj.uniqueMethodWithOriginalName("notInlinedPvtCall");
       if (methodSubject.isPresent()) {
         nbNotInlinedPvtCall++;
       }
diff --git a/src/test/java/com/android/tools/r8/desugar/suppressedexceptions/SuppressedExceptionsTest.java b/src/test/java/com/android/tools/r8/desugar/suppressedexceptions/SuppressedExceptionsTest.java
index e1d397a..e4386e4 100644
--- a/src/test/java/com/android/tools/r8/desugar/suppressedexceptions/SuppressedExceptionsTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/suppressedexceptions/SuppressedExceptionsTest.java
@@ -60,14 +60,14 @@
             DesugarTestConfiguration::isDesugared,
             inspector ->
                 hasInvokesTo(
-                    inspector.clazz(TestClass.class).uniqueMethodWithName("main"),
+                    inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("main"),
                     "getSuppressed",
                     apiLevelHasSuppressedExceptionsSupport() ? 1 : 0))
         .inspectIf(
             DesugarTestConfiguration::isNotDesugared,
             inspector ->
                 hasInvokesTo(
-                    inspector.clazz(TestClass.class).uniqueMethodWithName("main"),
+                    inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("main"),
                     "getSuppressed",
                     1));
   }
@@ -87,7 +87,7 @@
         .inspect(
             inspector -> {
               hasInvokesTo(
-                  inspector.clazz(TestClass.class).uniqueMethodWithName("main"),
+                  inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("main"),
                   "getSuppressed",
                   apiLevelHasSuppressedExceptionsSupport() ? 1 : 0);
               IntBox gets = new IntBox(0);
diff --git a/src/test/java/com/android/tools/r8/desugar/suppressedexceptions/TwrSuppressedExceptionsTest.java b/src/test/java/com/android/tools/r8/desugar/suppressedexceptions/TwrSuppressedExceptionsTest.java
index 62d5240..8ff8ca2 100644
--- a/src/test/java/com/android/tools/r8/desugar/suppressedexceptions/TwrSuppressedExceptionsTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/suppressedexceptions/TwrSuppressedExceptionsTest.java
@@ -84,7 +84,7 @@
             inspector -> {
               ClassSubject clazz = inspector.clazz(MAIN.typeName());
               hasInvokesTo(
-                  clazz.uniqueMethodWithName("bar"),
+                  clazz.uniqueMethodWithOriginalName("bar"),
                   "$closeResource",
                   apiLevelHasTwrCloseResourceSupport() ? 4 : 0);
               if (apiLevelHasSuppressedExceptionsSupport()) {
@@ -103,7 +103,7 @@
             DesugarTestConfiguration::isNotDesugared,
             inspector -> {
               ClassSubject clazz = inspector.clazz(MAIN.typeName());
-              hasInvokesTo(clazz.uniqueMethodWithName("bar"), "$closeResource", 4);
+              hasInvokesTo(clazz.uniqueMethodWithOriginalName("bar"), "$closeResource", 4);
               hasInvokesTo(clazz.mainMethod(), "getSuppressed", 1);
             });
   }
diff --git a/src/test/java/com/android/tools/r8/desugaring/interfacemethods/InvokeSuperInDefaultMethodResolvingToLibraryTest.java b/src/test/java/com/android/tools/r8/desugaring/interfacemethods/InvokeSuperInDefaultMethodResolvingToLibraryTest.java
index 46bfd05..a753b6c 100644
--- a/src/test/java/com/android/tools/r8/desugaring/interfacemethods/InvokeSuperInDefaultMethodResolvingToLibraryTest.java
+++ b/src/test/java/com/android/tools/r8/desugaring/interfacemethods/InvokeSuperInDefaultMethodResolvingToLibraryTest.java
@@ -38,7 +38,7 @@
     assertTrue(
         inspector
             .clazz(B.class)
-            .uniqueMethodWithName("compose")
+            .uniqueMethodWithOriginalName("compose")
             .streamInstructions()
             .filter(InstructionSubject::isInvoke)
             .map(invoke -> invoke.getMethod().getHolderType().toString())
diff --git a/src/test/java/com/android/tools/r8/dex/DebugByteCodeWriterTest.java b/src/test/java/com/android/tools/r8/dex/DebugByteCodeWriterTest.java
index 90cf068..e09c293 100644
--- a/src/test/java/com/android/tools/r8/dex/DebugByteCodeWriterTest.java
+++ b/src/test/java/com/android/tools/r8/dex/DebugByteCodeWriterTest.java
@@ -51,6 +51,7 @@
                 GlobalSyntheticsStrategy.forNonSynthesizing()));
     return new ObjectToOffsetMapping(
         appView,
+        null,
         new LensCodeRewriterUtils(appView),
         Collections.emptyList(),
         Collections.emptyList(),
diff --git a/src/test/java/com/android/tools/r8/dex/container/DexContainerFormatBasicTest.java b/src/test/java/com/android/tools/r8/dex/container/DexContainerFormatBasicTest.java
new file mode 100644
index 0000000..af1ee96
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/dex/container/DexContainerFormatBasicTest.java
@@ -0,0 +1,182 @@
+// 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.dex.container;
+
+import static org.junit.Assert.assertEquals;
+
+import com.android.tools.r8.ByteDataView;
+import com.android.tools.r8.ClassFileConsumer.ArchiveConsumer;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.maindexlist.MainDexListTests;
+import com.android.tools.r8.transformers.ClassTransformer;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.DescriptorUtils;
+import com.android.tools.r8.utils.ZipUtils;
+import com.google.common.collect.ImmutableList;
+import com.google.common.io.ByteStreams;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import org.junit.BeforeClass;
+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;
+import org.objectweb.asm.MethodVisitor;
+import org.objectweb.asm.Opcodes;
+
+@RunWith(Parameterized.class)
+public class DexContainerFormatBasicTest extends TestBase {
+
+  @Parameter() public TestParameters parameters;
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withNoneRuntime().build();
+  }
+
+  private static Path inputA;
+  private static Path inputB;
+
+  @BeforeClass
+  public static void generateTestApplications() throws Throwable {
+    // Build two applications in different packages both with required multidex due to number
+    // of methods.
+    inputA = getStaticTemp().getRoot().toPath().resolve("application_a.jar");
+    inputB = getStaticTemp().getRoot().toPath().resolve("application_b.jar");
+
+    generateApplication(inputA, "a", 10);
+    generateApplication(inputB, "b", 10);
+  }
+
+  @Test
+  public void testNonContainerD8() throws Exception {
+    Path outputA =
+        testForD8(Backend.DEX)
+            .addProgramFiles(inputA)
+            .setMinApi(AndroidApiLevel.L)
+            .compile()
+            .writeToZip();
+    assertEquals(2, unzipContent(outputA).size());
+
+    Path outputB =
+        testForD8(Backend.DEX)
+            .addProgramFiles(inputB)
+            .setMinApi(AndroidApiLevel.L)
+            .compile()
+            .writeToZip();
+    assertEquals(2, unzipContent(outputB).size());
+
+    Path outputMerged =
+        testForD8(Backend.DEX)
+            .addProgramFiles(outputA, outputB)
+            .setMinApi(AndroidApiLevel.L)
+            .compile()
+            .writeToZip();
+    assertEquals(4, unzipContent(outputMerged).size());
+  }
+
+  @Test
+  public void testD8Experiment() throws Exception {
+    Path outputFromDexing =
+        testForD8(Backend.DEX)
+            .addProgramFiles(inputA)
+            .setMinApi(AndroidApiLevel.L)
+            .addOptionsModification(
+                options -> options.getTestingOptions().dexContainerExperiment = true)
+            .compile()
+            .writeToZip();
+    List<byte[]> dexFromDexing = unzipContent(outputFromDexing);
+    assertEquals(1, dexFromDexing.size());
+  }
+
+  @Test
+  public void testD8Experiment2() throws Exception {
+    Path outputA =
+        testForD8(Backend.DEX)
+            .addProgramFiles(inputA)
+            .setMinApi(AndroidApiLevel.L)
+            .addOptionsModification(
+                options -> options.getTestingOptions().dexContainerExperiment = true)
+            .compile()
+            .writeToZip();
+    assertEquals(1, unzipContent(outputA).size());
+
+    Path outputB =
+        testForD8(Backend.DEX)
+            .addProgramFiles(inputB)
+            .setMinApi(AndroidApiLevel.L)
+            .addOptionsModification(
+                options -> options.getTestingOptions().dexContainerExperiment = true)
+            .compile()
+            .writeToZip();
+    assertEquals(1, unzipContent(outputB).size());
+  }
+
+  private List<byte[]> unzipContent(Path zip) throws IOException {
+    List<byte[]> result = new ArrayList<>();
+    ZipUtils.iter(zip, (entry, inputStream) -> result.add(ByteStreams.toByteArray(inputStream)));
+    return result;
+  }
+
+  private static void generateApplication(Path applicationJar, String rootPackage, int methodCount)
+      throws Throwable {
+    ImmutableList.Builder<String> builder = ImmutableList.builder();
+    for (int i = 0; i < 10000; ++i) {
+      String pkg = rootPackage + "." + (i % 2 == 0 ? "a" : "b");
+      String className = "Class" + i;
+      builder.add(pkg + "." + className);
+    }
+    List<String> classes = builder.build();
+
+    generateApplication(applicationJar, classes, methodCount);
+  }
+
+  private static void generateApplication(Path output, List<String> classes, int methodCount)
+      throws IOException {
+    ArchiveConsumer consumer = new ArchiveConsumer(output);
+    for (String typename : classes) {
+      String descriptor = DescriptorUtils.javaTypeToDescriptor(typename);
+      byte[] bytes =
+          transformer(MainDexListTests.ClassStub.class)
+              .setClassDescriptor(descriptor)
+              .addClassTransformer(
+                  new ClassTransformer() {
+                    @Override
+                    public MethodVisitor visitMethod(
+                        int access,
+                        String name,
+                        String descriptor,
+                        String signature,
+                        String[] exceptions) {
+                      // This strips <init>() too.
+                      if (name.equals("methodStub")) {
+                        for (int i = 0; i < methodCount; i++) {
+                          MethodVisitor mv =
+                              super.visitMethod(
+                                  access, "method" + i, descriptor, signature, exceptions);
+                          mv.visitCode();
+                          mv.visitInsn(Opcodes.RETURN);
+                          mv.visitMaxs(0, 0);
+                          mv.visitEnd();
+                        }
+                      }
+                      return null;
+                    }
+                  })
+              .transform();
+      consumer.accept(ByteDataView.of(bytes), descriptor, null);
+    }
+    consumer.finished(null);
+  }
+
+  // Simple stub/template for generating the input classes.
+  public static class ClassStub {
+    public static void methodStub() {}
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterFieldTypeStrengtheningTest.java b/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterFieldTypeStrengtheningTest.java
index f56464c..bf5614e 100644
--- a/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterFieldTypeStrengtheningTest.java
+++ b/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterFieldTypeStrengtheningTest.java
@@ -55,7 +55,8 @@
                       ClassSubject baseSuperClassSubject = inspector.clazz(BaseSuperClass.class);
                       assertThat(baseSuperClassSubject, isPresent());
 
-                      FieldSubject fieldSubject = baseSuperClassSubject.uniqueFieldWithName("f");
+                      FieldSubject fieldSubject =
+                          baseSuperClassSubject.uniqueFieldWithOriginalName("f");
                       assertThat(fieldSubject, isPresent());
                       assertEquals(
                           Object.class.getTypeName(),
diff --git a/src/test/java/com/android/tools/r8/dexsplitter/R8SplitterInlineToFeature.java b/src/test/java/com/android/tools/r8/dexsplitter/R8SplitterInlineToFeature.java
index a7fef57..af67cbb 100644
--- a/src/test/java/com/android/tools/r8/dexsplitter/R8SplitterInlineToFeature.java
+++ b/src/test/java/com/android/tools/r8/dexsplitter/R8SplitterInlineToFeature.java
@@ -60,7 +60,7 @@
         r8TestCompileResult -> {
           // Ensure that isEarly from BaseUtilClass is inlined into the feature
           ClassSubject clazz = r8TestCompileResult.inspector().clazz(BaseUtilClass.class);
-          assertThat(clazz.uniqueMethodWithName("isEarly"), not(isPresent()));
+          assertThat(clazz.uniqueMethodWithOriginalName("isEarly"), not(isPresent()));
         };
     ProcessResult processResult =
         testR8Splitter(
diff --git a/src/test/java/com/android/tools/r8/dump/DumpInputsTest.java b/src/test/java/com/android/tools/r8/dump/DumpInputsTest.java
index 52aafa3..cceb957 100644
--- a/src/test/java/com/android/tools/r8/dump/DumpInputsTest.java
+++ b/src/test/java/com/android/tools/r8/dump/DumpInputsTest.java
@@ -13,7 +13,6 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.TestRuntime.CfVm;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.DescriptorUtils;
@@ -37,7 +36,7 @@
 
   @Parameterized.Parameters(name = "{0}")
   public static TestParametersCollection data() {
-    return getTestParameters().withCfRuntime(CfVm.JDK9).build();
+    return getTestParameters().withSystemRuntime().build();
   }
 
   public DumpInputsTest(TestParameters parameters) {
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/EnumImplementingInterfaceAssignmentOutsideTest.java b/src/test/java/com/android/tools/r8/enumunboxing/EnumImplementingInterfaceAssignmentOutsideTest.java
new file mode 100644
index 0000000..24743b6
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/enumunboxing/EnumImplementingInterfaceAssignmentOutsideTest.java
@@ -0,0 +1,117 @@
+// 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.enumunboxing;
+
+import static org.junit.Assert.assertThrows;
+
+import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.NeverClassInline;
+import com.android.tools.r8.TestParameters;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+/** This is a regression for b/247146910. */
+@RunWith(Parameterized.class)
+public class EnumImplementingInterfaceAssignmentOutsideTest extends EnumUnboxingTestBase {
+
+  private final TestParameters parameters;
+  private final boolean enumValueOptimization;
+  private final EnumKeepRules enumKeepRules;
+
+  private final String[] EXPECTED = new String[] {"Bar", "Hello World!"};
+
+  @Parameters(name = "{0} valueOpt: {1} keep: {2}")
+  public static List<Object[]> data() {
+    return enumUnboxingTestParameters();
+  }
+
+  public EnumImplementingInterfaceAssignmentOutsideTest(
+      TestParameters parameters, boolean enumValueOptimization, EnumKeepRules enumKeepRules) {
+    this.parameters = parameters;
+    this.enumValueOptimization = enumValueOptimization;
+    this.enumKeepRules = enumKeepRules;
+  }
+
+  @Test
+  public void testRuntime() throws Exception {
+    testForRuntime(parameters)
+        .addInnerClasses(EnumImplementingInterfaceAssignmentOutsideTest.class)
+        .run(parameters.getRuntime(), Main.class)
+        .assertSuccessWithOutputLines(EXPECTED);
+  }
+
+  @Test
+  public void testEnumUnboxing() throws Exception {
+    // TODO(b/247146910): We should not fail compilation. If running without assertions this
+    //  inserts throw null for the code.
+    assertThrows(
+        CompilationFailedException.class,
+        () ->
+            testForR8(parameters.getBackend())
+                .addInnerClasses(EnumImplementingInterfaceAssignmentOutsideTest.class)
+                .addKeepMainRule(Main.class)
+                .addKeepRules(enumKeepRules.getKeepRules())
+                .addOptionsModification(opt -> enableEnumOptions(opt, enumValueOptimization))
+                .compile());
+  }
+
+  public interface I {
+
+    String get();
+  }
+
+  @NeverClassInline
+  public enum OtherEnum implements I {
+    C("Foo"),
+    D("Bar");
+
+    private final String value;
+
+    OtherEnum(String value) {
+      this.value = value;
+    }
+
+    @Override
+    public String get() {
+      return value;
+    }
+  }
+
+  @NeverClassInline
+  public enum MyEnum {
+    A(),
+    B();
+
+    public I otherEnum;
+  }
+
+  public static class Main implements I {
+
+    public static void main(String[] args) throws Exception {
+      setInterfaceValue(System.currentTimeMillis() == 0 ? OtherEnum.C : OtherEnum.D);
+      System.out.println(MyEnum.A.otherEnum.get());
+      System.out.println(new Main().get());
+    }
+
+    private static void setInterfaceValue(I i) {
+      if (System.currentTimeMillis() > 0) {
+        MyEnum.A.otherEnum = i;
+      } else {
+        MyEnum.B.otherEnum = i;
+      }
+    }
+
+    @Override
+    public String get() {
+      if (System.currentTimeMillis() == 0) {
+        throw new RuntimeException("Foo");
+      }
+      return "Hello World!";
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/EnumImplementingInterfaceTest.java b/src/test/java/com/android/tools/r8/enumunboxing/EnumImplementingInterfaceTest.java
new file mode 100644
index 0000000..be45f4c
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/enumunboxing/EnumImplementingInterfaceTest.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.enumunboxing;
+
+import static org.junit.Assert.assertThrows;
+
+import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.NeverClassInline;
+import com.android.tools.r8.TestParameters;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+/** This is a regression for b/247146910. */
+@RunWith(Parameterized.class)
+public class EnumImplementingInterfaceTest extends EnumUnboxingTestBase {
+
+  private final TestParameters parameters;
+  private final boolean enumValueOptimization;
+  private final EnumKeepRules enumKeepRules;
+
+  private final String[] EXPECTED = new String[] {"Foo", "Hello World!"};
+
+  @Parameters(name = "{0} valueOpt: {1} keep: {2}")
+  public static List<Object[]> data() {
+    return enumUnboxingTestParameters();
+  }
+
+  public EnumImplementingInterfaceTest(
+      TestParameters parameters, boolean enumValueOptimization, EnumKeepRules enumKeepRules) {
+    this.parameters = parameters;
+    this.enumValueOptimization = enumValueOptimization;
+    this.enumKeepRules = enumKeepRules;
+  }
+
+  @Test
+  public void testRuntime() throws Exception {
+    testForRuntime(parameters)
+        .addInnerClasses(EnumImplementingInterfaceTest.class)
+        .run(parameters.getRuntime(), Main.class)
+        .assertSuccessWithOutputLines(EXPECTED);
+  }
+
+  @Test
+  public void testEnumUnboxing() throws Exception {
+    // TODO(b/247146910): We should not fail compilation. If running without assertions this
+    //  inserts throw null for the code.
+    assertThrows(
+        CompilationFailedException.class,
+        () ->
+            testForR8(parameters.getBackend())
+                .addInnerClasses(EnumImplementingInterfaceTest.class)
+                .addKeepMainRule(Main.class)
+                .addKeepRules(enumKeepRules.getKeepRules())
+                .addOptionsModification(opt -> enableEnumOptions(opt, enumValueOptimization))
+                .compile());
+  }
+
+  public interface I {
+
+    String get();
+  }
+
+  @NeverClassInline
+  public enum OtherEnum implements I {
+    C("Foo"),
+    D("Bar");
+
+    private final String value;
+
+    OtherEnum(String value) {
+      this.value = value;
+    }
+
+    @Override
+    public String get() {
+      return value;
+    }
+  }
+
+  @NeverClassInline
+  public enum MyEnum {
+    A(OtherEnum.C),
+    B(OtherEnum.D);
+
+    public I otherEnum;
+
+    MyEnum(I otherEnum) {
+      this.otherEnum = otherEnum;
+      if (System.currentTimeMillis() == 0) {
+        this.otherEnum = null;
+      }
+    }
+  }
+
+  public static class Main implements I {
+
+    public static void main(String[] args) throws Exception {
+      System.out.println(MyEnum.A.otherEnum.get());
+      System.out.println(new Main().get());
+    }
+
+    @Override
+    public String get() {
+      if (System.currentTimeMillis() == 0) {
+        throw new RuntimeException("Foo");
+      }
+      return "Hello World!";
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxingClassStaticizerTest.java b/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxingClassStaticizerTest.java
index 12dfd1f..b9b1e42 100644
--- a/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxingClassStaticizerTest.java
+++ b/src/test/java/com/android/tools/r8/enumunboxing/EnumUnboxingClassStaticizerTest.java
@@ -66,11 +66,12 @@
     if (parameters.isCfRuntime()) {
       // There is no class staticizer in Cf.
       assertThat(
-          codeInspector.clazz(Companion.class).uniqueMethodWithName(renamedMethodName),
+          codeInspector.clazz(Companion.class).uniqueMethodWithOriginalName(renamedMethodName),
           isPresent());
       return;
     }
-    MethodSubject method = codeInspector.clazz(Companion.class).uniqueMethodWithName("method");
+    MethodSubject method =
+        codeInspector.clazz(Companion.class).uniqueMethodWithOriginalName("method");
     assertThat(method, isPresent());
     assertEquals("int", method.getMethod().getParameters().toString());
   }
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/FailingMethodEnumUnboxingTest.java b/src/test/java/com/android/tools/r8/enumunboxing/FailingMethodEnumUnboxingTest.java
index 19aa6fe..52e4a53 100644
--- a/src/test/java/com/android/tools/r8/enumunboxing/FailingMethodEnumUnboxingTest.java
+++ b/src/test/java/com/android/tools/r8/enumunboxing/FailingMethodEnumUnboxingTest.java
@@ -87,7 +87,8 @@
         inspector.clazz(InstanceFieldPutObject.class).getDexProgramClass().instanceFields().size());
     assertEquals(
         1, inspector.clazz(StaticFieldPutObject.class).getDexProgramClass().staticFields().size());
-    assertTrue(inspector.clazz(FailingPhi.class).uniqueMethodWithName("switchOn").isPresent());
+    assertTrue(
+        inspector.clazz(FailingPhi.class).uniqueMethodWithOriginalName("switchOn").isPresent());
   }
 
   static class InstanceFieldPutObject {
diff --git a/src/test/java/com/android/tools/r8/enumunboxing/SwitchEnumUnboxingTest.java b/src/test/java/com/android/tools/r8/enumunboxing/SwitchEnumUnboxingTest.java
index 670e3b3..8b67ed9 100644
--- a/src/test/java/com/android/tools/r8/enumunboxing/SwitchEnumUnboxingTest.java
+++ b/src/test/java/com/android/tools/r8/enumunboxing/SwitchEnumUnboxingTest.java
@@ -66,7 +66,7 @@
     }
     assertTrue(
         i.clazz(Switch.class)
-            .uniqueMethodWithName("switchOnEnumManyCases")
+            .uniqueMethodWithOriginalName("switchOnEnumManyCases")
             .streamInstructions()
             .anyMatch(InstructionSubject::isSwitch));
   }
diff --git a/src/test/java/com/android/tools/r8/graph/GenericSignatureTest.java b/src/test/java/com/android/tools/r8/graph/GenericSignatureTest.java
index 86176a0..16daaac 100644
--- a/src/test/java/com/android/tools/r8/graph/GenericSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/graph/GenericSignatureTest.java
@@ -148,7 +148,7 @@
     // Testing FieldTypeSignature
     //
 
-    FieldSubject yyInZZ = zz.uniqueFieldWithName("yy");
+    FieldSubject yyInZZ = zz.uniqueFieldWithOriginalName("yy");
     assertThat(yyInZZ, isPresent());
     DexEncodedField field = yyInZZ.getField();
     assertNotNull(field);
@@ -165,7 +165,7 @@
     //
 
     // A$Y$YY newYY([B<T>)
-    MethodSubject newYY = zz.uniqueMethodWithName("newYY");
+    MethodSubject newYY = zz.uniqueMethodWithOriginalName("newYY");
     assertThat(newYY, isPresent());
     method = newYY.getMethod();
     assertNotNull(method);
@@ -207,7 +207,7 @@
     assertEquals(b.getDexProgramClass().type, classTypeSignature.type);
 
     // Function<A$Y$ZZ<TT>, A$Y$YY> convertToYY(Supplier<A$Y$ZZ<TT>>
-    MethodSubject convertToYY = zz.uniqueMethodWithName("convertToYY");
+    MethodSubject convertToYY = zz.uniqueMethodWithOriginalName("convertToYY");
     assertThat(convertToYY, isPresent());
     method = convertToYY.getMethod();
     assertNotNull(method);
@@ -243,7 +243,7 @@
     check_supplier(factory, a, y, zz, parameterSignature);
 
     // void boo(Supplier<A$Y$ZZ<TT>>)
-    MethodSubject boo = zz.uniqueMethodWithName("boo");
+    MethodSubject boo = zz.uniqueMethodWithOriginalName("boo");
     assertThat(boo, isPresent());
     method = boo.getMethod();
     assertNotNull(method);
@@ -295,11 +295,11 @@
   }
 
   private void check_A_Y_foo_bar_baz(ClassSubject y, AppView<AppInfoWithLiveness> appView) {
-    checkMethodWildCard(y.uniqueMethodWithName("foo"), appView, WildcardIndicator.POSITIVE);
-    checkMethodWildCard(y.uniqueMethodWithName("bar"), appView, WildcardIndicator.NEGATIVE);
+    checkMethodWildCard(y.uniqueMethodWithOriginalName("foo"), appView, WildcardIndicator.POSITIVE);
+    checkMethodWildCard(y.uniqueMethodWithOriginalName("bar"), appView, WildcardIndicator.NEGATIVE);
     // Check for star
     checkFieldTypeSignature(
-        y.uniqueMethodWithName("baz").asFoundMethodSubject(),
+        y.uniqueMethodWithOriginalName("baz").asFoundMethodSubject(),
         appView,
         typeSignature -> {
           assertTrue(typeSignature.isStar());
diff --git a/src/test/java/com/android/tools/r8/graph/MissingClassThrowingTest.java b/src/test/java/com/android/tools/r8/graph/MissingClassThrowingTest.java
index 333ab92..2d8035e 100644
--- a/src/test/java/com/android/tools/r8/graph/MissingClassThrowingTest.java
+++ b/src/test/java/com/android/tools/r8/graph/MissingClassThrowingTest.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.graph;
 
+import static com.android.tools.r8.DiagnosticsMatcher.diagnosticType;
 
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.NoHorizontalClassMerging;
@@ -11,6 +12,7 @@
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.TestRuntime.CfVm;
+import com.android.tools.r8.utils.UnverifiableCfCodeDiagnostic;
 import com.android.tools.r8.utils.codeinspector.AssertUtils;
 import java.io.IOException;
 import org.junit.Test;
@@ -76,7 +78,9 @@
                 .compileWithExpectedDiagnostics(
                     diagnostics ->
                         diagnostics
-                            .assertOnlyErrors()
+                            .assertNoInfos()
+                            // TODO(b/251482856): Is this an expected unverifiable code?
+                            .assertWarningsMatch(diagnosticType(UnverifiableCfCodeDiagnostic.class))
                             .inspectErrors(
                                 diagnostic ->
                                     diagnostic
diff --git a/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignatureKeepAttributesTest.java b/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignatureKeepAttributesTest.java
index 48877b9..efc246f 100644
--- a/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignatureKeepAttributesTest.java
+++ b/src/test/java/com/android/tools/r8/graph/genericsignature/GenericSignatureKeepAttributesTest.java
@@ -107,7 +107,7 @@
 
     ClassSubject innerClass = inspector.clazz(Inner.class);
     assertThat(innerClass, isPresent());
-    MethodSubject testMethod = innerClass.uniqueMethodWithName("test");
+    MethodSubject testMethod = innerClass.uniqueMethodWithOriginalName("test");
     assertThat(testMethod, isPresent());
     if (isCompat) {
       assertEquals("(TO;TM;)TI;", testMethod.getFinalSignatureAttribute());
diff --git a/src/test/java/com/android/tools/r8/graph/initializedclasses/InitializedClassesInInstanceMethodsTest.java b/src/test/java/com/android/tools/r8/graph/initializedclasses/InitializedClassesInInstanceMethodsTest.java
index 8256c29..c77d3a3 100644
--- a/src/test/java/com/android/tools/r8/graph/initializedclasses/InitializedClassesInInstanceMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/graph/initializedclasses/InitializedClassesInInstanceMethodsTest.java
@@ -69,9 +69,9 @@
 
     // In any case, Outer.hello(), Outer.world(), and Outer.exclamationMark() should be inlined into
     // the accessibility bridges.
-    assertThat(outerClassSubject.uniqueMethodWithName("hello"), not(isPresent()));
-    assertThat(outerClassSubject.uniqueMethodWithName("world"), not(isPresent()));
-    assertThat(outerClassSubject.uniqueMethodWithName("exclamationMark"), not(isPresent()));
+    assertThat(outerClassSubject.uniqueMethodWithOriginalName("hello"), not(isPresent()));
+    assertThat(outerClassSubject.uniqueMethodWithOriginalName("world"), not(isPresent()));
+    assertThat(outerClassSubject.uniqueMethodWithOriginalName("exclamationMark"), not(isPresent()));
 
     int numberOfExpectedAccessibilityBridges = 0;
     assertEquals(
@@ -81,19 +81,19 @@
             .size());
     assertEquals(
         !enableInitializedClassesInInstanceMethodsAnalysis,
-        outerClassSubject.uniqueFieldWithName("$r8$clinit").isPresent());
+        outerClassSubject.uniqueFieldWithOriginalName("$r8$clinit").isPresent());
 
     ClassSubject aClassSubject = inspector.clazz(Outer.A.class);
     assertThat(aClassSubject, isPresent());
-    assertThat(aClassSubject.uniqueMethodWithName("hello"), isPresent());
+    assertThat(aClassSubject.uniqueMethodWithOriginalName("hello"), isPresent());
 
     ClassSubject bClassSubject = inspector.clazz(Outer.B.class);
     assertThat(bClassSubject, isPresent());
-    assertThat(bClassSubject.uniqueMethodWithName("world"), isPresent());
+    assertThat(bClassSubject.uniqueMethodWithOriginalName("world"), isPresent());
 
     ClassSubject cClassSubject = inspector.clazz(C.class);
     assertThat(cClassSubject, isPresent());
-    assertThat(cClassSubject.uniqueMethodWithName("exclamationMark"), isPresent());
+    assertThat(cClassSubject.uniqueMethodWithOriginalName("exclamationMark"), isPresent());
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/internal/proto/Proto2BuilderShrinkingTest.java b/src/test/java/com/android/tools/r8/internal/proto/Proto2BuilderShrinkingTest.java
index 262f164..de44d1c 100644
--- a/src/test/java/com/android/tools/r8/internal/proto/Proto2BuilderShrinkingTest.java
+++ b/src/test/java/com/android/tools/r8/internal/proto/Proto2BuilderShrinkingTest.java
@@ -191,7 +191,7 @@
     assertThat(generatedMessageLiteClassSubject, isPresent());
 
     MethodSubject isInitializedMethodSubject =
-        generatedMessageLiteClassSubject.uniqueMethodWithName("isInitialized");
+        generatedMessageLiteClassSubject.uniqueMethodWithOriginalName("isInitialized");
 
     DexType methodToInvokeType =
         outputInspector.clazz(METHOD_TO_INVOKE_ENUM).getDexProgramClass().getType();
diff --git a/src/test/java/com/android/tools/r8/internal/proto/Proto2ShrinkingTest.java b/src/test/java/com/android/tools/r8/internal/proto/Proto2ShrinkingTest.java
index 51acd65..dbfb40f 100644
--- a/src/test/java/com/android/tools/r8/internal/proto/Proto2ShrinkingTest.java
+++ b/src/test/java/com/android/tools/r8/internal/proto/Proto2ShrinkingTest.java
@@ -23,7 +23,6 @@
 import com.google.common.collect.ImmutableSet;
 import java.nio.file.Path;
 import java.util.List;
-import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -154,45 +153,57 @@
     {
       ClassSubject usedRootClassSubject = inputInspector.clazz(USED_ROOT);
       assertThat(usedRootClassSubject, isPresent());
-      assertThat(usedRootClassSubject.uniqueFieldWithName("hasRequiredFieldA_"), isPresent());
-      assertThat(usedRootClassSubject.uniqueFieldWithName("hasRequiredFieldB_"), isPresent());
-      assertThat(usedRootClassSubject.uniqueFieldWithName("myOneof_"), isPresent());
       assertThat(
-          usedRootClassSubject.uniqueFieldWithName("recursiveWithRequiredField_"), isPresent());
-      assertThat(usedRootClassSubject.uniqueFieldWithName("isExtendedWithOptional_"), isPresent());
-      assertThat(usedRootClassSubject.uniqueFieldWithName("isExtendedWithScalars_"), isPresent());
+          usedRootClassSubject.uniqueFieldWithOriginalName("hasRequiredFieldA_"), isPresent());
       assertThat(
-          usedRootClassSubject.uniqueFieldWithName("isExtendedWithRequiredField_"), isPresent());
+          usedRootClassSubject.uniqueFieldWithOriginalName("hasRequiredFieldB_"), isPresent());
+      assertThat(usedRootClassSubject.uniqueFieldWithOriginalName("myOneof_"), isPresent());
       assertThat(
-          usedRootClassSubject.uniqueFieldWithName("isRepeatedlyExtendedWithRequiredField_"),
+          usedRootClassSubject.uniqueFieldWithOriginalName("recursiveWithRequiredField_"),
           isPresent());
-      assertThat(usedRootClassSubject.uniqueFieldWithName("hasMapField_"), isPresent());
+      assertThat(
+          usedRootClassSubject.uniqueFieldWithOriginalName("isExtendedWithOptional_"), isPresent());
+      assertThat(
+          usedRootClassSubject.uniqueFieldWithOriginalName("isExtendedWithScalars_"), isPresent());
+      assertThat(
+          usedRootClassSubject.uniqueFieldWithOriginalName("isExtendedWithRequiredField_"),
+          isPresent());
+      assertThat(
+          usedRootClassSubject.uniqueFieldWithOriginalName(
+              "isRepeatedlyExtendedWithRequiredField_"),
+          isPresent());
+      assertThat(usedRootClassSubject.uniqueFieldWithOriginalName("hasMapField_"), isPresent());
 
       ClassSubject hasRequiredFieldClassSubject = inputInspector.clazz(HAS_REQUIRED_FIELD);
       assertThat(hasRequiredFieldClassSubject, isPresent());
-      assertThat(hasRequiredFieldClassSubject.uniqueFieldWithName("value_"), isPresent());
+      assertThat(hasRequiredFieldClassSubject.uniqueFieldWithOriginalName("value_"), isPresent());
     }
 
     // Verify the existence of various fields in the output.
     {
       ClassSubject usedRootClassSubject = outputInspector.clazz(USED_ROOT);
       assertThat(usedRootClassSubject, isPresent());
-      assertThat(usedRootClassSubject.uniqueFieldWithName("hasRequiredFieldA_"), isPresent());
-      assertThat(usedRootClassSubject.uniqueFieldWithName("hasRequiredFieldB_"), isPresent());
-      assertThat(usedRootClassSubject.uniqueFieldWithName("myOneof_"), isPresent());
       assertThat(
-          usedRootClassSubject.uniqueFieldWithName("recursiveWithRequiredField_"), isPresent());
-      assertThat(usedRootClassSubject.uniqueFieldWithName("hasMapField_"), isPresent());
+          usedRootClassSubject.uniqueFieldWithOriginalName("hasRequiredFieldA_"), isPresent());
+      assertThat(
+          usedRootClassSubject.uniqueFieldWithOriginalName("hasRequiredFieldB_"), isPresent());
+      assertThat(usedRootClassSubject.uniqueFieldWithOriginalName("myOneof_"), isPresent());
+      assertThat(
+          usedRootClassSubject.uniqueFieldWithOriginalName("recursiveWithRequiredField_"),
+          isPresent());
+      assertThat(usedRootClassSubject.uniqueFieldWithOriginalName("hasMapField_"), isPresent());
 
       assertThat(
-          usedRootClassSubject.uniqueFieldWithName("isExtendedWithRequiredField_"), isPresent());
+          usedRootClassSubject.uniqueFieldWithOriginalName("isExtendedWithRequiredField_"),
+          isPresent());
       assertThat(
-          usedRootClassSubject.uniqueFieldWithName("isRepeatedlyExtendedWithRequiredField_"),
+          usedRootClassSubject.uniqueFieldWithOriginalName(
+              "isRepeatedlyExtendedWithRequiredField_"),
           isPresent());
 
       ClassSubject hasRequiredFieldClassSubject = outputInspector.clazz(HAS_REQUIRED_FIELD);
       assertThat(hasRequiredFieldClassSubject, isPresent());
-      assertThat(hasRequiredFieldClassSubject.uniqueFieldWithName("value_"), isPresent());
+      assertThat(hasRequiredFieldClassSubject.uniqueFieldWithOriginalName("value_"), isPresent());
     }
 
     // Verify the absence of various fields in the output.
@@ -200,9 +211,11 @@
       ClassSubject usedRootClassSubject = outputInspector.clazz(USED_ROOT);
       assertThat(usedRootClassSubject, isPresent());
       assertThat(
-          usedRootClassSubject.uniqueFieldWithName("isExtendedWithOptional_"), not(isPresent()));
+          usedRootClassSubject.uniqueFieldWithOriginalName("isExtendedWithOptional_"),
+          not(isPresent()));
       assertThat(
-          usedRootClassSubject.uniqueFieldWithName("isExtendedWithScalars_"), not(isPresent()));
+          usedRootClassSubject.uniqueFieldWithOriginalName("isExtendedWithScalars_"),
+          not(isPresent()));
     }
   }
 
@@ -221,13 +234,16 @@
       ClassSubject generatedExtensionRegistryLoader = inputInspector.clazz(extensionRegistryName);
       assertThat(generatedExtensionRegistryLoader, isPresent());
       assertThat(
-          generatedExtensionRegistryLoader.uniqueMethodWithName("findLiteExtensionByNumber"),
+          generatedExtensionRegistryLoader.uniqueMethodWithOriginalName(
+              "findLiteExtensionByNumber"),
           isPresent());
       assertThat(
-          generatedExtensionRegistryLoader.uniqueMethodWithName("findLiteExtensionByNumber1"),
+          generatedExtensionRegistryLoader.uniqueMethodWithOriginalName(
+              "findLiteExtensionByNumber1"),
           isPresent());
       assertThat(
-          generatedExtensionRegistryLoader.uniqueMethodWithName("findLiteExtensionByNumber2"),
+          generatedExtensionRegistryLoader.uniqueMethodWithOriginalName(
+              "findLiteExtensionByNumber2"),
           isPresent());
     }
 
@@ -240,13 +256,16 @@
       ClassSubject generatedExtensionRegistryLoader = outputInspector.clazz(extensionRegistryName);
       assertThat(generatedExtensionRegistryLoader, isPresent());
       assertThat(
-          generatedExtensionRegistryLoader.uniqueMethodWithName("findLiteExtensionByNumber"),
+          generatedExtensionRegistryLoader.uniqueMethodWithOriginalName(
+              "findLiteExtensionByNumber"),
           isPresent());
       assertThat(
-          generatedExtensionRegistryLoader.uniqueMethodWithName("findLiteExtensionByNumber1"),
+          generatedExtensionRegistryLoader.uniqueMethodWithOriginalName(
+              "findLiteExtensionByNumber1"),
           isPresent());
       assertThat(
-          generatedExtensionRegistryLoader.uniqueMethodWithName("findLiteExtensionByNumber2"),
+          generatedExtensionRegistryLoader.uniqueMethodWithOriginalName(
+              "findLiteExtensionByNumber2"),
           notIf(isPresent(), enableMinification));
     }
 
@@ -268,45 +287,48 @@
     {
       ClassSubject cfofClassSubject = inputInspector.clazz(CONTAINS_FLAGGED_OFF_FIELD);
       assertThat(cfofClassSubject, isPresent());
-      assertThat(cfofClassSubject.uniqueFieldWithName("conditionallyUsed_"), isPresent());
+      assertThat(cfofClassSubject.uniqueFieldWithOriginalName("conditionallyUsed_"), isPresent());
 
       ClassSubject puClassSubject = inputInspector.clazz(PARTIALLY_USED);
       assertThat(puClassSubject, isPresent());
       assertEquals(7, puClassSubject.allInstanceFields().size());
-      assertThat(puClassSubject.uniqueFieldWithName("bitField0_"), isPresent());
-      assertThat(puClassSubject.uniqueFieldWithName("used_"), isPresent());
-      assertThat(puClassSubject.uniqueFieldWithName("completelyUnused_"), isPresent());
-      assertThat(puClassSubject.uniqueFieldWithName("unusedEnum_"), isPresent());
-      assertThat(puClassSubject.uniqueFieldWithName("unusedRepeatedEnum_"), isPresent());
-      assertThat(puClassSubject.uniqueFieldWithName("unusedMessage_"), isPresent());
-      assertThat(puClassSubject.uniqueFieldWithName("unusedRepeatedMessage_"), isPresent());
+      assertThat(puClassSubject.uniqueFieldWithOriginalName("bitField0_"), isPresent());
+      assertThat(puClassSubject.uniqueFieldWithOriginalName("used_"), isPresent());
+      assertThat(puClassSubject.uniqueFieldWithOriginalName("completelyUnused_"), isPresent());
+      assertThat(puClassSubject.uniqueFieldWithOriginalName("unusedEnum_"), isPresent());
+      assertThat(puClassSubject.uniqueFieldWithOriginalName("unusedRepeatedEnum_"), isPresent());
+      assertThat(puClassSubject.uniqueFieldWithOriginalName("unusedMessage_"), isPresent());
+      assertThat(puClassSubject.uniqueFieldWithOriginalName("unusedRepeatedMessage_"), isPresent());
 
       ClassSubject uvhClassSubject = inputInspector.clazz(USED_VIA_HAZZER);
       assertThat(uvhClassSubject, isPresent());
-      assertThat(uvhClassSubject.uniqueFieldWithName("used_"), isPresent());
-      assertThat(uvhClassSubject.uniqueFieldWithName("unused_"), isPresent());
+      assertThat(uvhClassSubject.uniqueFieldWithOriginalName("used_"), isPresent());
+      assertThat(uvhClassSubject.uniqueFieldWithOriginalName("unused_"), isPresent());
     }
 
     // Verify that various proto fields have been removed in the output.
     {
       ClassSubject cfofClassSubject = outputInspector.clazz(CONTAINS_FLAGGED_OFF_FIELD);
       assertThat(cfofClassSubject, isPresent());
-      assertThat(cfofClassSubject.uniqueFieldWithName("conditionallyUsed_"), not(isPresent()));
+      assertThat(
+          cfofClassSubject.uniqueFieldWithOriginalName("conditionallyUsed_"), not(isPresent()));
 
       ClassSubject puClassSubject = outputInspector.clazz(PARTIALLY_USED);
       assertThat(puClassSubject, isPresent());
-      assertThat(puClassSubject.uniqueFieldWithName("bitField0_"), isPresent());
-      assertThat(puClassSubject.uniqueFieldWithName("used_"), isPresent());
-      assertThat(puClassSubject.uniqueFieldWithName("completelyUnused_"), not(isPresent()));
-      assertThat(puClassSubject.uniqueFieldWithName("unusedEnum_"), not(isPresent()));
-      assertThat(puClassSubject.uniqueFieldWithName("unusedRepeatedEnum_"), not(isPresent()));
-      assertThat(puClassSubject.uniqueFieldWithName("unusedMessage_"), not(isPresent()));
-      assertThat(puClassSubject.uniqueFieldWithName("unusedRepeatedMessage_"), not(isPresent()));
+      assertThat(puClassSubject.uniqueFieldWithOriginalName("bitField0_"), isPresent());
+      assertThat(puClassSubject.uniqueFieldWithOriginalName("used_"), isPresent());
+      assertThat(puClassSubject.uniqueFieldWithOriginalName("completelyUnused_"), not(isPresent()));
+      assertThat(puClassSubject.uniqueFieldWithOriginalName("unusedEnum_"), not(isPresent()));
+      assertThat(
+          puClassSubject.uniqueFieldWithOriginalName("unusedRepeatedEnum_"), not(isPresent()));
+      assertThat(puClassSubject.uniqueFieldWithOriginalName("unusedMessage_"), not(isPresent()));
+      assertThat(
+          puClassSubject.uniqueFieldWithOriginalName("unusedRepeatedMessage_"), not(isPresent()));
 
       ClassSubject uvhClassSubject = outputInspector.clazz(USED_VIA_HAZZER);
       assertThat(uvhClassSubject, isPresent());
-      assertThat(uvhClassSubject.uniqueFieldWithName("used_"), isPresent());
-      assertThat(uvhClassSubject.uniqueFieldWithName("unused_"), not(isPresent()));
+      assertThat(uvhClassSubject.uniqueFieldWithOriginalName("used_"), isPresent());
+      assertThat(uvhClassSubject.uniqueFieldWithOriginalName("unused_"), not(isPresent()));
     }
   }
 
@@ -316,18 +338,18 @@
     {
       ClassSubject classSubject = inputInspector.clazz(USES_ONLY_REPEATED_FIELDS);
       assertThat(classSubject, isPresent());
-      assertThat(classSubject.uniqueFieldWithName("bitField0_"), isPresent());
-      assertThat(classSubject.uniqueFieldWithName("myoneof_"), isPresent());
-      assertThat(classSubject.uniqueFieldWithName("myoneofCase_"), isPresent());
+      assertThat(classSubject.uniqueFieldWithOriginalName("bitField0_"), isPresent());
+      assertThat(classSubject.uniqueFieldWithOriginalName("myoneof_"), isPresent());
+      assertThat(classSubject.uniqueFieldWithOriginalName("myoneofCase_"), isPresent());
     }
 
     // Verify that various proto fields have been removed in the output.
     {
       ClassSubject classSubject = outputInspector.clazz(USES_ONLY_REPEATED_FIELDS);
       assertThat(classSubject, isPresent());
-      assertThat(classSubject.uniqueFieldWithName("bitField0_"), not(isPresent()));
-      assertThat(classSubject.uniqueFieldWithName("myoneof_"), not(isPresent()));
-      assertThat(classSubject.uniqueFieldWithName("myoneofCase_"), not(isPresent()));
+      assertThat(classSubject.uniqueFieldWithOriginalName("bitField0_"), not(isPresent()));
+      assertThat(classSubject.uniqueFieldWithOriginalName("myoneof_"), not(isPresent()));
+      assertThat(classSubject.uniqueFieldWithOriginalName("myoneofCase_"), not(isPresent()));
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/internal/proto/Proto3ShrinkingTest.java b/src/test/java/com/android/tools/r8/internal/proto/Proto3ShrinkingTest.java
index e2b8e51..0fa0a5b 100644
--- a/src/test/java/com/android/tools/r8/internal/proto/Proto3ShrinkingTest.java
+++ b/src/test/java/com/android/tools/r8/internal/proto/Proto3ShrinkingTest.java
@@ -84,16 +84,16 @@
       ClassSubject puClassSubject = inputInspector.clazz(PARTIALLY_USED);
       assertThat(puClassSubject, isPresent());
       assertEquals(2, puClassSubject.allInstanceFields().size());
-      assertThat(puClassSubject.uniqueFieldWithName("used_"), isPresent());
-      assertThat(puClassSubject.uniqueFieldWithName("completelyUnused_"), isPresent());
+      assertThat(puClassSubject.uniqueFieldWithOriginalName("used_"), isPresent());
+      assertThat(puClassSubject.uniqueFieldWithOriginalName("completelyUnused_"), isPresent());
     }
 
     // Verify that various proto fields have been removed in the output.
     {
       ClassSubject puClassSubject = outputInspector.clazz(PARTIALLY_USED);
       assertThat(puClassSubject, isPresent());
-      assertThat(puClassSubject.uniqueFieldWithName("used_"), isPresent());
-      assertThat(puClassSubject.uniqueFieldWithName("completelyUnused_"), not(isPresent()));
+      assertThat(puClassSubject.uniqueFieldWithOriginalName("used_"), isPresent());
+      assertThat(puClassSubject.uniqueFieldWithOriginalName("completelyUnused_"), not(isPresent()));
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/AnalysisTestBase.java b/src/test/java/com/android/tools/r8/ir/analysis/AnalysisTestBase.java
index a015fd9..0f596b1 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/AnalysisTestBase.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/AnalysisTestBase.java
@@ -94,7 +94,8 @@
 
   public void buildAndCheckIR(String methodName, Consumer<IRCode> irInspector) {
     CodeInspector inspector = new CodeInspector(appView.appInfo().app());
-    MethodSubject methodSubject = inspector.clazz(className).uniqueMethodWithName(methodName);
+    MethodSubject methodSubject =
+        inspector.clazz(className).uniqueMethodWithOriginalName(methodName);
     irInspector.accept(methodSubject.buildIR(appView));
   }
 
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/initializedclasses/InitializedClassesOnNormalExitAnalysisTest.java b/src/test/java/com/android/tools/r8/ir/analysis/initializedclasses/InitializedClassesOnNormalExitAnalysisTest.java
index 7d05b2d..d48d5ad 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/initializedclasses/InitializedClassesOnNormalExitAnalysisTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/initializedclasses/InitializedClassesOnNormalExitAnalysisTest.java
@@ -68,7 +68,7 @@
       ClassSubject classSubject = inspector.clazz(A.class);
       assertThat(classSubject, isPresent());
 
-      MethodSubject methodSubject = classSubject.uniqueMethodWithName("inlineable");
+      MethodSubject methodSubject = classSubject.uniqueMethodWithOriginalName("inlineable");
       assertThat(methodSubject, not(isPresent()));
     }
   }
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/ArrayOfObjectsCreationCanBePostponedTest.java b/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/ArrayOfObjectsCreationCanBePostponedTest.java
index 065e069..c74f7e5 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/ArrayOfObjectsCreationCanBePostponedTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/ArrayOfObjectsCreationCanBePostponedTest.java
@@ -49,7 +49,7 @@
     assertThat(classSubject, isPresent());
 
     // We should have been able to inline A.inlineable() since A.<clinit>() can safely be postponed.
-    assertThat(classSubject.uniqueMethodWithName("inlineable"), not(isPresent()));
+    assertThat(classSubject.uniqueMethodWithOriginalName("inlineable"), not(isPresent()));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/EnumClassInitializerCanBePostponedTest.java b/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/EnumClassInitializerCanBePostponedTest.java
index a108b5f..2399475 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/EnumClassInitializerCanBePostponedTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/EnumClassInitializerCanBePostponedTest.java
@@ -55,10 +55,10 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject classSubject = inspector.clazz(TestClass.class);
     assertThat(classSubject, isPresent());
-    assertThat(classSubject.uniqueMethodWithName("dead"), not(isPresent()));
+    assertThat(classSubject.uniqueMethodWithOriginalName("dead"), not(isPresent()));
 
     for (String methodName : ImmutableList.of("testIf", "testSwitch")) {
-      MethodSubject methodSubject = classSubject.uniqueMethodWithName(methodName);
+      MethodSubject methodSubject = classSubject.uniqueMethodWithOriginalName(methodName);
       assertThat(methodSubject, isPresent());
 
       // Verify that all enum reads have been removed.
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/PutObjectWithFinalizeTest.java b/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/PutObjectWithFinalizeTest.java
index eb3138c..ffce57c 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/PutObjectWithFinalizeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/PutObjectWithFinalizeTest.java
@@ -69,7 +69,7 @@
                       "arrayWithIndirectFinalizer",
                       "otherArrayInstanceWithoutFinalizer");
               for (String name : presentFields) {
-                FieldSubject fieldSubject = classSubject.uniqueFieldWithName(name);
+                FieldSubject fieldSubject = classSubject.uniqueFieldWithOriginalName(name);
                 assertThat(name, fieldSubject, isPresent());
                 assertTrue(
                     mainSubject
@@ -87,7 +87,7 @@
                       "indirectInstanceWithoutFinalizer",
                       "arrayWithoutFinalizer");
               for (String name : absentFields) {
-                assertThat(classSubject.uniqueFieldWithName(name), not(isPresent()));
+                assertThat(classSubject.uniqueFieldWithOriginalName(name), not(isPresent()));
               }
             })
         .run(parameters.getRuntime(), TestClass.class)
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/SingletonClassInitializerPatternCanBePostponedTest.java b/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/SingletonClassInitializerPatternCanBePostponedTest.java
index 1950e53..31c7346 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/SingletonClassInitializerPatternCanBePostponedTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/SingletonClassInitializerPatternCanBePostponedTest.java
@@ -53,7 +53,7 @@
 
     // A.inlineable() should be inlined because we should be able to determine that A.<clinit>() can
     // safely be postponed.
-    assertThat(classSubject.uniqueMethodWithName("inlineable"), not(isPresent()));
+    assertThat(classSubject.uniqueMethodWithOriginalName("inlineable"), not(isPresent()));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/SingletonClassInitializerPatternCannotBePostponedTest.java b/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/SingletonClassInitializerPatternCannotBePostponedTest.java
index 7bc227a..61047fe 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/SingletonClassInitializerPatternCannotBePostponedTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/SingletonClassInitializerPatternCannotBePostponedTest.java
@@ -49,8 +49,8 @@
     assertThat(classSubject, isPresent());
 
     // The field A.INSTANCE has been accessed to allow inlining of A.inlineable().
-    assertThat(classSubject.uniqueFieldWithName("INSTANCE"), isPresent());
-    assertThat(classSubject.uniqueMethodWithName("inlineable"), not(isPresent()));
+    assertThat(classSubject.uniqueFieldWithOriginalName("INSTANCE"), isPresent());
+    assertThat(classSubject.uniqueMethodWithOriginalName("inlineable"), not(isPresent()));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/SingletonClassInitializerWithInstancePutCanBePostponedTest.java b/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/SingletonClassInitializerWithInstancePutCanBePostponedTest.java
index 8d3cae4..abf1395 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/SingletonClassInitializerWithInstancePutCanBePostponedTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/SingletonClassInitializerWithInstancePutCanBePostponedTest.java
@@ -15,7 +15,6 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.ir.analysis.sideeffect.SingletonClassInitializerPatternCanBePostponedTest.A;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import org.junit.Test;
@@ -55,10 +54,10 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject classSubject = inspector.clazz(A.class);
     assertThat(classSubject, isPresent());
-    assertThat(classSubject.uniqueFieldWithName("INSTANCE"), isPresent());
+    assertThat(classSubject.uniqueFieldWithOriginalName("INSTANCE"), isPresent());
 
     // A.inlineable() should be inlined, but we should not synthesize an $r8$clinit field.
-    assertThat(classSubject.uniqueMethodWithName("inlineable"), not(isPresent()));
+    assertThat(classSubject.uniqueMethodWithOriginalName("inlineable"), not(isPresent()));
     assertEquals(2, classSubject.allStaticFields().size());
   }
 
diff --git a/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/SingletonClassInitializerWithInstancePutCannotBePostponedTest.java b/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/SingletonClassInitializerWithInstancePutCannotBePostponedTest.java
index 5914a59..37f49fc 100644
--- a/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/SingletonClassInitializerWithInstancePutCannotBePostponedTest.java
+++ b/src/test/java/com/android/tools/r8/ir/analysis/sideeffect/SingletonClassInitializerWithInstancePutCannotBePostponedTest.java
@@ -54,10 +54,10 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject classSubject = inspector.clazz(A.class);
     assertThat(classSubject, isPresent());
-    assertThat(classSubject.uniqueFieldWithName("INSTANCE"), isPresent());
+    assertThat(classSubject.uniqueFieldWithOriginalName("INSTANCE"), isPresent());
 
     // A.inlineable() should be inlined, but we should synthesize an $r8$clinit field.
-    assertThat(classSubject.uniqueMethodWithName("inlineable"), not(isPresent()));
+    assertThat(classSubject.uniqueMethodWithOriginalName("inlineable"), not(isPresent()));
     assertEquals(2, classSubject.allStaticFields().size());
   }
 
diff --git a/src/test/java/com/android/tools/r8/ir/conversion/StringSwitchConversionFromIfTest.java b/src/test/java/com/android/tools/r8/ir/conversion/StringSwitchConversionFromIfTest.java
index 6573810..7db7e04 100644
--- a/src/test/java/com/android/tools/r8/ir/conversion/StringSwitchConversionFromIfTest.java
+++ b/src/test/java/com/android/tools/r8/ir/conversion/StringSwitchConversionFromIfTest.java
@@ -71,7 +71,7 @@
                       "testWithSwitch",
                       "testNullCheckIsPreserved");
               for (String methodName : methodNames) {
-                MethodSubject methodSubject = classSubject.uniqueMethodWithName(methodName);
+                MethodSubject methodSubject = classSubject.uniqueMethodWithOriginalName(methodName);
                 assertThat(methodSubject, isPresent());
                 IRCode code = methodSubject.buildIR();
                 List<Value> hashCodeValues =
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/AlwaysThrowNullTest.java b/src/test/java/com/android/tools/r8/ir/optimize/AlwaysThrowNullTest.java
index 9dcfa24..28c90bf 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/AlwaysThrowNullTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/AlwaysThrowNullTest.java
@@ -190,7 +190,7 @@
 
     int expectedThrow = hasLiveness ? 1 : 0;
     for (String methodName : METHODS_WITH_NPE_GUARD) {
-      MethodSubject withNPEGuard = mainClass.uniqueMethodWithName(methodName);
+      MethodSubject withNPEGuard = mainClass.uniqueMethodWithOriginalName(methodName);
       assertThat(withNPEGuard, isPresent());
       // catch handlers could be split, and thus not always 1, but some small positive numbers.
       assertTrue(
@@ -205,12 +205,12 @@
 
     int expectedHandler = hasLiveness ? 0 : 1;
     MethodSubject withOtherGuard =
-        mainClass.uniqueMethodWithName("uninstantiatedInstancePutWithOtherGuard");
+        mainClass.uniqueMethodWithOriginalName("uninstantiatedInstancePutWithOtherGuard");
     assertThat(withOtherGuard, isPresent());
     assertEquals(expectedHandler, Streams.stream(withOtherGuard.iterateTryCatches()).count());
 
     for (String methodName : METHODS_WITHOUT_GUARD) {
-      MethodSubject mtd = mainClass.uniqueMethodWithName(methodName);
+      MethodSubject mtd = mainClass.uniqueMethodWithOriginalName(methodName);
       assertThat(mtd, isPresent());
       assertEquals(
           hasLiveness,
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/NonNullParamTest.java b/src/test/java/com/android/tools/r8/ir/optimize/NonNullParamTest.java
index e582d84..c73086e 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/NonNullParamTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/NonNullParamTest.java
@@ -89,24 +89,24 @@
     ClassSubject mainSubject = inspector.clazz(mainClass);
     assertThat(mainSubject, isPresent());
 
-    MethodSubject selfCheck = mainSubject.uniqueMethodWithName("selfCheck");
+    MethodSubject selfCheck = mainSubject.uniqueMethodWithOriginalName("selfCheck");
     assertThat(selfCheck, isPresent());
     assertEquals(0, countCallToParamNullCheck(selfCheck));
     assertEquals(1, countPrintCall(selfCheck));
     assertEquals(0, countThrow(selfCheck));
 
-    MethodSubject checkNull = mainSubject.uniqueMethodWithName("checkNull");
+    MethodSubject checkNull = mainSubject.uniqueMethodWithOriginalName("checkNull");
     assertThat(checkNull, isPresent());
     assertEquals(0, countCallToParamNullCheck(checkNull));
     assertEquals(1, countPrintCall(checkNull));
     assertEquals(1, countThrow(checkNull));
 
-    MethodSubject paramCheck = mainSubject.uniqueMethodWithName("nonNullAfterParamCheck");
+    MethodSubject paramCheck = mainSubject.uniqueMethodWithOriginalName("nonNullAfterParamCheck");
     assertThat(paramCheck, isPresent());
     assertEquals(1, countPrintCall(paramCheck));
     assertEquals(1, countThrow(paramCheck));
 
-    paramCheck = mainSubject.uniqueMethodWithName("nonNullAfterParamCheckDifferently");
+    paramCheck = mainSubject.uniqueMethodWithOriginalName("nonNullAfterParamCheckDifferently");
     assertThat(paramCheck, isPresent());
     assertEquals(1, countPrintCall(paramCheck));
     assertEquals(1, countThrow(paramCheck));
@@ -125,17 +125,18 @@
     ClassSubject mainSubject = inspector.clazz(mainClass);
     assertThat(mainSubject, isPresent());
 
-    MethodSubject checkViaCall = mainSubject.uniqueMethodWithName("checkViaCall");
+    MethodSubject checkViaCall = mainSubject.uniqueMethodWithOriginalName("checkViaCall");
     assertThat(checkViaCall, isPresent());
     assertEquals(0, countActCall(checkViaCall));
     assertEquals(2, countPrintCall(checkViaCall));
 
-    MethodSubject checkViaIntrinsic = mainSubject.uniqueMethodWithName("checkViaIntrinsic");
+    MethodSubject checkViaIntrinsic = mainSubject.uniqueMethodWithOriginalName("checkViaIntrinsic");
     assertThat(checkViaIntrinsic, isPresent());
     assertEquals(0, countCallToParamNullCheck(checkViaIntrinsic));
     assertEquals(1, countPrintCall(checkViaIntrinsic));
 
-    MethodSubject checkAtOneLevelHigher = mainSubject.uniqueMethodWithName("checkAtOneLevelHigher");
+    MethodSubject checkAtOneLevelHigher =
+        mainSubject.uniqueMethodWithOriginalName("checkAtOneLevelHigher");
     assertThat(checkAtOneLevelHigher, isPresent());
     assertEquals(1, countPrintCall(checkAtOneLevelHigher));
     assertEquals(0, countThrow(checkAtOneLevelHigher));
@@ -154,17 +155,18 @@
     ClassSubject mainSubject = inspector.clazz(mainClass);
     assertThat(mainSubject, isPresent());
 
-    MethodSubject checkViaCall = mainSubject.uniqueMethodWithName("checkViaCall");
+    MethodSubject checkViaCall = mainSubject.uniqueMethodWithOriginalName("checkViaCall");
     assertThat(checkViaCall, isPresent());
     assertEquals(0, countActCall(checkViaCall));
     assertEquals(canSharePrintCallInSuccessorBlock() ? 1 : 2, countPrintCall(checkViaCall));
 
-    MethodSubject checkViaIntrinsic = mainSubject.uniqueMethodWithName("checkViaIntrinsic");
+    MethodSubject checkViaIntrinsic = mainSubject.uniqueMethodWithOriginalName("checkViaIntrinsic");
     assertThat(checkViaIntrinsic, isPresent());
     assertEquals(0, countCallToParamNullCheck(checkViaIntrinsic));
     assertEquals(1, countPrintCall(checkViaIntrinsic));
 
-    MethodSubject checkAtOneLevelHigher = mainSubject.uniqueMethodWithName("checkAtOneLevelHigher");
+    MethodSubject checkAtOneLevelHigher =
+        mainSubject.uniqueMethodWithOriginalName("checkAtOneLevelHigher");
     assertThat(checkAtOneLevelHigher, isPresent());
     assertEquals(1, countPrintCall(checkAtOneLevelHigher));
     assertEquals(0, countThrow(checkAtOneLevelHigher));
@@ -190,17 +192,18 @@
     ClassSubject mainSubject = inspector.clazz(NonNullParamAfterInvokeVirtual.class);
     assertThat(mainSubject, isPresent());
 
-    MethodSubject checkViaCall = mainSubject.uniqueMethodWithName("checkViaCall");
+    MethodSubject checkViaCall = mainSubject.uniqueMethodWithOriginalName("checkViaCall");
     assertThat(checkViaCall, isPresent());
     assertEquals(0, countActCall(checkViaCall));
     assertEquals(canSharePrintCallInSuccessorBlock() ? 1 : 2, countPrintCall(checkViaCall));
 
-    MethodSubject checkViaIntrinsic = mainSubject.uniqueMethodWithName("checkViaIntrinsic");
+    MethodSubject checkViaIntrinsic = mainSubject.uniqueMethodWithOriginalName("checkViaIntrinsic");
     assertThat(checkViaIntrinsic, isPresent());
     assertEquals(0, countCallToParamNullCheck(checkViaIntrinsic));
     assertEquals(1, countPrintCall(checkViaIntrinsic));
 
-    MethodSubject checkAtOneLevelHigher = mainSubject.uniqueMethodWithName("checkAtOneLevelHigher");
+    MethodSubject checkAtOneLevelHigher =
+        mainSubject.uniqueMethodWithOriginalName("checkAtOneLevelHigher");
     assertThat(checkAtOneLevelHigher, isPresent());
     assertEquals(1, countPrintCall(checkAtOneLevelHigher));
     assertEquals(0, countThrow(checkAtOneLevelHigher));
@@ -246,7 +249,7 @@
     ClassSubject mainSubject = inspector.clazz(NonNullParamInterfaceImpl.class);
     assertThat(mainSubject, isPresent());
 
-    MethodSubject checkViaCall = mainSubject.uniqueMethodWithName("checkViaCall");
+    MethodSubject checkViaCall = mainSubject.uniqueMethodWithOriginalName("checkViaCall");
     assertThat(checkViaCall, isPresent());
     assertEquals(0, countActCall(checkViaCall));
     // The DEX backend reuses the System.out.println invoke.
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/ObjectsRequireNonNullTest.java b/src/test/java/com/android/tools/r8/ir/optimize/ObjectsRequireNonNullTest.java
index f40816f..843ceef 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/ObjectsRequireNonNullTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/ObjectsRequireNonNullTest.java
@@ -89,12 +89,12 @@
     assertThat(mainMethod, isPresent());
     assertEquals(expectedCountInMain, countObjectsRequireNonNull(mainMethod));
 
-    MethodSubject unknownArg = mainClass.uniqueMethodWithName("unknownArg");
+    MethodSubject unknownArg = mainClass.uniqueMethodWithOriginalName("unknownArg");
     assertThat(unknownArg, isPresent());
     // Due to the nullable argument, requireNonNull should remain.
     assertEquals(1, countObjectsRequireNonNull(unknownArg));
 
-    MethodSubject uninit = mainClass.uniqueMethodWithName("consumeUninitialized");
+    MethodSubject uninit = mainClass.uniqueMethodWithOriginalName("consumeUninitialized");
     assertThat(uninit, isPresent());
     assertEquals(expectedCountInConsumer, countObjectsRequireNonNull(uninit));
     if (expectedCountInConsumer == 0) {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/OptimizationSummaryForKeptMethodTest.java b/src/test/java/com/android/tools/r8/ir/optimize/OptimizationSummaryForKeptMethodTest.java
index 7dc327c..ae4ea81 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/OptimizationSummaryForKeptMethodTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/OptimizationSummaryForKeptMethodTest.java
@@ -63,7 +63,8 @@
     // Main method invokes noNormalExits() since it is not allowed to be inlined.
     assertThat(
         mainMethodSubject,
-        invokesMethod(inspector.clazz(KeptClass.class).uniqueMethodWithName("noNormalExits")));
+        invokesMethod(
+            inspector.clazz(KeptClass.class).uniqueMethodWithOriginalName("noNormalExits")));
 
     // The fact that noNormalExits() never returns normally has only been exploited if it is not
     // kept.
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java b/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
index 303bf0c..0e02656 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/R8InliningTest.java
@@ -360,10 +360,10 @@
     CodeInspector inspector =
         new CodeInspector(ImmutableList.of(getGeneratedFile()), getGeneratedProguardMap(), null);
     ClassSubject clazz = inspector.clazz(nullabilityClass);
-    assertThat(clazz.uniqueMethodWithName("conditionalOperator"), isAbsent());
+    assertThat(clazz.uniqueMethodWithOriginalName("conditionalOperator"), isAbsent());
 
     // The enum parameter is unboxed.
-    MethodSubject m = clazz.uniqueMethodWithName("moreControlFlows");
+    MethodSubject m = clazz.uniqueMethodWithOriginalName("moreControlFlows");
     assertTrue(m.isPresent());
 
     // Verify that a.b() is resolved to an inline instance-get.
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/RedundantConstNumberRemovalTest.java b/src/test/java/com/android/tools/r8/ir/optimize/RedundantConstNumberRemovalTest.java
index 27f097b..54fee4e 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/RedundantConstNumberRemovalTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/RedundantConstNumberRemovalTest.java
@@ -71,15 +71,15 @@
             .assertSuccessWithOutput(expectedOutput);
 
     ClassSubject classSubject = result.inspector().clazz(TestClass.class);
-    verifyBooleanCheckTest(classSubject.uniqueMethodWithName("booleanCheckTest"));
-    verifyBooleanCheckTest(classSubject.uniqueMethodWithName("negateBooleanCheckTest"));
-    verifyIntCheckTest(classSubject.uniqueMethodWithName("intCheckTest"));
-    verifyIntCheckTest(classSubject.uniqueMethodWithName("negateIntCheckTest"));
-    verifyNullCheckTest(classSubject.uniqueMethodWithName("nullCheckTest"));
-    verifyNullCheckTest(classSubject.uniqueMethodWithName("invertedNullCheckTest"));
-    verifyNullCheckTest(classSubject.uniqueMethodWithName("nonNullCheckTest"));
+    verifyBooleanCheckTest(classSubject.uniqueMethodWithOriginalName("booleanCheckTest"));
+    verifyBooleanCheckTest(classSubject.uniqueMethodWithOriginalName("negateBooleanCheckTest"));
+    verifyIntCheckTest(classSubject.uniqueMethodWithOriginalName("intCheckTest"));
+    verifyIntCheckTest(classSubject.uniqueMethodWithOriginalName("negateIntCheckTest"));
+    verifyNullCheckTest(classSubject.uniqueMethodWithOriginalName("nullCheckTest"));
+    verifyNullCheckTest(classSubject.uniqueMethodWithOriginalName("invertedNullCheckTest"));
+    verifyNullCheckTest(classSubject.uniqueMethodWithOriginalName("nonNullCheckTest"));
     verifyNullCheckWithWrongTypeTest(
-        classSubject.uniqueMethodWithName("nullCheckWithWrongTypeTest"));
+        classSubject.uniqueMethodWithOriginalName("nullCheckWithWrongTypeTest"));
   }
 
   private void verifyBooleanCheckTest(MethodSubject methodSubject) {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/SubsumedCatchHandlerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/SubsumedCatchHandlerTest.java
index 3d3db4a..0134f78 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/SubsumedCatchHandlerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/SubsumedCatchHandlerTest.java
@@ -117,6 +117,6 @@
       assertEquals("java.lang.Exception", guard.toSourceString());
     }
 
-    assertThat(classSubject.uniqueMethodWithName("foo"), isAbsent());
+    assertThat(classSubject.uniqueMethodWithOriginalName("foo"), isAbsent());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/CallSiteOptimizationWithInvokeCustomTargetTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/CallSiteOptimizationWithInvokeCustomTargetTest.java
index 283718d..6654e42 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/CallSiteOptimizationWithInvokeCustomTargetTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/CallSiteOptimizationWithInvokeCustomTargetTest.java
@@ -67,9 +67,9 @@
         .inspect(
             inspector -> {
               ClassSubject clazz = inspector.clazz(TestClass.class);
-              assertThat(clazz.uniqueMethodWithName("bootstrap"), isPresent());
-              assertThat(clazz.uniqueMethodWithName("bar"), isPresent());
-              assertThat(clazz.uniqueMethodWithName("foo"), not(isPresent()));
+              assertThat(clazz.uniqueMethodWithOriginalName("bootstrap"), isPresent());
+              assertThat(clazz.uniqueMethodWithOriginalName("bar"), isPresent());
+              assertThat(clazz.uniqueMethodWithOriginalName("foo"), not(isPresent()));
             });
   }
 
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/InvokeInterfaceWithRefinedReceiverTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/InvokeInterfaceWithRefinedReceiverTest.java
index e3afc1c..051b633 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/InvokeInterfaceWithRefinedReceiverTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/InvokeInterfaceWithRefinedReceiverTest.java
@@ -81,7 +81,7 @@
     ClassSubject b = inspector.clazz(B.class);
     assertThat(b, isPresent());
 
-    MethodSubject b_m = b.uniqueMethodWithName("m");
+    MethodSubject b_m = b.uniqueMethodWithOriginalName("m");
     assertThat(b_m, isPresent());
     // Can optimize branches since `arg` is definitely null.
     assertTrue(b_m.streamInstructions().noneMatch(InstructionSubject::isIf));
@@ -89,7 +89,7 @@
     ClassSubject bSub = inspector.clazz(BSub.class);
     assertThat(bSub, isPresent());
 
-    MethodSubject bSub_m = bSub.uniqueMethodWithName("m");
+    MethodSubject bSub_m = bSub.uniqueMethodWithOriginalName("m");
     assertThat(bSub_m, isPresent());
     // Can optimize branches since `arg` is definitely null.
     assertTrue(bSub_m.streamInstructions().noneMatch(InstructionSubject::isIf));
@@ -97,7 +97,7 @@
     ClassSubject c = inspector.clazz(C.class);
     assertThat(c, isPresent());
 
-    MethodSubject c_m = c.uniqueMethodWithName("m");
+    MethodSubject c_m = c.uniqueMethodWithOriginalName("m");
     assertThat(c_m, isPresent());
     // Can optimize branches since `arg` is definitely not null.
     assertTrue(c_m.streamInstructions().noneMatch(InstructionSubject::isIf));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/InvokeVirtualWithRefinedReceiverTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/InvokeVirtualWithRefinedReceiverTest.java
index 847bf55..2127c35 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/InvokeVirtualWithRefinedReceiverTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/InvokeVirtualWithRefinedReceiverTest.java
@@ -76,7 +76,7 @@
     ClassSubject b = inspector.clazz(B.class);
     assertThat(b, isPresent());
 
-    MethodSubject b_m = b.uniqueMethodWithName("m");
+    MethodSubject b_m = b.uniqueMethodWithOriginalName("m");
     assertThat(b_m, isPresent());
     // Can optimize branches since `arg` is definitely null.
     assertTrue(b_m.streamInstructions().noneMatch(InstructionSubject::isIf));
@@ -84,7 +84,7 @@
     ClassSubject bSub = inspector.clazz(BSub.class);
     assertThat(bSub, isPresent());
 
-    MethodSubject bSub_m = bSub.uniqueMethodWithName("m");
+    MethodSubject bSub_m = bSub.uniqueMethodWithOriginalName("m");
     assertThat(bSub_m, isPresent());
     // Can optimize branches since `arg` is definitely null.
     assertTrue(bSub_m.streamInstructions().noneMatch(InstructionSubject::isIf));
@@ -92,7 +92,7 @@
     ClassSubject c = inspector.clazz(C.class);
     assertThat(c, isPresent());
 
-    MethodSubject c_m = c.uniqueMethodWithName("m");
+    MethodSubject c_m = c.uniqueMethodWithOriginalName("m");
     assertThat(c_m, isPresent());
     // Can optimize branches since `arg` is definitely not null.
     assertTrue(c_m.streamInstructions().noneMatch(InstructionSubject::isIf));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/KeptMethodTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/KeptMethodTest.java
index 25f6b89..cb43b17 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/KeptMethodTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/KeptMethodTest.java
@@ -61,7 +61,7 @@
     ClassSubject a = inspector.clazz(A.class);
     assertThat(a, isPresent());
 
-    MethodSubject m = a.uniqueMethodWithName("m");
+    MethodSubject m = a.uniqueMethodWithOriginalName("m");
     assertThat(m, isPresent());
     // Should not optimize branches since the method is kept, accessed via reflection.
     assertTrue(m.streamInstructions().anyMatch(InstructionSubject::isIf));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/LibraryMethodOverridesTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/LibraryMethodOverridesTest.java
index e4b5197..b0f6cc4 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/LibraryMethodOverridesTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/LibraryMethodOverridesTest.java
@@ -76,7 +76,7 @@
     ClassSubject customPredicate = inspector.clazz(CustomPredicate.class);
     assertThat(customPredicate, isPresent());
 
-    MethodSubject m = customPredicate.uniqueMethodWithName("test");
+    MethodSubject m = customPredicate.uniqueMethodWithOriginalName("test");
     // Should not optimize branches since the method is overriding a library method.
     assertTrue(m.streamInstructions().anyMatch(InstructionSubject::isIf));
   }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/WithStaticizerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/WithStaticizerTest.java
index 3dc868d..8f500e1 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/WithStaticizerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/WithStaticizerTest.java
@@ -59,7 +59,7 @@
     // Check if the candidate is indeed staticized.
     ClassSubject companion = inspector.clazz(Host.Companion.class);
     assertThat(companion, isPresent());
-    MethodSubject foo = companion.uniqueMethodWithName("foo");
+    MethodSubject foo = companion.uniqueMethodWithOriginalName("foo");
     assertThat(foo, isPresent());
     assertThat(foo, isStatic());
   }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeDirectNegativeTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeDirectNegativeTest.java
index f55c70b..b35e0e3 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeDirectNegativeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeDirectNegativeTest.java
@@ -65,7 +65,7 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject main = inspector.clazz(MAIN);
     assertThat(main, isPresent());
-    MethodSubject test = main.uniqueMethodWithName("test");
+    MethodSubject test = main.uniqueMethodWithOriginalName("test");
     assertThat(test, isPresent());
     // Should not optimize branches since the value of `arg` is unsure.
     assertTrue(test.streamInstructions().anyMatch(InstructionSubject::isIf));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeDirectPositiveTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeDirectPositiveTest.java
index 2c79f4c..47682c0 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeDirectPositiveTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeDirectPositiveTest.java
@@ -60,7 +60,7 @@
     assertThat(mainMethodSubject, isPresent());
     assertTrue(mainMethodSubject.streamInstructions().noneMatch(InstructionSubject::isConstString));
 
-    MethodSubject test = main.uniqueMethodWithName("test");
+    MethodSubject test = main.uniqueMethodWithOriginalName("test");
     assertThat(test, isPresent());
     assertEquals(0, test.getProgramMethod().getReference().getArity());
     // Can optimize branches since `arg` is definitely "nul", i.e., not containing "null".
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeInterfaceNegativeTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeInterfaceNegativeTest.java
index ca24f1f..8e5efc5 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeInterfaceNegativeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeInterfaceNegativeTest.java
@@ -73,7 +73,7 @@
     assertThat(i, isPresent());
     ClassSubject a = inspector.clazz(A.class);
     assertThat(a, isPresent());
-    MethodSubject a_m = a.uniqueMethodWithName("m");
+    MethodSubject a_m = a.uniqueMethodWithOriginalName("m");
     assertThat(a_m, isPresent());
     // Should not optimize branches since the value of `arg` is unsure.
     assertTrue(a_m.streamInstructions().anyMatch(InstructionSubject::isIf));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeInterfacePositiveTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeInterfacePositiveTest.java
index d1a160a..fe2bf46 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeInterfacePositiveTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeInterfacePositiveTest.java
@@ -82,14 +82,14 @@
     ClassSubject i = inspector.clazz(I.class);
     assertThat(i, isPresent());
 
-    MethodSubject i_m = i.uniqueMethodWithName("m");
+    MethodSubject i_m = i.uniqueMethodWithOriginalName("m");
     assertThat(i_m, isPresent());
     assertEquals(0, i_m.getProgramMethod().getReference().getArity());
 
     ClassSubject a = inspector.clazz(A.class);
     assertThat(a, isPresent());
 
-    MethodSubject a_m = a.uniqueMethodWithName("m");
+    MethodSubject a_m = a.uniqueMethodWithOriginalName("m");
     assertThat(a_m, isPresent());
     assertEquals(0, a_m.getProgramMethod().getReference().getArity());
     // Can optimize branches since `arg` is definitely "nul", i.e., not containing "null".
@@ -98,7 +98,7 @@
     ClassSubject b = inspector.clazz(B.class);
     assertThat(b, isPresent());
 
-    MethodSubject b_m = b.uniqueMethodWithName("m");
+    MethodSubject b_m = b.uniqueMethodWithOriginalName("m");
     assertThat(b_m, isPresent());
     assertEquals(0, b_m.getProgramMethod().getReference().getArity());
     // Can optimize branches since `arg` is definitely "nul", i.e., not containing "null".
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeStaticNegativeTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeStaticNegativeTest.java
index 5c80990..861720e 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeStaticNegativeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeStaticNegativeTest.java
@@ -63,7 +63,7 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject main = inspector.clazz(MAIN);
     assertThat(main, isPresent());
-    MethodSubject test = main.uniqueMethodWithName("test");
+    MethodSubject test = main.uniqueMethodWithOriginalName("test");
     assertThat(test, isPresent());
     // Should not optimize branches since the value of `arg` is unsure.
     assertTrue(test.streamInstructions().anyMatch(InstructionSubject::isIf));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeStaticPositiveTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeStaticPositiveTest.java
index 9f01b31..a6b2376 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeStaticPositiveTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeStaticPositiveTest.java
@@ -59,7 +59,7 @@
       assertTrue(
           mainMethodSubject.streamInstructions().noneMatch(InstructionSubject::isConstString));
 
-    MethodSubject test = main.uniqueMethodWithName("test");
+    MethodSubject test = main.uniqueMethodWithOriginalName("test");
     assertThat(test, isPresent());
     assertEquals(0, test.getProgramMethod().getReference().getArity());
     // Can optimize branches since `arg` is definitely "nul", i.e., not containing "null".
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeVirtualNegativeTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeVirtualNegativeTest.java
index 51593ba..0567d5d 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeVirtualNegativeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeVirtualNegativeTest.java
@@ -79,7 +79,7 @@
     ClassSubject a = inspector.clazz(A.class);
     assertThat(a, isPresent());
 
-    MethodSubject a_m = a.uniqueMethodWithName("m");
+    MethodSubject a_m = a.uniqueMethodWithOriginalName("m");
     assertThat(a_m, isPresent());
     // Should not optimize branches since the value of `arg` is unsure.
     assertTrue(a_m.streamInstructions().anyMatch(InstructionSubject::isIf));
@@ -87,7 +87,7 @@
     ClassSubject b = inspector.clazz(B.class);
     assertThat(b, isPresent());
 
-    MethodSubject b_m = b.uniqueMethodWithName("m");
+    MethodSubject b_m = b.uniqueMethodWithOriginalName("m");
     assertThat(b_m, isPresent());
     // Should not optimize branches since the value of `arg` is unsure.
     assertTrue(a_m.streamInstructions().anyMatch(InstructionSubject::isIf));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeVirtualPositiveTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeVirtualPositiveTest.java
index 1c5689d..cb0a8e3 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeVirtualPositiveTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/constants/InvokeVirtualPositiveTest.java
@@ -74,7 +74,7 @@
     ClassSubject a = inspector.clazz(A.class);
     assertThat(a, isPresent());
 
-    MethodSubject a_m = a.uniqueMethodWithName("m");
+    MethodSubject a_m = a.uniqueMethodWithOriginalName("m");
     assertThat(a_m, isPresent());
     // Can optimize branches since `arg` is definitely "nul", i.e., not containing "null".
     assertTrue(a_m.streamInstructions().noneMatch(InstructionSubject::isIf));
@@ -82,7 +82,7 @@
     ClassSubject b = inspector.clazz(B.class);
     assertThat(b, isPresent());
 
-    MethodSubject b_m = b.uniqueMethodWithName("m");
+    MethodSubject b_m = b.uniqueMethodWithOriginalName("m");
     assertThat(b_m, isPresent());
     // Should not optimize branches since the value of `arg` is unsure.
     assertTrue(b_m.streamInstructions().anyMatch(InstructionSubject::isIf));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeDirectNegativeTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeDirectNegativeTest.java
index 76daffe..5321514 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeDirectNegativeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeDirectNegativeTest.java
@@ -65,7 +65,7 @@
     ClassSubject main = inspector.clazz(MAIN);
     assertThat(main, isPresent());
 
-    MethodSubject test = main.uniqueMethodWithName("test");
+    MethodSubject test = main.uniqueMethodWithOriginalName("test");
     assertThat(test, isPresent());
     // Should not optimize branches since the type of `arg` is unsure.
     assertTrue(test.streamInstructions().anyMatch(InstructionSubject::isIf));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeDirectPositiveTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeDirectPositiveTest.java
index ef373cd..ad78a71 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeDirectPositiveTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeDirectPositiveTest.java
@@ -91,7 +91,7 @@
     ClassSubject main = inspector.clazz(MAIN);
     assertThat(main, isPresent());
 
-    MethodSubject test = main.uniqueMethodWithName("test");
+    MethodSubject test = main.uniqueMethodWithOriginalName("test");
     assertThat(test, isPresent());
     // Can optimize branches since the type of `arg` is Sub1.
     assertTrue(test.streamInstructions().noneMatch(InstructionSubject::isIf));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeInterfaceNegativeTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeInterfaceNegativeTest.java
index 9fe54b4..dafde62 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeInterfaceNegativeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeInterfaceNegativeTest.java
@@ -73,7 +73,7 @@
     ClassSubject a = inspector.clazz(A.class);
     assertThat(a, isPresent());
 
-    MethodSubject a_m = a.uniqueMethodWithName("m");
+    MethodSubject a_m = a.uniqueMethodWithOriginalName("m");
     assertThat(a_m, isPresent());
     // Should not optimize branches since the type of `arg` is unsure.
     assertTrue(a_m.streamInstructions().anyMatch(InstructionSubject::isIf));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeInterfacePositiveTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeInterfacePositiveTest.java
index fd6b29e..e2d2d9a 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeInterfacePositiveTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeInterfacePositiveTest.java
@@ -89,7 +89,7 @@
     ClassSubject a = inspector.clazz(A.class);
     assertThat(a, isPresent());
 
-    MethodSubject a_m = a.uniqueMethodWithName("m");
+    MethodSubject a_m = a.uniqueMethodWithOriginalName("m");
     assertThat(a_m, isPresent());
     // Can optimize branches since the type of `arg` is Sub1.
     assertTrue(a_m.streamInstructions().noneMatch(InstructionSubject::isIf));
@@ -97,7 +97,7 @@
     ClassSubject b = inspector.clazz(B.class);
     assertThat(b, isPresent());
 
-    MethodSubject b_m = b.uniqueMethodWithName("m");
+    MethodSubject b_m = b.uniqueMethodWithOriginalName("m");
     assertThat(b_m, isPresent());
     // Should not optimize branches since the type of `arg` is unsure.
     assertTrue(b_m.streamInstructions().anyMatch(InstructionSubject::isIf));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeStaticNegativeTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeStaticNegativeTest.java
index 2055210..d57418e 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeStaticNegativeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeStaticNegativeTest.java
@@ -63,7 +63,7 @@
     ClassSubject main = inspector.clazz(MAIN);
     assertThat(main, isPresent());
 
-    MethodSubject test = main.uniqueMethodWithName("test");
+    MethodSubject test = main.uniqueMethodWithOriginalName("test");
     assertThat(test, isPresent());
 
     // Should not optimize branches since the type of `arg` is unsure.
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeStaticPositiveTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeStaticPositiveTest.java
index 2dafd1b..fbc799b 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeStaticPositiveTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeStaticPositiveTest.java
@@ -79,7 +79,7 @@
     ClassSubject main = inspector.clazz(MAIN);
     assertThat(main, isPresent());
 
-    MethodSubject test = main.uniqueMethodWithName("test");
+    MethodSubject test = main.uniqueMethodWithOriginalName("test");
     assertThat(test, isPresent());
 
     // Can optimize branches since the type of `arg` is Sub1.
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeVirtualNegativeTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeVirtualNegativeTest.java
index b419ad2..a2325c8 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeVirtualNegativeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeVirtualNegativeTest.java
@@ -77,7 +77,7 @@
     ClassSubject a = inspector.clazz(A.class);
     assertThat(a, isPresent());
 
-    MethodSubject a_m = a.uniqueMethodWithName("m");
+    MethodSubject a_m = a.uniqueMethodWithOriginalName("m");
     assertThat(a_m, isPresent());
     // Should not optimize branches since the type of `arg` is unsure.
     assertTrue(a_m.streamInstructions().anyMatch(InstructionSubject::isIf));
@@ -85,7 +85,7 @@
     ClassSubject b = inspector.clazz(B.class);
     assertThat(b, isPresent());
 
-    MethodSubject b_m = b.uniqueMethodWithName("m");
+    MethodSubject b_m = b.uniqueMethodWithOriginalName("m");
     assertThat(b_m, isPresent());
     // Should not optimize branches since the type of `arg` is unsure.
     assertTrue(b_m.streamInstructions().anyMatch(InstructionSubject::isIf));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeVirtualPositiveTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeVirtualPositiveTest.java
index 382be79..d580a1b 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeVirtualPositiveTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/dynamicupperboundtype/InvokeVirtualPositiveTest.java
@@ -89,7 +89,7 @@
     ClassSubject a = inspector.clazz(A.class);
     assertThat(a, isPresent());
 
-    MethodSubject a_m = a.uniqueMethodWithName("m");
+    MethodSubject a_m = a.uniqueMethodWithOriginalName("m");
     assertThat(a_m, isPresent());
     // Can optimize branches since the type of `arg` is Sub1.
     assertTrue(a_m.streamInstructions().noneMatch(InstructionSubject::isIf));
@@ -97,7 +97,7 @@
     ClassSubject b = inspector.clazz(B.class);
     assertThat(b, isPresent());
 
-    MethodSubject b_m = b.uniqueMethodWithName("m");
+    MethodSubject b_m = b.uniqueMethodWithOriginalName("m");
     assertThat(b_m, isPresent());
     // Can optimize branches since the type of `arg` is Sub1.
     assertTrue(b_m.streamInstructions().noneMatch(InstructionSubject::isIf));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeDirectNegativeTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeDirectNegativeTest.java
index 3a3a62d..a95bac2 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeDirectNegativeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeDirectNegativeTest.java
@@ -61,7 +61,7 @@
     ClassSubject main = inspector.clazz(MAIN);
     assertThat(main, isPresent());
 
-    MethodSubject test = main.uniqueMethodWithName("test");
+    MethodSubject test = main.uniqueMethodWithOriginalName("test");
     assertThat(test, isPresent());
     // Should not optimize branches since the nullability of `arg` is unsure.
     assertTrue(test.streamInstructions().anyMatch(InstructionSubject::isIf));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeDirectPositiveTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeDirectPositiveTest.java
index 11c44ad..94ba810 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeDirectPositiveTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeDirectPositiveTest.java
@@ -64,7 +64,7 @@
     ClassSubject main = inspector.clazz(MAIN);
     assertThat(main, isPresent());
 
-    MethodSubject test = main.uniqueMethodWithName("test");
+    MethodSubject test = main.uniqueMethodWithOriginalName("test");
     assertThat(test, isPresent());
     // Can optimize branches since `arg` is definitely not null.
     assertTrue(test.streamInstructions().noneMatch(InstructionSubject::isIf));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeInterfaceNegativeTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeInterfaceNegativeTest.java
index a80798a..485b02e 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeInterfaceNegativeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeInterfaceNegativeTest.java
@@ -81,7 +81,7 @@
     ClassSubject a = inspector.clazz(A.class);
     assertThat(a, isPresent());
 
-    MethodSubject a_m = a.uniqueMethodWithName("m");
+    MethodSubject a_m = a.uniqueMethodWithOriginalName("m");
     assertThat(a_m, isPresent());
     // Should not optimize branches since the nullability of `arg` is unsure.
     assertTrue(a_m.streamInstructions().anyMatch(InstructionSubject::isIf));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeInterfacePositiveTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeInterfacePositiveTest.java
index b3988ee..4f34bad 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeInterfacePositiveTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeInterfacePositiveTest.java
@@ -73,7 +73,7 @@
     ClassSubject a = inspector.clazz(A.class);
     assertThat(a, isPresent());
 
-    MethodSubject a_m = a.uniqueMethodWithName("m");
+    MethodSubject a_m = a.uniqueMethodWithOriginalName("m");
     assertThat(a_m, isPresent());
     // Can optimize branches since `arg` is definitely not null.
     assertTrue(a_m.streamInstructions().noneMatch(InstructionSubject::isIf));
@@ -81,7 +81,7 @@
     ClassSubject b = inspector.clazz(B.class);
     assertThat(b, isPresent());
 
-    MethodSubject b_m = b.uniqueMethodWithName("m");
+    MethodSubject b_m = b.uniqueMethodWithOriginalName("m");
     assertThat(b_m, isPresent());
     // Can optimize branches since `arg` is definitely not null.
     assertTrue(b_m.streamInstructions().noneMatch(InstructionSubject::isIf));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeStaticNegativeTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeStaticNegativeTest.java
index 6175434..64f0588 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeStaticNegativeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeStaticNegativeTest.java
@@ -57,7 +57,7 @@
     ClassSubject main = inspector.clazz(MAIN);
     assertThat(main, isPresent());
 
-    MethodSubject test = main.uniqueMethodWithName("test");
+    MethodSubject test = main.uniqueMethodWithOriginalName("test");
     assertThat(test, isPresent());
     // Should not optimize branches since the nullability of `arg` is unsure.
     assertTrue(test.streamInstructions().anyMatch(InstructionSubject::isIf));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeStaticPositiveTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeStaticPositiveTest.java
index d181d3b..c81ec91 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeStaticPositiveTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeStaticPositiveTest.java
@@ -62,7 +62,7 @@
     ClassSubject main = inspector.clazz(MAIN);
     assertThat(main, isPresent());
 
-    MethodSubject test = main.uniqueMethodWithName("test");
+    MethodSubject test = main.uniqueMethodWithOriginalName("test");
     assertThat(test, isPresent());
     // Can optimize branches since `arg` is definitely not null.
     assertTrue(test.streamInstructions().noneMatch(InstructionSubject::isIf));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeVirtualCascadeTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeVirtualCascadeTest.java
index 60e3dd8..3606473 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeVirtualCascadeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeVirtualCascadeTest.java
@@ -53,14 +53,14 @@
     ClassSubject a = inspector.clazz(A.class);
     assertThat(a, isPresent());
 
-    MethodSubject a_m = a.uniqueMethodWithName("m");
+    MethodSubject a_m = a.uniqueMethodWithOriginalName("m");
     assertThat(a_m, isPresent());
       assertTrue(a_m.streamInstructions().noneMatch(InstructionSubject::isIf));
 
     ClassSubject b = inspector.clazz(B.class);
     assertThat(b, isPresent());
 
-    MethodSubject b_m = b.uniqueMethodWithName("m");
+    MethodSubject b_m = b.uniqueMethodWithOriginalName("m");
     assertThat(b_m, isPresent());
     assertTrue(b_m.streamInstructions().noneMatch(InstructionSubject::isIf));
   }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeVirtualNegativeTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeVirtualNegativeTest.java
index 08bd75c..9e4b9f5 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeVirtualNegativeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeVirtualNegativeTest.java
@@ -84,7 +84,7 @@
     ClassSubject a = inspector.clazz(A.class);
     assertThat(a, isPresent());
 
-    MethodSubject a_m = a.uniqueMethodWithName("m");
+    MethodSubject a_m = a.uniqueMethodWithOriginalName("m");
     assertThat(a_m, isPresent());
     // Should not optimize branches since the nullability of `arg` is unsure.
     assertTrue(a_m.streamInstructions().anyMatch(InstructionSubject::isIf));
@@ -92,7 +92,7 @@
     ClassSubject b = inspector.clazz(B.class);
     assertThat(b, isPresent());
 
-    MethodSubject b_m = b.uniqueMethodWithName("m");
+    MethodSubject b_m = b.uniqueMethodWithOriginalName("m");
     assertThat(b_m, isPresent());
     // Should not optimize branches since the nullability of `arg` is unsure.
     assertTrue(a_m.streamInstructions().anyMatch(InstructionSubject::isIf));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeVirtualPositiveTest.java b/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeVirtualPositiveTest.java
index c1c88a2..ecd71d8 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeVirtualPositiveTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/callsites/nullability/InvokeVirtualPositiveTest.java
@@ -79,7 +79,7 @@
     ClassSubject a = inspector.clazz(A.class);
     assertThat(a, isPresent());
 
-    MethodSubject a_m = a.uniqueMethodWithName("m");
+    MethodSubject a_m = a.uniqueMethodWithOriginalName("m");
     assertThat(a_m, isPresent());
     // Can optimize branches since `arg` is definitely not null.
     assertTrue(a_m.streamInstructions().noneMatch(InstructionSubject::isIf));
@@ -87,7 +87,7 @@
     ClassSubject b = inspector.clazz(B.class);
     assertThat(b, isPresent());
 
-    MethodSubject b_m = b.uniqueMethodWithName("m");
+    MethodSubject b_m = b.uniqueMethodWithOriginalName("m");
     assertThat(b_m, isPresent());
     // Should not optimize branches since the nullability of `arg` is unsure.
     assertTrue(b_m.streamInstructions().anyMatch(InstructionSubject::isIf));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/ConstClassCanonicalizationMonitorTest.java b/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/ConstClassCanonicalizationMonitorTest.java
index 7d99b55..11a24ea 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/ConstClassCanonicalizationMonitorTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/ConstClassCanonicalizationMonitorTest.java
@@ -52,7 +52,7 @@
             inspector -> {
               ClassSubject clazz = inspector.clazz(Main.class);
               assertThat(clazz, isPresent());
-              MethodSubject testSubject = clazz.uniqueMethodWithName("test");
+              MethodSubject testSubject = clazz.uniqueMethodWithOriginalName("test");
               assertThat(testSubject, isPresent());
               Optional<InstructionSubject> insertedMonitor =
                   testSubject
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/EnumCanonicalizationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/EnumCanonicalizationTest.java
index 709a44b..c2e5e06 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/EnumCanonicalizationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/EnumCanonicalizationTest.java
@@ -54,7 +54,7 @@
     ClassSubject enumSubject = inspector.clazz(MyEnum.class);
     assertThat(enumSubject, isPresent());
 
-    FieldSubject enumFieldSubject = enumSubject.uniqueFieldWithName("A");
+    FieldSubject enumFieldSubject = enumSubject.uniqueFieldWithOriginalName("A");
     assertThat(enumFieldSubject, isPresent());
 
     ClassSubject enumWithClassInitializationSideEffectsSubject =
@@ -62,7 +62,7 @@
     assertThat(enumWithClassInitializationSideEffectsSubject, isPresent());
 
     FieldSubject enumWithClassInitializationSideEffectsFieldSubject =
-        enumWithClassInitializationSideEffectsSubject.uniqueFieldWithName("A");
+        enumWithClassInitializationSideEffectsSubject.uniqueFieldWithOriginalName("A");
     assertThat(enumWithClassInitializationSideEffectsFieldSubject, isPresent());
 
     MethodSubject mainMethodSubject = classSubject.mainMethod();
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/StringInMonitorTest.java b/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/StringInMonitorTest.java
index bc04d7e..ff6a112 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/StringInMonitorTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/canonicalization/StringInMonitorTest.java
@@ -141,7 +141,7 @@
       }
     }
 
-    MethodSubject sync = mainClass.uniqueMethodWithName("sync");
+    MethodSubject sync = mainClass.uniqueMethodWithOriginalName("sync");
     assertThat(sync, isPresent());
     count = Streams.stream(sync.iterateInstructions(
         i -> i.isConstString("", JumboStringMode.ALLOW))).count();
@@ -169,7 +169,7 @@
       }
     }
 
-    MethodSubject oom = mainClass.uniqueMethodWithName("oom");
+    MethodSubject oom = mainClass.uniqueMethodWithOriginalName("oom");
     assertThat(oom, isPresent());
     count = Streams.stream(oom.iterateInstructions(
         i -> i.isConstString("this-string-will-not-be-loaded.", JumboStringMode.ALLOW))).count();
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/checkcast/CheckCastNullForTypeTest.java b/src/test/java/com/android/tools/r8/ir/optimize/checkcast/CheckCastNullForTypeTest.java
index 1f7b39a..5dc2510 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/checkcast/CheckCastNullForTypeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/checkcast/CheckCastNullForTypeTest.java
@@ -55,7 +55,7 @@
             codeInspector -> {
               ClassSubject main = codeInspector.clazz(Main.class);
               assertThat(main, isPresent());
-              MethodSubject mainMethod = main.uniqueMethodWithName("main");
+              MethodSubject mainMethod = main.uniqueMethodWithOriginalName("main");
               assertThat(mainMethod, isPresent());
               assertEquals(
                   0,
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/checkcast/TrivialTypeTestsAfterBranchPruningTest.java b/src/test/java/com/android/tools/r8/ir/optimize/checkcast/TrivialTypeTestsAfterBranchPruningTest.java
index a1577a3..659764a 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/checkcast/TrivialTypeTestsAfterBranchPruningTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/checkcast/TrivialTypeTestsAfterBranchPruningTest.java
@@ -52,16 +52,16 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject classSubject = inspector.clazz(TestClass.class);
     assertThat(classSubject, isPresent());
-    assertThat(classSubject.uniqueMethodWithName("dead"), not(isPresent()));
+    assertThat(classSubject.uniqueMethodWithOriginalName("dead"), not(isPresent()));
 
     MethodSubject trivialCastMethodSubject =
-        classSubject.uniqueMethodWithName("trivialCastAfterBranchPruningTest");
+        classSubject.uniqueMethodWithOriginalName("trivialCastAfterBranchPruningTest");
     assertThat(trivialCastMethodSubject, isPresent());
     assertTrue(
         trivialCastMethodSubject.streamInstructions().noneMatch(InstructionSubject::isCheckCast));
 
     MethodSubject branchPruningMethodSubject =
-        classSubject.uniqueMethodWithName("branchPruningAfterInstanceOfOptimization");
+        classSubject.uniqueMethodWithOriginalName("branchPruningAfterInstanceOfOptimization");
     assertThat(branchPruningMethodSubject, isPresent());
     assertTrue(
         branchPruningMethodSubject
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/classinitializerdefaults/NonFinalFieldWithDefaultValueTest.java b/src/test/java/com/android/tools/r8/ir/optimize/classinitializerdefaults/NonFinalFieldWithDefaultValueTest.java
index 2922b90..30dd4b4 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/classinitializerdefaults/NonFinalFieldWithDefaultValueTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/classinitializerdefaults/NonFinalFieldWithDefaultValueTest.java
@@ -72,7 +72,7 @@
 
     // No instructions can read field f1 before it is assigned, and therefore, we can safely
     // remove the static-put instruction and update the static value of the field.
-    FieldSubject f1FieldSubject = testClassSubject.uniqueFieldWithName("f1");
+    FieldSubject f1FieldSubject = testClassSubject.uniqueFieldWithOriginalName("f1");
     assertThat(f1FieldSubject, isPresent());
     assertNotNull(f1FieldSubject.getField().getStaticValue());
     assertTrue(f1FieldSubject.getField().getStaticValue().isDexValueInt());
@@ -80,7 +80,7 @@
 
     // Field f3 is assigned after an instruction that could read it, and therefore, we cannot safely
     // remove the static-put instruction and update the static value of the field.
-    FieldSubject f3FieldSubject = testClassSubject.uniqueFieldWithName("f3");
+    FieldSubject f3FieldSubject = testClassSubject.uniqueFieldWithOriginalName("f3");
     assertThat(f3FieldSubject, isPresent());
     assertNotNull(f3FieldSubject.getField().getStaticValue());
     assertTrue(f3FieldSubject.getField().getStaticValue().isDexValueInt());
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlineKeepMethodTest.java b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlineKeepMethodTest.java
index 16aac95..92383ae 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlineKeepMethodTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlineKeepMethodTest.java
@@ -73,7 +73,7 @@
             .inspector();
     ClassSubject clazz = inspector.clazz(Keeper.class);
     assertThat(clazz, isPresent());
-    MethodSubject main = clazz.uniqueMethodWithName("main");
+    MethodSubject main = clazz.uniqueMethodWithOriginalName("main");
     assertTrue(main.streamInstructions().noneMatch(i -> i.isConstString(JumboStringMode.ALLOW)));
   }
 }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerSimplePairBuilderTest.java b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerSimplePairBuilderTest.java
index efdaea1..c0daee1 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerSimplePairBuilderTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerSimplePairBuilderTest.java
@@ -82,9 +82,9 @@
     assertThat(inspector.clazz(PairBuilder.class), not(isPresent()));
 
     Set<String> expected = ImmutableSet.of(StringBuilder.class.getTypeName());
-    assertEquals(expected, collectTypes(clazz.uniqueMethodWithName("testSimpleBuilder1")));
-    assertEquals(expected, collectTypes(clazz.uniqueMethodWithName("testSimpleBuilder2")));
-    assertEquals(expected, collectTypes(clazz.uniqueMethodWithName("testSimpleBuilder3")));
+    assertEquals(expected, collectTypes(clazz.uniqueMethodWithOriginalName("testSimpleBuilder1")));
+    assertEquals(expected, collectTypes(clazz.uniqueMethodWithOriginalName("testSimpleBuilder2")));
+    assertEquals(expected, collectTypes(clazz.uniqueMethodWithOriginalName("testSimpleBuilder3")));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerStaticGetDirectMonitorTest.java b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerStaticGetDirectMonitorTest.java
index cd28e2a..c79c42e 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerStaticGetDirectMonitorTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerStaticGetDirectMonitorTest.java
@@ -53,13 +53,13 @@
     assertTrue(
         inspector
             .clazz(TestClass.class)
-            .uniqueMethodWithName("produce1")
+            .uniqueMethodWithOriginalName("produce1")
             .streamInstructions()
             .anyMatch(InstructionSubject::isMonitorEnter));
     assertTrue(
         inspector
             .clazz(TestClass.class)
-            .uniqueMethodWithName("produce2")
+            .uniqueMethodWithOriginalName("produce2")
             .streamInstructions()
             .anyMatch(InstructionSubject::isMonitorExit));
   }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerStaticGetExtraMethodMonitorTest.java b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerStaticGetExtraMethodMonitorTest.java
index 23c364e..a730b8a 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerStaticGetExtraMethodMonitorTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerStaticGetExtraMethodMonitorTest.java
@@ -49,7 +49,8 @@
   }
 
   private void inspect(CodeInspector inspector) {
-    assertThat(inspector.clazz(Container.class).uniqueMethodWithName("increment"), isPresent());
+    assertThat(
+        inspector.clazz(Container.class).uniqueMethodWithOriginalName("increment"), isPresent());
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerStaticGetMonitorTest.java b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerStaticGetMonitorTest.java
index f858a0e..32be199 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerStaticGetMonitorTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerStaticGetMonitorTest.java
@@ -49,7 +49,8 @@
   }
 
   private void inspect(CodeInspector inspector) {
-    assertThat(inspector.clazz(Container.class).uniqueMethodWithName("increment"), isPresent());
+    assertThat(
+        inspector.clazz(Container.class).uniqueMethodWithOriginalName("increment"), isPresent());
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerTest.java
index 8e5d660..6c30034 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ClassInlinerTest.java
@@ -109,50 +109,52 @@
 
     assertEquals(
         Collections.singleton("java.lang.StringBuilder"),
-        collectTypes(clazz.uniqueMethodWithName("testInner")));
+        collectTypes(clazz.uniqueMethodWithOriginalName("testInner")));
 
     assertEquals(
         Collections.emptySet(),
-        collectTypes(clazz.uniqueMethodWithName("testConstructorMapping1")));
+        collectTypes(clazz.uniqueMethodWithOriginalName("testConstructorMapping1")));
 
     assertEquals(
         Collections.emptySet(),
-        collectTypes(clazz.uniqueMethodWithName("testConstructorMapping2")));
+        collectTypes(clazz.uniqueMethodWithOriginalName("testConstructorMapping2")));
 
     assertEquals(
         Collections.singleton("java.lang.StringBuilder"),
-        collectTypes(clazz.uniqueMethodWithName("testConstructorMapping3")));
+        collectTypes(clazz.uniqueMethodWithOriginalName("testConstructorMapping3")));
 
     assertEquals(
-        Collections.emptySet(), collectTypes(clazz.uniqueMethodWithName("testEmptyClass")));
+        Collections.emptySet(), collectTypes(clazz.uniqueMethodWithOriginalName("testEmptyClass")));
 
     assertEquals(
         Collections.singleton(
             "com.android.tools.r8.ir.optimize.classinliner.trivial.EmptyClassWithInitializer"),
-        collectTypes(clazz.uniqueMethodWithName("testEmptyClassWithInitializer")));
+        collectTypes(clazz.uniqueMethodWithOriginalName("testEmptyClassWithInitializer")));
 
     assertEquals(
         Collections.singleton(
             "com.android.tools.r8.ir.optimize.classinliner.trivial.ClassWithFinal"),
-        collectTypes(clazz.uniqueMethodWithName("testClassWithFinalizer")));
+        collectTypes(clazz.uniqueMethodWithOriginalName("testClassWithFinalizer")));
 
     assertEquals(
-        Collections.emptySet(), collectTypes(clazz.uniqueMethodWithName("testCallOnIface1")));
+        Collections.emptySet(),
+        collectTypes(clazz.uniqueMethodWithOriginalName("testCallOnIface1")));
 
     assertEquals(
-        Collections.emptySet(), collectTypes(clazz.uniqueMethodWithName("testCallOnIface2")));
+        Collections.emptySet(),
+        collectTypes(clazz.uniqueMethodWithOriginalName("testCallOnIface2")));
 
     assertEquals(
         Sets.newHashSet(
             "com.android.tools.r8.ir.optimize.classinliner.trivial.CycleReferenceAB",
             "java.lang.StringBuilder"),
-        collectTypes(clazz.uniqueMethodWithName("testCycles")));
+        collectTypes(clazz.uniqueMethodWithOriginalName("testCycles")));
 
     assertEquals(
         Sets.newHashSet(
             "java.lang.StringBuilder",
             "com.android.tools.r8.ir.optimize.classinliner.trivial.CycleReferenceAB"),
-        collectTypes(inspector.clazz(CycleReferenceAB.class).uniqueMethodWithName("foo")));
+        collectTypes(inspector.clazz(CycleReferenceAB.class).uniqueMethodWithOriginalName("foo")));
 
     assertThat(inspector.clazz(CycleReferenceBA.class), isAbsent());
   }
@@ -219,11 +221,14 @@
     CodeInspector inspector = result.inspector();
     ClassSubject clazz = inspector.clazz(C.class);
 
-    assertEquals(Collections.emptySet(), collectTypes(clazz.uniqueMethodWithName("method1")));
+    assertEquals(
+        Collections.emptySet(), collectTypes(clazz.uniqueMethodWithOriginalName("method1")));
 
-    assertEquals(Collections.emptySet(), collectTypes(clazz.uniqueMethodWithName("method2")));
+    assertEquals(
+        Collections.emptySet(), collectTypes(clazz.uniqueMethodWithOriginalName("method2")));
 
-    assertEquals(Collections.emptySet(), collectTypes(clazz.uniqueMethodWithName("method3")));
+    assertEquals(
+        Collections.emptySet(), collectTypes(clazz.uniqueMethodWithOriginalName("method3")));
 
     assertFalse(inspector.clazz(C.L.class).isPresent());
     assertFalse(inspector.clazz(C.F.class).isPresent());
@@ -264,15 +269,15 @@
     // TODO(b/143129517, 141719453): This expectation relies on the class inlining limits.
     assertEquals(
         Sets.newHashSet("java.lang.StringBuilder", "java.lang.RuntimeException"),
-        collectTypes(clazz.uniqueMethodWithName("testExtraNeverReturnsNormally")));
+        collectTypes(clazz.uniqueMethodWithOriginalName("testExtraNeverReturnsNormally")));
 
     assertEquals(
         Sets.newHashSet("java.lang.StringBuilder", "java.lang.RuntimeException"),
-        collectTypes(clazz.uniqueMethodWithName("testDirectNeverReturnsNormally")));
+        collectTypes(clazz.uniqueMethodWithOriginalName("testDirectNeverReturnsNormally")));
 
     assertEquals(
         Sets.newHashSet("java.lang.StringBuilder", "java.lang.RuntimeException"),
-        collectTypes(clazz.uniqueMethodWithName("testInitNeverReturnsNormally")));
+        collectTypes(clazz.uniqueMethodWithOriginalName("testInitNeverReturnsNormally")));
 
     assertThat(
         inspector.clazz(InvalidRootsTestClass.NeverReturnsNormally.class),
@@ -283,7 +288,7 @@
     // TODO(b/143129517, b/141719453): This expectation relies on the class inlining limits.
     assertEquals(
         Sets.newHashSet("java.lang.StringBuilder", "java.lang.RuntimeException"),
-        collectTypes(clazz.uniqueMethodWithName("testRootInvalidatesAfterInlining")));
+        collectTypes(clazz.uniqueMethodWithOriginalName("testRootInvalidatesAfterInlining")));
 
     assertThat(inspector.clazz(InvalidRootsTestClass.A.class), not(isPresent()));
     assertThat(inspector.clazz(InvalidRootsTestClass.B.class), not(isPresent()));
@@ -323,13 +328,13 @@
     // TODO(b/120814598): Should only be "java.lang.StringBuilder".
     assertEquals(
         new HashSet<>(synthesizedJavaLambdaClasses),
-        collectTypes(clazz.uniqueMethodWithName("testStatelessLambda")));
+        collectTypes(clazz.uniqueMethodWithOriginalName("testStatelessLambda")));
     assertTrue(
         inspector.allClasses().stream().anyMatch(ClassSubject::isSynthesizedJavaLambdaClass));
 
     assertEquals(
         Sets.newHashSet("java.lang.StringBuilder"),
-        collectTypes(clazz.uniqueMethodWithName("testStatefulLambda")));
+        collectTypes(clazz.uniqueMethodWithOriginalName("testStatefulLambda")));
   }
 
   private String getProguardConfig(String main) {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/classmerger/vertical/NoLongerSyntheticAfterVerticalClassMergingTest.java b/src/test/java/com/android/tools/r8/ir/optimize/classmerger/vertical/NoLongerSyntheticAfterVerticalClassMergingTest.java
index 6fe9d09..809c81a 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/classmerger/vertical/NoLongerSyntheticAfterVerticalClassMergingTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/classmerger/vertical/NoLongerSyntheticAfterVerticalClassMergingTest.java
@@ -57,7 +57,7 @@
     ClassSubject bClassSubject = inspector.clazz(B.class);
     assertThat(bClassSubject, isPresent());
 
-    MethodSubject mMethodSubject = bClassSubject.uniqueMethodWithName("m");
+    MethodSubject mMethodSubject = bClassSubject.uniqueMethodWithOriginalName("m");
     assertThat(mMethodSubject, isPresent());
     assertFalse(mMethodSubject.getMethod().accessFlags.isSynthetic());
   }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/DevirtualizeLibrarySuperTest.java b/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/DevirtualizeLibrarySuperTest.java
index e82bd6e..f3d1079 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/DevirtualizeLibrarySuperTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/DevirtualizeLibrarySuperTest.java
@@ -46,7 +46,8 @@
         .compile()
         .inspect(
             inspector -> {
-              MethodSubject fooMethod = inspector.clazz(Main.class).uniqueMethodWithName("foo");
+              MethodSubject fooMethod =
+                  inspector.clazz(Main.class).uniqueMethodWithOriginalName("foo");
               assertThat(fooMethod, isPresent());
               assertThat(
                   fooMethod,
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/InterfaceRenewalInLoopDebugTestRunner.java b/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/InterfaceRenewalInLoopDebugTestRunner.java
index 2b6a5c8..bb751a2 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/InterfaceRenewalInLoopDebugTestRunner.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/InterfaceRenewalInLoopDebugTestRunner.java
@@ -52,7 +52,7 @@
     CodeInspector inspector = result.inspector();
     ClassSubject mainSubject = inspector.clazz(MAIN);
     assertThat(mainSubject, isPresent());
-    MethodSubject methodSubject = mainSubject.uniqueMethodWithName("booRunner");
+    MethodSubject methodSubject = mainSubject.uniqueMethodWithOriginalName("booRunner");
     assertThat(methodSubject, isPresent());
     verifyNotDevirtualized(methodSubject);
 
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/InvokeSuperToInvokeVirtualTest.java b/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/InvokeSuperToInvokeVirtualTest.java
index e4b2d91..82e963b 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/InvokeSuperToInvokeVirtualTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/InvokeSuperToInvokeVirtualTest.java
@@ -60,14 +60,14 @@
     ClassSubject bClassSubject = inspector.clazz(B.class);
     assertThat(bClassSubject, isPresent());
 
-    MethodSubject negativeTestSubject = bClassSubject.uniqueMethodWithName("negativeTest");
+    MethodSubject negativeTestSubject = bClassSubject.uniqueMethodWithOriginalName("negativeTest");
     assertThat(negativeTestSubject, isPresent());
     assertTrue(negativeTestSubject.streamInstructions().anyMatch(this::isInvokeSuper));
     assertTrue(
         negativeTestSubject.streamInstructions().noneMatch(InstructionSubject::isInvokeVirtual));
 
     // B.positiveTest() is moved to A as a result of bridge hoisting.
-    MethodSubject positiveTestSubject = aClassSubject.uniqueMethodWithName("positiveTest");
+    MethodSubject positiveTestSubject = aClassSubject.uniqueMethodWithOriginalName("positiveTest");
     assertThat(positiveTestSubject, isPresent());
     assertTrue(positiveTestSubject.streamInstructions().noneMatch(this::isInvokeSuper));
     assertTrue(
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/PrivateOverridePublicizerDevirtualizerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/PrivateOverridePublicizerDevirtualizerTest.java
index 6570849..a0bbdb1 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/PrivateOverridePublicizerDevirtualizerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/devirtualize/PrivateOverridePublicizerDevirtualizerTest.java
@@ -60,7 +60,7 @@
             inspector -> {
               ClassSubject classA = inspector.clazz(A.class);
               assertThat(classA, isPresent());
-              MethodSubject fooA = classA.uniqueMethodWithName("foo");
+              MethodSubject fooA = classA.uniqueMethodWithOriginalName("foo");
               assertThat(fooA, isPresent());
             })
         .run(parameters.getRuntime(), Main.class)
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/dynamictype/DynamicTypeOptimizationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/dynamictype/DynamicTypeOptimizationTest.java
index ca2d49a..daed986 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/dynamictype/DynamicTypeOptimizationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/dynamictype/DynamicTypeOptimizationTest.java
@@ -66,7 +66,7 @@
 
     // Verify that the check-cast instruction is still present in testCheckCastRemoval().
     MethodSubject testCheckCastRemovalMethod =
-        mainClassSubject.uniqueMethodWithName("testCheckCastRemoval");
+        mainClassSubject.uniqueMethodWithOriginalName("testCheckCastRemoval");
     assertThat(testCheckCastRemovalMethod, isPresent());
     assertTrue(
         testCheckCastRemovalMethod
@@ -76,7 +76,7 @@
     // Verify that the instance-of instruction is only present in testInstanceOfRemoval() if the
     // dynamic type optimization is disabled.
     MethodSubject testInstanceOfRemovalMethod =
-        mainClassSubject.uniqueMethodWithName("testInstanceOfRemoval");
+        mainClassSubject.uniqueMethodWithOriginalName("testInstanceOfRemoval");
     assertThat(testInstanceOfRemovalMethod, isPresent());
     assertTrue(
         testInstanceOfRemovalMethod
@@ -86,18 +86,18 @@
     // Verify that world() has been inlined() into testMethodInlining() unless the dynamic type
     // optimization is disabled.
     MethodSubject testMethodInliningMethod =
-        mainClassSubject.uniqueMethodWithName("testMethodInlining");
+        mainClassSubject.uniqueMethodWithOriginalName("testMethodInlining");
     assertThat(testMethodInliningMethod, isPresent());
-    assertTrue(interfaceSubject.uniqueMethodWithName("world").isAbsent());
+    assertTrue(interfaceSubject.uniqueMethodWithOriginalName("world").isAbsent());
 
     // Verify that exclamationMark() has been rebound in testMethodRebinding() unless the dynamic
     // type optimization is disabled.
     MethodSubject testMethodRebindingMethod =
-        mainClassSubject.uniqueMethodWithName("testMethodRebinding");
+        mainClassSubject.uniqueMethodWithOriginalName("testMethodRebinding");
     assertThat(testMethodRebindingMethod, isPresent());
     assertThat(
         testMethodRebindingMethod,
-        invokesMethod(aClassSubject.uniqueMethodWithName("exclamationMark")));
+        invokesMethod(aClassSubject.uniqueMethodWithOriginalName("exclamationMark")));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/extrasubclasses/AbstractClassAlsoImplementedByMissingClassTest.java b/src/test/java/com/android/tools/r8/ir/optimize/extrasubclasses/AbstractClassAlsoImplementedByMissingClassTest.java
index 65cc34d..03c69b1 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/extrasubclasses/AbstractClassAlsoImplementedByMissingClassTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/extrasubclasses/AbstractClassAlsoImplementedByMissingClassTest.java
@@ -67,15 +67,15 @@
 
   private void inspect(CodeInspector inspector) {
     ClassSubject aClassSubject = inspector.clazz(A.class);
-    assertThat(aClassSubject.uniqueMethodWithName("kept"), isPresent());
+    assertThat(aClassSubject.uniqueMethodWithOriginalName("kept"), isPresent());
 
     ClassSubject bClassSubject = inspector.clazz(B.class);
-    assertThat(bClassSubject.uniqueMethodWithName("kept"), isPresent());
+    assertThat(bClassSubject.uniqueMethodWithOriginalName("kept"), isPresent());
 
     // A.notKept() and B.notKept() should not be present, because the only invoke instruction
     // targeting A.notKept() should have been inlined.
-    assertThat(aClassSubject.uniqueMethodWithName("notKept"), not(isPresent()));
-    assertThat(bClassSubject.uniqueMethodWithName("notKept"), not(isPresent()));
+    assertThat(aClassSubject.uniqueMethodWithOriginalName("notKept"), not(isPresent()));
+    assertThat(bClassSubject.uniqueMethodWithOriginalName("notKept"), not(isPresent()));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/extrasubclasses/InterfaceAlsoImplementedByMissingClassTest.java b/src/test/java/com/android/tools/r8/ir/optimize/extrasubclasses/InterfaceAlsoImplementedByMissingClassTest.java
index 89586d8..c073c8b 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/extrasubclasses/InterfaceAlsoImplementedByMissingClassTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/extrasubclasses/InterfaceAlsoImplementedByMissingClassTest.java
@@ -65,15 +65,15 @@
 
   private void inspect(CodeInspector inspector) {
     ClassSubject iClassSubject = inspector.clazz(I.class);
-    assertThat(iClassSubject.uniqueMethodWithName("kept"), isPresent());
+    assertThat(iClassSubject.uniqueMethodWithOriginalName("kept"), isPresent());
 
     ClassSubject aClassSubject = inspector.clazz(A.class);
-    assertThat(aClassSubject.uniqueMethodWithName("kept"), isPresent());
+    assertThat(aClassSubject.uniqueMethodWithOriginalName("kept"), isPresent());
 
     // I.notKept() and A.notKept() should not be present, because the only invoke instruction
     // targeting I.notKept() should have been inlined.
-    assertThat(iClassSubject.uniqueMethodWithName("notKept"), not(isPresent()));
-    assertThat(aClassSubject.uniqueMethodWithName("notKept"), not(isPresent()));
+    assertThat(iClassSubject.uniqueMethodWithOriginalName("notKept"), not(isPresent()));
+    assertThat(aClassSubject.uniqueMethodWithOriginalName("notKept"), not(isPresent()));
   }
 
   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 53a83d5..4b60883 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
@@ -90,7 +90,7 @@
       String methodName,
       boolean isNPEWithMessage,
       boolean shouldBeOptimized) {
-    MethodSubject methodSubject = classSubject.uniqueMethodWithName(methodName);
+    MethodSubject methodSubject = classSubject.uniqueMethodWithOriginalName(methodName);
     assertThat(methodSubject, isPresent());
 
     IRCode code = methodSubject.buildIR();
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/ifs/SemiTrivialPhiBranchTest.java b/src/test/java/com/android/tools/r8/ir/optimize/ifs/SemiTrivialPhiBranchTest.java
index a8bccea..1225b7f 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/ifs/SemiTrivialPhiBranchTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/ifs/SemiTrivialPhiBranchTest.java
@@ -50,8 +50,8 @@
     ClassSubject testClassSubject = inspector.clazz(TestClass.class);
     assertThat(testClassSubject, isPresent());
     assertThat(testClassSubject.mainMethod(), isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("live"), isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("dead"), not(isPresent()));
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("live"), isPresent());
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("dead"), not(isPresent()));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/ifs/TrivialObjectEqualsTest.java b/src/test/java/com/android/tools/r8/ir/optimize/ifs/TrivialObjectEqualsTest.java
index 5e5f50c..3d520ac 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/ifs/TrivialObjectEqualsTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/ifs/TrivialObjectEqualsTest.java
@@ -42,7 +42,7 @@
         .inspect(
             inspector ->
                 assertThat(
-                    inspector.clazz(Main.class).uniqueMethodWithName("dead"),
+                    inspector.clazz(Main.class).uniqueMethodWithOriginalName("dead"),
                     not(invokesMethodWithName("dead"))))
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("Hello world!");
@@ -58,7 +58,8 @@
         .compile()
         .inspect(
             inspector ->
-                assertThat(inspector.clazz(Main.class).uniqueMethodWithName("dead"), isAbsent()))
+                assertThat(
+                    inspector.clazz(Main.class).uniqueMethodWithOriginalName("dead"), isAbsent()))
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("Hello world!");
   }
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 527d320..94c8213 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
@@ -84,7 +84,7 @@
     assertThat(otherClassSubject, isPresent());
 
     // Method A.m() should no longer be present due to inlining.
-    assertThat(otherClassSubject.uniqueMethodWithName("m"), not(isPresent()));
+    assertThat(otherClassSubject.uniqueMethodWithOriginalName("m"), not(isPresent()));
   }
 
   private boolean canUseRequireNonNull() {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineLibraryInterfaceMethodTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineLibraryInterfaceMethodTest.java
index 634d0a8..2dee8a7 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineLibraryInterfaceMethodTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineLibraryInterfaceMethodTest.java
@@ -52,7 +52,10 @@
         .inspect(
             inspector -> {
               MethodSubject methodSubject =
-                  inspector.clazz(TestClass.class).uniqueMethodWithName("main").asMethodSubject();
+                  inspector
+                      .clazz(TestClass.class)
+                      .uniqueMethodWithOriginalName("main")
+                      .asMethodSubject();
 
               counts.run = countInvokesWithName(methodSubject, "run");
               counts.println = countInvokesWithName(methodSubject, "println");
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 53fa602..ed2f50d 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
@@ -55,7 +55,7 @@
         .inspect(
             inspector ->
                 assertThat(
-                    inspector.clazz(TestClass.class).uniqueMethodWithName("test"),
+                    inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("test"),
                     not(isPresent())));
   }
 
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineNonReboundFieldTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineNonReboundFieldTest.java
index b2fe085..e4ad5b8 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineNonReboundFieldTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineNonReboundFieldTest.java
@@ -38,11 +38,11 @@
 
     // Verify that greet() is not inlined into main() -- that would lead to illegal access errors
     // since main() does not have access to the GreetingBase.greeting field.
-    assertThat(greeterSubject.uniqueMethodWithName("greet"), isPresent());
+    assertThat(greeterSubject.uniqueMethodWithOriginalName("greet"), isPresent());
 
     // The method greetInternal() should be inlined into greet() since it has a single call site and
     // nothing prevents it from being inlined.
-    assertThat(greeterSubject.uniqueMethodWithName("greetInternal"), not(isPresent()));
+    assertThat(greeterSubject.uniqueMethodWithOriginalName("greetInternal"), not(isPresent()));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineSynchronizedMethodTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineSynchronizedMethodTest.java
index 45997a8..d2e9063 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineSynchronizedMethodTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineSynchronizedMethodTest.java
@@ -46,7 +46,7 @@
                   2,
                   inspector
                       .clazz(TestClass.class)
-                      .uniqueMethodWithName("main")
+                      .uniqueMethodWithOriginalName("main")
                       .streamInstructions()
                       .filter(i -> i.isMonitorEnter() || i.isMonitorExit())
                       .count());
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineSynchronizedTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineSynchronizedTest.java
index 1cb4d4f..7fd5b34 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineSynchronizedTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlineSynchronizedTest.java
@@ -71,7 +71,7 @@
               ClassSubject aClassSubject = inspector.clazz(A.class);
               assertThat(aClassSubject, isPresent());
               assertThat(
-                  aClassSubject.uniqueMethodWithName("normalInlinedSynchronized"),
+                  aClassSubject.uniqueMethodWithOriginalName("normalInlinedSynchronized"),
                   not(isPresent()));
 
               ClassSubject bClassSubject = inspector.clazz(B.class);
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlinerShouldNotInlineDefinitelyNullTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlinerShouldNotInlineDefinitelyNullTest.java
index be2ffe2..960e3d9 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlinerShouldNotInlineDefinitelyNullTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlinerShouldNotInlineDefinitelyNullTest.java
@@ -69,7 +69,7 @@
                   assertTrue(
                       inspector
                           .clazz(Main.class)
-                          .uniqueMethodWithName("main")
+                          .uniqueMethodWithOriginalName("main")
                           .streamInstructions()
                           .anyMatch(InstructionSubject::isThrow));
                 })
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlinerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlinerTest.java
index db81629..b9a6aa4 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlinerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InlinerTest.java
@@ -61,13 +61,15 @@
               ClassSubject mainClassSubject = inspector.clazz(ExceptionHandlingTestClass.class);
               assertThat(mainClassSubject, isPresent());
               assertThat(
-                  mainClassSubject.uniqueMethodWithName("inlineeWithNormalExitThatDoesNotThrow"),
+                  mainClassSubject.uniqueMethodWithOriginalName(
+                      "inlineeWithNormalExitThatDoesNotThrow"),
                   isAbsent());
               assertThat(
-                  mainClassSubject.uniqueMethodWithName("inlineeWithNormalExitThatThrows"),
+                  mainClassSubject.uniqueMethodWithOriginalName("inlineeWithNormalExitThatThrows"),
                   isAbsent());
               assertThat(
-                  mainClassSubject.uniqueMethodWithName("inlineeWithoutNormalExit"), isAbsent());
+                  mainClassSubject.uniqueMethodWithOriginalName("inlineeWithoutNormalExit"),
+                  isAbsent());
             })
         .run(ExceptionHandlingTestClass.class)
         .assertSuccessWithOutputLines(
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningAfterClassInitializationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningAfterClassInitializationTest.java
index b4c0a63..c93ceea 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningAfterClassInitializationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningAfterClassInitializationTest.java
@@ -51,10 +51,10 @@
     ClassSubject classA = inspector.clazz(A.class);
     assertThat(classA, isPresent());
 
-    MethodSubject inlineableMethod = classA.uniqueMethodWithName("inlineable");
+    MethodSubject inlineableMethod = classA.uniqueMethodWithOriginalName("inlineable");
     assertThat(inlineableMethod, not(isPresent()));
 
-    MethodSubject notInlineableMethod = classA.uniqueMethodWithName("notInlineable");
+    MethodSubject notInlineableMethod = classA.uniqueMethodWithOriginalName("notInlineable");
     assertThat(notInlineableMethod, isPresent());
 
     MethodSubject testMethod = inspector.clazz(mainClass).mainMethod();
@@ -73,7 +73,7 @@
     ClassSubject classA = inspector.clazz(A.class);
     assertThat(classA, isPresent());
 
-    MethodSubject inlineableMethod = classA.uniqueMethodWithName("inlineable");
+    MethodSubject inlineableMethod = classA.uniqueMethodWithOriginalName("inlineable");
     assertThat(inlineableMethod, not(isPresent()));
   }
 
@@ -86,7 +86,7 @@
     ClassSubject classA = inspector.clazz(A.class);
     assertThat(classA, isPresent());
 
-    MethodSubject inlineableMethod = classA.uniqueMethodWithName("inlineable");
+    MethodSubject inlineableMethod = classA.uniqueMethodWithOriginalName("inlineable");
     assertThat(inlineableMethod, not(isPresent()));
   }
 
@@ -101,7 +101,7 @@
     ClassSubject classA = inspector.clazz(A.class);
     assertThat(classA, isPresent());
 
-    MethodSubject inlineableMethod = classA.uniqueMethodWithName("inlineable");
+    MethodSubject inlineableMethod = classA.uniqueMethodWithOriginalName("inlineable");
     assertThat(inlineableMethod, not(isPresent()));
   }
 
@@ -114,7 +114,7 @@
     ClassSubject classA = inspector.clazz(A.class);
     assertThat(classA, isPresent());
 
-    MethodSubject inlineableMethod = classA.uniqueMethodWithName("inlineable");
+    MethodSubject inlineableMethod = classA.uniqueMethodWithOriginalName("inlineable");
     assertThat(inlineableMethod, not(isPresent()));
   }
 
@@ -127,10 +127,10 @@
     ClassSubject classA = inspector.clazz(A.class);
     assertThat(classA, isPresent());
 
-    MethodSubject notInlineableMethod = classA.uniqueMethodWithName("notInlineable");
+    MethodSubject notInlineableMethod = classA.uniqueMethodWithOriginalName("notInlineable");
     assertThat(notInlineableMethod, isPresent());
 
-    MethodSubject testMethod = inspector.clazz(mainClass).uniqueMethodWithName("test");
+    MethodSubject testMethod = inspector.clazz(mainClass).uniqueMethodWithOriginalName("test");
     assertThat(testMethod, isPresent());
     assertThat(testMethod, invokesMethod(notInlineableMethod));
   }
@@ -150,7 +150,7 @@
     ClassSubject classA = inspector.clazz(A.class);
     assertThat(classA, isPresent());
 
-    MethodSubject inlineableMethod = classA.uniqueMethodWithName("inlineable");
+    MethodSubject inlineableMethod = classA.uniqueMethodWithOriginalName("inlineable");
     assertThat(inlineableMethod, not(isPresent()));
   }
 
@@ -166,10 +166,11 @@
     ClassSubject classA = inspector.clazz(A.class);
     assertThat(classA, isPresent());
 
-    MethodSubject notInlineableMethod = classA.uniqueMethodWithName("notInlineable");
+    MethodSubject notInlineableMethod = classA.uniqueMethodWithOriginalName("notInlineable");
     assertThat(notInlineableMethod, isPresent());
 
-    MethodSubject alsoNotInlineableMethod = classA.uniqueMethodWithName("alsoNotInlineable");
+    MethodSubject alsoNotInlineableMethod =
+        classA.uniqueMethodWithOriginalName("alsoNotInlineable");
     assertThat(alsoNotInlineableMethod, isPresent());
 
     MethodSubject testMethod = inspector.clazz(mainClass).mainMethod();
@@ -189,7 +190,7 @@
     ClassSubject classA = inspector.clazz(A.class);
     assertThat(classA, isPresent());
 
-    MethodSubject notInlineableMethod = classA.uniqueMethodWithName("notInlineable");
+    MethodSubject notInlineableMethod = classA.uniqueMethodWithOriginalName("notInlineable");
     assertThat(notInlineableMethod, isPresent());
 
     MethodSubject testMethod = inspector.clazz(mainClass).mainMethod();
@@ -206,7 +207,7 @@
     ClassSubject classA = inspector.clazz(A.class);
     assertThat(classA, isPresent());
 
-    MethodSubject inlineableMethod = classA.uniqueMethodWithName("inlineable");
+    MethodSubject inlineableMethod = classA.uniqueMethodWithOriginalName("inlineable");
     assertThat(inlineableMethod, not(isPresent()));
   }
 
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningFromCurrentClassTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningFromCurrentClassTest.java
index f70aebe..448a7b7 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningFromCurrentClassTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningFromCurrentClassTest.java
@@ -69,19 +69,19 @@
     ClassSubject classC = inspector.clazz(C.class);
     assertThat(classC, isPresent());
 
-    MethodSubject testMethod = classB.uniqueMethodWithName("test");
+    MethodSubject testMethod = classB.uniqueMethodWithOriginalName("test");
     assertThat(testMethod, isPresent());
 
-    MethodSubject inlineable1Method = classA.uniqueMethodWithName("inlineable1");
+    MethodSubject inlineable1Method = classA.uniqueMethodWithOriginalName("inlineable1");
     assertThat(inlineable1Method, not(isPresent()));
 
-    MethodSubject inlineable2Method = classB.uniqueMethodWithName("inlineable2");
+    MethodSubject inlineable2Method = classB.uniqueMethodWithOriginalName("inlineable2");
     assertThat(inlineable2Method, not(isPresent()));
 
     MethodSubject inlineableWithInitClassMethod =
-        classC.uniqueMethodWithName("inlineableWithInitClass");
+        classC.uniqueMethodWithOriginalName("inlineableWithInitClass");
     assertThat(inlineableWithInitClassMethod, not(isPresent()));
-    assertThat(testMethod, accessesField(classC.uniqueFieldWithName("$r8$clinit")));
+    assertThat(testMethod, accessesField(classC.uniqueFieldWithOriginalName("$r8$clinit")));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningIntoVisibilityBridgeTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningIntoVisibilityBridgeTest.java
index 841c369..19806fb 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningIntoVisibilityBridgeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningIntoVisibilityBridgeTest.java
@@ -68,7 +68,7 @@
       ClassSubject classSubject = result.inspector().clazz(getClassA());
       assertThat(classSubject, isPresent());
 
-      MethodSubject methodSubject = classSubject.uniqueMethodWithName("method");
+      MethodSubject methodSubject = classSubject.uniqueMethodWithOriginalName("method");
       assertEquals(neverInline, methodSubject.isPresent());
     }
 
@@ -79,7 +79,7 @@
           result.inspector().clazz(InliningIntoVisibilityBridgeTestClassB.class);
       assertThat(classSubject, isPresent());
 
-      MethodSubject methodSubject = classSubject.uniqueMethodWithName("method");
+      MethodSubject methodSubject = classSubject.uniqueMethodWithOriginalName("method");
       if (!neverInline) {
         assertThat(methodSubject, isPresentAndRenamed());
         assertFalse(methodSubject.isBridge());
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningOfVirtualMethodOnKeptClassTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningOfVirtualMethodOnKeptClassTest.java
index cc347c5..2350b12 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningOfVirtualMethodOnKeptClassTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningOfVirtualMethodOnKeptClassTest.java
@@ -51,9 +51,9 @@
   private void verifyOutput(CodeInspector inspector) {
     ClassSubject classSubject = inspector.clazz(TestClass.class);
     assertThat(classSubject, isPresent());
-    assertThat(classSubject.uniqueMethodWithName("foo"), not(isPresent()));
-    assertThat(classSubject.uniqueMethodWithName("bar"), isPresent());
-    assertThat(classSubject.uniqueMethodWithName("baz"), isPresent());
+    assertThat(classSubject.uniqueMethodWithOriginalName("foo"), not(isPresent()));
+    assertThat(classSubject.uniqueMethodWithOriginalName("bar"), isPresent());
+    assertThat(classSubject.uniqueMethodWithOriginalName("baz"), isPresent());
   }
 
   @NeverClassInline
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningWithClassInitializerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningWithClassInitializerTest.java
index ab412be..4694c08 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningWithClassInitializerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/InliningWithClassInitializerTest.java
@@ -42,10 +42,10 @@
     ClassSubject classB = inspector.clazz(B.class);
     assertThat(classB, isPresent());
 
-    MethodSubject inlineableMethod = classB.uniqueMethodWithName("inlineable");
+    MethodSubject inlineableMethod = classB.uniqueMethodWithOriginalName("inlineable");
     assertThat(inlineableMethod, not(isPresent()));
 
-    MethodSubject otherMethod = classB.uniqueMethodWithName("other");
+    MethodSubject otherMethod = classB.uniqueMethodWithOriginalName("other");
     assertThat(otherMethod, isPresent());
 
     MethodSubject mainMethod = inspector.clazz(TestClass.class).mainMethod();
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/LibraryOverrideInliningTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/LibraryOverrideInliningTest.java
index 3882a7b..dea2a26 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/LibraryOverrideInliningTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/LibraryOverrideInliningTest.java
@@ -47,7 +47,7 @@
               assertThat(greeterClassSubject, isPresent());
 
               MethodSubject toStringMethodSubject =
-                  greeterClassSubject.uniqueMethodWithName("toString");
+                  greeterClassSubject.uniqueMethodWithOriginalName("toString");
               assertThat(toStringMethodSubject, isPresent());
 
               ClassSubject testClassSubject = inspector.clazz(TestClass.class);
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/MultipleIndirectCallSitesTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/MultipleIndirectCallSitesTest.java
index 09bb71b..09f4c9b 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/MultipleIndirectCallSitesTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/MultipleIndirectCallSitesTest.java
@@ -71,7 +71,7 @@
     ClassSubject aClassSubject = inspector.clazz(A.class);
     assertThat(aClassSubject, isPresent());
 
-    MethodSubject methodSubject = aClassSubject.uniqueMethodWithName("m");
+    MethodSubject methodSubject = aClassSubject.uniqueMethodWithOriginalName("m");
     assertThat(methodSubject, isPresent());
     assertEquals(
         5,
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/SingleTargetAfterInliningTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/SingleTargetAfterInliningTest.java
index e0a1d16..9fae6b0 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/SingleTargetAfterInliningTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/SingleTargetAfterInliningTest.java
@@ -65,16 +65,16 @@
     assertThat(testClassSubject, isPresent());
 
     // The indirection() method should be inlined.
-    assertThat(testClassSubject.uniqueMethodWithName("indirection"), not(isPresent()));
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("indirection"), not(isPresent()));
 
     // A.foo() should be absent if the max inlining depth is 1, because indirection() has been
     // inlined into main(), which makes A.foo() eligible for inlining into main().
     ClassSubject aClassSubject = inspector.clazz(A.class);
     assertThat(aClassSubject, isPresent());
-    assertThat(aClassSubject.uniqueMethodWithName("foo"), not(isPresent()));
+    assertThat(aClassSubject.uniqueMethodWithOriginalName("foo"), not(isPresent()));
 
     // A.bar() should always be inlined because it is marked as @AlwaysInline.
-    assertThat(aClassSubject.uniqueMethodWithName("bar"), not(isPresent()));
+    assertThat(aClassSubject.uniqueMethodWithOriginalName("bar"), not(isPresent()));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/SingleTargetFromExactReceiverTypeTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/SingleTargetFromExactReceiverTypeTest.java
index e7b6931..4dcba65 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/SingleTargetFromExactReceiverTypeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/SingleTargetFromExactReceiverTypeTest.java
@@ -68,19 +68,25 @@
   private void verifyOnlyCanBeInlinedHasBeenInlined(CodeInspector inspector) {
     ClassSubject aClassSubject = inspector.clazz(A.class);
     assertThat(aClassSubject, isPresent());
-    assertThat(aClassSubject.uniqueMethodWithName("canBeInlined"), not(isPresent()));
-    assertThat(aClassSubject.uniqueMethodWithName("canBeInlinedDueToAssume"), not(isPresent()));
+    assertThat(aClassSubject.uniqueMethodWithOriginalName("canBeInlined"), not(isPresent()));
     assertThat(
-        aClassSubject.uniqueMethodWithName("cannotBeInlinedDueToDynamicDispatch"), isPresent());
-    assertThat(aClassSubject.uniqueMethodWithName("cannotBeInlinedDueToKeepRule"), isPresent());
+        aClassSubject.uniqueMethodWithOriginalName("canBeInlinedDueToAssume"), not(isPresent()));
+    assertThat(
+        aClassSubject.uniqueMethodWithOriginalName("cannotBeInlinedDueToDynamicDispatch"),
+        isPresent());
+    assertThat(
+        aClassSubject.uniqueMethodWithOriginalName("cannotBeInlinedDueToKeepRule"), isPresent());
 
     ClassSubject bClassSubject = inspector.clazz(B.class);
     assertThat(bClassSubject, isPresent());
-    assertThat(bClassSubject.uniqueMethodWithName("canBeInlined"), not(isPresent()));
-    assertThat(bClassSubject.uniqueMethodWithName("canBeInlinedDueToAssume"), not(isPresent()));
+    assertThat(bClassSubject.uniqueMethodWithOriginalName("canBeInlined"), not(isPresent()));
     assertThat(
-        bClassSubject.uniqueMethodWithName("cannotBeInlinedDueToDynamicDispatch"), isPresent());
-    assertThat(bClassSubject.uniqueMethodWithName("cannotBeInlinedDueToKeepRule"), isPresent());
+        bClassSubject.uniqueMethodWithOriginalName("canBeInlinedDueToAssume"), not(isPresent()));
+    assertThat(
+        bClassSubject.uniqueMethodWithOriginalName("cannotBeInlinedDueToDynamicDispatch"),
+        isPresent());
+    assertThat(
+        bClassSubject.uniqueMethodWithOriginalName("cannotBeInlinedDueToKeepRule"), isPresent());
 
     ClassSubject testClassSubject = inspector.clazz(TestClass.class);
     assertThat(testClassSubject, isPresent());
@@ -100,10 +106,11 @@
     }
     assertThat(
         mainMethodSubject,
-        invokesMethod(aClassSubject.uniqueMethodWithName("cannotBeInlinedDueToDynamicDispatch")));
+        invokesMethod(
+            aClassSubject.uniqueMethodWithOriginalName("cannotBeInlinedDueToDynamicDispatch")));
     assertThat(
         mainMethodSubject,
-        invokesMethod(aClassSubject.uniqueMethodWithName("cannotBeInlinedDueToKeepRule")));
+        invokesMethod(aClassSubject.uniqueMethodWithOriginalName("cannotBeInlinedDueToKeepRule")));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/conditionalsimpleinlining/NopInliningConstraintTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/conditionalsimpleinlining/NopInliningConstraintTest.java
index c55ea29..96f9184 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/conditionalsimpleinlining/NopInliningConstraintTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/conditionalsimpleinlining/NopInliningConstraintTest.java
@@ -50,11 +50,11 @@
               assertThat(mainClassSubject, isPresent());
 
               // Method doStuff() is inlined into main().
-              assertThat(mainClassSubject.uniqueMethodWithName("doStuff"), isAbsent());
+              assertThat(mainClassSubject.uniqueMethodWithOriginalName("doStuff"), isAbsent());
 
               // Method checkNotNull() is not inlined.
               MethodSubject checkNotNullMethodSubject =
-                  mainClassSubject.uniqueMethodWithName("checkNotNull");
+                  mainClassSubject.uniqueMethodWithOriginalName("checkNotNull");
               assertThat(checkNotNullMethodSubject, isPresent());
 
               // There is a single call to checkNotNull() in main(), as checkNotNull(newObject())
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/conditionalsimpleinlining/SimpleIfNullOrNotNullInliningTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/conditionalsimpleinlining/SimpleIfNullOrNotNullInliningTest.java
index f75c4c8..685036d 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/conditionalsimpleinlining/SimpleIfNullOrNotNullInliningTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/conditionalsimpleinlining/SimpleIfNullOrNotNullInliningTest.java
@@ -80,10 +80,10 @@
     }
 
     assertThat(classSubject, isPresent());
-    assertThat(classSubject.uniqueMethodWithName("simpleIfNullTest"), isPresent());
-    assertThat(classSubject.uniqueMethodWithName("simpleIfBothNullTest"), isPresent());
-    assertThat(classSubject.uniqueMethodWithName("simpleIfNotNullTest"), isPresent());
-    assertThat(classSubject.uniqueMethodWithName("simpleIfBothNotNullTest"), isPresent());
+    assertThat(classSubject.uniqueMethodWithOriginalName("simpleIfNullTest"), isPresent());
+    assertThat(classSubject.uniqueMethodWithOriginalName("simpleIfBothNullTest"), isPresent());
+    assertThat(classSubject.uniqueMethodWithOriginalName("simpleIfNotNullTest"), isPresent());
+    assertThat(classSubject.uniqueMethodWithOriginalName("simpleIfBothNotNullTest"), isPresent());
   }
 
   private boolean shouldBeEligibleForSimpleInlining() {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/conditionalsimpleinlining/SimpleIfTrueOrFalseInliningTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/conditionalsimpleinlining/SimpleIfTrueOrFalseInliningTest.java
index 180b971..18804c7 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/conditionalsimpleinlining/SimpleIfTrueOrFalseInliningTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/conditionalsimpleinlining/SimpleIfTrueOrFalseInliningTest.java
@@ -80,10 +80,10 @@
     }
 
     assertThat(classSubject, isPresent());
-    assertThat(classSubject.uniqueMethodWithName("simpleIfTrueTest"), isPresent());
-    assertThat(classSubject.uniqueMethodWithName("simpleIfBothTrueTest"), isPresent());
-    assertThat(classSubject.uniqueMethodWithName("simpleIfFalseTest"), isPresent());
-    assertThat(classSubject.uniqueMethodWithName("simpleIfBothFalseTest"), isPresent());
+    assertThat(classSubject.uniqueMethodWithOriginalName("simpleIfTrueTest"), isPresent());
+    assertThat(classSubject.uniqueMethodWithOriginalName("simpleIfBothTrueTest"), isPresent());
+    assertThat(classSubject.uniqueMethodWithOriginalName("simpleIfFalseTest"), isPresent());
+    assertThat(classSubject.uniqueMethodWithOriginalName("simpleIfBothFalseTest"), isPresent());
   }
 
   private boolean shouldBeEligibleForSimpleInlining() {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/sync/InlineStaticSynchronizedMethodTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/sync/InlineStaticSynchronizedMethodTest.java
index 8a606a7..1a20851 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/sync/InlineStaticSynchronizedMethodTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/sync/InlineStaticSynchronizedMethodTest.java
@@ -53,8 +53,8 @@
   private void verifySynchronizedMethodsAreInlined(CodeInspector inspector) {
     ClassSubject classSubject = inspector.clazz(RunnableImpl.class);
     assertThat(classSubject, isPresent());
-    assertThat(classSubject.uniqueMethodWithName("m1"), not(isPresent()));
-    assertThat(classSubject.uniqueMethodWithName("m2"), not(isPresent()));
+    assertThat(classSubject.uniqueMethodWithOriginalName("m1"), not(isPresent()));
+    assertThat(classSubject.uniqueMethodWithOriginalName("m2"), not(isPresent()));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/inliner/sync/InlinerMonitorEnterValuesThresholdTest.java b/src/test/java/com/android/tools/r8/ir/optimize/inliner/sync/InlinerMonitorEnterValuesThresholdTest.java
index 6ac9e07..d6c07ca 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/inliner/sync/InlinerMonitorEnterValuesThresholdTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/inliner/sync/InlinerMonitorEnterValuesThresholdTest.java
@@ -54,13 +54,13 @@
     ClassSubject classSubject = inspector.clazz(TestClass.class);
     assertThat(classSubject, isPresent());
     assertThat(classSubject.mainMethod(), isPresent());
-    assertThat(classSubject.uniqueMethodWithName("m1"), not(isPresent()));
-    assertThat(classSubject.uniqueMethodWithName("m2"), not(isPresent()));
+    assertThat(classSubject.uniqueMethodWithOriginalName("m1"), not(isPresent()));
+    assertThat(classSubject.uniqueMethodWithOriginalName("m2"), not(isPresent()));
     if (threshold == 2) {
-      assertThat(classSubject.uniqueMethodWithName("m3"), isPresent());
+      assertThat(classSubject.uniqueMethodWithOriginalName("m3"), isPresent());
     } else {
       assert threshold == 3;
-      assertThat(classSubject.uniqueMethodWithName("m3"), not(isPresent()));
+      assertThat(classSubject.uniqueMethodWithOriginalName("m3"), not(isPresent()));
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/instanceofremoval/InstanceOfRemovalTest.java b/src/test/java/com/android/tools/r8/ir/optimize/instanceofremoval/InstanceOfRemovalTest.java
index 09aef4c..aa2e06a 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/instanceofremoval/InstanceOfRemovalTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/instanceofremoval/InstanceOfRemovalTest.java
@@ -167,14 +167,14 @@
     ClassSubject testClass = inspector.clazz(TestClass.class);
 
     // With inlining we can prove that all instance-of checks succeed or fail.
-    MethodSubject fooMethodSubject = testClass.uniqueMethodWithName("foo");
+    MethodSubject fooMethodSubject = testClass.uniqueMethodWithOriginalName("foo");
     Iterator<InstructionSubject> fooInstructionIterator =
         fooMethodSubject.iterateInstructions(InstructionSubject::isInstanceOf);
     assertEquals(0, Streams.stream(fooInstructionIterator).count());
 
     // Without inlining we cannot prove any of the instance-of checks to be trivial, but the dynamic
     // type optimization allows us to prove that some are safe.
-    MethodSubject barMethodSubject = testClass.uniqueMethodWithName("bar");
+    MethodSubject barMethodSubject = testClass.uniqueMethodWithOriginalName("bar");
     Iterator<InstructionSubject> barInstructionIterator =
         barMethodSubject.iterateInstructions(InstructionSubject::isInstanceOf);
     assertEquals(2, Streams.stream(barInstructionIterator).count());
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/lambda/LambdaMethodInliningTest.java b/src/test/java/com/android/tools/r8/ir/optimize/lambda/LambdaMethodInliningTest.java
index b6ca59d..35eb0d0 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/lambda/LambdaMethodInliningTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/lambda/LambdaMethodInliningTest.java
@@ -56,7 +56,7 @@
     ClassSubject classSubject = inspector.clazz(TestClass.class);
     assertThat(classSubject, isPresent());
 
-    MethodSubject testClassMethodSubject = classSubject.uniqueMethodWithName("testClass");
+    MethodSubject testClassMethodSubject = classSubject.uniqueMethodWithOriginalName("testClass");
     assertThat(testClassMethodSubject, isPresent());
     assertTrue(
         testClassMethodSubject
@@ -70,7 +70,7 @@
                     instruction.isInvokeVirtual()
                         && instruction.getMethod().toSourceString().contains("println")));
 
-    MethodSubject testLambdaMethodSubject = classSubject.uniqueMethodWithName("testLambda");
+    MethodSubject testLambdaMethodSubject = classSubject.uniqueMethodWithOriginalName("testLambda");
     assertThat(testLambdaMethodSubject, isPresent());
     assertTrue(
         testLambdaMethodSubject
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/library/BooleanParseBooleanTest.java b/src/test/java/com/android/tools/r8/ir/optimize/library/BooleanParseBooleanTest.java
index 24894bb..400e662 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/library/BooleanParseBooleanTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/library/BooleanParseBooleanTest.java
@@ -68,7 +68,7 @@
     assertThat(testClassSubject, isPresent());
 
     MethodSubject testOptimizedMethodSubject =
-        testClassSubject.uniqueMethodWithName("testOptimized");
+        testClassSubject.uniqueMethodWithOriginalName("testOptimized");
     assertThat(testOptimizedMethodSubject, isPresent());
     assertTrue(
         testOptimizedMethodSubject
@@ -79,7 +79,7 @@
             .noneMatch(method -> method.contains("parseBoolean")));
 
     MethodSubject testNotOptimizedMethodSubject =
-        testClassSubject.uniqueMethodWithName("testNotOptimized");
+        testClassSubject.uniqueMethodWithOriginalName("testNotOptimized");
     assertThat(testNotOptimizedMethodSubject, isPresent());
     assertEquals(
         1,
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/library/BooleanValueOfTest.java b/src/test/java/com/android/tools/r8/ir/optimize/library/BooleanValueOfTest.java
index 85eb82b..a260221 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/library/BooleanValueOfTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/library/BooleanValueOfTest.java
@@ -53,7 +53,7 @@
     assertThat(testClassSubject, isPresent());
 
     MethodSubject testBooleanValueOfTrue =
-        testClassSubject.uniqueMethodWithName("testBooleanValueOfTrue");
+        testClassSubject.uniqueMethodWithOriginalName("testBooleanValueOfTrue");
     assertThat(testBooleanValueOfTrue, isPresent());
     assertTrue(
         testBooleanValueOfTrue
@@ -69,7 +69,7 @@
             .noneMatch("TRUE"::equals));
 
     MethodSubject testBooleanValueOfFalse =
-        testClassSubject.uniqueMethodWithName("testBooleanValueOfFalse");
+        testClassSubject.uniqueMethodWithOriginalName("testBooleanValueOfFalse");
     assertThat(testBooleanValueOfFalse, isPresent());
     assertTrue(
         testBooleanValueOfFalse
@@ -85,7 +85,7 @@
             .noneMatch("FALSE"::equals));
 
     MethodSubject testRoundTripTrueMethodSubject =
-        testClassSubject.uniqueMethodWithName("testRoundTripTrue");
+        testClassSubject.uniqueMethodWithOriginalName("testRoundTripTrue");
     assertThat(testRoundTripTrueMethodSubject, isPresent());
     assertTrue(
         testRoundTripTrueMethodSubject
@@ -95,7 +95,7 @@
             .noneMatch(or("booleanValue"::equals, "valueOf"::equals)));
 
     MethodSubject testRoundTripFalseMethodSubject =
-        testClassSubject.uniqueMethodWithName("testRoundTripFalse");
+        testClassSubject.uniqueMethodWithOriginalName("testRoundTripFalse");
     assertThat(testRoundTripFalseMethodSubject, isPresent());
     assertTrue(
         testRoundTripFalseMethodSubject
@@ -104,7 +104,8 @@
             .map(invoke -> invoke.getMethod().name.toSourceString())
             .noneMatch(or("booleanValue"::equals, "valueOf"::equals)));
 
-    MethodSubject testValueOfTrue = testClassSubject.uniqueMethodWithName("testValueOfTrue");
+    MethodSubject testValueOfTrue =
+        testClassSubject.uniqueMethodWithOriginalName("testValueOfTrue");
     assertThat(testValueOfTrue, isPresent());
     assertTrue(
         testValueOfTrue
@@ -119,7 +120,8 @@
             .map(staticGet -> staticGet.getField().name.toSourceString())
             .anyMatch("TRUE"::equals));
 
-    MethodSubject testValueOfFalse = testClassSubject.uniqueMethodWithName("testValueOfFalse");
+    MethodSubject testValueOfFalse =
+        testClassSubject.uniqueMethodWithOriginalName("testValueOfFalse");
     assertThat(testValueOfFalse, isPresent());
     assertTrue(
         testValueOfFalse
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/library/ObjectsEqualsTest.java b/src/test/java/com/android/tools/r8/ir/optimize/library/ObjectsEqualsTest.java
index 109c991..6e09e0c 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/library/ObjectsEqualsTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/library/ObjectsEqualsTest.java
@@ -55,7 +55,7 @@
               assertThat(mainClassSubject, isPresent());
 
               MethodSubject testNonNullArgumentsMethodSubject =
-                  mainClassSubject.uniqueMethodWithName("testNonNullArguments");
+                  mainClassSubject.uniqueMethodWithOriginalName("testNonNullArguments");
               assertThat(testNonNullArgumentsMethodSubject, isPresent());
               assertThat(
                   testNonNullArgumentsMethodSubject,
@@ -65,19 +65,19 @@
                   invokesMethodWithHolderAndName("java.lang.Object", "equals"));
 
               MethodSubject testNullAndNullArgumentsMethodSubject =
-                  mainClassSubject.uniqueMethodWithName("testNullAndNullArguments");
+                  mainClassSubject.uniqueMethodWithOriginalName("testNullAndNullArguments");
               assertThat(testNullAndNullArgumentsMethodSubject, isPresent());
               assertThat(
                   testNullAndNullArgumentsMethodSubject, not(invokesMethodWithName("equals")));
 
               MethodSubject testNullAndNonNullArgumentsMethodSubject =
-                  mainClassSubject.uniqueMethodWithName("testNullAndNonNullArguments");
+                  mainClassSubject.uniqueMethodWithOriginalName("testNullAndNonNullArguments");
               assertThat(testNullAndNonNullArgumentsMethodSubject, isPresent());
               assertThat(
                   testNullAndNonNullArgumentsMethodSubject, not(invokesMethodWithName("equals")));
 
               MethodSubject testNullAndMaybeNullArgumentsMethodSubject =
-                  mainClassSubject.uniqueMethodWithName("testNullAndMaybeNullArguments");
+                  mainClassSubject.uniqueMethodWithOriginalName("testNullAndMaybeNullArguments");
               assertThat(testNullAndMaybeNullArgumentsMethodSubject, isPresent());
               assertThat(
                   testNullAndMaybeNullArgumentsMethodSubject,
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/library/ObjectsHashCodeTest.java b/src/test/java/com/android/tools/r8/ir/optimize/library/ObjectsHashCodeTest.java
index 8ed1eac..680be9d 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/library/ObjectsHashCodeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/library/ObjectsHashCodeTest.java
@@ -51,14 +51,14 @@
               assertThat(mainClassSubject, isPresent());
 
               MethodSubject testNonNullArgumentMethodSubject =
-                  mainClassSubject.uniqueMethodWithName("testNonNullArgument");
+                  mainClassSubject.uniqueMethodWithOriginalName("testNonNullArgument");
               assertThat(testNonNullArgumentMethodSubject, isPresent());
               assertThat(
                   testNonNullArgumentMethodSubject,
                   not(invokesMethodWithHolderAndName("java.util.Objects", "hashCode")));
 
               MethodSubject testNullArgumentMethodSubject =
-                  mainClassSubject.uniqueMethodWithName("testNullArgument");
+                  mainClassSubject.uniqueMethodWithOriginalName("testNullArgument");
               assertThat(testNullArgumentMethodSubject, isPresent());
               assertThat(testNullArgumentMethodSubject, not(invokesMethodWithName("hashCode")));
             })
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/library/ObjectsIsNullTest.java b/src/test/java/com/android/tools/r8/ir/optimize/library/ObjectsIsNullTest.java
index 6064fec..9053ad5 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/library/ObjectsIsNullTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/library/ObjectsIsNullTest.java
@@ -48,12 +48,12 @@
               assertThat(mainClassSubject, isPresent());
 
               MethodSubject testNonNullArgumentMethodSubject =
-                  mainClassSubject.uniqueMethodWithName("testNonNullArgument");
+                  mainClassSubject.uniqueMethodWithOriginalName("testNonNullArgument");
               assertThat(testNonNullArgumentMethodSubject, isPresent());
               assertThat(testNonNullArgumentMethodSubject, not(invokesMethodWithName("isNull")));
 
               MethodSubject testNullArgumentMethodSubject =
-                  mainClassSubject.uniqueMethodWithName("testNullArgument");
+                  mainClassSubject.uniqueMethodWithOriginalName("testNullArgument");
               assertThat(testNullArgumentMethodSubject, isPresent());
               assertThat(testNullArgumentMethodSubject, not(invokesMethodWithName("isNull")));
             })
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/library/ObjectsNonNullTest.java b/src/test/java/com/android/tools/r8/ir/optimize/library/ObjectsNonNullTest.java
index d4b4d35..e1b3b14 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/library/ObjectsNonNullTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/library/ObjectsNonNullTest.java
@@ -48,12 +48,12 @@
               assertThat(mainClassSubject, isPresent());
 
               MethodSubject testNonNullArgumentMethodSubject =
-                  mainClassSubject.uniqueMethodWithName("testNonNullArgument");
+                  mainClassSubject.uniqueMethodWithOriginalName("testNonNullArgument");
               assertThat(testNonNullArgumentMethodSubject, isPresent());
               assertThat(testNonNullArgumentMethodSubject, not(invokesMethodWithName("nonNull")));
 
               MethodSubject testNullArgumentMethodSubject =
-                  mainClassSubject.uniqueMethodWithName("testNullArgument");
+                  mainClassSubject.uniqueMethodWithOriginalName("testNullArgument");
               assertThat(testNullArgumentMethodSubject, isPresent());
               assertThat(testNullArgumentMethodSubject, not(invokesMethodWithName("nonNull")));
             })
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/library/ObjectsRequireNonNullElseGetTest.java b/src/test/java/com/android/tools/r8/ir/optimize/library/ObjectsRequireNonNullElseGetTest.java
index aadd5dd..a2391f0 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/library/ObjectsRequireNonNullElseGetTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/library/ObjectsRequireNonNullElseGetTest.java
@@ -64,14 +64,14 @@
               assertThat(mainClassSubject, isPresent());
 
               MethodSubject testNonNullArgumentMethodSubject =
-                  mainClassSubject.uniqueMethodWithName("testNonNullArgument");
+                  mainClassSubject.uniqueMethodWithOriginalName("testNonNullArgument");
               assertThat(testNonNullArgumentMethodSubject, isPresent());
               assertThat(
                   testNonNullArgumentMethodSubject,
                   not(invokesMethodWithName("requireNonNullElseGet")));
 
               MethodSubject testNullArgumentMethodSubject =
-                  mainClassSubject.uniqueMethodWithName("testNullArgument");
+                  mainClassSubject.uniqueMethodWithOriginalName("testNullArgument");
               assertThat(testNullArgumentMethodSubject, isPresent());
               assertThat(
                   testNullArgumentMethodSubject,
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/library/ObjectsRequireNonNullElseTest.java b/src/test/java/com/android/tools/r8/ir/optimize/library/ObjectsRequireNonNullElseTest.java
index bde8237..7b4ed4b 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/library/ObjectsRequireNonNullElseTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/library/ObjectsRequireNonNullElseTest.java
@@ -59,14 +59,14 @@
               assertThat(mainClassSubject, isPresent());
 
               MethodSubject testNonNullArgumentMethodSubject =
-                  mainClassSubject.uniqueMethodWithName("testNonNullArgument");
+                  mainClassSubject.uniqueMethodWithOriginalName("testNonNullArgument");
               assertThat(testNonNullArgumentMethodSubject, isPresent());
               assertThat(
                   testNonNullArgumentMethodSubject,
                   not(invokesMethodWithName("requireNonNullElse")));
 
               MethodSubject testNullArgumentMethodSubject =
-                  mainClassSubject.uniqueMethodWithName("testNullArgument");
+                  mainClassSubject.uniqueMethodWithOriginalName("testNullArgument");
               assertThat(testNullArgumentMethodSubject, isPresent());
               assertThat(
                   testNullArgumentMethodSubject, not(invokesMethodWithName("requireNonNullElse")));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/library/ObjectsToStringWithNullDefaultTest.java b/src/test/java/com/android/tools/r8/ir/optimize/library/ObjectsToStringWithNullDefaultTest.java
index fe974a5..aed86f3 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/library/ObjectsToStringWithNullDefaultTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/library/ObjectsToStringWithNullDefaultTest.java
@@ -53,12 +53,12 @@
               assertThat(mainClassSubject, isPresent());
 
               MethodSubject testNonNullArgumentMethodSubject =
-                  mainClassSubject.uniqueMethodWithName("testNonNullArgument");
+                  mainClassSubject.uniqueMethodWithOriginalName("testNonNullArgument");
               assertThat(testNonNullArgumentMethodSubject, isPresent());
               assertThat(testNonNullArgumentMethodSubject, not(invokesMethodWithName("toString")));
 
               MethodSubject testNullArgumentMethodSubject =
-                  mainClassSubject.uniqueMethodWithName("testNullArgument");
+                  mainClassSubject.uniqueMethodWithOriginalName("testNullArgument");
               assertThat(testNullArgumentMethodSubject, isPresent());
               assertThat(testNullArgumentMethodSubject, not(invokesMethodWithName("toString")));
             })
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/library/PrunedClassNameComparisonTest.java b/src/test/java/com/android/tools/r8/ir/optimize/library/PrunedClassNameComparisonTest.java
index 5dc83d0..9d6fe46 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/library/PrunedClassNameComparisonTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/library/PrunedClassNameComparisonTest.java
@@ -48,8 +48,8 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject testClassSubject = inspector.clazz(TestClass.class);
     assertThat(testClassSubject, isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("live"), isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("dead"), not(isPresent()));
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("live"), isPresent());
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("dead"), not(isPresent()));
   }
 
   static class TestClass {
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 edd2219..acb9b0b 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
@@ -58,11 +58,12 @@
     ClassSubject configClassSubject = inspector.clazz(Config.class);
     assertThat(configClassSubject, isPresent());
 
-    FieldSubject alwaysTrueFieldSubject = configClassSubject.uniqueFieldWithName("alwaysTrue");
+    FieldSubject alwaysTrueFieldSubject =
+        configClassSubject.uniqueFieldWithOriginalName("alwaysTrue");
     assertThat(alwaysTrueFieldSubject, isAbsent());
 
     FieldSubject alwaysTrueNoSideEffectsFieldSubject =
-        configClassSubject.uniqueFieldWithName("alwaysTrueNoSideEffects");
+        configClassSubject.uniqueFieldWithOriginalName("alwaysTrueNoSideEffects");
     assertThat(alwaysTrueNoSideEffectsFieldSubject, not(isPresent()));
 
     ClassSubject testClassSubject = inspector.clazz(TestClass.class);
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/B135918413.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/B135918413.java
index b171525..7c521aa 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/B135918413.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/B135918413.java
@@ -57,11 +57,12 @@
     ClassSubject configClassSubject = inspector.clazz(Config.class);
     assertThat(configClassSubject, isPresent());
 
-    FieldSubject alwaysEmptyFieldSubject = configClassSubject.uniqueFieldWithName("alwaysEmpty");
+    FieldSubject alwaysEmptyFieldSubject =
+        configClassSubject.uniqueFieldWithOriginalName("alwaysEmpty");
     assertThat(alwaysEmptyFieldSubject, isPresent());
 
     FieldSubject alwaysNonEmptyFieldSubject =
-        configClassSubject.uniqueFieldWithName("alwaysNonEmpty");
+        configClassSubject.uniqueFieldWithOriginalName("alwaysNonEmpty");
     assertThat(alwaysNonEmptyFieldSubject, isPresent());
 
     MethodSubject mainMethodSubject = classSubject.mainMethod();
@@ -78,7 +79,7 @@
                         || name.equals(alwaysNonEmptyFieldSubject.getFinalName())
                         || name.equals("out")));
 
-    MethodSubject deadMethodSubject = classSubject.uniqueMethodWithName("dead");
+    MethodSubject deadMethodSubject = classSubject.uniqueMethodWithOriginalName("dead");
     assertThat(deadMethodSubject, not(isPresent()));
   }
 
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/B137041585.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/B137041585.java
index bef3707..8ae967b 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/B137041585.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/B137041585.java
@@ -41,8 +41,11 @@
             inspector -> {
               ClassSubject classSubject = inspector.clazz(R.font.class);
               assertThat(classSubject, isPresent());
-              assertThat(classSubject.uniqueFieldWithName("roboto_mono_bold"), not(isPresent()));
-              assertThat(classSubject.uniqueFieldWithName("roboto_mono_regular"), not(isPresent()));
+              assertThat(
+                  classSubject.uniqueFieldWithOriginalName("roboto_mono_bold"), not(isPresent()));
+              assertThat(
+                  classSubject.uniqueFieldWithOriginalName("roboto_mono_regular"),
+                  not(isPresent()));
             })
         .run(parameters.getRuntime(), TestClass.class)
         .assertSuccessWithOutputLines("1", "2", "1", "2", "1");
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/ConstClassMemberValuePropagationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/ConstClassMemberValuePropagationTest.java
index af4af19..d44418c 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/ConstClassMemberValuePropagationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/ConstClassMemberValuePropagationTest.java
@@ -53,9 +53,11 @@
     ClassSubject testClassSubject = inspector.clazz(TestClass.class);
     assertThat(testClassSubject, isPresent());
     assertThat(
-        testClassSubject.uniqueMethodWithName("deadDueToFieldValuePropagation"), not(isPresent()));
+        testClassSubject.uniqueMethodWithOriginalName("deadDueToFieldValuePropagation"),
+        not(isPresent()));
     assertThat(
-        testClassSubject.uniqueMethodWithName("deadDueToReturnValuePropagation"), not(isPresent()));
+        testClassSubject.uniqueMethodWithOriginalName("deadDueToReturnValuePropagation"),
+        not(isPresent()));
 
     // Verify that there are no more conditional instructions.
     MethodSubject mainMethodSubject = testClassSubject.mainMethod();
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/EnumMemberValuePropagationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/EnumMemberValuePropagationTest.java
index ae2b510..a73e55f 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/EnumMemberValuePropagationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/EnumMemberValuePropagationTest.java
@@ -53,9 +53,11 @@
     ClassSubject testClassSubject = inspector.clazz(TestClass.class);
     assertThat(testClassSubject, isPresent());
     assertThat(
-        testClassSubject.uniqueMethodWithName("deadDueToFieldValuePropagation"), not(isPresent()));
+        testClassSubject.uniqueMethodWithOriginalName("deadDueToFieldValuePropagation"),
+        not(isPresent()));
     assertThat(
-        testClassSubject.uniqueMethodWithName("deadDueToReturnValuePropagation"), not(isPresent()));
+        testClassSubject.uniqueMethodWithOriginalName("deadDueToReturnValuePropagation"),
+        not(isPresent()));
 
     // Verify that there are no more conditional instructions.
     MethodSubject mainMethodSubject = testClassSubject.mainMethod();
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/FieldWithDefaultValueAssignmentTest.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/FieldWithDefaultValueAssignmentTest.java
index 3eb649a..54a69c1 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/FieldWithDefaultValueAssignmentTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/FieldWithDefaultValueAssignmentTest.java
@@ -48,8 +48,8 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject testClassSubject = inspector.clazz(TestClass.class);
     assertThat(testClassSubject, isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("live"), isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("dead"), not(isPresent()));
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("live"), isPresent());
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("dead"), not(isPresent()));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/FieldWriteBeforeFieldReadTest.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/FieldWriteBeforeFieldReadTest.java
index b493f1d..5b50028 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/FieldWriteBeforeFieldReadTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/FieldWriteBeforeFieldReadTest.java
@@ -77,8 +77,8 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject testClassSubject = inspector.clazz(TestClass.class);
     assertThat(testClassSubject, isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("live"), isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("dead"), not(isPresent()));
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("live"), isPresent());
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("dead"), not(isPresent()));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/FinalFieldWithDefaultValueAssignmentPropagationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/FinalFieldWithDefaultValueAssignmentPropagationTest.java
index 97dd34c..6cbacd6 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/FinalFieldWithDefaultValueAssignmentPropagationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/FinalFieldWithDefaultValueAssignmentPropagationTest.java
@@ -52,7 +52,7 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject testClassSubject = inspector.clazz(TestClass.class);
     assertThat(testClassSubject, isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("dead"), not(isPresent()));
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("dead"), not(isPresent()));
 
     ClassSubject configClassSubject = inspector.clazz(Config.class);
     assertThat(configClassSubject, isPresent());
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/InstanceFieldValuePropagationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/InstanceFieldValuePropagationTest.java
index 0745620..752e0c6 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/InstanceFieldValuePropagationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/InstanceFieldValuePropagationTest.java
@@ -58,7 +58,7 @@
     // Verify that all instance-get instructions in testDefinitelyNotNull() has been removed by
     // member value propagation.
     MethodSubject testDefinitelyNotNullMethodSubject =
-        testClassSubject.uniqueMethodWithName("testDefinitelyNotNull");
+        testClassSubject.uniqueMethodWithOriginalName("testDefinitelyNotNull");
     assertThat(testDefinitelyNotNullMethodSubject, isPresent());
     assertTrue(
         testDefinitelyNotNullMethodSubject
@@ -72,7 +72,7 @@
     // Verify that all instance-get instructions in testMaybeNull() has been removed by member value
     // propagation.
     MethodSubject testMaybeNullMethodSubject =
-        testClassSubject.uniqueMethodWithName("testMaybeNull");
+        testClassSubject.uniqueMethodWithOriginalName("testMaybeNull");
     assertThat(testMaybeNullMethodSubject, isPresent());
     assertTrue(
         testMaybeNullMethodSubject
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/InstanceFieldValuePropagationWithMultipleInstanceInitializersTest.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/InstanceFieldValuePropagationWithMultipleInstanceInitializersTest.java
index 6c7cf37..2ef6259 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/InstanceFieldValuePropagationWithMultipleInstanceInitializersTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/InstanceFieldValuePropagationWithMultipleInstanceInitializersTest.java
@@ -61,7 +61,7 @@
     // Verify that the `greeting` field is still present.
     ClassSubject aClassSubject = inspector.clazz(A.class);
     assertThat(aClassSubject, isPresent());
-    assertThat(aClassSubject.uniqueFieldWithName("greeting"), isPresent());
+    assertThat(aClassSubject.uniqueFieldWithOriginalName("greeting"), isPresent());
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/MemberValuePropagationWithClassInitializationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/MemberValuePropagationWithClassInitializationTest.java
index fb3d7e4..2a2eb77 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/MemberValuePropagationWithClassInitializationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/MemberValuePropagationWithClassInitializationTest.java
@@ -55,17 +55,17 @@
     ClassSubject aClassSubject = inspector.clazz(A.class);
     assertThat(aClassSubject, isPresent());
 
-    FieldSubject fieldSubject = aClassSubject.uniqueFieldWithName("field");
+    FieldSubject fieldSubject = aClassSubject.uniqueFieldWithOriginalName("field");
     assertThat(fieldSubject, not(isPresent()));
 
-    FieldSubject clinitFieldSubject = aClassSubject.uniqueFieldWithName("$r8$clinit");
+    FieldSubject clinitFieldSubject = aClassSubject.uniqueFieldWithOriginalName("$r8$clinit");
     assertThat(clinitFieldSubject, isPresent());
 
     // B.method() is present.
     ClassSubject bClassSubject = inspector.clazz(B.class);
     assertThat(bClassSubject, isPresent());
 
-    MethodSubject methodSubject = bClassSubject.uniqueMethodWithName("method");
+    MethodSubject methodSubject = bClassSubject.uniqueMethodWithOriginalName("method");
     assertThat(methodSubject, not(isPresent()));
 
     // TestClass.missingFieldValuePropagation() and TestClass.missingMethodValuePropagation() are
@@ -73,9 +73,11 @@
     ClassSubject testClassSubject = inspector.clazz(TestClass.class);
     assertThat(testClassSubject, isPresent());
     assertThat(
-        testClassSubject.uniqueMethodWithName("missingFieldValuePropagation"), not(isPresent()));
+        testClassSubject.uniqueMethodWithOriginalName("missingFieldValuePropagation"),
+        not(isPresent()));
     assertThat(
-        testClassSubject.uniqueMethodWithName("missingMethodValuePropagation"), not(isPresent()));
+        testClassSubject.uniqueMethodWithOriginalName("missingMethodValuePropagation"),
+        not(isPresent()));
 
     // TestClass.main() still accesses A.field and invokes B.method().
     MethodSubject mainMethodSubject = testClassSubject.mainMethod();
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/MemberValuePropagationWithNewArrayFilledDataTest.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/MemberValuePropagationWithNewArrayFilledDataTest.java
index 52a163e..a00178c 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/MemberValuePropagationWithNewArrayFilledDataTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/MemberValuePropagationWithNewArrayFilledDataTest.java
@@ -48,19 +48,19 @@
               assertThat(fontClassSubject, isPresent());
 
               FieldSubject robotoMonoFieldSubject =
-                  fontClassSubject.uniqueFieldWithName("roboto_mono");
+                  fontClassSubject.uniqueFieldWithOriginalName("roboto_mono");
               assertThat(robotoMonoFieldSubject, not(isPresent()));
 
               FieldSubject robotoMonoBoldFieldSubject =
-                  fontClassSubject.uniqueFieldWithName("roboto_mono_bold");
+                  fontClassSubject.uniqueFieldWithOriginalName("roboto_mono_bold");
               assertThat(robotoMonoBoldFieldSubject, not(isPresent()));
 
               FieldSubject robotoMonoRegularFieldSubject =
-                  fontClassSubject.uniqueFieldWithName("roboto_mono_regular");
+                  fontClassSubject.uniqueFieldWithOriginalName("roboto_mono_regular");
               assertThat(robotoMonoRegularFieldSubject, not(isPresent()));
 
               FieldSubject robotoMonoWeightsFieldSubject =
-                  fontClassSubject.uniqueFieldWithName("roboto_mono_weights");
+                  fontClassSubject.uniqueFieldWithOriginalName("roboto_mono_weights");
               assertThat(robotoMonoWeightsFieldSubject, isPresent());
 
               ClassSubject testClassSubject = inspector.clazz(TestClass.class);
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/NonFinalFieldWithDefaultValueAssignmentPropagationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/NonFinalFieldWithDefaultValueAssignmentPropagationTest.java
index 433ee13..611bf52 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/NonFinalFieldWithDefaultValueAssignmentPropagationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/NonFinalFieldWithDefaultValueAssignmentPropagationTest.java
@@ -54,7 +54,7 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject testClassSubject = inspector.clazz(TestClass.class);
     assertThat(testClassSubject, isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("dead"), not(isPresent()));
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("dead"), not(isPresent()));
 
     ClassSubject configClassSubject = inspector.clazz(Config.class);
     assertThat(configClassSubject, isPresent());
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/NonFinalFieldWithNonDefaultValueAssignmentPropagationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/NonFinalFieldWithNonDefaultValueAssignmentPropagationTest.java
index c69ddd6..e9fd562 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/NonFinalFieldWithNonDefaultValueAssignmentPropagationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/NonFinalFieldWithNonDefaultValueAssignmentPropagationTest.java
@@ -54,7 +54,7 @@
     ClassSubject testClassSubject = inspector.clazz(TestClass.class);
     assertThat(testClassSubject, isPresent());
     // TODO(b/147799637): Should be absent.
-    assertThat(testClassSubject.uniqueMethodWithName("dead"), isPresent());
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("dead"), isPresent());
 
     ClassSubject configClassSubject = inspector.clazz(Config.class);
     assertThat(configClassSubject, isPresent());
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByConstantArgumentForwardingConstructorTest.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByConstantArgumentForwardingConstructorTest.java
index fba6f58..1aa4d4b 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByConstantArgumentForwardingConstructorTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByConstantArgumentForwardingConstructorTest.java
@@ -50,8 +50,8 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject testClassSubject = inspector.clazz(TestClass.class);
     assertThat(testClassSubject, isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("live"), isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("dead"), not(isPresent()));
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("live"), isPresent());
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("dead"), not(isPresent()));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByConstantArgumentMultipleConstructorsTest.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByConstantArgumentMultipleConstructorsTest.java
index b6fe557..2de70ea 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByConstantArgumentMultipleConstructorsTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByConstantArgumentMultipleConstructorsTest.java
@@ -50,8 +50,8 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject testClassSubject = inspector.clazz(TestClass.class);
     assertThat(testClassSubject, isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("live"), isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("dead"), not(isPresent()));
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("live"), isPresent());
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("dead"), not(isPresent()));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByConstantArgumentSubtypeTest.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByConstantArgumentSubtypeTest.java
index 97b57f4..e9a9f9e 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByConstantArgumentSubtypeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByConstantArgumentSubtypeTest.java
@@ -50,8 +50,8 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject testClassSubject = inspector.clazz(TestClass.class);
     assertThat(testClassSubject, isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("live"), isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("dead"), isAbsent());
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("live"), isPresent());
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("dead"), isAbsent());
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByConstantArgumentTest.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByConstantArgumentTest.java
index ca34efd..d0698d2 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByConstantArgumentTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByConstantArgumentTest.java
@@ -50,8 +50,8 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject testClassSubject = inspector.clazz(TestClass.class);
     assertThat(testClassSubject, isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("live"), isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("dead"), not(isPresent()));
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("live"), isPresent());
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("dead"), not(isPresent()));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByConstantInOneConstructorTest.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByConstantInOneConstructorTest.java
index 0902756..3710a80 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByConstantInOneConstructorTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByConstantInOneConstructorTest.java
@@ -50,8 +50,8 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject testClassSubject = inspector.clazz(TestClass.class);
     assertThat(testClassSubject, isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("live"), isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("dead"), not(isPresent()));
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("live"), isPresent());
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("dead"), not(isPresent()));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByDifferentConstantsInMultipleConstructorsTest.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByDifferentConstantsInMultipleConstructorsTest.java
index c3a453d..8eced2c 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByDifferentConstantsInMultipleConstructorsTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByDifferentConstantsInMultipleConstructorsTest.java
@@ -50,8 +50,8 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject testClassSubject = inspector.clazz(TestClass.class);
     assertThat(testClassSubject, isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("live"), isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("dead"), not(isPresent()));
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("live"), isPresent());
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("dead"), not(isPresent()));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByNonConstantArgumentInForwardingConstructorTest.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByNonConstantArgumentInForwardingConstructorTest.java
index c89cfa9..cc6c98c 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByNonConstantArgumentInForwardingConstructorTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByNonConstantArgumentInForwardingConstructorTest.java
@@ -51,8 +51,8 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject testClassSubject = inspector.clazz(TestClass.class);
     assertThat(testClassSubject, isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("live"), isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("dead"), not(isPresent()));
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("live"), isPresent());
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("dead"), not(isPresent()));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByNonConstantArgumentInSuperConstructorTest.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByNonConstantArgumentInSuperConstructorTest.java
index 9ffd5ee..8634896 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByNonConstantArgumentInSuperConstructorTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByNonConstantArgumentInSuperConstructorTest.java
@@ -52,8 +52,8 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject testClassSubject = inspector.clazz(TestClass.class);
     assertThat(testClassSubject, isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("live"), isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("dead"), not(isPresent()));
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("live"), isPresent());
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("dead"), not(isPresent()));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByNonConstantArgumentTest.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByNonConstantArgumentTest.java
index c515e70..d0e1260 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByNonConstantArgumentTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedByNonConstantArgumentTest.java
@@ -50,8 +50,8 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject testClassSubject = inspector.clazz(TestClass.class);
     assertThat(testClassSubject, isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("live"), isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("dead"), not(isPresent()));
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("live"), isPresent());
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("dead"), not(isPresent()));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedBySameConstantInMultipleConstructorsTest.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedBySameConstantInMultipleConstructorsTest.java
index 3033e29..1dba47d 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedBySameConstantInMultipleConstructorsTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldInitializedBySameConstantInMultipleConstructorsTest.java
@@ -50,8 +50,8 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject testClassSubject = inspector.clazz(TestClass.class);
     assertThat(testClassSubject, isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("live"), isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("dead"), not(isPresent()));
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("live"), isPresent());
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("dead"), not(isPresent()));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldTypeStrengtheningTest.java b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldTypeStrengtheningTest.java
index bf1ec2e..5e553e4 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldTypeStrengtheningTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/membervaluepropagation/fields/FieldTypeStrengtheningTest.java
@@ -47,7 +47,7 @@
               ClassSubject aClassSubject = inspector.clazz(A.class);
               assertThat(aClassSubject, isPresent());
 
-              FieldSubject fieldSubject = mainClassSubject.uniqueFieldWithName("f");
+              FieldSubject fieldSubject = mainClassSubject.uniqueFieldWithOriginalName("f");
               assertEquals(
                   aClassSubject.getFinalName(), fieldSubject.getField().getType().getTypeName());
             })
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/nonnull/NonNullFieldAccessTest.java b/src/test/java/com/android/tools/r8/ir/optimize/nonnull/NonNullFieldAccessTest.java
index 4c19863..eec914f 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/nonnull/NonNullFieldAccessTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/nonnull/NonNullFieldAccessTest.java
@@ -49,9 +49,9 @@
   private void verifyNonNullPropagation(CodeInspector inspector) {
     ClassSubject classSubject = inspector.clazz(TestClass.class);
     assertThat(classSubject, isPresent());
-    assertThat(classSubject.uniqueMethodWithName("live"), isPresent());
-    assertThat(classSubject.uniqueMethodWithName("dead"), not(isPresent()));
-    assertThat(classSubject.uniqueMethodWithName("inlineable"), not(isPresent()));
+    assertThat(classSubject.uniqueMethodWithOriginalName("live"), isPresent());
+    assertThat(classSubject.uniqueMethodWithOriginalName("dead"), not(isPresent()));
+    assertThat(classSubject.uniqueMethodWithOriginalName("inlineable"), not(isPresent()));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/nonnull/RequireNonNullTest.java b/src/test/java/com/android/tools/r8/ir/optimize/nonnull/RequireNonNullTest.java
index a6f8740..557be25 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/nonnull/RequireNonNullTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/nonnull/RequireNonNullTest.java
@@ -52,8 +52,8 @@
 
   private void inspect(CodeInspector inspector) {
     ClassSubject testClassSubject = inspector.clazz(TestClass.class);
-    assertThat(testClassSubject.uniqueMethodWithName("live"), isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("dead"), not(isPresent()));
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("live"), isPresent());
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("dead"), not(isPresent()));
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/outliner/OutlineFromDefaultInterfaceMethodTest.java b/src/test/java/com/android/tools/r8/ir/optimize/outliner/OutlineFromDefaultInterfaceMethodTest.java
index baf0868..8418f9c 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/outliner/OutlineFromDefaultInterfaceMethodTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/outliner/OutlineFromDefaultInterfaceMethodTest.java
@@ -66,7 +66,7 @@
   private void inspect(CodeInspector inspector) {
     if (parameters.canUseDefaultAndStaticInterfaceMethods()) {
       ClassSubject interfaceSubject = inspector.clazz(I.class);
-      MethodSubject greetMethodSubject = interfaceSubject.uniqueMethodWithName("greet");
+      MethodSubject greetMethodSubject = interfaceSubject.uniqueMethodWithOriginalName("greet");
       assertThat(interfaceSubject, isPresent());
       assertThat(greetMethodSubject, isPresent());
       assertEquals(
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/outliner/OutlineFromStaticInterfaceMethodTest.java b/src/test/java/com/android/tools/r8/ir/optimize/outliner/OutlineFromStaticInterfaceMethodTest.java
index e1763f1..2bbb1b6 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/outliner/OutlineFromStaticInterfaceMethodTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/outliner/OutlineFromStaticInterfaceMethodTest.java
@@ -68,7 +68,7 @@
             : inspector.clazz(I.class.getTypeName() + getCompanionClassNameSuffix());
     assertThat(interfaceSubject, isPresent());
 
-    MethodSubject greetMethodSubject = interfaceSubject.uniqueMethodWithName("greet");
+    MethodSubject greetMethodSubject = interfaceSubject.uniqueMethodWithOriginalName("greet");
     assertThat(greetMethodSubject, isPresent());
     assertEquals(
         1,
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/outliner/OutlinesWithNonNullTest.java b/src/test/java/com/android/tools/r8/ir/optimize/outliner/OutlinesWithNonNullTest.java
index 696a413..69b56ce 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/outliner/OutlinesWithNonNullTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/outliner/OutlinesWithNonNullTest.java
@@ -88,24 +88,24 @@
     ClassSubject outlineClass =
         inspector.clazz(SyntheticItemsTestUtils.syntheticOutlineClass(main, 0));
     MethodSubject outlineMethod =
-        outlineClass.uniqueMethodWithName(SyntheticItemsTestUtils.syntheticMethodName());
+        outlineClass.uniqueMethodWithOriginalName(SyntheticItemsTestUtils.syntheticMethodName());
     assertThat(outlineMethod, isPresent());
 
     ClassSubject argClass = inspector.clazz(TestArg.class);
     assertThat(argClass, isPresent());
-    MethodSubject printHash = argClass.uniqueMethodWithName("printHash");
+    MethodSubject printHash = argClass.uniqueMethodWithOriginalName("printHash");
     assertThat(printHash, isPresent());
-    MethodSubject printArg= argClass.uniqueMethodWithName("printArg");
+    MethodSubject printArg = argClass.uniqueMethodWithOriginalName("printArg");
     assertThat(printArg, isPresent());
 
     ClassSubject classSubject = inspector.clazz(main);
     assertThat(classSubject, isPresent());
-    MethodSubject method1 = classSubject.uniqueMethodWithName("method1");
+    MethodSubject method1 = classSubject.uniqueMethodWithOriginalName("method1");
     assertThat(method1, isPresent());
     assertThat(method1, CodeMatchers.invokesMethod(outlineMethod));
     assertThat(method1, not(CodeMatchers.invokesMethod(printHash)));
     assertThat(method1, not(CodeMatchers.invokesMethod(printArg)));
-    MethodSubject method2 = classSubject.uniqueMethodWithName("method2");
+    MethodSubject method2 = classSubject.uniqueMethodWithOriginalName("method2");
     assertThat(method2, isPresent());
     assertThat(method2, CodeMatchers.invokesMethod(outlineMethod));
     assertThat(method2, not(CodeMatchers.invokesMethod(printHash)));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/outliner/arraytypes/OutlinesWithClassArrayTypeArguments.java b/src/test/java/com/android/tools/r8/ir/optimize/outliner/arraytypes/OutlinesWithClassArrayTypeArguments.java
index 63aed12..7325c71 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/outliner/arraytypes/OutlinesWithClassArrayTypeArguments.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/outliner/arraytypes/OutlinesWithClassArrayTypeArguments.java
@@ -48,9 +48,11 @@
     assertThat(outline0Method, isPresent());
     ClassSubject classSubject = inspector.clazz(TestClass.class);
     assertThat(
-        classSubject.uniqueMethodWithName("method1"), CodeMatchers.invokesMethod(outline0Method));
+        classSubject.uniqueMethodWithOriginalName("method1"),
+        CodeMatchers.invokesMethod(outline0Method));
     assertThat(
-        classSubject.uniqueMethodWithName("method2"), CodeMatchers.invokesMethod(outline0Method));
+        classSubject.uniqueMethodWithOriginalName("method2"),
+        CodeMatchers.invokesMethod(outline0Method));
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/outliner/arraytypes/OutlinesWithInterfaceArrayTypeArguments.java b/src/test/java/com/android/tools/r8/ir/optimize/outliner/arraytypes/OutlinesWithInterfaceArrayTypeArguments.java
index 4f6a822..7b7c6c3 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/outliner/arraytypes/OutlinesWithInterfaceArrayTypeArguments.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/outliner/arraytypes/OutlinesWithInterfaceArrayTypeArguments.java
@@ -57,9 +57,11 @@
       assertThat(outline0Method, isPresent());
       ClassSubject classSubject = inspector.clazz(TestClass.class);
       assertThat(
-          classSubject.uniqueMethodWithName("method1"), CodeMatchers.invokesMethod(outline0Method));
+          classSubject.uniqueMethodWithOriginalName("method1"),
+          CodeMatchers.invokesMethod(outline0Method));
       assertThat(
-          classSubject.uniqueMethodWithName("method2"), CodeMatchers.invokesMethod(outline0Method));
+          classSubject.uniqueMethodWithOriginalName("method2"),
+          CodeMatchers.invokesMethod(outline0Method));
     } else {
       assertThat(outlineClass, not(isPresent()));
     }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/outliner/arraytypes/OutlinesWithPrimitiveArrayTypeArguments.java b/src/test/java/com/android/tools/r8/ir/optimize/outliner/arraytypes/OutlinesWithPrimitiveArrayTypeArguments.java
index 2065f83..3939dd0 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/outliner/arraytypes/OutlinesWithPrimitiveArrayTypeArguments.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/outliner/arraytypes/OutlinesWithPrimitiveArrayTypeArguments.java
@@ -47,9 +47,11 @@
     assertThat(outline0Method, isPresent());
     ClassSubject classSubject = inspector.clazz(TestClass.class);
     assertThat(
-        classSubject.uniqueMethodWithName("method1"), CodeMatchers.invokesMethod(outline0Method));
+        classSubject.uniqueMethodWithOriginalName("method1"),
+        CodeMatchers.invokesMethod(outline0Method));
     assertThat(
-        classSubject.uniqueMethodWithName("method2"), CodeMatchers.invokesMethod(outline0Method));
+        classSubject.uniqueMethodWithOriginalName("method2"),
+        CodeMatchers.invokesMethod(outline0Method));
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/outliner/b133215941/B133215941.java b/src/test/java/com/android/tools/r8/ir/optimize/outliner/b133215941/B133215941.java
index ee81c79..fcada92 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/outliner/b133215941/B133215941.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/outliner/b133215941/B133215941.java
@@ -51,10 +51,10 @@
     assertThat(outline0Method, isPresent());
     ClassSubject classSubject = inspector.clazz(TestClass.class);
     assertThat(
-        classSubject.uniqueMethodWithName("ifaceMethod"),
+        classSubject.uniqueMethodWithOriginalName("ifaceMethod"),
         CodeMatchers.invokesMethod(outline0Method));
     assertThat(
-        classSubject.uniqueMethodWithName("methodWithOutlineContent"),
+        classSubject.uniqueMethodWithOriginalName("methodWithOutlineContent"),
         CodeMatchers.invokesMethod(outline0Method));
   }
 
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/outliner/b149971007/B149971007.java b/src/test/java/com/android/tools/r8/ir/optimize/outliner/b149971007/B149971007.java
index 0d1f637..ee43078 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/outliner/b149971007/B149971007.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/outliner/b149971007/B149971007.java
@@ -108,10 +108,14 @@
 
     // Verify they are called from the feature methods.
     // Note: should the choice of synthetic grouping change these expectations will too.
-    assertTrue(invokesOutline(featureClass.uniqueMethodWithName("method1"), outlineClassName));
-    assertTrue(invokesOutline(featureClass.uniqueMethodWithName("method2"), outlineClassName));
-    assertTrue(invokesOutline(featureClass.uniqueMethodWithName("method3"), outlineClassName));
-    assertTrue(invokesOutline(featureClass.uniqueMethodWithName("method4"), outlineClassName));
+    assertTrue(
+        invokesOutline(featureClass.uniqueMethodWithOriginalName("method1"), outlineClassName));
+    assertTrue(
+        invokesOutline(featureClass.uniqueMethodWithOriginalName("method2"), outlineClassName));
+    assertTrue(
+        invokesOutline(featureClass.uniqueMethodWithOriginalName("method3"), outlineClassName));
+    assertTrue(
+        invokesOutline(featureClass.uniqueMethodWithOriginalName("method4"), outlineClassName));
 
     compileResult.run(parameters.getRuntime(), TestClass.class).assertSuccessWithOutput("123456");
   }
@@ -160,10 +164,14 @@
             .inverse
             .get(SyntheticItemsTestUtils.syntheticOutlineClass(TestClass.class, 0).getTypeName());
 
-    assertFalse(invokesOutline(featureClass.uniqueMethodWithName("method1"), outlineClassName));
-    assertFalse(invokesOutline(featureClass.uniqueMethodWithName("method2"), outlineClassName));
-    assertFalse(invokesOutline(featureClass.uniqueMethodWithName("method3"), outlineClassName));
-    assertFalse(invokesOutline(featureClass.uniqueMethodWithName("method4"), outlineClassName));
+    assertFalse(
+        invokesOutline(featureClass.uniqueMethodWithOriginalName("method1"), outlineClassName));
+    assertFalse(
+        invokesOutline(featureClass.uniqueMethodWithOriginalName("method2"), outlineClassName));
+    assertFalse(
+        invokesOutline(featureClass.uniqueMethodWithOriginalName("method3"), outlineClassName));
+    assertFalse(
+        invokesOutline(featureClass.uniqueMethodWithOriginalName("method4"), outlineClassName));
 
     // Run the code without the feature code present.
     compileResult.run(parameters.getRuntime(), TestClass.class).assertSuccessWithOutput("12");
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/outliner/classtypes/B134462736.java b/src/test/java/com/android/tools/r8/ir/optimize/outliner/classtypes/B134462736.java
index 9437d1d..29690ea 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/outliner/classtypes/B134462736.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/outliner/classtypes/B134462736.java
@@ -54,9 +54,11 @@
     assertThat(outline0Method, isPresent());
     ClassSubject classSubject = inspector.clazz(TestClass.class);
     assertThat(
-        classSubject.uniqueMethodWithName("method1"), CodeMatchers.invokesMethod(outline0Method));
+        classSubject.uniqueMethodWithOriginalName("method1"),
+        CodeMatchers.invokesMethod(outline0Method));
     assertThat(
-        classSubject.uniqueMethodWithName("method2"), CodeMatchers.invokesMethod(outline0Method));
+        classSubject.uniqueMethodWithOriginalName("method2"),
+        CodeMatchers.invokesMethod(outline0Method));
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/outliner/primitivetypes/PrimitiveTypesTest.java b/src/test/java/com/android/tools/r8/ir/optimize/outliner/primitivetypes/PrimitiveTypesTest.java
index 8385328..81f4c01 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/outliner/primitivetypes/PrimitiveTypesTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/outliner/primitivetypes/PrimitiveTypesTest.java
@@ -62,9 +62,11 @@
     assertThat(outline0Method, isPresent());
     ClassSubject classSubject = inspector.clazz(testClass);
     assertThat(
-        classSubject.uniqueMethodWithName("method1"), CodeMatchers.invokesMethod(outline0Method));
+        classSubject.uniqueMethodWithOriginalName("method1"),
+        CodeMatchers.invokesMethod(outline0Method));
     assertThat(
-        classSubject.uniqueMethodWithName("method2"), CodeMatchers.invokesMethod(outline0Method));
+        classSubject.uniqueMethodWithOriginalName("method2"),
+        CodeMatchers.invokesMethod(outline0Method));
   }
 
   public void runTest(Class<?> testClass, String argumentType, String expectedOutput)
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/redundantarraygetelimination/RedundantArrayGetEliminationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/redundantarraygetelimination/RedundantArrayGetEliminationTest.java
index b5c1de5..95b0a58 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/redundantarraygetelimination/RedundantArrayGetEliminationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/redundantarraygetelimination/RedundantArrayGetEliminationTest.java
@@ -61,15 +61,23 @@
 
   private void inspect(CodeInspector inspector) {
     ClassSubject mainClassSubject = inspector.clazz(Main.class);
-    assertArrayGetCountEquals(1, mainClassSubject.uniqueMethodWithName("testRedundantArrayGet"));
     assertArrayGetCountEquals(
-        1, mainClassSubject.uniqueMethodWithName("testRedundantArrayGetAfterPutToUnrelatedArray"));
+        1, mainClassSubject.uniqueMethodWithOriginalName("testRedundantArrayGet"));
     assertArrayGetCountEquals(
-        1, mainClassSubject.uniqueMethodWithName("testRedundantArrayGetAfterPutToUnrelatedIndex"));
+        1,
+        mainClassSubject.uniqueMethodWithOriginalName(
+            "testRedundantArrayGetAfterPutToUnrelatedArray"));
     assertArrayGetCountEquals(
-        2, mainClassSubject.uniqueMethodWithName("testNecessaryArrayGetAfterAliasedArrayPut"));
+        1,
+        mainClassSubject.uniqueMethodWithOriginalName(
+            "testRedundantArrayGetAfterPutToUnrelatedIndex"));
     assertArrayGetCountEquals(
-        2, mainClassSubject.uniqueMethodWithName("testNecessaryArrayGetAfterExternalSideEffect"));
+        2,
+        mainClassSubject.uniqueMethodWithOriginalName("testNecessaryArrayGetAfterAliasedArrayPut"));
+    assertArrayGetCountEquals(
+        2,
+        mainClassSubject.uniqueMethodWithOriginalName(
+            "testNecessaryArrayGetAfterExternalSideEffect"));
   }
 
   static void assertArrayGetCountEquals(int expected, MethodSubject methodSubject) {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/redundantfieldloadelimination/RedundantFinalInstanceFieldLoadAfterStoreTest.java b/src/test/java/com/android/tools/r8/ir/optimize/redundantfieldloadelimination/RedundantFinalInstanceFieldLoadAfterStoreTest.java
index af7854c..6ea3dcf 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/redundantfieldloadelimination/RedundantFinalInstanceFieldLoadAfterStoreTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/redundantfieldloadelimination/RedundantFinalInstanceFieldLoadAfterStoreTest.java
@@ -59,7 +59,7 @@
     ClassSubject aClassSubject = inspector.clazz(A.class);
     assertThat(aClassSubject, isPresent());
 
-    FieldSubject fFieldSubject = aClassSubject.uniqueFieldWithName("f");
+    FieldSubject fFieldSubject = aClassSubject.uniqueFieldWithOriginalName("f");
     assertThat(fFieldSubject, isPresent());
 
     MethodSubject initMethodSubject = aClassSubject.init();
@@ -69,7 +69,7 @@
         countInstanceGetInstructions(
             initMethodSubject.asFoundMethodSubject(), fFieldSubject.asFoundFieldSubject()));
 
-    MethodSubject mMethodSubject = aClassSubject.uniqueMethodWithName("m");
+    MethodSubject mMethodSubject = aClassSubject.uniqueMethodWithOriginalName("m");
     assertThat(mMethodSubject, isPresent());
     assertEquals(
         2,
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/redundantfieldloadelimination/RedundantFinalStaticFieldLoadAfterStoreTest.java b/src/test/java/com/android/tools/r8/ir/optimize/redundantfieldloadelimination/RedundantFinalStaticFieldLoadAfterStoreTest.java
index 701c43f..1bbe682 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/redundantfieldloadelimination/RedundantFinalStaticFieldLoadAfterStoreTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/redundantfieldloadelimination/RedundantFinalStaticFieldLoadAfterStoreTest.java
@@ -53,7 +53,7 @@
     ClassSubject aClassSubject = inspector.clazz(A.class);
     assertThat(aClassSubject, isPresent());
 
-    FieldSubject fFieldSubject = aClassSubject.uniqueFieldWithName("f");
+    FieldSubject fFieldSubject = aClassSubject.uniqueFieldWithOriginalName("f");
     assertThat(fFieldSubject, isPresent());
 
     MethodSubject initMethodSubject = aClassSubject.clinit();
@@ -63,7 +63,7 @@
         countStaticGetInstructions(
             initMethodSubject.asFoundMethodSubject(), fFieldSubject.asFoundFieldSubject()));
 
-    MethodSubject mMethodSubject = aClassSubject.uniqueMethodWithName("m");
+    MethodSubject mMethodSubject = aClassSubject.uniqueMethodWithOriginalName("m");
     assertThat(mMethodSubject, isPresent());
     assertEquals(
         1,
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/redundantfieldloadelimination/RedundantInitClassBeforeInvokeStaticTest.java b/src/test/java/com/android/tools/r8/ir/optimize/redundantfieldloadelimination/RedundantInitClassBeforeInvokeStaticTest.java
index d7e4296..99a6045 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/redundantfieldloadelimination/RedundantInitClassBeforeInvokeStaticTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/redundantfieldloadelimination/RedundantInitClassBeforeInvokeStaticTest.java
@@ -43,8 +43,8 @@
             inspector -> {
               ClassSubject greeterClassSubject = inspector.clazz(Greeter.class);
               assertThat(greeterClassSubject, isPresent());
-              assertThat(greeterClassSubject.uniqueMethodWithName("hello"), isAbsent());
-              assertThat(greeterClassSubject.uniqueMethodWithName("world"), isPresent());
+              assertThat(greeterClassSubject.uniqueMethodWithOriginalName("hello"), isAbsent());
+              assertThat(greeterClassSubject.uniqueMethodWithOriginalName("world"), isPresent());
               assertEquals(0, greeterClassSubject.allFields().size());
             })
         .run(parameters.getRuntime(), Main.class)
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/redundantfieldloadelimination/RedundantInstanceFieldLoadAfterStoreTest.java b/src/test/java/com/android/tools/r8/ir/optimize/redundantfieldloadelimination/RedundantInstanceFieldLoadAfterStoreTest.java
index 73e21ba..25987d2 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/redundantfieldloadelimination/RedundantInstanceFieldLoadAfterStoreTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/redundantfieldloadelimination/RedundantInstanceFieldLoadAfterStoreTest.java
@@ -45,7 +45,7 @@
               ClassSubject classSubject = inspector.clazz(TestClass.class);
               assertThat(classSubject, isPresent());
 
-              FieldSubject fieldSubject = classSubject.uniqueFieldWithName("greeting");
+              FieldSubject fieldSubject = classSubject.uniqueFieldWithOriginalName("greeting");
               assertThat(fieldSubject, isAbsent());
             })
         .run(parameters.getRuntime(), TestClass.class)
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/redundantfieldloadelimination/RedundantStaticFieldLoadAfterStoreTest.java b/src/test/java/com/android/tools/r8/ir/optimize/redundantfieldloadelimination/RedundantStaticFieldLoadAfterStoreTest.java
index 936b777..0ea210f 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/redundantfieldloadelimination/RedundantStaticFieldLoadAfterStoreTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/redundantfieldloadelimination/RedundantStaticFieldLoadAfterStoreTest.java
@@ -46,7 +46,7 @@
               ClassSubject classSubject = inspector.clazz(TestClass.class);
               assertThat(classSubject, isPresent());
 
-              FieldSubject fieldSubject = classSubject.uniqueFieldWithName("greeting");
+              FieldSubject fieldSubject = classSubject.uniqueFieldWithOriginalName("greeting");
               assertThat(fieldSubject, isAbsent());
 
               MethodSubject methodSubject = classSubject.mainMethod();
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/reflection/GetClassTest.java b/src/test/java/com/android/tools/r8/ir/optimize/reflection/GetClassTest.java
index 908ce00..a50261b 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/reflection/GetClassTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/reflection/GetClassTest.java
@@ -170,10 +170,11 @@
     ClassSubject reflectionClass = codeInspector.clazz(Reflection.class);
     assertThat(reflectionClass, isPresent());
     assertThat(
-        reflectionClass.uniqueMethodWithName("call"), onlyIf(expectCallPresent, isPresent()));
+        reflectionClass.uniqueMethodWithOriginalName("call"),
+        onlyIf(expectCallPresent, isPresent()));
 
     ClassSubject getterClass = codeInspector.clazz(GetClassTestMain.class);
-    MethodSubject getMainClass = getterClass.uniqueMethodWithName("getMainClass");
+    MethodSubject getMainClass = getterClass.uniqueMethodWithOriginalName("getMainClass");
     assertThat(getMainClass, isPresent());
     // Because of nullable argument, getClass() should remain.
     assertEquals(1, countGetClass(getMainClass));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/reflection/GetSimpleNameTest.java b/src/test/java/com/android/tools/r8/ir/optimize/reflection/GetSimpleNameTest.java
index a6d3931..581caa9 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/reflection/GetSimpleNameTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/reflection/GetSimpleNameTest.java
@@ -169,7 +169,7 @@
     if (isOptimizing) {
       ClassSubject testHelperClassSubject = codeInspector.clazz(TestHelper.class);
       assertThat(testHelperClassSubject, isPresent());
-      assertThat(testHelperClassSubject.uniqueMethodWithName("getClassName"), isAbsent());
+      assertThat(testHelperClassSubject.uniqueMethodWithOriginalName("getClassName"), isAbsent());
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/reflection/TestClassForNameWhenSplit.java b/src/test/java/com/android/tools/r8/ir/optimize/reflection/TestClassForNameWhenSplit.java
index 66ae08d..813fdfc 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/reflection/TestClassForNameWhenSplit.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/reflection/TestClassForNameWhenSplit.java
@@ -51,19 +51,19 @@
         .setMinApi(parameters.getApiLevel())
         .addFeatureSplit(
             builder ->
-                SplitterTestBase.simpleSplitProvider(
-                    builder, featurePath, temp, Foobar.class))
+                SplitterTestBase.simpleSplitProvider(builder, featurePath, temp, Foobar.class))
         .addKeepMainRule(Main.class)
         .addKeepClassRules(Foobar.class)
         .enableInliningAnnotations()
         .compile()
-        .inspect(codeInspector -> {
-          ClassSubject mainClass = codeInspector.clazz(Main.class);
-          MethodSubject foo = mainClass.uniqueMethodWithName("foo");
-          assertThat(foo, isPresent());
-          // Make sure Class#forName is indeed kept.
-          assertEquals(1, countForName(foo));
-        })
+        .inspect(
+            codeInspector -> {
+              ClassSubject mainClass = codeInspector.clazz(Main.class);
+              MethodSubject foo = mainClass.uniqueMethodWithOriginalName("foo");
+              assertThat(foo, isPresent());
+              // Make sure Class#forName is indeed kept.
+              assertEquals(1, countForName(foo));
+            })
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines(EXPECTED);
   }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java
index 4032c83..9cf458d 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/ClassStaticizerTest.java
@@ -422,13 +422,13 @@
     ClassSubject clazz = inspector.clazz(main);
 
     // Check that "calledTwice" is removed (inlined into main).
-    assertThat(clazz.uniqueMethodWithName("calledTwice"), not(isPresent()));
+    assertThat(clazz.uniqueMethodWithOriginalName("calledTwice"), not(isPresent()));
 
     // Check that the two inlines of "calledTwice" is correctly rewritten.
     ClassSubject candidateClassSubject = inspector.clazz(Candidate.class);
     assertThat(candidateClassSubject, isPresent());
-    assertThat(candidateClassSubject.uniqueMethodWithName("foo"), isPresent());
-    assertThat(candidateClassSubject.uniqueMethodWithName("bar"), isPresent());
+    assertThat(candidateClassSubject.uniqueMethodWithOriginalName("foo"), isPresent());
+    assertThat(candidateClassSubject.uniqueMethodWithOriginalName("bar"), isPresent());
     assertEquals(
         Lists.newArrayList(
             "STATIC: String dualcallinline.Candidate.foo()",
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/CompanionAsArgumentTest.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/CompanionAsArgumentTest.java
index be47557..bb1849e 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/CompanionAsArgumentTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/CompanionAsArgumentTest.java
@@ -53,7 +53,7 @@
     // Check if the candidate is not staticized.
     ClassSubject companion = inspector.clazz(Host.Companion.class);
     assertThat(companion, isPresent());
-    MethodSubject foo = companion.uniqueMethodWithName("foo");
+    MethodSubject foo = companion.uniqueMethodWithOriginalName("foo");
     assertThat(foo, isPresent());
     assertTrue(
         foo.streamInstructions().anyMatch(
@@ -63,7 +63,7 @@
     // Nothing migrated from Companion to Host.
     ClassSubject host = inspector.clazz(Host.class);
     assertThat(host, isPresent());
-    MethodSubject migrated_foo = host.uniqueMethodWithName("foo");
+    MethodSubject migrated_foo = host.uniqueMethodWithOriginalName("foo");
     assertThat(migrated_foo, not(isPresent()));
   }
 
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/CompanionClassWithNewInstanceUserTest.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/CompanionClassWithNewInstanceUserTest.java
index 76bee19..1e89087 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/CompanionClassWithNewInstanceUserTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/CompanionClassWithNewInstanceUserTest.java
@@ -51,7 +51,8 @@
     ClassSubject companionClassSubject = inspector.clazz(Companion.class);
     assertThat(companionClassSubject, isPresent());
 
-    MethodSubject companionMethodSubject = companionClassSubject.uniqueMethodWithName("method");
+    MethodSubject companionMethodSubject =
+        companionClassSubject.uniqueMethodWithOriginalName("method");
     assertThat(companionMethodSubject, isPresent());
     assertThat(companionMethodSubject, isStatic());
   }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/InstanceInsideCompanionTest.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/InstanceInsideCompanionTest.java
index 5dabfaf..1c1c5b5 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/InstanceInsideCompanionTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/InstanceInsideCompanionTest.java
@@ -55,14 +55,14 @@
     // Check if the instance is gone.
     ClassSubject host = inspector.clazz(Candidate.Host.class);
     assertThat(host, isPresent());
-    FieldSubject instance = host.uniqueFieldWithName("INSTANCE");
+    FieldSubject instance = host.uniqueFieldWithOriginalName("INSTANCE");
     assertThat(instance, not(isPresent()));
 
     ClassSubject candidate = inspector.clazz(Candidate.class);
     assertThat(candidate, not(isPresent()));
 
     // Check if the candidate method is staticized and migrated.
-    MethodSubject foo = host.uniqueMethodWithName("foo");
+    MethodSubject foo = host.uniqueMethodWithOriginalName("foo");
     assertThat(foo, isPresent());
     assertTrue(foo.isStatic());
     assertTrue(
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/InvokeStaticWithNullOutvalueTest.java b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/InvokeStaticWithNullOutvalueTest.java
index 9dfcb42..06397fc 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/staticizer/InvokeStaticWithNullOutvalueTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/staticizer/InvokeStaticWithNullOutvalueTest.java
@@ -61,7 +61,7 @@
     // Check if the instance is gone.
     ClassSubject host = inspector.clazz(Host.class);
     assertThat(host, isPresent());
-    FieldSubject instance = host.uniqueFieldWithName("companion");
+    FieldSubject instance = host.uniqueFieldWithOriginalName("companion");
     assertThat(instance, not(isPresent()));
 
     ClassSubject companion = inspector.clazz(Host.Companion.class);
@@ -71,7 +71,7 @@
     // Check if the candidate methods are staticized (if necessary) and migrated.
     for (String name : ImmutableList.of("boo", "foo")) {
       // TODO(b/158018192): This should be host and not companion.
-      MethodSubject oo = companion.uniqueMethodWithName(name);
+      MethodSubject oo = companion.uniqueMethodWithOriginalName(name);
       assertThat(oo, isPresent());
       assertTrue(oo.isStatic());
       assertTrue(
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/string/NameThenLengthTest.java b/src/test/java/com/android/tools/r8/ir/optimize/string/NameThenLengthTest.java
index f49ca5e..b58fdd7 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/string/NameThenLengthTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/string/NameThenLengthTest.java
@@ -125,7 +125,7 @@
       assertEquals(expectedConstNumberCountInClinit, countNonZeroConstNumber(clinit));
     }
 
-    MethodSubject m = mainClass.uniqueMethodWithName("instanceMethod");
+    MethodSubject m = mainClass.uniqueMethodWithOriginalName("instanceMethod");
     assertThat(m, isPresent());
     assertEquals(expectedStringLengthCountInInstanceMethod, countStringLength(m));
     assertEquals(expectedConstNumberCountInInstanceMethod, countNonZeroConstNumber(m));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/string/StringConcatenationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/string/StringConcatenationTest.java
index 277e1e3..c015182 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/string/StringConcatenationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/string/StringConcatenationTest.java
@@ -102,7 +102,7 @@
     CodeInspector codeInspector = result.inspector();
     ClassSubject mainClass = codeInspector.clazz(MAIN);
 
-    MethodSubject method = mainClass.uniqueMethodWithName("unusedBuilder");
+    MethodSubject method = mainClass.uniqueMethodWithOriginalName("unusedBuilder");
     if (isR8) {
       assertThat(method, not(isPresent()));
     } else {
@@ -110,80 +110,80 @@
       assertEquals(0, countConstString(method));
     }
 
-    method = mainClass.uniqueMethodWithName("trivialSequence");
+    method = mainClass.uniqueMethodWithOriginalName("trivialSequence");
     assertThat(method, isPresent());
     expectedCount = isReleaseMode ? 1 : 3;
     assertEquals(expectedCount, countConstString(method));
 
-    method = mainClass.uniqueMethodWithName("builderWithInitialValue");
+    method = mainClass.uniqueMethodWithOriginalName("builderWithInitialValue");
     assertThat(method, isPresent());
     expectedCount = isReleaseMode ? 1 : 3;
     assertEquals(expectedCount, countConstString(method));
 
-    method = mainClass.uniqueMethodWithName("builderWithCapacity");
+    method = mainClass.uniqueMethodWithOriginalName("builderWithCapacity");
     assertThat(method, isPresent());
     expectedCount = isReleaseMode ? 1 : 0;
     assertEquals(expectedCount, countConstString(method));
 
-    method = mainClass.uniqueMethodWithName("nonStringArgs");
+    method = mainClass.uniqueMethodWithOriginalName("nonStringArgs");
     assertThat(method, isPresent());
     expectedCount = isReleaseMode ? 1 : 0;
     assertEquals(expectedCount, countConstString(method));
 
-    method = mainClass.uniqueMethodWithName("typeConversion");
+    method = mainClass.uniqueMethodWithOriginalName("typeConversion");
     assertThat(method, isPresent());
     expectedCount = isReleaseMode ? 1 : 0;
     assertEquals(expectedCount, countConstString(method));
 
-    method = mainClass.uniqueMethodWithName("typeConversion_withPhis");
+    method = mainClass.uniqueMethodWithOriginalName("typeConversion_withPhis");
     assertThat(method, isPresent());
     assertEquals(0, countConstString(method));
 
-    method = mainClass.uniqueMethodWithName("nestedBuilders_appendBuilderItself");
+    method = mainClass.uniqueMethodWithOriginalName("nestedBuilders_appendBuilderItself");
     assertThat(method, isPresent());
     assertEquals(isReleaseMode ? 1 : 3, countConstString(method));
 
-    method = mainClass.uniqueMethodWithName("nestedBuilders_appendBuilderResult");
+    method = mainClass.uniqueMethodWithOriginalName("nestedBuilders_appendBuilderResult");
     assertThat(method, isPresent());
     assertEquals(isReleaseMode ? 1 : 3, countConstString(method));
 
-    method = mainClass.uniqueMethodWithName("nestedBuilders_conditional");
+    method = mainClass.uniqueMethodWithOriginalName("nestedBuilders_conditional");
     assertThat(method, isPresent());
     assertEquals(isReleaseMode ? 3 : 4, countConstString(method));
 
-    method = mainClass.uniqueMethodWithName("concatenatedBuilders_init");
+    method = mainClass.uniqueMethodWithOriginalName("concatenatedBuilders_init");
     assertThat(method, isPresent());
     assertEquals(isReleaseMode ? 1 : 2, countConstString(method));
 
-    method = mainClass.uniqueMethodWithName("concatenatedBuilders_append");
+    method = mainClass.uniqueMethodWithOriginalName("concatenatedBuilders_append");
     assertThat(method, isPresent());
     assertEquals(isReleaseMode ? 1 : 2, countConstString(method));
 
-    method = mainClass.uniqueMethodWithName("concatenatedBuilders_conditional");
+    method = mainClass.uniqueMethodWithOriginalName("concatenatedBuilders_conditional");
     assertThat(method, isPresent());
     assertEquals(isReleaseMode ? 2 : 4, countConstString(method));
 
-    method = mainClass.uniqueMethodWithName("simplePhi");
+    method = mainClass.uniqueMethodWithOriginalName("simplePhi");
     assertThat(method, isPresent());
     assertEquals(isReleaseMode ? 3 : 4, countConstString(method));
 
-    method = mainClass.uniqueMethodWithName("phiAtInit");
+    method = mainClass.uniqueMethodWithOriginalName("phiAtInit");
     assertThat(method, isPresent());
     assertEquals(3, countConstString(method));
 
-    method = mainClass.uniqueMethodWithName("phiWithDifferentInits");
+    method = mainClass.uniqueMethodWithOriginalName("phiWithDifferentInits");
     assertThat(method, isPresent());
     assertEquals(3, countConstString(method));
 
-    method = mainClass.uniqueMethodWithName("conditionalPhiWithoutAppend");
+    method = mainClass.uniqueMethodWithOriginalName("conditionalPhiWithoutAppend");
     assertThat(method, isPresent());
     assertEquals(isReleaseMode ? 2 : 3, countConstString(method));
 
-    method = mainClass.uniqueMethodWithName("loop");
+    method = mainClass.uniqueMethodWithOriginalName("loop");
     assertThat(method, isPresent());
     assertEquals(3, countConstString(method));
 
-    method = mainClass.uniqueMethodWithName("loopWithBuilder");
+    method = mainClass.uniqueMethodWithOriginalName("loopWithBuilder");
     assertThat(method, isPresent());
     assertEquals(2, countConstString(method));
   }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/string/StringContentCheckTest.java b/src/test/java/com/android/tools/r8/ir/optimize/string/StringContentCheckTest.java
index 1f7b97d..04b57b2 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/string/StringContentCheckTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/string/StringContentCheckTest.java
@@ -147,7 +147,7 @@
     long count = countStringContentChecker(mainMethod);
     assertEquals(expectedStringContentCheckerCount, count);
 
-    MethodSubject argCouldBeNull = mainClass.uniqueMethodWithName("argCouldBeNull");
+    MethodSubject argCouldBeNull = mainClass.uniqueMethodWithOriginalName("argCouldBeNull");
     assertThat(argCouldBeNull, isPresent());
     // Because of nullable argument, all checkers should remain.
     assertEquals(10, countStringContentChecker(argCouldBeNull));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/string/StringIsEmptyTest.java b/src/test/java/com/android/tools/r8/ir/optimize/string/StringIsEmptyTest.java
index 6c47b03..381797b 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/string/StringIsEmptyTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/string/StringIsEmptyTest.java
@@ -67,7 +67,7 @@
     assertThat(mainMethod, isPresent());
     assertEquals(expectedStringIsEmptyCount, countCall(mainMethod, "String", "isEmpty"));
 
-    MethodSubject wrapper = mainClass.uniqueMethodWithName("wrapper");
+    MethodSubject wrapper = mainClass.uniqueMethodWithOriginalName("wrapper");
     assertThat(wrapper, isPresent());
     // Due to nullable, non-constant argument (w/o call-site optimization), isEmpty() should remain.
     assertEquals(1, countCall(wrapper, "String", "isEmpty"));
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/string/StringValueOfTest.java b/src/test/java/com/android/tools/r8/ir/optimize/string/StringValueOfTest.java
index dba68cd..a302652 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/string/StringValueOfTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/string/StringValueOfTest.java
@@ -91,11 +91,11 @@
     expectedCount = isR8 ? (parameters.isCfRuntime() ? 2 : 1) : (isRelease ? 1 : 0);
     assertEquals(expectedCount, countNullStringNumber(mainMethod));
 
-    MethodSubject hideNPE = mainClass.uniqueMethodWithName("hideNPE");
+    MethodSubject hideNPE = mainClass.uniqueMethodWithOriginalName("hideNPE");
     // Due to the nullable argument, valueOf should remain.
     assertEquals(1, countCall(hideNPE, "String", "valueOf"));
 
-    MethodSubject uninit = mainClass.uniqueMethodWithName("consumeUninitialized");
+    MethodSubject uninit = mainClass.uniqueMethodWithOriginalName("consumeUninitialized");
     assertThat(uninit, isPresent());
     expectedCount = isR8 ? 0 : 1;
     assertEquals(expectedCount, countCall(uninit, "String", "valueOf"));
@@ -120,7 +120,7 @@
                 inspector -> {
                   ClassSubject fooClassSubject = inspector.clazz(Foo.class);
                   assertThat(fooClassSubject, isPresent());
-                  assertThat(fooClassSubject.uniqueMethodWithName("getter"), isAbsent());
+                  assertThat(fooClassSubject.uniqueMethodWithOriginalName("getter"), isAbsent());
                 })
             .run(parameters.getRuntime(), MAIN)
             .assertSuccessWithOutput(JAVA_OUTPUT);
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/switches/StringSwitchWitNonIntermediateIdValueTest.java b/src/test/java/com/android/tools/r8/ir/optimize/switches/StringSwitchWitNonIntermediateIdValueTest.java
index 213f02b..11a1e35 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/switches/StringSwitchWitNonIntermediateIdValueTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/switches/StringSwitchWitNonIntermediateIdValueTest.java
@@ -64,7 +64,8 @@
   }
 
   private void verifyRewrittenToIfs(CodeInspector inspector) {
-    MethodSubject testMethodSubject = inspector.clazz(Main.class).uniqueMethodWithName("test");
+    MethodSubject testMethodSubject =
+        inspector.clazz(Main.class).uniqueMethodWithOriginalName("test");
     assertThat(testMethodSubject, isPresent());
     assertTrue(testMethodSubject.streamInstructions().noneMatch(InstructionSubject::isSwitch));
     assertEquals(
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/switches/SwitchCaseRemovalTest.java b/src/test/java/com/android/tools/r8/ir/optimize/switches/SwitchCaseRemovalTest.java
index 86e30dc..a5eddd4 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/switches/SwitchCaseRemovalTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/switches/SwitchCaseRemovalTest.java
@@ -69,10 +69,11 @@
   private void verifyOutput(CodeInspector inspector) {
     ClassSubject classSubject = inspector.clazz(TestClass.class);
     assertThat(classSubject, isPresent());
-    assertThat(classSubject.uniqueMethodWithName("dead"), not(isPresent()));
+    assertThat(classSubject.uniqueMethodWithOriginalName("dead"), not(isPresent()));
 
     {
-      MethodSubject methodSubject = classSubject.uniqueMethodWithName("testSwitchCaseRemoval");
+      MethodSubject methodSubject =
+          classSubject.uniqueMethodWithOriginalName("testSwitchCaseRemoval");
       assertThat(methodSubject, isPresent());
       assertEquals(
           1, methodSubject.streamInstructions().filter(InstructionSubject::isConstNull).count());
@@ -83,14 +84,15 @@
 
     {
       MethodSubject methodSubject =
-          classSubject.uniqueMethodWithName("testSwitchReplacementWithExplicitDefaultCase");
+          classSubject.uniqueMethodWithOriginalName("testSwitchReplacementWithExplicitDefaultCase");
       assertThat(methodSubject, isPresent());
       assertTrue(methodSubject.streamInstructions().noneMatch(InstructionSubject::isSwitch));
     }
 
     {
       MethodSubject methodSubject =
-          classSubject.uniqueMethodWithName("testSwitchReplacementWithoutExplicitDefaultCase");
+          classSubject.uniqueMethodWithOriginalName(
+              "testSwitchReplacementWithoutExplicitDefaultCase");
       assertThat(methodSubject, isPresent());
       assertTrue(methodSubject.streamInstructions().noneMatch(InstructionSubject::isSwitch));
     }
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/typechecks/InstanceOfMethodSpecializationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/typechecks/InstanceOfMethodSpecializationTest.java
index ed970af..f258093 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/typechecks/InstanceOfMethodSpecializationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/typechecks/InstanceOfMethodSpecializationTest.java
@@ -65,27 +65,27 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject aClassSubject = inspector.clazz(A.class);
     assertThat(aClassSubject, isPresent());
-    assertThat(aClassSubject.uniqueMethodWithName("isA"), not(isPresent()));
-    assertThat(aClassSubject.uniqueMethodWithName("isB"), not(isPresent()));
-    assertThat(aClassSubject.uniqueMethodWithName("isC"), not(isPresent()));
-    assertThat(aClassSubject.uniqueMethodWithName("isSuper"), isPresent());
-    assertThat(aClassSubject.uniqueMethodWithName("isSub"), isPresent());
+    assertThat(aClassSubject.uniqueMethodWithOriginalName("isA"), not(isPresent()));
+    assertThat(aClassSubject.uniqueMethodWithOriginalName("isB"), not(isPresent()));
+    assertThat(aClassSubject.uniqueMethodWithOriginalName("isC"), not(isPresent()));
+    assertThat(aClassSubject.uniqueMethodWithOriginalName("isSuper"), isPresent());
+    assertThat(aClassSubject.uniqueMethodWithOriginalName("isSub"), isPresent());
 
     ClassSubject bClassSubject = inspector.clazz(B.class);
     assertThat(bClassSubject, isPresent());
-    assertThat(bClassSubject.uniqueMethodWithName("isA"), not(isPresent()));
-    assertThat(bClassSubject.uniqueMethodWithName("isB"), not(isPresent()));
-    assertThat(bClassSubject.uniqueMethodWithName("isC"), not(isPresent()));
-    assertThat(bClassSubject.uniqueMethodWithName("isSuper"), not(isPresent()));
-    assertThat(bClassSubject.uniqueMethodWithName("isSub"), not(isPresent()));
+    assertThat(bClassSubject.uniqueMethodWithOriginalName("isA"), not(isPresent()));
+    assertThat(bClassSubject.uniqueMethodWithOriginalName("isB"), not(isPresent()));
+    assertThat(bClassSubject.uniqueMethodWithOriginalName("isC"), not(isPresent()));
+    assertThat(bClassSubject.uniqueMethodWithOriginalName("isSuper"), not(isPresent()));
+    assertThat(bClassSubject.uniqueMethodWithOriginalName("isSub"), not(isPresent()));
 
     ClassSubject cClassSubject = inspector.clazz(C.class);
     assertThat(cClassSubject, isPresent());
-    assertThat(cClassSubject.uniqueMethodWithName("isA"), not(isPresent()));
-    assertThat(cClassSubject.uniqueMethodWithName("isB"), not(isPresent()));
-    assertThat(cClassSubject.uniqueMethodWithName("isC"), not(isPresent()));
-    assertThat(cClassSubject.uniqueMethodWithName("isSuper"), isPresent());
-    assertThat(cClassSubject.uniqueMethodWithName("isSub"), isPresent());
+    assertThat(cClassSubject.uniqueMethodWithOriginalName("isA"), not(isPresent()));
+    assertThat(cClassSubject.uniqueMethodWithOriginalName("isB"), not(isPresent()));
+    assertThat(cClassSubject.uniqueMethodWithOriginalName("isC"), not(isPresent()));
+    assertThat(cClassSubject.uniqueMethodWithOriginalName("isSuper"), isPresent());
+    assertThat(cClassSubject.uniqueMethodWithOriginalName("isSub"), isPresent());
   }
 
   public static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/InvokeMethodWithNonNullParamCheckTest.java b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/InvokeMethodWithNonNullParamCheckTest.java
index c12a128..80d38dc 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/InvokeMethodWithNonNullParamCheckTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/InvokeMethodWithNonNullParamCheckTest.java
@@ -132,8 +132,8 @@
     assertEquals(12, found);
 
     // Check that the method live() has been kept and that dead() has been removed.
-    assertThat(testClassSubject.uniqueMethodWithName("live"), isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("dead"), not(isPresent()));
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("live"), isPresent());
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("dead"), not(isPresent()));
 
     // Check that the catch handlers for NullPointerException and RuntimeException have not been
     // removed.
@@ -144,7 +144,7 @@
             "handleRuntimeExceptionForInvokeStatic",
             "handleRuntimeExceptionForInvokeVirtual");
     for (String methodName : methodNames) {
-      assertThat(testClassSubject.uniqueMethodWithName(methodName), isPresent());
+      assertThat(testClassSubject.uniqueMethodWithOriginalName(methodName), isPresent());
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/InvokeMethodWithReceiverOptimizationTest.java b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/InvokeMethodWithReceiverOptimizationTest.java
index 55889a3..6457961 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/InvokeMethodWithReceiverOptimizationTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/InvokeMethodWithReceiverOptimizationTest.java
@@ -81,7 +81,7 @@
     assertNotEquals(enableArgumentPropagation, otherClassSubject.isPresent());
 
     // Check that A.method() has been removed.
-    assertThat(otherClassSubject.uniqueMethodWithName("method"), not(isPresent()));
+    assertThat(otherClassSubject.uniqueMethodWithOriginalName("method"), not(isPresent()));
 
     // Check that a throw instruction has been inserted into each of the testRewriteToThrowNull*
     // methods.
@@ -97,12 +97,14 @@
     assertEquals(3, found);
 
     // Check that the method dead() has been removed.
-    assertThat(testClassSubject.uniqueMethodWithName("dead"), not(isPresent()));
+    assertThat(testClassSubject.uniqueMethodWithOriginalName("dead"), not(isPresent()));
 
     // Check that the catch handlers for NullPointerException and RuntimeException have not been
     // removed.
-    assertThat(testClassSubject.uniqueMethodWithName("handleNullPointerException"), isPresent());
-    assertThat(testClassSubject.uniqueMethodWithName("handleRuntimeException"), isPresent());
+    assertThat(
+        testClassSubject.uniqueMethodWithOriginalName("handleNullPointerException"), isPresent());
+    assertThat(
+        testClassSubject.uniqueMethodWithOriginalName("handleRuntimeException"), isPresent());
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/LambdaInstantiatedTypeTest.java b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/LambdaInstantiatedTypeTest.java
index 4d032c7..4119731 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/LambdaInstantiatedTypeTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/LambdaInstantiatedTypeTest.java
@@ -62,7 +62,7 @@
     assertThat(classSubject, isPresent());
 
     // Check that the method live() has not been removed.
-    assertThat(classSubject.uniqueMethodWithName("live"), isPresent());
+    assertThat(classSubject.uniqueMethodWithOriginalName("live"), isPresent());
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/ParameterRewritingTest.java b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/ParameterRewritingTest.java
index 17d3ccc..032b058 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/ParameterRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/ParameterRewritingTest.java
@@ -64,14 +64,14 @@
 
     ClassSubject factoryClassSubject = inspector.clazz(Factory.class);
     MethodSubject createStaticMethodSubject =
-        factoryClassSubject.uniqueMethodWithName("createStatic");
+        factoryClassSubject.uniqueMethodWithOriginalName("createStatic");
     assertThat(createStaticMethodSubject, isPresent());
     assertEquals(1, createStaticMethodSubject.getMethod().getParameters().size());
 
     for (int i = 1; i <= 3; ++i) {
       String createStaticWithUnusedMethodName = "createStaticWithUnused" + i;
       MethodSubject createStaticWithUnusedMethodSubject =
-          factoryClassSubject.uniqueMethodWithName(createStaticWithUnusedMethodName);
+          factoryClassSubject.uniqueMethodWithOriginalName(createStaticWithUnusedMethodName);
       assertThat(createStaticWithUnusedMethodSubject, isPresent());
 
       DexMethod method = createStaticWithUnusedMethodSubject.getMethod().getReference();
@@ -80,7 +80,7 @@
     }
 
     MethodSubject createStaticWithUnusedMethodSubject =
-        factoryClassSubject.uniqueMethodWithName("createStaticWithUnused4");
+        factoryClassSubject.uniqueMethodWithOriginalName("createStaticWithUnused4");
     assertThat(createStaticWithUnusedMethodSubject, isPresent());
 
     DexMethod method = createStaticWithUnusedMethodSubject.getMethod().getReference();
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/SynchronizedMethodTest.java b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/SynchronizedMethodTest.java
index a04df37..99d3ae2 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/SynchronizedMethodTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/SynchronizedMethodTest.java
@@ -57,7 +57,7 @@
             .inspector();
 
     ClassSubject clazz = inspector.clazz(A.class);
-    MethodSubject method = clazz.uniqueMethodWithName("m");
+    MethodSubject method = clazz.uniqueMethodWithOriginalName("m");
     assertThat(method, isPresent());
 
     // The invoke on the uninstantiated turns into a "throw null", and the synchronized method
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/UninstantiatedAnnotatedArgumentsTest.java b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/UninstantiatedAnnotatedArgumentsTest.java
index 65132d2..e46ce92 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/UninstantiatedAnnotatedArgumentsTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/UninstantiatedAnnotatedArgumentsTest.java
@@ -92,12 +92,12 @@
 
     List<MethodSubject> methodSubjects =
         ImmutableList.of(
-            testClassSubject.uniqueMethodWithName("testRemoveStaticFromStart"),
-            testClassSubject.uniqueMethodWithName("testRemoveStaticFromMiddle"),
-            testClassSubject.uniqueMethodWithName("testRemoveStaticFromEnd"),
-            testClassSubject.uniqueMethodWithName("testRemoveVirtualFromStart"),
-            testClassSubject.uniqueMethodWithName("testRemoveVirtualFromMiddle"),
-            testClassSubject.uniqueMethodWithName("testRemoveVirtualFromEnd"));
+            testClassSubject.uniqueMethodWithOriginalName("testRemoveStaticFromStart"),
+            testClassSubject.uniqueMethodWithOriginalName("testRemoveStaticFromMiddle"),
+            testClassSubject.uniqueMethodWithOriginalName("testRemoveStaticFromEnd"),
+            testClassSubject.uniqueMethodWithOriginalName("testRemoveVirtualFromStart"),
+            testClassSubject.uniqueMethodWithOriginalName("testRemoveVirtualFromMiddle"),
+            testClassSubject.uniqueMethodWithOriginalName("testRemoveVirtualFromEnd"));
 
     for (MethodSubject methodSubject : methodSubjects) {
       assertThat(methodSubject, isPresent());
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/VoidReturnTypeRewritingTest.java b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/VoidReturnTypeRewritingTest.java
index 831330d..0665133 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/VoidReturnTypeRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/uninstantiatedtypes/VoidReturnTypeRewritingTest.java
@@ -69,16 +69,16 @@
 
     ClassSubject factoryClassSubject = inspector.clazz(Factory.class);
     MethodSubject createStaticMethodSubject =
-        factoryClassSubject.uniqueMethodWithName("createStatic");
+        factoryClassSubject.uniqueMethodWithOriginalName("createStatic");
     assertThat(createStaticMethodSubject, isPresent());
     assertTrue(createStaticMethodSubject.getMethod().getReturnType().isVoidType());
     MethodSubject createVirtualMethodSubject =
-        factoryClassSubject.uniqueMethodWithName("createVirtual");
+        factoryClassSubject.uniqueMethodWithOriginalName("createVirtual");
     assertThat(createVirtualMethodSubject, isPresent());
     assertTrue(createVirtualMethodSubject.getMethod().getReturnType().isVoidType());
 
     createVirtualMethodSubject =
-        inspector.clazz(SubFactory.class).uniqueMethodWithName("createVirtual");
+        inspector.clazz(SubFactory.class).uniqueMethodWithOriginalName("createVirtual");
     assertThat(createVirtualMethodSubject, isPresent());
     assertTrue(createVirtualMethodSubject.getMethod().getReturnType().isVoidType());
 
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 0f5b122..9b355fe 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
@@ -49,7 +49,7 @@
             inspector -> {
               ClassSubject aClassSubject = inspector.clazz(A.class);
 
-              MethodSubject fooMethodSubject = aClassSubject.uniqueMethodWithName("foo");
+              MethodSubject fooMethodSubject = aClassSubject.uniqueMethodWithOriginalName("foo");
               assertThat(fooMethodSubject, isPresent());
               assertEquals(1, fooMethodSubject.getProgramMethod().getParameters().size());
               assertEquals(
@@ -57,7 +57,7 @@
                   fooMethodSubject.getProgramMethod().getParameter(0));
               assertThat(fooMethodSubject, invokesMethodWithName("getClass"));
 
-              MethodSubject barMethodSubject = aClassSubject.uniqueMethodWithName("bar");
+              MethodSubject barMethodSubject = aClassSubject.uniqueMethodWithOriginalName("bar");
               assertThat(barMethodSubject, isStatic());
             })
         .run(parameters.getRuntime(), Main.class)
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedAnnotatedArgumentsTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedAnnotatedArgumentsTest.java
index 2f3e14f..fd8e3ac 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedAnnotatedArgumentsTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedAnnotatedArgumentsTest.java
@@ -90,12 +90,12 @@
 
     List<MethodSubject> methodSubjects =
         ImmutableList.of(
-            testClassSubject.uniqueMethodWithName("testRemoveStaticFromStart"),
-            testClassSubject.uniqueMethodWithName("testRemoveStaticFromMiddle"),
-            testClassSubject.uniqueMethodWithName("testRemoveStaticFromEnd"),
-            testClassSubject.uniqueMethodWithName("testRemoveVirtualFromStart"),
-            testClassSubject.uniqueMethodWithName("testRemoveVirtualFromMiddle"),
-            testClassSubject.uniqueMethodWithName("testRemoveVirtualFromEnd"));
+            testClassSubject.uniqueMethodWithOriginalName("testRemoveStaticFromStart"),
+            testClassSubject.uniqueMethodWithOriginalName("testRemoveStaticFromMiddle"),
+            testClassSubject.uniqueMethodWithOriginalName("testRemoveStaticFromEnd"),
+            testClassSubject.uniqueMethodWithOriginalName("testRemoveVirtualFromStart"),
+            testClassSubject.uniqueMethodWithOriginalName("testRemoveVirtualFromMiddle"),
+            testClassSubject.uniqueMethodWithOriginalName("testRemoveVirtualFromEnd"));
 
     for (MethodSubject methodSubject : methodSubjects) {
       assertThat(methodSubject, isPresent());
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentRemovalWithOverridingTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentRemovalWithOverridingTest.java
index 44c15e6..d595562 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentRemovalWithOverridingTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentRemovalWithOverridingTest.java
@@ -62,7 +62,7 @@
     ClassSubject classSubject = inspector.clazz(B.class);
     assertThat(classSubject, isPresent());
 
-    MethodSubject methodSubject = classSubject.uniqueMethodWithName("greeting");
+    MethodSubject methodSubject = classSubject.uniqueMethodWithOriginalName("greeting");
     assertThat(methodSubject, isPresent());
     assertEquals(
         "java.lang.String", methodSubject.getMethod().getReference().proto.parameters.toString());
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsCollisionTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsCollisionTest.java
index 7527598..1c59e0f 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsCollisionTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsCollisionTest.java
@@ -74,10 +74,10 @@
     ClassSubject aClassSubject = inspector.clazz(A.class);
     assertThat(aClassSubject, isPresent());
 
-    MethodSubject methodA1Subject = aClassSubject.uniqueMethodWithName("method1");
+    MethodSubject methodA1Subject = aClassSubject.uniqueMethodWithOriginalName("method1");
     assertThat(methodA1Subject, isPresent());
 
-    MethodSubject methodA2Subject = aClassSubject.uniqueMethodWithName("method2");
+    MethodSubject methodA2Subject = aClassSubject.uniqueMethodWithOriginalName("method2");
     assertThat(methodA2Subject, isPresent());
 
     ClassSubject bClassSubject = inspector.clazz(B.class);
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsInstanceConstructorTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsInstanceConstructorTest.java
index a4622bc..3f23ccc 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsInstanceConstructorTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedArgumentsInstanceConstructorTest.java
@@ -67,7 +67,7 @@
     ClassSubject classSubject = inspector.clazz(A.class);
     assertThat(classSubject, isPresent());
 
-    MethodSubject methodSubject = classSubject.uniqueMethodWithName("<init>");
+    MethodSubject methodSubject = classSubject.uniqueMethodWithOriginalName("<init>");
     assertThat(methodSubject, isPresent());
     assertTrue(methodSubject.getMethod().getReference().proto.parameters.isEmpty());
 
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedReceiverTest.java b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedReceiverTest.java
index 175b2cb..6b9cb0a 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedReceiverTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/unusedarguments/UnusedReceiverTest.java
@@ -44,7 +44,8 @@
               ClassSubject mainClassSubject = inspector.clazz(Main.class);
               assertThat(mainClassSubject, isPresent());
 
-              MethodSubject testMethodSubject = mainClassSubject.uniqueMethodWithName("test");
+              MethodSubject testMethodSubject =
+                  mainClassSubject.uniqueMethodWithOriginalName("test");
               assertThat(testMethodSubject, isStatic());
             })
         .run(parameters.getRuntime(), Main.class)
diff --git a/src/test/java/com/android/tools/r8/ir/regalloc/B140588497.java b/src/test/java/com/android/tools/r8/ir/regalloc/B140588497.java
index 8add503..3503deb 100644
--- a/src/test/java/com/android/tools/r8/ir/regalloc/B140588497.java
+++ b/src/test/java/com/android/tools/r8/ir/regalloc/B140588497.java
@@ -46,7 +46,7 @@
               ClassSubject c = inspector.clazz(TestClass.class);
               assertThat(c, isPresent());
 
-              MethodSubject m = c.uniqueMethodWithName("invokeRangeTest");
+              MethodSubject m = c.uniqueMethodWithOriginalName("invokeRangeTest");
               assertThat(m, isPresent());
               Iterator<InstructionSubject> it =
                   m.iterateInstructions(InstructionSubject::isConstNumber);
diff --git a/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java b/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
index 5cdae5d..253d335 100644
--- a/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
+++ b/src/test/java/com/android/tools/r8/kotlin/AbstractR8KotlinTestBase.java
@@ -150,7 +150,7 @@
   }
 
   protected FieldSubject checkFieldIsKept(ClassSubject classSubject, String fieldName) {
-    FieldSubject fieldSubject = classSubject.uniqueFieldWithName(fieldName);
+    FieldSubject fieldSubject = classSubject.uniqueFieldWithOriginalName(fieldName);
     assertThat(fieldSubject, isPresent());
     return fieldSubject;
   }
@@ -175,7 +175,7 @@
   }
 
   protected MethodSubject checkMethodIsKept(ClassSubject classSubject, String methodName) {
-    MethodSubject methodSubject = classSubject.uniqueMethodWithName(methodName);
+    MethodSubject methodSubject = classSubject.uniqueMethodWithOriginalName(methodName);
     assertThat(methodSubject, isPresent());
     return methodSubject;
   }
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinIntrinsicsInlineTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinIntrinsicsInlineTest.java
index a664d59..b0f4980 100644
--- a/src/test/java/com/android/tools/r8/kotlin/KotlinIntrinsicsInlineTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinIntrinsicsInlineTest.java
@@ -74,7 +74,7 @@
 
               // Note that isSupported itself has a parameter whose null check would be inlined
               // with -allowaccessmodification.
-              MethodSubject isSupported = main.uniqueMethodWithName("isSupported");
+              MethodSubject isSupported = main.uniqueMethodWithOriginalName("isSupported");
               assertThat(isSupported, isPresent());
               assertEquals(
                   kotlinc.is(KotlinCompilerVersion.KOTLINC_1_3_72) ? 1 : 0,
@@ -82,7 +82,7 @@
 
               // In general cases, null check won't be invoked only once or twice, hence no subtle
               // situation in double inlining.
-              MethodSubject containsArray = main.uniqueMethodWithName("containsArray");
+              MethodSubject containsArray = main.uniqueMethodWithOriginalName("containsArray");
               assertThat(containsArray, isPresent());
               assertEquals(0, countCall(containsArray, "checkParameterIsNotNull"));
             });
@@ -127,7 +127,7 @@
               ClassSubject main = inspector.clazz(MAIN);
               assertThat(main, isPresent());
 
-              MethodSubject method = main.uniqueMethodWithName(methodName);
+              MethodSubject method = main.uniqueMethodWithOriginalName(methodName);
               assertThat(method, isPresent());
               int arity = method.getMethod().getReference().getArity();
               assertEquals(
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinUnusedArgumentsInLambdasTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinUnusedArgumentsInLambdasTest.java
index 19458e2..7733d48 100644
--- a/src/test/java/com/android/tools/r8/kotlin/KotlinUnusedArgumentsInLambdasTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinUnusedArgumentsInLambdasTest.java
@@ -50,7 +50,7 @@
                         // Arity 2 should appear.
                         assertTrue(init.iterateInstructions(i -> i.isConstNumber(2)).hasNext());
 
-                        MethodSubject invoke = classSubject.uniqueMethodWithName("invoke");
+                        MethodSubject invoke = classSubject.uniqueMethodWithOriginalName("invoke");
                         assertThat(invoke, isPresent());
                         assertEquals(2, invoke.getMethod().getReference().proto.parameters.size());
                       }
@@ -66,7 +66,7 @@
                 inspector.forAllClasses(
                     classSubject -> {
                       if (classSubject.getOriginalDescriptor().contains("$js")) {
-                        MethodSubject get = classSubject.uniqueMethodWithName("get");
+                        MethodSubject get = classSubject.uniqueMethodWithOriginalName("get");
                         assertThat(get, isPresent());
                         assertEquals(3, get.getMethod().getReference().proto.parameters.size());
                       }
diff --git a/src/test/java/com/android/tools/r8/kotlin/KotlinUnusedSingletonTest.java b/src/test/java/com/android/tools/r8/kotlin/KotlinUnusedSingletonTest.java
index 692f73b..959042b 100644
--- a/src/test/java/com/android/tools/r8/kotlin/KotlinUnusedSingletonTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/KotlinUnusedSingletonTest.java
@@ -84,7 +84,7 @@
                       .count());
 
               // The field `INSTANCE` has been removed entirely.
-              FieldSubject instance = module.uniqueFieldWithName("INSTANCE");
+              FieldSubject instance = module.uniqueFieldWithOriginalName("INSTANCE");
               assertThat(instance, not(isPresent()));
 
               // The class initializer is no longer there.
diff --git a/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java b/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java
index 488271b..517fb4d 100644
--- a/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/SimplifyIfNotNullKotlinTest.java
@@ -65,7 +65,8 @@
               checkMethodPresenceInInput(clazz.getOriginalName(), testMethodSignature, true);
 
               // Find forMakeAndModel(...) after parameter removal.
-              MethodSubject testMethod = clazz.uniqueMethodWithName(testMethodSignature.name);
+              MethodSubject testMethod =
+                  clazz.uniqueMethodWithOriginalName(testMethodSignature.name);
               long ifzCount =
                   testMethod
                       .streamInstructions()
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataPrunedFieldsTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataPrunedFieldsTest.java
index 2f27ec3..81b06b4 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataPrunedFieldsTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataPrunedFieldsTest.java
@@ -65,10 +65,10 @@
             codeInspector -> {
               final ClassSubject clazz = codeInspector.clazz("kotlin.Metadata");
               assertThat(clazz, isPresent());
-              assertThat(clazz.uniqueMethodWithName("pn"), isPresent());
-              assertThat(clazz.uniqueMethodWithName("d1"), not(isPresent()));
-              assertThat(clazz.uniqueMethodWithName("d2"), not(isPresent()));
-              assertThat(clazz.uniqueMethodWithName("bv"), not(isPresent()));
+              assertThat(clazz.uniqueMethodWithOriginalName("pn"), isPresent());
+              assertThat(clazz.uniqueMethodWithOriginalName("d1"), not(isPresent()));
+              assertThat(clazz.uniqueMethodWithOriginalName("d2"), not(isPresent()));
+              assertThat(clazz.uniqueMethodWithOriginalName("bv"), not(isPresent()));
             })
         .assertAllWarningMessagesMatch(equalTo("Resource 'META-INF/MANIFEST.MF' already exists."))
         .run(parameters.getRuntime(), Main.class)
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteAllowAccessModificationTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteAllowAccessModificationTest.java
index 29b0027..6afe963 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteAllowAccessModificationTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteAllowAccessModificationTest.java
@@ -131,7 +131,7 @@
     // TODO(b/154348683): Assert equality between LibReference and Lib.
     // assertEqualMetadata(new CodeInspector(libReferenceJars.get(targetVersion)), inspector);
     ClassSubject lib = inspector.clazz(PKG_LIB + ".Lib");
-    MethodSubject funInline = lib.uniqueMethodWithName("funInline$main");
+    MethodSubject funInline = lib.uniqueMethodWithOriginalName("funInline$main");
     assertThat(funInline, isPresent());
     // TODO(b/154348683): Keep the inline method package private.
     // assertTrue(funInline.isPackagePrivate());
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInCompanionTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInCompanionTest.java
index eb588bb..2232747 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInCompanionTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInCompanionTest.java
@@ -186,15 +186,15 @@
     }
 
     // The backing field for the property in the companion, with @JvmField
-    FieldSubject elt2 = impl.uniqueFieldWithName("elt2");
+    FieldSubject elt2 = impl.uniqueFieldWithOriginalName("elt2");
     assertThat(elt2, isPresentAndNotRenamed());
 
-    FieldSubject companionObject = impl.uniqueFieldWithName("Companion");
+    FieldSubject companionObject = impl.uniqueFieldWithOriginalName("Companion");
     assertThat(companionObject, isPresentAndNotRenamed());
     assertEquals(companionObject.getFinalName(), kmClass.getCompanionObject());
 
     // Bridge for the property in the companion that needs a backing field.
-    MethodSubject elt1Bridge = impl.uniqueMethodWithName("access$getElt1$cp");
+    MethodSubject elt1Bridge = impl.uniqueMethodWithOriginalName("access$getElt1$cp");
     if (keptAll) {
       assertThat(elt1Bridge, isPresentAndNotRenamed());
     } else {
@@ -202,11 +202,11 @@
     }
 
     // With @JvmField, no bridge is added.
-    MethodSubject elt2Bridge = impl.uniqueMethodWithName("access$getElt2$cp");
+    MethodSubject elt2Bridge = impl.uniqueMethodWithOriginalName("access$getElt2$cp");
     assertThat(elt2Bridge, not(isPresent()));
 
     // For B$Companion.foo, which is a simple computation, no backing field needed, hence no bridge.
-    MethodSubject fooBridge = impl.uniqueMethodWithName("access$getFoo$cp");
+    MethodSubject fooBridge = impl.uniqueMethodWithOriginalName("access$getFoo$cp");
     assertThat(fooBridge, not(isPresent()));
 
     ClassSubject companion = inspector.clazz(companionClassName);
@@ -226,17 +226,17 @@
     kmProperty = kmClass.kmPropertyWithUniqueName("foo");
     assertThat(kmProperty, isPresent());
 
-    MethodSubject elt1Getter = companion.uniqueMethodWithName("getElt1");
+    MethodSubject elt1Getter = companion.uniqueMethodWithOriginalName("getElt1");
     assertThat(elt1Getter, isPresentAndNotRenamed());
 
     // Note that there is no getter for property with @JvmField.
-    MethodSubject elt2Getter = companion.uniqueMethodWithName("getElt2");
+    MethodSubject elt2Getter = companion.uniqueMethodWithOriginalName("getElt2");
     assertThat(elt2Getter, not(isPresent()));
 
-    MethodSubject fooGetter = companion.uniqueMethodWithName("getFoo");
+    MethodSubject fooGetter = companion.uniqueMethodWithOriginalName("getFoo");
     assertThat(fooGetter, isPresentAndNotRenamed());
 
-    MethodSubject barSetter = companion.uniqueMethodWithName("setBar");
+    MethodSubject barSetter = companion.uniqueMethodWithOriginalName("setBar");
     assertThat(barSetter, isPresentAndNotRenamed());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInExtensionFunctionTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInExtensionFunctionTest.java
index 99cdd63..eefafd8 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInExtensionFunctionTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInExtensionFunctionTest.java
@@ -222,7 +222,7 @@
     // name by changing the import statement and the actual call.
     String[] methodNames = new String[] {"extension", "csHash", "longArrayHash", "myApply"};
     for (String methodName : methodNames) {
-      MethodSubject method = clazz.uniqueMethodWithName(methodName);
+      MethodSubject method = clazz.uniqueMethodWithOriginalName(methodName);
       assertThat(method, isPresentAndRenamed());
       String finalMethodName = method.getFinalName();
       kotlinSource =
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionTest.java
index 9ae2cb0..21ec2b1 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionTest.java
@@ -189,7 +189,7 @@
     ClassSubject sup = inspector.clazz(superClassName);
     assertThat(sup, isPresentAndRenamed());
 
-    MethodSubject foo = sup.uniqueMethodWithName("foo");
+    MethodSubject foo = sup.uniqueMethodWithOriginalName("foo");
     assertThat(foo, isPresentAndRenamed());
 
     KmClassSubject kmClass = sup.getKmClass();
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithDefaultValueTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithDefaultValueTest.java
index a4cc7fa..8fde8b1 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithDefaultValueTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithDefaultValueTest.java
@@ -110,10 +110,10 @@
     ClassSubject libKt = inspector.clazz(libClassName);
     assertThat(libKt, isPresentAndNotRenamed());
 
-    MethodSubject methodSubject = libKt.uniqueMethodWithName("applyMap");
+    MethodSubject methodSubject = libKt.uniqueMethodWithOriginalName("applyMap");
     assertThat(methodSubject, isPresentAndNotRenamed());
 
-    methodSubject = libKt.uniqueMethodWithName("applyMap$default");
+    methodSubject = libKt.uniqueMethodWithOriginalName("applyMap$default");
     assertThat(methodSubject, isPresentAndNotRenamed());
 
     KmPackageSubject kmPackage = libKt.getKmPackage();
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithVarargTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithVarargTest.java
index 435266f..18666b3 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithVarargTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInFunctionWithVarargTest.java
@@ -118,13 +118,13 @@
     ClassSubject cls = inspector.clazz(className);
     assertThat(cls, isPresentAndNotRenamed());
 
-    MethodSubject foo = cls.uniqueMethodWithName("foo");
+    MethodSubject foo = cls.uniqueMethodWithOriginalName("foo");
     assertThat(foo, isPresentAndNotRenamed());
 
     ClassSubject libKt = inspector.clazz(libClassName);
     assertThat(libKt, isPresentAndNotRenamed());
 
-    MethodSubject bar = libKt.uniqueMethodWithName("bar");
+    MethodSubject bar = libKt.uniqueMethodWithOriginalName("bar");
     assertThat(bar, isPresentAndNotRenamed());
 
     KmPackageSubject kmPackage = libKt.getKmPackage();
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInMultifileClassTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInMultifileClassTest.java
index 11c9e7b..4168248 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInMultifileClassTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInMultifileClassTest.java
@@ -110,9 +110,9 @@
 
     ClassSubject util = inspector.clazz(utilClassName);
     assertThat(util, isPresentAndNotRenamed());
-    MethodSubject commaJoinOfInt = util.uniqueMethodWithName("commaSeparatedJoinOfInt");
+    MethodSubject commaJoinOfInt = util.uniqueMethodWithOriginalName("commaSeparatedJoinOfInt");
     assertThat(commaJoinOfInt, isPresentAndNotRenamed());
-    MethodSubject joinOfInt = util.uniqueMethodWithName("joinOfInt");
+    MethodSubject joinOfInt = util.uniqueMethodWithOriginalName("joinOfInt");
     assertThat(joinOfInt, not(isPresent()));
 
     inspectMetadataForFacade(inspector, util);
@@ -155,9 +155,9 @@
 
     ClassSubject util = inspector.clazz(utilClassName);
     assertThat(util, isPresentAndNotRenamed());
-    MethodSubject commaJoinOfInt = util.uniqueMethodWithName("commaSeparatedJoinOfInt");
+    MethodSubject commaJoinOfInt = util.uniqueMethodWithOriginalName("commaSeparatedJoinOfInt");
     assertThat(commaJoinOfInt, isPresentAndNotRenamed());
-    MethodSubject joinOfInt = util.uniqueMethodWithName("joinOfInt");
+    MethodSubject joinOfInt = util.uniqueMethodWithOriginalName("joinOfInt");
     assertThat(joinOfInt, isPresentAndRenamed());
 
     inspectMetadataForFacade(inspector, util);
@@ -187,9 +187,9 @@
     String signedClassName = PKG + ".multifileclass_lib.UtilKt__SignedKt";
     ClassSubject signed = inspector.clazz(signedClassName);
     assertThat(signed, isPresentAndRenamed());
-    MethodSubject commaJoinOfInt = signed.uniqueMethodWithName("commaSeparatedJoinOfInt");
+    MethodSubject commaJoinOfInt = signed.uniqueMethodWithOriginalName("commaSeparatedJoinOfInt");
     assertThat(commaJoinOfInt, isPresentAndNotRenamed());
-    MethodSubject joinOfInt = signed.uniqueMethodWithName("joinOfInt");
+    MethodSubject joinOfInt = signed.uniqueMethodWithOriginalName("joinOfInt");
     assertThat(joinOfInt, isPresentAndRenamed());
 
     // API entry is kept, hence the presence of Metadata.
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInPropertyTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInPropertyTest.java
index f93a28d..494d25d 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInPropertyTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInPropertyTest.java
@@ -114,11 +114,11 @@
     ClassSubject person = inspector.clazz(personClassName);
     assertThat(person, isPresentAndNotRenamed());
 
-    FieldSubject backingField = person.uniqueFieldWithName("name");
+    FieldSubject backingField = person.uniqueFieldWithOriginalName("name");
     assertThat(backingField, isPresentAndRenamed());
-    MethodSubject getterForName = person.uniqueMethodWithName("getName");
+    MethodSubject getterForName = person.uniqueMethodWithOriginalName("getName");
     assertThat(getterForName, isPresentAndNotRenamed());
-    MethodSubject setterForName = person.uniqueMethodWithName("setName");
+    MethodSubject setterForName = person.uniqueMethodWithOriginalName("setName");
     assertThat(setterForName, not(isPresent()));
 
     // API entry is kept, hence the presence of Metadata.
@@ -250,7 +250,7 @@
     KmPropertySubject familyName = kmClass.kmPropertyWithUniqueName("familyName");
     assertThat(familyName, not(isPresent()));
 
-    FieldSubject ageField = person.uniqueFieldWithName("age");
+    FieldSubject ageField = person.uniqueFieldWithOriginalName("age");
     assertThat(ageField, isAbsent());
 
     KmPropertySubject age = kmClass.kmPropertyWithUniqueName("age");
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInTypeAliasTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInTypeAliasTest.java
index 5272541..2571322 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInTypeAliasTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteInTypeAliasTest.java
@@ -164,7 +164,7 @@
     ClassSubject libKt = inspector.clazz(libKtClassName);
     assertThat(libKt, isPresentAndNotRenamed());
 
-    MethodSubject seq = libKt.uniqueMethodWithName("seq");
+    MethodSubject seq = libKt.uniqueMethodWithOriginalName("seq");
     assertThat(seq, isPresentAndNotRenamed());
 
     // API entry is kept, hence the presence of Metadata.
diff --git a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteJvmStaticTest.java b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteJvmStaticTest.java
index cd667d3..a1b423d 100644
--- a/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteJvmStaticTest.java
+++ b/src/test/java/com/android/tools/r8/kotlin/metadata/MetadataRewriteJvmStaticTest.java
@@ -145,7 +145,7 @@
   private void inspectInterfaceWithCompanion(CodeInspector inspector) {
     ClassSubject itf = inspector.clazz(PKG_LIB + ".InterfaceWithCompanion");
     assertThat(itf, isPresent());
-    MethodSubject greet = itf.uniqueMethodWithName("greet");
+    MethodSubject greet = itf.uniqueMethodWithOriginalName("greet");
     assertThat(greet, isPresent());
 
     ClassSubject itfCompanion = inspector.clazz(PKG_LIB + ".InterfaceWithCompanion$Companion");
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexDevirtualizerTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexDevirtualizerTest.java
index 783b9f1..69643e1 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexDevirtualizerTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexDevirtualizerTest.java
@@ -65,7 +65,7 @@
           // cast.
           ClassSubject clazz = inspector.clazz(Main.class);
           assertThat(clazz, isPresentAndNotRenamed());
-          MethodSubject main = clazz.uniqueMethodWithName("main");
+          MethodSubject main = clazz.uniqueMethodWithOriginalName("main");
           assertThat(main, isPresent());
           List<CheckCastInstructionSubject> checkCasts =
               main.streamInstructions()
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningSpuriousRootTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningSpuriousRootTest.java
index 47bd62e..f5aae43 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningSpuriousRootTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningSpuriousRootTest.java
@@ -95,17 +95,17 @@
     CodeInspector inspector = compileResult.inspector();
     ClassSubject mainClassSubject = inspector.clazz(Main.class);
     assertThat(mainClassSubject, isPresent());
-    MethodSubject fooMethodSubject = mainClassSubject.uniqueMethodWithName("foo");
+    MethodSubject fooMethodSubject = mainClassSubject.uniqueMethodWithOriginalName("foo");
     assertThat(fooMethodSubject, isPresent());
     ClassSubject main2ClassSubject = inspector.clazz(Main2.class);
     assertThat(main2ClassSubject, isPresent());
     ClassSubject aClassSubject = inspector.clazz(A.class);
     assertThat(aClassSubject, isPresent());
-    MethodSubject barMethodSubject = aClassSubject.uniqueMethodWithName("bar");
+    MethodSubject barMethodSubject = aClassSubject.uniqueMethodWithOriginalName("bar");
     assertThat(barMethodSubject, isPresent());
     ClassSubject bClassSubject = inspector.clazz(B.class);
     assertThat(bClassSubject, isPresent());
-    MethodSubject bazMethodSubject = bClassSubject.uniqueMethodWithName("baz");
+    MethodSubject bazMethodSubject = bClassSubject.uniqueMethodWithOriginalName("baz");
     assertThat(bazMethodSubject, isPresent());
     assertThat(fooMethodSubject, invokesMethod(barMethodSubject));
     assertThat(barMethodSubject, invokesMethod(bazMethodSubject));
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningTest.java
index 013fdd3..b2f82c7 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningTest.java
@@ -95,19 +95,19 @@
     ClassSubject mainClassSubject = inspector.clazz(Main.class);
     assertThat(mainClassSubject, isPresent());
 
-    MethodSubject fooMethodSubject = mainClassSubject.uniqueMethodWithName("foo");
+    MethodSubject fooMethodSubject = mainClassSubject.uniqueMethodWithOriginalName("foo");
     assertThat(fooMethodSubject, isPresent());
 
     ClassSubject aClassSubject = inspector.clazz(A.class);
     assertThat(aClassSubject, isPresent());
 
-    MethodSubject barMethodSubject = aClassSubject.uniqueMethodWithName("bar");
+    MethodSubject barMethodSubject = aClassSubject.uniqueMethodWithOriginalName("bar");
     assertThat(barMethodSubject, isPresent());
 
     ClassSubject bClassSubject = inspector.clazz(B.class);
     assertThat(bClassSubject, isPresent());
 
-    MethodSubject bazMethodSubject = bClassSubject.uniqueMethodWithName("baz");
+    MethodSubject bazMethodSubject = bClassSubject.uniqueMethodWithOriginalName("baz");
     assertThat(bazMethodSubject, isPresent());
 
     assertThat(fooMethodSubject, invokesMethod(barMethodSubject));
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningWithTracingTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningWithTracingTest.java
index 50e65c9..6f97deb 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningWithTracingTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainDexInliningWithTracingTest.java
@@ -99,23 +99,23 @@
     ClassSubject mainClassSubject = inspector.clazz(Main.class);
     assertThat(mainClassSubject, isPresent());
 
-    MethodSubject fooMethodSubject = mainClassSubject.uniqueMethodWithName("foo");
+    MethodSubject fooMethodSubject = mainClassSubject.uniqueMethodWithOriginalName("foo");
     assertThat(fooMethodSubject, isPresent());
 
     MethodSubject notCalledAtStartupMethodSubject =
-        mainClassSubject.uniqueMethodWithName("notCalledAtStartup");
+        mainClassSubject.uniqueMethodWithOriginalName("notCalledAtStartup");
     assertThat(notCalledAtStartupMethodSubject, isPresent());
 
     ClassSubject aClassSubject = inspector.clazz(A.class);
     assertThat(aClassSubject, isPresent());
 
-    MethodSubject barMethodSubject = aClassSubject.uniqueMethodWithName("bar");
+    MethodSubject barMethodSubject = aClassSubject.uniqueMethodWithOriginalName("bar");
     assertThat(barMethodSubject, isPresent());
 
     ClassSubject bClassSubject = inspector.clazz(B.class);
     assertThat(bClassSubject, isPresent());
 
-    MethodSubject bazMethodSubject = bClassSubject.uniqueMethodWithName("baz");
+    MethodSubject bazMethodSubject = bClassSubject.uniqueMethodWithOriginalName("baz");
     assertThat(bazMethodSubject, isPresent());
 
     assertThat(notCalledAtStartupMethodSubject, invokesMethod(barMethodSubject));
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainHorizontalMergingTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainHorizontalMergingTest.java
index 4d59d9b..6cc29ca 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainHorizontalMergingTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainHorizontalMergingTest.java
@@ -112,7 +112,7 @@
     ClassSubject mainClassSubject = inspector.clazz(Main.class);
     assertThat(mainClassSubject, isPresent());
 
-    MethodSubject fooMethodSubject = mainClassSubject.uniqueMethodWithName("foo");
+    MethodSubject fooMethodSubject = mainClassSubject.uniqueMethodWithOriginalName("foo");
     assertThat(fooMethodSubject, isPresent());
 
     ClassSubject aClassSubject = inspector.clazz(A.class);
@@ -121,7 +121,7 @@
     ClassSubject bClassSubject = inspector.clazz(B.class);
     assertThat(bClassSubject, isPresent());
 
-    MethodSubject fooASubject = aClassSubject.uniqueMethodWithName("foo");
+    MethodSubject fooASubject = aClassSubject.uniqueMethodWithOriginalName("foo");
     assertThat(fooASubject, isPresent());
 
     assertThat(fooMethodSubject, invokesMethod(fooASubject));
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainVerticalMergingTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainVerticalMergingTest.java
index 480abb7..82e102e 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainVerticalMergingTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListFromGenerateMainVerticalMergingTest.java
@@ -104,13 +104,13 @@
     ClassSubject mainClassSubject = inspector.clazz(Main.class);
     assertThat(mainClassSubject, isPresent());
 
-    MethodSubject fooMethodSubject = mainClassSubject.uniqueMethodWithName("foo");
+    MethodSubject fooMethodSubject = mainClassSubject.uniqueMethodWithOriginalName("foo");
     assertThat(fooMethodSubject, isPresent());
 
     ClassSubject aClassSubject = inspector.clazz(A.class);
     assertThat(aClassSubject, isPresent());
 
-    MethodSubject fooAMethodSubject = aClassSubject.uniqueMethodWithName("foo");
+    MethodSubject fooAMethodSubject = aClassSubject.uniqueMethodWithOriginalName("foo");
     assertThat(fooAMethodSubject, isPresent());
 
     ClassSubject bClassSubject = inspector.clazz(B.class);
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexUnusedArgumentRewriteWithLensTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexUnusedArgumentRewriteWithLensTest.java
index ee3a60f..1143ca2 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexUnusedArgumentRewriteWithLensTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexUnusedArgumentRewriteWithLensTest.java
@@ -69,7 +69,7 @@
               assertThat(bSubject, isPresent());
               ClassSubject mainSubject = inspector.clazz(Main.class);
               assertThat(mainSubject, isPresentAndNotRenamed());
-              MethodSubject mainMethodSubject = mainSubject.uniqueMethodWithName("main");
+              MethodSubject mainMethodSubject = mainSubject.uniqueMethodWithOriginalName("main");
               assertThat(mainMethodSubject, isPresentAndNotRenamed());
               assertTrue(
                   mainMethodSubject
diff --git a/src/test/java/com/android/tools/r8/memberrebinding/LibraryMemberRebindingInterfaceTest.java b/src/test/java/com/android/tools/r8/memberrebinding/LibraryMemberRebindingInterfaceTest.java
index e472056..d48f547 100644
--- a/src/test/java/com/android/tools/r8/memberrebinding/LibraryMemberRebindingInterfaceTest.java
+++ b/src/test/java/com/android/tools/r8/memberrebinding/LibraryMemberRebindingInterfaceTest.java
@@ -103,7 +103,7 @@
         .inspect(
             inspector -> {
               MethodSubject testMethodSubject =
-                  inspector.clazz(Main.class).uniqueMethodWithName("test");
+                  inspector.clazz(Main.class).uniqueMethodWithOriginalName("test");
               assertThat(testMethodSubject, isPresent());
               assertThat(
                   testMethodSubject,
diff --git a/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingInvokeSuperAbstractTest.java b/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingInvokeSuperAbstractTest.java
index ee69b91..41ccb91 100644
--- a/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingInvokeSuperAbstractTest.java
+++ b/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingInvokeSuperAbstractTest.java
@@ -64,7 +64,7 @@
         .inspect(
             inspector -> {
               MethodSubject getSystemService =
-                  inspector.clazz(Main.class).uniqueMethodWithName("getSystemService");
+                  inspector.clazz(Main.class).uniqueMethodWithOriginalName("getSystemService");
               assertThat(getSystemService, isPresent());
               // We should never rebind this call to LibraryBase::getSystemService since this can
               // cause errors when verifying the code on a device where the image has a definition
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 2d1b98c..63bc8a6 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
@@ -47,7 +47,7 @@
     assertThat(classSubject, isPresent());
     assertTrue(
         classSubject
-            .uniqueMethodWithName("main")
+            .uniqueMethodWithOriginalName("main")
             .streamInstructions()
             .filter(InstructionSubject::isInvokeVirtual)
             .noneMatch(
diff --git a/src/test/java/com/android/tools/r8/movestringconstants/MoveStringConstantsTest.java b/src/test/java/com/android/tools/r8/movestringconstants/MoveStringConstantsTest.java
index eaac9ca..35e8c37 100644
--- a/src/test/java/com/android/tools/r8/movestringconstants/MoveStringConstantsTest.java
+++ b/src/test/java/com/android/tools/r8/movestringconstants/MoveStringConstantsTest.java
@@ -130,7 +130,7 @@
 
     ClassSubject utilsClassSubject = inspector.clazz(Utils.class);
     assertThat(utilsClassSubject, isPresent());
-    assertThat(utilsClassSubject.uniqueMethodWithName("throwException"), isPresent());
+    assertThat(utilsClassSubject.uniqueMethodWithOriginalName("throwException"), isPresent());
     assertEquals(1, utilsClassSubject.allMethods().size());
   }
 
diff --git a/src/test/java/com/android/tools/r8/naming/AbstractMethodRenamingTest.java b/src/test/java/com/android/tools/r8/naming/AbstractMethodRenamingTest.java
index 9038f76..7ec987b 100644
--- a/src/test/java/com/android/tools/r8/naming/AbstractMethodRenamingTest.java
+++ b/src/test/java/com/android/tools/r8/naming/AbstractMethodRenamingTest.java
@@ -85,18 +85,18 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject base = inspector.clazz(Base.class);
     assertThat(base, isPresentAndRenamed());
-    MethodSubject foo = base.uniqueMethodWithName("foo");
+    MethodSubject foo = base.uniqueMethodWithOriginalName("foo");
     assertThat(foo, isPresentAndRenamed());
 
     ClassSubject sub1 = inspector.clazz(Sub1.class);
     assertThat(sub1, isPresentAndRenamed());
-    MethodSubject fooInSub1 = sub1.uniqueMethodWithName("foo");
+    MethodSubject fooInSub1 = sub1.uniqueMethodWithOriginalName("foo");
     assertThat(fooInSub1, isPresentAndRenamed());
     assertEquals(foo.getFinalName(), fooInSub1.getFinalName());
 
     ClassSubject sub2 = inspector.clazz(Sub1.class);
     assertThat(sub2, isPresentAndRenamed());
-    MethodSubject fooInSub2 = sub2.uniqueMethodWithName("foo");
+    MethodSubject fooInSub2 = sub2.uniqueMethodWithOriginalName("foo");
     assertThat(fooInSub2, isPresentAndRenamed());
     assertEquals(foo.getFinalName(), fooInSub2.getFinalName());
   }
diff --git a/src/test/java/com/android/tools/r8/naming/CovariantReturnTypeInSubInterfaceTest.java b/src/test/java/com/android/tools/r8/naming/CovariantReturnTypeInSubInterfaceTest.java
index 97073ac..cd8e931 100644
--- a/src/test/java/com/android/tools/r8/naming/CovariantReturnTypeInSubInterfaceTest.java
+++ b/src/test/java/com/android/tools/r8/naming/CovariantReturnTypeInSubInterfaceTest.java
@@ -96,7 +96,7 @@
       throws NoSuchMethodException {
     ClassSubject superInterface = inspector.clazz(SuperInterface.class);
     assertThat(superInterface, isPresentAndRenamed());
-    MethodSubject foo1 = superInterface.uniqueMethodWithName("foo");
+    MethodSubject foo1 = superInterface.uniqueMethodWithOriginalName("foo");
     assertThat(foo1, isPresentAndRenamed());
     ClassSubject subInterface = inspector.clazz(SubInterface.class);
     assertThat(subInterface, isPresentAndRenamed());
diff --git a/src/test/java/com/android/tools/r8/naming/EnumMinification.java b/src/test/java/com/android/tools/r8/naming/EnumMinification.java
index 3cf01e0..95ff741 100644
--- a/src/test/java/com/android/tools/r8/naming/EnumMinification.java
+++ b/src/test/java/com/android/tools/r8/naming/EnumMinification.java
@@ -68,13 +68,13 @@
     // The class and fields - including the method valueOf - can be renamed. Only the values()
     // method needs to be.
     assertThat(clazz, isPresentAndRenamed());
-    assertThat(clazz.uniqueFieldWithName("VALUE1"), isAbsent());
-    assertThat(clazz.uniqueFieldWithName("VALUE2"), isAbsent());
-    assertThat(clazz.uniqueFieldWithName("$VALUES"), isPresentAndRenamed());
+    assertThat(clazz.uniqueFieldWithOriginalName("VALUE1"), isAbsent());
+    assertThat(clazz.uniqueFieldWithOriginalName("VALUE2"), isAbsent());
+    assertThat(clazz.uniqueFieldWithOriginalName("$VALUES"), isPresentAndRenamed());
     assertThat(
-        clazz.uniqueMethodWithName("valueOf"),
+        clazz.uniqueMethodWithOriginalName("valueOf"),
         valueOfKept ? isPresentAndRenamed() : not(isPresent()));
-    assertThat(clazz.uniqueMethodWithName("values"), isPresentAndNotRenamed());
+    assertThat(clazz.uniqueMethodWithOriginalName("values"), isPresentAndNotRenamed());
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/naming/FieldMinificationCollisionTest.java b/src/test/java/com/android/tools/r8/naming/FieldMinificationCollisionTest.java
index 7d0d809..d8e0168 100644
--- a/src/test/java/com/android/tools/r8/naming/FieldMinificationCollisionTest.java
+++ b/src/test/java/com/android/tools/r8/naming/FieldMinificationCollisionTest.java
@@ -38,10 +38,10 @@
             .assertSuccessWithOutput(expectedOutput)
             .inspector();
 
-    FieldSubject f1Subject = inspector.clazz(A.class).uniqueFieldWithName("f1");
+    FieldSubject f1Subject = inspector.clazz(A.class).uniqueFieldWithOriginalName("f1");
     assertThat(f1Subject, isPresent());
 
-    FieldSubject f3Subject = inspector.clazz(C.class).uniqueFieldWithName("f3");
+    FieldSubject f3Subject = inspector.clazz(C.class).uniqueFieldWithOriginalName("f3");
     assertThat(f3Subject, isPresent());
 
     assertNotEquals(f1Subject.getFinalName(), f3Subject.getFinalName());
diff --git a/src/test/java/com/android/tools/r8/naming/FieldNamingObfuscationDictionaryTest.java b/src/test/java/com/android/tools/r8/naming/FieldNamingObfuscationDictionaryTest.java
index 165d0f7..0fc9365 100644
--- a/src/test/java/com/android/tools/r8/naming/FieldNamingObfuscationDictionaryTest.java
+++ b/src/test/java/com/android/tools/r8/naming/FieldNamingObfuscationDictionaryTest.java
@@ -108,11 +108,16 @@
         .assertSuccessWithOutputLines("2HELLO WORLD", "2HELLO WORLD")
         .inspect(
             inspector -> {
-              assertEquals("a", inspector.clazz(A.class).uniqueFieldWithName("f1").getFinalName());
-              assertEquals("a", inspector.clazz(B.class).uniqueFieldWithName("f0").getFinalName());
-              assertEquals("b", inspector.clazz(B.class).uniqueFieldWithName("f2").getFinalName());
-              assertEquals("a", inspector.clazz(C.class).uniqueFieldWithName("f0").getFinalName());
-              assertEquals("b", inspector.clazz(C.class).uniqueFieldWithName("f3").getFinalName());
+              assertEquals(
+                  "a", inspector.clazz(A.class).uniqueFieldWithOriginalName("f1").getFinalName());
+              assertEquals(
+                  "a", inspector.clazz(B.class).uniqueFieldWithOriginalName("f0").getFinalName());
+              assertEquals(
+                  "b", inspector.clazz(B.class).uniqueFieldWithOriginalName("f2").getFinalName());
+              assertEquals(
+                  "a", inspector.clazz(C.class).uniqueFieldWithOriginalName("f0").getFinalName());
+              assertEquals(
+                  "b", inspector.clazz(C.class).uniqueFieldWithOriginalName("f3").getFinalName());
             });
   }
 }
diff --git a/src/test/java/com/android/tools/r8/naming/FieldSharedParentMinificationTest.java b/src/test/java/com/android/tools/r8/naming/FieldSharedParentMinificationTest.java
index e3a8047..28d39db 100644
--- a/src/test/java/com/android/tools/r8/naming/FieldSharedParentMinificationTest.java
+++ b/src/test/java/com/android/tools/r8/naming/FieldSharedParentMinificationTest.java
@@ -42,9 +42,9 @@
         .assertSuccessWithOutputLines("true", "42", "Hello World!")
         .inspect(
             inspector -> {
-              FieldSubject foo = inspector.clazz(I.class).uniqueFieldWithName("foo");
-              FieldSubject bar = inspector.clazz(J.class).uniqueFieldWithName("bar");
-              FieldSubject baz = inspector.clazz(A.class).uniqueFieldWithName("baz");
+              FieldSubject foo = inspector.clazz(I.class).uniqueFieldWithOriginalName("foo");
+              FieldSubject bar = inspector.clazz(J.class).uniqueFieldWithOriginalName("bar");
+              FieldSubject baz = inspector.clazz(A.class).uniqueFieldWithOriginalName("baz");
               assertThat(foo, isPresentAndRenamed());
               assertThat(bar, isPresentAndRenamed());
               assertThat(baz, isPresentAndRenamed());
diff --git a/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java b/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
index 6597cb0..dc7f93e 100644
--- a/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
+++ b/src/test/java/com/android/tools/r8/naming/IdentifierMinifierTest.java
@@ -144,7 +144,7 @@
     assertEquals(countInMain, renamedYetFoundIdentifierCount);
 
     ClassSubject aClass = inspector.clazz("adaptclassstrings.A");
-    MethodSubject bar = aClass.uniqueMethodWithName("bar");
+    MethodSubject bar = aClass.uniqueMethodWithOriginalName("bar");
     assertThat(bar, isPresent());
     verifyPresenceOfConstString(bar);
     renamedYetFoundIdentifierCount = countRenamedClassIdentifier(inspector, bar);
@@ -188,7 +188,7 @@
     assertEquals(2, constStringInstructions.size());
 
     ClassSubject b = inspector.clazz("getmembers.B");
-    MethodSubject inliner = b.uniqueMethodWithName("inliner");
+    MethodSubject inliner = b.uniqueMethodWithOriginalName("inliner");
     assertThat(inliner, isPresent());
     constStringInstructions = getRenamedMemberIdentifierConstStrings(a, inliner);
     assertEquals(1, constStringInstructions.size());
diff --git a/src/test/java/com/android/tools/r8/naming/InvalidObfuscationEntryTest.java b/src/test/java/com/android/tools/r8/naming/InvalidObfuscationEntryTest.java
index 57bd145..8fd083f 100644
--- a/src/test/java/com/android/tools/r8/naming/InvalidObfuscationEntryTest.java
+++ b/src/test/java/com/android/tools/r8/naming/InvalidObfuscationEntryTest.java
@@ -75,9 +75,9 @@
             codeInspector -> {
               ClassSubject clazz = codeInspector.clazz(Main.class);
               assertThat(clazz, isPresent());
-              MethodSubject aSubject = clazz.uniqueMethodWithName("a");
+              MethodSubject aSubject = clazz.uniqueMethodWithOriginalName("a");
               assertThat(aSubject.getFinalName(), anyOf(is("x"), is("y")));
-              MethodSubject bSubject = clazz.uniqueMethodWithName("b");
+              MethodSubject bSubject = clazz.uniqueMethodWithOriginalName("b");
               assertThat(bSubject.getFinalName(), anyOf(is("x"), is("y")));
             });
   }
diff --git a/src/test/java/com/android/tools/r8/naming/OverloadUniqueNameTest.java b/src/test/java/com/android/tools/r8/naming/OverloadUniqueNameTest.java
index 166b2e1..d7baa95 100644
--- a/src/test/java/com/android/tools/r8/naming/OverloadUniqueNameTest.java
+++ b/src/test/java/com/android/tools/r8/naming/OverloadUniqueNameTest.java
@@ -142,10 +142,13 @@
               assertEquals(aFoo.getFinalName(), cFoo.getFinalName());
 
               // Ensure that all SAM interfaces has same method name.
-              final MethodSubject i1Foo = codeInspector.clazz(I1.class).uniqueMethodWithName("foo");
-              final MethodSubject i2Foo = codeInspector.clazz(I2.class).uniqueMethodWithName("foo");
+              final MethodSubject i1Foo =
+                  codeInspector.clazz(I1.class).uniqueMethodWithOriginalName("foo");
+              final MethodSubject i2Foo =
+                  codeInspector.clazz(I2.class).uniqueMethodWithOriginalName("foo");
               assertEquals(i1Foo.getFinalName(), i2Foo.getFinalName());
-              final MethodSubject i3Foo = codeInspector.clazz(I3.class).uniqueMethodWithName("foo");
+              final MethodSubject i3Foo =
+                  codeInspector.clazz(I3.class).uniqueMethodWithOriginalName("foo");
               assertEquals(i1Foo.getFinalName(), i3Foo.getFinalName());
 
               // Ensure C has the correct name for the interface method.
@@ -154,7 +157,8 @@
               assertEquals(cIFoo.getFinalName(), i1Foo.getFinalName());
 
               // Ensure that I4.foo(int) has the same name as I3.foo(int).
-              final MethodSubject i4Foo = codeInspector.clazz(I4.class).uniqueMethodWithName("foo");
+              final MethodSubject i4Foo =
+                  codeInspector.clazz(I4.class).uniqueMethodWithOriginalName("foo");
               assertEquals(i3Foo.getFinalName(), i4Foo.getFinalName());
             });
   }
diff --git a/src/test/java/com/android/tools/r8/naming/OverloadedReservedFieldNamingTest.java b/src/test/java/com/android/tools/r8/naming/OverloadedReservedFieldNamingTest.java
index cda6322..b7176ab 100644
--- a/src/test/java/com/android/tools/r8/naming/OverloadedReservedFieldNamingTest.java
+++ b/src/test/java/com/android/tools/r8/naming/OverloadedReservedFieldNamingTest.java
@@ -62,14 +62,14 @@
     assertThat(classSubject, isPresent());
 
     FieldSubject fieldSubject =
-        classSubject.asFoundClassSubject().uniqueFieldWithName("a", Reference.BOOL);
+        classSubject.asFoundClassSubject().uniqueFieldWithOriginalName("a", Reference.BOOL);
     assertThat(fieldSubject, isPresentAndNotRenamed());
 
-    FieldSubject helloFieldSubject = classSubject.uniqueFieldWithName("hello");
+    FieldSubject helloFieldSubject = classSubject.uniqueFieldWithOriginalName("hello");
     assertThat(helloFieldSubject, isPresent());
     assertEquals(overloadAggressively ? "a" : "b", helloFieldSubject.getFinalName());
 
-    FieldSubject worldFieldSubject = classSubject.uniqueFieldWithName("world");
+    FieldSubject worldFieldSubject = classSubject.uniqueFieldWithOriginalName("world");
     assertThat(worldFieldSubject, isPresent());
     assertEquals(overloadAggressively ? "a" : "c", worldFieldSubject.getFinalName());
   }
diff --git a/src/test/java/com/android/tools/r8/naming/PackageNamingTest.java b/src/test/java/com/android/tools/r8/naming/PackageNamingTest.java
index 9079f61..487498f 100644
--- a/src/test/java/com/android/tools/r8/naming/PackageNamingTest.java
+++ b/src/test/java/com/android/tools/r8/naming/PackageNamingTest.java
@@ -157,7 +157,7 @@
     assertFalse(inspector.clazz("naming044.sub.SubB").getFinalName().contains("."));
 
     // Method naming044.B.m would be renamed.
-    MethodSubject mMethodSubject = bClassSubject.uniqueMethodWithName("m");
+    MethodSubject mMethodSubject = bClassSubject.uniqueMethodWithOriginalName("m");
     assertNotEquals("m", mMethodSubject.getMethod().getName().toSourceString());
   }
 
@@ -197,7 +197,7 @@
         b.getDexProgramClass().getType().getPackageName());
 
     // method naming044.B.m would be renamed.
-    MethodSubject mMethodSubject = b.uniqueMethodWithName("m");
+    MethodSubject mMethodSubject = b.uniqueMethodWithOriginalName("m");
     assertNotEquals("m", mMethodSubject.getMethod().getName().toSourceString());
   }
 
diff --git a/src/test/java/com/android/tools/r8/naming/PackagePrivateOverrideSameMethodNameTest.java b/src/test/java/com/android/tools/r8/naming/PackagePrivateOverrideSameMethodNameTest.java
index cd9d54c..2176526 100644
--- a/src/test/java/com/android/tools/r8/naming/PackagePrivateOverrideSameMethodNameTest.java
+++ b/src/test/java/com/android/tools/r8/naming/PackagePrivateOverrideSameMethodNameTest.java
@@ -78,9 +78,9 @@
     assertThat(viewModel, isPresentAndRenamed(minification));
     ClassSubject subViewModel = inspector.clazz(SubViewModel.class);
     assertThat(subViewModel, isPresentAndRenamed(minification));
-    MethodSubject viewModelClear = viewModel.uniqueMethodWithName("clear");
+    MethodSubject viewModelClear = viewModel.uniqueMethodWithOriginalName("clear");
     assertThat(viewModelClear, isPresentAndRenamed(minification));
-    MethodSubject subViewModelClear = subViewModel.uniqueMethodWithName("clear");
+    MethodSubject subViewModelClear = subViewModel.uniqueMethodWithOriginalName("clear");
     assertThat(subViewModelClear, isPresentAndRenamed(minification));
     assertEquals(viewModelClear.getFinalName(), subViewModelClear.getFinalName());
     if (!minification) {
diff --git a/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInInterfacesWithCommonSubClassTest.java b/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInInterfacesWithCommonSubClassTest.java
index c4b3181..d7e6e8a 100644
--- a/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInInterfacesWithCommonSubClassTest.java
+++ b/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInInterfacesWithCommonSubClassTest.java
@@ -69,10 +69,10 @@
     ClassSubject bClassSubject = inspector.clazz(B.class);
     assertThat(bClassSubject, isPresent());
 
-    FieldSubject f1FieldSubject = iClassSubject.uniqueFieldWithName("f1");
+    FieldSubject f1FieldSubject = iClassSubject.uniqueFieldWithOriginalName("f1");
     assertThat(f1FieldSubject, isPresent());
 
-    FieldSubject aFieldSubject = jClassSubject.uniqueFieldWithName("a");
+    FieldSubject aFieldSubject = jClassSubject.uniqueFieldWithOriginalName("a");
     assertThat(aFieldSubject, isPresent());
 
     if (reserveName) {
diff --git a/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSubClassTest.java b/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSubClassTest.java
index 38bcbad..4994263 100644
--- a/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSubClassTest.java
+++ b/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSubClassTest.java
@@ -83,22 +83,22 @@
     ClassSubject kClassSubject = inspector.clazz(K.class);
     assertThat(kClassSubject, isPresent());
 
-    FieldSubject f1FieldSubject = aClassSubject.uniqueFieldWithName("f1");
+    FieldSubject f1FieldSubject = aClassSubject.uniqueFieldWithOriginalName("f1");
     assertThat(f1FieldSubject, isPresent());
 
-    FieldSubject f2FieldSubject = bClassSubject.uniqueFieldWithName("f2");
+    FieldSubject f2FieldSubject = bClassSubject.uniqueFieldWithOriginalName("f2");
     assertThat(f2FieldSubject, isPresent());
 
-    FieldSubject f3FieldSubject = iClassSubject.uniqueFieldWithName("f3");
+    FieldSubject f3FieldSubject = iClassSubject.uniqueFieldWithOriginalName("f3");
     assertThat(f3FieldSubject, isPresent());
 
-    FieldSubject f4FieldSubject = jClassSubject.uniqueFieldWithName("f4");
+    FieldSubject f4FieldSubject = jClassSubject.uniqueFieldWithOriginalName("f4");
     assertThat(f4FieldSubject, isPresent());
 
-    FieldSubject f5FieldSubject = kClassSubject.uniqueFieldWithName("f5");
+    FieldSubject f5FieldSubject = kClassSubject.uniqueFieldWithOriginalName("f5");
     assertThat(f5FieldSubject, isPresent());
 
-    FieldSubject aFieldSubject = cClassSubject.uniqueFieldWithName("a");
+    FieldSubject aFieldSubject = cClassSubject.uniqueFieldWithOriginalName("a");
     assertThat(aFieldSubject, isPresent());
 
     if (reserveName) {
diff --git a/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSubInterfaceTest.java b/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSubInterfaceTest.java
index 65c62b8..8298bed 100644
--- a/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSubInterfaceTest.java
+++ b/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSubInterfaceTest.java
@@ -67,11 +67,11 @@
     ClassSubject jClassSubject = inspector.clazz(J.class);
     assertThat(jClassSubject, isPresent());
 
-    FieldSubject f1FieldSubject = iClassSubject.uniqueFieldWithName("f1");
+    FieldSubject f1FieldSubject = iClassSubject.uniqueFieldWithOriginalName("f1");
     assertThat(f1FieldSubject, isPresent());
     assertThat(f1FieldSubject, isPresentAndRenamed());
 
-    FieldSubject aFieldSubject = jClassSubject.uniqueFieldWithName("a");
+    FieldSubject aFieldSubject = jClassSubject.uniqueFieldWithOriginalName("a");
     assertThat(aFieldSubject, isPresent());
 
     if (reserveName) {
@@ -119,7 +119,7 @@
     ClassSubject aClassSubject = inspector.clazz(A.class);
     assertThat(aClassSubject, isPresent());
 
-    FieldSubject f2FieldSubject = aClassSubject.uniqueFieldWithName("f2");
+    FieldSubject f2FieldSubject = aClassSubject.uniqueFieldWithOriginalName("f2");
     assertThat(f2FieldSubject, isPresent());
     assertThat(f2FieldSubject, isPresentAndRenamed());
 
diff --git a/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSuperClassTest.java b/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSuperClassTest.java
index 3c264ae..58dfa65 100644
--- a/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSuperClassTest.java
+++ b/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSuperClassTest.java
@@ -59,7 +59,7 @@
     ClassSubject testClassForFieldSubject = inspector.clazz(A.class);
     assertThat(testClassForFieldSubject, isPresent());
 
-    FieldSubject aFieldSubject = testClassForFieldSubject.uniqueFieldWithName("a");
+    FieldSubject aFieldSubject = testClassForFieldSubject.uniqueFieldWithOriginalName("a");
     assertThat(aFieldSubject, isPresent());
 
     // Fields are visited/renamed according to the class hierarchy order. Thus, the field A.a will
@@ -92,14 +92,14 @@
     ClassSubject aSub1ClassSubject = inspector.clazz(ASub1.class);
     assertThat(aSub1ClassSubject, isPresent());
 
-    FieldSubject fooFieldSubject = aSub1ClassSubject.uniqueFieldWithName("foo");
+    FieldSubject fooFieldSubject = aSub1ClassSubject.uniqueFieldWithOriginalName("foo");
     assertThat(fooFieldSubject, isPresentAndRenamed());
     assertNotEquals("a", fooFieldSubject.getFinalName());
 
     ClassSubject aSub2ClassSubject = inspector.clazz(ASub2.class);
     assertThat(aSub2ClassSubject, isPresent());
 
-    FieldSubject barFieldSubject = aSub2ClassSubject.uniqueFieldWithName("bar");
+    FieldSubject barFieldSubject = aSub2ClassSubject.uniqueFieldWithOriginalName("bar");
     assertThat(barFieldSubject, isPresentAndRenamed());
     assertNotEquals("a", barFieldSubject.getFinalName());
 
diff --git a/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSuperInterfaceTest.java b/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSuperInterfaceTest.java
index 599799e..2760aec 100644
--- a/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSuperInterfaceTest.java
+++ b/src/test/java/com/android/tools/r8/naming/ReservedFieldNameInSuperInterfaceTest.java
@@ -60,7 +60,7 @@
     ClassSubject iClassSubject = inspector.clazz(I.class);
     assertThat(iClassSubject, isPresent());
 
-    FieldSubject aFieldSubject = iClassSubject.uniqueFieldWithName("a");
+    FieldSubject aFieldSubject = iClassSubject.uniqueFieldWithOriginalName("a");
     assertThat(aFieldSubject, isPresent());
 
     // Interface fields are visited/renamed before fields on classes. Thus, the interface field I.a
@@ -93,7 +93,7 @@
     ClassSubject jClassSubject = inspector.clazz(J.class);
     assertThat(jClassSubject, isPresent());
 
-    FieldSubject f1FieldSubject = jClassSubject.uniqueFieldWithName("f1");
+    FieldSubject f1FieldSubject = jClassSubject.uniqueFieldWithOriginalName("f1");
     assertThat(f1FieldSubject, isPresent());
     assertThat(f1FieldSubject, isPresentAndRenamed());
     assertEquals("b", f1FieldSubject.getFinalName());
@@ -101,7 +101,7 @@
     ClassSubject aClassSubject = inspector.clazz(A.class);
     assertThat(aClassSubject, isPresent());
 
-    FieldSubject f2FieldSubject = aClassSubject.uniqueFieldWithName("f2");
+    FieldSubject f2FieldSubject = aClassSubject.uniqueFieldWithOriginalName("f2");
     assertThat(f2FieldSubject, isPresent());
     assertThat(f2FieldSubject, isPresentAndRenamed());
     assertEquals("c", f2FieldSubject.getFinalName());
diff --git a/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingKeepPrecedenceTest.java b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingKeepPrecedenceTest.java
index 3d4b859..b0f1a96 100644
--- a/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingKeepPrecedenceTest.java
+++ b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingKeepPrecedenceTest.java
@@ -104,10 +104,10 @@
               ClassSubject clazzB = codeInspector.clazz(B.class);
               assertTrue(clazzB.isPresent());
               assertTrue(clazzB.isRenamed());
-              FieldSubject foo = clazzB.uniqueFieldWithName("foo");
+              FieldSubject foo = clazzB.uniqueFieldWithOriginalName("foo");
               assertTrue(foo.isPresent());
               assertFalse(foo.isRenamed());
-              MethodSubject bar = clazzB.uniqueMethodWithName("bar");
+              MethodSubject bar = clazzB.uniqueMethodWithOriginalName("bar");
               assertTrue(bar.isPresent());
               assertFalse(bar.isRenamed());
             });
diff --git a/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingLibraryMemberRenamingTests.java b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingLibraryMemberRenamingTests.java
index 26873f4..2657ae8 100644
--- a/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingLibraryMemberRenamingTests.java
+++ b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingLibraryMemberRenamingTests.java
@@ -84,7 +84,7 @@
                 codeInspector -> {
                   ClassSubject clazz = codeInspector.clazz(Interface.class);
                   assertThat(clazz, isPresent());
-                  MethodSubject computeSubject = clazz.uniqueMethodWithName("compute");
+                  MethodSubject computeSubject = clazz.uniqueMethodWithOriginalName("compute");
                   assertThat(computeSubject, isPresent());
                   assertTrue(computeSubject.isRenamed());
                 });
diff --git a/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingMinificationTest.java b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingMinificationTest.java
index f527ead..afb0b75 100644
--- a/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingMinificationTest.java
+++ b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingMinificationTest.java
@@ -113,19 +113,19 @@
                   ClassSubject clazzA = inspector.clazz(A.class);
                   assertThat(clazzA, isPresent());
                   assertEquals("a", clazzA.getFinalName());
-                  FieldSubject fieldA = clazzA.uniqueFieldWithName("fieldA");
+                  FieldSubject fieldA = clazzA.uniqueFieldWithOriginalName("fieldA");
                   assertThat(fieldA, isPresent());
                   assertEquals("a", fieldA.getFinalName());
-                  MethodSubject methodA = clazzA.uniqueMethodWithName("methodA");
+                  MethodSubject methodA = clazzA.uniqueMethodWithOriginalName("methodA");
                   assertThat(methodA, isPresent());
                   assertEquals("a", methodA.getFinalName());
-                  FieldSubject fieldB = clazzA.uniqueFieldWithName("fieldB");
+                  FieldSubject fieldB = clazzA.uniqueFieldWithOriginalName("fieldB");
                   assertThat(fieldB, isPresent());
                   assertTrue(fieldB.isRenamed());
-                  MethodSubject methodB = clazzA.uniqueMethodWithName("methodB");
+                  MethodSubject methodB = clazzA.uniqueMethodWithOriginalName("methodB");
                   assertThat(methodB, isPresent());
                   assertTrue(methodB.isRenamed());
-                  MethodSubject methodC = clazzA.uniqueMethodWithName("methodC");
+                  MethodSubject methodC = clazzA.uniqueMethodWithOriginalName("methodC");
                   assertThat(methodC, isPresent());
                   assertFalse(methodC.isRenamed());
                 });
diff --git a/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingRepackagingTest.java b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingRepackagingTest.java
index afa76f5..8b4f4e3 100644
--- a/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingRepackagingTest.java
+++ b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingRepackagingTest.java
@@ -103,14 +103,14 @@
                   ClassSubject clazzA = inspector.clazz(A.class);
                   assertThat(clazzA, isPresent());
                   assertEquals("baz", clazzA.getFinalName());
-                  FieldSubject fieldA = clazzA.uniqueFieldWithName("fieldA");
+                  FieldSubject fieldA = clazzA.uniqueFieldWithOriginalName("fieldA");
                   assertThat(fieldA, isPresent());
                   assertEquals("foo", fieldA.getFinalName());
-                  MethodSubject methodA = clazzA.uniqueMethodWithName("methodA");
+                  MethodSubject methodA = clazzA.uniqueMethodWithOriginalName("methodA");
                   assertThat(methodA, isPresent());
                   assertEquals("bar", methodA.getFinalName());
-                  assertThat(clazzA.uniqueFieldWithName("fieldB"), isPresentAndRenamed());
-                  assertThat(clazzA.uniqueMethodWithName("methodB"), isPresentAndRenamed());
+                  assertThat(clazzA.uniqueFieldWithOriginalName("fieldB"), isPresentAndRenamed());
+                  assertThat(clazzA.uniqueMethodWithOriginalName("methodB"), isPresentAndRenamed());
                 });
     // Ensure that the proguard map is extended with all the new minified names.
     for (String pgLine : pgMap) {
diff --git a/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingSignatureTest.java b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingSignatureTest.java
index 40ba160..5db4da0 100644
--- a/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/naming/applymapping/ApplyMappingSignatureTest.java
@@ -65,7 +65,7 @@
             inspector -> {
               ClassSubject clazz = inspector.clazz(SignatureTest.class);
               assertThat(clazz, isPresent());
-              FieldSubject field = clazz.uniqueFieldWithName("field");
+              FieldSubject field = clazz.uniqueFieldWithOriginalName("field");
               assertThat(field, isPresent());
               assertThat(field.getFinalSignatureAttribute(), containsString("foo"));
             });
diff --git a/src/test/java/com/android/tools/r8/naming/applymapping/sourcelibrary/InnerEnumValuesTest.java b/src/test/java/com/android/tools/r8/naming/applymapping/sourcelibrary/InnerEnumValuesTest.java
index d195bd3..4eb4585 100644
--- a/src/test/java/com/android/tools/r8/naming/applymapping/sourcelibrary/InnerEnumValuesTest.java
+++ b/src/test/java/com/android/tools/r8/naming/applymapping/sourcelibrary/InnerEnumValuesTest.java
@@ -74,10 +74,10 @@
         .inspector();
     ClassSubject enumSubject = inspector.clazz(RENAMED_NAME);
     assertThat(enumSubject, isPresent());
-    FieldSubject fieldX = enumSubject.uniqueFieldWithName("STATE_A");
+    FieldSubject fieldX = enumSubject.uniqueFieldWithOriginalName("STATE_A");
     assertThat(fieldX, isPresent());
     assertEquals("state_X", fieldX.getFinalName());
-    FieldSubject fieldY = enumSubject.uniqueFieldWithName("STATE_B");
+    FieldSubject fieldY = enumSubject.uniqueFieldWithOriginalName("STATE_B");
     assertThat(fieldY, isPresent());
     assertEquals("state_Y", fieldY.getFinalName());
   }
diff --git a/src/test/java/com/android/tools/r8/naming/b123068484/FieldRenamingTest.java b/src/test/java/com/android/tools/r8/naming/b123068484/FieldRenamingTest.java
index 968123a..48ae678 100644
--- a/src/test/java/com/android/tools/r8/naming/b123068484/FieldRenamingTest.java
+++ b/src/test/java/com/android/tools/r8/naming/b123068484/FieldRenamingTest.java
@@ -75,8 +75,10 @@
   }
 
   private void inspect(CodeInspector inspector) {
-    FieldSubject fld = inspector.clazz(CONCRETE1.getTypeName().replace("Concrete1", "Abs"))
-        .uniqueFieldWithName("strField");
+    FieldSubject fld =
+        inspector
+            .clazz(CONCRETE1.getTypeName().replace("Concrete1", "Abs"))
+            .uniqueFieldWithOriginalName("strField");
     assertThat(fld, isPresent());
 
     ClassSubject main = inspector.clazz(MAIN);
diff --git a/src/test/java/com/android/tools/r8/naming/b126592786/B126592786.java b/src/test/java/com/android/tools/r8/naming/b126592786/B126592786.java
index fb9c53e..3e4d30f 100644
--- a/src/test/java/com/android/tools/r8/naming/b126592786/B126592786.java
+++ b/src/test/java/com/android/tools/r8/naming/b126592786/B126592786.java
@@ -64,7 +64,7 @@
                 genericTypeDescriptor = genericType.getFinalDescriptor();
               }
               String expectedSignature = "Ljava/util/List<" + genericTypeDescriptor + ">;";
-              FieldSubject list = inspector.clazz(A.class).uniqueFieldWithName("list");
+              FieldSubject list = inspector.clazz(A.class).uniqueFieldWithOriginalName("list");
               assertThat(list, isPresent());
               assertEquals(expectedSignature, list.getFinalSignatureAttribute());
             })
diff --git a/src/test/java/com/android/tools/r8/naming/b128656974/B128656974.java b/src/test/java/com/android/tools/r8/naming/b128656974/B128656974.java
index 0add817..24fd0b2 100644
--- a/src/test/java/com/android/tools/r8/naming/b128656974/B128656974.java
+++ b/src/test/java/com/android/tools/r8/naming/b128656974/B128656974.java
@@ -39,7 +39,7 @@
             inspector -> {
               ClassSubject greetingBase = inspector.clazz(Greeting.getGreetingBase());
               assertThat(greetingBase, isPresent());
-              FieldSubject greeting = greetingBase.uniqueFieldWithName("greeting");
+              FieldSubject greeting = greetingBase.uniqueFieldWithOriginalName("greeting");
               assertThat(greeting, isPresentAndRenamed());
               assertNotEquals("a", greeting.getFinalName());
             });
@@ -86,7 +86,7 @@
             inspector -> {
               ClassSubject base = inspector.clazz(TestClassBase.class);
               assertThat(base, isPresent());
-              MethodSubject foo = base.uniqueMethodWithName("foo");
+              MethodSubject foo = base.uniqueMethodWithOriginalName("foo");
               assertThat(foo, isPresentAndRenamed());
               assertNotEquals("a", foo.getFinalName());
             });
diff --git a/src/test/java/com/android/tools/r8/naming/b130791310/B130791310.java b/src/test/java/com/android/tools/r8/naming/b130791310/B130791310.java
index ad2f639..ba6fab5 100644
--- a/src/test/java/com/android/tools/r8/naming/b130791310/B130791310.java
+++ b/src/test/java/com/android/tools/r8/naming/b130791310/B130791310.java
@@ -110,7 +110,7 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject holder = inspector.clazz(SomeLogic.class);
     assertThat(holder, isPresentAndNotRenamed());
-    MethodSubject someMethod = holder.uniqueMethodWithName("someMethod");
+    MethodSubject someMethod = holder.uniqueMethodWithOriginalName("someMethod");
     assertThat(someMethod, isPresentAndNotRenamed());
   }
 
diff --git a/src/test/java/com/android/tools/r8/naming/b133686361/AlreadyRenamedAbstractMethodRenamingTest.java b/src/test/java/com/android/tools/r8/naming/b133686361/AlreadyRenamedAbstractMethodRenamingTest.java
index 8d07717..a987575 100644
--- a/src/test/java/com/android/tools/r8/naming/b133686361/AlreadyRenamedAbstractMethodRenamingTest.java
+++ b/src/test/java/com/android/tools/r8/naming/b133686361/AlreadyRenamedAbstractMethodRenamingTest.java
@@ -92,18 +92,18 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject base = inspector.clazz(Base.class);
     assertThat(base, isPresentAndRenamed());
-    MethodSubject a = base.uniqueMethodWithName("a");
+    MethodSubject a = base.uniqueMethodWithOriginalName("a");
     assertThat(a, isPresentAndNotRenamed());
 
     ClassSubject sub1 = inspector.clazz(Sub1.class);
     assertThat(sub1, isPresentAndRenamed());
-    MethodSubject aInSub1 = sub1.uniqueMethodWithName("a");
+    MethodSubject aInSub1 = sub1.uniqueMethodWithOriginalName("a");
     assertThat(aInSub1, isPresentAndNotRenamed());
     assertEquals(a.getFinalName(), aInSub1.getFinalName());
 
     ClassSubject sub2 = inspector.clazz(Sub1.class);
     assertThat(sub2, isPresentAndRenamed());
-    MethodSubject aInSub2 = sub2.uniqueMethodWithName("a");
+    MethodSubject aInSub2 = sub2.uniqueMethodWithOriginalName("a");
     assertThat(aInSub2, isPresentAndNotRenamed());
     assertEquals(a.getFinalName(), aInSub2.getFinalName());
   }
diff --git a/src/test/java/com/android/tools/r8/naming/b173184123/ClassExtendsInterfaceNamingTest.java b/src/test/java/com/android/tools/r8/naming/b173184123/ClassExtendsInterfaceNamingTest.java
index 470b542..2de209b 100644
--- a/src/test/java/com/android/tools/r8/naming/b173184123/ClassExtendsInterfaceNamingTest.java
+++ b/src/test/java/com/android/tools/r8/naming/b173184123/ClassExtendsInterfaceNamingTest.java
@@ -11,7 +11,6 @@
 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.ToolHelper;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.ZipUtils.ZipBuilder;
@@ -50,9 +49,7 @@
                 .setSuper(DescriptorUtils.javaTypeToDescriptor(Interface.class.getTypeName()))
                 .transform())
         .build();
-    testForExternalR8(
-            parameters.getBackend(),
-            parameters.isCfRuntime() ? parameters.getRuntime() : TestRuntime.getCheckedInJdk11())
+    testForExternalR8(parameters.getBackend())
         .addProgramFiles(classFiles)
         .addTestingAnnotationsAsProgramClasses()
         .enableAssertions(false)
diff --git a/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java b/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java
index 8771ff4..ffdda98 100644
--- a/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java
+++ b/src/test/java/com/android/tools/r8/naming/b72391662/B72391662.java
@@ -142,7 +142,7 @@
     assertThat(testClass, isPresent());
 
     // Test the totally unused method.
-    MethodSubject staticMethod = testClass.uniqueMethodWithName("unused");
+    MethodSubject staticMethod = testClass.uniqueMethodWithOriginalName("unused");
     assertThat(staticMethod, isPresent());
     assertEquals(minify, staticMethod.isRenamed());
     if (shrinker.isR8()) {
@@ -152,7 +152,7 @@
     }
 
     // Test an indirectly referred method.
-    staticMethod = testClass.uniqueMethodWithName("staticMethod");
+    staticMethod = testClass.uniqueMethodWithOriginalName("staticMethod");
     assertThat(staticMethod, isPresent());
     assertEquals(minify, staticMethod.isRenamed());
     boolean publicizeCondition = shrinker.isR8() ? allowAccessModification
@@ -193,7 +193,7 @@
     assertThat(testClass, isPresent());
 
     // Test the totally unused method.
-    MethodSubject staticMethod = testClass.uniqueMethodWithName("unused");
+    MethodSubject staticMethod = testClass.uniqueMethodWithOriginalName("unused");
     assertThat(staticMethod, isPresent());
     assertEquals(minify, staticMethod.isRenamed());
     if (shrinker.isR8()) {
@@ -203,7 +203,7 @@
     }
 
     // Test an indirectly referred method.
-    staticMethod = testClass.uniqueMethodWithName("staticMethod");
+    staticMethod = testClass.uniqueMethodWithOriginalName("staticMethod");
     assertThat(staticMethod, isPresent());
     assertEquals(minify, staticMethod.isRenamed());
     boolean publicizeCondition = shrinker.isR8() ? allowAccessModification
@@ -259,11 +259,11 @@
     assertThat(testClass, isPresent());
 
     // Test the totally unused method.
-    MethodSubject staticMethod = testClass.uniqueMethodWithName("unused");
+    MethodSubject staticMethod = testClass.uniqueMethodWithOriginalName("unused");
     assertThat(staticMethod, not(isPresent()));
 
     // Test an indirectly referred method.
-    staticMethod = testClass.uniqueMethodWithName("staticMethod");
+    staticMethod = testClass.uniqueMethodWithOriginalName("staticMethod");
     assertThat(staticMethod, isPresent());
     assertEquals(minify, staticMethod.isRenamed());
     boolean publicizeCondition = shrinker.isR8() ? allowAccessModification
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 b07255b..db9020d 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
@@ -62,7 +62,7 @@
         .inspectStackTrace(
             (stackTrace, inspector) -> {
               MethodSubject methodSubject =
-                  inspector.clazz(Main.class).uniqueMethodWithName("call");
+                  inspector.clazz(Main.class).uniqueMethodWithOriginalName("call");
               assertThat(methodSubject, isPresent());
               List<InstructionSubject> getClassCalls =
                   methodSubject
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 b005549..8362ed6 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
@@ -65,7 +65,7 @@
                 inspector -> {
                   ClassSubject fooClass = inspector.clazz(Foo.class);
                   assertThat(fooClass, isPresent());
-                  MethodSubject inlineable = fooClass.uniqueMethodWithName("inlineable");
+                  MethodSubject inlineable = fooClass.uniqueMethodWithOriginalName("inlineable");
                   assertThat(inlineable, not(isPresent()));
                 });
     compileResult
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/RetraceInlineeWithNoSuchMethodErrorTest.java b/src/test/java/com/android/tools/r8/naming/retrace/RetraceInlineeWithNoSuchMethodErrorTest.java
index f3718cd..a68715a 100644
--- a/src/test/java/com/android/tools/r8/naming/retrace/RetraceInlineeWithNoSuchMethodErrorTest.java
+++ b/src/test/java/com/android/tools/r8/naming/retrace/RetraceInlineeWithNoSuchMethodErrorTest.java
@@ -99,7 +99,7 @@
           ClassSubject fooClass = codeInspector.clazz(Foo.class);
           assertThat(fooClass, isPresent());
           // We are not inlining this because resolution fails
-          assertThat(fooClass.uniqueMethodWithName("inlinable"), isPresent());
+          assertThat(fooClass.uniqueMethodWithOriginalName("inlinable"), isPresent());
         });
   }
 
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/RetraceInlineeWithNullCheckInlinedTest.java b/src/test/java/com/android/tools/r8/naming/retrace/RetraceInlineeWithNullCheckInlinedTest.java
index 99531f1..90552b3 100644
--- a/src/test/java/com/android/tools/r8/naming/retrace/RetraceInlineeWithNullCheckInlinedTest.java
+++ b/src/test/java/com/android/tools/r8/naming/retrace/RetraceInlineeWithNullCheckInlinedTest.java
@@ -67,7 +67,7 @@
             (stackTrace, inspector) -> {
               ClassSubject callerClass = inspector.clazz(Caller.class);
               assertThat(callerClass, isPresent());
-              MethodSubject outerCaller = callerClass.uniqueMethodWithName("outerCaller");
+              MethodSubject outerCaller = callerClass.uniqueMethodWithOriginalName("outerCaller");
               assertThat(outerCaller, isPresentAndRenamed());
               assertThat(stackTrace, isSame(expectedStackTrace));
             });
diff --git a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagationToClassesOutsideLowerBoundTest.java b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagationToClassesOutsideLowerBoundTest.java
index 1e2140c..f8ad999 100644
--- a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagationToClassesOutsideLowerBoundTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/ArgumentPropagationToClassesOutsideLowerBoundTest.java
@@ -43,7 +43,8 @@
         .compile()
         .inspect(
             inspector -> {
-              MethodSubject aMethodSubject = inspector.clazz(A.class).uniqueMethodWithName("m");
+              MethodSubject aMethodSubject =
+                  inspector.clazz(A.class).uniqueMethodWithOriginalName("m");
               assertThat(aMethodSubject, isPresent());
               assertTrue(
                   aMethodSubject
@@ -55,7 +56,8 @@
                       .anyMatch(instruction -> instruction.isConstString("A: Null")));
 
               // TODO(b/190154391): B.m() is always called with non-null.
-              MethodSubject bMethodSubject = inspector.clazz(B.class).uniqueMethodWithName("m");
+              MethodSubject bMethodSubject =
+                  inspector.clazz(B.class).uniqueMethodWithOriginalName("m");
               assertThat(bMethodSubject, isPresent());
               assertTrue(
                   bMethodSubject
@@ -67,7 +69,8 @@
                       .anyMatch(instruction -> instruction.isConstString("B: Null")));
 
               // TODO(b/190154391): C.m() is always called with null.
-              MethodSubject cMethodSubject = inspector.clazz(C.class).uniqueMethodWithName("m");
+              MethodSubject cMethodSubject =
+                  inspector.clazz(C.class).uniqueMethodWithOriginalName("m");
               assertThat(cMethodSubject, isPresent());
               assertTrue(
                   cMethodSubject
diff --git a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/CheckNotZeroMethodWithArgumentRemovalTest.java b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/CheckNotZeroMethodWithArgumentRemovalTest.java
index 20b82f0..cef5521 100644
--- a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/CheckNotZeroMethodWithArgumentRemovalTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/CheckNotZeroMethodWithArgumentRemovalTest.java
@@ -48,7 +48,7 @@
               assertThat(mainClassSubject, isPresent());
 
               MethodSubject checkNotNullSubject =
-                  mainClassSubject.uniqueMethodWithName("checkNotNull");
+                  mainClassSubject.uniqueMethodWithOriginalName("checkNotNull");
               assertThat(checkNotNullSubject, isPresent());
               assertEquals(1, checkNotNullSubject.getProgramMethod().getReference().getArity());
             })
diff --git a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/CompanionConstructorShakingTest.java b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/CompanionConstructorShakingTest.java
index a728f8c..023b012 100644
--- a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/CompanionConstructorShakingTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/CompanionConstructorShakingTest.java
@@ -51,7 +51,7 @@
               assertThat(hostClassSubject, isPresent());
               assertEquals(1, hostClassSubject.allMethods().size());
               assertThat(hostClassSubject.clinit(), isAbsent());
-              assertThat(hostClassSubject.uniqueMethodWithName("keepHost"), isPresent());
+              assertThat(hostClassSubject.uniqueMethodWithOriginalName("keepHost"), isPresent());
 
               ClassSubject companionClassSubject = inspector.clazz(Host.Companion.class);
               assertThat(companionClassSubject, isPresent());
@@ -59,7 +59,7 @@
               assertThat(companionClassSubject.init(), isAbsent());
 
               MethodSubject greetMethodSubject =
-                  companionClassSubject.uniqueMethodWithName("greet");
+                  companionClassSubject.uniqueMethodWithOriginalName("greet");
               assertThat(greetMethodSubject, isStatic());
             })
         .run(parameters.getRuntime(), Main.class)
diff --git a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/ConstantReturnAfterArgumentPropagationTest.java b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/ConstantReturnAfterArgumentPropagationTest.java
index 3e410db..d1f817a 100644
--- a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/ConstantReturnAfterArgumentPropagationTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/ConstantReturnAfterArgumentPropagationTest.java
@@ -47,7 +47,7 @@
               assertThat(mainClassSubject, isPresent());
 
               MethodSubject identityMethodSubject =
-                  mainClassSubject.uniqueMethodWithName("identity");
+                  mainClassSubject.uniqueMethodWithOriginalName("identity");
               assertThat(identityMethodSubject, isPresent());
               assertTrue(identityMethodSubject.getProgramMethod().getParameters().isEmpty());
               assertTrue(identityMethodSubject.getProgramMethod().getReturnType().isVoidType());
diff --git a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/ConstantUnboxedEnumArgumentTest.java b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/ConstantUnboxedEnumArgumentTest.java
index 562c3b5..23b1aa9 100644
--- a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/ConstantUnboxedEnumArgumentTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/ConstantUnboxedEnumArgumentTest.java
@@ -56,7 +56,8 @@
                       .streamInstructions()
                       .noneMatch(InstructionSubject::isStaticGet));
 
-              MethodSubject testMethodSubject = mainClassSubject.uniqueMethodWithName("test");
+              MethodSubject testMethodSubject =
+                  mainClassSubject.uniqueMethodWithOriginalName("test");
               assertThat(testMethodSubject, isPresent());
               assertEquals(0, testMethodSubject.getProgramMethod().getReference().getArity());
               assertTrue(
diff --git a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/EffectivelyFinalCompanionMethodsTest.java b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/EffectivelyFinalCompanionMethodsTest.java
index 86ab638..dc9b490 100644
--- a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/EffectivelyFinalCompanionMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/EffectivelyFinalCompanionMethodsTest.java
@@ -53,10 +53,10 @@
               ClassSubject companionClassSubject = inspector.clazz(Host.Companion.class);
               assertThat(companionClassSubject, isPresent());
               assertEquals(4, companionClassSubject.allMethods().size());
-              assertThat(companionClassSubject.uniqueMethodWithName("foo"), isStatic());
-              assertThat(companionClassSubject.uniqueMethodWithName("bar"), isStatic());
-              assertThat(companionClassSubject.uniqueMethodWithName("baz"), isStatic());
-              assertThat(companionClassSubject.uniqueMethodWithName("qux"), isStatic());
+              assertThat(companionClassSubject.uniqueMethodWithOriginalName("foo"), isStatic());
+              assertThat(companionClassSubject.uniqueMethodWithOriginalName("bar"), isStatic());
+              assertThat(companionClassSubject.uniqueMethodWithOriginalName("baz"), isStatic());
+              assertThat(companionClassSubject.uniqueMethodWithOriginalName("qux"), isStatic());
             })
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("Foo!", "Bar!", "Baz!", "Qux!", "Baz!");
diff --git a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/MixedArgumentRemovalAndEnumUnboxingTest.java b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/MixedArgumentRemovalAndEnumUnboxingTest.java
index 65c3ce8..7daf43b 100644
--- a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/MixedArgumentRemovalAndEnumUnboxingTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/MixedArgumentRemovalAndEnumUnboxingTest.java
@@ -56,7 +56,8 @@
                       .streamInstructions()
                       .noneMatch(InstructionSubject::isConstNull));
 
-              MethodSubject testMethodSubject = mainClassSubject.uniqueMethodWithName("test");
+              MethodSubject testMethodSubject =
+                  mainClassSubject.uniqueMethodWithOriginalName("test");
               assertThat(testMethodSubject, isPresent());
               assertEquals(2, testMethodSubject.getProgramMethod().getReference().getArity());
               assertEquals(
diff --git a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/MonomorphicMethodWithUnusedReturnValueTest.java b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/MonomorphicMethodWithUnusedReturnValueTest.java
index 0df2eff..0e32f15 100644
--- a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/MonomorphicMethodWithUnusedReturnValueTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/MonomorphicMethodWithUnusedReturnValueTest.java
@@ -45,7 +45,7 @@
             inspector -> {
               // The test() method has been changed to have return type void.
               MethodSubject testMethodSubject =
-                  inspector.clazz(Main.class).uniqueMethodWithName("test");
+                  inspector.clazz(Main.class).uniqueMethodWithOriginalName("test");
               assertThat(testMethodSubject, isPresent());
               assertTrue(testMethodSubject.getProgramMethod().getReturnType().isVoidType());
 
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 bca23cb..25af8f6 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
@@ -49,7 +49,7 @@
         .inspect(
             inspector -> {
               MethodSubject companionMethodSubject =
-                  inspector.clazz(Host.Companion.class).uniqueMethodWithName("greet");
+                  inspector.clazz(Host.Companion.class).uniqueMethodWithOriginalName("greet");
               assertThat(companionMethodSubject, isStatic());
 
               MethodSubject mainMethodSubject = inspector.clazz(Main.class).mainMethod();
diff --git a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/ParameterTypeStrengtheningTest.java b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/ParameterTypeStrengtheningTest.java
index 42d8535..10324b8 100644
--- a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/ParameterTypeStrengtheningTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/ParameterTypeStrengtheningTest.java
@@ -57,14 +57,16 @@
               assertThat(bClassSubject, isPresent());
 
               // Method testA(I) should be rewritten to testA(A).
-              MethodSubject testAMethodSubject = mainClassSubject.uniqueMethodWithName("testA");
+              MethodSubject testAMethodSubject =
+                  mainClassSubject.uniqueMethodWithOriginalName("testA");
               assertThat(testAMethodSubject, isPresent());
               assertEquals(
                   aClassSubject.getFinalName(),
                   testAMethodSubject.getProgramMethod().getParameter(0).getTypeName());
 
               // Method testB(I) should be rewritten to testB(B).
-              MethodSubject testBMethodSubject = mainClassSubject.uniqueMethodWithName("testB");
+              MethodSubject testBMethodSubject =
+                  mainClassSubject.uniqueMethodWithOriginalName("testB");
               assertThat(testBMethodSubject, isPresent());
               assertEquals(
                   bClassSubject.getFinalName(),
diff --git a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/PolymorphicMethodWithUnusedReturnValueTest.java b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/PolymorphicMethodWithUnusedReturnValueTest.java
index fcf44bb..b38703a 100644
--- a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/PolymorphicMethodWithUnusedReturnValueTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/PolymorphicMethodWithUnusedReturnValueTest.java
@@ -47,7 +47,8 @@
             inspector -> {
               // The test() methods have been changed to have return type void.
               for (Class<?> clazz : new Class<?>[] {A.class, B.class}) {
-                MethodSubject testMethodSubject = inspector.clazz(clazz).uniqueMethodWithName("m");
+                MethodSubject testMethodSubject =
+                    inspector.clazz(clazz).uniqueMethodWithOriginalName("m");
                 assertThat(testMethodSubject, isPresent());
                 assertTrue(testMethodSubject.getProgramMethod().getReturnType().isVoidType());
               }
diff --git a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/ReturnTypeStrengtheningTest.java b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/ReturnTypeStrengtheningTest.java
index b1faa74..d8d8797 100644
--- a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/ReturnTypeStrengtheningTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/ReturnTypeStrengtheningTest.java
@@ -56,14 +56,15 @@
               assertThat(aClassSubject, isPresent());
 
               // Return type of get() should be strengthened to A.
-              MethodSubject getMethodSubject = mainClassSubject.uniqueMethodWithName("get");
+              MethodSubject getMethodSubject = mainClassSubject.uniqueMethodWithOriginalName("get");
               assertThat(getMethodSubject, isPresent());
               assertEquals(
                   aClassSubject.getFinalName(),
                   getMethodSubject.getProgramMethod().getReturnType().getTypeName());
 
               // Method consume(I) should be rewritten to consume(A).
-              MethodSubject testBMethodSubject = mainClassSubject.uniqueMethodWithName("consume");
+              MethodSubject testBMethodSubject =
+                  mainClassSubject.uniqueMethodWithOriginalName("consume");
               assertThat(testBMethodSubject, isPresent());
               assertEquals(
                   aClassSubject.getFinalName(),
diff --git a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/StaticMethodWithConstantArgumentTest.java b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/StaticMethodWithConstantArgumentTest.java
index cee9ab5..e6e00cb 100644
--- a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/StaticMethodWithConstantArgumentTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/StaticMethodWithConstantArgumentTest.java
@@ -50,13 +50,14 @@
               assertThat(mainClassSubject, isPresent());
 
               // The test() method has been optimized.
-              MethodSubject testMethodSubject = mainClassSubject.uniqueMethodWithName("test");
+              MethodSubject testMethodSubject =
+                  mainClassSubject.uniqueMethodWithOriginalName("test");
               assertThat(testMethodSubject, isPresent());
               assertEquals(0, testMethodSubject.getProgramMethod().getParameters().size());
               assertTrue(
                   testMethodSubject.streamInstructions().noneMatch(InstructionSubject::isIf));
 
-              assertThat(mainClassSubject.uniqueMethodWithName("dead"), isAbsent());
+              assertThat(mainClassSubject.uniqueMethodWithOriginalName("dead"), isAbsent());
             })
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("Hello", "Hello", "Hello");
diff --git a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/StaticMethodWithConstantArgumentThroughCallChainTest.java b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/StaticMethodWithConstantArgumentThroughCallChainTest.java
index 1764b30..86a584a 100644
--- a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/StaticMethodWithConstantArgumentThroughCallChainTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/StaticMethodWithConstantArgumentThroughCallChainTest.java
@@ -51,14 +51,15 @@
 
               // The test1(), test2(), and test3() methods have been optimized.
               for (int i = 1; i <= 3; i++) {
-                MethodSubject testMethodSubject = mainClassSubject.uniqueMethodWithName("test" + i);
+                MethodSubject testMethodSubject =
+                    mainClassSubject.uniqueMethodWithOriginalName("test" + i);
                 assertThat(testMethodSubject, isPresent());
                 assertEquals(0, testMethodSubject.getProgramMethod().getParameters().size());
                 assertTrue(
                     testMethodSubject.streamInstructions().noneMatch(InstructionSubject::isIf));
               }
 
-              assertThat(mainClassSubject.uniqueMethodWithName("dead"), isAbsent());
+              assertThat(mainClassSubject.uniqueMethodWithOriginalName("dead"), isAbsent());
             })
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines(
diff --git a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/UnboxedEnumUserInMethodWithConstantArgumentTest.java b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/UnboxedEnumUserInMethodWithConstantArgumentTest.java
index dd93e33..4e857f5 100644
--- a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/UnboxedEnumUserInMethodWithConstantArgumentTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/UnboxedEnumUserInMethodWithConstantArgumentTest.java
@@ -56,7 +56,8 @@
                       .streamInstructions()
                       .noneMatch(InstructionSubject::isConstNumber));
 
-              MethodSubject testMethodSubject = mainClassSubject.uniqueMethodWithName("test");
+              MethodSubject testMethodSubject =
+                  mainClassSubject.uniqueMethodWithOriginalName("test");
               assertThat(testMethodSubject, isPresent());
               assertEquals(0, testMethodSubject.getProgramMethod().getReference().getArity());
             })
diff --git a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/UpwardsArgumentPropagationToResolvedMethodTest.java b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/UpwardsArgumentPropagationToResolvedMethodTest.java
index 993ca6b..a756ee3 100644
--- a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/UpwardsArgumentPropagationToResolvedMethodTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/UpwardsArgumentPropagationToResolvedMethodTest.java
@@ -53,7 +53,7 @@
             inspector -> {
               ClassSubject aClassSubject = inspector.clazz(A.class);
               assertThat(aClassSubject, isPresent());
-              MethodSubject aMethodSubject = aClassSubject.uniqueMethodWithName("m");
+              MethodSubject aMethodSubject = aClassSubject.uniqueMethodWithOriginalName("m");
               assertThat(aMethodSubject, isPresent());
               assertEquals(0, aMethodSubject.getProgramMethod().getReference().getArity());
               assertTrue(
@@ -63,7 +63,8 @@
 
               ClassSubject aSub1ClassSubject = inspector.clazz(ASub1.class);
               assertThat(aSub1ClassSubject, isPresent());
-              MethodSubject aSub1MethodSubject = aSub1ClassSubject.uniqueMethodWithName("m");
+              MethodSubject aSub1MethodSubject =
+                  aSub1ClassSubject.uniqueMethodWithOriginalName("m");
               assertThat(aSub1MethodSubject, isPresent());
               assertEquals(0, aSub1MethodSubject.getProgramMethod().getReference().getArity());
               assertTrue(
@@ -74,7 +75,7 @@
               ClassSubject aSub2Sub1ClassSubject = inspector.clazz(ASub2Sub1.class);
               assertThat(aSub2Sub1ClassSubject, isPresent());
               MethodSubject aSub2Sub1MethodSubject =
-                  aSub2Sub1ClassSubject.uniqueMethodWithName("m");
+                  aSub2Sub1ClassSubject.uniqueMethodWithOriginalName("m");
               assertThat(aSub2Sub1MethodSubject, isPresent());
               assertEquals(0, aSub2Sub1MethodSubject.getProgramMethod().getReference().getArity());
               assertTrue(
diff --git a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/UpwardsInterfacePropagationToUnrelatedMethodTest.java b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/UpwardsInterfacePropagationToUnrelatedMethodTest.java
index 25ce6a4..44b319b 100644
--- a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/UpwardsInterfacePropagationToUnrelatedMethodTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/UpwardsInterfacePropagationToUnrelatedMethodTest.java
@@ -46,7 +46,8 @@
         .compile()
         .inspect(
             inspector -> {
-              MethodSubject aMethodSubject = inspector.clazz(A.class).uniqueMethodWithName("m");
+              MethodSubject aMethodSubject =
+                  inspector.clazz(A.class).uniqueMethodWithOriginalName("m");
               assertThat(aMethodSubject, isPresent());
               assertTrue(
                   aMethodSubject
@@ -57,7 +58,8 @@
                       .streamInstructions()
                       .anyMatch(instruction -> instruction.isConstString("A: Null")));
 
-              MethodSubject b2MethodSubject = inspector.clazz(B2.class).uniqueMethodWithName("m");
+              MethodSubject b2MethodSubject =
+                  inspector.clazz(B2.class).uniqueMethodWithOriginalName("m");
               assertThat(b2MethodSubject, isPresent());
               assertTrue(
                   b2MethodSubject
@@ -68,7 +70,8 @@
                       .streamInstructions()
                       .noneMatch(instruction -> instruction.isConstString("B2: Null")));
 
-              MethodSubject b3MethodSubject = inspector.clazz(B3.class).uniqueMethodWithName("m");
+              MethodSubject b3MethodSubject =
+                  inspector.clazz(B3.class).uniqueMethodWithOriginalName("m");
               assertThat(b3MethodSubject, isPresent());
               assertTrue(
                   b3MethodSubject
diff --git a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/VirtualMethodWithConstantArgumentThroughSiblingInterfaceMethodTest.java b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/VirtualMethodWithConstantArgumentThroughSiblingInterfaceMethodTest.java
index e226a85..b59861c 100644
--- a/src/test/java/com/android/tools/r8/optimize/argumentpropagation/VirtualMethodWithConstantArgumentThroughSiblingInterfaceMethodTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/argumentpropagation/VirtualMethodWithConstantArgumentThroughSiblingInterfaceMethodTest.java
@@ -46,7 +46,7 @@
               for (Class<?> clazz : new Class[] {A.class, C.class}) {
                 ClassSubject aClassSubject = inspector.clazz(clazz);
                 assertThat(aClassSubject, isPresent());
-                MethodSubject aMethodSubject = aClassSubject.uniqueMethodWithName("m");
+                MethodSubject aMethodSubject = aClassSubject.uniqueMethodWithOriginalName("m");
                 assertThat(aMethodSubject, isPresent());
                 assertTrue(aMethodSubject.streamInstructions().noneMatch(InstructionSubject::isIf));
               }
diff --git a/src/test/java/com/android/tools/r8/optimize/finalize/FinalizeKeptMethodTest.java b/src/test/java/com/android/tools/r8/optimize/finalize/FinalizeKeptMethodTest.java
index 84ee636..b9b9866 100644
--- a/src/test/java/com/android/tools/r8/optimize/finalize/FinalizeKeptMethodTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/finalize/FinalizeKeptMethodTest.java
@@ -43,7 +43,8 @@
               ClassSubject aClassSubject = inspector.clazz(Main.class);
               assertThat(aClassSubject, isPresent());
               assertThat(
-                  aClassSubject.uniqueMethodWithName("m"), allOf(isPresent(), not(isFinal())));
+                  aClassSubject.uniqueMethodWithOriginalName("m"),
+                  allOf(isPresent(), not(isFinal())));
             })
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("Main.m()");
diff --git a/src/test/java/com/android/tools/r8/optimize/finalize/FinalizeVirtualMethodTest.java b/src/test/java/com/android/tools/r8/optimize/finalize/FinalizeVirtualMethodTest.java
index 115b180..5452c48 100644
--- a/src/test/java/com/android/tools/r8/optimize/finalize/FinalizeVirtualMethodTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/finalize/FinalizeVirtualMethodTest.java
@@ -47,7 +47,8 @@
             inspector -> {
               ClassSubject aClassSubject = inspector.clazz(A.class);
               assertThat(aClassSubject, isPresent());
-              assertThat(aClassSubject.uniqueMethodWithName("m"), allOf(isPresent(), isFinal()));
+              assertThat(
+                  aClassSubject.uniqueMethodWithOriginalName("m"), allOf(isPresent(), isFinal()));
             })
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("A.m()");
diff --git a/src/test/java/com/android/tools/r8/optimize/finalize/FinalizeVirtualMethodWithSiblingTest.java b/src/test/java/com/android/tools/r8/optimize/finalize/FinalizeVirtualMethodWithSiblingTest.java
index d134ecb..eb04b78 100644
--- a/src/test/java/com/android/tools/r8/optimize/finalize/FinalizeVirtualMethodWithSiblingTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/finalize/FinalizeVirtualMethodWithSiblingTest.java
@@ -49,11 +49,13 @@
               ClassSubject iClassSubject = inspector.clazz(I.class);
               assertThat(iClassSubject, isPresent());
               assertThat(
-                  iClassSubject.uniqueMethodWithName("m"), allOf(isPresent(), not(isFinal())));
+                  iClassSubject.uniqueMethodWithOriginalName("m"),
+                  allOf(isPresent(), not(isFinal())));
 
               ClassSubject aClassSubject = inspector.clazz(A.class);
               assertThat(aClassSubject, isPresent());
-              assertThat(aClassSubject.uniqueMethodWithName("m"), allOf(isPresent(), isFinal()));
+              assertThat(
+                  aClassSubject.uniqueMethodWithOriginalName("m"), allOf(isPresent(), isFinal()));
             })
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("A.m()", "C.m()");
diff --git a/src/test/java/com/android/tools/r8/optimize/finalize/FinalizeVirtualOverrideTest.java b/src/test/java/com/android/tools/r8/optimize/finalize/FinalizeVirtualOverrideTest.java
index dd316ac..a91566e 100644
--- a/src/test/java/com/android/tools/r8/optimize/finalize/FinalizeVirtualOverrideTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/finalize/FinalizeVirtualOverrideTest.java
@@ -49,16 +49,19 @@
               ClassSubject aClassSubject = inspector.clazz(A.class);
               assertThat(aClassSubject, isPresent());
               assertThat(
-                  aClassSubject.uniqueMethodWithName("m"), allOf(isPresent(), not(isFinal())));
+                  aClassSubject.uniqueMethodWithOriginalName("m"),
+                  allOf(isPresent(), not(isFinal())));
 
               ClassSubject bClassSubject = inspector.clazz(B.class);
               assertThat(bClassSubject, isPresent());
               assertThat(
-                  bClassSubject.uniqueMethodWithName("m"), allOf(isPresent(), not(isFinal())));
+                  bClassSubject.uniqueMethodWithOriginalName("m"),
+                  allOf(isPresent(), not(isFinal())));
 
               ClassSubject cClassSubject = inspector.clazz(C.class);
               assertThat(cClassSubject, isPresent());
-              assertThat(cClassSubject.uniqueMethodWithName("m"), allOf(isPresent(), isFinal()));
+              assertThat(
+                  cClassSubject.uniqueMethodWithOriginalName("m"), allOf(isPresent(), isFinal()));
             })
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("A.m()", "B.m()", "C.m()");
diff --git a/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithKeptMethodTest.java b/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithKeptMethodTest.java
index 12d62c9..e90481a 100644
--- a/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithKeptMethodTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithKeptMethodTest.java
@@ -50,13 +50,13 @@
               TypeSubject bTypeSubject = inspector.clazz(B.class).asTypeSubject();
 
               MethodSubject fooMethodSubject =
-                  inspector.clazz(Main.class).uniqueMethodWithName("foo");
+                  inspector.clazz(Main.class).uniqueMethodWithOriginalName("foo");
               assertThat(fooMethodSubject, isPresent());
               assertThat(fooMethodSubject, hasParameters(bTypeSubject, aTypeSubject));
 
               for (String methodName : new String[] {"bar", "baz"}) {
                 MethodSubject methodSubject =
-                    inspector.clazz(Main.class).uniqueMethodWithName(methodName);
+                    inspector.clazz(Main.class).uniqueMethodWithOriginalName(methodName);
                 assertThat(methodSubject, isPresent());
                 assertThat(methodSubject, hasParameters(bTypeSubject, aTypeSubject));
               }
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
index 3b8abab..21723d9 100644
--- a/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithKeptVirtualMethodTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithKeptVirtualMethodTest.java
@@ -55,12 +55,13 @@
               TypeSubject bTypeSubject = bClassSubject.asTypeSubject();
 
               // A.foo(B, A) is kept.
-              MethodSubject fooMethodSubject = aClassSubject.uniqueMethodWithName("foo");
+              MethodSubject fooMethodSubject = aClassSubject.uniqueMethodWithOriginalName("foo");
               assertThat(fooMethodSubject, isPresent());
               assertThat(fooMethodSubject, hasParameters(bTypeSubject, aTypeSubject));
 
               // B.foo(B, A) overrides kept method.
-              MethodSubject otherFooMethodSubject = bClassSubject.uniqueMethodWithName("foo");
+              MethodSubject otherFooMethodSubject =
+                  bClassSubject.uniqueMethodWithOriginalName("foo");
               assertThat(otherFooMethodSubject, isPresent());
               assertThat(otherFooMethodSubject, hasParameters(bTypeSubject, aTypeSubject));
             })
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
index 1e6a4e5..1383fef 100644
--- a/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithLibraryOverrideTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithLibraryOverrideTest.java
@@ -49,12 +49,12 @@
               TypeSubject bTypeSubject = inspector.getTypeSubject(B.class.getTypeName());
 
               MethodSubject fooMethodSubject =
-                  inspector.clazz(Main.class).uniqueMethodWithName("foo");
+                  inspector.clazz(Main.class).uniqueMethodWithOriginalName("foo");
               assertThat(fooMethodSubject, isPresent());
               assertThat(fooMethodSubject, hasParameters(bTypeSubject, aTypeSubject));
 
               MethodSubject libraryOverrideMethodSubject =
-                  inspector.clazz(Program.class).uniqueMethodWithName("m");
+                  inspector.clazz(Program.class).uniqueMethodWithOriginalName("m");
               assertThat(libraryOverrideMethodSubject, isPresent());
               assertThat(libraryOverrideMethodSubject, hasParameters(bTypeSubject, aTypeSubject));
             })
diff --git a/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithParameterAnnotationsTest.java b/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithParameterAnnotationsTest.java
index e4507b5..2e5098b 100644
--- a/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithParameterAnnotationsTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithParameterAnnotationsTest.java
@@ -61,7 +61,7 @@
               TypeSubject barTypeSubject = inspector.clazz(Bar.class).asTypeSubject();
 
               // Main.bar() has parameter annotations [@Bar, @Foo].
-              MethodSubject barMethodSubject = mainClassSubject.uniqueMethodWithName("bar");
+              MethodSubject barMethodSubject = mainClassSubject.uniqueMethodWithOriginalName("bar");
               assertThat(barMethodSubject, isPresent());
               assertThat(barMethodSubject, hasParameters(aTypeSubject, bTypeSubject));
               assertThat(
@@ -70,7 +70,7 @@
                       ImmutableList.of(barTypeSubject), ImmutableList.of(fooTypeSubject)));
 
               // Main.baz() has parameter annotations [, @Foo].
-              MethodSubject bazMethodSubject = mainClassSubject.uniqueMethodWithName("baz");
+              MethodSubject bazMethodSubject = mainClassSubject.uniqueMethodWithOriginalName("baz");
               assertThat(bazMethodSubject, isPresent());
               assertThat(bazMethodSubject, hasParameters(aTypeSubject, bTypeSubject));
               assertThat(
@@ -79,7 +79,7 @@
                       ImmutableList.of(), ImmutableList.of(fooTypeSubject)));
 
               // Main.qux() has parameter annotations [@Foo, ].
-              MethodSubject quxMethodSubject = mainClassSubject.uniqueMethodWithName("qux");
+              MethodSubject quxMethodSubject = mainClassSubject.uniqueMethodWithOriginalName("qux");
               assertThat(quxMethodSubject, isPresent());
               assertThat(quxMethodSubject, hasParameters(aTypeSubject, bTypeSubject));
               assertThat(
diff --git a/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithVirtualMethodCollisionTest.java b/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithVirtualMethodCollisionTest.java
index de0dfe3..ba776e4 100644
--- a/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithVirtualMethodCollisionTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithVirtualMethodCollisionTest.java
@@ -55,13 +55,14 @@
               TypeSubject aTypeSubject = aClassSubject.asTypeSubject();
               TypeSubject bTypeSubject = bClassSubject.asTypeSubject();
 
-              MethodSubject fooMethodSubject = aClassSubject.uniqueMethodWithName("foo");
+              MethodSubject fooMethodSubject = aClassSubject.uniqueMethodWithOriginalName("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");
+              MethodSubject otherFooMethodSubject =
+                  bClassSubject.uniqueMethodWithOriginalName("foo$1");
               assertThat(otherFooMethodSubject, isPresent());
               assertThat(otherFooMethodSubject, hasParameters(aTypeSubject, bTypeSubject));
             })
diff --git a/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithoutSharingTest.java b/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithoutSharingTest.java
index dcde130..546c7ce 100644
--- a/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithoutSharingTest.java
+++ b/src/test/java/com/android/tools/r8/optimize/proto/ProtoNormalizationWithoutSharingTest.java
@@ -48,7 +48,7 @@
 
               // Should not be normalized as there is no sharing of protos.
               MethodSubject fooMethodSubject =
-                  inspector.clazz(Main.class).uniqueMethodWithName("foo");
+                  inspector.clazz(Main.class).uniqueMethodWithOriginalName("foo");
               assertThat(fooMethodSubject, isPresent());
               assertThat(fooMethodSubject, hasParameters(bTypeSubject, aTypeSubject));
             })
diff --git a/src/test/java/com/android/tools/r8/profile/art/ArtProfileCollisionAfterClassMergingRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/ArtProfileCollisionAfterClassMergingRewritingTest.java
index 15ed09c..598101f 100644
--- a/src/test/java/com/android/tools/r8/profile/art/ArtProfileCollisionAfterClassMergingRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/ArtProfileCollisionAfterClassMergingRewritingTest.java
@@ -74,10 +74,10 @@
     ClassSubject barClassSubject = inspector.clazz(Bar.class);
     assertThat(barClassSubject, isPresentAndRenamed());
 
-    MethodSubject helloMethodSubject = barClassSubject.uniqueMethodWithName("hello");
+    MethodSubject helloMethodSubject = barClassSubject.uniqueMethodWithOriginalName("hello");
     assertThat(helloMethodSubject, isPresentAndRenamed());
 
-    MethodSubject worldMethodSubject = barClassSubject.uniqueMethodWithName("world");
+    MethodSubject worldMethodSubject = barClassSubject.uniqueMethodWithOriginalName("world");
     assertThat(worldMethodSubject, isPresentAndRenamed());
 
     assertTrue(residualArtProfileConsumer.finished);
diff --git a/src/test/java/com/android/tools/r8/profile/art/ArtProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/ArtProfileRewritingTest.java
index 80bb288..ff9003a 100644
--- a/src/test/java/com/android/tools/r8/profile/art/ArtProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/ArtProfileRewritingTest.java
@@ -68,7 +68,7 @@
     ClassSubject greeterClassSubject = inspector.clazz(Greeter.class);
     assertThat(greeterClassSubject, isPresentAndRenamed());
 
-    MethodSubject greetMethodSubject = greeterClassSubject.uniqueMethodWithName("greet");
+    MethodSubject greetMethodSubject = greeterClassSubject.uniqueMethodWithOriginalName("greet");
     assertThat(greetMethodSubject, isPresentAndRenamed());
 
     assertTrue(residualArtProfileConsumer.finished);
diff --git a/src/test/java/com/android/tools/r8/profile/art/DesugaredLibraryArtProfileRewritingTest.java b/src/test/java/com/android/tools/r8/profile/art/DesugaredLibraryArtProfileRewritingTest.java
index da88bc6..f93737b 100644
--- a/src/test/java/com/android/tools/r8/profile/art/DesugaredLibraryArtProfileRewritingTest.java
+++ b/src/test/java/com/android/tools/r8/profile/art/DesugaredLibraryArtProfileRewritingTest.java
@@ -75,7 +75,7 @@
               assertThat(streamClassSubject, isPresentAndNotRenamed());
 
               MethodSubject forEachMethodSubject =
-                  streamClassSubject.uniqueMethodWithName("forEach");
+                  streamClassSubject.uniqueMethodWithOriginalName("forEach");
               assertThat(
                   forEachMethodSubject,
                   isPresentAndRenamed(
diff --git a/src/test/java/com/android/tools/r8/proguard/configuration/ProguardRuleWithEllipsisForReturnTypeTest.java b/src/test/java/com/android/tools/r8/proguard/configuration/ProguardRuleWithEllipsisForReturnTypeTest.java
index 879786b..d2275df 100644
--- a/src/test/java/com/android/tools/r8/proguard/configuration/ProguardRuleWithEllipsisForReturnTypeTest.java
+++ b/src/test/java/com/android/tools/r8/proguard/configuration/ProguardRuleWithEllipsisForReturnTypeTest.java
@@ -66,8 +66,8 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject classSubject = inspector.clazz(clazz);
     assertThat(classSubject, isPresent());
-    assertThat(classSubject.uniqueFieldWithName("unused"), isPresent());
-    assertThat(classSubject.uniqueMethodWithName("main"), isPresent());
+    assertThat(classSubject.uniqueFieldWithOriginalName("unused"), isPresent());
+    assertThat(classSubject.uniqueMethodWithOriginalName("main"), isPresent());
   }
 }
 
diff --git a/src/test/java/com/android/tools/r8/proguard/rules/ProguardMatchAllRuleWithPrefixTest.java b/src/test/java/com/android/tools/r8/proguard/rules/ProguardMatchAllRuleWithPrefixTest.java
index 063976a..e6644ad 100644
--- a/src/test/java/com/android/tools/r8/proguard/rules/ProguardMatchAllRuleWithPrefixTest.java
+++ b/src/test/java/com/android/tools/r8/proguard/rules/ProguardMatchAllRuleWithPrefixTest.java
@@ -32,10 +32,10 @@
 
     ClassSubject classSubject = inspector.clazz(TestClass.class);
     assertThat(classSubject, isPresent());
-    assertThat(classSubject.uniqueMethodWithName("methodA"), isPresent());
-    assertThat(classSubject.uniqueMethodWithName("methodB"), isPresent());
-    assertThat(classSubject.uniqueMethodWithName("methodC"), isPresent());
-    assertThat(classSubject.uniqueMethodWithName("methodD"), isPresent());
+    assertThat(classSubject.uniqueMethodWithOriginalName("methodA"), isPresent());
+    assertThat(classSubject.uniqueMethodWithOriginalName("methodB"), isPresent());
+    assertThat(classSubject.uniqueMethodWithOriginalName("methodC"), isPresent());
+    assertThat(classSubject.uniqueMethodWithOriginalName("methodD"), isPresent());
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/regress/b142682636/Regress142682636Runner.java b/src/test/java/com/android/tools/r8/regress/b142682636/Regress142682636Runner.java
index 78694ea..aba69ff 100644
--- a/src/test/java/com/android/tools/r8/regress/b142682636/Regress142682636Runner.java
+++ b/src/test/java/com/android/tools/r8/regress/b142682636/Regress142682636Runner.java
@@ -45,10 +45,10 @@
         .inspector();
     ClassSubject clazz = inspector.clazz(testClass);
     assertThat(clazz, isPresent());
-    MethodSubject foo = clazz.uniqueMethodWithName("foo");
+    MethodSubject foo = clazz.uniqueMethodWithOriginalName("foo");
     assertThat(foo, isPresent());
     checkNoMoveWide(foo);
-    MethodSubject bar = clazz.uniqueMethodWithName("bar");
+    MethodSubject bar = clazz.uniqueMethodWithOriginalName("bar");
     assertThat(bar, isPresent());
     checkNoMoveWide(bar);
   }
diff --git a/src/test/java/com/android/tools/r8/regress/b147865212/Regress147865212.java b/src/test/java/com/android/tools/r8/regress/b147865212/Regress147865212.java
index fa3661e..6db35da 100644
--- a/src/test/java/com/android/tools/r8/regress/b147865212/Regress147865212.java
+++ b/src/test/java/com/android/tools/r8/regress/b147865212/Regress147865212.java
@@ -50,7 +50,7 @@
             .inspector();
     ClassSubject clazz = inspector.clazz("FlafKt");
     assertTrue(clazz.isPresent());
-    MethodSubject method = clazz.uniqueMethodWithName("box");
+    MethodSubject method = clazz.uniqueMethodWithOriginalName("box");
     assertTrue(method.isPresent());
     return method;
   }
diff --git a/src/test/java/com/android/tools/r8/regress/b165825758/Regress165825758Test.java b/src/test/java/com/android/tools/r8/regress/b165825758/Regress165825758Test.java
index 41d6a49..47c33fb 100644
--- a/src/test/java/com/android/tools/r8/regress/b165825758/Regress165825758Test.java
+++ b/src/test/java/com/android/tools/r8/regress/b165825758/Regress165825758Test.java
@@ -68,13 +68,14 @@
   private void checkDeadCodeThrowInTryRange(CodeInspector inspector) {
     ClassSubject classSubject = inspector.clazz(A.class);
     assertThat(classSubject, isPresent());
-    MethodSubject method = classSubject.uniqueMethodWithName("synchronizedMethod");
+    MethodSubject method = classSubject.uniqueMethodWithOriginalName("synchronizedMethod");
     assertThat(method, isPresent());
 
     // Ensure that the "throwNpe" method remains and that it was not inlined by checking that no
     // allocations of NullPointerException are in the method.
     assertTrue(method.streamInstructions().noneMatch(InstructionSubject::isNewInstance));
-    assertThat(inspector.clazz(TestClass.class).uniqueMethodWithName("throwNpe"), isPresent());
+    assertThat(
+        inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("throwNpe"), isPresent());
 
     // Source has 2 catch ranges:
     // 1st try catch is the source range, 2nd is the compiler inserted catch over monitor-exit.
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageDebugMinificationTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageDebugMinificationTest.java
index 23a5047..38b94ee 100644
--- a/src/test/java/com/android/tools/r8/repackage/RepackageDebugMinificationTest.java
+++ b/src/test/java/com/android/tools/r8/repackage/RepackageDebugMinificationTest.java
@@ -66,7 +66,7 @@
             inspector -> {
               ClassSubject mainClass = inspector.clazz(Main.class);
               assertThat(mainClass, isPresentAndNotRenamed());
-              MethodSubject main = mainClass.uniqueMethodWithName("main");
+              MethodSubject main = mainClass.uniqueMethodWithOriginalName("main");
               assertThat(main, isPresentAndNotRenamed());
               ClassSubject aClass = inspector.clazz(A.class);
               assertThat(aClass, isPresentAndNotRenamed());
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageKeepClassMembersTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageKeepClassMembersTest.java
new file mode 100644
index 0000000..a49759f
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/repackage/RepackageKeepClassMembersTest.java
@@ -0,0 +1,94 @@
+// 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.repackage;
+
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndNotRenamed;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import com.android.tools.r8.NeverClassInline;
+import com.android.tools.r8.NeverInline;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import java.util.Objects;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+@RunWith(Parameterized.class)
+public class RepackageKeepClassMembersTest extends RepackageTestBase {
+
+  public RepackageKeepClassMembersTest(
+      String flattenPackageHierarchyOrRepackageClasses, TestParameters parameters) {
+    super(flattenPackageHierarchyOrRepackageClasses, parameters);
+  }
+
+  @Test
+  public void testR8() throws Exception {
+    testForR8(parameters.getBackend())
+        .addInnerClasses(getClass())
+        .setMinApi(parameters.getApiLevel())
+        .apply(this::configureRepackaging)
+        .addKeepRules(
+            "-keepclassmembers class * extends " + typeName(Base.class) + " { <fields>; }")
+        .addKeepMainRule(Main.class)
+        .enableNeverClassInliningAnnotations()
+        .enableInliningAnnotations()
+        .run(parameters.getRuntime(), Main.class, typeName(Sub.class))
+        .inspect(this::inspect)
+        // TODOD(b/250671873): Should not repackage class.
+        .assertSuccessWithOutputLines("Could not find " + typeName(Sub.class));
+  }
+
+  private void inspect(CodeInspector inspector) {
+    ClassSubject clazz = inspector.clazz(Sub.class);
+    assertThat(clazz, isPresent());
+    // TODOD(b/250671873): Should not repackage class.
+    assertThat(Sub.class, isRepackaged(inspector));
+    assertThat(clazz.uniqueFieldWithOriginalName("hashCodeCache"), isPresentAndNotRenamed());
+    assertThat(clazz.uniqueMethodWithOriginalName("calculateHashCode"), isPresentAndRenamed());
+  }
+
+  public static class Base {}
+
+  @NeverClassInline
+  public static class Sub extends Base {
+
+    public int hashCodeCache;
+
+    @NeverInline
+    public int calculateHashCode() {
+      if (hashCodeCache != -1) {
+        return hashCodeCache;
+      }
+      hashCodeCache = Objects.hash(Sub.class);
+      return hashCodeCache;
+    }
+
+    @Override
+    public int hashCode() {
+      return calculateHashCode();
+    }
+  }
+
+  public static class Main {
+
+    public static void main(String[] args) {
+      if (System.currentTimeMillis() == 0) {
+        System.out.println(new Sub().hashCode());
+      }
+      try {
+        Class<?> subClass = Class.forName(args[0]);
+        Object subInstance = subClass.getDeclaredConstructor().newInstance();
+        subClass.getMethod("calculateHashCode").invoke(subInstance);
+        System.out.println("Hello World!");
+      } catch (Exception e) {
+        System.out.println("Could not find " + args[0]);
+      }
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageProtectedInSamePackageTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageProtectedInSamePackageTest.java
new file mode 100644
index 0000000..a208857
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/repackage/RepackageProtectedInSamePackageTest.java
@@ -0,0 +1,89 @@
+// 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.repackage;
+
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresentAndRenamed;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import com.android.tools.r8.NeverClassInline;
+import com.android.tools.r8.NeverInline;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.utils.codeinspector.ClassSubject;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import java.util.Objects;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+
+/** This is a reproduction of b/250671873. */
+@RunWith(Parameterized.class)
+public class RepackageProtectedInSamePackageTest extends RepackageTestBase {
+
+  public RepackageProtectedInSamePackageTest(
+      String flattenPackageHierarchyOrRepackageClasses, TestParameters parameters) {
+    super(flattenPackageHierarchyOrRepackageClasses, parameters);
+  }
+
+  @Test
+  public void testR8() throws Exception {
+    testForR8(parameters.getBackend())
+        .addInnerClasses(getClass())
+        .setMinApi(parameters.getApiLevel())
+        .apply(this::configureRepackaging)
+        .addKeepRules(
+            "-keepclassmembers,allowobfuscation class * extends "
+                + typeName(Base.class)
+                + " { <fields>; }")
+        .addKeepMainRule(Main.class)
+        .enableNeverClassInliningAnnotations()
+        .enableInliningAnnotations()
+        .run(parameters.getRuntime(), Main.class)
+        .inspect(this::inspect)
+        .assertSuccessWithOutputLines("Hello World!");
+  }
+
+  private void inspect(CodeInspector inspector) {
+    // TODO(b/250671873): We should be able to repackage the Sub class since the only reference
+    //  to Sub.class is in the same package and we have allowobfuscation.
+    ClassSubject clazz = inspector.clazz(Sub.class);
+    assertThat(clazz, isPresent());
+    assertThat(Sub.class, isNotRepackaged(inspector));
+    assertThat(clazz.uniqueFieldWithOriginalName("hashCodeCache"), isPresentAndRenamed());
+    assertThat(clazz.uniqueMethodWithOriginalName("calculateHashCode"), isPresentAndRenamed());
+  }
+
+  public static class Base {}
+
+  @NeverClassInline
+  public static class Sub extends Base {
+
+    protected int hashCodeCache;
+
+    @NeverInline
+    protected int calculateHashCode() {
+      if (hashCodeCache != -1) {
+        return hashCodeCache;
+      }
+      hashCodeCache = Objects.hash(Sub.class);
+      return hashCodeCache;
+    }
+
+    @Override
+    public int hashCode() {
+      return calculateHashCode();
+    }
+  }
+
+  public static class Main {
+
+    public static void main(String[] args) {
+      if (System.currentTimeMillis() == 0) {
+        System.out.println(new Sub().hashCode());
+      }
+      System.out.println("Hello World!");
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageWithBridgeHoistingTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageWithBridgeHoistingTest.java
index 3db9028..23a5cfd 100644
--- a/src/test/java/com/android/tools/r8/repackage/RepackageWithBridgeHoistingTest.java
+++ b/src/test/java/com/android/tools/r8/repackage/RepackageWithBridgeHoistingTest.java
@@ -54,7 +54,7 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject greeterBase = inspector.clazz(GreeterBase.class);
     assertThat(greeterBase, isPresent());
-    assertThat(greeterBase.uniqueMethodWithName("greetBridge"), isPresent());
+    assertThat(greeterBase.uniqueMethodWithOriginalName("greetBridge"), isPresent());
   }
 
   public static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/repackage/RepackageWithInitClassTest.java b/src/test/java/com/android/tools/r8/repackage/RepackageWithInitClassTest.java
index 4f028fb..4f6f672 100644
--- a/src/test/java/com/android/tools/r8/repackage/RepackageWithInitClassTest.java
+++ b/src/test/java/com/android/tools/r8/repackage/RepackageWithInitClassTest.java
@@ -67,21 +67,22 @@
     String clinitFieldName = inspector.getFactory().objectMembers.clinitField.name.toSourceString();
     if (enableMemberValuePropagationAnnotations) {
       // No $r8$clinit field should have been synthesized since we can use the HELLO field.
-      assertThat(repackagedClassSubject.uniqueFieldWithName(clinitFieldName), not(isPresent()));
-      assertThat(repackagedClassSubject.uniqueFieldWithName("HELLO"), isPresent());
+      assertThat(
+          repackagedClassSubject.uniqueFieldWithOriginalName(clinitFieldName), not(isPresent()));
+      assertThat(repackagedClassSubject.uniqueFieldWithOriginalName("HELLO"), isPresent());
 
       // Verify that the WORLD field has been removed.
-      assertThat(repackagedClassSubject.uniqueFieldWithName("WORLD"), not(isPresent()));
+      assertThat(repackagedClassSubject.uniqueFieldWithOriginalName("WORLD"), not(isPresent()));
 
       // Verify that the class was not repackaged.
       assertThat(StaticMemberValuePropagation.class, isNotRepackaged(inspector));
     } else {
       // Verify that a $r8$clinit field was synthesized.
-      assertThat(repackagedClassSubject.uniqueFieldWithName(clinitFieldName), isPresent());
+      assertThat(repackagedClassSubject.uniqueFieldWithOriginalName(clinitFieldName), isPresent());
 
       // Verify that both fields have been removed.
-      assertThat(repackagedClassSubject.uniqueFieldWithName("HELLO"), not(isPresent()));
-      assertThat(repackagedClassSubject.uniqueFieldWithName("WORLD"), not(isPresent()));
+      assertThat(repackagedClassSubject.uniqueFieldWithOriginalName("HELLO"), not(isPresent()));
+      assertThat(repackagedClassSubject.uniqueFieldWithOriginalName("WORLD"), not(isPresent()));
 
       // Verify that the class was repackaged.
       assertThat(StaticMemberValuePropagation.class, isRepackaged(inspector));
diff --git a/src/test/java/com/android/tools/r8/resolution/SingleStaticTargetLookupTestRunner.java b/src/test/java/com/android/tools/r8/resolution/SingleStaticTargetLookupTestRunner.java
index 8edefd8..0b057db 100644
--- a/src/test/java/com/android/tools/r8/resolution/SingleStaticTargetLookupTestRunner.java
+++ b/src/test/java/com/android/tools/r8/resolution/SingleStaticTargetLookupTestRunner.java
@@ -61,8 +61,8 @@
         .inspect(
             inspector -> {
               ClassSubject clazz = inspector.clazz(SingleStaticTargetLookupTest.class);
-              MethodSubject main = clazz.uniqueMethodWithName("main");
-              MethodSubject staticFoo = clazz.uniqueMethodWithName("staticFoo");
+              MethodSubject main = clazz.uniqueMethodWithOriginalName("main");
+              MethodSubject staticFoo = clazz.uniqueMethodWithOriginalName("staticFoo");
               assertThat(clazz, isPresent());
               assertThat(main, isPresent());
               assertEquals(keepFoo, staticFoo.isPresent());
diff --git a/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialInterfaceMethodAccessTest.java b/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialInterfaceMethodAccessTest.java
index aa827c8..5390779 100644
--- a/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialInterfaceMethodAccessTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialInterfaceMethodAccessTest.java
@@ -149,7 +149,7 @@
   private void assertCallingClassCallsTarget(
       Class<?> callerClass, AppView<?> appView, DexMethod target) {
     CodeInspector inspector = new CodeInspector(appView.appInfo().app());
-    MethodSubject foo = inspector.clazz(callerClass).uniqueMethodWithName("foo");
+    MethodSubject foo = inspector.clazz(callerClass).uniqueMethodWithOriginalName("foo");
     assertTrue(
         foo.streamInstructions()
             .anyMatch(i -> i.asCfInstruction().isInvokeSpecial() && i.getMethod() == target));
diff --git a/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialInterfaceMethodAccessWithIntermediateTest.java b/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialInterfaceMethodAccessWithIntermediateTest.java
index 50f4428..79c89e8 100644
--- a/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialInterfaceMethodAccessWithIntermediateTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialInterfaceMethodAccessWithIntermediateTest.java
@@ -132,7 +132,7 @@
   private void assertCallingClassCallsTarget(
       Class<?> callerClass, AppInfoWithLiveness appInfo, DexMethod method) {
     CodeInspector inspector = new CodeInspector(appInfo.app());
-    MethodSubject foo = inspector.clazz(callerClass).uniqueMethodWithName("foo");
+    MethodSubject foo = inspector.clazz(callerClass).uniqueMethodWithOriginalName("foo");
     assertTrue(
         foo.streamInstructions()
             .anyMatch(
diff --git a/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodAccessTest.java b/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodAccessTest.java
index 1a6485c..dd66e5d5 100644
--- a/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodAccessTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodAccessTest.java
@@ -124,7 +124,7 @@
   private void assertCallingClassCallsTarget(
       Class<?> callerClass, AppView<?> appView, DexMethod target) {
     CodeInspector inspector = new CodeInspector(appView.appInfo().app());
-    MethodSubject foo = inspector.clazz(callerClass).uniqueMethodWithName("foo");
+    MethodSubject foo = inspector.clazz(callerClass).uniqueMethodWithOriginalName("foo");
     assertTrue(
         foo.streamInstructions()
             .anyMatch(i -> i.asCfInstruction().isInvokeSpecial() && i.getMethod() == target));
diff --git a/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodAccessWithIntermediateTest.java b/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodAccessWithIntermediateTest.java
index 5fddce3..efbbd16 100644
--- a/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodAccessWithIntermediateTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodAccessWithIntermediateTest.java
@@ -160,7 +160,7 @@
   private void assertCallingClassCallsTarget(
       Class<?> callerClass, AppView<?> appView, DexMethod target) {
     CodeInspector inspector = new CodeInspector(appView.appInfo().app());
-    MethodSubject foo = inspector.clazz(callerClass).uniqueMethodWithName("foo");
+    MethodSubject foo = inspector.clazz(callerClass).uniqueMethodWithOriginalName("foo");
     assertTrue(
         foo.streamInstructions()
             .anyMatch(i -> i.asCfInstruction().isInvokeSpecial() && i.getMethod() == target));
diff --git a/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodPublicAccessWithIntermediateTest.java b/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodPublicAccessWithIntermediateTest.java
index 31a8904..e1d4d99 100644
--- a/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodPublicAccessWithIntermediateTest.java
+++ b/src/test/java/com/android/tools/r8/resolution/access/NestInvokeSpecialMethodPublicAccessWithIntermediateTest.java
@@ -121,7 +121,7 @@
   private void assertCallingClassCallsTarget(
       Class<?> callerClass, AppInfoWithLiveness appInfo, DexMethod target) {
     CodeInspector inspector = new CodeInspector(appInfo.app());
-    MethodSubject foo = inspector.clazz(callerClass).uniqueMethodWithName("foo");
+    MethodSubject foo = inspector.clazz(callerClass).uniqueMethodWithOriginalName("foo");
     assertTrue(
         foo.streamInstructions()
             .anyMatch(i -> i.asCfInstruction().isInvokeSpecial() && i.getMethod() == target));
diff --git a/src/test/java/com/android/tools/r8/resolution/b123730538/B123730538.java b/src/test/java/com/android/tools/r8/resolution/b123730538/B123730538.java
index 029fc63..e2f71f5 100644
--- a/src/test/java/com/android/tools/r8/resolution/b123730538/B123730538.java
+++ b/src/test/java/com/android/tools/r8/resolution/b123730538/B123730538.java
@@ -81,14 +81,15 @@
   }
 
   private void inspect(CodeInspector inspector) {
-    MethodSubject foo = inspector.clazz(
-        PublicClass.class.getTypeName().replace("PublicClass", "AbstractClass"))
-        .uniqueMethodWithName("foo");
+    MethodSubject foo =
+        inspector
+            .clazz(PublicClass.class.getTypeName().replace("PublicClass", "AbstractClass"))
+            .uniqueMethodWithOriginalName("foo");
     assertThat(foo, isPresent());
 
     ClassSubject main = inspector.clazz(PublicClassExtender.class);
     assertThat(main, isPresent());
-    MethodSubject methodSubject = main.uniqueMethodWithName("delegate");
+    MethodSubject methodSubject = main.uniqueMethodWithOriginalName("delegate");
     assertThat(methodSubject, isPresent());
 
     methodSubject
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 820be96..cb07033 100644
--- a/src/test/java/com/android/tools/r8/retrace/InlineWithoutNullCheckTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/InlineWithoutNullCheckTest.java
@@ -97,10 +97,14 @@
     ClassSubject classSubject = inspector.clazz(Result.class);
     assertThat(classSubject, isPresent());
     assertThat(
-        classSubject.uniqueMethodWithName("methodWhichAccessInstanceMethod"), not(isPresent()));
+        classSubject.uniqueMethodWithOriginalName("methodWhichAccessInstanceMethod"),
+        not(isPresent()));
     assertThat(
-        classSubject.uniqueMethodWithName("methodWhichAccessInstanceField"), not(isPresent()));
-    assertThat(classSubject.uniqueMethodWithName("methodWhichAccessStaticField"), not(isPresent()));
+        classSubject.uniqueMethodWithOriginalName("methodWhichAccessInstanceField"),
+        not(isPresent()));
+    assertThat(
+        classSubject.uniqueMethodWithOriginalName("methodWhichAccessStaticField"),
+        not(isPresent()));
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/retrace/KotlinInlineFunctionInSameFileRetraceTests.java b/src/test/java/com/android/tools/r8/retrace/KotlinInlineFunctionInSameFileRetraceTests.java
index 8eb9f47..7f2dac3 100644
--- a/src/test/java/com/android/tools/r8/retrace/KotlinInlineFunctionInSameFileRetraceTests.java
+++ b/src/test/java/com/android/tools/r8/retrace/KotlinInlineFunctionInSameFileRetraceTests.java
@@ -107,13 +107,14 @@
         .assertFailureWithErrorThatMatches(containsString("main"))
         .inspectStackTrace(
             (stackTrace, codeInspector) -> {
-              MethodSubject mainSubject = codeInspector.clazz(MAIN).uniqueMethodWithName("main");
+              MethodSubject mainSubject =
+                  codeInspector.clazz(MAIN).uniqueMethodWithOriginalName("main");
               LinePosition inlineStack =
                   LinePosition.stack(
                       LinePosition.create(
                           kotlinInspector
                               .clazz("retrace.InlineFunctionsInSameFileKt")
-                              .uniqueMethodWithName("foo")
+                              .uniqueMethodWithOriginalName("foo")
                               .asFoundMethodSubject(),
                           1,
                           8,
diff --git a/src/test/java/com/android/tools/r8/retrace/KotlinInlineFunctionRetraceTest.java b/src/test/java/com/android/tools/r8/retrace/KotlinInlineFunctionRetraceTest.java
index e95e5a9..d42b54f 100644
--- a/src/test/java/com/android/tools/r8/retrace/KotlinInlineFunctionRetraceTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/KotlinInlineFunctionRetraceTest.java
@@ -74,14 +74,14 @@
   private FoundMethodSubject inlineExceptionStatic(CodeInspector kotlinInspector) {
     return kotlinInspector
         .clazz("retrace.InlineFunctionKt")
-        .uniqueMethodWithName("inlineExceptionStatic")
+        .uniqueMethodWithOriginalName("inlineExceptionStatic")
         .asFoundMethodSubject();
   }
 
   private FoundMethodSubject inlineExceptionInstance(CodeInspector kotlinInspector) {
     return kotlinInspector
         .clazz("retrace.InlineFunction")
-        .uniqueMethodWithName("inlineExceptionInstance")
+        .uniqueMethodWithOriginalName("inlineExceptionInstance")
         .asFoundMethodSubject();
   }
 
@@ -115,7 +115,8 @@
         .assertFailureWithErrorThatMatches(containsString("inlineExceptionStatic"))
         .inspectStackTrace(
             (stackTrace, codeInspector) -> {
-              MethodSubject mainSubject = codeInspector.clazz(main).uniqueMethodWithName("main");
+              MethodSubject mainSubject =
+                  codeInspector.clazz(main).uniqueMethodWithOriginalName("main");
               LinePosition inlineStack =
                   LinePosition.stack(
                       LinePosition.create(
@@ -145,7 +146,8 @@
         .assertFailureWithErrorThatMatches(containsString("inlineExceptionInstance"))
         .inspectStackTrace(
             (stackTrace, codeInspector) -> {
-              MethodSubject mainSubject = codeInspector.clazz(main).uniqueMethodWithName("main");
+              MethodSubject mainSubject =
+                  codeInspector.clazz(main).uniqueMethodWithOriginalName("main");
               LinePosition inlineStack =
                   LinePosition.stack(
                       LinePosition.create(
@@ -181,7 +183,8 @@
         .assertFailureWithErrorThatMatches(containsString("inlineExceptionStatic"))
         .inspectStackTrace(
             (stackTrace, codeInspector) -> {
-              MethodSubject mainSubject = codeInspector.clazz(main).uniqueMethodWithName("main");
+              MethodSubject mainSubject =
+                  codeInspector.clazz(main).uniqueMethodWithOriginalName("main");
               LinePosition inlineStack =
                   LinePosition.stack(
                       LinePosition.create(
@@ -213,7 +216,8 @@
         .assertFailureWithErrorThatMatches(containsString("inlineExceptionStatic"))
         .inspectStackTrace(
             (stackTrace, codeInspector) -> {
-              MethodSubject mainSubject = codeInspector.clazz(main).uniqueMethodWithName("main");
+              MethodSubject mainSubject =
+                  codeInspector.clazz(main).uniqueMethodWithOriginalName("main");
               LinePosition inlineStack =
                   LinePosition.stack(
                       LinePosition.create(
diff --git a/src/test/java/com/android/tools/r8/retrace/RenamedSignatureClashTest.java b/src/test/java/com/android/tools/r8/retrace/RenamedSignatureClashTest.java
new file mode 100644
index 0000000..96d52ab
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/retrace/RenamedSignatureClashTest.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.retrace;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import com.android.tools.r8.DiagnosticsHandler;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.references.ClassReference;
+import com.android.tools.r8.references.MethodReference;
+import com.android.tools.r8.references.Reference;
+import com.android.tools.r8.utils.StringUtils;
+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 RenamedSignatureClashTest extends TestBase {
+
+  @Parameter() public TestParameters parameters;
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withNoneRuntime().build();
+  }
+
+  private final ClassReference renamedHolder = Reference.classFromTypeName("A");
+  private final ClassReference originalHolder =
+      Reference.classFromTypeName("com.android.tools.r8.naming.retrace.Main");
+
+  private final String mapping =
+      StringUtils.lines(
+          "# { id: 'com.android.tools.r8.mapping', version: '1.0' }",
+          originalHolder.getTypeName() + " -> " + renamedHolder.getTypeName() + ":",
+          "  void some.moved.Method.someMethod(int) -> a",
+          "  void methodWithRemovedArgument(int) -> a",
+          "  # { id: 'com.android.tools.r8.synthesized' }");
+
+  @Test
+  public void testAmbiguousResult() {
+    Retracer retracer =
+        Retracer.createDefault(
+            ProguardMapProducer.fromString(mapping), new DiagnosticsHandler() {});
+    MethodReference methodReference =
+        Reference.methodFromDescriptor(renamedHolder.getDescriptor(), "a", "(I)V");
+    RetraceMethodResult retraceMethodResult = retracer.retraceMethod(methodReference);
+    assertTrue(retraceMethodResult.isAmbiguous());
+    retraceMethodResult.stream()
+        .forEach(
+            result -> {
+              String method = result.getRetracedMethod().asKnown().getMethodReference().toString();
+              if (method.equals("Lsome/moved/Method;someMethod(I)V")) {
+                assertFalse(result.isCompilerSynthesized());
+              } else {
+                assertEquals(
+                    originalHolder.getDescriptor() + "methodWithRemovedArgument(I)V", method);
+                assertTrue(result.isCompilerSynthesized());
+              }
+            });
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/retrace/RetraceOutsideLineRangeTest.java b/src/test/java/com/android/tools/r8/retrace/RetraceOutsideLineRangeTest.java
new file mode 100644
index 0000000..6817079
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/retrace/RetraceOutsideLineRangeTest.java
@@ -0,0 +1,86 @@
+// 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.retrace;
+
+import static org.junit.Assert.assertEquals;
+
+import com.android.tools.r8.DiagnosticsHandler;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.references.ClassReference;
+import com.android.tools.r8.references.Reference;
+import java.util.List;
+import java.util.OptionalInt;
+import java.util.stream.Collectors;
+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 RetraceOutsideLineRangeTest extends TestBase {
+
+  @Parameter() public TestParameters parameters;
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withNoneRuntime().build();
+  }
+
+  private final ClassReference someOtherClassOriginal =
+      Reference.classFromTypeName("some.other.Class");
+  private final ClassReference someOtherClassRenamed = Reference.classFromTypeName("a");
+  private final ClassReference someClassOriginal = Reference.classFromTypeName("some.Class");
+  private final ClassReference someClassRenamed = Reference.classFromTypeName("b");
+
+  private final String mapping =
+      someOtherClassOriginal.getTypeName()
+          + " -> "
+          + someOtherClassRenamed.getTypeName()
+          + ":\n"
+          + "  void method1():42:42 -> a\n"
+          + someClassOriginal.getTypeName()
+          + " -> "
+          + someClassRenamed.getTypeName()
+          + ":\n"
+          + "  28:28:void foo.bar.inlinee():92:92 -> a\n"
+          + "  1:3:void method2():11:13 -> a\n"
+          + "  4:4:void method2():10:10 -> a\n"
+          + "  5:5:void method2():14 -> a\n";
+
+  @Test
+  public void testNoLine() {
+    Retracer retracer =
+        Retracer.createDefault(
+            ProguardMapProducer.fromString(mapping), new DiagnosticsHandler() {});
+    retraceClassMethodAndPosition(retracer, someClassRenamed, someClassOriginal, 2, 1);
+    retraceClassMethodAndPosition(retracer, someOtherClassRenamed, someOtherClassOriginal, 1, 1);
+  }
+
+  private void retraceClassMethodAndPosition(
+      Retracer retracer,
+      ClassReference renamedClass,
+      ClassReference originalClass,
+      int methodCount,
+      int frameCount) {
+    List<RetraceClassElement> classResult =
+        retracer.retraceClass(renamedClass).stream().collect(Collectors.toList());
+    assertEquals(classResult.size(), 1);
+    RetraceClassElement retraceClassResult = classResult.get(0);
+    assertEquals(originalClass, retraceClassResult.getRetracedClass().getClassReference());
+    RetraceMethodResult retraceMethodResult = retraceClassResult.lookupMethod("a");
+    List<RetraceMethodElement> classMethodResults =
+        retraceMethodResult.stream().collect(Collectors.toList());
+    assertEquals(methodCount, classMethodResults.size());
+    List<RetraceFrameElement> classResultFrames =
+        retraceMethodResult
+            .narrowByPosition(RetraceStackTraceContext.empty(), OptionalInt.of(6))
+            .stream()
+            .collect(Collectors.toList());
+    assertEquals(frameCount, classResultFrames.size());
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/retrace/RetraceStackTraceFunctionalCompositionTest.java b/src/test/java/com/android/tools/r8/retrace/RetraceStackTraceFunctionalCompositionTest.java
index 3c4c536..db76685 100644
--- a/src/test/java/com/android/tools/r8/retrace/RetraceStackTraceFunctionalCompositionTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/RetraceStackTraceFunctionalCompositionTest.java
@@ -11,6 +11,7 @@
 import static org.objectweb.asm.Opcodes.INVOKESTATIC;
 
 import com.android.tools.r8.CompilationMode;
+import com.android.tools.r8.JdkClassFileProvider;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
@@ -35,6 +36,7 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.function.Supplier;
+import org.junit.Ignore;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -155,6 +157,7 @@
     return rewrittenR8Jar;
   }
 
+  @Ignore("b/251677184: Failing since update to target 11")
   @Test
   public void testR8RetraceAndComposition() throws Exception {
     Path rewrittenR8Jar = getRewrittenR8Jar();
@@ -244,6 +247,7 @@
     testForR8(Backend.CF)
         .setMode(CompilationMode.RELEASE)
         .addProgramFiles(r8Input)
+        .addLibraryProvider(JdkClassFileProvider.fromSystemJdk())
         .addKeepRuleFiles(MAIN_KEEP)
         // TODO(b/241763080): Remove when stable version is default.
         .enableExperimentalMapFileVersion()
@@ -262,6 +266,7 @@
     testForD8(Backend.CF)
         .setMode(CompilationMode.RELEASE)
         .addProgramFiles(r8Input)
+        .addLibraryProvider(JdkClassFileProvider.fromSystemJdk())
         .enableExperimentalMapFileVersion()
         // TODO(b/241763080): Enable CF PC test mapping for this compilation.
         .addOptionsModification(
diff --git a/src/test/java/com/android/tools/r8/retrace/RetraceTests.java b/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
index d60500f..e4f657f 100644
--- a/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
+++ b/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
@@ -100,7 +100,7 @@
   @Parameters(name = "{0}, external: {1}, verbose: {2}, stream: {3}")
   public static Collection<Object[]> data() {
     return buildParameters(
-        getTestParameters().withCfRuntimes().build(),
+        getTestParameters().withSystemRuntime().build(),
         BooleanUtils.values(),
         BooleanUtils.values(),
         BooleanUtils.values());
@@ -210,7 +210,7 @@
   }
 
   @Test
-  public void testAmbiguousMissingLine() throws Exception {
+  public void testAmbiguousWithSignatureStackTrace() throws Exception {
     runRetraceTest(new AmbiguousWithSignatureStackTrace());
   }
 
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiInlineInOutlineTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiInlineInOutlineTest.java
index 793a22d..855f0ac 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiInlineInOutlineTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiInlineInOutlineTest.java
@@ -105,7 +105,7 @@
               .retraceFrame(
                   context,
                   OptionalInt.of(27),
-                  Reference.methodFromDescriptor(callsiteRenamed, "s", "(I)V"))
+                  Reference.methodFromDescriptor(callsiteRenamed, "s", "(I)I"))
               .stream()
               .collect(Collectors.toList());
       assertEquals(1, retraceOutlineCallee.size());
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineInOutlineStackTrace.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineInOutlineStackTrace.java
index c037782..2a9ba94 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineInOutlineStackTrace.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineInOutlineStackTrace.java
@@ -97,7 +97,7 @@
               .retraceFrame(
                   outlineContext,
                   OptionalInt.of(28),
-                  Reference.methodFromDescriptor(callsiteRenamed, "s", "(I)V"))
+                  Reference.methodFromDescriptor(callsiteRenamed, "s", "(I)I"))
               .stream()
               .collect(Collectors.toList());
       assertEquals(1, retraceOutlineCallee.size());
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineInlineTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineInlineTest.java
index 0479f47..0823ff3 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineInlineTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineInlineTest.java
@@ -102,7 +102,7 @@
               .retraceFrame(
                   context,
                   OptionalInt.of(27),
-                  Reference.methodFromDescriptor(callsiteRenamed, "s", "(I)V"))
+                  Reference.methodFromDescriptor(callsiteRenamed, "s", "(I)I"))
               .stream()
               .collect(Collectors.toList());
       assertEquals(1, retraceOutlineCallee.size());
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineNoInlineTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineNoInlineTest.java
index 93611eb..7a8bdee 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineNoInlineTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutlineNoInlineTest.java
@@ -104,7 +104,7 @@
               .retraceFrame(
                   context,
                   OptionalInt.of(27),
-                  Reference.methodFromDescriptor(callsiteRenamed, "s", "(I)V"))
+                  Reference.methodFromDescriptor(callsiteRenamed, "s", "(I)I"))
               .stream()
               .collect(Collectors.toList());
       assertEquals(1, retraceOutlineCallee.size());
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutsideLineRangeTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutsideLineRangeTest.java
deleted file mode 100644
index a3ba721..0000000
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiOutsideLineRangeTest.java
+++ /dev/null
@@ -1,91 +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.retrace.api;
-
-import static org.junit.Assert.assertEquals;
-
-import com.android.tools.r8.DiagnosticsHandler;
-import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.references.ClassReference;
-import com.android.tools.r8.references.Reference;
-import com.android.tools.r8.retrace.ProguardMapProducer;
-import com.android.tools.r8.retrace.RetraceClassElement;
-import com.android.tools.r8.retrace.RetraceFrameElement;
-import com.android.tools.r8.retrace.RetraceMethodElement;
-import com.android.tools.r8.retrace.RetraceMethodResult;
-import com.android.tools.r8.retrace.RetraceStackTraceContext;
-import com.android.tools.r8.retrace.Retracer;
-import java.util.List;
-import java.util.OptionalInt;
-import java.util.stream.Collectors;
-import org.junit.Test;
-
-public class RetraceApiOutsideLineRangeTest extends RetraceApiTestBase {
-
-  public RetraceApiOutsideLineRangeTest(TestParameters parameters) {
-    super(parameters);
-  }
-
-  @Override
-  protected Class<? extends RetraceApiBinaryTest> binaryTestClass() {
-    return ApiTest.class;
-  }
-
-  public static class ApiTest implements RetraceApiBinaryTest {
-
-    private final ClassReference someOtherClassOriginal =
-        Reference.classFromTypeName("some.other.Class");
-    private final ClassReference someOtherClassRenamed = Reference.classFromTypeName("a");
-    private final ClassReference someClassOriginal = Reference.classFromTypeName("some.Class");
-    private final ClassReference someClassRenamed = Reference.classFromTypeName("b");
-
-    private final String mapping =
-        someOtherClassOriginal.getTypeName()
-            + " -> "
-            + someOtherClassRenamed.getTypeName()
-            + ":\n"
-            + "  void method1():42:42 -> a\n"
-            + someClassOriginal.getTypeName()
-            + " -> "
-            + someClassRenamed.getTypeName()
-            + ":\n"
-            + "  1:3:void method2():11:13 -> a\n"
-            + "  4:4:void method2():10:10 -> a\n"
-            + "  28:28:void foo.bar.inlinee():92:92 -> a\n"
-            + "  5:5:void method2():14 -> a\n";
-
-    @Test
-    public void testNoLine() {
-      Retracer retracer =
-          Retracer.createDefault(
-              ProguardMapProducer.fromString(mapping), new DiagnosticsHandler() {});
-      retraceClassMethodAndPosition(retracer, someClassRenamed, someClassOriginal, 2, 0);
-      retraceClassMethodAndPosition(retracer, someOtherClassRenamed, someOtherClassOriginal, 1, 1);
-    }
-
-    private void retraceClassMethodAndPosition(
-        Retracer retracer,
-        ClassReference renamedClass,
-        ClassReference originalClass,
-        int methodCount,
-        int frameCount) {
-      List<RetraceClassElement> classResult =
-          retracer.retraceClass(renamedClass).stream().collect(Collectors.toList());
-      assertEquals(classResult.size(), 1);
-      RetraceClassElement retraceClassResult = classResult.get(0);
-      assertEquals(originalClass, retraceClassResult.getRetracedClass().getClassReference());
-      RetraceMethodResult retraceMethodResult = retraceClassResult.lookupMethod("a");
-      List<RetraceMethodElement> classMethodResults =
-          retraceMethodResult.stream().collect(Collectors.toList());
-      assertEquals(methodCount, classMethodResults.size());
-      List<RetraceFrameElement> classResultFrames =
-          retraceMethodResult
-              .narrowByPosition(RetraceStackTraceContext.empty(), OptionalInt.of(6))
-              .stream()
-              .collect(Collectors.toList());
-      assertEquals(frameCount, classResultFrames.size());
-    }
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiResidualSignatureTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiResidualSignatureTest.java
index 01a62b5..2eb9482 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiResidualSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiResidualSignatureTest.java
@@ -15,7 +15,10 @@
 import com.android.tools.r8.retrace.RetraceFieldElement;
 import com.android.tools.r8.retrace.RetraceMethodElement;
 import com.android.tools.r8.retrace.Retracer;
+import java.util.Collections;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 import java.util.stream.Collectors;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -39,11 +42,9 @@
         "# { id: 'com.android.tools.r8.mapping', version: 'experimental' }\n"
             + "some.Class -> a:\n"
             + "  some.SuperType field -> a\n"
-            + "  # { id: 'com.android.tools.r8.residualsignature', signature: 'Ljava/lang/Object;'"
-            + " }\n"
+            + "  # { id:'com.android.tools.r8.residualsignature',signature:'Ljava/lang/Object;' }\n"
             + "  some.SubType field -> a\n"
-            + "  # { id: 'com.android.tools.r8.residualsignature', signature: 'Lsome/SuperType;'"
-            + " }\n"
+            + "  # { id:'com.android.tools.r8.residualsignature',signature:'Lsome/SuperType;' }\n"
             + "  void foo(int, int) -> x\n"
             + "  # { id: 'com.android.tools.r8.residualsignature', signature: '(I)V' }\n"
             + "  void foo(int) -> x\n"
@@ -63,31 +64,49 @@
               .collect(Collectors.toList());
       assertEquals(1, fooWithTwoArgs.size());
       assertEquals(
-          "Lsome/Class;foo(II)V",
-          fooWithTwoArgs.get(0).getRetracedMethod().asKnown().getMethodReference().toString());
+          setOf("Lsome/Class;foo(II)V"),
+          fooWithTwoArgs.stream()
+              .map(result -> result.getRetracedMethod().asKnown().getMethodReference().toString())
+              .collect(Collectors.toSet()));
       List<RetraceMethodElement> fooWithOneArg =
           retracer.retraceMethod(Reference.methodFromDescriptor(aClass, "x", "()V")).stream()
               .collect(Collectors.toList());
       assertEquals(1, fooWithOneArg.size());
       assertEquals(
-          "Lsome/Class;foo(I)V",
-          fooWithOneArg.get(0).getRetracedMethod().asKnown().getMethodReference().toString());
+          setOf("Lsome/Class;foo(I)V"),
+          fooWithOneArg.stream()
+              .map(result -> result.getRetracedMethod().asKnown().getMethodReference().toString())
+              .collect(Collectors.toSet()));
       List<RetraceFieldElement> fieldWithSuperType =
           retracer
               .retraceField(
                   Reference.field(aClass, "a", Reference.typeFromTypeName("java.lang.Object")))
               .stream()
               .collect(Collectors.toList());
-      // TODO(b/169953605): Use the residual signature information to prune the result.
-      assertEquals(2, fieldWithSuperType.size());
+      assertEquals(1, fieldWithSuperType.size());
+      assertEquals(
+          setOf("Lsome/Class;field:Lsome/SuperType;"),
+          fieldWithSuperType.stream()
+              .map(result -> result.getField().asKnown().getFieldReference().toString())
+              .collect(Collectors.toSet()));
       List<RetraceFieldElement> fieldWithSubType =
           retracer
               .retraceField(
                   Reference.field(aClass, "a", Reference.typeFromTypeName("some.SuperType")))
               .stream()
               .collect(Collectors.toList());
-      // TODO(b/169953605): Use the residual signature information to prune the result.
-      assertEquals(2, fieldWithSubType.size());
+      assertEquals(1, fieldWithSubType.size());
+      assertEquals(
+          setOf("Lsome/Class;field:Lsome/SubType;"),
+          fieldWithSubType.stream()
+              .map(result -> result.getField().asKnown().getFieldReference().toString())
+              .collect(Collectors.toSet()));
+    }
+
+    private Set<Object> setOf(Object... objects) {
+      Set<Object> result = new HashSet<>();
+      Collections.addAll(result, objects);
+      return result;
     }
   }
 }
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSingleFrameTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSingleFrameTest.java
index 0c1d0a9..40545a6 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSingleFrameTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSingleFrameTest.java
@@ -56,7 +56,7 @@
               .retraceFrame(
                   RetraceStackTraceContext.empty(),
                   OptionalInt.empty(),
-                  Reference.methodFromDescriptor(renamedClass, "a", "()I"))
+                  Reference.methodFromDescriptor(renamedClass, "a", "(I)I"))
               .stream()
               .collect(Collectors.toList()));
       checkResults(
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedFieldTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedFieldTest.java
index d934a5f..9504609 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedFieldTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedFieldTest.java
@@ -5,7 +5,7 @@
 package com.android.tools.r8.retrace.api;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.TestParameters;
@@ -49,8 +49,7 @@
               .flatMap(element -> element.lookupField("a").stream())
               .collect(Collectors.toList());
       assertEquals(1, fieldResults.size());
-      // TODO(b/172014416): Should report if synthesized.
-      assertThrows(RuntimeException.class, () -> fieldResults.get(0).isCompilerSynthesized());
+      assertTrue(fieldResults.get(0).isCompilerSynthesized());
     }
   }
 }
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedMethodTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedMethodTest.java
index 39228e2..08e8bd5 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedMethodTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiSynthesizedMethodTest.java
@@ -6,7 +6,7 @@
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertThrows;
+import static org.junit.Assert.assertTrue;
 
 import com.android.tools.r8.DiagnosticsHandler;
 import com.android.tools.r8.TestParameters;
@@ -52,8 +52,7 @@
       assertEquals(1, methodResults.size());
       RetraceMethodElement retraceMethodElement = methodResults.get(0);
       assertFalse(retraceMethodElement.isUnknown());
-      // TODO(b/172014416): Should report if synthesized.
-      assertThrows(RuntimeException.class, () -> methodResults.get(0).isCompilerSynthesized());
+      assertTrue(methodResults.get(0).isCompilerSynthesized());
     }
   }
 }
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiTestCollection.java b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiTestCollection.java
index 327be4d..5b20d00 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetraceApiTestCollection.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetraceApiTestCollection.java
@@ -32,7 +32,6 @@
           RetraceApiUnknownJsonTest.ApiTest.class,
           RetraceApiRewriteFrameInlineNpeTest.ApiTest.class,
           RetraceApiAmbiguousOriginalRangeTest.ApiTest.class,
-          RetraceApiOutsideLineRangeTest.ApiTest.class,
           RetraceApiRewriteFrameInlineNpeResidualTest.ApiTest.class,
           RetraceApiOutlineNoInlineTest.ApiTest.class,
           RetraceApiOutlineInlineTest.ApiTest.class,
diff --git a/src/test/java/com/android/tools/r8/retrace/api/RetracePartitionRoundTripTest.java b/src/test/java/com/android/tools/r8/retrace/api/RetracePartitionRoundTripTest.java
index 732c1ce..2f3ec65 100644
--- a/src/test/java/com/android/tools/r8/retrace/api/RetracePartitionRoundTripTest.java
+++ b/src/test/java/com/android/tools/r8/retrace/api/RetracePartitionRoundTripTest.java
@@ -140,7 +140,7 @@
               .retraceFrame(
                   context,
                   OptionalInt.of(27),
-                  Reference.methodFromDescriptor(callsiteRenamed, "s", "(I)V"))
+                  Reference.methodFromDescriptor(callsiteRenamed, "s", "(I)I"))
               .stream()
               .collect(Collectors.toList());
       assertEquals(1, retraceOutlineCallee.size());
diff --git a/src/test/java/com/android/tools/r8/retrace/mappings/FieldsWithSameMinifiedNameMapping.java b/src/test/java/com/android/tools/r8/retrace/mappings/FieldsWithSameMinifiedNameMapping.java
index fa9ca5f..0e340bb 100644
--- a/src/test/java/com/android/tools/r8/retrace/mappings/FieldsWithSameMinifiedNameMapping.java
+++ b/src/test/java/com/android/tools/r8/retrace/mappings/FieldsWithSameMinifiedNameMapping.java
@@ -5,7 +5,7 @@
 package com.android.tools.r8.retrace.mappings;
 
 import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.assertFalse;
 
 import com.android.tools.r8.references.FieldReference;
 import com.android.tools.r8.references.Reference;
@@ -20,7 +20,6 @@
 
   @Override
   public String mapping() {
-    // TODO(b/169953605): Add enough information to the map to allow precise retracing.
     return StringUtils.lines(
         "foo.bar.Baz -> foo.bar.Baz:", "  java.lang.Object f1 -> a", "  java.lang.String f2 -> a");
   }
@@ -44,13 +43,12 @@
             Reference.classFromTypeName("java.lang.Object"));
 
     RetraceFieldResult result = retracer.retraceField(mappedF1FieldReference);
-    // TODO(b/169829306): Result should not be ambigious.
-    assertTrue(result.isAmbiguous());
+    assertFalse(result.isAmbiguous());
 
     List<FieldReference> retracedFields =
         result.stream()
             .map(f -> f.getField().asKnown().getFieldReference())
             .collect(Collectors.toList());
-    assertEquals(ImmutableList.of(f1FieldReference, f2FieldReference), retracedFields);
+    assertEquals(ImmutableList.of(f1FieldReference), retracedFields);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/rewrite/arrays/ArrayLengthRewriteTest.java b/src/test/java/com/android/tools/r8/rewrite/arrays/ArrayLengthRewriteTest.java
index c38c66f..c85fbbe 100644
--- a/src/test/java/com/android/tools/r8/rewrite/arrays/ArrayLengthRewriteTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/arrays/ArrayLengthRewriteTest.java
@@ -87,26 +87,26 @@
     ClassSubject mainClass = inspector.clazz(Main.class);
     assertTrue(mainClass.isPresent());
 
-    MethodSubject primitives = mainClass.uniqueMethodWithName("primitives");
+    MethodSubject primitives = mainClass.uniqueMethodWithOriginalName("primitives");
     assertArrayLengthCallCount(primitives, debugMode ? 8 : 0);
 
-    MethodSubject nonNullReferences = mainClass.uniqueMethodWithName("nonNullReferences");
+    MethodSubject nonNullReferences = mainClass.uniqueMethodWithOriginalName("nonNullReferences");
     assertArrayLengthCallCount(nonNullReferences, debugMode ? 3 : 0);
 
     // No assertion on nullReference() because it's seen as always throwing an NPE and
     // the array-length instruction is removed. The output check validates behavior.
 
-    MethodSubject argument = mainClass.uniqueMethodWithName("argument");
+    MethodSubject argument = mainClass.uniqueMethodWithOriginalName("argument");
     assertArrayLengthCallCount(argument, 1);
 
-    MethodSubject phi = mainClass.uniqueMethodWithName("phi");
+    MethodSubject phi = mainClass.uniqueMethodWithOriginalName("phi");
     assertArrayLengthCallCount(phi, 1);
 
     // TODO(139489070): these should be rewritten and result in 0 array-length bytecodes
-    MethodSubject staticConstants = mainClass.uniqueMethodWithName("staticConstants");
+    MethodSubject staticConstants = mainClass.uniqueMethodWithOriginalName("staticConstants");
     assertArrayLengthCallCount(staticConstants, (d8 || debugMode) ? 3 : 0);
 
-    MethodSubject staticNonConstants = mainClass.uniqueMethodWithName("staticNonConstants");
+    MethodSubject staticNonConstants = mainClass.uniqueMethodWithOriginalName("staticNonConstants");
     assertArrayLengthCallCount(staticNonConstants, (d8 || debugMode) ? 2 : 0);
   }
 
diff --git a/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionConfigurationKotlinTest.java b/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionConfigurationKotlinTest.java
index c205888..efab8b4 100644
--- a/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionConfigurationKotlinTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionConfigurationKotlinTest.java
@@ -197,13 +197,13 @@
       assertEquals(
           (isR8 ? 0 : 1),
           subject
-              .uniqueMethodWithName("<clinit>")
+              .uniqueMethodWithOriginalName("<clinit>")
               .streamInstructions()
               .filter(InstructionSubject::isStaticPut)
               .count());
       assertFalse(
           subject
-              .uniqueMethodWithName("<clinit>")
+              .uniqueMethodWithOriginalName("<clinit>")
               .streamInstructions()
               .anyMatch(InstructionSubject::isConstNumber));
     } else {
@@ -211,7 +211,7 @@
       // for the class kotlin._Assertions.
       assertFalse(
           subject
-              .uniqueMethodWithName("m")
+              .uniqueMethodWithOriginalName("m")
               .streamInstructions()
               .anyMatch(InstructionSubject::isThrow));
     }
@@ -229,19 +229,19 @@
       assertEquals(
           isR8 ? 1 : 2,
           subject
-              .uniqueMethodWithName("<clinit>")
+              .uniqueMethodWithOriginalName("<clinit>")
               .streamInstructions()
               .filter(InstructionSubject::isStaticPut)
               .count());
       assertTrue(
           subject
-              .uniqueMethodWithName("<clinit>")
+              .uniqueMethodWithOriginalName("<clinit>")
               .streamInstructions()
               .anyMatch(instruction -> instruction.isConstNumber(1)));
     } else {
       assertTrue(
           subject
-              .uniqueMethodWithName("m")
+              .uniqueMethodWithOriginalName("m")
               .streamInstructions()
               .anyMatch(InstructionSubject::isThrow));
     }
@@ -266,18 +266,18 @@
       assertEquals(
           isR8 ? 1 : 2,
           subject
-              .uniqueMethodWithName("<clinit>")
+              .uniqueMethodWithOriginalName("<clinit>")
               .streamInstructions()
               .filter(InstructionSubject::isStaticPut)
               .count());
       assertFalse(
           subject
-              .uniqueMethodWithName("<clinit>")
+              .uniqueMethodWithOriginalName("<clinit>")
               .streamInstructions()
               .anyMatch(InstructionSubject::isConstNumber));
     } else {
       assertThat(subject, isPresent());
-      MethodSubject clinit = subject.uniqueMethodWithName("<clinit>");
+      MethodSubject clinit = subject.uniqueMethodWithOriginalName("<clinit>");
       if (useJvmAssertions) {
         assertTrue(clinit.streamInstructions().anyMatch(InstructionSubject::isStaticPut));
       } else {
@@ -285,7 +285,7 @@
       }
       assertTrue(
           subject
-              .uniqueMethodWithName("m")
+              .uniqueMethodWithOriginalName("m")
               .streamInstructions()
               .anyMatch(InstructionSubject::isThrow));
     }
diff --git a/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionsCheckerUtils.java b/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionsCheckerUtils.java
index c9236d4..b677f20 100644
--- a/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionsCheckerUtils.java
+++ b/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionsCheckerUtils.java
@@ -15,16 +15,16 @@
   static void checkAssertionCodeEnabled(ClassSubject subject, String methodName) {
     MatcherAssert.assertThat(subject, Matchers.isPresent());
     // <clinit> is removed by R8.
-    if (subject.uniqueMethodWithName("<clinit>").isPresent()) {
+    if (subject.uniqueMethodWithOriginalName("<clinit>").isPresent()) {
       Assert.assertFalse(
           subject
-              .uniqueMethodWithName("<clinit>")
+              .uniqueMethodWithOriginalName("<clinit>")
               .streamInstructions()
               .anyMatch(InstructionSubject::isStaticPut));
     }
     Assert.assertTrue(
         subject
-            .uniqueMethodWithName(methodName)
+            .uniqueMethodWithOriginalName(methodName)
             .streamInstructions()
             .anyMatch(InstructionSubject::isThrow));
   }
diff --git a/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionsConfigurationTest.java b/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionsConfigurationTest.java
index 9ba3328..2141fea 100644
--- a/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionsConfigurationTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/assertions/AssertionsConfigurationTest.java
@@ -125,16 +125,16 @@
   private void checkAssertionCodeRemoved(ClassSubject subject) {
     assertThat(subject, isPresent());
     // <clinit> is removed by R8 as it becomes empty.
-    if (subject.uniqueMethodWithName("<clinit>").isPresent()) {
+    if (subject.uniqueMethodWithOriginalName("<clinit>").isPresent()) {
       assertFalse(
           subject
-              .uniqueMethodWithName("<clinit>")
+              .uniqueMethodWithOriginalName("<clinit>")
               .streamInstructions()
               .anyMatch(InstructionSubject::isStaticPut));
     }
     assertFalse(
         subject
-            .uniqueMethodWithName("m")
+            .uniqueMethodWithOriginalName("m")
             .streamInstructions()
             .anyMatch(InstructionSubject::isThrow));
   }
@@ -152,12 +152,12 @@
     assertThat(subject, isPresent());
     assertTrue(
         subject
-            .uniqueMethodWithName("<clinit>")
+            .uniqueMethodWithOriginalName("<clinit>")
             .streamInstructions()
             .anyMatch(InstructionSubject::isStaticPut));
     assertTrue(
         subject
-            .uniqueMethodWithName("m")
+            .uniqueMethodWithOriginalName("m")
             .streamInstructions()
             .anyMatch(InstructionSubject::isThrow));
   }
diff --git a/src/test/java/com/android/tools/r8/rewrite/enums/EnumOptimizationTest.java b/src/test/java/com/android/tools/r8/rewrite/enums/EnumOptimizationTest.java
index 7fc0289..7cd0420 100644
--- a/src/test/java/com/android/tools/r8/rewrite/enums/EnumOptimizationTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/enums/EnumOptimizationTest.java
@@ -75,29 +75,30 @@
     assertTrue(clazz.isPresent());
 
     if (enableOptimization) {
-      assertOrdinalReplacedWithConst(clazz.uniqueMethodWithName("simple"), 1);
-      assertOrdinalReplacedWithConst(clazz.uniqueMethodWithName("local"), 1);
+      assertOrdinalReplacedWithConst(clazz.uniqueMethodWithOriginalName("simple"), 1);
+      assertOrdinalReplacedWithConst(clazz.uniqueMethodWithOriginalName("local"), 1);
       // Even replaced ordinal is concatenated (and gone).
-      assertOrdinalReplacedAndGone(clazz.uniqueMethodWithName("multipleUsages"));
-      assertOrdinalReplacedWithConst(clazz.uniqueMethodWithName("inlined"), 1);
-      assertOrdinalReplacedWithConst(clazz.uniqueMethodWithName("inSwitch"), 11);
-      assertOrdinalReplacedWithConst(clazz.uniqueMethodWithName("differentTypeStaticField"), 1);
-      assertOrdinalReplacedWithConst(clazz.uniqueMethodWithName("nonStaticGet"), 1);
-      assertOrdinalReplacedWithConst(clazz.uniqueMethodWithName("nonValueStaticField"), 1);
+      assertOrdinalReplacedAndGone(clazz.uniqueMethodWithOriginalName("multipleUsages"));
+      assertOrdinalReplacedWithConst(clazz.uniqueMethodWithOriginalName("inlined"), 1);
+      assertOrdinalReplacedWithConst(clazz.uniqueMethodWithOriginalName("inSwitch"), 11);
+      assertOrdinalReplacedWithConst(
+          clazz.uniqueMethodWithOriginalName("differentTypeStaticField"), 1);
+      assertOrdinalReplacedWithConst(clazz.uniqueMethodWithOriginalName("nonStaticGet"), 1);
+      assertOrdinalReplacedWithConst(clazz.uniqueMethodWithOriginalName("nonValueStaticField"), 1);
     } else {
-      assertOrdinalWasNotReplaced(clazz.uniqueMethodWithName("simple"));
-      assertOrdinalWasNotReplaced(clazz.uniqueMethodWithName("local"));
-      assertOrdinalWasNotReplaced(clazz.uniqueMethodWithName("multipleUsages"));
-      assertOrdinalWasNotReplaced(clazz.uniqueMethodWithName("inlined"));
-      assertOrdinalWasNotReplaced(clazz.uniqueMethodWithName("inSwitch"));
-      assertOrdinalWasNotReplaced(clazz.uniqueMethodWithName("differentTypeStaticField"));
-      assertOrdinalWasNotReplaced(clazz.uniqueMethodWithName("nonStaticGet"));
+      assertOrdinalWasNotReplaced(clazz.uniqueMethodWithOriginalName("simple"));
+      assertOrdinalWasNotReplaced(clazz.uniqueMethodWithOriginalName("local"));
+      assertOrdinalWasNotReplaced(clazz.uniqueMethodWithOriginalName("multipleUsages"));
+      assertOrdinalWasNotReplaced(clazz.uniqueMethodWithOriginalName("inlined"));
+      assertOrdinalWasNotReplaced(clazz.uniqueMethodWithOriginalName("inSwitch"));
+      assertOrdinalWasNotReplaced(clazz.uniqueMethodWithOriginalName("differentTypeStaticField"));
+      assertOrdinalWasNotReplaced(clazz.uniqueMethodWithOriginalName("nonStaticGet"));
     }
 
-    assertOrdinalWasNotReplaced(clazz.uniqueMethodWithName("libraryType"));
-    assertOrdinalWasNotReplaced(clazz.uniqueMethodWithName("phi"));
+    assertOrdinalWasNotReplaced(clazz.uniqueMethodWithOriginalName("libraryType"));
+    assertOrdinalWasNotReplaced(clazz.uniqueMethodWithOriginalName("phi"));
 
-    assertThat(clazz.uniqueMethodWithName("inlined2"), isAbsent());
+    assertThat(clazz.uniqueMethodWithOriginalName("inlined2"), isAbsent());
   }
 
   @Test
@@ -123,28 +124,29 @@
     assertTrue(clazz.isPresent());
 
     if (enableOptimization) {
-      assertNameReplacedWithConst(clazz.uniqueMethodWithName("simple"), "TWO");
-      assertNameReplacedWithConst(clazz.uniqueMethodWithName("local"), "TWO");
-      assertNameReplacedWithConst(clazz.uniqueMethodWithName("multipleUsages"), "1TWO");
-      assertNameReplacedWithConst(clazz.uniqueMethodWithName("inlined"), "TWO");
-      assertNameReplacedWithConst(clazz.uniqueMethodWithName("differentTypeStaticField"), "DOWN");
-      assertNameReplacedWithConst(clazz.uniqueMethodWithName("nonStaticGet"), "TWO");
-      assertNameReplacedWithConst(clazz.uniqueMethodWithName("nonValueStaticField"), "TWO");
+      assertNameReplacedWithConst(clazz.uniqueMethodWithOriginalName("simple"), "TWO");
+      assertNameReplacedWithConst(clazz.uniqueMethodWithOriginalName("local"), "TWO");
+      assertNameReplacedWithConst(clazz.uniqueMethodWithOriginalName("multipleUsages"), "1TWO");
+      assertNameReplacedWithConst(clazz.uniqueMethodWithOriginalName("inlined"), "TWO");
+      assertNameReplacedWithConst(
+          clazz.uniqueMethodWithOriginalName("differentTypeStaticField"), "DOWN");
+      assertNameReplacedWithConst(clazz.uniqueMethodWithOriginalName("nonStaticGet"), "TWO");
+      assertNameReplacedWithConst(clazz.uniqueMethodWithOriginalName("nonValueStaticField"), "TWO");
     } else {
-      assertNameWasNotReplaced(clazz.uniqueMethodWithName("simple"));
-      assertNameWasNotReplaced(clazz.uniqueMethodWithName("local"));
-      assertNameWasNotReplaced(clazz.uniqueMethodWithName("multipleUsages"));
-      assertNameWasNotReplaced(clazz.uniqueMethodWithName("inlined"));
-      assertNameWasNotReplaced(clazz.uniqueMethodWithName("differentTypeStaticField"));
-      assertNameWasNotReplaced(clazz.uniqueMethodWithName("nonStaticGet"));
+      assertNameWasNotReplaced(clazz.uniqueMethodWithOriginalName("simple"));
+      assertNameWasNotReplaced(clazz.uniqueMethodWithOriginalName("local"));
+      assertNameWasNotReplaced(clazz.uniqueMethodWithOriginalName("multipleUsages"));
+      assertNameWasNotReplaced(clazz.uniqueMethodWithOriginalName("inlined"));
+      assertNameWasNotReplaced(clazz.uniqueMethodWithOriginalName("differentTypeStaticField"));
+      assertNameWasNotReplaced(clazz.uniqueMethodWithOriginalName("nonStaticGet"));
     }
 
     // TODO(jakew) this should be allowed!
-    assertNameWasNotReplaced(clazz.uniqueMethodWithName("libraryType"));
+    assertNameWasNotReplaced(clazz.uniqueMethodWithOriginalName("libraryType"));
 
-    assertNameWasNotReplaced(clazz.uniqueMethodWithName("phi"));
+    assertNameWasNotReplaced(clazz.uniqueMethodWithOriginalName("phi"));
 
-    assertThat(clazz.uniqueMethodWithName("inlined2"), isAbsent());
+    assertThat(clazz.uniqueMethodWithOriginalName("inlined2"), isAbsent());
   }
 
   @Test
@@ -170,33 +172,34 @@
     ClassSubject clazz = inspector.clazz(ToStrings.class);
     assertTrue(clazz.isPresent());
 
-    assertToStringWasNotReplaced(clazz.uniqueMethodWithName("typeToString"));
-    assertToStringReplacedWithConst(clazz.uniqueMethodWithName("valueWithToString"), "one");
-    assertToStringWasNotReplaced(clazz.uniqueMethodWithName("valueWithoutToString"));
+    assertToStringWasNotReplaced(clazz.uniqueMethodWithOriginalName("typeToString"));
+    assertToStringReplacedWithConst(clazz.uniqueMethodWithOriginalName("valueWithToString"), "one");
+    assertToStringWasNotReplaced(clazz.uniqueMethodWithOriginalName("valueWithoutToString"));
 
     if (enableOptimization) {
-      assertToStringReplacedWithConst(clazz.uniqueMethodWithName("noToString"), "TWO");
-      assertToStringReplacedWithConst(clazz.uniqueMethodWithName("local"), "TWO");
-      assertToStringReplacedWithConst(clazz.uniqueMethodWithName("multipleUsages"), "TWO");
-      assertToStringReplacedWithConst(clazz.uniqueMethodWithName("inlined"), "TWO");
-      assertToStringReplacedWithConst(clazz.uniqueMethodWithName("nonValueStaticField"), "TWO");
+      assertToStringReplacedWithConst(clazz.uniqueMethodWithOriginalName("noToString"), "TWO");
+      assertToStringReplacedWithConst(clazz.uniqueMethodWithOriginalName("local"), "TWO");
+      assertToStringReplacedWithConst(clazz.uniqueMethodWithOriginalName("multipleUsages"), "TWO");
+      assertToStringReplacedWithConst(clazz.uniqueMethodWithOriginalName("inlined"), "TWO");
       assertToStringReplacedWithConst(
-          clazz.uniqueMethodWithName("differentTypeStaticField"), "DOWN");
-      assertToStringReplacedWithConst(clazz.uniqueMethodWithName("nonStaticGet"), "TWO");
+          clazz.uniqueMethodWithOriginalName("nonValueStaticField"), "TWO");
+      assertToStringReplacedWithConst(
+          clazz.uniqueMethodWithOriginalName("differentTypeStaticField"), "DOWN");
+      assertToStringReplacedWithConst(clazz.uniqueMethodWithOriginalName("nonStaticGet"), "TWO");
     } else {
-      assertToStringWasNotReplaced(clazz.uniqueMethodWithName("noToString"));
-      assertToStringWasNotReplaced(clazz.uniqueMethodWithName("local"));
-      assertToStringWasNotReplaced(clazz.uniqueMethodWithName("multipleUsages"));
-      assertToStringWasNotReplaced(clazz.uniqueMethodWithName("inlined"));
-      assertToStringWasNotReplaced(clazz.uniqueMethodWithName("nonValueStaticField"));
-      assertToStringWasNotReplaced(clazz.uniqueMethodWithName("differentTypeStaticField"));
-      assertToStringWasNotReplaced(clazz.uniqueMethodWithName("nonStaticGet"));
+      assertToStringWasNotReplaced(clazz.uniqueMethodWithOriginalName("noToString"));
+      assertToStringWasNotReplaced(clazz.uniqueMethodWithOriginalName("local"));
+      assertToStringWasNotReplaced(clazz.uniqueMethodWithOriginalName("multipleUsages"));
+      assertToStringWasNotReplaced(clazz.uniqueMethodWithOriginalName("inlined"));
+      assertToStringWasNotReplaced(clazz.uniqueMethodWithOriginalName("nonValueStaticField"));
+      assertToStringWasNotReplaced(clazz.uniqueMethodWithOriginalName("differentTypeStaticField"));
+      assertToStringWasNotReplaced(clazz.uniqueMethodWithOriginalName("nonStaticGet"));
     }
 
-    assertToStringWasNotReplaced(clazz.uniqueMethodWithName("libraryType"));
-    assertToStringWasNotReplaced(clazz.uniqueMethodWithName("phi"));
+    assertToStringWasNotReplaced(clazz.uniqueMethodWithOriginalName("libraryType"));
+    assertToStringWasNotReplaced(clazz.uniqueMethodWithOriginalName("phi"));
 
-    assertThat(clazz.uniqueMethodWithName("inlined2"), isAbsent());
+    assertThat(clazz.uniqueMethodWithOriginalName("inlined2"), isAbsent());
   }
 
   private static void assertOrdinalReplacedWithConst(MethodSubject method, int expectedConst) {
diff --git a/src/test/java/com/android/tools/r8/rewrite/switches/MaxIntSwitchTest.java b/src/test/java/com/android/tools/r8/rewrite/switches/MaxIntSwitchTest.java
index 26dcb7a..ddbefce 100644
--- a/src/test/java/com/android/tools/r8/rewrite/switches/MaxIntSwitchTest.java
+++ b/src/test/java/com/android/tools/r8/rewrite/switches/MaxIntSwitchTest.java
@@ -67,16 +67,16 @@
 
   public void checkSwitchKeys(CodeInspector inspector) {
     checkSwitch(
-        inspector.clazz(TestClass.class).uniqueMethodWithName("f"),
+        inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("f"),
         parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.K));
     checkSwitch(
-        inspector.clazz(TestClass.class).uniqueMethodWithName("g"),
+        inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("g"),
         parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.K));
     // Debug mode will not rewrite switch statements except when the MAX_INT key is present.
     assertEquals(
         inspector
             .clazz(TestClass.class)
-            .uniqueMethodWithName("h")
+            .uniqueMethodWithOriginalName("h")
             .streamInstructions()
             .filter(InstructionSubject::isSwitch)
             .count(),
@@ -85,7 +85,7 @@
                 && parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.K)));
 
     checkStringSwitch(
-        inspector.clazz(TestClass.class).uniqueMethodWithName("s"),
+        inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("s"),
         parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.K));
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/AbstractMethodOnNonAbstractClassTest.java b/src/test/java/com/android/tools/r8/shaking/AbstractMethodOnNonAbstractClassTest.java
index 0fce1c4..201971d 100644
--- a/src/test/java/com/android/tools/r8/shaking/AbstractMethodOnNonAbstractClassTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/AbstractMethodOnNonAbstractClassTest.java
@@ -55,7 +55,7 @@
     assertFalse(classSubject.isAbstract());
 
     // A.m() is also not made abstract in compat mode.
-    MethodSubject methodSubject = classSubject.uniqueMethodWithName("m");
+    MethodSubject methodSubject = classSubject.uniqueMethodWithOriginalName("m");
     assertThat(methodSubject, isPresent());
     assertFalse(methodSubject.isAbstract());
 
@@ -86,7 +86,7 @@
     assertTrue(classSubject.isAbstract());
 
     // A.m() is also made abstract in full mode.
-    MethodSubject methodSubject = classSubject.uniqueMethodWithName("m");
+    MethodSubject methodSubject = classSubject.uniqueMethodWithOriginalName("m");
     assertThat(methodSubject, isPresent());
     assertTrue(methodSubject.isAbstract());
 
diff --git a/src/test/java/com/android/tools/r8/shaking/EventuallyNonTargetedMethodTest.java b/src/test/java/com/android/tools/r8/shaking/EventuallyNonTargetedMethodTest.java
index cb750b5..ca0f8d5 100644
--- a/src/test/java/com/android/tools/r8/shaking/EventuallyNonTargetedMethodTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/EventuallyNonTargetedMethodTest.java
@@ -55,7 +55,7 @@
     ClassSubject classSubject = inspector.clazz(C.class);
     assertThat(classSubject, isPresent());
     // TODO(b/150445487): Member rebinding will rewrite B::foo to A::foo causing C::foo to remain.
-    assertThat(classSubject.uniqueMethodWithName("foo"), isPresent());
+    assertThat(classSubject.uniqueMethodWithOriginalName("foo"), isPresent());
   }
 
   @NoVerticalClassMerging
diff --git a/src/test/java/com/android/tools/r8/shaking/FieldReadsJasminTest.java b/src/test/java/com/android/tools/r8/shaking/FieldReadsJasminTest.java
index 5fec641..7ccba55 100644
--- a/src/test/java/com/android/tools/r8/shaking/FieldReadsJasminTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/FieldReadsJasminTest.java
@@ -161,7 +161,8 @@
         .compile()
         .inspect(
             inspector ->
-                assertThat(inspector.clazz(main.name).uniqueFieldWithName("sField"), isAbsent()));
+                assertThat(
+                    inspector.clazz(main.name).uniqueFieldWithOriginalName("sField"), isAbsent()));
   }
 
   @Test
@@ -196,7 +197,7 @@
           assertThat(emptyClassSubject, isPresent());
           assertTrue(emptyClassSubject.allFields().isEmpty());
 
-          MethodSubject fooMethodSubject = emptyClassSubject.uniqueMethodWithName("foo");
+          MethodSubject fooMethodSubject = emptyClassSubject.uniqueMethodWithOriginalName("foo");
           assertThat(fooMethodSubject, isPresent());
           assertTrue(
               fooMethodSubject
@@ -350,7 +351,7 @@
       ClassBuilder fieldHolder,
       String fieldName,
       boolean isR8) {
-    FieldSubject fld = inspector.clazz(fieldHolder.name).uniqueFieldWithName(fieldName);
+    FieldSubject fld = inspector.clazz(fieldHolder.name).uniqueFieldWithOriginalName(fieldName);
     if (isR8) {
       assertThat(fld, isPresentAndRenamed());
     } else {
@@ -359,7 +360,7 @@
 
     ClassSubject classSubject = inspector.clazz(className);
     assertThat(classSubject, isPresent());
-    MethodSubject methodSubject = classSubject.uniqueMethodWithName(methodName);
+    MethodSubject methodSubject = classSubject.uniqueMethodWithOriginalName(methodName);
     assertThat(methodSubject, isPresent());
     Iterator<InstructionSubject> it =
         methodSubject.iterateInstructions(InstructionSubject::isFieldAccess);
diff --git a/src/test/java/com/android/tools/r8/shaking/KeepAnnotatedMemberTest.java b/src/test/java/com/android/tools/r8/shaking/KeepAnnotatedMemberTest.java
index 5a16cf6..a47a068 100644
--- a/src/test/java/com/android/tools/r8/shaking/KeepAnnotatedMemberTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/KeepAnnotatedMemberTest.java
@@ -70,7 +70,7 @@
     assertThat(inspector.clazz(ABSENT_ANNOTATION), not(isPresent()));
     assertThat(inspector.clazz(PRESENT_ANNOTATION), isPresent());
     ClassSubject clazz = inspector.clazz(CLASS_WITH_ANNOTATED_METHOD);
-    MethodSubject method = clazz.uniqueMethodWithName(ANNOTATED_METHOD);
+    MethodSubject method = clazz.uniqueMethodWithOriginalName(ANNOTATED_METHOD);
     assertThat(method, isPresent());
   }
 
@@ -125,7 +125,7 @@
             inspector -> {
               ClassSubject clazz = inspector.clazz(CLASS_WITH_ANNOTATED_METHOD);
               assertThat(clazz, isPresent());
-              assertThat(clazz.uniqueMethodWithName(ANNOTATED_METHOD), isPresent());
+              assertThat(clazz.uniqueMethodWithOriginalName(ANNOTATED_METHOD), isPresent());
             });
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/KeepClassMembersFieldTest.java b/src/test/java/com/android/tools/r8/shaking/KeepClassMembersFieldTest.java
index 05cec26..87ef2b8 100644
--- a/src/test/java/com/android/tools/r8/shaking/KeepClassMembersFieldTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/KeepClassMembersFieldTest.java
@@ -46,7 +46,8 @@
         .compile()
         .inspect(
             inspector ->
-                assertThat(inspector.clazz(Foo.class).uniqueFieldWithName("value"), isPresent()))
+                assertThat(
+                    inspector.clazz(Foo.class).uniqueFieldWithOriginalName("value"), isPresent()))
         .run(parameters.getRuntime(), Foo.class)
         .assertSuccessWithEmptyOutput();
   }
diff --git a/src/test/java/com/android/tools/r8/shaking/KeepNonConstructorsTest.java b/src/test/java/com/android/tools/r8/shaking/KeepNonConstructorsTest.java
index a1f492b..3f24aed 100644
--- a/src/test/java/com/android/tools/r8/shaking/KeepNonConstructorsTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/KeepNonConstructorsTest.java
@@ -57,7 +57,7 @@
             inspector -> {
               ClassSubject aClassSubject = inspector.clazz(A.class);
               assertThat(aClassSubject, isPresent());
-              assertThat(aClassSubject.uniqueMethodWithName("m"), isPresent());
+              assertThat(aClassSubject.uniqueMethodWithOriginalName("m"), isPresent());
               assertEquals(1, aClassSubject.allMethods().size());
             });
   }
diff --git a/src/test/java/com/android/tools/r8/shaking/NonTargetedMethodTest.java b/src/test/java/com/android/tools/r8/shaking/NonTargetedMethodTest.java
index 2b2e440..a5704cb 100644
--- a/src/test/java/com/android/tools/r8/shaking/NonTargetedMethodTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/NonTargetedMethodTest.java
@@ -55,7 +55,7 @@
   private void checkIsFooPresent(CodeInspector inspector) {
     ClassSubject classSubject = inspector.clazz(C.class);
     assertThat(classSubject, isPresent());
-    assertThat(classSubject.uniqueMethodWithName("foo"), not(isPresent()));
+    assertThat(classSubject.uniqueMethodWithOriginalName("foo"), not(isPresent()));
   }
 
   @NoVerticalClassMerging
diff --git a/src/test/java/com/android/tools/r8/shaking/ParameterTypeTest.java b/src/test/java/com/android/tools/r8/shaking/ParameterTypeTest.java
index e38943c..0a61b39 100644
--- a/src/test/java/com/android/tools/r8/shaking/ParameterTypeTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ParameterTypeTest.java
@@ -147,7 +147,7 @@
     } else {
       assertThat(superInterface1, isPresentAndRenamed());
     }
-    MethodSubject foo = superInterface1.uniqueMethodWithName("foo");
+    MethodSubject foo = superInterface1.uniqueMethodWithOriginalName("foo");
     assertThat(foo, not(isPresent()));
     ClassSubject superInterface2 = inspector.clazz(B112452064SuperInterface2.class);
     if (enableVerticalClassMerging) {
@@ -155,7 +155,7 @@
     } else {
       assertThat(superInterface2, isPresentAndRenamed());
     }
-    MethodSubject bar = superInterface2.uniqueMethodWithName("bar");
+    MethodSubject bar = superInterface2.uniqueMethodWithOriginalName("bar");
     assertThat(bar, not(isPresent()));
     ClassSubject subInterface = inspector.clazz(B112452064SubInterface.class);
     if (enableUnusedInterfaceRemoval) {
diff --git a/src/test/java/com/android/tools/r8/shaking/PreserveDesugaredLambdaTest.java b/src/test/java/com/android/tools/r8/shaking/PreserveDesugaredLambdaTest.java
index 74b7c8a..a5c58ae 100644
--- a/src/test/java/com/android/tools/r8/shaking/PreserveDesugaredLambdaTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/PreserveDesugaredLambdaTest.java
@@ -78,7 +78,8 @@
                         .anyMatch(
                             c -> {
                               if (c.isSynthesizedJavaLambdaClass()) {
-                                assertThat(c.uniqueMethodWithName("computeTheFoo"), isPresent());
+                                assertThat(
+                                    c.uniqueMethodWithOriginalName("computeTheFoo"), isPresent());
                                 return true;
                               }
                               return false;
diff --git a/src/test/java/com/android/tools/r8/shaking/PrintConfigurationTest.java b/src/test/java/com/android/tools/r8/shaking/PrintConfigurationTest.java
index 3fc3434..9dd9eb6 100644
--- a/src/test/java/com/android/tools/r8/shaking/PrintConfigurationTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/PrintConfigurationTest.java
@@ -8,9 +8,11 @@
 import static org.hamcrest.core.StringContains.containsString;
 import static org.junit.Assert.assertEquals;
 
+import com.android.tools.r8.JdkClassFileProvider;
 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.ToolHelper;
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.StringUtils;
@@ -35,7 +37,7 @@
 
   @Parameters(name = "{0}")
   public static TestParametersCollection data() {
-    return getTestParameters().withCfRuntimes().build();
+    return getTestParameters().withSystemRuntime().build();
   }
 
   public PrintConfigurationTest(TestParameters parameters) {
@@ -83,8 +85,10 @@
             "-printconfiguration proguard-config-out.txt");
     FileUtils.writeTextFile(proguardConfigFile, proguardConfig.trim());
 
+    assertEquals(TestRuntime.getSystemRuntime(), parameters.getRuntime());
     testForExternalR8(Backend.DEX, parameters.getRuntime())
         .addProgramClasses(PrintConfigurationTestClass.class)
+        .addLibraryProvider(JdkClassFileProvider.fromSystemJdk())
         .addKeepRuleFiles(proguardConfigFile)
         .compile();
 
diff --git a/src/test/java/com/android/tools/r8/shaking/RemoveCallToStaticInitTest.java b/src/test/java/com/android/tools/r8/shaking/RemoveCallToStaticInitTest.java
index 27c98f6..7149490 100644
--- a/src/test/java/com/android/tools/r8/shaking/RemoveCallToStaticInitTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/RemoveCallToStaticInitTest.java
@@ -55,7 +55,7 @@
             inspector -> {
               ClassSubject clazz = inspector.clazz(B.class);
               assertThat(clazz, isPresent());
-              assertThat(clazz.uniqueMethodWithName("foo"), isPresent());
+              assertThat(clazz.uniqueMethodWithOriginalName("foo"), isPresent());
             });
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/UninitializedInstantiatedTypeShakingTest.java b/src/test/java/com/android/tools/r8/shaking/UninitializedInstantiatedTypeShakingTest.java
index 3cf998b..f12c211 100644
--- a/src/test/java/com/android/tools/r8/shaking/UninitializedInstantiatedTypeShakingTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/UninitializedInstantiatedTypeShakingTest.java
@@ -50,7 +50,7 @@
     ClassSubject classSubject = inspector.clazz(A.class);
     assertThat(classSubject.init(), not(isPresent()));
     // TODO(b/132669230): A.method() should be pruned.
-    assertThat(classSubject.uniqueMethodWithName("method"), isPresent());
+    assertThat(classSubject.uniqueMethodWithOriginalName("method"), isPresent());
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/shaking/addconfigurationdebugging/ConfigurationDebuggingTest.java b/src/test/java/com/android/tools/r8/shaking/addconfigurationdebugging/ConfigurationDebuggingTest.java
index ac46b3f..2fc2284 100644
--- a/src/test/java/com/android/tools/r8/shaking/addconfigurationdebugging/ConfigurationDebuggingTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/addconfigurationdebugging/ConfigurationDebuggingTest.java
@@ -167,10 +167,10 @@
 
     ClassSubject testClass = inspector.clazz(TestClass.class);
     assertThat(testClass, isPresent());
-    MethodSubject foo = testClass.uniqueMethodWithName("foo");
+    MethodSubject foo = testClass.uniqueMethodWithOriginalName("foo");
     assertThat(foo, isPresent());
     assertTrue(hasThrow(foo));
-    MethodSubject bar = testClass.uniqueMethodWithName("bar");
+    MethodSubject bar = testClass.uniqueMethodWithOriginalName("bar");
     assertThat(bar, isPresent());
     assertTrue(hasThrow(bar));
   }
diff --git a/src/test/java/com/android/tools/r8/shaking/allowshrinking/ConditionalKeepClassMethodsAllowShrinkingCompatibilityTest.java b/src/test/java/com/android/tools/r8/shaking/allowshrinking/ConditionalKeepClassMethodsAllowShrinkingCompatibilityTest.java
index abb4c9f..2217ace 100644
--- a/src/test/java/com/android/tools/r8/shaking/allowshrinking/ConditionalKeepClassMethodsAllowShrinkingCompatibilityTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/allowshrinking/ConditionalKeepClassMethodsAllowShrinkingCompatibilityTest.java
@@ -90,14 +90,14 @@
               ClassSubject bClass = inspector.clazz(B.class);
               // The class constants will force A and B to be retained, but not the methods.
               assertThat(bClass, isPresentAndRenamed());
-              assertThat(bClass.uniqueMethodWithName("foo"), not(isPresent()));
-              assertThat(bClass.uniqueMethodWithName("bar"), not(isPresent()));
+              assertThat(bClass.uniqueMethodWithOriginalName("foo"), not(isPresent()));
+              assertThat(bClass.uniqueMethodWithOriginalName("bar"), not(isPresent()));
 
               assertThat(aClass, isPresentAndRenamed());
               // The dependent rule with soft-pinning of bar never causes A::bar to be retained
               // regardless of A and A::foo being retained.
-              assertThat(aClass.uniqueMethodWithName("bar"), not(isPresent()));
-              MethodSubject aFoo = aClass.uniqueMethodWithName("foo");
+              assertThat(aClass.uniqueMethodWithOriginalName("bar"), not(isPresent()));
+              MethodSubject aFoo = aClass.uniqueMethodWithOriginalName("foo");
               if (allowOptimization) {
                 assertThat(aFoo, not(isPresent()));
               } else {
diff --git a/src/test/java/com/android/tools/r8/shaking/allowshrinking/ConditionalKeepStaticMethodAllowShrinkingCompatibilityTest.java b/src/test/java/com/android/tools/r8/shaking/allowshrinking/ConditionalKeepStaticMethodAllowShrinkingCompatibilityTest.java
index 5c99afd..4beb2fe 100644
--- a/src/test/java/com/android/tools/r8/shaking/allowshrinking/ConditionalKeepStaticMethodAllowShrinkingCompatibilityTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/allowshrinking/ConditionalKeepStaticMethodAllowShrinkingCompatibilityTest.java
@@ -77,7 +77,8 @@
               assertThat(companionClassSubject, notIf(isPresent(), allowOptimization));
 
               MethodSubject mainMethodSubject = testClassSubject.mainMethod();
-              MethodSubject getMethodSubject = companionClassSubject.uniqueMethodWithName("get");
+              MethodSubject getMethodSubject =
+                  companionClassSubject.uniqueMethodWithOriginalName("get");
 
               if (allowOptimization) {
                 assertTrue(
diff --git a/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepAllowShrinkingCompatibilityTest.java b/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepAllowShrinkingCompatibilityTest.java
index e6e8b69..4bd9bfd 100644
--- a/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepAllowShrinkingCompatibilityTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepAllowShrinkingCompatibilityTest.java
@@ -93,8 +93,8 @@
               // The class constants will force A and B to be retained, but not the foo methods.
               assertThat(bClass, isPresentAndRenamed(allowObfuscation));
               assertThat(aClass, isPresentAndRenamed(allowObfuscation));
-              assertThat(bClass.uniqueMethodWithName("foo"), not(isPresent()));
-              MethodSubject aFoo = aClass.uniqueMethodWithName("foo");
+              assertThat(bClass.uniqueMethodWithOriginalName("foo"), not(isPresent()));
+              MethodSubject aFoo = aClass.uniqueMethodWithOriginalName("foo");
               if (allowOptimization) {
                 assertThat(aFoo, not(isPresent()));
               } else {
diff --git a/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepAllowShrinkingIncludeDescriptorClassesCompatibilityTest.java b/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepAllowShrinkingIncludeDescriptorClassesCompatibilityTest.java
index 44abb34..905951a 100644
--- a/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepAllowShrinkingIncludeDescriptorClassesCompatibilityTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepAllowShrinkingIncludeDescriptorClassesCompatibilityTest.java
@@ -62,8 +62,9 @@
               assertThat(inspector.clazz(TestClass.class), isPresent());
 
               ClassSubject softPinnedClass = inspector.clazz(SoftPinned.class);
-              assertThat(softPinnedClass.uniqueMethodWithName("used"), isPresentAndNotRenamed());
-              assertThat(softPinnedClass.uniqueMethodWithName("unused"), not(isPresent()));
+              assertThat(
+                  softPinnedClass.uniqueMethodWithOriginalName("used"), isPresentAndNotRenamed());
+              assertThat(softPinnedClass.uniqueMethodWithOriginalName("unused"), not(isPresent()));
 
               // SoftPinned.used(A) remains thus A must be present and not renamed.
               assertThat(inspector.clazz(A.class), isPresentAndNotRenamed());
diff --git a/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepClassFieldsAllowShrinkingCompatibilityTest.java b/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepClassFieldsAllowShrinkingCompatibilityTest.java
index e0e151a..0d73c09 100644
--- a/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepClassFieldsAllowShrinkingCompatibilityTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepClassFieldsAllowShrinkingCompatibilityTest.java
@@ -90,10 +90,10 @@
               assertThat(aClass, isPresentAndRenamed());
               assertThat(bClass, isPresentAndRenamed());
 
-              FieldSubject aFoo = aClass.uniqueFieldWithName("foo");
-              FieldSubject aBar = aClass.uniqueFieldWithName("bar");
-              FieldSubject bFoo = bClass.uniqueFieldWithName("foo");
-              FieldSubject bBar = bClass.uniqueFieldWithName("bar");
+              FieldSubject aFoo = aClass.uniqueFieldWithOriginalName("foo");
+              FieldSubject aBar = aClass.uniqueFieldWithOriginalName("bar");
+              FieldSubject bFoo = bClass.uniqueFieldWithOriginalName("foo");
+              FieldSubject bBar = bClass.uniqueFieldWithOriginalName("bar");
 
               if (allowOptimization) {
                 // PG fails to optimize out the referenced field.
diff --git a/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepClassMethodsAllowShrinkingCompatibilityTest.java b/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepClassMethodsAllowShrinkingCompatibilityTest.java
index 5305ced..ff2da06 100644
--- a/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepClassMethodsAllowShrinkingCompatibilityTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepClassMethodsAllowShrinkingCompatibilityTest.java
@@ -92,14 +92,14 @@
               ClassSubject bClass = inspector.clazz(B.class);
               // The class constants will force A and B to be retained, but not the methods.
               assertThat(bClass, isPresentAndRenamed());
-              assertThat(bClass.uniqueMethodWithName("foo"), not(isPresent()));
-              assertThat(bClass.uniqueMethodWithName("bar"), not(isPresent()));
+              assertThat(bClass.uniqueMethodWithOriginalName("foo"), not(isPresent()));
+              assertThat(bClass.uniqueMethodWithOriginalName("bar"), not(isPresent()));
 
               assertThat(aClass, isPresentAndRenamed());
               // The dependent rule with soft-pinning of bar never causes A::bar to be retained
               // regardless of A and A::foo being retained.
-              assertThat(aClass.uniqueMethodWithName("bar"), not(isPresent()));
-              MethodSubject aFoo = aClass.uniqueMethodWithName("foo");
+              assertThat(aClass.uniqueMethodWithOriginalName("bar"), not(isPresent()));
+              MethodSubject aFoo = aClass.uniqueMethodWithOriginalName("foo");
               if (allowOptimization) {
                 assertThat(aFoo, not(isPresent()));
               } else {
diff --git a/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepMethodNameCompatibilityTest.java b/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepMethodNameCompatibilityTest.java
index 4266e57..4d62baf 100644
--- a/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepMethodNameCompatibilityTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepMethodNameCompatibilityTest.java
@@ -54,7 +54,8 @@
         .inspect(
             inspector ->
                 assertThat(
-                    inspector.clazz(TestClass.class).uniqueMethodWithName("test"), isPresent()))
+                    inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("test"),
+                    isPresent()))
         .run(parameters.getRuntime(), TestClass.class)
         .assertSuccessWithOutputLines("foo");
   }
diff --git a/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepStaticFieldAllowShrinkingCompatibilityTest.java b/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepStaticFieldAllowShrinkingCompatibilityTest.java
index 2322f85..6f8cf2a 100644
--- a/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepStaticFieldAllowShrinkingCompatibilityTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepStaticFieldAllowShrinkingCompatibilityTest.java
@@ -74,7 +74,7 @@
 
               MethodSubject mainMethodSubject = testClassSubject.mainMethod();
               ClassSubject companionClassSubject = inspector.clazz(Companion.class);
-              FieldSubject xFieldSubject = companionClassSubject.uniqueFieldWithName("x");
+              FieldSubject xFieldSubject = companionClassSubject.uniqueFieldWithOriginalName("x");
 
               // PG fails to optimize fields regardless of keep flags.
               if (allowOptimization && shrinker.isR8()) {
diff --git a/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepStaticMethodAllowShrinkingCompatibilityTest.java b/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepStaticMethodAllowShrinkingCompatibilityTest.java
index 9dbdbb4..043e0e9 100644
--- a/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepStaticMethodAllowShrinkingCompatibilityTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/allowshrinking/KeepStaticMethodAllowShrinkingCompatibilityTest.java
@@ -75,7 +75,8 @@
               assertThat(companionClassSubject, notIf(isPresent(), allowOptimization));
 
               MethodSubject mainMethodSubject = testClassSubject.mainMethod();
-              MethodSubject getMethodSubject = companionClassSubject.uniqueMethodWithName("get");
+              MethodSubject getMethodSubject =
+                  companionClassSubject.uniqueMethodWithOriginalName("get");
 
               if (allowOptimization) {
                 assertTrue(
diff --git a/src/test/java/com/android/tools/r8/shaking/annotations/AnnotationsOnFieldsTest.java b/src/test/java/com/android/tools/r8/shaking/annotations/AnnotationsOnFieldsTest.java
index 55556b4..2f5eab9 100644
--- a/src/test/java/com/android/tools/r8/shaking/annotations/AnnotationsOnFieldsTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/annotations/AnnotationsOnFieldsTest.java
@@ -63,12 +63,12 @@
               assertThat(clazz, isPresent());
               assertThat(clazz, isPresentAndRenamed());
 
-              FieldSubject field = clazz.uniqueFieldWithName("field");
+              FieldSubject field = clazz.uniqueFieldWithOriginalName("field");
               assertThat(field, isPresent());
               assertThat(field.annotation(FieldAnnotation.class.getTypeName()), isPresent());
               assertThat(inspector.clazz(FieldAnnotationUse.class), isPresentAndRenamed());
 
-              FieldSubject staticField = clazz.uniqueFieldWithName("staticField");
+              FieldSubject staticField = clazz.uniqueFieldWithOriginalName("staticField");
               assertThat(staticField, isPresent());
               assertThat(
                   staticField.annotation(StaticFieldAnnotation.class.getTypeName()), isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/annotations/KeepDisallowAnnotationRemovalAllowOptimizationTest.java b/src/test/java/com/android/tools/r8/shaking/annotations/KeepDisallowAnnotationRemovalAllowOptimizationTest.java
index 62bcf76..d07689d 100644
--- a/src/test/java/com/android/tools/r8/shaking/annotations/KeepDisallowAnnotationRemovalAllowOptimizationTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/annotations/KeepDisallowAnnotationRemovalAllowOptimizationTest.java
@@ -64,13 +64,14 @@
 
               // The annotation on getNonNull() is kept meanwhile it is subject to other
               // optimizations.
-              MethodSubject getNonNullSubject = classSubject.uniqueMethodWithName("getNonNull");
+              MethodSubject getNonNullSubject =
+                  classSubject.uniqueMethodWithOriginalName("getNonNull");
               assertThat(getNonNullSubject, isPresentAndRenamed());
               assertThat(getNonNullSubject.annotation(NeverInline.class), isPresent());
 
               // Check that the code has been optimized using the fact that getNonNull() returns a
               // non-null value.
-              assertThat(classSubject.uniqueMethodWithName("dead"), isAbsent());
+              assertThat(classSubject.uniqueMethodWithOriginalName("dead"), isAbsent());
               assertThat(classSubject.mainMethod(), not(containsThrow()));
             })
         .run(parameters.getRuntime(), Main.class)
diff --git a/src/test/java/com/android/tools/r8/shaking/annotations/LibraryAndMissingAnnotationsTest.java b/src/test/java/com/android/tools/r8/shaking/annotations/LibraryAndMissingAnnotationsTest.java
index e78d675..135287e 100644
--- a/src/test/java/com/android/tools/r8/shaking/annotations/LibraryAndMissingAnnotationsTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/annotations/LibraryAndMissingAnnotationsTest.java
@@ -125,7 +125,7 @@
               ClassSubject clazz = inspector.clazz(Foo.class);
               assertThat(clazz, isPresent());
               assertThat(clazz.annotation(LibraryAnnotation.class.getTypeName()), isPresent());
-              MethodSubject foo = clazz.uniqueMethodWithName("foo");
+              MethodSubject foo = clazz.uniqueMethodWithOriginalName("foo");
               assertThat(foo, isPresent());
               assertThat(foo.annotation(LibraryAnnotation.class.getTypeName()), isPresent());
               assertFalse(foo.getMethod().parameterAnnotationsList.isEmpty());
@@ -139,7 +139,7 @@
                       .toSourceString());
               assertThat(
                   clazz
-                      .uniqueFieldWithName("bar")
+                      .uniqueFieldWithOriginalName("bar")
                       .annotation(LibraryAnnotation.class.getTypeName()),
                   isPresent());
             })
diff --git a/src/test/java/com/android/tools/r8/shaking/annotations/ProgramAnnotationRemovalTest.java b/src/test/java/com/android/tools/r8/shaking/annotations/ProgramAnnotationRemovalTest.java
index da0b781..6aeec9f 100644
--- a/src/test/java/com/android/tools/r8/shaking/annotations/ProgramAnnotationRemovalTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/annotations/ProgramAnnotationRemovalTest.java
@@ -77,14 +77,14 @@
     assertThat(testClassSubject, isPresent());
 
     MethodSubject methodWithLiveProgramAnnotationSubject =
-        testClassSubject.uniqueMethodWithName("methodWithLiveProgramAnnotation");
+        testClassSubject.uniqueMethodWithOriginalName("methodWithLiveProgramAnnotation");
     assertThat(methodWithLiveProgramAnnotationSubject, isPresent());
     assertEquals(
         BooleanUtils.intValue(enableCompatMode),
         methodWithLiveProgramAnnotationSubject.getMethod().annotations().size());
 
     MethodSubject methodWithDeadProgramAnnotationSubject =
-        testClassSubject.uniqueMethodWithName("methodWithDeadProgramAnnotation");
+        testClassSubject.uniqueMethodWithOriginalName("methodWithDeadProgramAnnotation");
     assertThat(methodWithDeadProgramAnnotationSubject, isPresent());
     assertEquals(0, methodWithDeadProgramAnnotationSubject.getMethod().annotations().size());
 
diff --git a/src/test/java/com/android/tools/r8/shaking/annotations/ReflectiveAnnotationUseTest.java b/src/test/java/com/android/tools/r8/shaking/annotations/ReflectiveAnnotationUseTest.java
index 852c86f..d0c5bdc 100644
--- a/src/test/java/com/android/tools/r8/shaking/annotations/ReflectiveAnnotationUseTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/annotations/ReflectiveAnnotationUseTest.java
@@ -113,13 +113,13 @@
             .inspector();
     ClassSubject clazz = inspector.clazz(ANNOTATION_NAME);
     assertThat(clazz, isPresentAndNotRenamed());
-    MethodSubject f1 = clazz.uniqueMethodWithName("f1");
+    MethodSubject f1 = clazz.uniqueMethodWithOriginalName("f1");
     assertThat(f1, isPresentAndNotRenamed());
-    MethodSubject f2 = clazz.uniqueMethodWithName("f2");
+    MethodSubject f2 = clazz.uniqueMethodWithOriginalName("f2");
     assertThat(f2, isPresentAndNotRenamed());
-    MethodSubject f3 = clazz.uniqueMethodWithName("f3");
+    MethodSubject f3 = clazz.uniqueMethodWithOriginalName("f3");
     assertThat(f3, isPresentAndNotRenamed());
-    MethodSubject f4 = clazz.uniqueMethodWithName("f4");
+    MethodSubject f4 = clazz.uniqueMethodWithOriginalName("f4");
     assertThat(f4, isPresentAndNotRenamed());
 
     ClassSubject impl = inspector.clazz(IMPL_CLASS_NAME);
@@ -155,13 +155,13 @@
     ClassSubject clazz = inspector.clazz(ANNOTATION_NAME);
     assertThat(clazz, isPresent());
     assertEquals(minify, clazz.isRenamed());
-    MethodSubject f1 = clazz.uniqueMethodWithName("f1");
+    MethodSubject f1 = clazz.uniqueMethodWithOriginalName("f1");
     assertThat(f1, isPresentAndNotRenamed());
-    MethodSubject f2 = clazz.uniqueMethodWithName("f2");
+    MethodSubject f2 = clazz.uniqueMethodWithOriginalName("f2");
     assertThat(f2, isPresentAndNotRenamed());
-    MethodSubject f3 = clazz.uniqueMethodWithName("f3");
+    MethodSubject f3 = clazz.uniqueMethodWithOriginalName("f3");
     assertThat(f3, not(isPresent()));
-    MethodSubject f4 = clazz.uniqueMethodWithName("f4");
+    MethodSubject f4 = clazz.uniqueMethodWithOriginalName("f4");
     assertThat(f4, not(isPresent()));
 
     ClassSubject impl = inspector.clazz(IMPL_CLASS_NAME);
@@ -193,13 +193,13 @@
     ClassSubject clazz = inspector.clazz(ANNOTATION_NAME);
     assertThat(clazz, isPresent());
     assertEquals(minify, clazz.isRenamed());
-    MethodSubject f1 = clazz.uniqueMethodWithName("f1");
+    MethodSubject f1 = clazz.uniqueMethodWithOriginalName("f1");
     assertThat(f1, isPresentAndNotRenamed());
-    MethodSubject f2 = clazz.uniqueMethodWithName("f2");
+    MethodSubject f2 = clazz.uniqueMethodWithOriginalName("f2");
     assertThat(f2, isPresentAndNotRenamed());
-    MethodSubject f3 = clazz.uniqueMethodWithName("f3");
+    MethodSubject f3 = clazz.uniqueMethodWithOriginalName("f3");
     assertThat(f3, not(isPresent()));
-    MethodSubject f4 = clazz.uniqueMethodWithName("f4");
+    MethodSubject f4 = clazz.uniqueMethodWithOriginalName("f4");
     assertThat(f4, not(isPresent()));
 
     ClassSubject impl = inspector.clazz(IMPL_CLASS_NAME);
@@ -230,13 +230,13 @@
     ClassSubject clazz = inspector.clazz(ANNOTATION_NAME);
     assertThat(clazz, isPresent());
     assertEquals(minify, clazz.isRenamed());
-    MethodSubject f1 = clazz.uniqueMethodWithName("f1");
+    MethodSubject f1 = clazz.uniqueMethodWithOriginalName("f1");
     assertThat(f1, isPresent());
-    MethodSubject f2 = clazz.uniqueMethodWithName("f2");
+    MethodSubject f2 = clazz.uniqueMethodWithOriginalName("f2");
     assertThat(f2, isPresent());
-    MethodSubject f3 = clazz.uniqueMethodWithName("f3");
+    MethodSubject f3 = clazz.uniqueMethodWithOriginalName("f3");
     assertThat(f3, not(isPresent()));
-    MethodSubject f4 = clazz.uniqueMethodWithName("f4");
+    MethodSubject f4 = clazz.uniqueMethodWithOriginalName("f4");
     assertThat(f4, not(isPresent()));
 
     ClassSubject impl = inspector.clazz(IMPL_CLASS_NAME);
diff --git a/src/test/java/com/android/tools/r8/shaking/annotations/SerializedNameAlternateTest.java b/src/test/java/com/android/tools/r8/shaking/annotations/SerializedNameAlternateTest.java
index 7d2173f..683a18c 100644
--- a/src/test/java/com/android/tools/r8/shaking/annotations/SerializedNameAlternateTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/annotations/SerializedNameAlternateTest.java
@@ -120,7 +120,7 @@
             EXPECTED_DEFAULT_VALUE_ANNOTATION, EXPECTED_SERIALIZED_ANNOTATION)
         .inspect(
             codeInspector -> {
-              FieldSubject bar = codeInspector.clazz(Foo.class).uniqueFieldWithName("bar");
+              FieldSubject bar = codeInspector.clazz(Foo.class).uniqueFieldWithOriginalName("bar");
               AnnotationSubject annotation = bar.annotation(SerializedName.class.getTypeName());
               assertThat(annotation, isPresent());
               assertEquals(0, annotation.getAnnotation().elements.length);
diff --git a/src/test/java/com/android/tools/r8/shaking/array/DeadArrayLengthTest.java b/src/test/java/com/android/tools/r8/shaking/array/DeadArrayLengthTest.java
index a4ba893..ff7cb9e 100644
--- a/src/test/java/com/android/tools/r8/shaking/array/DeadArrayLengthTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/array/DeadArrayLengthTest.java
@@ -42,15 +42,15 @@
     ClassSubject main = inspector.clazz(MAIN);
     assertThat(main, isPresent());
 
-    MethodSubject nonNull = main.uniqueMethodWithName("clearlyNonNull");
+    MethodSubject nonNull = main.uniqueMethodWithOriginalName("clearlyNonNull");
     assertThat(nonNull, isPresent());
     assertEquals(0, countArrayLength(nonNull));
 
-    MethodSubject nullable = main.uniqueMethodWithName("isNullable");
+    MethodSubject nullable = main.uniqueMethodWithOriginalName("isNullable");
     assertThat(nullable, isPresent());
     assertEquals(isR8 ? 0 : 1, countArrayLength(nullable));
 
-    MethodSubject nullCheck = main.uniqueMethodWithName("afterNullCheck");
+    MethodSubject nullCheck = main.uniqueMethodWithOriginalName("afterNullCheck");
     assertThat(nullCheck, isPresent());
     assertEquals(isR8 ? 0 : 1, countArrayLength(nullCheck));
   }
diff --git a/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumeNoSideEffectsForJavaLangClassTest.java b/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumeNoSideEffectsForJavaLangClassTest.java
index fed4e6d..6419f78 100644
--- a/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumeNoSideEffectsForJavaLangClassTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumeNoSideEffectsForJavaLangClassTest.java
@@ -55,11 +55,14 @@
     ClassSubject testClassSubject = inspector.clazz(TestClass.class);
     assertThat(testClassSubject, isPresent());
 
-    inspectMethod(testClassSubject.uniqueMethodWithName("testModelingOfSideEffects"), false, false);
     inspectMethod(
-        testClassSubject.uniqueMethodWithName("testModelingOfSideEffectsMaybeNull"), true, false);
+        testClassSubject.uniqueMethodWithOriginalName("testModelingOfSideEffects"), false, false);
     inspectMethod(
-        testClassSubject.uniqueMethodWithName("testModelingOfSideEffectsMaybeSubclass"),
+        testClassSubject.uniqueMethodWithOriginalName("testModelingOfSideEffectsMaybeNull"),
+        true,
+        false);
+    inspectMethod(
+        testClassSubject.uniqueMethodWithOriginalName("testModelingOfSideEffectsMaybeSubclass"),
         false,
         true);
   }
diff --git a/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsPropagationWithoutMatchingDefinitionTest.java b/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsPropagationWithoutMatchingDefinitionTest.java
index ad79ff7..0cabc92 100644
--- a/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsPropagationWithoutMatchingDefinitionTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsPropagationWithoutMatchingDefinitionTest.java
@@ -69,7 +69,7 @@
         mainMethod.streamInstructions().noneMatch(
             i -> i.isInvoke() && i.getMethod().name.toString().equals("debug")));
 
-    MethodSubject testInvokeInterface = main.uniqueMethodWithName("testInvokeInterface");
+    MethodSubject testInvokeInterface = main.uniqueMethodWithOriginalName("testInvokeInterface");
     assertThat(testInvokeInterface, not(isPresent()));
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsWithMultipleTargetsTest.java b/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsWithMultipleTargetsTest.java
index 41311d2..3fd3987 100644
--- a/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsWithMultipleTargetsTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsWithMultipleTargetsTest.java
@@ -68,10 +68,10 @@
           mainMethod.streamInstructions().noneMatch(
               i -> i.isInvoke() && i.getMethod().name.toString().equals("info")));
 
-      MethodSubject testInvokeInterface = main.uniqueMethodWithName("testInvokeInterface");
+      MethodSubject testInvokeInterface = main.uniqueMethodWithOriginalName("testInvokeInterface");
       assertThat(testInvokeInterface, not(isPresent()));
 
-      FieldSubject tag = main.uniqueFieldWithName("TAG");
+      FieldSubject tag = main.uniqueFieldWithOriginalName("TAG");
       assertThat(tag, not(isPresent()));
     }
   }
diff --git a/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsWithoutReturnValueTest.java b/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsWithoutReturnValueTest.java
index 352a53c..78f813d 100644
--- a/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsWithoutReturnValueTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/assumenosideeffects/AssumenosideeffectsWithoutReturnValueTest.java
@@ -84,7 +84,7 @@
   private void verifyDebugMethodIsRemoved(CodeInspector inspector) {
     ClassSubject main = inspector.clazz(MAIN);
     assertThat(main, isPresent());
-    MethodSubject debug = main.uniqueMethodWithName("debug");
+    MethodSubject debug = main.uniqueMethodWithOriginalName("debug");
     assertThat(debug, not(isPresent()));
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/assumevalues/AssumeValuesMaterializeFieldReadTest.java b/src/test/java/com/android/tools/r8/shaking/assumevalues/AssumeValuesMaterializeFieldReadTest.java
index 0caf415..31930b0 100644
--- a/src/test/java/com/android/tools/r8/shaking/assumevalues/AssumeValuesMaterializeFieldReadTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/assumevalues/AssumeValuesMaterializeFieldReadTest.java
@@ -49,7 +49,7 @@
               ClassSubject mainClassSubject = inspector.clazz(Main.class);
               assertThat(mainClassSubject, isPresent());
 
-              MethodSubject getMethodSubject = mainClassSubject.uniqueMethodWithName("get");
+              MethodSubject getMethodSubject = mainClassSubject.uniqueMethodWithOriginalName("get");
               assertThat(getMethodSubject, isAbsent());
             })
         .run(parameters.getRuntime(), Main.class)
diff --git a/src/test/java/com/android/tools/r8/shaking/assumevalues/AssumevaluesWithMultipleTargetsTest.java b/src/test/java/com/android/tools/r8/shaking/assumevalues/AssumevaluesWithMultipleTargetsTest.java
index a6d7d67..4455ff1 100644
--- a/src/test/java/com/android/tools/r8/shaking/assumevalues/AssumevaluesWithMultipleTargetsTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/assumevalues/AssumevaluesWithMultipleTargetsTest.java
@@ -128,7 +128,7 @@
           mainMethod.streamInstructions().noneMatch(
               i -> i.isInvoke() && i.getMethod().name.toString().equals("m")));
 
-      MethodSubject testInvokeInterface = main.uniqueMethodWithName("testInvokeInterface");
+      MethodSubject testInvokeInterface = main.uniqueMethodWithOriginalName("testInvokeInterface");
       assertThat(testInvokeInterface, isPresent());
       // With call site optimizations, the dynamic type of the argument is accurate (Impl1),
       // hence the accurate resolution of the method call, resulting in rule application.
diff --git a/src/test/java/com/android/tools/r8/shaking/assumevalues/DeadFieldAfterAssumevaluesTest.java b/src/test/java/com/android/tools/r8/shaking/assumevalues/DeadFieldAfterAssumevaluesTest.java
index 81d33fc..4509531 100644
--- a/src/test/java/com/android/tools/r8/shaking/assumevalues/DeadFieldAfterAssumevaluesTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/assumevalues/DeadFieldAfterAssumevaluesTest.java
@@ -78,7 +78,7 @@
     assertTrue(mainMethod.streamInstructions()
         .noneMatch(i -> i.isIf() || i.isIfEqz() || i.isIfNez()));
 
-    FieldSubject hasR8 = main.uniqueFieldWithName("HAS_R8");
+    FieldSubject hasR8 = main.uniqueFieldWithOriginalName("HAS_R8");
     assertThat(hasR8, not(isPresent()));
 
     MethodSubject clinit = main.clinit();
diff --git a/src/test/java/com/android/tools/r8/shaking/assumevalues/SynthesizedRulesFromApiLevelTest.java b/src/test/java/com/android/tools/r8/shaking/assumevalues/SynthesizedRulesFromApiLevelTest.java
index ce5e0fe..ee49eb3 100644
--- a/src/test/java/com/android/tools/r8/shaking/assumevalues/SynthesizedRulesFromApiLevelTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/assumevalues/SynthesizedRulesFromApiLevelTest.java
@@ -230,13 +230,13 @@
   private void compatCodePresent(CodeInspector inspector) {
     ClassSubject compatLibrary = inspector.clazz(compatLibraryClassName);
     assertThat(compatLibrary, isPresent());
-    assertThat(compatLibrary.uniqueMethodWithName("compatMethod"), isPresent());
+    assertThat(compatLibrary.uniqueMethodWithOriginalName("compatMethod"), isPresent());
   }
 
   private void compatCodeNotPresent(CodeInspector inspector) {
     ClassSubject compatLibrary = inspector.clazz(compatLibraryClassName);
     assertThat(compatLibrary, isPresent());
-    assertThat(compatLibrary.uniqueMethodWithName("compatMethod"), not(isPresent()));
+    assertThat(compatLibrary.uniqueMethodWithOriginalName("compatMethod"), not(isPresent()));
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/shaking/attributes/KeepAttributesDotsTest.java b/src/test/java/com/android/tools/r8/shaking/attributes/KeepAttributesDotsTest.java
index 5c7a755..f37d00a 100644
--- a/src/test/java/com/android/tools/r8/shaking/attributes/KeepAttributesDotsTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/attributes/KeepAttributesDotsTest.java
@@ -69,9 +69,9 @@
   private void inspect(CodeInspector inspector) {
     ClassSubject clazz = inspector.clazz(Main.class);
     assertTrue(clazz.getDexProgramClass().annotations().isEmpty());
-    MethodSubject main = clazz.uniqueMethodWithName("main");
+    MethodSubject main = clazz.uniqueMethodWithOriginalName("main");
     assertTrue(main.getMethod().annotations().isEmpty());
-    FieldSubject field = clazz.uniqueFieldWithName("field");
+    FieldSubject field = clazz.uniqueFieldWithOriginalName("field");
     assertTrue(field.getField().annotations().isEmpty());
     assertTrue(
         clazz.getDexProgramClass().sourceFile == null
diff --git a/src/test/java/com/android/tools/r8/shaking/attributes/KeepSignatureTest.java b/src/test/java/com/android/tools/r8/shaking/attributes/KeepSignatureTest.java
index 84b88e6..2d2160b 100644
--- a/src/test/java/com/android/tools/r8/shaking/attributes/KeepSignatureTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/attributes/KeepSignatureTest.java
@@ -96,17 +96,18 @@
     assertThat(keptClass, isPresent());
     assertEquals(
         "<T:Ljava/lang/Object;>Ljava/lang/Object;", keptClass.getFinalSignatureAttribute());
-    FieldSubject keptField = keptClass.uniqueFieldWithName("keptField");
+    FieldSubject keptField = keptClass.uniqueFieldWithOriginalName("keptField");
     assertThat(keptField, isPresent());
     assertEquals("TT;", keptField.getFinalSignatureAttribute());
-    MethodSubject keptMethod = keptClass.uniqueMethodWithName("keptMethod");
+    MethodSubject keptMethod = keptClass.uniqueMethodWithOriginalName("keptMethod");
     assertThat(keptMethod, isPresent());
     assertEquals("<R:Ljava/lang/Object;>(TT;)TR;", keptMethod.getFinalSignatureAttribute());
 
     // For all remaining classes and members, we should only keep signatures if in compat mode.
-    checkMemberSignature(keptClass.uniqueFieldWithName("notKeptField"), keepForNotKept, "TT;");
     checkMemberSignature(
-        keptClass.uniqueMethodWithName("notKeptMethod"),
+        keptClass.uniqueFieldWithOriginalName("notKeptField"), keepForNotKept, "TT;");
+    checkMemberSignature(
+        keptClass.uniqueMethodWithOriginalName("notKeptMethod"),
         keepForNotKept,
         "<R:Ljava/lang/Object;>(TT;)TR;");
 
@@ -119,9 +120,11 @@
       assertNull(notKeptClass.getFinalSignatureAttribute());
     }
     checkMemberSignature(
-        notKeptClass.uniqueFieldWithName("notKeptField"), keepForNotKept, "Ljava/util/List<TP;>;");
+        notKeptClass.uniqueFieldWithOriginalName("notKeptField"),
+        keepForNotKept,
+        "Ljava/util/List<TP;>;");
     checkMemberSignature(
-        notKeptClass.uniqueMethodWithName("notKeptMethod"),
+        notKeptClass.uniqueMethodWithOriginalName("notKeptMethod"),
         keepForNotKept,
         "(TP;TP;)Ljava/util/List<TP;>;");
   }
diff --git a/src/test/java/com/android/tools/r8/shaking/convertchecknotnull/ConvertCheckNotNullTest.java b/src/test/java/com/android/tools/r8/shaking/convertchecknotnull/ConvertCheckNotNullTest.java
index 27f7735..5b2bd38 100644
--- a/src/test/java/com/android/tools/r8/shaking/convertchecknotnull/ConvertCheckNotNullTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/convertchecknotnull/ConvertCheckNotNullTest.java
@@ -76,9 +76,11 @@
                       .count());
 
               assertThat(
-                  mainClassSubject.uniqueMethodWithName("requireNonNullWithoutReturn"), isAbsent());
+                  mainClassSubject.uniqueMethodWithOriginalName("requireNonNullWithoutReturn"),
+                  isAbsent());
               assertThat(
-                  mainClassSubject.uniqueMethodWithName("requireNonNullWithReturn"), isAbsent());
+                  mainClassSubject.uniqueMethodWithOriginalName("requireNonNullWithReturn"),
+                  isAbsent());
             })
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutput(getExpectedOutput());
diff --git a/src/test/java/com/android/tools/r8/shaking/desugar/dflt/DefaultMethodsTest.java b/src/test/java/com/android/tools/r8/shaking/desugar/dflt/DefaultMethodsTest.java
index 14c99ba..620c73d 100644
--- a/src/test/java/com/android/tools/r8/shaking/desugar/dflt/DefaultMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/desugar/dflt/DefaultMethodsTest.java
@@ -172,64 +172,72 @@
     assertThat(superIfaceSubject, isPresent());
     if (interfaceMethodsKept) {
       assertEquals(
-          expected.contains("m1"), superIfaceSubject.uniqueMethodWithName("m1").isPresent());
+          expected.contains("m1"),
+          superIfaceSubject.uniqueMethodWithOriginalName("m1").isPresent());
       if (expected.contains("m1")) {
-        assertThat(superIfaceSubject.uniqueMethodWithName("m1"), isAbstract());
+        assertThat(superIfaceSubject.uniqueMethodWithOriginalName("m1"), isAbstract());
       }
     }
     ClassSubject subIfaceSubject = inspector.clazz(SubIface.class);
     assertThat(subIfaceSubject, isPresent());
     if (interfaceMethodsKept) {
-      assertEquals(expected.contains("m2"), subIfaceSubject.uniqueMethodWithName("m2").isPresent());
+      assertEquals(
+          expected.contains("m2"), subIfaceSubject.uniqueMethodWithOriginalName("m2").isPresent());
       if (expected.contains("m2")) {
-        assertThat(subIfaceSubject.uniqueMethodWithName("m2"), isAbstract());
+        assertThat(subIfaceSubject.uniqueMethodWithOriginalName("m2"), isAbstract());
       }
     }
     ClassSubject subSubIfaceSubject = inspector.clazz(SubSubIface.class);
     assertThat(subSubIfaceSubject, isPresent());
     if (interfaceMethodsKept) {
       assertEquals(
-          expected.contains("m3"), subSubIfaceSubject.uniqueMethodWithName("m3").isPresent());
+          expected.contains("m3"),
+          subSubIfaceSubject.uniqueMethodWithOriginalName("m3").isPresent());
       if (expected.contains("m3")) {
-        assertThat(subSubIfaceSubject.uniqueMethodWithName("m3"), isAbstract());
+        assertThat(subSubIfaceSubject.uniqueMethodWithOriginalName("m3"), isAbstract());
       }
     }
     ClassSubject implSubject = inspector.clazz(Impl.class);
     assertThat(implSubject, isPresent());
     if (interfaceMethodsKept) {
-      assertEquals(expected.contains("m1"), implSubject.uniqueMethodWithName("m1").isPresent());
-      assertEquals(expected.contains("m2"), implSubject.uniqueMethodWithName("m2").isPresent());
-      assertEquals(expected.contains("m3"), implSubject.uniqueMethodWithName("m3").isPresent());
+      assertEquals(
+          expected.contains("m1"), implSubject.uniqueMethodWithOriginalName("m1").isPresent());
+      assertEquals(
+          expected.contains("m2"), implSubject.uniqueMethodWithOriginalName("m2").isPresent());
+      assertEquals(
+          expected.contains("m3"), implSubject.uniqueMethodWithOriginalName("m3").isPresent());
     }
-    assertEquals(expected.contains("m4"), implSubject.uniqueMethodWithName("m4").isPresent());
+    assertEquals(
+        expected.contains("m4"), implSubject.uniqueMethodWithOriginalName("m4").isPresent());
     ClassSubject subImplSubject = inspector.clazz(SubImpl.class);
     assertThat(subImplSubject, isPresent());
-    assertThat(subImplSubject.uniqueMethodWithName("m1"), not(isPresent()));
-    assertThat(subImplSubject.uniqueMethodWithName("m2"), not(isPresent()));
-    assertThat(subImplSubject.uniqueMethodWithName("m3"), not(isPresent()));
-    assertThat(subImplSubject.uniqueMethodWithName("m4"), not(isPresent()));
-    assertEquals(expected.contains("m5"), subImplSubject.uniqueMethodWithName("m5").isPresent());
+    assertThat(subImplSubject.uniqueMethodWithOriginalName("m1"), not(isPresent()));
+    assertThat(subImplSubject.uniqueMethodWithOriginalName("m2"), not(isPresent()));
+    assertThat(subImplSubject.uniqueMethodWithOriginalName("m3"), not(isPresent()));
+    assertThat(subImplSubject.uniqueMethodWithOriginalName("m4"), not(isPresent()));
+    assertEquals(
+        expected.contains("m5"), subImplSubject.uniqueMethodWithOriginalName("m5").isPresent());
     ClassSubject subSubImplSubject = inspector.clazz(SubSubImpl.class);
     assertThat(subSubImplSubject, isPresent());
     // FOO
     assertEquals(
         subSubImplExpected.contains("m1"),
-        subSubImplSubject.uniqueMethodWithName("m1").isPresent());
+        subSubImplSubject.uniqueMethodWithOriginalName("m1").isPresent());
     assertEquals(
         subSubImplExpected.contains("m2"),
-        subSubImplSubject.uniqueMethodWithName("m2").isPresent());
+        subSubImplSubject.uniqueMethodWithOriginalName("m2").isPresent());
     assertEquals(
         subSubImplExpected.contains("m3"),
-        subSubImplSubject.uniqueMethodWithName("m3").isPresent());
+        subSubImplSubject.uniqueMethodWithOriginalName("m3").isPresent());
     assertEquals(
         subSubImplExpected.contains("m4"),
-        subSubImplSubject.uniqueMethodWithName("m4").isPresent());
+        subSubImplSubject.uniqueMethodWithOriginalName("m4").isPresent());
     assertEquals(
         subSubImplExpected.contains("m5"),
-        subSubImplSubject.uniqueMethodWithName("m5").isPresent());
+        subSubImplSubject.uniqueMethodWithOriginalName("m5").isPresent());
     assertEquals(
         subSubImplExpected.contains("m6"),
-        subSubImplSubject.uniqueMethodWithName("m6").isPresent());
+        subSubImplSubject.uniqueMethodWithOriginalName("m6").isPresent());
   }
 
   private void checkAllMethodsInterfacesKept(CodeInspector inspector, Shrinker shrinker) {
diff --git a/src/test/java/com/android/tools/r8/shaking/desugar/interfacemethods/BridgeInliningTest.java b/src/test/java/com/android/tools/r8/shaking/desugar/interfacemethods/BridgeInliningTest.java
index 265e46a..e1fab88 100644
--- a/src/test/java/com/android/tools/r8/shaking/desugar/interfacemethods/BridgeInliningTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/desugar/interfacemethods/BridgeInliningTest.java
@@ -52,7 +52,7 @@
   private void inspect(CodeInspector codeInspector) {
     ClassSubject c = codeInspector.clazz(C.class);
     assertThat(c, isPresent());
-    MethodSubject m = c.uniqueMethodWithName("m");
+    MethodSubject m = c.uniqueMethodWithOriginalName("m");
     assertThat(m, isPresent());
     assertTrue(m.getMethod().hasCode());
     // TODO(b/124017330): Verify that I$-CC.m() has been inlined into C.m().
diff --git a/src/test/java/com/android/tools/r8/shaking/enums/EnumArrayInAnnotationTest.java b/src/test/java/com/android/tools/r8/shaking/enums/EnumArrayInAnnotationTest.java
index 42bda91..8e63f60 100644
--- a/src/test/java/com/android/tools/r8/shaking/enums/EnumArrayInAnnotationTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/enums/EnumArrayInAnnotationTest.java
@@ -67,13 +67,13 @@
                 inspector -> {
                   assertThat(inspector.clazz(Enum.class), isPresentAndRenamed());
                   assertThat(
-                      inspector.clazz(Enum.class).uniqueFieldWithName("TEST_ONE"),
+                      inspector.clazz(Enum.class).uniqueFieldWithOriginalName("TEST_ONE"),
                       isPresentAndNotRenamed());
                   assertThat(
-                      inspector.clazz(Enum.class).uniqueFieldWithName("TEST_TWO"),
+                      inspector.clazz(Enum.class).uniqueFieldWithOriginalName("TEST_TWO"),
                       isPresentAndNotRenamed());
                   assertThat(
-                      inspector.clazz(Enum.class).uniqueFieldWithName("TEST_THREE"),
+                      inspector.clazz(Enum.class).uniqueFieldWithOriginalName("TEST_THREE"),
                       isPresentAndRenamed());
                   minifiedEnumName.set(inspector.clazz(Enum.class).getFinalName());
                 })
@@ -114,13 +114,13 @@
         .inspect(
             inspector -> {
               assertThat(
-                  inspector.clazz(Enum.class).uniqueFieldWithName("TEST_ONE"),
+                  inspector.clazz(Enum.class).uniqueFieldWithOriginalName("TEST_ONE"),
                   parameters.isCfRuntime() ? isPresentAndNotRenamed() : isPresentAndRenamed());
               assertThat(
-                  inspector.clazz(Enum.class).uniqueFieldWithName("TEST_TWO"),
+                  inspector.clazz(Enum.class).uniqueFieldWithOriginalName("TEST_TWO"),
                   parameters.isCfRuntime() ? isPresentAndNotRenamed() : isPresentAndRenamed());
               assertThat(
-                  inspector.clazz(Enum.class).uniqueFieldWithName("TEST_THREE"),
+                  inspector.clazz(Enum.class).uniqueFieldWithOriginalName("TEST_THREE"),
                   useGenericEnumsRule ? isPresentAndRenamed() : isPresentAndNotRenamed());
             })
         .assertSuccessWithOutput(EXPECTED_RESULT);
@@ -139,10 +139,10 @@
         .inspect(
             inspector -> {
               assertThat(
-                  inspector.clazz(minifiedEnumName.get()).uniqueFieldWithName("TEST_ONE"),
+                  inspector.clazz(minifiedEnumName.get()).uniqueFieldWithOriginalName("TEST_ONE"),
                   parameters.isCfRuntime() ? isPresentAndNotRenamed() : isPresentAndRenamed());
               assertThat(
-                  inspector.clazz(minifiedEnumName.get()).uniqueFieldWithName("TEST_TWO"),
+                  inspector.clazz(minifiedEnumName.get()).uniqueFieldWithOriginalName("TEST_TWO"),
                   parameters.isCfRuntime() ? isPresentAndNotRenamed() : isPresentAndRenamed());
             })
         .assertSuccessWithOutput(EXPECTED_RESULT);
diff --git a/src/test/java/com/android/tools/r8/shaking/enums/EnumInAnnotationTest.java b/src/test/java/com/android/tools/r8/shaking/enums/EnumInAnnotationTest.java
index 5de0ff2..92e2c31 100644
--- a/src/test/java/com/android/tools/r8/shaking/enums/EnumInAnnotationTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/enums/EnumInAnnotationTest.java
@@ -66,10 +66,10 @@
                 inspector -> {
                   assertThat(inspector.clazz(Enum.class), isPresentAndRenamed());
                   assertThat(
-                      inspector.clazz(Enum.class).uniqueFieldWithName("TEST_ONE"),
+                      inspector.clazz(Enum.class).uniqueFieldWithOriginalName("TEST_ONE"),
                       isPresentAndNotRenamed());
                   assertThat(
-                      inspector.clazz(Enum.class).uniqueFieldWithName("TEST_TWO"),
+                      inspector.clazz(Enum.class).uniqueFieldWithOriginalName("TEST_TWO"),
                       isPresentAndRenamed());
                   minifiedEnumName.set(inspector.clazz(Enum.class).getFinalName());
                 })
@@ -111,10 +111,10 @@
         .inspect(
             inspector -> {
               assertThat(
-                  inspector.clazz(Enum.class).uniqueFieldWithName("TEST_ONE"),
+                  inspector.clazz(Enum.class).uniqueFieldWithOriginalName("TEST_ONE"),
                   parameters.isCfRuntime() ? isPresentAndNotRenamed() : isPresentAndRenamed());
               assertThat(
-                  inspector.clazz(Enum.class).uniqueFieldWithName("TEST_TWO"),
+                  inspector.clazz(Enum.class).uniqueFieldWithOriginalName("TEST_TWO"),
                   useGenericEnumsRule ? isPresentAndRenamed() : isPresentAndNotRenamed());
             })
         .assertSuccessWithOutput(EXPECTED_RESULT);
@@ -133,7 +133,7 @@
         .inspect(
             inspector -> {
               assertThat(
-                  inspector.clazz(minifiedEnumName.get()).uniqueFieldWithName("TEST_ONE"),
+                  inspector.clazz(minifiedEnumName.get()).uniqueFieldWithOriginalName("TEST_ONE"),
                   parameters.isCfRuntime() ? isPresentAndNotRenamed() : isPresentAndRenamed());
             })
         .assertSuccessWithOutput(EXPECTED_RESULT);
diff --git a/src/test/java/com/android/tools/r8/shaking/enums/EnumInAnnotationWhereAnnotationIsDeadTest.java b/src/test/java/com/android/tools/r8/shaking/enums/EnumInAnnotationWhereAnnotationIsDeadTest.java
index bc2e7ac..f769adb 100644
--- a/src/test/java/com/android/tools/r8/shaking/enums/EnumInAnnotationWhereAnnotationIsDeadTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/enums/EnumInAnnotationWhereAnnotationIsDeadTest.java
@@ -47,9 +47,10 @@
         .inspect(
             inspector -> {
               assertThat(
-                  inspector.clazz(Enum.class).uniqueFieldWithName("TEST_ONE"),
+                  inspector.clazz(Enum.class).uniqueFieldWithOriginalName("TEST_ONE"),
                   isPresentAndRenamed());
-              assertThat(inspector.clazz(Enum.class).uniqueFieldWithName("TEST_TWO"), isAbsent());
+              assertThat(
+                  inspector.clazz(Enum.class).uniqueFieldWithOriginalName("TEST_TWO"), isAbsent());
             })
         .assertSuccessWithOutput(EXPECTED_RESULT);
   }
diff --git a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking13Test.java b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking13Test.java
index eab4bff..7cf7921 100644
--- a/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking13Test.java
+++ b/src/test/java/com/android/tools/r8/shaking/examples/TreeShaking13Test.java
@@ -52,7 +52,7 @@
 
   private static void shaking13EnsureFieldWritesCorrect(CodeInspector inspector) {
     ClassSubject mainClass = inspector.clazz("shaking13.Shaking");
-    MethodSubject testMethod = mainClass.uniqueMethodWithName("fieldTest");
+    MethodSubject testMethod = mainClass.uniqueMethodWithOriginalName("fieldTest");
     Assert.assertTrue(testMethod.isPresent());
     Iterator<FieldAccessInstructionSubject> iterator =
         testMethod.iterateInstructions(InstructionSubject::isFieldAccess);
diff --git a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/KeepClassMembersDefaultCtorTest.java b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/KeepClassMembersDefaultCtorTest.java
index 2e726b0..1870c7e 100644
--- a/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/KeepClassMembersDefaultCtorTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/forceproguardcompatibility/defaultctor/KeepClassMembersDefaultCtorTest.java
@@ -69,9 +69,9 @@
             inspector -> {
               assertThat(inspector.clazz(A.class), isPresent());
               assertThat(inspector.clazz(A.class).init(), isAbsent());
-              assertThat(inspector.clazz(A.class).uniqueFieldWithName("y"), isPresent());
+              assertThat(inspector.clazz(A.class).uniqueFieldWithOriginalName("y"), isPresent());
               assertThat(
-                  inspector.clazz(A.class).uniqueFieldWithName("x"),
+                  inspector.clazz(A.class).uniqueFieldWithOriginalName("x"),
                   fullMode ? isAbsent() : isPresent());
             })
         .assertFailureWithErrorThatThrows(NoSuchMethodException.class);
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java
index 7c3a2d9..5559309 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/IfOnAccessModifierTest.java
@@ -88,9 +88,10 @@
             inspector -> {
               ClassSubject classSubject = inspector.clazz(ClassForIf.class);
               assertThat(classSubject, isPresent());
-              MethodSubject methodSubject = classSubject.uniqueMethodWithName("publicMethod");
+              MethodSubject methodSubject =
+                  classSubject.uniqueMethodWithOriginalName("publicMethod");
               assertThat(methodSubject, not(isPresent()));
-              methodSubject = classSubject.uniqueMethodWithName("nonPublicMethod");
+              methodSubject = classSubject.uniqueMethodWithOriginalName("nonPublicMethod");
               assertThat(methodSubject, isPresent());
               assertFalse(methodSubject.getMethod().accessFlags.isPublic());
               classSubject = inspector.clazz(ClassForSubsequent.class);
@@ -122,17 +123,18 @@
             inspector -> {
               ClassSubject classSubject = inspector.clazz(ClassForIf.class);
               assertThat(classSubject, isPresent());
-              MethodSubject methodSubject = classSubject.uniqueMethodWithName("publicMethod");
+              MethodSubject methodSubject =
+                  classSubject.uniqueMethodWithOriginalName("publicMethod");
               assertThat(methodSubject, not(isPresent()));
-              methodSubject = classSubject.uniqueMethodWithName("nonPublicMethod");
+              methodSubject = classSubject.uniqueMethodWithOriginalName("nonPublicMethod");
               assertThat(methodSubject, isPresent());
               assertTrue(methodSubject.getMethod().accessFlags.isPublic());
 
               classSubject = inspector.clazz(ClassForSubsequent.class);
               assertThat(classSubject, isPresent());
-              methodSubject = classSubject.uniqueMethodWithName("publicMethod");
+              methodSubject = classSubject.uniqueMethodWithOriginalName("publicMethod");
               assertThat(methodSubject, isPresent());
-              methodSubject = classSubject.uniqueMethodWithName("nonPublicMethod");
+              methodSubject = classSubject.uniqueMethodWithOriginalName("nonPublicMethod");
               assertThat(methodSubject, not(isPresent()));
             });
   }
@@ -161,17 +163,18 @@
             inspector -> {
               ClassSubject classSubject = inspector.clazz(ClassForIf.class);
               assertThat(classSubject, isPresent());
-              MethodSubject methodSubject = classSubject.uniqueMethodWithName("publicMethod");
+              MethodSubject methodSubject =
+                  classSubject.uniqueMethodWithOriginalName("publicMethod");
               assertThat(methodSubject, not(isPresent()));
-              methodSubject = classSubject.uniqueMethodWithName("nonPublicMethod");
+              methodSubject = classSubject.uniqueMethodWithOriginalName("nonPublicMethod");
               assertThat(methodSubject, isPresent());
               assertTrue(methodSubject.getMethod().accessFlags.isPublic());
 
               classSubject = inspector.clazz(ClassForSubsequent.class);
               assertThat(classSubject, isPresent());
-              methodSubject = classSubject.uniqueMethodWithName("publicMethod");
+              methodSubject = classSubject.uniqueMethodWithOriginalName("publicMethod");
               assertThat(methodSubject, not(isPresent()));
-              methodSubject = classSubject.uniqueMethodWithName("nonPublicMethod");
+              methodSubject = classSubject.uniqueMethodWithOriginalName("nonPublicMethod");
               assertThat(methodSubject, isPresent());
               assertEquals(shrinker.isR8(), methodSubject.getMethod().accessFlags.isPublic());
             });
@@ -201,16 +204,17 @@
             inspector -> {
               ClassSubject classSubject = inspector.clazz(ClassForIf.class);
               assertThat(classSubject, isPresent());
-              MethodSubject methodSubject = classSubject.uniqueMethodWithName("publicMethod");
+              MethodSubject methodSubject =
+                  classSubject.uniqueMethodWithOriginalName("publicMethod");
               assertThat(methodSubject, isPresent());
-              methodSubject = classSubject.uniqueMethodWithName("nonPublicMethod");
+              methodSubject = classSubject.uniqueMethodWithOriginalName("nonPublicMethod");
               assertThat(methodSubject, not(isPresent()));
 
               classSubject = inspector.clazz(ClassForSubsequent.class);
               assertThat(classSubject, isPresent());
-              methodSubject = classSubject.uniqueMethodWithName("publicMethod");
+              methodSubject = classSubject.uniqueMethodWithOriginalName("publicMethod");
               assertThat(methodSubject, isPresent());
-              methodSubject = classSubject.uniqueMethodWithName("nonPublicMethod");
+              methodSubject = classSubject.uniqueMethodWithOriginalName("nonPublicMethod");
               assertThat(methodSubject, not(isPresent()));
             });
   }
@@ -239,16 +243,17 @@
             inspector -> {
               ClassSubject classSubject = inspector.clazz(ClassForIf.class);
               assertThat(classSubject, isPresent());
-              MethodSubject methodSubject = classSubject.uniqueMethodWithName("publicMethod");
+              MethodSubject methodSubject =
+                  classSubject.uniqueMethodWithOriginalName("publicMethod");
               assertThat(methodSubject, isPresent());
-              methodSubject = classSubject.uniqueMethodWithName("nonPublicMethod");
+              methodSubject = classSubject.uniqueMethodWithOriginalName("nonPublicMethod");
               assertThat(methodSubject, not(isPresent()));
 
               classSubject = inspector.clazz(ClassForSubsequent.class);
               assertThat(classSubject, isPresent());
-              methodSubject = classSubject.uniqueMethodWithName("publicMethod");
+              methodSubject = classSubject.uniqueMethodWithOriginalName("publicMethod");
               assertThat(methodSubject, not(isPresent()));
-              methodSubject = classSubject.uniqueMethodWithName("nonPublicMethod");
+              methodSubject = classSubject.uniqueMethodWithOriginalName("nonPublicMethod");
               assertThat(methodSubject, isPresent());
               assertEquals(shrinker.isR8(), methodSubject.getMethod().accessFlags.isPublic());
             });
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/IfSimilarClassSpecificationBundlingTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/IfSimilarClassSpecificationBundlingTest.java
index 70f8903..5f89295 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/IfSimilarClassSpecificationBundlingTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/IfSimilarClassSpecificationBundlingTest.java
@@ -148,13 +148,13 @@
             codeInspector -> {
               ClassSubject aSubject = codeInspector.clazz(A.class);
               assertThat(aSubject, isPresent());
-              assertThat(aSubject.uniqueMethodWithName("a"), isPresent());
+              assertThat(aSubject.uniqueMethodWithOriginalName("a"), isPresent());
               ClassSubject bSubject = codeInspector.clazz(B.class);
               assertThat(bSubject, isPresent());
-              assertThat(bSubject.uniqueMethodWithName("b"), isPresent());
+              assertThat(bSubject.uniqueMethodWithOriginalName("b"), isPresent());
               ClassSubject cSubject = codeInspector.clazz(C.class);
               assertThat(cSubject, isPresent());
-              assertThat(cSubject.uniqueMethodWithName("c"), isPresent());
+              assertThat(cSubject.uniqueMethodWithOriginalName("c"), isPresent());
             });
     assertEquals(expectedClassEvaluations, box.data.numberOfProguardIfRuleClassEvaluations);
     assertEquals(expectedMemberEvaluations, box.data.numberOfProguardIfRuleMemberEvaluations);
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/NoLongerSatisfiedIfRuleTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/NoLongerSatisfiedIfRuleTest.java
index fdef324..28b399c 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/NoLongerSatisfiedIfRuleTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/NoLongerSatisfiedIfRuleTest.java
@@ -52,7 +52,7 @@
 
     ClassSubject bClassSubject = inspector.clazz(B.class);
     assertThat(bClassSubject, isPresent());
-    assertThat(bClassSubject.uniqueMethodWithName("m"), isAbsent());
+    assertThat(bClassSubject.uniqueMethodWithOriginalName("m"), isAbsent());
   }
 
   static class TestClass {
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/StaticFinalFieldInliningTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/StaticFinalFieldInliningTest.java
index 7a0d692..8149782 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/StaticFinalFieldInliningTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/StaticFinalFieldInliningTest.java
@@ -69,7 +69,9 @@
   private static void assertHasStaticGet(
       boolean expected, String methodName, CodeInspector inspector) {
     MethodSubject method =
-        inspector.clazz(StaticFinalFieldInliningSource.class).uniqueMethodWithName(methodName);
+        inspector
+            .clazz(StaticFinalFieldInliningSource.class)
+            .uniqueMethodWithOriginalName(methodName);
     assertEquals(
         method.getMethod().codeToString(),
         expected,
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/accessrelaxation/IfRuleWithAccessRelaxationTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/accessrelaxation/IfRuleWithAccessRelaxationTest.java
index 5a27372..1defdee 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/accessrelaxation/IfRuleWithAccessRelaxationTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/accessrelaxation/IfRuleWithAccessRelaxationTest.java
@@ -62,11 +62,12 @@
             .inspector();
 
     assertTrue(inspector.clazz(TestClass.class).isPublic());
-    assertThat(inspector.clazz(TestClass.class).uniqueFieldWithName("field"), isPublic());
+    assertThat(inspector.clazz(TestClass.class).uniqueFieldWithOriginalName("field"), isPublic());
     assertThat(
-        inspector.clazz(TestClass.class).uniqueMethodWithName("privateMethod"),
+        inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("privateMethod"),
         allOf(isPublic(), isFinal()));
-    assertThat(inspector.clazz(TestClass.class).uniqueMethodWithName("virtualMethod"), isPublic());
+    assertThat(
+        inspector.clazz(TestClass.class).uniqueMethodWithOriginalName("virtualMethod"), isPublic());
 
     assertThat(inspector.clazz(Unused1.class), isPresent());
     assertThat(inspector.clazz(Unused2.class), isPresent());
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/applymapping/IfRuleWithApplyMappingTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/applymapping/IfRuleWithApplyMappingTest.java
index e841ffc..c74b2b1 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/applymapping/IfRuleWithApplyMappingTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/applymapping/IfRuleWithApplyMappingTest.java
@@ -62,7 +62,9 @@
 
   private void inspect(CodeInspector inspector) {
     MethodSubject methodSubject =
-        inspector.clazz(IfRuleWithApplyMappingTestClass.class).uniqueMethodWithName("method");
+        inspector
+            .clazz(IfRuleWithApplyMappingTestClass.class)
+            .uniqueMethodWithOriginalName("method");
     assertThat(methodSubject, isPresent());
     assertEquals(
         A.class.getTypeName(),
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/interfacemethoddesugaring/IfRuleWithInterfaceMethodDesugaringTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/interfacemethoddesugaring/IfRuleWithInterfaceMethodDesugaringTest.java
index 01d977a..0b486ff 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/interfacemethoddesugaring/IfRuleWithInterfaceMethodDesugaringTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/interfacemethoddesugaring/IfRuleWithInterfaceMethodDesugaringTest.java
@@ -88,8 +88,8 @@
     if (parameters.isCfRuntime()) {
       ClassSubject itfClass = inspector.clazz(Interface.class.getTypeName());
       assertThat(itfClass, isPresent());
-      assertThat(itfClass.uniqueMethodWithName("staticMethod"), isPresent());
-      assertThat(itfClass.uniqueMethodWithName("virtualMethod"), isPresent());
+      assertThat(itfClass.uniqueMethodWithOriginalName("staticMethod"), isPresent());
+      assertThat(itfClass.uniqueMethodWithOriginalName("virtualMethod"), isPresent());
       assertThat(inspector.clazz(Unused1.class), isPresent());
       assertThat(inspector.clazz(Unused2.class), isPresent());
       return;
@@ -100,7 +100,7 @@
 
     // NeverInline is only applicable to the static method at this point (could change).
     assertEquals(1, classSubject.allMethods().size());
-    MethodSubject staticMethodSubject = classSubject.uniqueMethodWithName("staticMethod");
+    MethodSubject staticMethodSubject = classSubject.uniqueMethodWithOriginalName("staticMethod");
     assertThat(staticMethodSubject, allOf(isPresent(), isPublic(), isStatic()));
     assertTrue(staticMethodSubject.streamInstructions().anyMatch(i -> i.isConstString(STATIC_STR)));
 
diff --git a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/KeepIfPresentRuleWithVerticalClassMergingTest.java b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/KeepIfPresentRuleWithVerticalClassMergingTest.java
index 8fab4c1..45698a5 100644
--- a/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/KeepIfPresentRuleWithVerticalClassMergingTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/ifrule/verticalclassmerging/KeepIfPresentRuleWithVerticalClassMergingTest.java
@@ -51,7 +51,7 @@
               ClassSubject classBSubject = inspector.clazz(B.class);
               assertThat(classBSubject, isPresent());
               assertThat(classBSubject.init(), isPresent());
-              assertThat(classBSubject.uniqueMethodWithName("greet"), isPresent());
+              assertThat(classBSubject.uniqueMethodWithOriginalName("greet"), isPresent());
               assertEquals(2, classBSubject.allMethods().size());
             })
         .run(parameters.getRuntime(), TestClass.class)
diff --git a/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepClassMembersRuleOnIndirectlyInstantiatedClassTest.java b/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepClassMembersRuleOnIndirectlyInstantiatedClassTest.java
index 9dd4b60..6f80b77 100644
--- a/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepClassMembersRuleOnIndirectlyInstantiatedClassTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepClassMembersRuleOnIndirectlyInstantiatedClassTest.java
@@ -57,7 +57,7 @@
     ClassSubject classSubject = inspector.clazz(A.class);
     assertThat(classSubject, isPresent());
 
-    FieldSubject fieldSubject = classSubject.uniqueFieldWithName("greeting");
+    FieldSubject fieldSubject = classSubject.uniqueFieldWithOriginalName("greeting");
     assertThat(fieldSubject, isPresentAndNotRenamed());
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepInterfaceMethodTest.java b/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepInterfaceMethodTest.java
index e42dfe3..1a13a8d 100644
--- a/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepInterfaceMethodTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/keepclassmembers/KeepInterfaceMethodTest.java
@@ -97,7 +97,7 @@
   private void checkClassAndMethodIsPresent(CodeInspector inspector, Class<?> clazz) {
     ClassSubject clazzSubject = inspector.clazz(clazz);
     assertThat(clazzSubject, isPresent());
-    MethodSubject foo = clazzSubject.uniqueMethodWithName("foo");
+    MethodSubject foo = clazzSubject.uniqueMethodWithOriginalName("foo");
     assertThat(foo, isPresentAndNotRenamed());
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/keepparameternames/KeepParameterNamesTest.java b/src/test/java/com/android/tools/r8/shaking/keepparameternames/KeepParameterNamesTest.java
index 4f8131d..41f3dcc 100644
--- a/src/test/java/com/android/tools/r8/shaking/keepparameternames/KeepParameterNamesTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/keepparameternames/KeepParameterNamesTest.java
@@ -71,7 +71,7 @@
     assertThat(classSubject, isPresent());
 
     MethodSubject method;
-    method = classSubject.uniqueMethodWithName("apiNoArgs");
+    method = classSubject.uniqueMethodWithOriginalName("apiNoArgs");
     assertThat(method, isPresent());
     assertEquals(keepParameterNames, method.hasLocalVariableTable());
     if (keepParameterNames) {
@@ -83,12 +83,12 @@
       assertTrue(method.getLocalVariableTable().isEmpty());
     }
 
-    method = classSubject.uniqueMethodWithName("apiNoArgsStatic");
+    method = classSubject.uniqueMethodWithOriginalName("apiNoArgsStatic");
     assertThat(method, isPresent());
     assertFalse(method.hasLocalVariableTable());
     assertTrue(method.getLocalVariableTable().isEmpty());
 
-    method = classSubject.uniqueMethodWithName("api1");
+    method = classSubject.uniqueMethodWithOriginalName("api1");
     assertThat(method, isPresent());
     assertEquals(keepParameterNames, method.hasLocalVariableTable());
     if (keepParameterNames) {
@@ -112,7 +112,7 @@
       assertTrue(method.getLocalVariableTable().isEmpty());
     }
 
-    method = classSubject.uniqueMethodWithName("api2");
+    method = classSubject.uniqueMethodWithOriginalName("api2");
     assertThat(method, isPresent());
     assertEquals(keepParameterNames, method.hasLocalVariableTable());
     if (keepParameterNames) {
@@ -132,7 +132,7 @@
       assertTrue(method.getLocalVariableTable().isEmpty());
     }
 
-    method = classSubject.uniqueMethodWithName("api3");
+    method = classSubject.uniqueMethodWithOriginalName("api3");
     assertThat(method, isPresent());
     assertEquals(keepParameterNames, method.hasLocalVariableTable());
     if (keepParameterNames) {
@@ -193,7 +193,7 @@
 
     MethodSubject method;
     for (String name : new String[] {"apiNoArgs", "apiNoArgsStatic", "api1", "api2", "api3"}) {
-      method = classSubject.uniqueMethodWithName(name);
+      method = classSubject.uniqueMethodWithOriginalName(name);
       assertThat(method, isPresent());
       assertEquals(enableMinification, method.isRenamed());
       assertFalse(method.hasLocalVariableTable());
diff --git a/src/test/java/com/android/tools/r8/shaking/keepparameternames/KeepParameterNamesUnsortedLocalVariablesTableTest.java b/src/test/java/com/android/tools/r8/shaking/keepparameternames/KeepParameterNamesUnsortedLocalVariablesTableTest.java
index abd2407..0b91059 100644
--- a/src/test/java/com/android/tools/r8/shaking/keepparameternames/KeepParameterNamesUnsortedLocalVariablesTableTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/keepparameternames/KeepParameterNamesUnsortedLocalVariablesTableTest.java
@@ -62,7 +62,7 @@
     ClassSubject classSubject = inspector.clazz("Api");
     assertThat(classSubject, isPresent());
 
-    MethodSubject method = classSubject.uniqueMethodWithName("api1");
+    MethodSubject method = classSubject.uniqueMethodWithOriginalName("api1");
     assertThat(method, isPresent());
 
     assertEquals(keepParameterNames, method.hasLocalVariableTable());
diff --git a/src/test/java/com/android/tools/r8/shaking/keptgraph/WhyAreYouKeepingAllTest.java b/src/test/java/com/android/tools/r8/shaking/keptgraph/WhyAreYouKeepingAllTest.java
index 94bdbf1..915d92b 100644
--- a/src/test/java/com/android/tools/r8/shaking/keptgraph/WhyAreYouKeepingAllTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/keptgraph/WhyAreYouKeepingAllTest.java
@@ -6,6 +6,7 @@
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.CoreMatchers.not;
 
+import com.android.tools.r8.JdkClassFileProvider;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
@@ -45,6 +46,7 @@
   public void test() throws Throwable {
     testForR8(Backend.CF)
         .addProgramFiles(ToolHelper.R8_WITH_RELOCATED_DEPS_JAR)
+        .addLibraryProvider(JdkClassFileProvider.fromSystemJdk())
         .addKeepRuleFiles(MAIN_KEEP)
         .addKeepRules(WHY_ARE_YOU_KEEPING_ALL)
         .collectStdout()
diff --git a/src/test/java/com/android/tools/r8/shaking/librarymethodoverride/LibraryMethodOverrideTest.java b/src/test/java/com/android/tools/r8/shaking/librarymethodoverride/LibraryMethodOverrideTest.java
index 104f2cd..2699e27 100644
--- a/src/test/java/com/android/tools/r8/shaking/librarymethodoverride/LibraryMethodOverrideTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/librarymethodoverride/LibraryMethodOverrideTest.java
@@ -68,7 +68,7 @@
     for (Class<?> nonEscapingClass : nonEscapingClasses) {
       ClassSubject classSubject = inspector.clazz(nonEscapingClass);
       assertThat(classSubject, isPresent());
-      assertThat(classSubject.uniqueMethodWithName("toString"), not(isPresent()));
+      assertThat(classSubject.uniqueMethodWithOriginalName("toString"), not(isPresent()));
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/methods/abst/AbstractMethodsTest.java b/src/test/java/com/android/tools/r8/shaking/methods/abst/AbstractMethodsTest.java
index 9fe2a68..438355c 100644
--- a/src/test/java/com/android/tools/r8/shaking/methods/abst/AbstractMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/methods/abst/AbstractMethodsTest.java
@@ -74,23 +74,26 @@
   private void checkMethods(CodeInspector inspector, Set<String> expected, Shrinker shrinker) {
     ClassSubject superSubject = inspector.clazz(Super.class);
     assertThat(superSubject, isPresent());
-    MethodSubject m1 = superSubject.uniqueMethodWithName("m1");
+    MethodSubject m1 = superSubject.uniqueMethodWithOriginalName("m1");
     assertEquals(expected.contains("m1") && shrinker != Shrinker.R8Full, m1.isPresent());
     if (m1.isPresent()) {
       assertTrue(m1.isAbstract());
     }
     ClassSubject subSubject = inspector.clazz(Sub.class);
     assertThat(subSubject, isPresent());
-    MethodSubject m2 = subSubject.uniqueMethodWithName("m2");
+    MethodSubject m2 = subSubject.uniqueMethodWithOriginalName("m2");
     assertEquals(expected.contains("m2") && shrinker != Shrinker.R8Full, m2.isPresent());
     if (m2.isPresent()) {
       assertTrue(m2.isAbstract());
     }
     ClassSubject subSubSubject = inspector.clazz(SubSub.class);
     assertThat(subSubSubject, isPresent());
-    assertEquals(expected.contains("m1"), subSubSubject.uniqueMethodWithName("m1").isPresent());
-    assertEquals(expected.contains("m2"), subSubSubject.uniqueMethodWithName("m2").isPresent());
-    assertEquals(expected.contains("m3"), subSubSubject.uniqueMethodWithName("m3").isPresent());
+    assertEquals(
+        expected.contains("m1"), subSubSubject.uniqueMethodWithOriginalName("m1").isPresent());
+    assertEquals(
+        expected.contains("m2"), subSubSubject.uniqueMethodWithOriginalName("m2").isPresent());
+    assertEquals(
+        expected.contains("m3"), subSubSubject.uniqueMethodWithOriginalName("m3").isPresent());
   }
 
   private void checkAllMethods(CodeInspector inspector, Shrinker shrinker) {
diff --git a/src/test/java/com/android/tools/r8/shaking/methods/interfaces/AbstractInterfaceMethodsTest.java b/src/test/java/com/android/tools/r8/shaking/methods/interfaces/AbstractInterfaceMethodsTest.java
index 2961a50..2cd5ff7 100644
--- a/src/test/java/com/android/tools/r8/shaking/methods/interfaces/AbstractInterfaceMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/methods/interfaces/AbstractInterfaceMethodsTest.java
@@ -54,7 +54,7 @@
             inspector -> {
               ClassSubject clazz = inspector.clazz(J.class);
               assertThat(clazz, isPresent());
-              assertThat(clazz.uniqueMethodWithName("foo"), not(isPresent()));
+              assertThat(clazz.uniqueMethodWithOriginalName("foo"), not(isPresent()));
               assertThat(inspector.clazz(I.class), not(isPresent()));
             });
   }
diff --git a/src/test/java/com/android/tools/r8/shaking/methods/interfaces/DefaultInterfaceMethodsTest.java b/src/test/java/com/android/tools/r8/shaking/methods/interfaces/DefaultInterfaceMethodsTest.java
index aa1fe71..cbb3fc9 100644
--- a/src/test/java/com/android/tools/r8/shaking/methods/interfaces/DefaultInterfaceMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/methods/interfaces/DefaultInterfaceMethodsTest.java
@@ -56,7 +56,7 @@
             inspector -> {
               ClassSubject clazz = inspector.clazz(J.class);
               assertThat(clazz, isPresent());
-              assertThat(clazz.uniqueMethodWithName("foo"), not(isPresent()));
+              assertThat(clazz.uniqueMethodWithOriginalName("foo"), not(isPresent()));
               assertThat(inspector.clazz(I.class), not(isPresent()));
             });
   }
diff --git a/src/test/java/com/android/tools/r8/shaking/methods/interfaces/InterfaceDefaultMethodKeptTest.java b/src/test/java/com/android/tools/r8/shaking/methods/interfaces/InterfaceDefaultMethodKeptTest.java
index 91f4153..4331c76 100644
--- a/src/test/java/com/android/tools/r8/shaking/methods/interfaces/InterfaceDefaultMethodKeptTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/methods/interfaces/InterfaceDefaultMethodKeptTest.java
@@ -53,7 +53,8 @@
                 codeInspector -> {
                   assertThat(codeInspector.clazz(A.class), isPresent());
                   assertThat(
-                      codeInspector.clazz(A.class).uniqueMethodWithName("foo"), not(isPresent()));
+                      codeInspector.clazz(A.class).uniqueMethodWithOriginalName("foo"),
+                      not(isPresent()));
                 });
     testForRuntime(parameters)
         .addProgramClasses(Main.class)
@@ -77,7 +78,8 @@
                   assertThat(codeInspector.clazz(A.class), not(isPresent()));
                   assertThat(codeInspector.clazz(B.class), isPresent());
                   assertThat(
-                      codeInspector.clazz(B.class).uniqueMethodWithName("foo"), not(isPresent()));
+                      codeInspector.clazz(B.class).uniqueMethodWithOriginalName("foo"),
+                      not(isPresent()));
                 });
     testForRuntime(parameters)
         .addProgramClasses(Main.class)
@@ -100,12 +102,14 @@
             .inspect(
                 codeInspector -> {
                   assertThat(codeInspector.clazz(A.class), isPresent());
-                  assertThat(codeInspector.clazz(A.class).uniqueMethodWithName("foo"), isPresent());
+                  assertThat(
+                      codeInspector.clazz(A.class).uniqueMethodWithOriginalName("foo"),
+                      isPresent());
                   assertThat(codeInspector.clazz(B.class), isPresent());
                   // TODO(b/144409021): We should be able to remove this.
                   assertEquals(
                       parameters.isDexRuntime(),
-                      codeInspector.clazz(B.class).uniqueMethodWithName("foo").isPresent());
+                      codeInspector.clazz(B.class).uniqueMethodWithOriginalName("foo").isPresent());
                 });
     testForRuntime(parameters)
         .addProgramClasses(Main.class)
diff --git a/src/test/java/com/android/tools/r8/shaking/methods/interfaces/SubTypeOverridesInterfaceMethodTest.java b/src/test/java/com/android/tools/r8/shaking/methods/interfaces/SubTypeOverridesInterfaceMethodTest.java
index c8b8be2..ae43926 100644
--- a/src/test/java/com/android/tools/r8/shaking/methods/interfaces/SubTypeOverridesInterfaceMethodTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/methods/interfaces/SubTypeOverridesInterfaceMethodTest.java
@@ -52,7 +52,7 @@
             inspector -> {
               ClassSubject clazz = inspector.clazz(A.class);
               assertThat(clazz, isPresent());
-              assertThat(clazz.uniqueMethodWithName("foo"), isPresent());
+              assertThat(clazz.uniqueMethodWithOriginalName("foo"), isPresent());
             });
   }
 
diff --git a/src/test/java/com/android/tools/r8/shaking/methods/pblc/PublicMethodsTest.java b/src/test/java/com/android/tools/r8/shaking/methods/pblc/PublicMethodsTest.java
index 54e57dd..cc63bd8 100644
--- a/src/test/java/com/android/tools/r8/shaking/methods/pblc/PublicMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/methods/pblc/PublicMethodsTest.java
@@ -105,13 +105,16 @@
   private void checkMethods(CodeInspector inspector, Set<String> expected) {
     ClassSubject superSubject = inspector.clazz(Super.class);
     assertThat(superSubject, isPresent());
-    assertEquals(expected.contains("m1"), superSubject.uniqueMethodWithName("m1").isPresent());
+    assertEquals(
+        expected.contains("m1"), superSubject.uniqueMethodWithOriginalName("m1").isPresent());
     ClassSubject subSubject = inspector.clazz(Sub.class);
     assertThat(subSubject, isPresent());
-    assertEquals(expected.contains("m2"), subSubject.uniqueMethodWithName("m2").isPresent());
+    assertEquals(
+        expected.contains("m2"), subSubject.uniqueMethodWithOriginalName("m2").isPresent());
     ClassSubject subSubSubject = inspector.clazz(SubSub.class);
     assertThat(subSubSubject, isPresent());
-    assertEquals(expected.contains("m3"), subSubSubject.uniqueMethodWithName("m3").isPresent());
+    assertEquals(
+        expected.contains("m3"), subSubSubject.uniqueMethodWithOriginalName("m3").isPresent());
   }
 
   private void checkAllMethodsAndAllConstructors(CodeInspector inspector, Shrinker shrinker) {
diff --git a/src/test/java/com/android/tools/r8/shaking/methods/pckg/PackageMethodsTest.java b/src/test/java/com/android/tools/r8/shaking/methods/pckg/PackageMethodsTest.java
index e2f3886..ee03c78 100644
--- a/src/test/java/com/android/tools/r8/shaking/methods/pckg/PackageMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/methods/pckg/PackageMethodsTest.java
@@ -62,13 +62,16 @@
   private void checkMethods(CodeInspector inspector, Set<String> expected) {
     ClassSubject superSubject = inspector.clazz(Super.class);
     assertThat(superSubject, isPresent());
-    assertEquals(expected.contains("m1"), superSubject.uniqueMethodWithName("m1").isPresent());
+    assertEquals(
+        expected.contains("m1"), superSubject.uniqueMethodWithOriginalName("m1").isPresent());
     ClassSubject subSubject = inspector.clazz(Sub.class);
     assertThat(subSubject, isPresent());
-    assertEquals(expected.contains("m2"), subSubject.uniqueMethodWithName("m2").isPresent());
+    assertEquals(
+        expected.contains("m2"), subSubject.uniqueMethodWithOriginalName("m2").isPresent());
     ClassSubject subSubSubject = inspector.clazz(SubSub.class);
     assertThat(subSubSubject, isPresent());
-    assertEquals(expected.contains("m3"), subSubSubject.uniqueMethodWithName("m3").isPresent());
+    assertEquals(
+        expected.contains("m3"), subSubSubject.uniqueMethodWithOriginalName("m3").isPresent());
   }
 
   private void checkAllMethods(CodeInspector inspector, Shrinker shrinker) {
diff --git a/src/test/java/com/android/tools/r8/shaking/methods/prvt/PrivateMethodsTest.java b/src/test/java/com/android/tools/r8/shaking/methods/prvt/PrivateMethodsTest.java
index bb5b668..9bd8465 100644
--- a/src/test/java/com/android/tools/r8/shaking/methods/prvt/PrivateMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/methods/prvt/PrivateMethodsTest.java
@@ -66,15 +66,16 @@
     assertThat(superSubject, isPresent());
     assertEquals(
         shrinker != Shrinker.R8Full && expected.contains("m1"),
-        superSubject.uniqueMethodWithName("m1").isPresent());
+        superSubject.uniqueMethodWithOriginalName("m1").isPresent());
     ClassSubject subSubject = inspector.clazz(Sub.class);
     assertThat(subSubject, isPresent());
     assertEquals(
         shrinker != Shrinker.R8Full && expected.contains("m2"),
-        subSubject.uniqueMethodWithName("m2").isPresent());
+        subSubject.uniqueMethodWithOriginalName("m2").isPresent());
     ClassSubject subSubSubject = inspector.clazz(SubSub.class);
     assertThat(subSubSubject, isPresent());
-    assertEquals(expected.contains("m3"), subSubSubject.uniqueMethodWithName("m3").isPresent());
+    assertEquals(
+        expected.contains("m3"), subSubSubject.uniqueMethodWithOriginalName("m3").isPresent());
   }
 
   public String allMethodsOutput(Shrinker shrinker) {
diff --git a/src/test/java/com/android/tools/r8/shaking/methods/shadow/ShadowMethodsTest.java b/src/test/java/com/android/tools/r8/shaking/methods/shadow/ShadowMethodsTest.java
index 5f8bc2e..94f4646 100644
--- a/src/test/java/com/android/tools/r8/shaking/methods/shadow/ShadowMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/methods/shadow/ShadowMethodsTest.java
@@ -71,13 +71,15 @@
   private void checkAllMethods(CodeInspector inspector, Shrinker shrinker, String name) {
     ClassSubject superSubject = inspector.clazz(Super.class);
     assertThat(superSubject, isPresent());
-    assertEquals(shrinker != Shrinker.R8Full, superSubject.uniqueMethodWithName(name).isPresent());
+    assertEquals(
+        shrinker != Shrinker.R8Full, superSubject.uniqueMethodWithOriginalName(name).isPresent());
     ClassSubject subSubject = inspector.clazz(Sub.class);
     assertThat(subSubject, isPresent());
-    assertEquals(shrinker != Shrinker.R8Full, subSubject.uniqueMethodWithName(name).isPresent());
+    assertEquals(
+        shrinker != Shrinker.R8Full, subSubject.uniqueMethodWithOriginalName(name).isPresent());
     ClassSubject subSubSubject = inspector.clazz(SubSub.class);
     assertThat(subSubSubject, isPresent());
-    assertThat(subSubSubject.uniqueMethodWithName(name), isPresent());
+    assertThat(subSubSubject.uniqueMethodWithOriginalName(name), isPresent());
   }
 
   private void checkAllMethods(CodeInspector inspector, Shrinker shrinker) {
diff --git a/src/test/java/com/android/tools/r8/shaking/modifiers/AccessFlagsCombinationsTest.java b/src/test/java/com/android/tools/r8/shaking/modifiers/AccessFlagsCombinationsTest.java
index 82b7339..83fd6bb 100644
--- a/src/test/java/com/android/tools/r8/shaking/modifiers/AccessFlagsCombinationsTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/modifiers/AccessFlagsCombinationsTest.java
@@ -59,52 +59,52 @@
 
     assertEquals(
         includePublic && includeNonStatic,
-        classSubject.uniqueMethodWithName("publicMethod").isPresent());
+        classSubject.uniqueMethodWithOriginalName("publicMethod").isPresent());
     assertEquals(
         includeProtected && includeNonStatic,
-        classSubject.uniqueMethodWithName("protectedMethod").isPresent());
+        classSubject.uniqueMethodWithOriginalName("protectedMethod").isPresent());
     assertEquals(
         includePrivate && includeNonStatic,
-        classSubject.uniqueMethodWithName("privateMethod").isPresent());
+        classSubject.uniqueMethodWithOriginalName("privateMethod").isPresent());
     assertEquals(
         includePackagePrivate && includeNonStatic,
-        classSubject.uniqueMethodWithName("packagePrivateMethod").isPresent());
+        classSubject.uniqueMethodWithOriginalName("packagePrivateMethod").isPresent());
     assertEquals(
         includePublic && includeStatic,
-        classSubject.uniqueMethodWithName("publicStaticMethod").isPresent());
+        classSubject.uniqueMethodWithOriginalName("publicStaticMethod").isPresent());
     assertEquals(
         includeProtected && includeStatic,
-        classSubject.uniqueMethodWithName("protectedStaticMethod").isPresent());
+        classSubject.uniqueMethodWithOriginalName("protectedStaticMethod").isPresent());
     assertEquals(
         includePrivate && includeStatic,
-        classSubject.uniqueMethodWithName("privateStaticMethod").isPresent());
+        classSubject.uniqueMethodWithOriginalName("privateStaticMethod").isPresent());
     assertEquals(
         includePackagePrivate && includeStatic,
-        classSubject.uniqueMethodWithName("packagePrivateStaticMethod").isPresent());
+        classSubject.uniqueMethodWithOriginalName("packagePrivateStaticMethod").isPresent());
     assertEquals(
         includePublic && includeNonStatic,
-        classSubject.uniqueFieldWithName("publicField").isPresent());
+        classSubject.uniqueFieldWithOriginalName("publicField").isPresent());
     assertEquals(
         includeProtected && includeNonStatic,
-        classSubject.uniqueFieldWithName("protectedField").isPresent());
+        classSubject.uniqueFieldWithOriginalName("protectedField").isPresent());
     assertEquals(
         includePrivate && includeNonStatic,
-        classSubject.uniqueFieldWithName("privateField").isPresent());
+        classSubject.uniqueFieldWithOriginalName("privateField").isPresent());
     assertEquals(
         includePackagePrivate && includeNonStatic,
-        classSubject.uniqueFieldWithName("packagePrivateField").isPresent());
+        classSubject.uniqueFieldWithOriginalName("packagePrivateField").isPresent());
     assertEquals(
         includePublic && includeStatic,
-        classSubject.uniqueFieldWithName("publicStaticField").isPresent());
+        classSubject.uniqueFieldWithOriginalName("publicStaticField").isPresent());
     assertEquals(
         includeProtected && includeStatic,
-        classSubject.uniqueFieldWithName("protectedStaticField").isPresent());
+        classSubject.uniqueFieldWithOriginalName("protectedStaticField").isPresent());
     assertEquals(
         includePrivate && includeStatic,
-        classSubject.uniqueFieldWithName("privateStaticField").isPresent());
+        classSubject.uniqueFieldWithOriginalName("privateStaticField").isPresent());
     assertEquals(
         includePackagePrivate && includeStatic,
-        classSubject.uniqueFieldWithName("packagePrivateStaticField").isPresent());
+        classSubject.uniqueFieldWithOriginalName("packagePrivateStaticField").isPresent());
   }
 
   public void runTest(
diff --git a/src/test/java/com/android/tools/r8/shaking/proxy/MockitoTest.java b/src/test/java/com/android/tools/r8/shaking/proxy/MockitoTest.java
index 8a4113a..3743fb8 100644
--- a/src/test/java/com/android/tools/r8/shaking/proxy/MockitoTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/proxy/MockitoTest.java
@@ -58,7 +58,7 @@
             .inspector();
     ClassSubject itf = inspector.clazz(M_I);
     assertThat(itf, isPresent());
-    MethodSubject mtd = itf.uniqueMethodWithName("onEnterForeground");
+    MethodSubject mtd = itf.uniqueMethodWithOriginalName("onEnterForeground");
     assertThat(mtd, isAbsent());
   }
 
@@ -77,7 +77,7 @@
             .inspector();
     ClassSubject itf = inspector.clazz(M_I);
     assertThat(itf, isPresent());
-    MethodSubject mtd = itf.uniqueMethodWithName("onEnterForeground");
+    MethodSubject mtd = itf.uniqueMethodWithOriginalName("onEnterForeground");
     assertThat(mtd, isPresentAndNotRenamed());
   }
 }
diff --git a/src/test/java/com/android/tools/r8/shaking/reflection/FieldAccessTest.java b/src/test/java/com/android/tools/r8/shaking/reflection/FieldAccessTest.java
index 9d2b858..3e3a646 100644
--- a/src/test/java/com/android/tools/r8/shaking/reflection/FieldAccessTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/reflection/FieldAccessTest.java
@@ -64,7 +64,7 @@
               Assert.assertTrue(
                   inspector
                       .clazz(testClass)
-                      .uniqueMethodWithName("main")
+                      .uniqueMethodWithOriginalName("main")
                       .streamInstructions()
                       .anyMatch(this::isInvokeGetField));
             })
diff --git a/src/test/java/com/android/tools/r8/shaking/staticinterfacemethods/defaultmethods/StaticInterfaceMethodsTest.java b/src/test/java/com/android/tools/r8/shaking/staticinterfacemethods/defaultmethods/StaticInterfaceMethodsTest.java
index ad6b6ea..58c7558 100644
--- a/src/test/java/com/android/tools/r8/shaking/staticinterfacemethods/defaultmethods/StaticInterfaceMethodsTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/staticinterfacemethods/defaultmethods/StaticInterfaceMethodsTest.java
@@ -118,7 +118,7 @@
     } else {
       assertThat(method, not(isPresent()));
       assertThat(companionClass, isPresent());
-      assertThat(companionClass.uniqueMethodWithName("method"), isPresent());
+      assertThat(companionClass.uniqueMethodWithOriginalName("method"), isPresent());
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/smali/JumboStringTest.java b/src/test/java/com/android/tools/r8/smali/JumboStringTest.java
index e7b5fe6..d3a9e4d 100644
--- a/src/test/java/com/android/tools/r8/smali/JumboStringTest.java
+++ b/src/test/java/com/android/tools/r8/smali/JumboStringTest.java
@@ -92,7 +92,7 @@
             inspector -> {
               ClassSubject main = inspector.clazz(DEFAULT_CLASS_NAME);
               assertThat(main, isPresent());
-              MethodSubject method = main.uniqueMethodWithName(DEFAULT_METHOD_NAME);
+              MethodSubject method = main.uniqueMethodWithOriginalName(DEFAULT_METHOD_NAME);
               assertThat(method, isPresent());
               assertTrue(method.streamInstructions().anyMatch(InstructionSubject::isJumboString));
             });
@@ -143,10 +143,10 @@
             inspector -> {
               ClassSubject main = inspector.clazz(DEFAULT_CLASS_NAME);
               assertThat(main, isPresent());
-              MethodSubject method = main.uniqueMethodWithName(DEFAULT_METHOD_NAME);
+              MethodSubject method = main.uniqueMethodWithOriginalName(DEFAULT_METHOD_NAME);
               assertThat(method, isPresent());
               assertTrue(method.streamInstructions().anyMatch(InstructionSubject::isJumboString));
-              MethodSubject method2 = main.uniqueMethodWithName(DEFAULT_METHOD_NAME + "2");
+              MethodSubject method2 = main.uniqueMethodWithOriginalName(DEFAULT_METHOD_NAME + "2");
               assertThat(method2, isPresent());
               assertTrue(method2.streamInstructions().anyMatch(InstructionSubject::isJumboString));
             });
diff --git a/src/test/java/com/android/tools/r8/startup/InliningOutOfStartupPartitionTest.java b/src/test/java/com/android/tools/r8/startup/InliningOutOfStartupPartitionTest.java
index 23e8577..77909c0 100644
--- a/src/test/java/com/android/tools/r8/startup/InliningOutOfStartupPartitionTest.java
+++ b/src/test/java/com/android/tools/r8/startup/InliningOutOfStartupPartitionTest.java
@@ -59,13 +59,15 @@
               ClassSubject mainClassSubject = inspector.clazz(Main.class);
               assertThat(mainClassSubject, isPresent());
               // The postStartupMethod() should be inlined into PostStartupClass.runPostStartup().
-              assertThat(mainClassSubject.uniqueMethodWithName("postStartupMethod"), isAbsent());
+              assertThat(
+                  mainClassSubject.uniqueMethodWithOriginalName("postStartupMethod"), isAbsent());
 
               ClassSubject postStartupClassSubject = inspector.clazz(PostStartupClass.class);
               assertThat(postStartupClassSubject, isPresent());
               // The runPostStartup() method must not be inlined into Main.main().
               assertThat(
-                  postStartupClassSubject.uniqueMethodWithName("runPostStartup"), isPresent());
+                  postStartupClassSubject.uniqueMethodWithOriginalName("runPostStartup"),
+                  isPresent());
             })
         .run(parameters.getRuntime(), Main.class)
         .assertSuccessWithOutputLines("Hello, world!");
diff --git a/src/test/java/com/android/tools/r8/startup/MinimalStartupDexTest.java b/src/test/java/com/android/tools/r8/startup/MinimalStartupDexTest.java
index db55acb..f8a5438 100644
--- a/src/test/java/com/android/tools/r8/startup/MinimalStartupDexTest.java
+++ b/src/test/java/com/android/tools/r8/startup/MinimalStartupDexTest.java
@@ -84,7 +84,8 @@
               assertTrue(
                   mainMethodSubject.streamInstructions().noneMatch(InstructionSubject::isThrow));
 
-              MethodSubject onClickMethodSubject = mainClassSubject.uniqueMethodWithName("onClick");
+              MethodSubject onClickMethodSubject =
+                  mainClassSubject.uniqueMethodWithOriginalName("onClick");
               assertThat(onClickMethodSubject, isPresent());
               assertTrue(
                   onClickMethodSubject.streamInstructions().anyMatch(InstructionSubject::isThrow));
@@ -93,7 +94,8 @@
               ClassSubject startupClassSubject = primaryDexInspector.clazz(AStartupClass.class);
               assertThat(startupClassSubject, isPresent());
 
-              MethodSubject startupMethodSubject = startupClassSubject.uniqueMethodWithName("foo");
+              MethodSubject startupMethodSubject =
+                  startupClassSubject.uniqueMethodWithOriginalName("foo");
               assertThat(startupMethodSubject, isPresent());
               assertTrue(
                   startupMethodSubject.streamInstructions().noneMatch(InstructionSubject::isThrow));
@@ -113,7 +115,7 @@
                       .anyMatch(InstructionSubject::isThrow));
 
               MethodSubject nonStartupMethodSubject =
-                  nonStartupClassSubject.uniqueMethodWithName("bar");
+                  nonStartupClassSubject.uniqueMethodWithOriginalName("bar");
               assertThat(nonStartupMethodSubject, isPresent());
               assertTrue(
                   nonStartupMethodSubject
diff --git a/src/test/java/com/android/tools/r8/testingannotations/NeverInlineStaticInterfaceMethodTest.java b/src/test/java/com/android/tools/r8/testingannotations/NeverInlineStaticInterfaceMethodTest.java
index c5bfa0d..35d810b 100644
--- a/src/test/java/com/android/tools/r8/testingannotations/NeverInlineStaticInterfaceMethodTest.java
+++ b/src/test/java/com/android/tools/r8/testingannotations/NeverInlineStaticInterfaceMethodTest.java
@@ -50,7 +50,7 @@
               ClassSubject iClassSubject = inspector.clazz(I.class);
               assertThat(iClassSubject, isPresent());
 
-              MethodSubject iMethodSubject = iClassSubject.uniqueMethodWithName("m");
+              MethodSubject iMethodSubject = iClassSubject.uniqueMethodWithOriginalName("m");
               assertThat(iClassSubject, isPresent());
 
               MethodSubject mainMethodSubject = inspector.clazz(Main.class).mainMethod();
diff --git a/src/test/java/com/android/tools/r8/utils/Smali.java b/src/test/java/com/android/tools/r8/utils/Smali.java
index 30274f0..4321812 100644
--- a/src/test/java/com/android/tools/r8/utils/Smali.java
+++ b/src/test/java/com/android/tools/r8/utils/Smali.java
@@ -112,7 +112,7 @@
     try {
       DexApplication dexApp = new ApplicationReader(app, options, Timing.empty()).read(executor);
       ApplicationWriter writer =
-          new ApplicationWriter(
+          ApplicationWriter.create(
               AppView.createForD8(
                   AppInfo.createInitialAppInfo(
                       dexApp, GlobalSyntheticsStrategy.forNonSynthesizing())),
diff --git a/src/test/java/com/android/tools/r8/utils/StringUtilsTest.java b/src/test/java/com/android/tools/r8/utils/StringUtilsTest.java
index 8279af3..acadcc6 100644
--- a/src/test/java/com/android/tools/r8/utils/StringUtilsTest.java
+++ b/src/test/java/com/android/tools/r8/utils/StringUtilsTest.java
@@ -6,13 +6,29 @@
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertSame;
 
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
 import com.android.tools.r8.utils.StringUtils.BraceType;
 import com.google.common.base.Strings;
 import com.google.common.collect.ImmutableList;
 import java.util.List;
 import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
 
-public class StringUtilsTest {
+@RunWith(Parameterized.class)
+public class StringUtilsTest extends TestBase {
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withNoneRuntime().build();
+  }
+
+  public StringUtilsTest(TestParameters parameters) {
+    parameters.assertNoneRuntime();
+  }
 
   @Test
   public void splitLines() {
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
index a790753..e353ee6 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/AbsentClassSubject.java
@@ -46,7 +46,7 @@
   }
 
   @Override
-  public MethodSubject uniqueMethodWithName(String name) {
+  public MethodSubject uniqueMethodWithOriginalName(String name) {
     return new AbsentMethodSubject();
   }
 
@@ -70,7 +70,7 @@
   }
 
   @Override
-  public FieldSubject uniqueFieldWithName(String name) {
+  public FieldSubject uniqueFieldWithOriginalName(String name) {
     return new AbsentFieldSubject();
   }
 
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 db4985c..0b2b52c 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
@@ -105,7 +105,7 @@
 
   public abstract MethodSubject uniqueMethodThatMatches(Predicate<FoundMethodSubject> predicate);
 
-  public abstract MethodSubject uniqueMethodWithName(String name);
+  public abstract MethodSubject uniqueMethodWithOriginalName(String name);
 
   public abstract MethodSubject uniqueMethodWithFinalName(String name);
 
@@ -172,7 +172,7 @@
 
   public abstract FieldSubject field(String type, String name);
 
-  public abstract FieldSubject uniqueFieldWithName(String name);
+  public abstract FieldSubject uniqueFieldWithOriginalName(String name);
 
   public abstract FieldSubject uniqueFieldWithFinalName(String name);
 
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 2c304ad..ff35c6e 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
@@ -148,7 +148,7 @@
   }
 
   @Override
-  public MethodSubject uniqueMethodWithName(String name) {
+  public MethodSubject uniqueMethodWithOriginalName(String name) {
     MethodSubject methodSubject = null;
     for (FoundMethodSubject candidate : allMethods()) {
       if (candidate.getOriginalName(false).equals(name)) {
@@ -219,13 +219,14 @@
   }
 
   @Override
-  public FieldSubject uniqueFieldWithName(String name) {
-    return uniqueFieldWithName(name, null);
+  public FieldSubject uniqueFieldWithOriginalName(String name) {
+    return uniqueFieldWithOriginalName(name, null);
   }
 
   // TODO(b/169882658): This should be removed when we have identity mappings for ambiguous cases.
-  public FieldSubject uniqueFieldWithName(String name, TypeReference originalType) {
+  public FieldSubject uniqueFieldWithOriginalName(String name, TypeReference originalType) {
     Retracer retracer = codeInspector.retrace();
+    ClassReference finalReference = getFinalReference();
     Set<FoundFieldSubject> candidates = Sets.newIdentityHashSet();
     Set<FoundFieldSubject> sameTypeCandidates = Sets.newIdentityHashSet();
     for (FoundFieldSubject candidate : allFields()) {
@@ -238,7 +239,8 @@
         }
       }
       retracer
-          .retraceField(fieldReference)
+          .retraceClass(finalReference)
+          .lookupField(candidate.getFinalName())
           .forEach(
               element -> {
                 RetracedFieldReference field = element.getField();
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/analysis/ProtoApplicationStats.java b/src/test/java/com/android/tools/r8/utils/codeinspector/analysis/ProtoApplicationStats.java
index 4d4c84b..c06e09d 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/analysis/ProtoApplicationStats.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/analysis/ProtoApplicationStats.java
@@ -225,7 +225,7 @@
           continue;
         }
         FieldSubject fieldSubject =
-            classSubject.uniqueFieldWithName(extensionField.name.toSourceString());
+            classSubject.uniqueFieldWithOriginalName(extensionField.name.toSourceString());
         if (fieldSubject.isPresent()) {
           generatedExtensionRegistryStats.spuriouslyRetainedExtensionFields.add(extensionField);
         }
diff --git a/src/test/java/com/android/tools/r8/workaround/InputWithAbstractMethodOnNonAbstractClassTest.java b/src/test/java/com/android/tools/r8/workaround/InputWithAbstractMethodOnNonAbstractClassTest.java
index f44fff9..00a3fba 100644
--- a/src/test/java/com/android/tools/r8/workaround/InputWithAbstractMethodOnNonAbstractClassTest.java
+++ b/src/test/java/com/android/tools/r8/workaround/InputWithAbstractMethodOnNonAbstractClassTest.java
@@ -72,7 +72,8 @@
   }
 
   private void inspect(CodeInspector inspector) {
-    MethodSubject methodOfInterest = inspector.clazz(Greeter.class).uniqueMethodWithName("dead");
+    MethodSubject methodOfInterest =
+        inspector.clazz(Greeter.class).uniqueMethodWithOriginalName("dead");
     assertThat(methodOfInterest, isPresent());
     if (parameters.isCfRuntime() || parameters.getApiLevel().isLessThan(AndroidApiLevel.L)) {
       assertThat(methodOfInterest, not(isAbstract()));
diff --git a/src/test/java/com/android/tools/r8/workaround/InvokeVirtualToInterfaceVerifyErrorWorkaroundTest.java b/src/test/java/com/android/tools/r8/workaround/InvokeVirtualToInterfaceVerifyErrorWorkaroundTest.java
index 3cc8749..03d7c66 100644
--- a/src/test/java/com/android/tools/r8/workaround/InvokeVirtualToInterfaceVerifyErrorWorkaroundTest.java
+++ b/src/test/java/com/android/tools/r8/workaround/InvokeVirtualToInterfaceVerifyErrorWorkaroundTest.java
@@ -68,7 +68,7 @@
                 assertThat(cameraDeviceUserClassSubject, isPresent());
 
                 MethodSubject mMethodSubject =
-                    cameraDeviceUserClassSubject.uniqueMethodWithName("m");
+                    cameraDeviceUserClassSubject.uniqueMethodWithOriginalName("m");
                 assertThat(mMethodSubject, isPresent());
                 assertThat(mMethodSubject, invokesMethodWithName("close"));
               }
diff --git a/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1 b/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1
index 524abea..6bb56ca 100644
--- a/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1
+++ b/third_party/openjdk/desugar_jdk_libs_11.tar.gz.sha1
@@ -1 +1 @@
-ae103f657ce219b839706397baac799745d46049
\ No newline at end of file
+ed1a6a57d899d32cc749160872cad5c2130566b7
\ No newline at end of file
diff --git a/third_party/retrace/binary_compatibility.tar.gz.sha1 b/third_party/retrace/binary_compatibility.tar.gz.sha1
index 750079a..5d61558 100644
--- a/third_party/retrace/binary_compatibility.tar.gz.sha1
+++ b/third_party/retrace/binary_compatibility.tar.gz.sha1
@@ -1 +1 @@
-ed632240a9f5652ed988ccf84c5f592a487d24c3
\ No newline at end of file
+189692be996b34e4ba4a069c148b20d7ff99abe7
\ No newline at end of file
diff --git a/tools/create_r8lib.py b/tools/create_r8lib.py
index c48eaca..b6189e6 100755
--- a/tools/create_r8lib.py
+++ b/tools/create_r8lib.py
@@ -96,7 +96,7 @@
   cmd.extend(['--source-file-template', source_file_template])
   cmd.extend(['--output', args.output])
   cmd.extend(['--pg-map-output', args.output + '.map'])
-  cmd.extend(['--lib', 'third_party/openjdk/openjdk-rt-1.8/rt.jar'])
+  cmd.extend(['--lib', jdk.GetJdkHome()])
   if args.pg_conf:
     for pgconf in args.pg_conf:
       cmd.extend(['--pg-conf', pgconf])