diff --git a/src/test/java/com/android/tools/r8/ExternalR8TestCompileResult.java b/src/test/java/com/android/tools/r8/ExternalR8TestCompileResult.java
index f2a8839..3712893 100644
--- a/src/test/java/com/android/tools/r8/ExternalR8TestCompileResult.java
+++ b/src/test/java/com/android/tools/r8/ExternalR8TestCompileResult.java
@@ -32,6 +32,10 @@
     return outputJar;
   }
 
+  public String getProguardMap() {
+    return proguardMap;
+  }
+
   public String stdout() {
     return processResult.stdout;
   }
diff --git a/src/test/java/com/android/tools/r8/R8TestCompileResult.java b/src/test/java/com/android/tools/r8/R8TestCompileResult.java
index ecb0a92..95ec572 100644
--- a/src/test/java/com/android/tools/r8/R8TestCompileResult.java
+++ b/src/test/java/com/android/tools/r8/R8TestCompileResult.java
@@ -94,4 +94,8 @@
   public R8TestRunResult createRunResult(ProcessResult result) {
     return new R8TestRunResult(app, result, proguardMap, this::graphInspector);
   }
+
+  public String getProguardMap() {
+    return proguardMap;
+  }
 }
diff --git a/src/test/java/com/android/tools/r8/cf/BootstrapCurrentEqualityTest.java b/src/test/java/com/android/tools/r8/cf/BootstrapCurrentEqualityTest.java
index 03eaa28..fc00afb 100644
--- a/src/test/java/com/android/tools/r8/cf/BootstrapCurrentEqualityTest.java
+++ b/src/test/java/com/android/tools/r8/cf/BootstrapCurrentEqualityTest.java
@@ -12,12 +12,11 @@
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.ExternalR8TestCompileResult;
-import com.android.tools.r8.OutputMode;
-import com.android.tools.r8.R8;
-import com.android.tools.r8.R8Command;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.ProcessResult;
+import com.android.tools.r8.utils.FileUtils;
+import com.android.tools.r8.utils.Pair;
 import java.io.BufferedInputStream;
 import java.io.FileInputStream;
 import java.io.IOException;
@@ -46,8 +45,8 @@
     "-keep class " + HELLO_NAME + " {", "  public static void main(...);", "}",
   };
 
-  private static Path r8R8Debug;
-  private static Path r8R8Release;
+  private static Pair<Path, Path> r8R8Debug;
+  private static Pair<Path, Path> r8R8Release;
 
   private static boolean testExternal = true;
 
@@ -59,30 +58,29 @@
     r8R8Release = compileR8(CompilationMode.RELEASE);
   }
 
-  private static Path compileR8(CompilationMode mode) throws Exception {
+  private static Pair<Path, Path> compileR8(CompilationMode mode) throws Exception {
     // Run R8 on r8.jar.
-    Path jar;
+    final Path jar = testFolder.newFolder().toPath().resolve("out.jar");
+    final Path map = testFolder.newFolder().toPath().resolve("out.map");
     if (testExternal) {
-      jar =
-          testForExternalR8(newTempFolder(), Backend.CF)
-              .useR8WithRelocatedDeps()
-              .addProgramFiles(ToolHelper.R8_WITH_RELOCATED_DEPS_JAR)
-              .addKeepRuleFiles(MAIN_KEEP)
-              .setMode(mode)
-              .compile()
-              .outputJar();
+      testForExternalR8(newTempFolder(), Backend.CF)
+          .useR8WithRelocatedDeps()
+          .setMode(mode)
+          .addProgramFiles(ToolHelper.R8_WITH_RELOCATED_DEPS_JAR)
+          .addKeepRuleFiles(MAIN_KEEP)
+          .compile()
+          .apply(c -> FileUtils.writeTextFile(map, c.getProguardMap()))
+          .writeToZip(jar);
     } else {
-      jar = testFolder.newFolder().toPath().resolve("out.jar");
-      R8.run(
-          R8Command.builder()
-              .setMode(mode)
-              .addProgramFiles(ToolHelper.R8_WITH_RELOCATED_DEPS_JAR)
-              .addProguardConfigurationFiles(MAIN_KEEP)
-              .addLibraryFiles(runtimeJar(Backend.CF))
-              .setOutput(jar, OutputMode.ClassFile)
-              .build());
+      testForR8(newTempFolder(), Backend.CF)
+          .setMode(mode)
+          .addProgramFiles(ToolHelper.R8_WITH_RELOCATED_DEPS_JAR)
+          .addKeepRuleFiles(MAIN_KEEP)
+          .compile()
+          .apply(c -> FileUtils.writeTextFile(map, c.getProguardMap()))
+          .writeToZip(jar);
     }
-    return jar;
+    return new Pair<>(jar, map);
   }
 
   @Test
@@ -92,8 +90,9 @@
             new ProcessBuilder(
                 "python",
                 Paths.get(ToolHelper.TOOLS_DIR, "test_self_retrace.py").toString(),
-                r8R8Release.toString()));
-    assertEquals(0, result.exitCode);
+                r8R8Release.getFirst().toString(),
+                r8R8Release.getSecond().toString()));
+    assertEquals(result.toString(), 0, result.exitCode);
   }
 
   @Test
