diff --git a/src/test/java/com/android/tools/r8/D8TestBuilder.java b/src/test/java/com/android/tools/r8/D8TestBuilder.java
index 21a5e0e..4897701 100644
--- a/src/test/java/com/android/tools/r8/D8TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/D8TestBuilder.java
@@ -5,19 +5,19 @@
 
 import com.android.tools.r8.D8Command.Builder;
 import com.android.tools.r8.TestBase.Backend;
+import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
 import java.nio.file.Path;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.function.Consumer;
+import java.util.function.Supplier;
 
-public class D8TestBuilder extends TestCompilerBuilder<D8Command, Builder, D8TestBuilder> {
+public class D8TestBuilder
+    extends TestCompilerBuilder<D8Command, Builder, D8TestCompileResult, D8TestBuilder> {
 
-  private final D8Command.Builder builder;
-
-  private D8TestBuilder(TestState state, D8Command.Builder builder) {
+  private D8TestBuilder(TestState state, Builder builder) {
     super(state, builder, Backend.DEX);
-    this.builder = builder;
   }
 
   public static D8TestBuilder create(TestState state) {
@@ -30,9 +30,11 @@
   }
 
   @Override
-  void internalCompile(Builder builder, Consumer<InternalOptions> optionsConsumer)
+  D8TestCompileResult internalCompile(
+      Builder builder, Consumer<InternalOptions> optionsConsumer, Supplier<AndroidApp> app)
       throws CompilationFailedException {
     ToolHelper.runD8(builder, optionsConsumer);
+    return new D8TestCompileResult(getState(), app.get());
   }
 
   public D8TestBuilder addClasspathClasses(Class<?>... classes) {
diff --git a/src/test/java/com/android/tools/r8/D8TestCompileResult.java b/src/test/java/com/android/tools/r8/D8TestCompileResult.java
new file mode 100644
index 0000000..482a611
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/D8TestCompileResult.java
@@ -0,0 +1,18 @@
+// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8;
+
+import com.android.tools.r8.TestBase.Backend;
+import com.android.tools.r8.utils.AndroidApp;
+
+public class D8TestCompileResult extends TestCompileResult {
+  D8TestCompileResult(TestState state, AndroidApp app) {
+    super(state, app);
+  }
+
+  @Override
+  public Backend getBackend() {
+    return Backend.DEX;
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/R8TestBuilder.java b/src/test/java/com/android/tools/r8/R8TestBuilder.java
index 74b40b0..3b01a71 100644
--- a/src/test/java/com/android/tools/r8/R8TestBuilder.java
+++ b/src/test/java/com/android/tools/r8/R8TestBuilder.java
@@ -6,6 +6,7 @@
 import com.android.tools.r8.R8Command.Builder;
 import com.android.tools.r8.TestBase.Backend;
 import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.StringUtils;
 import java.util.ArrayList;
@@ -13,14 +14,13 @@
 import java.util.Collection;
 import java.util.List;
 import java.util.function.Consumer;
+import java.util.function.Supplier;
 
-public class R8TestBuilder extends TestCompilerBuilder<R8Command, Builder, R8TestBuilder> {
-
-  private final R8Command.Builder builder;
+public class R8TestBuilder
+    extends TestCompilerBuilder<R8Command, Builder, R8TestCompileResult, R8TestBuilder> {
 
   private R8TestBuilder(TestState state, Builder builder, Backend backend) {
     super(state, builder, backend);
-    this.builder = builder;
   }
 
   public static R8TestBuilder create(TestState state, Backend backend) {
@@ -35,12 +35,16 @@
   }
 
   @Override
-  void internalCompile(Builder builder, Consumer<InternalOptions> optionsConsumer)
+  R8TestCompileResult internalCompile(
+      Builder builder, Consumer<InternalOptions> optionsConsumer, Supplier<AndroidApp> app)
       throws CompilationFailedException {
     if (enableInliningAnnotations) {
       ToolHelper.allowTestProguardOptions(builder);
     }
+    StringBuilder proguardMapBuilder = new StringBuilder();
+    builder.setProguardMapConsumer((string, ignore) -> proguardMapBuilder.append(string));
     ToolHelper.runR8WithoutResult(builder.build(), optionsConsumer);
+    return new R8TestCompileResult(getState(), backend, app.get(), proguardMapBuilder.toString());
   }
 
   public R8TestBuilder addDataResources(List<DataEntryResource> resources) {
diff --git a/src/test/java/com/android/tools/r8/R8TestCompileResult.java b/src/test/java/com/android/tools/r8/R8TestCompileResult.java
new file mode 100644
index 0000000..45fb31c
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/R8TestCompileResult.java
@@ -0,0 +1,32 @@
+// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+package com.android.tools.r8;
+
+import com.android.tools.r8.TestBase.Backend;
+import com.android.tools.r8.utils.AndroidApp;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import java.io.IOException;
+import java.util.concurrent.ExecutionException;
+
+public class R8TestCompileResult extends TestCompileResult {
+
+  private final Backend backend;
+  private final String proguardMap;
+
+  R8TestCompileResult(TestState state, Backend backend, AndroidApp app, String proguardMap) {
+    super(state, app);
+    this.backend = backend;
+    this.proguardMap = proguardMap;
+  }
+
+  @Override
+  public Backend getBackend() {
+    return backend;
+  }
+
+  @Override
+  public CodeInspector inspector() throws IOException, ExecutionException {
+    return new CodeInspector(app, proguardMap);
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/TestCompileResult.java b/src/test/java/com/android/tools/r8/TestCompileResult.java
index 4e7cf37..7505a83 100644
--- a/src/test/java/com/android/tools/r8/TestCompileResult.java
+++ b/src/test/java/com/android/tools/r8/TestCompileResult.java
@@ -12,19 +12,23 @@
 import java.nio.file.Path;
 import java.util.concurrent.ExecutionException;
 
-public class TestCompileResult {
-  private final TestState state;
-  private final Backend backend;
-  private final AndroidApp app;
+public abstract class TestCompileResult {
+  final TestState state;
+  final AndroidApp app;
 
-  public TestCompileResult(TestState state, Backend backend, AndroidApp app) {
+  TestCompileResult(TestState state, AndroidApp app) {
     this.state = state;
-    this.backend = backend;
     this.app = app;
   }
 
+  public abstract Backend getBackend();
+
+  public TestRunResult run(Class<?> mainClass) throws IOException {
+    return run(mainClass.getTypeName());
+  }
+
   public TestRunResult run(String mainClass) throws IOException {
-    switch (backend) {
+    switch (getBackend()) {
       case DEX:
         return runArt(mainClass);
       case CF:
@@ -34,6 +38,12 @@
     }
   }
 
+  public TestCompileResult writeToZip(Path file) throws IOException {
+    app.writeToZip(
+        file, getBackend() == Backend.DEX ? OutputMode.DexIndexed : OutputMode.ClassFile);
+    return this;
+  }
+
   public CodeInspector inspector() throws IOException, ExecutionException {
     return new CodeInspector(app);
   }
diff --git a/src/test/java/com/android/tools/r8/TestCompilerBuilder.java b/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
index db25352..4706125 100644
--- a/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
+++ b/src/test/java/com/android/tools/r8/TestCompilerBuilder.java
@@ -5,17 +5,21 @@
 
 import com.android.tools.r8.TestBase.Backend;
 import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.AndroidAppConsumers;
 import com.android.tools.r8.utils.InternalOptions;
+import com.google.common.base.Suppliers;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.util.Collection;
 import java.util.function.Consumer;
+import java.util.function.Supplier;
 
 public abstract class TestCompilerBuilder<
         C extends BaseCompilerCommand,
         B extends BaseCompilerCommand.Builder<C, B>,
-        T extends TestCompilerBuilder<C, B, T>>
+        R extends TestCompileResult,
+        T extends TestCompilerBuilder<C, B, R, T>>
     extends TestBuilder<T> {
 
   public static final Consumer<InternalOptions> DEFAULT_OPTIONS =
@@ -24,8 +28,8 @@
         public void accept(InternalOptions options) {}
       };
 
-  private final B builder;
-  private final Backend backend;
+  final B builder;
+  final Backend backend;
 
   // Default initialized setup. Can be overwritten if needed.
   private Path defaultLibrary;
@@ -43,7 +47,8 @@
 
   abstract T self();
 
-  abstract void internalCompile(B builder, Consumer<InternalOptions> optionsConsumer)
+  abstract R internalCompile(
+      B builder, Consumer<InternalOptions> optionsConsumer, Supplier<AndroidApp> app)
       throws CompilationFailedException;
 
   public T addOptionsModification(Consumer<InternalOptions> optionsConsumer) {
@@ -51,7 +56,7 @@
     return self();
   }
 
-  public TestCompileResult compile() throws CompilationFailedException {
+  public R compile() throws CompilationFailedException {
     AndroidAppConsumers sink = new AndroidAppConsumers();
     builder.setProgramConsumer(sink.wrapProgramConsumer(programConsumer));
     if (defaultLibrary != null) {
@@ -60,8 +65,7 @@
     if (backend == Backend.DEX && defaultMinApiLevel != null) {
       builder.setMinApiLevel(defaultMinApiLevel.getLevel());
     }
-    internalCompile(builder, optionsConsumer);
-    return new TestCompileResult(getState(), backend, sink.build());
+    return internalCompile(builder, optionsConsumer, Suppliers.memoize(sink::build));
   }
 
   @Override
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java b/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
index 28404f0..660156a 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
@@ -26,6 +26,7 @@
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.naming.signature.GenericSignatureAction;
 import com.android.tools.r8.naming.signature.GenericSignatureParser;
+import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.InternalOptions;
@@ -111,10 +112,18 @@
     return internalOptions;
   }
 
-  public CodeInspector(AndroidApp app, Path proguardMap) throws IOException, ExecutionException {
+  public CodeInspector(AndroidApp app, Path proguardMapFile)
+      throws IOException, ExecutionException {
     this(
         new ApplicationReader(app, runOptionsConsumer(null), new Timing("CodeInspector"))
-            .read(StringResource.fromFile(proguardMap)));
+            .read(StringResource.fromFile(proguardMapFile)));
+  }
+
+  public CodeInspector(AndroidApp app, String proguardMapContent)
+      throws IOException, ExecutionException {
+    this(
+        new ApplicationReader(app, runOptionsConsumer(null), new Timing("CodeInspector"))
+            .read(StringResource.fromString(proguardMapContent, Origin.unknown())));
   }
 
   public CodeInspector(DexApplication application) {
