diff --git a/build.gradle b/build.gradle
index 3c96101..d3005a8 100644
--- a/build.gradle
+++ b/build.gradle
@@ -301,6 +301,9 @@
 def r8DesugaredPath = "$buildDir/libs/r8desugared.jar"
 def r8LibGeneratedKeepRulesPath = "$buildDir/generated/keep.txt"
 def r8LibTestPath = "$buildDir/classes/r8libtest"
+def java11ClassFiles = "$buildDir/classes/java/mainJava11"
+def r8RetracePath = "$buildDir/libs/r8retrace.jar"
+def r8RetraceExludeDepsPath = "$buildDir/libs/r8retrace-exclude-deps.jar"
 
 def osString = OperatingSystem.current().isLinux() ? "linux" :
         OperatingSystem.current().isMacOsX() ? "mac" : "windows"
@@ -1117,6 +1120,29 @@
     outputs.file r8DesugaredPath
 }
 
+task R8Retrace {
+    dependsOn R8Lib
+    dependsOn r8LibCreateTask(
+            "Retrace",
+            ["src/main/keep_retrace.txt"],
+            R8Lib,
+            r8RetracePath,
+    ).dependsOn(R8Lib)
+    outputs.file r8RetracePath
+}
+
+task R8RetraceNoDeps {
+    dependsOn R8LibNoDeps
+    dependsOn r8LibCreateTask(
+            "RetraceNoDeps",
+            ["src/main/keep_retrace.txt"],
+            R8LibNoDeps,
+            r8RetraceExludeDepsPath,
+            repackageDeps.outputs.files
+    ).dependsOn(R8LibNoDeps)
+    outputs.file r8RetraceExludeDepsPath
+}
+
 task sourceJar(type: Jar, dependsOn: classes) {
     classifier = 'src'
     from sourceSets.main.allSource
@@ -1717,7 +1743,7 @@
       maxParallelForks = processors.intdiv(3) ?: 1
       // On low cpu count machines (bots) we under subscribe, so increase the count.
       if (processors == 8) {
-        maxParallelForks = 4
+        maxParallelForks = 3
       }
     }
     println("NOTE: Max parallel forks " + maxParallelForks)
diff --git a/src/main/java/com/android/tools/r8/KeepForRetraceApi.java b/src/main/java/com/android/tools/r8/KeepForRetraceApi.java
new file mode 100644
index 0000000..5ed253c
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/KeepForRetraceApi.java
@@ -0,0 +1,8 @@
+// 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;
+
+@KeepForRetraceApi
+public @interface KeepForRetraceApi {}
diff --git a/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java b/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java
index df4cefd..9a4afa3 100644
--- a/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java
+++ b/src/main/java/com/android/tools/r8/androidapi/AndroidApiReferenceLevelCache.java
@@ -88,10 +88,12 @@
       // of the program.
       return appView.options().minApiLevel;
     }
-    return reference.apply(
-        androidApiLevelDatabase::getTypeApiLevel,
-        androidApiLevelDatabase::getFieldApiLevel,
-        androidApiLevelDatabase::getMethodApiLevel);
+    return reference
+        .apply(
+            androidApiLevelDatabase::getTypeApiLevel,
+            androidApiLevelDatabase::getFieldApiLevel,
+            androidApiLevelDatabase::getMethodApiLevel)
+        .max(appView.options().minApiLevel);
   }
 
   private boolean isReferenceToJavaLangObject(DexReference reference) {
diff --git a/src/main/java/com/android/tools/r8/ir/code/ArrayAccess.java b/src/main/java/com/android/tools/r8/ir/code/ArrayAccess.java
index 14ac116..9140e87 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ArrayAccess.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ArrayAccess.java
@@ -35,4 +35,23 @@
   }
 
   public abstract ArrayAccess withMemberType(MemberType newMemberType);
+
+  @Override
+  public boolean instructionTypeCanThrow() {
+    return true;
+  }
+
+  @Override
+  public boolean instructionInstanceCanThrow() {
+    // TODO(b/203731608): Add parameters to the method and use abstract value in R8.
+    if (index().isConstant() && !array().isPhi() && array().definition.isNewArrayEmpty()) {
+      Value newArraySizeValue = array().definition.asNewArrayEmpty().size();
+      if (newArraySizeValue.isConstant()) {
+        int newArraySize = newArraySizeValue.getConstInstruction().asConstNumber().getIntValue();
+        int index = index().getConstInstruction().asConstNumber().getIntValue();
+        return newArraySize <= 0 || index < 0 || newArraySize <= index;
+      }
+    }
+    return true;
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java b/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java
index 845cb26..9aff428 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ArrayGet.java
@@ -22,6 +22,7 @@
 import com.android.tools.r8.graph.ProgramMethod;
 import com.android.tools.r8.ir.analysis.type.ArrayTypeElement;
 import com.android.tools.r8.ir.analysis.type.TypeElement;
+import com.android.tools.r8.ir.analysis.value.AbstractValue;
 import com.android.tools.r8.ir.conversion.CfBuilder;
 import com.android.tools.r8.ir.conversion.DexBuilder;
 import com.android.tools.r8.ir.conversion.TypeConstraintResolver;
@@ -135,12 +136,6 @@
   }
 
   @Override
-  public boolean instructionTypeCanThrow() {
-    // TODO: Determine if the array index out-of-bounds exception cannot happen.
-    return true;
-  }
-
-  @Override
   public boolean isArrayGet() {
     return true;
   }
@@ -272,4 +267,20 @@
   public ArrayAccess withMemberType(MemberType newMemberType) {
     return new ArrayGet(newMemberType, outValue(), array(), index());
   }
+
+  @Override
+  public boolean instructionMayHaveSideEffects(
+      AppView<?> appView, ProgramMethod context, SideEffectAssumption assumption) {
+    // TODO(b/203731608): Move to instructionInstanceCanThrow and remove the method.
+    if (array().isPhi() || !index().isConstant()) {
+      return true;
+    }
+    AbstractValue abstractValue = array().getAliasedValue().getAbstractValue(appView, context);
+    if (!abstractValue.isKnownLengthArrayValue()) {
+      return true;
+    }
+    int newArraySize = abstractValue.asKnownLengthArrayValue().getLength();
+    int index = index().getConstInstruction().asConstNumber().getIntValue();
+    return newArraySize <= 0 || index < 0 || newArraySize <= index;
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java b/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java
index 9dae2a8..4108175 100644
--- a/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java
+++ b/src/main/java/com/android/tools/r8/ir/code/ArrayPut.java
@@ -115,24 +115,6 @@
   }
 
   @Override