@@ -158,7 +157,7 @@
   }
 
   private void RunR8AndCheck(
-      Path r8,
+      Pair<Path, Path> r8,
       Path program,
       ExternalR8TestCompileResult result,
       String[] keep,
@@ -166,7 +165,7 @@
       throws Exception {
     ExternalR8TestCompileResult runR8R8 =
         testForExternalR8(newTempFolder(), Backend.CF)
-            .useProvidedR8(r8)
+            .useProvidedR8(r8.getFirst())
             .addProgramFiles(program)
             .addKeepRules(keep)
             .setMode(mode)
diff --git a/tools/test_self_retrace.py b/tools/test_self_retrace.py
index 46cb1d9..d7ab9aa 100755
--- a/tools/test_self_retrace.py
+++ b/tools/test_self_retrace.py
@@ -6,11 +6,13 @@
 from __future__ import absolute_import
 from __future__ import division
 from __future__ import print_function
+
 import gradle
 import jdk
 import os
 import subprocess
 import sys
+
 import utils
 
 EXCEPTION_LINE = 'Intentional exception for testing retrace.'
@@ -27,15 +29,16 @@
   if len(args) == 0:
     gradle.RunGradle(['r8lib'])
     r8lib = utils.R8LIB_JAR
-  elif len(args) == 1:
-    if args[0] == '--help':
-      print('Usage: test_self_retrace.py [<path-to-r8lib-jar>]')
-      print('If the path is missing the script builds and uses ' + utils.R8LIB_JAR)
-      return
-    else:
-      r8lib = args[0]
+    r8map = utils.R8LIB + '.map'
+  elif len(args) == 2:
+    r8lib = args[0]
+    r8map = args[1]
+  elif len(args) == 1 and args[0] == '--help':
+    print('Usage: test_self_retrace.py [<path-to-r8lib-jar> <path-to-r8lib-map]')
+    print('If the path is missing the script builds and uses ' + utils.R8LIB_JAR)
+    return
   else:
-    raise Exception("Only one argument is allowed, see '--help'.")
+    raise Exception("Only two argument allowed, see '--help'.")
 
   # Run 'r8 --help' which throws an exception.
   cmd = [
@@ -51,7 +54,7 @@
   assert('SelfRetraceTest' not in stacktrace)
 
   # Run the retrace tool.
-  cmd = [jdk.GetJavaExecutable(), '-jar', utils.RETRACE_JAR, r8lib + ".map"]
+  cmd = [jdk.GetJavaExecutable(), '-jar', utils.RETRACE_JAR, r8map]
   utils.PrintCmd(cmd)
   p = subprocess.Popen(cmd, stdin=subprocess.PIPE, stdout=subprocess.PIPE)
   retrace_stdout, _ = p.communicate(stacktrace)