-  public boolean instructionTypeCanThrow() {
-    return true;
-  }
-
-  @Override
-  public boolean instructionInstanceCanThrow() {
-    if (index().isConstant() && !array().isPhi() && array().definition.isNewArrayEmpty()) {
-      Value newArraySizeValue = array().definition.asNewArrayEmpty().size();
-      if (newArraySizeValue.isConstant()) {
-        int newArraySize = newArraySizeValue.getConstInstruction().asConstNumber().getIntValue();
-        int index = index().getConstInstruction().asConstNumber().getIntValue();
-        return newArraySize <= 0 || index < 0 || newArraySize <= index;
-      }
-    }
-    return true;
-  }
-
-  @Override
   public boolean instructionMayHaveSideEffects(
       AppView<?> appView, ProgramMethod context, SideEffectAssumption assumption) {
     // In debug mode, ArrayPut has a side-effect on the locals.
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordCfMethods.java b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordCfMethods.java
index ed388b8..f64b05b 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/records/RecordCfMethods.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/records/RecordCfMethods.java
@@ -110,10 +110,10 @@
                 182,
                 options.itemFactory.createMethod(
                     options.itemFactory.stringType,
-                    options.itemFactory.createProto(options.itemFactory.booleanType),
-                    options.itemFactory.createString("isEmpty")),
+                    options.itemFactory.createProto(options.itemFactory.intType),
+                    options.itemFactory.createString("length")),
                 false),
-            new CfIf(If.Type.EQ, ValueType.INT, label1),
+            new CfIf(If.Type.NE, ValueType.INT, label1),
             new CfConstNumber(0, ValueType.INT),
             new CfNewArray(options.itemFactory.createType("[Ljava/lang/String;")),
             new CfGoto(label2),
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
index 0b7b139..8007b17 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
@@ -127,8 +127,7 @@
       WhyAreYouNotInliningReporter whyAreYouNotInliningReporter) {
     // Do not inline if the inlinee is greater than the api caller level.
     // TODO(b/188498051): We should not force inline lower api method calls.
-    if (reason != Reason.FORCE
-        && isApiSafeForInlining(method, singleTarget, appView.options()).isPossiblyFalse()) {
+    if (reason != Reason.FORCE && !isApiSafeForInlining(method, singleTarget, appView.options())) {
       whyAreYouNotInliningReporter.reportInlineeHigherApiCall();
       return false;
     }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
index 5f05d8d..228c259 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/classinliner/InlineCandidateProcessor.java
@@ -880,7 +880,7 @@
       return null;
     }
     // Check the api level is allowed to be inlined.
-    if (isApiSafeForInlining(method, singleTarget, appView.options()).isPossiblyFalse()) {
+    if (!isApiSafeForInlining(method, singleTarget, appView.options())) {
       return null;
     }
     // Check that the entire constructor chain can be inlined into the current context.
@@ -910,7 +910,7 @@
         return null;
       }
       // Check the api level is allowed to be inlined.
-      if (isApiSafeForInlining(method, encodedParent, appView.options()).isPossiblyFalse()) {
+      if (!isApiSafeForInlining(method, encodedParent, appView.options())) {
         return null;
       }
       parent =
diff --git a/src/main/java/com/android/tools/r8/references/ArrayReference.java b/src/main/java/com/android/tools/r8/references/ArrayReference.java
index 919bbd7..6699f2b 100644
--- a/src/main/java/com/android/tools/r8/references/ArrayReference.java
+++ b/src/main/java/com/android/tools/r8/references/ArrayReference.java
@@ -4,12 +4,14 @@
 package com.android.tools.r8.references;
 
 import com.android.tools.r8.Keep;
+import com.android.tools.r8.KeepForRetraceApi;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.utils.DescriptorUtils;
 import java.util.Objects;
 
 /** Reference to an array type. */
 @Keep
+@KeepForRetraceApi
 public final class ArrayReference implements TypeReference {
 
   private final int dimensions;
diff --git a/src/main/java/com/android/tools/r8/references/ClassReference.java b/src/main/java/com/android/tools/r8/references/ClassReference.java
index 3e30319..392b4a4 100644
--- a/src/main/java/com/android/tools/r8/references/ClassReference.java
+++ b/src/main/java/com/android/tools/r8/references/ClassReference.java
@@ -4,10 +4,12 @@
 package com.android.tools.r8.references;
 
 import com.android.tools.r8.Keep;
+import com.android.tools.r8.KeepForRetraceApi;
 import com.android.tools.r8.utils.DescriptorUtils;
 
 /** Reference to a class type or interface type. */
 @Keep
+@KeepForRetraceApi
 public final class ClassReference implements TypeReference {
 
   private final String descriptor;
diff --git a/src/main/java/com/android/tools/r8/references/FieldReference.java b/src/main/java/com/android/tools/r8/references/FieldReference.java
index d4d74fd..dab6fd8 100644
--- a/src/main/java/com/android/tools/r8/references/FieldReference.java
+++ b/src/main/java/com/android/tools/r8/references/FieldReference.java
@@ -4,6 +4,7 @@
 package com.android.tools.r8.references;
 
 import com.android.tools.r8.Keep;
+import com.android.tools.r8.KeepForRetraceApi;
 import java.util.Objects;
 
 /**
@@ -13,6 +14,7 @@
  * type of the field.
  */
 @Keep
+@KeepForRetraceApi
 public final class FieldReference {
   private final ClassReference holderClass;
   private final String fieldName;
diff --git a/src/main/java/com/android/tools/r8/references/MethodReference.java b/src/main/java/com/android/tools/r8/references/MethodReference.java
index fc8f183..e0314b8 100644
--- a/src/main/java/com/android/tools/r8/references/MethodReference.java
+++ b/src/main/java/com/android/tools/r8/references/MethodReference.java
@@ -4,6 +4,7 @@
 package com.android.tools.r8.references;
 
 import com.android.tools.r8.Keep;
+import com.android.tools.r8.KeepForRetraceApi;
 import com.android.tools.r8.utils.ListUtils;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.StringUtils.BraceType;
@@ -17,6 +18,7 @@
  * full list of formal parameters.
  */
 @Keep
+@KeepForRetraceApi
 public final class MethodReference {
   private final ClassReference holderClass;
   private final String methodName;
diff --git a/src/main/java/com/android/tools/r8/references/PackageReference.java b/src/main/java/com/android/tools/r8/references/PackageReference.java
index b2474fe..b959738 100644
--- a/src/main/java/com/android/tools/r8/references/PackageReference.java
+++ b/src/main/java/com/android/tools/r8/references/PackageReference.java
@@ -5,11 +5,13 @@
 package com.android.tools.r8.references;
 
 import com.android.tools.r8.Keep;
+import com.android.tools.r8.KeepForRetraceApi;
 import com.android.tools.r8.utils.DescriptorUtils;
 import java.util.Objects;
 
 /** Reference to a package. */
 @Keep
+@KeepForRetraceApi
 public class PackageReference {
 
   private final String packageName;
diff --git a/src/main/java/com/android/tools/r8/references/PrimitiveReference.java b/src/main/java/com/android/tools/r8/references/PrimitiveReference.java
index eb4ae72..f7fe50a 100644
--- a/src/main/java/com/android/tools/r8/references/PrimitiveReference.java
+++ b/src/main/java/com/android/tools/r8/references/PrimitiveReference.java
@@ -4,9 +4,11 @@
 package com.android.tools.r8.references;
 
 import com.android.tools.r8.Keep;
+import com.android.tools.r8.KeepForRetraceApi;
 import com.android.tools.r8.errors.Unreachable;
 
 @Keep
+@KeepForRetraceApi
 public abstract class PrimitiveReference implements TypeReference {
 
   static final PrimitiveReference BOOL =
diff --git a/src/main/java/com/android/tools/r8/references/Reference.java b/src/main/java/com/android/tools/r8/references/Reference.java
index e6a829b..75dfb4c 100644
--- a/src/main/java/com/android/tools/r8/references/Reference.java
+++ b/src/main/java/com/android/tools/r8/references/Reference.java
@@ -4,6 +4,7 @@
 package com.android.tools.r8.references;
 
 import com.android.tools.r8.Keep;
+import com.android.tools.r8.KeepForRetraceApi;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.google.common.collect.ImmutableList;
 import java.lang.reflect.Constructor;
@@ -22,6 +23,7 @@
  * <p>No guarantees are made on identity and all references must be compared by {@code equals}.
  */
 @Keep
+@KeepForRetraceApi
 public final class Reference {
 
   public static PrimitiveReference BOOL = PrimitiveReference.BOOL;
diff --git a/src/main/java/com/android/tools/r8/references/TypeReference.java b/src/main/java/com/android/tools/r8/references/TypeReference.java
index bfef3f6..36099b9 100644
--- a/src/main/java/com/android/tools/r8/references/TypeReference.java
+++ b/src/main/java/com/android/tools/r8/references/TypeReference.java
@@ -4,9 +4,11 @@
 package com.android.tools.r8.references;
 
 import com.android.tools.r8.Keep;
+import com.android.tools.r8.KeepForRetraceApi;
 import com.android.tools.r8.utils.DescriptorUtils;
 
 @Keep
+@KeepForRetraceApi
 public interface TypeReference {
 
   /**
diff --git a/src/main/java/com/android/tools/r8/utils/AndroidApiLevelUtils.java b/src/main/java/com/android/tools/r8/utils/AndroidApiLevelUtils.java
index 96c4a2b..73ee4de 100644
--- a/src/main/java/com/android/tools/r8/utils/AndroidApiLevelUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/AndroidApiLevelUtils.java
@@ -8,18 +8,17 @@
 
 public class AndroidApiLevelUtils {
 
-  public static OptionalBool isApiSafeForInlining(
+  public static boolean isApiSafeForInlining(
       ProgramMethod caller, ProgramMethod inlinee, InternalOptions options) {
     if (!options.apiModelingOptions().enableApiCallerIdentification) {
-      return OptionalBool.TRUE;
+      return true;
     }
     if (caller.getHolderType() == inlinee.getHolderType()) {
-      return OptionalBool.TRUE;
+      return true;
     }
-    return OptionalBool.of(
-        caller
-            .getDefinition()
-            .getApiLevel()
-            .isGreaterThanOrEqualTo(inlinee.getDefinition().getApiLevelForCode()));
+    return caller
+        .getDefinition()
+        .getApiLevel()
+        .isGreaterThanOrEqualTo(inlinee.getDefinition().getApiLevelForCode());
   }
 }
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 0fdc11c..88c96ef 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -1473,7 +1473,7 @@
     public Map<ClassReference, AndroidApiLevel> classApiMapping = new HashMap<>();
     public BiConsumer<MethodReference, AndroidApiLevel> tracedMethodApiLevelCallback = null;
 
-    public boolean enableApiCallerIdentification = false;
+    public boolean enableApiCallerIdentification = true;
     public boolean checkAllApiReferencesAreSet = true;
     public boolean useHashingDatabase = true;
 
diff --git a/src/main/keep.txt b/src/main/keep.txt
index e03ef61..e376924 100644
--- a/src/main/keep.txt
+++ b/src/main/keep.txt
@@ -2,9 +2,13 @@
 # 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.
 
+# TODO(b/204058761): Remove when we can use test proguard options.
 -keep @com.android.tools.r8.Keep class * { public *; }
 -keep @com.android.tools.r8.KeepForSubclassing class * { public *; protected *; }
 
+# Keep all things that can be reached from the retrace api and keep the annotation
+-keep @com.android.tools.r8.KeepForRetraceApi class * { public *; }
+
 -keep public class com.android.tools.r8.D8 { public static void main(java.lang.String[]); }
 -keep public class com.android.tools.r8.R8 { public static void main(java.lang.String[]); }
 -keep public class com.android.tools.r8.ExtractMarker { public static void main(java.lang.String[]); }
@@ -18,7 +22,7 @@
 -keep public class com.android.tools.r8.Version { public static java.lang.String getPreReleaseString(); }
 -keep public class com.android.tools.r8.Version { public static boolean isDevelopmentVersion(); }
 
--keepattributes SourceFile, LineNumberTable, InnerClasses, EnclosingMethod, Exceptions, Signature
+-keepattributes SourceFile, LineNumberTable, InnerClasses, EnclosingMethod, Exceptions, Signature, RuntimeInvisibleAnnotations
 
 -keepparameternames
 -keeppackagenames com.android.tools.r8
diff --git a/src/main/keep_retrace.txt b/src/main/keep_retrace.txt
new file mode 100644
index 0000000..e8d050a
--- /dev/null
+++ b/src/main/keep_retrace.txt
@@ -0,0 +1,19 @@
+# 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.
+
+# The retrace api is separated out without repackaging which is why this broad
+# rule is used.
+-keep public class com.android.tools.r8.retrace.* {
+     public <methods>;
+     public <fields>;
+ }
+-keepattributes SourceFile, LineNumberTable, InnerClasses, EnclosingMethod, Exceptions, Signature
+-keepparameternames
+
+# This is run on r8lib so keep everything in lib that is traced. That way
+# we only need a single mapping file
+-keep,allowshrinking class * { *; }
+
+# Keep all things that can be reached from the retrace api
+-keep @com.android.tools.r8.KeepForRetraceApi class * { public *; }
diff --git a/src/test/java/com/android/tools/r8/ProguardVersion.java b/src/test/java/com/android/tools/r8/ProguardVersion.java
index 20560fc..3be26d9 100644
--- a/src/test/java/com/android/tools/r8/ProguardVersion.java
+++ b/src/test/java/com/android/tools/r8/ProguardVersion.java
@@ -25,16 +25,25 @@
   }
 
   public Path getProguardScript() {
+    return isWindows()
+        ? getScriptDirectory().resolve("proguard.bat")
+        : getScriptDirectory().resolve("proguard.sh");
+  }
+
+  public Path getRetraceScript() {
+    return isWindows()
+        ? getScriptDirectory().resolve("retrace.bat")
+        : getScriptDirectory().resolve("retrace.sh");
+  }
+
+  private Path getScriptDirectory() {
     Path scriptDirectory = Paths.get(ToolHelper.THIRD_PARTY_DIR).resolve("proguard");
     if (this == V7_0_0) {
-      scriptDirectory = scriptDirectory.resolve("proguard-" + version);
+      scriptDirectory = scriptDirectory.resolve("proguard-" + version).resolve("bin");
     } else {
-      scriptDirectory = scriptDirectory.resolve("proguard" + version);
+      scriptDirectory = scriptDirectory.resolve("proguard" + version).resolve("bin");
     }
-    if (isWindows()) {
-      return scriptDirectory.resolve("bin/proguard.bat");
-    }
-    return scriptDirectory.resolve("bin/proguard.sh");
+    return scriptDirectory;
   }
 
   public String getVersion() {
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 8f3b1e4..033c3f4 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -155,8 +155,6 @@
   public static final Path JACOCO_CLI = JACOCO_ROOT.resolve(Paths.get("lib", "jacococli.jar"));
   public static final String PROGUARD_SETTINGS_FOR_INTERNAL_APPS = "third_party/proguardsettings/";
 
-  private static final String RETRACE6_0_1 = "third_party/proguard/proguard6.0.1/bin/retrace";
-  private static final String RETRACE = RETRACE6_0_1;
   public static final Path RETRACE_MAPS_DIR = Paths.get(THIRD_PARTY_DIR, "r8mappings");
 
   public static final long BOT_MAX_HEAP_SIZE = 7908360192L;
@@ -177,6 +175,7 @@
   public static final Path R8LIB_EXCLUDE_DEPS_MAP =
       Paths.get(LIBS_DIR, "r8lib-exclude-deps.jar.map");
   public static final Path DEPS = Paths.get(LIBS_DIR, "deps_all.jar");
+  public static final Path R8_RETRACE_JAR = Paths.get(LIBS_DIR, "r8retrace.jar");
 
   public static final Path DESUGAR_LIB_CONVERSIONS =
       Paths.get(LIBS_DIR, "library_desugar_conversions.zip");
@@ -777,13 +776,6 @@
     return new Backend[]{Backend.DEX};
   }
 
-  private static String getRetraceScript() {
-    if (isWindows()) {
-      return RETRACE + ".bat";
-    }
-    return RETRACE + ".sh";
-  }
-
   private static Path getDxExecutablePath() {
     String toolsDir = toolsDir();
     String executableName = toolsDir.equals("windows") ? "dx.bat" : "dx";
@@ -2021,17 +2013,19 @@
     return runProguard(getProguard6Script(), inJar, outJar, configs, map);
   }
 
-  public static ProcessResult runRetraceRaw(Path map, Path stackTrace) throws IOException {
+  public static ProcessResult runRetraceRaw(Path retracePath, Path map, Path stackTrace)
+      throws IOException {
     List<String> command = new ArrayList<>();
-    command.add(getRetraceScript());
+    command.add(retracePath.toString());
     command.add(map.toString());
     command.add(stackTrace.toString());
     ProcessBuilder builder = new ProcessBuilder(command);
     return ToolHelper.runProcess(builder);
   }
 
-  public static String runRetrace(Path map, Path stackTrace) throws IOException {
-    ProcessResult result = runRetraceRaw(map, stackTrace);
+  public static String runRetrace(ProguardVersion pgRetracer, Path map, Path stackTrace)
+      throws IOException {
+    ProcessResult result = runRetraceRaw(pgRetracer.getRetraceScript(), map, stackTrace);
     if (result.exitCode != 0) {
       fail("Retrace failed, exit code " + result.exitCode + ", stderr:\n" + result.stderr);
     }
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 46ecc50..699bb50 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
@@ -4,6 +4,7 @@
 package com.android.tools.r8.classmerging.vertical;
 
 import static com.android.tools.r8.smali.SmaliBuilder.buildCode;
+import static com.android.tools.r8.utils.AndroidApiLevel.K;
 import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
 import static org.hamcrest.CoreMatchers.containsString;
 import static org.hamcrest.MatcherAssert.assertThat;
@@ -315,10 +316,13 @@
           CF_DIR.resolve("FieldCollisionTest$A.class"),
           CF_DIR.resolve("FieldCollisionTest$B.class")
         };
-    Set<String> preservedClassNames =
-        ImmutableSet.of(
-            "classmerging.FieldCollisionTest",
-            "classmerging.FieldCollisionTest$B");
+    ImmutableSet.Builder<String> preservedNamesBuilder = ImmutableSet.builder();
+    preservedNamesBuilder.add("classmerging.FieldCollisionTest");
+    preservedNamesBuilder.add("classmerging.FieldCollisionTest$B");
+    if (parameters.isCfRuntime() || parameters.getApiLevel().isLessThan(K)) {
+      preservedNamesBuilder.add("classmerging.FieldCollisionTest$A");
+    }
+    Set<String> preservedClassNames = preservedNamesBuilder.build();
     runTest(
         testForR8(parameters.getBackend())
             .addKeepRules(getProguardConfig(EXAMPLE_KEEP))
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesUpdateTest.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesUpdateTest.java
index 00575cd..bc389c9 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesUpdateTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesUpdateTest.java
@@ -12,10 +12,12 @@
 import static junit.framework.TestCase.assertTrue;
 
 import com.android.tools.r8.Jdk9TestUtils;
+import com.android.tools.r8.R8FullTestBuilder;
 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.ThrowableConsumer;
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.NestMemberClassAttribute;
 import com.android.tools.r8.utils.StringUtils;
@@ -51,33 +53,72 @@
 
   @Test
   public void testClassMergingNestMemberRemoval() throws Exception {
-    testNestAttributesCorrect(MERGING_OUTER_CLASS, MERGING_OUTER_CLASS, MERGING_EXPECTED_RESULT, 3);
+    testNestAttributesCorrect(
+        MERGING_OUTER_CLASS,
+        MERGING_OUTER_CLASS,
+        MERGING_EXPECTED_RESULT,
+        3,
+        ThrowableConsumer.empty());
   }
 
   @Test
   public void testClassMergingNestHostRemoval() throws Exception {
     testNestAttributesCorrect(
-        MERGING_OUTER_CLASS + "$MiddleOuter", MERGING_OUTER_CLASS, MERGING_EXPECTED_RESULT, 2);
+        MERGING_OUTER_CLASS + "$MiddleOuter",
+        MERGING_OUTER_CLASS,
+        MERGING_EXPECTED_RESULT,
+        2,
+        builder -> {
+          builder.addOptionsModification(
+              internalOptions -> {
+                // The test makes an invoke to StringConcatFactory which is not known to DEX and
+                // we therefore fail to merge the classes.
+                internalOptions.apiModelingOptions().enableApiCallerIdentification = false;
+              });
+        });
   }
 
   @Test
   public void testTreePruningNestMemberRemoval() throws Exception {
-    testNestAttributesCorrect(PRUNING_OUTER_CLASS, PRUNING_OUTER_CLASS, PRUNING_EXPECTED_RESULT, 2);
+    testNestAttributesCorrect(
+        PRUNING_OUTER_CLASS,
+        PRUNING_OUTER_CLASS,
+        PRUNING_EXPECTED_RESULT,
+        2,
+        ThrowableConsumer.empty());
   }
 
   @Test
   public void testTreePruningNestHostRemoval() throws Exception {
     testNestAttributesCorrect(
-        PRUNING_OUTER_CLASS + "$Pruned", PRUNING_OUTER_CLASS, PRUNING_EXPECTED_RESULT, 1);
+        PRUNING_OUTER_CLASS + "$Pruned",
+        PRUNING_OUTER_CLASS,
+        PRUNING_EXPECTED_RESULT,
+        1,
+        ThrowableConsumer.empty());
   }
 
   public void testNestAttributesCorrect(
-      String mainClassName, String outerNestName, String expectedResult, int expectedNumClassesLeft)
+      String mainClassName,
+      String outerNestName,
+      String expectedResult,
+      int expectedNumClassesLeft,
+      ThrowableConsumer<R8FullTestBuilder> testBuilderConsumer)
       throws Exception {
     testNestAttributesCorrect(
-        mainClassName, outerNestName, expectedResult, true, expectedNumClassesLeft);
+        mainClassName,
+        outerNestName,
+        expectedResult,
+        true,
+        expectedNumClassesLeft,
+        testBuilderConsumer);
     testNestAttributesCorrect(
-        mainClassName, outerNestName, expectedResult, false, expectedNumClassesLeft);
+        mainClassName,
+        outerNestName,
+        expectedResult,
+        false,
+        expectedNumClassesLeft,
+        testBuilderConsumer);
   }
 
   public void testNestAttributesCorrect(
@@ -85,7 +126,8 @@
       String outerNestName,
       String expectedResult,
       boolean minification,
-      int expectedNumClassesLeft)
+      int expectedNumClassesLeft,
+      ThrowableConsumer<R8FullTestBuilder> testBuilderConsumer)
       throws Exception {
     String actualMainClassName = PACKAGE_NAME + mainClassName;
     testForR8(parameters.getBackend())
@@ -101,6 +143,7 @@
         .applyIf(parameters.isCfRuntime(), Jdk9TestUtils.addJdk9LibraryFiles(temp))
         .addKeepPackageNamesRule("nesthostexample")
         .addInliningAnnotations()
+        .apply(testBuilderConsumer)
         .compile()
         .inspect(
             inspector -> {
diff --git a/src/test/java/com/android/tools/r8/desugar/records/RecordMethods.java b/src/test/java/com/android/tools/r8/desugar/records/RecordMethods.java
index a3df3b5..f00657c 100644
--- a/src/test/java/com/android/tools/r8/desugar/records/RecordMethods.java
+++ b/src/test/java/com/android/tools/r8/desugar/records/RecordMethods.java
@@ -13,7 +13,7 @@
   public static String toString(
       Object[] recordFieldsValues, Class<?> recordClass, String fieldNames) {
     // Example: "Person[name=Jane Doe, age=42]"
-    String[] fieldNamesSplit = fieldNames.isEmpty() ? new String[0] : fieldNames.split(";");
+    String[] fieldNamesSplit = fieldNames.length() == 0 ? new String[0] : fieldNames.split(";");
     StringBuilder builder = new StringBuilder();
     builder.append(recordClass.getSimpleName()).append("[");
     for (int i = 0; i < fieldNamesSplit.length; i++) {
diff --git a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ConstructorWithNonTrivialControlFlowTest.java b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ConstructorWithNonTrivialControlFlowTest.java
index 693b9bf..26bbf63 100644
--- a/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ConstructorWithNonTrivialControlFlowTest.java
+++ b/src/test/java/com/android/tools/r8/ir/optimize/classinliner/ConstructorWithNonTrivialControlFlowTest.java
@@ -12,6 +12,7 @@
 import com.android.tools.r8.NeverPropagateValue;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
@@ -56,9 +57,9 @@
 
   private void verifyClassInliningRemovesCandidate(CodeInspector inspector) {
     ClassSubject candidateClassSubject = inspector.clazz(Candidate.class);
-    if (enableClassInlining) {
-      // TODO(b/188388130): String.empty was added in AndroidApiLevel.G, so if this fails after
-      //  enabling api modeling then check for api level.
+    if (enableClassInlining
+        && (parameters.isDexRuntime()
+            && parameters.getApiLevel().isGreaterThanOrEqualTo(AndroidApiLevel.G))) {
       assertThat(candidateClassSubject, not(isPresent()));
     } else {
       assertThat(candidateClassSubject, isPresent());
diff --git a/src/test/java/com/android/tools/r8/naming/retraceproguard/CatchAllRangeWithNoLineNumberTest.java b/src/test/java/com/android/tools/r8/naming/retraceproguard/CatchAllRangeWithNoLineNumberTest.java
new file mode 100644
index 0000000..34da9a6
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/naming/retraceproguard/CatchAllRangeWithNoLineNumberTest.java
@@ -0,0 +1,121 @@
+// 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.naming.retraceproguard;
+
+import static org.junit.Assert.assertEquals;
+
+import com.android.tools.r8.ProguardVersion;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.retrace.ProguardMapProducer;
+import com.android.tools.r8.retrace.RetraceOptions;
+import com.android.tools.r8.retrace.StringRetrace;
+import com.android.tools.r8.utils.StringUtils;
+import java.io.IOException;
+import java.util.Arrays;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class CatchAllRangeWithNoLineNumberTest extends TestBase {
+
+  private final TestParameters parameters;
+  private final ProguardVersion proguardVersion;
+
+  @Parameters(name = "{0}, {1}")
+  public static List<Object[]> data() {
+    return buildParameters(getTestParameters().withNoneRuntime().build(), ProguardVersion.values());
+  }
+
+  public CatchAllRangeWithNoLineNumberTest(
+      TestParameters parameters, ProguardVersion proguardVersion) {
+    this.parameters = parameters;
+    this.proguardVersion = proguardVersion;
+  }
+
+  private final String[] stackTrace =
+      new String[] {
+        "\tat a.a(SourceFile)",
+        "\tat b.a(SourceFile)",
+        "\tat c.a(SourceFile)",
+        "\tat a.a(SourceFile:1)",
+        "\tat a.a(SourceFile:0)"
+      };
+
+  private final String mapping =
+      StringUtils.joinLines(
+          "foo.bar.Baz -> a:",
+          "  0:65535:void foo():33:33 -> a",
+          "foo.bar.Qux -> b:",
+          "  1:65535:void foo():33:33 -> a",
+          "foo.bar.Quux -> c:",
+          "  void foo():33:33 -> a");
+
+  private final String retraced5_2_1 =
+      StringUtils.lines(
+          "foo.bar.Baz.a(Baz.java)",
+          "foo.bar.Qux.a(Qux.java)",
+          "foo.bar.Quux.a(Quux.java)",
+          "foo.bar.Baz.foo(Baz.java:33)",
+          "foo.bar.Baz.a(Baz.java:0)");
+
+  private final String retraced6_0_1 =
+      StringUtils.lines(
+          "foo.bar.Baz.a(Baz.java)",
+          "foo.bar.Qux.a(Qux.java)",
+          "foo.bar.Quux.a(Quux.java)",
+          "foo.bar.Baz.foo(Baz.java:33)",
+          "foo.bar.Baz.a(Baz.java:0)");
+
+  private final String retraced7_0_0 =
+      StringUtils.lines(
+          "foo.bar.Baz.foo(Baz.java)",
+          "foo.bar.Qux.foo(Qux.java)",
+          "foo.bar.Quux.a(Quux.java)",
+          "foo.bar.Baz.foo(Baz.java:33)",
+          "foo.bar.Baz.foo(Baz.java:33)");
+
+  private final String retracedR8 =
+      StringUtils.lines(
+          "\tat foo.bar.Baz.foo(Baz.java:33)",
+          "\tat foo.bar.Qux.foo(Qux.java:33)",
+          "\tat foo.bar.Quux.foo(Quux.java:33)",
+          "\tat foo.bar.Baz.foo(Baz.java:33)",
+          "\tat foo.bar.Baz.foo(Baz.java:33)");
+
+  @Test
+  public void testCatchAllRange() throws IOException {
+    StackTrace actualStackTrace = StackTrace.extractFromJvm(StringUtils.lines(stackTrace));
+    StackTrace retraced =
+        actualStackTrace.retrace(proguardVersion, mapping, temp.newFolder().toPath());
+    assertEquals(getExpected(), retraced.toString());
+  }
+
+  @Test
+  public void testCatchAllRangeR8() {
+    List<String> retrace =
+        StringRetrace.create(
+                RetraceOptions.builder()
+                    .setProguardMapProducer(ProguardMapProducer.fromString(mapping))
+                    .build())
+            .retrace(Arrays.asList(stackTrace));
+    assertEquals(retracedR8, StringUtils.lines(retrace));
+  }
+
+  private String getExpected() {
+    switch (proguardVersion) {
+      case V5_2_1:
+        return retraced5_2_1;
+      case V6_0_1:
+        return retraced6_0_1;
+      default:
+        assertEquals(ProguardVersion.V7_0_0, proguardVersion);
+        return retraced7_0_0;
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/naming/retraceproguard/StackTrace.java b/src/test/java/com/android/tools/r8/naming/retraceproguard/StackTrace.java
index 92b78b6..8869cbc 100644
--- a/src/test/java/com/android/tools/r8/naming/retraceproguard/StackTrace.java
+++ b/src/test/java/com/android/tools/r8/naming/retraceproguard/StackTrace.java
@@ -8,6 +8,7 @@
 import static org.junit.Assert.assertNotEquals;
 import static org.junit.Assert.assertTrue;
 
+import com.android.tools.r8.ProguardVersion;
 import com.android.tools.r8.SingleTestRunResult;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.DexVm;
@@ -219,6 +220,11 @@
   }
 
   public StackTrace retrace(String map, Path tempFolder) throws IOException {
+    return retrace(ProguardVersion.getLatest(), map, tempFolder);
+  }
+
+  public StackTrace retrace(ProguardVersion proguardVersion, String map, Path tempFolder)
+      throws IOException {
     Path mapFile = tempFolder.resolve("map");
     Path stackTraceFile = tempFolder.resolve("stackTrace");
     FileUtils.writeTextFile(mapFile, map);
@@ -227,7 +233,8 @@
         stackTraceLines.stream().map(line -> line.originalLine).collect(Collectors.toList()));
     // Keep the original stderr in the retraced stacktrace.
     return new StackTrace(
-        internalExtractFromJvm(ToolHelper.runRetrace(mapFile, stackTraceFile)), originalStderr);
+        internalExtractFromJvm(ToolHelper.runRetrace(proguardVersion, mapFile, stackTraceFile)),
+        originalStderr);
   }
 
   public StackTrace filter(Predicate<StackTraceLine> filter) {
diff --git a/src/test/java/com/android/tools/r8/naming/retraceproguard/VerticalClassMergingRetraceTest.java b/src/test/java/com/android/tools/r8/naming/retraceproguard/VerticalClassMergingRetraceTest.java
index 3ad54fb..5905930 100644
--- a/src/test/java/com/android/tools/r8/naming/retraceproguard/VerticalClassMergingRetraceTest.java
+++ b/src/test/java/com/android/tools/r8/naming/retraceproguard/VerticalClassMergingRetraceTest.java
@@ -75,15 +75,8 @@
     return height;
   }
 
-  private boolean filterSynthesizedMethodWhenLineNumberAvailable(
-      StackTraceLine retracedStackTraceLine) {
-    return retracedStackTraceLine.lineNumber > 0;
-  }
-
   private boolean filterSynthesizedMethod(StackTraceLine retracedStackTraceLine) {
-    return haveSeenLines.add(retracedStackTraceLine)
-        && (retracedStackTraceLine.className.contains("ResourceWrapper")
-            || retracedStackTraceLine.className.contains("MainApp"));
+    return retracedStackTraceLine.lineNumber > 0;
   }
 
   @Test
@@ -95,7 +88,7 @@
           StackTrace reprocessedStackTrace =
               mode == CompilationMode.DEBUG
                   ? retracedStackTrace
-                  : retracedStackTrace.filter(this::filterSynthesizedMethodWhenLineNumberAvailable);
+                  : retracedStackTrace.filter(this::filterSynthesizedMethod);
           assertThat(
               reprocessedStackTrace.filter(this::isNotDalvikNativeStartMethod),
               isSameExceptForFileName(
@@ -114,7 +107,7 @@
           StackTrace reprocessedStackTrace =
               mode == CompilationMode.DEBUG
                   ? retracedStackTrace
-                  : retracedStackTrace.filter(this::filterSynthesizedMethodWhenLineNumberAvailable);
+                  : retracedStackTrace.filter(this::filterSynthesizedMethod);
           assertThat(
               reprocessedStackTrace.filter(this::isNotDalvikNativeStartMethod),
               isSameExceptForFileName(
diff --git a/src/test/java/com/android/tools/r8/retrace/RetraceCommandLineTests.java b/src/test/java/com/android/tools/r8/retrace/RetraceCommandLineTests.java
index 3fb600a..d348b54 100644
--- a/src/test/java/com/android/tools/r8/retrace/RetraceCommandLineTests.java
+++ b/src/test/java/com/android/tools/r8/retrace/RetraceCommandLineTests.java
@@ -303,7 +303,7 @@
       command.add(ToolHelper.getSystemJavaExecutable());
       command.add("-ea");
       command.add("-cp");
-      command.add(ToolHelper.R8LIB_JAR.toString());
+      command.add(ToolHelper.R8_RETRACE_JAR.toString());
       command.add("com.android.tools.r8.retrace.Retrace");
       command.addAll(args);
       ProcessBuilder builder = new ProcessBuilder(command);
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 17ea86d..16aa702 100644
--- a/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
+++ b/src/test/java/com/android/tools/r8/retrace/RetraceTests.java
@@ -408,7 +408,7 @@
       command.add(testParameters.getRuntime().asCf().getJavaExecutable().toString());
       command.add("-ea");
       command.add("-cp");
-      command.add(ToolHelper.R8LIB_JAR.toString());
+      command.add(ToolHelper.R8_RETRACE_JAR.toString());
       if (allowExperimentalMapping) {
         command.add("-Dcom.android.tools.r8.experimentalmapping");
       }
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 4deb785..fb48ff4 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
@@ -56,7 +56,7 @@
 
   @Override
   public Path getTargetJar() {
-    return ToolHelper.isTestingR8Lib() ? ToolHelper.R8LIB_JAR : ToolHelper.R8_JAR;
+    return ToolHelper.isTestingR8Lib() ? ToolHelper.R8_RETRACE_JAR : ToolHelper.R8_JAR;
   }
 
   @Override
diff --git a/src/test/java/com/android/tools/r8/shaking/negatedrules/NegatedKeepRulesTest.java b/src/test/java/com/android/tools/r8/shaking/negatedrules/NegatedKeepRulesTest.java
index b8de479..9afdd92 100644
--- a/src/test/java/com/android/tools/r8/shaking/negatedrules/NegatedKeepRulesTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/negatedrules/NegatedKeepRulesTest.java
@@ -301,6 +301,35 @@
             });
   }
 
+  @Test
+  public void testPositiveWithNegatedR8Compat() throws Exception {
+    testPositiveWithNegated(testForR8Compat(parameters.getBackend()));
+  }
+
+  @Test
+  public void testPositiveWithNegatedR8Full() throws Exception {
+    testPositiveWithNegated(testForR8(parameters.getBackend()));
+  }
+
+  @Test
+  public void testPositiveWithNegatedProguard() throws Exception {
+    testPositiveWithNegated(testForProguard(ProguardVersion.V7_0_0).addKeepRules("-dontwarn"));
+  }
+
+  public void testPositiveWithNegated(TestShrinkerBuilder<?, ?, ?, ?, ?> testBuilder)
+      throws Exception {
+    run(testBuilder.addKeepRules("-keep class **Bar,!**$Foo* { *; }"))
+        .inspect(
+            inspector -> {
+              assertThat(inspector.clazz(BarBar.class), isPresent());
+              assertThat(inspector.clazz(FooBar.class), isPresent());
+              assertThat(inspector.clazz(A.class), isPresent());
+              assertThat(inspector.clazz(B.class), isPresent());
+              assertThat(inspector.clazz(C.class), isPresent());
+              assertThat(inspector.clazz(D.class), isPresent());
+            });
+  }
+
   private TestCompileResult<?, ?> run(TestShrinkerBuilder<?, ?, ?, ?, ?> testBuilder)
       throws Exception {
     return testBuilder
diff --git a/tools/archive.py b/tools/archive.py
index 5207e5c..24e8e0a 100755
--- a/tools/archive.py
+++ b/tools/archive.py
@@ -145,6 +145,8 @@
     utils.D8,
     utils.R8LIB,
     utils.R8LIB_NO_DEPS,
+    utils.R8RETRACE,
+    utils.R8RETRACE_NO_DEPS,
     utils.LIBRARY_DESUGAR_CONVERSIONS,
     '-Pno_internal'
   ])
@@ -191,6 +193,8 @@
       utils.R8_FULL_EXCLUDE_DEPS_JAR,
       utils.R8LIB_EXCLUDE_DEPS_JAR,
       utils.R8LIB_EXCLUDE_DEPS_JAR + '.map',
+      utils.R8RETRACE_JAR,
+      utils.R8RETRACE_EXCLUDE_DEPS_JAR,
       utils.MAVEN_ZIP,
       utils.MAVEN_ZIP_LIB,
       utils.DESUGAR_CONFIGURATION,
diff --git a/tools/chrome_data.py b/tools/chrome_data.py
index 0d4329d..ebae542 100644
--- a/tools/chrome_data.py
+++ b/tools/chrome_data.py
@@ -248,6 +248,7 @@
         'inputs': [os.path.join(V180917_BASE, path) for path in INPUT_JARS],
         'pgconf': [os.path.join(V180917_BASE, path) for path in PG_CONFS],
         'libraries': [os.path.join(V180917_BASE, path) for path in LIBRARIES],
+        'min-api': '21',
     },
   },
   '200430': {
diff --git a/tools/r8_release.py b/tools/r8_release.py
index a0ed999..f9d14f9 100755
--- a/tools/r8_release.py
+++ b/tools/r8_release.py
@@ -363,6 +363,7 @@
       g4_open('src.jar')
       g4_open('lib.jar')
       g4_open('lib.jar.map')
+      g4_open('retrace_lib.jar')
       g4_open('desugar_jdk_libs_configuration.jar')
       download_file(options.version, 'r8-full-exclude-deps.jar', 'full.jar')
       download_file(options.version, 'r8-src.jar', 'src.jar')
@@ -371,6 +372,7 @@
           options.version, 'r8lib-exclude-deps.jar.map', 'lib.jar.map')
       download_file(options.version, 'desugar_jdk_libs_configuration.jar',
                     'desugar_jdk_libs_configuration.jar')
+      download_file(options.version, 'r8retrace-exclude-deps.jar', 'retrace_lib.jar')
       g4_open('METADATA')
       sed(r'[1-9]\.[0-9]{1,2}\.[0-9]{1,3}-dev',
           options.version,
diff --git a/tools/test.py b/tools/test.py
index 5da5b71..4a5d79c 100755
--- a/tools/test.py
+++ b/tools/test.py
@@ -321,6 +321,7 @@
     # Force gradle to build a version of r8lib without dependencies for
     # BootstrapCurrentEqualityTest.
     gradle_args.append('R8LibNoDeps')
+    gradle_args.append('R8Retrace')
   if options.r8lib_no_deps:
     gradle_args.append('-Pr8lib_no_deps')
   if options.worktree:
diff --git a/tools/utils.py b/tools/utils.py
index 40c5c7a..5d574ac 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -41,6 +41,8 @@
 R8 = 'r8'
 R8LIB = 'r8lib'
 R8LIB_NO_DEPS = 'r8LibNoDeps'
+R8RETRACE = 'R8Retrace'
+R8RETRACE_NO_DEPS = 'R8RetraceNoDeps'
 R8_SRC = 'sourceJar'
 LIBRARY_DESUGAR_CONVERSIONS = 'buildLibraryDesugarConversions'
 
@@ -52,6 +54,8 @@
 R8_SRC_JAR = os.path.join(LIBS, 'r8-src.jar')
 R8LIB_EXCLUDE_DEPS_JAR = os.path.join(LIBS, 'r8lib-exclude-deps.jar')
 R8_FULL_EXCLUDE_DEPS_JAR = os.path.join(LIBS, 'r8-full-exclude-deps.jar')
+R8RETRACE_JAR = os.path.join(LIBS, 'r8retrace.jar')
+R8RETRACE_EXCLUDE_DEPS_JAR = os.path.join(LIBS, 'r8retrace-exclude-deps.jar')
 MAVEN_ZIP = os.path.join(LIBS, 'r8.zip')
 MAVEN_ZIP_LIB = os.path.join(LIBS, 'r8lib.zip')
 LIBRARY_DESUGAR_CONVERSIONS_ZIP = os.path.join(LIBS, 'library_desugar_conversions.zip')
