diff --git a/.gitignore b/.gitignore
index cb3eaab..22b29da 100644
--- a/.gitignore
+++ b/.gitignore
@@ -19,6 +19,8 @@
 tools/*/art-7.0.0.tar.gz
 tools/*/art-8.1.0
 tools/*/art-8.1.0.tar.gz
+tools/*/art-9.0.0
+tools/*/art-9.0.0.tar.gz
 tools/*/dalvik
 tools/*/dalvik.tar.gz
 tools/*/dalvik-4.0.4
diff --git a/build.gradle b/build.gradle
index e50c0ce..b6e669f 100644
--- a/build.gradle
+++ b/build.gradle
@@ -297,6 +297,7 @@
                 "linux/art-6.0.1",
                 "linux/art-7.0.0",
                 "linux/art-8.1.0",
+                "linux/art-9.0.0",
                 "linux/dalvik",
                 "linux/dalvik-4.0.4",
                 "${osString}/dx",
@@ -309,8 +310,8 @@
             def outputDir = "${entry.key}/${entryFile}"
             def gzFile = "${outputDir}.tar.gz"
             def sha1File = "${gzFile}.sha1"
-            inputs.file sha1File
-            outputs.file gzFile
+            // Make the output file part of the input dependencies explictly.
+            inputs.files files(sha1File, gzFile)
             outputs.dir outputDir
             List<String> dlFromStorageArgs = ["-n", "-b", "r8-deps", "-u", "-s", "${sha1File}"]
             if (OperatingSystem.current().isWindows()) {
@@ -581,6 +582,55 @@
     }
 }
 
+def r8CfCommandLine(input, output, pgconf) {
+    return ["java", "-ea", "-jar", R8.outputs.files[0],
+        "--classfile", "--release",
+        input,
+        "--lib", "third_party/openjdk/openjdk-rt-1.8/rt.jar",
+        "--output", output,
+        "--pg-conf", pgconf]
+}
+
+task R8R8(type: Exec) {
+    def pgconf = "pgconfs/r8.cfg"
+    def output = "build/libs/r8-r8.jar"
+    inputs.files files(pgconf, "build/libs/r8.jar")
+    outputs.file output
+    dependsOn R8
+    commandLine r8CfCommandLine(R8.outputs.files[0], output, pgconf)
+    workingDir = projectDir
+}
+
+task D8R8(type: Exec) {
+    def pgconf = "pgconfs/d8.cfg"
+    def output = "build/libs/d8-r8.jar"
+    inputs.files files(pgconf, "build/libs/d8.jar")
+    outputs.file output
+    dependsOn D8
+    commandLine r8CfCommandLine(R8.outputs.files[0], output, pgconf)
+    workingDir = projectDir
+}
+
+task CompatDxR8(type: Exec) {
+    def pgconf = "pgconfs/compatdx.cfg"
+    def output = "build/libs/compatdx-r8.jar"
+    inputs.files files(pgconf, "build/libs/compatdx.jar")
+    outputs.file output
+    dependsOn CompatDx
+    commandLine r8CfCommandLine(R8.outputs.files[0], output, pgconf)
+    workingDir = projectDir
+}
+
+task CompatProguardR8(type: Exec) {
+    def pgconf = "pgconfs/compatproguard.cfg"
+    def output = "build/libs/compatproguard-r8.jar"
+    inputs.files files(pgconf, "build/libs/compatproguard.jar")
+    outputs.file output
+    dependsOn CompatProguard
+    commandLine r8CfCommandLine(R8.outputs.files[0], output, pgconf)
+    workingDir = projectDir
+}
+
 task sourceJar(type: Jar, dependsOn: classes) {
     classifier = 'src'
     from sourceSets.main.allSource
diff --git a/pgconfs/compatdx.cfg b/pgconfs/compatdx.cfg
new file mode 100644
index 0000000..51b401c
--- /dev/null
+++ b/pgconfs/compatdx.cfg
@@ -0,0 +1,5 @@
+# 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.
+
+-keep public class com.android.tools.r8.compatdx.CompatDx { public static void main(java.lang.String[]); }
diff --git a/pgconfs/compatproguard.cfg b/pgconfs/compatproguard.cfg
new file mode 100644
index 0000000..f508bea
--- /dev/null
+++ b/pgconfs/compatproguard.cfg
@@ -0,0 +1,5 @@
+# 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.
+
+-keep public class com.android.tools.r8.compatproguard.CompatProguard { public static void main(java.lang.String[]); }
diff --git a/pgconfs/d8.cfg b/pgconfs/d8.cfg
new file mode 100644
index 0000000..2d74e47
--- /dev/null
+++ b/pgconfs/d8.cfg
@@ -0,0 +1,6 @@
+# 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.
+
+-keep @com.android.tools.r8.Keep class * { public *; }
+-keep @com.android.tools.r8.KeepForSubclassing class * { public *; protected *; }
diff --git a/pgconfs/r8.cfg b/pgconfs/r8.cfg
new file mode 100644
index 0000000..d1ae99b
--- /dev/null
+++ b/pgconfs/r8.cfg
@@ -0,0 +1,7 @@
+# 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.
+
+-keep public class com.android.tools.r8.SwissArmyKnife { public static void main(java.lang.String[]); }
+-keep @com.android.tools.r8.Keep class * { public *; }
+-keep @com.android.tools.r8.KeepForSubclassing class * { public *; protected *; }
diff --git a/scripts/update-host-art.sh b/scripts/update-host-art.sh
index 8bfc753..fb45744 100755
--- a/scripts/update-host-art.sh
+++ b/scripts/update-host-art.sh
@@ -130,6 +130,23 @@
 mkdir -p $DEST/usr/icu
 cp -r $ANDROID_HOST_BUILD/usr/icu/* $DEST/usr/icu
 
+# Update links for vdex files for Android P and later.
+if [ -f $DEST/product/$ANDROID_PRODUCT/system/framework/boot.vdex ]; then
+  for VDEXFILE in $DEST/product/$ANDROID_PRODUCT/system/framework/*.vdex; do
+    VDEXNAME=$(basename ${VDEXFILE});
+    for ARCH in arm arm64; do
+      rm $DEST/product/$ANDROID_PRODUCT/system/framework/$ARCH/${VDEXNAME};
+      # This relative link command will create a symbolic link of the form
+      # ../${VDEXNAME} for each architecture.
+      # ln -r -s $DEST/product/$ANDROID_PRODUCT/system/framework/${VDEXNAME} $DEST/product/$ANDROID_PRODUCT/system/framework/$ARCH/${VDEXNAME};
+      # The Cloud Storage dependency tool (download_from_google_storage.py) does
+      # not allow synlinks at all, so instad of the ln in the comment above just
+      # copy the ${VDEXNAME} files.
+      cp $DEST/product/$ANDROID_PRODUCT/system/framework/${VDEXNAME} $DEST/product/$ANDROID_PRODUCT/system/framework/$ARCH/${VDEXNAME};
+    done
+  done
+fi
+
 # Allow failure for strip commands below.
 set +e
 
diff --git a/src/main/java/com/android/tools/r8/ApiLevelException.java b/src/main/java/com/android/tools/r8/ApiLevelException.java
index 6d110a4..0ad75c7 100644
--- a/src/main/java/com/android/tools/r8/ApiLevelException.java
+++ b/src/main/java/com/android/tools/r8/ApiLevelException.java
@@ -6,9 +6,7 @@
 import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.utils.AndroidApiLevel;
 
-/**
- * Exception to signal features that are not supported until a given API level.
- */
+/** Exception to signal features that are not supported until a given API level. */
 public class ApiLevelException extends CompilationError {
 
   public ApiLevelException(
diff --git a/src/main/java/com/android/tools/r8/DexIndexedConsumer.java b/src/main/java/com/android/tools/r8/DexIndexedConsumer.java
index e235e67..118df2e 100644
--- a/src/main/java/com/android/tools/r8/DexIndexedConsumer.java
+++ b/src/main/java/com/android/tools/r8/DexIndexedConsumer.java
@@ -160,7 +160,7 @@
     public void accept(
         int fileIndex, ByteDataView data, Set<String> descriptors, DiagnosticsHandler handler) {
       super.accept(fileIndex, data, descriptors, handler);
-      outputBuilder.addIndexedClassFile(fileIndex, getDexFileName(fileIndex), data, handler);
+      outputBuilder.addFile(getDexFileName(fileIndex), data, handler);
     }
 
     @Override
diff --git a/src/main/java/com/android/tools/r8/errors/CompilationError.java b/src/main/java/com/android/tools/r8/errors/CompilationError.java
index 1104b29..466bf8a 100644
--- a/src/main/java/com/android/tools/r8/errors/CompilationError.java
+++ b/src/main/java/com/android/tools/r8/errors/CompilationError.java
@@ -9,9 +9,9 @@
 
 /**
  * Exception to signal an compilation error.
- * <p>
- * This is always an expected error and considered a user input issue. A user-understandable message
- * must be provided.
+ *
+ * <p>This is always an expected error and considered a user input issue. A user-understandable
+ * message must be provided.
  */
 public class CompilationError extends RuntimeException implements Diagnostic {
 
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 35cc716..ade48f3 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
@@ -399,7 +399,11 @@
         continue;
       }
 
-      throw new Unreachable("Unexpected usage left after method inlining: " + user);
+      throw new Unreachable(
+          "Unexpected usage left in method `"
+              + method.method.toSourceString()
+              + "` after inlining: "
+              + user);
     }
 
     if (needToRemoveUnreachableBlocks) {
@@ -423,7 +427,11 @@
         continue;
       }
 
-      throw new Unreachable("Unexpected usage left after method inlining: " + user);
+      throw new Unreachable(
+          "Unexpected usage left in method `"
+              + method.method.toSourceString()
+              + "` after inlining: "
+              + user);
     }
   }
 
@@ -448,10 +456,18 @@
   private void removeFieldWrites() {
     for (Instruction user : eligibleInstance.uniqueUsers()) {
       if (!user.isInstancePut()) {
-        throw new Unreachable("Unexpected usage left after field reads removed: " + user);
+        throw new Unreachable(
+            "Unexpected usage left in method `"
+                + method.method.toSourceString()
+                + "` after field reads removed: "
+                + user);
       }
       if (user.asInstancePut().getField().clazz != eligibleClass) {
-        throw new Unreachable("Unexpected field write left after field reads removed: " + user);
+        throw new Unreachable(
+            "Unexpected field write left in method `"
+                + method.method.toSourceString()
+                + "` after field reads removed: "
+                + user);
       }
       removeInstruction(user);
     }
diff --git a/src/main/java/com/android/tools/r8/kotlin/NonNullParameterHintCollector.java b/src/main/java/com/android/tools/r8/kotlin/NonNullParameterHintCollector.java
index 21b9409..20621f9 100644
--- a/src/main/java/com/android/tools/r8/kotlin/NonNullParameterHintCollector.java
+++ b/src/main/java/com/android/tools/r8/kotlin/NonNullParameterHintCollector.java
@@ -69,8 +69,10 @@
       return new JvmFunctionExtensionVisitor() {
         @Override
         public void visit(JvmMethodSignature desc) {
-          name = desc.getName();
-          descriptor = desc.getDesc();
+          if (desc != null) {
+            name = desc.getName();
+            descriptor = desc.getDesc();
+          }
         }
       };
     }
diff --git a/src/main/java/com/android/tools/r8/utils/ArchiveBuilder.java b/src/main/java/com/android/tools/r8/utils/ArchiveBuilder.java
index 69d65ea..4111bed 100644
--- a/src/main/java/com/android/tools/r8/utils/ArchiveBuilder.java
+++ b/src/main/java/com/android/tools/r8/utils/ArchiveBuilder.java
@@ -17,10 +17,6 @@
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.StandardOpenOption;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.SortedSet;
-import java.util.TreeSet;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipException;
 import java.util.zip.ZipOutputStream;
@@ -31,9 +27,6 @@
   private ZipOutputStream stream = null;
   private boolean closed = false;
   private int openCount = 0;
-  private int classesFileIndex = 0;
-  private Map<Integer, DelayedData> delayedClassesDexFiles = new HashMap<>();
-  private SortedSet<DelayedData> delayedWrites = new TreeSet<>();
 
   public ArchiveBuilder(Path archive) {
     this.archive = archive;
@@ -51,7 +44,6 @@
     assert !closed;
     openCount--;
     if (openCount == 0) {
-      writeDelayed(handler);
       closed = true;
       try {
         getStreamRaw().close();
@@ -62,20 +54,6 @@
     }
   }
 
-  private void writeDelayed(DiagnosticsHandler handler) {
-    // We should never have any indexed files at this point
-    assert delayedClassesDexFiles.isEmpty();
-    for (DelayedData data : delayedWrites) {
-      if (data.isDirectory) {
-        assert data.content == null;
-        writeDirectoryNow(data.name, handler);
-      } else {
-        assert data.content != null;
-        writeFileNow(data.name, data.content, handler);
-      }
-    }
-  }
-
   private ZipOutputStream getStreamRaw() throws IOException {
     if (stream != null) {
       return stream;
@@ -107,11 +85,7 @@
   }
 
   @Override
-  public synchronized void addDirectory(String name, DiagnosticsHandler handler) {
-    delayedWrites.add(DelayedData.createDirectory(name));
-  }
-
-  private void writeDirectoryNow(String name, DiagnosticsHandler handler) {
+  public void addDirectory(String name, DiagnosticsHandler handler) {
     if (name.charAt(name.length() - 1) != DataResource.SEPARATOR) {
       name += DataResource.SEPARATOR;
     }
@@ -131,10 +105,7 @@
   @Override
   public void addFile(String name, DataEntryResource content, DiagnosticsHandler handler) {
     try (InputStream in = content.getByteStream()) {
-      ByteDataView view = ByteDataView.of(ByteStreams.toByteArray(in));
-      synchronized (this) {
-        delayedWrites.add(DelayedData.createFile(name, view));
-      }
+      addFile(name, ByteDataView.of(ByteStreams.toByteArray(in)), handler);
     } catch (IOException e) {
       handleIOException(e, handler);
     } catch (ResourceException e) {
@@ -145,10 +116,6 @@
 
   @Override
   public synchronized void addFile(String name, ByteDataView content, DiagnosticsHandler handler) {
-    delayedWrites.add(DelayedData.createFile(name,  ByteDataView.of(content.copyByteData())));
-  }
-
-  private void writeFileNow(String name, ByteDataView content, DiagnosticsHandler handler) {
     try {
       ZipUtils.writeToZipStream(getStream(handler), name, content, ZipEntry.STORED);
     } catch (IOException e) {
@@ -156,30 +123,6 @@
     }
   }
 
-  private void writeNextIfAvailable(DiagnosticsHandler handler) {
-    DelayedData data = delayedClassesDexFiles.remove(classesFileIndex);
-    while (data != null) {
-      writeFileNow(data.name, data.content, handler);
-      classesFileIndex++;
-      data = delayedClassesDexFiles.remove(classesFileIndex);
-    }
-  }
-
-  @Override
-  public synchronized void addIndexedClassFile(
-      int index, String name, ByteDataView content, DiagnosticsHandler handler) {
-    if (index == classesFileIndex) {
-      // Fast case, we got the file in order (or we only had one).
-      writeFileNow(name, content, handler);
-      classesFileIndex++;
-      writeNextIfAvailable(handler);
-    } else {
-      // Data is released in the application writer, take a copy.
-      delayedClassesDexFiles.put(index,
-          new DelayedData(name, ByteDataView.of(content.copyByteData()), false));
-    }
-  }
-
   @Override
   public Origin getOrigin() {
     return origin;
@@ -189,32 +132,4 @@
   public Path getPath() {
     return archive;
   }
-
-  private static class DelayedData implements Comparable<DelayedData> {
-    public final String name;
-    public final ByteDataView content;
-    public final boolean isDirectory;
-
-    public static DelayedData createFile(String name, ByteDataView content) {
-      return new DelayedData(name, content, false);
-    }
-
-    public static DelayedData createDirectory(String name) {
-      return new DelayedData(name, null, true);
-    }
-
-    private DelayedData(String name, ByteDataView content, boolean isDirectory) {
-      this.name = name;
-      this.content = content;
-      this.isDirectory = isDirectory;
-    }
-
-    @Override
-    public int compareTo(DelayedData other) {
-      if (other == null) {
-        return name.compareTo(null);
-      }
-      return name.compareTo(other.name);
-    }
-  }
 }
diff --git a/src/main/java/com/android/tools/r8/utils/DirectoryBuilder.java b/src/main/java/com/android/tools/r8/utils/DirectoryBuilder.java
index f78983f..8e0b054 100644
--- a/src/main/java/com/android/tools/r8/utils/DirectoryBuilder.java
+++ b/src/main/java/com/android/tools/r8/utils/DirectoryBuilder.java
@@ -68,12 +68,6 @@
   }
 
   @Override
-  public void addIndexedClassFile(
-      int index, String name, ByteDataView content, DiagnosticsHandler handler) {
-    addFile(name, content, handler);
-  }
-
-  @Override
   public Origin getOrigin() {
     return origin;
   }
diff --git a/src/main/java/com/android/tools/r8/utils/ExceptionDiagnostic.java b/src/main/java/com/android/tools/r8/utils/ExceptionDiagnostic.java
index 99149ff..3e4a44d 100644
--- a/src/main/java/com/android/tools/r8/utils/ExceptionDiagnostic.java
+++ b/src/main/java/com/android/tools/r8/utils/ExceptionDiagnostic.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.utils;
 
+import com.android.tools.r8.Keep;
 import com.android.tools.r8.ResourceException;
 import com.android.tools.r8.origin.Origin;
 import com.android.tools.r8.position.Position;
@@ -11,6 +12,7 @@
 import java.nio.file.FileAlreadyExistsException;
 import java.nio.file.NoSuchFileException;
 
+@Keep
 public class ExceptionDiagnostic extends DiagnosticWithThrowable {
 
   private final Origin origin;
diff --git a/src/main/java/com/android/tools/r8/utils/OutputBuilder.java b/src/main/java/com/android/tools/r8/utils/OutputBuilder.java
index be739e3..9077f7b 100644
--- a/src/main/java/com/android/tools/r8/utils/OutputBuilder.java
+++ b/src/main/java/com/android/tools/r8/utils/OutputBuilder.java
@@ -23,9 +23,6 @@
 
   void addFile(String name, ByteDataView content, DiagnosticsHandler handler);
 
-  void addIndexedClassFile(
-      int index, String name, ByteDataView content, DiagnosticsHandler handler);
-
   Path getPath();
 
   Origin getOrigin();
diff --git a/src/test/java/com/android/tools/r8/JctfTestSpecifications.java b/src/test/java/com/android/tools/r8/JctfTestSpecifications.java
index 2c2c5a6..cebfc53 100644
--- a/src/test/java/com/android/tools/r8/JctfTestSpecifications.java
+++ b/src/test/java/com/android/tools/r8/JctfTestSpecifications.java
@@ -40,7 +40,9 @@
           .put("math.BigInteger.ConstructorLjava_lang_String.BigInteger_Constructor_A02", any())
           .put(
               "lang.StringBuffer.insertILjava_lang_Object.StringBuffer_insert_A01",
-              match(runtimes(Runtime.ART_DEFAULT, Runtime.ART_V8_1_0, Runtime.JAVA)))
+              match(
+                  runtimes(
+                      Runtime.ART_DEFAULT, Runtime.ART_V9_0_0, Runtime.ART_V8_1_0, Runtime.JAVA)))
           .put("lang.StringBuffer.serialization.StringBuffer_serialization_A01", anyDexVm())
           .put(
               "lang.CloneNotSupportedException.serialization.CloneNotSupportedException_serialization_A01",
@@ -52,12 +54,20 @@
               "lang.StrictMath.roundF.StrictMath_round_A01",
               match(
                   runtimes(
-                      Runtime.ART_DEFAULT, Runtime.ART_V8_1_0, Runtime.ART_V7_0_0, Runtime.JAVA)))
+                      Runtime.ART_DEFAULT,
+                      Runtime.ART_V9_0_0,
+                      Runtime.ART_V8_1_0,
+                      Runtime.ART_V7_0_0,
+                      Runtime.JAVA)))
           .put(
               "lang.StrictMath.roundD.StrictMath_round_A01",
               match(
                   runtimes(
-                      Runtime.ART_DEFAULT, Runtime.ART_V8_1_0, Runtime.ART_V7_0_0, Runtime.JAVA)))
+                      Runtime.ART_DEFAULT,
+                      Runtime.ART_V9_0_0,
+                      Runtime.ART_V8_1_0,
+                      Runtime.ART_V7_0_0,
+                      Runtime.JAVA)))
           .put("lang.StrictMath.atan2DD.StrictMath_atan2_A01", any())
           .put("lang.Thread.stop.Thread_stop_A05", any())
           .put("lang.Thread.resume.Thread_resume_A02", anyDexVm())
@@ -70,6 +80,7 @@
               match(
                   runtimes(
                       Runtime.ART_DEFAULT,
+                      Runtime.ART_V9_0_0,
                       Runtime.ART_V8_1_0,
                       Runtime.ART_V7_0_0,
                       Runtime.ART_V6_0_1)))
@@ -199,7 +210,12 @@
               anyDexVm())
           .put(
               "lang.ClassLoader.defineClassLjava_lang_StringLjava_nio_ByteBufferLjava_security_ProtectionDomain.ClassLoader_defineClass_A07",
-              match(runtimes(Runtime.ART_DEFAULT, Runtime.ART_V8_1_0, Runtime.ART_V7_0_0)))
+              match(
+                  runtimes(
+                      Runtime.ART_DEFAULT,
+                      Runtime.ART_V9_0_0,
+                      Runtime.ART_V8_1_0,
+                      Runtime.ART_V7_0_0)))
           .put(
               "lang.ClassLoader.defineClassLjava_lang_StringLjava_nio_ByteBufferLjava_security_ProtectionDomain.ClassLoader_defineClass_A04",
               anyDexVm())
@@ -421,6 +437,7 @@
               match(
                   runtimes(
                       Runtime.ART_DEFAULT,
+                      Runtime.ART_V9_0_0,
                       Runtime.ART_V8_1_0,
                       Runtime.ART_V7_0_0,
                       Runtime.ART_V6_0_1,
@@ -431,6 +448,7 @@
               match(
                   runtimes(
                       Runtime.ART_DEFAULT,
+                      Runtime.ART_V9_0_0,
                       Runtime.ART_V8_1_0,
                       Runtime.ART_V7_0_0,
                       Runtime.ART_V6_0_1,
@@ -441,6 +459,7 @@
               match(
                   runtimes(
                       Runtime.ART_DEFAULT,
+                      Runtime.ART_V9_0_0,
                       Runtime.ART_V8_1_0,
                       Runtime.ART_V7_0_0,
                       Runtime.ART_V6_0_1,
@@ -451,6 +470,7 @@
               match(
                   runtimes(
                       Runtime.ART_DEFAULT,
+                      Runtime.ART_V9_0_0,
                       Runtime.ART_V8_1_0,
                       Runtime.ART_V7_0_0,
                       Runtime.ART_V6_0_1,
@@ -465,6 +485,7 @@
               match(
                   runtimes(
                       Runtime.ART_DEFAULT,
+                      Runtime.ART_V9_0_0,
                       Runtime.ART_V8_1_0,
                       Runtime.ART_V7_0_0,
                       Runtime.ART_V6_0_1,
@@ -475,6 +496,7 @@
               match(
                   runtimes(
                       Runtime.ART_DEFAULT,
+                      Runtime.ART_V9_0_0,
                       Runtime.ART_V8_1_0,
                       Runtime.ART_V7_0_0,
                       Runtime.ART_V6_0_1,
@@ -509,6 +531,7 @@
               match(
                   runtimes(
                       Runtime.ART_DEFAULT,
+                      Runtime.ART_V9_0_0,
                       Runtime.ART_V8_1_0,
                       Runtime.ART_V7_0_0,
                       Runtime.ART_V6_0_1,
@@ -520,6 +543,7 @@
               match(
                   runtimes(
                       Runtime.ART_DEFAULT,
+                      Runtime.ART_V9_0_0,
                       Runtime.ART_V8_1_0,
                       Runtime.ART_V7_0_0,
                       Runtime.ART_V6_0_1,
@@ -530,6 +554,7 @@
               match(
                   runtimes(
                       Runtime.ART_DEFAULT,
+                      Runtime.ART_V9_0_0,
                       Runtime.ART_V8_1_0,
                       Runtime.ART_V7_0_0,
                       Runtime.ART_V6_0_1,
@@ -540,6 +565,7 @@
               match(
                   runtimes(
                       Runtime.ART_DEFAULT,
+                      Runtime.ART_V9_0_0,
                       Runtime.ART_V8_1_0,
                       Runtime.ART_V7_0_0,
                       Runtime.ART_V6_0_1,
@@ -550,6 +576,7 @@
               match(
                   runtimes(
                       Runtime.ART_DEFAULT,
+                      Runtime.ART_V9_0_0,
                       Runtime.ART_V8_1_0,
                       Runtime.ART_V7_0_0,
                       Runtime.ART_V6_0_1,
@@ -560,6 +587,7 @@
               match(
                   runtimes(
                       Runtime.ART_DEFAULT,
+                      Runtime.ART_V9_0_0,
                       Runtime.ART_V8_1_0,
                       Runtime.ART_V7_0_0,
                       Runtime.ART_V6_0_1,
@@ -570,6 +598,7 @@
               match(
                   runtimes(
                       Runtime.ART_DEFAULT,
+                      Runtime.ART_V9_0_0,
                       Runtime.ART_V8_1_0,
                       Runtime.ART_V7_0_0,
                       Runtime.ART_V6_0_1,
@@ -580,6 +609,7 @@
               match(
                   runtimes(
                       Runtime.ART_DEFAULT,
+                      Runtime.ART_V9_0_0,
                       Runtime.ART_V8_1_0,
                       Runtime.ART_V7_0_0,
                       Runtime.ART_V6_0_1,
@@ -590,6 +620,7 @@
               match(
                   runtimes(
                       Runtime.ART_DEFAULT,
+                      Runtime.ART_V9_0_0,
                       Runtime.ART_V8_1_0,
                       Runtime.ART_V7_0_0,
                       Runtime.ART_V6_0_1,
@@ -619,6 +650,7 @@
               match(
                   runtimes(
                       Runtime.ART_DEFAULT,
+                      Runtime.ART_V9_0_0,
                       Runtime.ART_V8_1_0,
                       Runtime.ART_V7_0_0,
                       Runtime.ART_V6_0_1,
@@ -630,7 +662,7 @@
           .put("lang.ref.WeakReference.get.WeakReference_get_A01", any())
           .put(
               "lang.StackTraceElement.toString.StackTraceElement_toString_A01",
-              match(runtimes(Runtime.ART_DEFAULT, Runtime.ART_V8_1_0)))
+              match(runtimes(Runtime.ART_DEFAULT, Runtime.ART_V9_0_0, Runtime.ART_V8_1_0)))
           .put(
               "lang.NullPointerException.serialization.NullPointerException_serialization_A01",
               anyDexVm())
@@ -686,7 +718,9 @@
               match(artRuntimesFromAndJava(Runtime.ART_V5_1_1)))
           .put(
               "lang.annotation.IncompleteAnnotationException.ConstructorLjava_lang_ClassLjava_lang_String.IncompleteAnnotationException_Constructor_A01",
-              match(runtimes(Runtime.ART_DEFAULT, Runtime.ART_V8_1_0, Runtime.JAVA)))
+              match(
+                  runtimes(
+                      Runtime.ART_DEFAULT, Runtime.ART_V9_0_0, Runtime.ART_V8_1_0, Runtime.JAVA)))
           .put(
               "lang.InterruptedException.serialization.InterruptedException_serialization_A01",
               anyDexVm())
@@ -774,6 +808,7 @@
               match(
                   runtimes(
                       Runtime.ART_DEFAULT,
+                      Runtime.ART_V9_0_0,
                       Runtime.ART_V8_1_0,
                       Runtime.ART_V7_0_0,
                       Runtime.ART_V4_4_4,
@@ -814,6 +849,7 @@
               match(
                   runtimes(
                       Runtime.ART_DEFAULT,
+                      Runtime.ART_V9_0_0,
                       Runtime.ART_V8_1_0,
                       Runtime.ART_V7_0_0,
                       Runtime.ART_V4_4_4,
@@ -1167,7 +1203,9 @@
               anyDexVm())
           .put(
               "lang.reflect.Proxy.h.Proxy_h_A01",
-              match(runtimes(Runtime.ART_DEFAULT, Runtime.ART_V8_1_0, Runtime.JAVA)))
+              match(
+                  runtimes(
+                      Runtime.ART_DEFAULT, Runtime.ART_V9_0_0, Runtime.ART_V8_1_0, Runtime.JAVA)))
           .put("lang.reflect.Proxy.serialization.Proxy_serialization_A02", any())
           .put(
               "lang.reflect.GenericSignatureFormatError.serialization.GenericSignatureFormatError_serialization_A01",
@@ -1177,7 +1215,9 @@
               anyDexVm())
           .put(
               "lang.reflect.Proxy.ConstructorLjava_lang_reflect_InvocationHandler.Proxy_Constructor_A01",
-              match(runtimes(Runtime.ART_DEFAULT, Runtime.ART_V8_1_0, Runtime.JAVA)))
+              match(
+                  runtimes(
+                      Runtime.ART_DEFAULT, Runtime.ART_V9_0_0, Runtime.ART_V8_1_0, Runtime.JAVA)))
           .put(
               "lang.reflect.Proxy.newProxyInstanceLjava_lang_ClassLoader_Ljava_lang_ClassLjava_lang_reflect_InvocationHandler.Proxy_newProxyInstance_A01",
               anyDexVm())
@@ -1694,14 +1734,20 @@
               match(artRuntimesUpTo(Runtime.ART_V4_4_4)))
           .put(
               "lang.ref.PhantomReference.isEnqueued.PhantomReference_isEnqueued_A01",
-              match(and(runtimes(Runtime.ART_V8_1_0), artRuntimesUpTo(Runtime.ART_V4_4_4))))
+              match(
+                  and(
+                      runtimes(Runtime.ART_V9_0_0, Runtime.ART_V8_1_0),
+                      artRuntimesUpTo(Runtime.ART_V4_4_4))))
           .put("lang.ref.WeakReference.isEnqueued.WeakReference_isEnqueued_A01", anyDexVm())
           .put(
               "lang.ref.WeakReference.enqueue.WeakReference_enqueue_A01",
               match(artRuntimesUpTo(Runtime.ART_V4_4_4)))
           .put(
               "lang.ref.SoftReference.isEnqueued.SoftReference_isEnqueued_A01",
-              match(and(runtimes(Runtime.ART_V8_1_0), artRuntimesUpTo(Runtime.ART_V4_4_4))))
+              match(
+                  and(
+                      runtimes(Runtime.ART_V9_0_0, Runtime.ART_V8_1_0),
+                      artRuntimesUpTo(Runtime.ART_V4_4_4))))
           .put(
               "lang.ref.SoftReference.enqueue.SoftReference_enqueue_A01",
               match(artRuntimesUpTo(Runtime.ART_V4_4_4)))
@@ -1712,7 +1758,6 @@
           .put(
               "util.concurrent.AbstractExecutorService.invokeAllLjava_util_CollectionJLjava_util_concurrent_TimeUnit.AbstractExecutorService_invokeAll_A06",
               match(runtimes(Runtime.ART_V4_0_4)))
-
           .build(); // end of flakyWhenRun
 
   public static final Multimap<String, TestCondition> timeoutsWhenRun =
diff --git a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
index 5123c51..2a4977d 100644
--- a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
@@ -97,7 +97,8 @@
       DexVm.Version.V5_1_1,
       DexVm.Version.V6_0_1,
       DexVm.Version.V7_0_0,
-      DexVm.Version.V8_1_0);
+      DexVm.Version.V8_1_0,
+      DexVm.Version.V9_0_0);
 
   // Input jar for jctf tests.
   private static final String JCTF_COMMON_JAR = "build/libs/jctfCommon.jar";
@@ -463,6 +464,16 @@
   static {
     ImmutableMap.Builder<DexVm.Version, List<String>> builder = ImmutableMap.builder();
     builder
+        .put(DexVm.Version.V9_0_0, ImmutableList.of(
+            // TODO(120400625): Triage.
+            "454-get-vreg",
+            // TODO(120402198): Triage.
+            "457-regs",
+            // TODO(120401674): Triage.
+            "543-env-long-ref",
+            // TODO(120261858) Triage.
+            "518-null-array-get"
+        ))
         .put(DexVm.Version.V8_1_0, ImmutableList.of(
             // TODO(119938529): Triage.
             "709-checker-varhandles",
diff --git a/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
index 101fbb8..1c949a4 100644
--- a/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
@@ -69,6 +69,10 @@
           .put(
               Version.V7_0_0,
               ImmutableList.of("invokecustom-with-shrinking", "invokecustom2-with-shrinking"))
+          .put(
+              Version.V9_0_0,
+              // TODO(120402963) Triage.
+              ImmutableList.of("invokecustom-with-shrinking", "invokecustom2-with-shrinking"))
           .put(Version.DEFAULT, ImmutableList.of())
           .build();
 
diff --git a/src/test/java/com/android/tools/r8/R8RunExamplesTest.java b/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
index 221d427..793df27 100644
--- a/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunExamplesTest.java
@@ -208,6 +208,9 @@
         // Early art versions incorrectly print doubles.
         .put("regress_72361252.Test",
             TestCondition.match(TestCondition.runtimesUpTo(Version.V6_0_1)))
+        // TODO(120402200): Triage.
+        .put("regress_62300145.Regress",
+            TestCondition.match(TestCondition.runtimesUpTo(Version.V9_0_0)))
         .build();
   }
 
diff --git a/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java
index 68aec3f..a7b7230 100644
--- a/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java
@@ -269,6 +269,12 @@
                 "testMissingSuperDesugaredAndroidO"
             ))
         .put(
+            DexVm.Version.V9_0_0, ImmutableList.of(
+                // TODO(120402963): Triage.
+                "invokecustom",
+                "invokecustom2"
+            ))
+        .put(
             DexVm.Version.DEFAULT, ImmutableList.of()
         );
     failsOn = builder.build();
@@ -577,9 +583,6 @@
       String qualifiedMainClass, Path[] jars, Path[] dexes, List<String> args) throws IOException {
 
     boolean expectedToFail = expectedToFail(testName);
-    if (expectedToFail && !ToolHelper.compareAgaintsGoldenFiles()) {
-      thrown.expect(Throwable.class);
-    }
     String output = ToolHelper.runArtNoVerificationErrors(
         Arrays.stream(dexes).map(path -> path.toString()).collect(Collectors.toList()),
         qualifiedMainClass,
@@ -588,18 +591,22 @@
             builder.appendProgramArgument(arg);
           }
         });
-    if (!expectedToFail && !skipRunningOnJvm(testName) && !ToolHelper.compareAgaintsGoldenFiles()) {
-      ArrayList<String> javaArgs = Lists.newArrayList(args);
-      javaArgs.add(0, qualifiedMainClass);
-      ToolHelper.ProcessResult javaResult =
-          ToolHelper.runJava(ImmutableList.copyOf(jars), javaArgs.toArray(new String[0]));
-      assertEquals("JVM run failed", javaResult.exitCode, 0);
-      assertTrue(
-          "JVM output does not match art output.\n\tjvm: "
-              + javaResult.stdout
-              + "\n\tart: "
-              + output,
-          output.replace("\r", "").equals(javaResult.stdout.replace("\r", "")));
+    try {
+      if (!skipRunningOnJvm(testName) && !ToolHelper.compareAgaintsGoldenFiles()) {
+        ArrayList<String> javaArgs = Lists.newArrayList(args);
+        javaArgs.add(0, qualifiedMainClass);
+        ToolHelper.ProcessResult javaResult =
+            ToolHelper.runJava(ImmutableList.copyOf(jars), javaArgs.toArray(new String[0]));
+        assertEquals("JVM run failed", javaResult.exitCode, 0);
+        assertTrue(
+            "JVM output does not match art output.\n\tjvm: "
+                + javaResult.stdout
+                + "\n\tart: "
+                + output,
+            output.replace("\r", "").equals(javaResult.stdout.replace("\r", "")));
+      }
+    } catch (Throwable t) {
+      assert expectedToFail;
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/RunExamplesAndroidPTest.java b/src/test/java/com/android/tools/r8/RunExamplesAndroidPTest.java
index e0981c4..2ab5e3e 100644
--- a/src/test/java/com/android/tools/r8/RunExamplesAndroidPTest.java
+++ b/src/test/java/com/android/tools/r8/RunExamplesAndroidPTest.java
@@ -186,7 +186,9 @@
           .put(DexVm.Version.V6_0_1, ImmutableList.of("invokecustom"))
           // Dex version not supported
           .put(DexVm.Version.V7_0_0, ImmutableList.of("invokecustom"))
+          // Dex version not supported
           .put(DexVm.Version.V8_1_0, ImmutableList.of("invokecustom"))
+          // Dex version not supported
           .put(DexVm.Version.DEFAULT, ImmutableList.of())
           .build();
 
diff --git a/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java b/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
index 8a284ac..9c91282 100644
--- a/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
+++ b/src/test/java/com/android/tools/r8/RunExamplesJava9Test.java
@@ -231,7 +231,9 @@
               + "1: d>i>s>i>a\n"
               + "2: l>i>s>i>a\n"
               + "3: x>s\n"
-              + "4: c>d>i>s>i>a\n"
+              + "4: c>d>i>s>i>a\n",
+          "varhandle",
+          "true\nfalse\n"
       );
 
   @Rule
diff --git a/src/test/java/com/android/tools/r8/TestCondition.java b/src/test/java/com/android/tools/r8/TestCondition.java
index 439b9e9..52d7f93 100644
--- a/src/test/java/com/android/tools/r8/TestCondition.java
+++ b/src/test/java/com/android/tools/r8/TestCondition.java
@@ -23,6 +23,7 @@
     ART_V6_0_1,
     ART_V7_0_0,
     ART_V8_1_0,
+    ART_V9_0_0,
     ART_DEFAULT,
     JAVA;
 
@@ -43,6 +44,8 @@
           return ART_V7_0_0;
         case V8_1_0:
           return ART_V8_1_0;
+        case V9_0_0:
+          return ART_V9_0_0;
         case DEFAULT:
           return ART_DEFAULT;
         default:
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index caeebd9..f73f198 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -126,6 +126,8 @@
     ART_7_0_0_HOST(Version.V7_0_0, Kind.HOST),
     ART_8_1_0_TARGET(Version.V8_1_0, Kind.TARGET),
     ART_8_1_0_HOST(Version.V8_1_0, Kind.HOST),
+    ART_9_0_0_TARGET(Version.V9_0_0, Kind.TARGET),
+    ART_9_0_0_HOST(Version.V9_0_0, Kind.HOST),
     ART_DEFAULT(Version.DEFAULT, Kind.HOST);
 
     private static final ImmutableMap<String, DexVm> SHORT_NAME_MAP =
@@ -140,6 +142,7 @@
       V6_0_1("6.0.1"),
       V7_0_0("7.0.0"),
       V8_1_0("8.1.0"),
+      V9_0_0("9.0.0"),
       DEFAULT("default");
 
       Version(String shortName) {
@@ -416,6 +419,7 @@
   private static final Map<DexVm, String> ART_DIRS =
       ImmutableMap.<DexVm, String>builder()
           .put(DexVm.ART_DEFAULT, "art")
+          .put(DexVm.ART_9_0_0_HOST, "art-9.0.0")
           .put(DexVm.ART_8_1_0_HOST, "art-8.1.0")
           .put(DexVm.ART_7_0_0_HOST, "art-7.0.0")
           .put(DexVm.ART_6_0_1_HOST, "art-6.0.1")
@@ -425,6 +429,7 @@
   private static final Map<DexVm, String> ART_BINARY_VERSIONS =
       ImmutableMap.<DexVm, String>builder()
           .put(DexVm.ART_DEFAULT, "bin/art")
+          .put(DexVm.ART_9_0_0_HOST, "bin/art")
           .put(DexVm.ART_8_1_0_HOST, "bin/art")
           .put(DexVm.ART_7_0_0_HOST, "bin/art")
           .put(DexVm.ART_6_0_1_HOST, "bin/art")
@@ -435,6 +440,7 @@
   private static final Map<DexVm, String> ART_BINARY_VERSIONS_X64 =
       ImmutableMap.of(
           DexVm.ART_DEFAULT, "bin/art",
+          DexVm.ART_9_0_0_HOST, "bin/art",
           DexVm.ART_8_1_0_HOST, "bin/art",
           DexVm.ART_7_0_0_HOST, "bin/art",
           DexVm.ART_6_0_1_HOST, "bin/art");
@@ -457,6 +463,7 @@
     ImmutableMap.Builder<DexVm, List<String>> builder = ImmutableMap.builder();
     builder
         .put(DexVm.ART_DEFAULT, ART_BOOT_LIBS)
+        .put(DexVm.ART_9_0_0_HOST, ART_BOOT_LIBS)
         .put(DexVm.ART_8_1_0_HOST, ART_BOOT_LIBS)
         .put(DexVm.ART_7_0_0_HOST, ART_BOOT_LIBS)
         .put(DexVm.ART_6_0_1_HOST, ART_BOOT_LIBS)
@@ -472,6 +479,7 @@
     ImmutableMap.Builder<DexVm, String> builder = ImmutableMap.builder();
     builder
         .put(DexVm.ART_DEFAULT, "angler")
+        .put(DexVm.ART_9_0_0_HOST, "marlin")
         .put(DexVm.ART_8_1_0_HOST, "marlin")
         .put(DexVm.ART_7_0_0_HOST, "angler")
         .put(DexVm.ART_6_0_1_HOST, "angler")
@@ -721,6 +729,8 @@
     switch (dexVm.version) {
       case DEFAULT:
         return AndroidApiLevel.O;
+      case V9_0_0:
+        return AndroidApiLevel.P;
       case V8_1_0:
         return AndroidApiLevel.O;
       case V7_0_0:
diff --git a/src/test/java/com/android/tools/r8/debug/DebugTestBase.java b/src/test/java/com/android/tools/r8/debug/DebugTestBase.java
index a7b2b223..e6a1fcd 100644
--- a/src/test/java/com/android/tools/r8/debug/DebugTestBase.java
+++ b/src/test/java/com/android/tools/r8/debug/DebugTestBase.java
@@ -1019,6 +1019,10 @@
               artCommandBuilder.appendArtOption("-Xcompiler-option");
               artCommandBuilder.appendArtOption("--debuggable");
             }
+            if (ToolHelper.getDexVm().getVersion().isAtLeast(DexVm.Version.V9_0_0) &&
+                ToolHelper.getDexVm().getVersion() != DexVm.Version.DEFAULT) {
+              artCommandBuilder.appendArtOption("-XjdwpProvider:internal");
+            }
             if (DEBUG_TESTS && ToolHelper.getDexVm().getVersion().isNewerThan(Version.V4_4_4)) {
               artCommandBuilder.appendArtOption("-verbose:jdwp");
             }
diff --git a/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java b/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java
index af238f2..e26ec3d 100644
--- a/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java
+++ b/src/test/java/com/android/tools/r8/internal/CompilationTestBase.java
@@ -19,7 +19,6 @@
 import com.android.tools.r8.R8RunArtTestsTest.CompilerUnderTest;
 import com.android.tools.r8.ResourceException;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.dex.ApplicationWriter;
 import com.android.tools.r8.naming.MemberNaming.FieldSignature;
 import com.android.tools.r8.naming.MemberNaming.MethodSignature;
 import com.android.tools.r8.utils.AndroidApiLevel;
@@ -29,7 +28,9 @@
 import com.android.tools.r8.utils.ArtErrorParser.ArtErrorInfo;
 import com.android.tools.r8.utils.ArtErrorParser.ArtErrorParserException;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.KeepingDiagnosticHandler;
 import com.android.tools.r8.utils.ListUtils;
+import com.android.tools.r8.utils.Reporter;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
 import com.android.tools.r8.utils.codeinspector.FoundClassSubject;
 import com.android.tools.r8.utils.codeinspector.FoundFieldSubject;
@@ -42,27 +43,32 @@
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.Collections;
-import java.util.Enumeration;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.concurrent.ExecutionException;
 import java.util.function.BiConsumer;
 import java.util.function.Consumer;
-import java.util.function.Supplier;
 import java.util.stream.Collectors;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-import org.junit.Assert;
+import org.junit.Before;
 import org.junit.ComparisonFailure;
 import org.junit.Rule;
 import org.junit.rules.TemporaryFolder;
 
 public abstract class CompilationTestBase {
 
+  protected KeepingDiagnosticHandler handler;
+  protected Reporter reporter;
+
   @Rule
   public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
 
+  @Before
+  public void reset() {
+    handler = new KeepingDiagnosticHandler();
+    reporter = new Reporter(handler);
+  }
+
   public AndroidApp runAndCheckVerification(
       CompilerUnderTest compiler,
       CompilationMode mode,
@@ -83,22 +89,6 @@
     return result;
   }
 
-  public void assertIdenticalZipFiles(File file1, File file2) throws IOException {
-    try (ZipFile zipFile1 = new ZipFile(file1); ZipFile zipFile2 = new ZipFile(file2)) {
-      final Enumeration<? extends ZipEntry> entries1 = zipFile1.entries();
-      final Enumeration<? extends ZipEntry> entries2 = zipFile2.entries();
-
-      while (entries1.hasMoreElements()) {
-        Assert.assertTrue(entries2.hasMoreElements());
-        ZipEntry entry1 = entries1.nextElement();
-        ZipEntry entry2 = entries2.nextElement();
-        Assert.assertEquals(entry1.getName(), entry2.getName());
-        Assert.assertEquals(entry1.getCrc(), entry2.getCrc());
-        Assert.assertEquals(entry1.getSize(), entry2.getSize());
-      }
-    }
-  }
-
   public AndroidApp runAndCheckVerification(
       CompilerUnderTest compiler,
       CompilationMode mode,
@@ -107,30 +97,17 @@
       Consumer<InternalOptions> optionsConsumer,
       List<String> inputs)
       throws ExecutionException, IOException, CompilationFailedException {
-    return runAndCheckVerification(compiler, mode, referenceApk, pgConfs, optionsConsumer,
-        DexIndexedConsumer::emptyConsumer, inputs);
-  }
-
-  public AndroidApp runAndCheckVerification(
-      CompilerUnderTest compiler,
-      CompilationMode mode,
-      String referenceApk,
-      List<String> pgConfs,
-      Consumer<InternalOptions> optionsConsumer,
-      Supplier<DexIndexedConsumer> dexIndexedConsumerSupplier,
-      List<String> inputs)
-      throws ExecutionException, IOException, CompilationFailedException {
     assertTrue(referenceApk == null || new File(referenceApk).exists());
     AndroidAppConsumers outputApp;
     if (compiler == CompilerUnderTest.R8) {
-      R8Command.Builder builder = R8Command.builder();
+      R8Command.Builder builder = R8Command.builder(reporter);
       builder.addProgramFiles(ListUtils.map(inputs, Paths::get));
       if (pgConfs != null) {
         builder.addProguardConfigurationFiles(
             pgConfs.stream().map(Paths::get).collect(Collectors.toList()));
       }
       builder.setMode(mode);
-      builder.setProgramConsumer(dexIndexedConsumerSupplier.get());
+      builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
       builder.setMinApiLevel(AndroidApiLevel.L.getLevel());
       ToolHelper.allowPartiallyImplementedProguardOptions(builder);
       ToolHelper.addProguardConfigurationConsumer(
@@ -154,7 +131,6 @@
     return checkVerification(outputApp.build(), referenceApk);
   }
 
-
   public AndroidApp checkVerification(AndroidApp outputApp, String referenceApk)
       throws IOException, ExecutionException {
     Path out = temp.getRoot().toPath().resolve("all.zip");
diff --git a/src/test/java/com/android/tools/r8/internal/GMSCoreDeployJarVerificationTest.java b/src/test/java/com/android/tools/r8/internal/GMSCoreDeployJarVerificationTest.java
index 634ff6f..09ce657 100644
--- a/src/test/java/com/android/tools/r8/internal/GMSCoreDeployJarVerificationTest.java
+++ b/src/test/java/com/android/tools/r8/internal/GMSCoreDeployJarVerificationTest.java
@@ -5,7 +5,6 @@
 
 import com.android.tools.r8.CompilationFailedException;
 import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.DexIndexedConsumer;
 import com.android.tools.r8.R8RunArtTestsTest.CompilerUnderTest;
 import com.android.tools.r8.shaking.ProguardRuleParserException;
 import com.android.tools.r8.utils.AndroidApp;
@@ -14,7 +13,6 @@
 import java.util.Collections;
 import java.util.concurrent.ExecutionException;
 import java.util.function.Consumer;
-import java.util.function.Supplier;
 
 public class GMSCoreDeployJarVerificationTest extends GMSCoreCompilationTestBase {
 
@@ -40,20 +38,4 @@
         optionsConsumer,
         Collections.singletonList(base + DEPLOY_JAR));
   }
-
-  public AndroidApp buildFromDeployJar(
-      CompilerUnderTest compiler, CompilationMode mode, String base, boolean hasReference,
-      Consumer<InternalOptions> optionsConsumer, Supplier<DexIndexedConsumer> consumerSupplier)
-      throws ExecutionException, IOException, ProguardRuleParserException,
-      CompilationFailedException {
-    return runAndCheckVerification(
-        compiler,
-        mode,
-        hasReference ? base + REFERENCE_APK : null,
-        null,
-        optionsConsumer,
-        consumerSupplier,
-        Collections.singletonList(base + DEPLOY_JAR));
-  }
-
 }
diff --git a/src/test/java/com/android/tools/r8/internal/NestTreeShakeJarVerificationTest.java b/src/test/java/com/android/tools/r8/internal/NestTreeShakeJarVerificationTest.java
index e90c504..6514635 100644
--- a/src/test/java/com/android/tools/r8/internal/NestTreeShakeJarVerificationTest.java
+++ b/src/test/java/com/android/tools/r8/internal/NestTreeShakeJarVerificationTest.java
@@ -4,10 +4,15 @@
 
 package com.android.tools.r8.internal;
 
+import static org.junit.Assert.assertEquals;
+
 import com.android.tools.r8.CompilationMode;
+import com.android.tools.r8.Diagnostic;
 import com.android.tools.r8.R8RunArtTestsTest.CompilerUnderTest;
 import com.android.tools.r8.utils.AndroidApp;
 import com.google.common.collect.ImmutableList;
+import java.util.List;
+import java.util.stream.Stream;
 import org.junit.Test;
 
 public class NestTreeShakeJarVerificationTest extends NestCompilationBase {
@@ -22,5 +27,13 @@
             ImmutableList.of(BASE + PG_CONF, BASE + PG_CONF_NO_OPT),
             options -> options.testing.allowTypeErrors = true,
             ImmutableList.of(BASE + DEPLOY_JAR));
+    assertEquals(0, filterKotlinMetadata(handler.warnings).count());
+    assertEquals(0, filterKotlinMetadata(handler.infos).count());
+  }
+
+  private Stream<Diagnostic> filterKotlinMetadata(List<Diagnostic> warnings) {
+    return warnings.stream().filter(diagnostic -> {
+      return diagnostic.getDiagnosticMessage().contains("kotlin.Metadata");
+    });
   }
 }
diff --git a/src/test/java/com/android/tools/r8/internal/R8GMSCoreV10DeployJarVerificationTest.java b/src/test/java/com/android/tools/r8/internal/R8GMSCoreV10DeployJarVerificationTest.java
index 5803355..d881185 100644
--- a/src/test/java/com/android/tools/r8/internal/R8GMSCoreV10DeployJarVerificationTest.java
+++ b/src/test/java/com/android/tools/r8/internal/R8GMSCoreV10DeployJarVerificationTest.java
@@ -7,12 +7,8 @@
 import static org.junit.Assert.assertEquals;
 
 import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.DexIndexedConsumer;
-import com.android.tools.r8.DexIndexedConsumer.ArchiveConsumer;
 import com.android.tools.r8.R8RunArtTestsTest.CompilerUnderTest;
 import com.android.tools.r8.utils.AndroidApp;
-import java.io.File;
-import java.util.function.Supplier;
 import org.junit.Test;
 
 public class R8GMSCoreV10DeployJarVerificationTest extends GMSCoreDeployJarVerificationTest {
@@ -23,9 +19,6 @@
   @Test
   public void buildFromDeployJar() throws Exception {
     // TODO(tamaskenez): set hasReference = true when we have the noshrink file for V10
-    File tempFolder = temp.newFolder();
-    File app1Zip = new File(tempFolder, "app1.zip");
-    File app2Zip = new File(tempFolder, "app2.zip");
     AndroidApp app1 =
         buildFromDeployJar(
             CompilerUnderTest.R8,
@@ -34,8 +27,7 @@
             false,
             options ->
                 options.proguardMapConsumer =
-                    (proguardMap, handler) -> this.proguardMap1 = proguardMap,
-            ()-> new ArchiveConsumer(app1Zip.toPath(), true));
+                    (proguardMap, handler) -> this.proguardMap1 = proguardMap);
     AndroidApp app2 =
         buildFromDeployJar(
             CompilerUnderTest.R8,
@@ -44,14 +36,10 @@
             false,
             options ->
                 options.proguardMapConsumer =
-                    (proguardMap, handler) -> this.proguardMap2 = proguardMap,
-            ()-> new ArchiveConsumer(app2Zip.toPath(), true));
-
-
+                    (proguardMap, handler) -> this.proguardMap2 = proguardMap);
 
     // Verify that the result of the two compilations was the same.
     assertIdenticalApplications(app1, app2);
-    assertIdenticalZipFiles(app1Zip, app2Zip);
     assertEquals(proguardMap1, proguardMap2);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexTracingTest.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexTracingTest.java
index e013b02..ddb0e7d 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexTracingTest.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexTracingTest.java
@@ -20,21 +20,15 @@
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.StringUtils;
 import java.io.ByteArrayOutputStream;
-import java.io.IOException;
 import java.io.PrintStream;
 import java.nio.charset.Charset;
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.util.Arrays;
-import java.util.Enumeration;
-import java.util.LinkedList;
 import java.util.List;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
 import org.junit.Assert;
 import org.junit.Test;
 
@@ -307,34 +301,6 @@
         nonLambdaOffset++;
       }
     }
-    testZipfileOrder(out);
-  }
-
-  private void testZipfileOrder(Path out) throws IOException {
-    // Sanity check that the classes.dex files are in the correct order
-    ZipFile outZip = new ZipFile(out.toFile());
-    Enumeration<? extends ZipEntry> entries = outZip.entries();
-    int index = 0;
-    LinkedList<String> entryNames = new LinkedList<>();
-    // We expect classes*.dex files first, in order, then the rest of the files, in order.
-    while(entries.hasMoreElements()) {
-      ZipEntry entry = entries.nextElement();
-      if (!entry.getName().startsWith("classes") || !entry.getName().endsWith(".dex")) {
-        entryNames.add(entry.getName());
-        continue;
-      }
-      if (index == 0) {
-        Assert.assertEquals("classes.dex", entry.getName());
-      } else {
-        Assert.assertEquals("classes" + (index + 1) + ".dex", entry.getName());
-      }
-      index++;
-    }
-    // Everything else should be sorted according to name.
-    String[] entriesUnsorted = entryNames.toArray(new String[0]);
-    String[] entriesSorted = entryNames.toArray(new String[0]);
-    Arrays.sort(entriesSorted);
-    Assert.assertArrayEquals(entriesUnsorted, entriesSorted);
   }
 
   private boolean isLambda(String mainDexEntry) {
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/InliningRetraceTest.java b/src/test/java/com/android/tools/r8/naming/retrace/InliningRetraceTest.java
new file mode 100644
index 0000000..6d7ce25
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/naming/retrace/InliningRetraceTest.java
@@ -0,0 +1,101 @@
+// 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.naming.retrace;
+
+import static com.android.tools.r8.naming.retrace.StackTrace.isSameExceptForFileName;
+import static com.android.tools.r8.naming.retrace.StackTrace.isSameExceptForFileNameAndLineNumber;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertThat;
+
+import com.android.tools.r8.CompilationMode;
+import com.android.tools.r8.ForceInline;
+import java.util.Collection;
+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 InliningRetraceTest extends RetraceTestBase {
+
+  @Parameters(name = "Backend: {0}, mode: {1}")
+  public static Collection<Object[]> data() {
+    return buildParameters(Backend.values(), CompilationMode.values());
+  }
+
+  public InliningRetraceTest(Backend backend, CompilationMode mode) {
+    super(backend, mode);
+  }
+
+  @Override
+  public Class<?> getMainClass() {
+    return Main.class;
+  }
+
+  private int expectedActualStackTraceHeight() {
+    return mode == CompilationMode.RELEASE ? 1 : 4;
+  }
+
+  @Test
+  public void testSourceFileAndLineNumberTable() throws Exception {
+    runTest(
+        "-keepattributes SourceFile,LineNumberTable",
+        (StackTrace actualStackTrace, StackTrace retracedStackTrace) -> {
+          // Even when SourceFile is present retrace replaces the file name in the stack trace.
+          assertThat(retracedStackTrace, isSameExceptForFileName(expectedStackTrace));
+          assertEquals(expectedActualStackTraceHeight(), actualStackTrace.size());
+        });
+  }
+
+  @Test
+  public void testLineNumberTableOnly() throws Exception {
+    runTest(
+        "-keepattributes LineNumberTable",
+        (StackTrace actualStackTrace, StackTrace retracedStackTrace) -> {
+          assertThat(retracedStackTrace, isSameExceptForFileName(expectedStackTrace));
+          assertEquals(expectedActualStackTraceHeight(), actualStackTrace.size());
+        });
+  }
+
+  @Test
+  public void testNoLineNumberTable() throws Exception {
+    runTest(
+        "",
+        (StackTrace actualStackTrace, StackTrace retracedStackTrace) -> {
+          assertThat(retracedStackTrace, isSameExceptForFileNameAndLineNumber(expectedStackTrace));
+          assertEquals(expectedActualStackTraceHeight(), actualStackTrace.size());
+        });
+  }
+}
+
+class Main {
+
+  @ForceInline
+  public static void method3(long j) {
+    System.out.println("In method3");
+    throw null;
+  }
+
+  @ForceInline
+  public static void method2(int j) {
+    System.out.println("In method2");
+    for (int i = 0; i < 10; i++) {
+      method3((long) j);
+    }
+  }
+
+  @ForceInline
+  public static void method1(String s) {
+    System.out.println("In method1");
+    for (int i = 0; i < 10; i++) {
+      method2(Integer.parseInt(s));
+    }
+  }
+
+  public static void main(String[] args) {
+    System.out.println("In main");
+    method1("1");
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/RetraceTest.java b/src/test/java/com/android/tools/r8/naming/retrace/RetraceTest.java
deleted file mode 100644
index b110ead..0000000
--- a/src/test/java/com/android/tools/r8/naming/retrace/RetraceTest.java
+++ /dev/null
@@ -1,159 +0,0 @@
-// 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.naming.retrace;
-
-import static org.hamcrest.CoreMatchers.containsString;
-import static org.hamcrest.CoreMatchers.not;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertThat;
-
-import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.R8Command;
-import com.android.tools.r8.TestBase;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.ToolHelper.DexVm;
-import com.android.tools.r8.ToolHelper.ProcessResult;
-import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.AndroidApp;
-import com.android.tools.r8.utils.FileUtils;
-import com.android.tools.r8.utils.StringUtils;
-import com.google.common.collect.ImmutableList;
-import java.io.IOException;
-import java.nio.file.Path;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.List;
-import java.util.function.BiConsumer;
-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 RetraceTest extends TestBase {
-  private Backend backend;
-  private CompilationMode mode;
-
-  @Parameters(name = "Backend: {0}, mode: {1}")
-  public static Collection<Object[]> data() {
-    return buildParameters(Backend.values(), CompilationMode.values());
-  }
-
-  public RetraceTest(Backend backend, CompilationMode mode) {
-    this.backend = backend;
-    this.mode = mode;
-  }
-
-  private List<String> retrace(String map, List<String> stackTrace) throws IOException {
-    Path t = temp.newFolder().toPath();
-    Path mapFile = t.resolve("map");
-    Path stackTraceFile = t.resolve("stackTrace");
-    FileUtils.writeTextFile(mapFile, map);
-    FileUtils.writeTextFile(stackTraceFile, stackTrace);
-    return StringUtils.splitLines(ToolHelper.runRetrace(mapFile, stackTraceFile));
-  }
-
-  private boolean isDalvik() {
-    return backend == Backend.DEX && ToolHelper.getDexVm().isOlderThanOrEqual(DexVm.ART_4_4_4_HOST);
-  }
-
-  private List<String> extractStackTrace(ProcessResult result) {
-    ImmutableList.Builder<String> builder = ImmutableList.builder();
-    List<String> stderr = StringUtils.splitLines(result.stderr);
-    Iterator<String> iterator = stderr.iterator();
-
-    // A Dalvik stacktrace looks like this:
-    // W(209693) threadid=1: thread exiting with uncaught exception (group=0xf616cb20)  (dalvikvm)
-    // java.lang.NullPointerException
-    // \tat com.android.tools.r8.naming.retrace.Main.a(:133)
-    // \tat com.android.tools.r8.naming.retrace.Main.a(:139)
-    // \tat com.android.tools.r8.naming.retrace.Main.main(:145)
-    // \tat dalvik.system.NativeStart.main(Native Method)
-    //
-    // An Art 5.1.1 and 6.0.1 stacktrace looks like this:
-    // java.lang.NullPointerException: throw with null exception
-    // \tat com.android.tools.r8.naming.retrace.Main.a(:154)
-    // \tat com.android.tools.r8.naming.retrace.Main.a(:160)
-    // \tat com.android.tools.r8.naming.retrace.Main.main(:166)
-    //
-    // An Art 7.0.0 and latest stacktrace looks like this:
-    // Exception in thread "main" java.lang.NullPointerException: throw with null exception
-    // \tat com.android.tools.r8.naming.retrace.Main.a(:150)
-    // \tat com.android.tools.r8.naming.retrace.Main.a(:156)
-    // \tat com.android.tools.r8.naming.retrace.Main.main(:162)
-    int last = stderr.size();
-    if (isDalvik()) {
-      // Skip the bottom frame "dalvik.system.NativeStart.main".
-      last--;
-    }
-    // Take all lines from the bottom starting with "\tat ".
-    int first = last;
-    while (first - 1 >= 0 && stderr.get(first - 1).startsWith("\tat ")) {
-      first--;
-    }
-    for (int i = first; i < last; i++) {
-      builder.add(stderr.get(i));
-    }
-    return builder.build();
-  }
-
-  public void runTest(Class<?> mainClass, BiConsumer<List<String>, List<String>> checker)
-      throws Exception {
-    StringBuilder proguardMapBuilder = new StringBuilder();
-    AndroidApp output =
-        ToolHelper.runR8(
-            R8Command.builder()
-                .setMode(mode)
-                .addClassProgramData(ToolHelper.getClassAsBytes(mainClass), Origin.unknown())
-                .addProguardConfiguration(
-                    ImmutableList.of(keepMainProguardConfiguration(mainClass)), Origin.unknown())
-                .setProgramConsumer(emptyConsumer(backend))
-                .setProguardMapConsumer((string, ignore) -> proguardMapBuilder.append(string))
-                .build());
-
-    ProcessResult result = runOnVMRaw(output, mainClass, backend);
-    List<String> stackTrace = extractStackTrace(result);
-    List<String> retracesStackTrace = retrace(proguardMapBuilder.toString(), stackTrace);
-    checker.accept(stackTrace, retracesStackTrace);
-  }
-
-  @Test
-  public void test() throws Exception {
-    runTest(
-        Main.class,
-        (List<String> stackTrace, List<String> retracesStackTrace) -> {
-          assertEquals(
-              mode == CompilationMode.RELEASE, stackTrace.size() != retracesStackTrace.size());
-          if (mode == CompilationMode.DEBUG) {
-            assertThat(stackTrace.get(0), not(containsString("method2")));
-            assertThat(stackTrace.get(1), not(containsString("method1")));
-            assertThat(stackTrace.get(2), containsString("main"));
-          }
-          assertEquals(3, retracesStackTrace.size());
-          assertThat(retracesStackTrace.get(0), containsString("method2"));
-          assertThat(retracesStackTrace.get(1), containsString("method1"));
-          assertThat(retracesStackTrace.get(2), containsString("main"));
-        });
-  }
-}
-
-class Main {
-  public static void method2(int i) {
-    System.out.println("In method2");
-    throw null;
-  }
-
-  public static void method1(String s) {
-    System.out.println("In method1");
-    for (int i = 0; i < 10; i++) {
-      method2(Integer.parseInt(s));
-    }
-  }
-
-  public static void main(String[] args) {
-    System.out.println("In main");
-    method1("1");
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/RetraceTestBase.java b/src/test/java/com/android/tools/r8/naming/retrace/RetraceTestBase.java
new file mode 100644
index 0000000..0d0c21b
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/naming/retrace/RetraceTestBase.java
@@ -0,0 +1,58 @@
+// 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.naming.retrace;
+
+import com.android.tools.r8.CompilationMode;
+import com.android.tools.r8.R8TestRunResult;
+import com.android.tools.r8.TestBase;
+import java.util.function.BiConsumer;
+import org.junit.Before;
+
+public abstract class RetraceTestBase extends TestBase {
+  protected Backend backend;
+  protected CompilationMode mode;
+
+  public RetraceTestBase(Backend backend, CompilationMode mode) {
+    this.backend = backend;
+    this.mode = mode;
+  }
+
+  public StackTrace expectedStackTrace;
+
+  public abstract Class<?> getMainClass();
+
+  @Before
+  public void setup() throws Exception {
+    // Get the expected stack trace by running on the JVM.
+    expectedStackTrace =
+        testForJvm()
+            .addTestClasspath()
+            .run(getMainClass())
+            .assertFailure()
+            .map(StackTrace::extractFromJvm);
+  }
+
+  public void runTest(String keepRule, BiConsumer<StackTrace, StackTrace> checker)
+      throws Exception {
+
+    R8TestRunResult result =
+        testForR8(backend)
+            .setMode(mode)
+            .enableProguardTestOptions()
+            .enableInliningAnnotations()
+            .addProgramClasses(getMainClass())
+            .addKeepMainRule(getMainClass())
+            .addKeepRules(keepRule)
+            .run(getMainClass())
+            .assertFailure();
+
+    // Extract actual stack trace and retraced stack trace from failed run result.
+    StackTrace actualStackTrace = StackTrace.extractFromArt(result.getStdErr());
+    StackTrace retracedStackTrace =
+        actualStackTrace.retrace(result.proguardMap(), temp.newFolder().toPath());
+
+    checker.accept(actualStackTrace, retracedStackTrace);
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java b/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java
new file mode 100644
index 0000000..68e09c1
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/naming/retrace/StackTrace.java
@@ -0,0 +1,436 @@
+// 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.naming.retrace;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNotEquals;
+import static org.junit.Assert.assertTrue;
+
+import com.android.tools.r8.TestRunResult;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.ToolHelper.DexVm;
+import com.android.tools.r8.utils.FileUtils;
+import com.android.tools.r8.utils.StringUtils;
+import com.google.common.base.Equivalence;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.ArrayList;
+import java.util.List;
+import java.util.stream.Collectors;
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+import org.hamcrest.TypeSafeMatcher;
+
+class StackTrace {
+
+  public static String AT_PREFIX = "at ";
+  public static String TAB_AT_PREFIX = "\t" + AT_PREFIX;
+
+  static class StackTraceLine {
+    public final String originalLine;
+    public final String className;
+    public final String methodName;
+    public final String fileName;
+    public final int lineNumber;
+
+    public StackTraceLine(
+        String originalLine, String className, String methodName, String fileName, int lineNumber) {
+      this.originalLine = originalLine;
+      this.className = className;
+      this.methodName = methodName;
+      this.fileName = fileName;
+      this.lineNumber = lineNumber;
+    }
+
+    public static StackTraceLine parse(String line) {
+      String originalLine = line;
+
+      line = line.trim();
+      if (line.startsWith(AT_PREFIX)) {
+        line = line.substring(AT_PREFIX.length());
+      }
+
+      // Expect only one '(', and only one ')' with a ':' in between.
+      int parenBeginIndex = line.indexOf('(');
+      assertTrue(parenBeginIndex > 0);
+      assertEquals(parenBeginIndex, line.lastIndexOf('('));
+      int parenEndIndex = line.indexOf(')');
+      assertTrue(parenBeginIndex < parenEndIndex);
+      assertEquals(parenEndIndex, line.lastIndexOf(')'));
+      int colonIndex = line.indexOf(':');
+      assertTrue(parenBeginIndex < colonIndex && colonIndex < parenEndIndex);
+      assertEquals(parenEndIndex, line.lastIndexOf(')'));
+      String classAndMethod = line.substring(0, parenBeginIndex);
+      int lastDotIndex = classAndMethod.lastIndexOf('.');
+      assertTrue(lastDotIndex > 0);
+      String className = classAndMethod.substring(0, lastDotIndex);
+      String methodName = classAndMethod.substring(lastDotIndex + 1, classAndMethod.length());
+      String fileName = line.substring(parenBeginIndex + 1, colonIndex);
+      int lineNumber = Integer.parseInt(line.substring(colonIndex + 1, parenEndIndex));
+      StackTraceLine result =
+          new StackTraceLine(originalLine, className, methodName, fileName, lineNumber);
+      assertEquals(line, result.toString());
+      return result;
+    }
+
+    @Override
+    public int hashCode() {
+      return className.hashCode() * 31
+          + methodName.hashCode() * 13
+          + fileName.hashCode() * 7
+          + lineNumber;
+    }
+
+    @Override
+    public boolean equals(Object other) {
+      if (this == other) {
+        return true;
+      }
+      if (other instanceof StackTraceLine) {
+        StackTraceLine o = (StackTraceLine) other;
+        return className.equals(o.className)
+            && methodName.equals(o.methodName)
+            && fileName.equals(o.fileName)
+            && lineNumber == o.lineNumber;
+      }
+      return false;
+    }
+
+    @Override
+    public String toString() {
+      return className + '.' + methodName + '(' + fileName + ':' + lineNumber + ')';
+    }
+  }
+
+  private final List<StackTraceLine> stackTraceLines;
+
+  private StackTrace(List<StackTraceLine> stackTraceLines) {
+    assert stackTraceLines.size() > 0;
+    this.stackTraceLines = stackTraceLines;
+  }
+
+  public int size() {
+    return stackTraceLines.size();
+  }
+
+  public StackTraceLine get(int index) {
+    return stackTraceLines.get(index);
+  }
+
+  public static StackTrace extractFromArt(String stderr) {
+    List<StackTraceLine> stackTraceLines = new ArrayList<>();
+    List<String> stderrLines = StringUtils.splitLines(stderr);
+
+    // A Dalvik stacktrace looks like this:
+    // W(209693) threadid=1: thread exiting with uncaught exception (group=0xf616cb20)  (dalvikvm)
+    // java.lang.NullPointerException
+    // \tat com.android.tools.r8.naming.retrace.Main.a(:133)
+    // \tat com.android.tools.r8.naming.retrace.Main.a(:139)
+    // \tat com.android.tools.r8.naming.retrace.Main.main(:145)
+    // \tat dalvik.system.NativeStart.main(Native Method)
+    //
+    // An Art 5.1.1 and 6.0.1 stacktrace looks like this:
+    // java.lang.NullPointerException: throw with null exception
+    // \tat com.android.tools.r8.naming.retrace.Main.a(:154)
+    // \tat com.android.tools.r8.naming.retrace.Main.a(:160)
+    // \tat com.android.tools.r8.naming.retrace.Main.main(:166)
+    //
+    // An Art 7.0.0 and latest stacktrace looks like this:
+    // Exception in thread "main" java.lang.NullPointerException: throw with null exception
+    // \tat com.android.tools.r8.naming.retrace.Main.a(:150)
+    // \tat com.android.tools.r8.naming.retrace.Main.a(:156)
+    // \tat com.android.tools.r8.naming.retrace.Main.main(:162)
+    int last = stderrLines.size();
+    if (ToolHelper.getDexVm().isOlderThanOrEqual(DexVm.ART_4_4_4_HOST)) {
+      // Skip the bottom frame "dalvik.system.NativeStart.main".
+      last--;
+    }
+    // Take all lines from the bottom starting with "\tat ".
+    int first = last;
+    while (first - 1 >= 0 && stderrLines.get(first - 1).startsWith(TAB_AT_PREFIX)) {
+      first--;
+    }
+    for (int i = first; i < last; i++) {
+      stackTraceLines.add(StackTraceLine.parse(stderrLines.get(i)));
+    }
+    return new StackTrace(stackTraceLines);
+  }
+
+  public static StackTrace extractFromJvm(String stderr) {
+    return new StackTrace(
+        StringUtils.splitLines(stderr).stream()
+            .filter(s -> s.startsWith(TAB_AT_PREFIX))
+            .map(StackTraceLine::parse)
+            .collect(Collectors.toList()));
+  }
+
+  public static StackTrace extractFromJvm(TestRunResult result) {
+    assertNotEquals(0, result.getExitCode());
+    return extractFromJvm(result.getStdErr());
+  }
+
+  public StackTrace retrace(String map, Path tempFolder) throws IOException {
+    Path mapFile = tempFolder.resolve("map");
+    Path stackTraceFile = tempFolder.resolve("stackTrace");
+    FileUtils.writeTextFile(mapFile, map);
+    FileUtils.writeTextFile(
+        stackTraceFile,
+        stackTraceLines.stream().map(line -> line.originalLine).collect(Collectors.toList()));
+    return StackTrace.extractFromJvm(ToolHelper.runRetrace(mapFile, stackTraceFile));
+  }
+
+  @Override
+  public int hashCode() {
+    return stackTraceLines.hashCode();
+  }
+
+  @Override
+  public boolean equals(Object other) {
+    if (this == other) {
+      return true;
+    }
+    if (other instanceof StackTrace) {
+      return stackTraceLines.equals(((StackTrace) other).stackTraceLines);
+    } else {
+      return false;
+    }
+  }
+
+  @Override
+  public String toString() {
+    return toStringWithPrefix("");
+  }
+
+  public String toStringWithPrefix(String prefix) {
+    StringBuilder builder = new StringBuilder();
+    for (StackTraceLine stackTraceLine : stackTraceLines) {
+      builder.append(prefix).append(stackTraceLine).append(System.lineSeparator());
+    }
+    return builder.toString();
+  }
+
+  public abstract static class StackTraceEquivalence extends Equivalence<StackTrace> {
+    public abstract Equivalence<StackTrace.StackTraceLine> getLineEquivalence();
+
+    @Override
+    protected boolean doEquivalent(StackTrace a, StackTrace b) {
+      if (a.stackTraceLines.size() != b.stackTraceLines.size()) {
+        return false;
+      }
+      for (int i = 0; i < a.stackTraceLines.size(); i++) {
+        if (!getLineEquivalence().equivalent(a.stackTraceLines.get(i), b.stackTraceLines.get(i))) {
+          return false;
+        }
+      }
+      return true;
+    }
+
+    @Override
+    protected int doHash(StackTrace stackTrace) {
+      int hashCode = stackTrace.size() * 13;
+      for (StackTrace.StackTraceLine stackTraceLine : stackTrace.stackTraceLines) {
+        hashCode += (hashCode << 4) + getLineEquivalence().hash(stackTraceLine);
+      }
+      return hashCode;
+    }
+  }
+
+  // Equivalence forwarding to default stack trace comparison.
+  public static class EquivalenceFull extends StackTraceEquivalence {
+
+    private static class LineEquivalence extends Equivalence<StackTrace.StackTraceLine> {
+
+      private static final LineEquivalence INSTANCE = new LineEquivalence();
+
+      public static LineEquivalence get() {
+        return INSTANCE;
+      }
+
+      @Override
+      protected boolean doEquivalent(StackTrace.StackTraceLine a, StackTrace.StackTraceLine b) {
+        return a.equals(b);
+      }
+
+      @Override
+      protected int doHash(StackTrace.StackTraceLine stackTraceLine) {
+        return stackTraceLine.hashCode();
+      }
+    }
+
+    private static final EquivalenceFull INSTANCE = new EquivalenceFull();
+
+    public static EquivalenceFull get() {
+      return INSTANCE;
+    }
+
+    @Override
+    public Equivalence<StackTrace.StackTraceLine> getLineEquivalence() {
+      return LineEquivalence.get();
+    }
+
+    @Override
+    protected boolean doEquivalent(StackTrace a, StackTrace b) {
+      return a.equals(b);
+    }
+
+    @Override
+    protected int doHash(StackTrace stackTrace) {
+      return stackTrace.hashCode();
+    }
+  }
+
+  // Equivalence comparing stack traces without taking the file name into account.
+  public static class EquivalenceWithoutFileName extends StackTraceEquivalence {
+
+    private static class LineEquivalence extends Equivalence<StackTrace.StackTraceLine> {
+
+      private static final LineEquivalence INSTANCE = new LineEquivalence();
+
+      public static LineEquivalence get() {
+        return INSTANCE;
+      }
+
+      @Override
+      protected boolean doEquivalent(StackTrace.StackTraceLine a, StackTrace.StackTraceLine b) {
+        return a.className.equals(b.className)
+            && a.methodName.equals(b.methodName)
+            && a.lineNumber == b.lineNumber;
+      }
+
+      @Override
+      protected int doHash(StackTrace.StackTraceLine stackTraceLine) {
+        return stackTraceLine.className.hashCode() * 13
+            + stackTraceLine.methodName.hashCode() * 7
+            + stackTraceLine.lineNumber;
+      }
+    }
+
+    private static final EquivalenceWithoutFileName INSTANCE = new EquivalenceWithoutFileName();
+
+    public static EquivalenceWithoutFileName get() {
+      return INSTANCE;
+    }
+
+    @Override
+    public Equivalence<StackTrace.StackTraceLine> getLineEquivalence() {
+      return LineEquivalence.get();
+    }
+  }
+
+  // Equivalence comparing stack traces without taking the file name and line number into account.
+  public static class EquivalenceWithoutFileNameAndLineNumber extends StackTraceEquivalence {
+
+    private static final EquivalenceWithoutFileNameAndLineNumber INSTANCE =
+        new EquivalenceWithoutFileNameAndLineNumber();
+
+    public static EquivalenceWithoutFileNameAndLineNumber get() {
+      return INSTANCE;
+    }
+
+    public static class LineEquivalence extends Equivalence<StackTrace.StackTraceLine> {
+
+      private static final LineEquivalence INSTANCE = new LineEquivalence();
+
+      public static LineEquivalence get() {
+        return INSTANCE;
+      }
+
+      @Override
+      protected boolean doEquivalent(StackTrace.StackTraceLine a, StackTrace.StackTraceLine b) {
+        return a.className.equals(b.className) && a.methodName.equals(b.methodName);
+      }
+
+      @Override
+      protected int doHash(StackTrace.StackTraceLine stackTraceLine) {
+        return stackTraceLine.className.hashCode() * 13 + stackTraceLine.methodName.hashCode() * 7;
+      }
+    }
+
+    @Override
+    public Equivalence<StackTrace.StackTraceLine> getLineEquivalence() {
+      return LineEquivalence.get();
+    }
+  }
+
+  public static class StackTraceMatcherBase extends TypeSafeMatcher<StackTrace> {
+    private final StackTrace expected;
+    private final StackTraceEquivalence equivalence;
+    private final String comparisonDescription;
+
+    private StackTraceMatcherBase(
+        StackTrace expected, StackTraceEquivalence equivalence, String comparisonDescription) {
+      this.expected = expected;
+      this.equivalence = equivalence;
+      this.comparisonDescription = comparisonDescription;
+    }
+
+    @Override
+    public boolean matchesSafely(StackTrace stackTrace) {
+      return equivalence.equivalent(expected, stackTrace);
+    }
+
+    @Override
+    public void describeTo(Description description) {
+      description
+          .appendText("stacktrace " + comparisonDescription)
+          .appendText(System.lineSeparator())
+          .appendText(expected.toString());
+    }
+
+    @Override
+    public void describeMismatchSafely(final StackTrace stackTrace, Description description) {
+      description.appendText("stacktrace was " + stackTrace);
+      description.appendText(System.lineSeparator());
+      if (expected.size() != stackTrace.size()) {
+        description.appendText("They have different sizes.");
+      } else {
+        for (int i = 0; i < expected.size(); i++) {
+          if (!equivalence.getLineEquivalence().equivalent(expected.get(i), stackTrace.get(i))) {
+            description
+                .appendText("First different entry is index " + i + ":")
+                .appendText(System.lineSeparator())
+                .appendText("Expected: " + expected.get(i))
+                .appendText(System.lineSeparator())
+                .appendText("     Was: " + stackTrace.get(i));
+            return;
+          }
+        }
+      }
+    }
+  }
+
+  public static class StackTraceMatcher extends StackTraceMatcherBase {
+    private StackTraceMatcher(StackTrace expected) {
+      super(expected, EquivalenceFull.get(), "");
+    }
+  }
+
+  public static Matcher<StackTrace> isSame(StackTrace stackTrace) {
+    return new StackTraceMatcher(stackTrace);
+  }
+
+  public static class StackTraceIgnoreFileNameMatcher extends StackTraceMatcherBase {
+    private StackTraceIgnoreFileNameMatcher(StackTrace expected) {
+      super(expected, EquivalenceWithoutFileName.get(), "(ignoring file name)");
+    }
+  }
+
+  public static Matcher<StackTrace> isSameExceptForFileName(StackTrace stackTrace) {
+    return new StackTraceIgnoreFileNameMatcher(stackTrace);
+  }
+
+  public static class StackTraceIgnoreFileNameAndLineNumberMatcher extends StackTraceMatcherBase {
+    private StackTraceIgnoreFileNameAndLineNumberMatcher(StackTrace expected) {
+      super(
+          expected,
+          EquivalenceWithoutFileNameAndLineNumber.get(),
+          "(ignoring file name and line number)");
+    }
+  }
+
+  public static Matcher<StackTrace> isSameExceptForFileNameAndLineNumber(StackTrace stackTrace) {
+    return new StackTraceIgnoreFileNameAndLineNumberMatcher(stackTrace);
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/naming/retrace/StackTraceTest.java b/src/test/java/com/android/tools/r8/naming/retrace/StackTraceTest.java
new file mode 100644
index 0000000..e7ff8eb
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/naming/retrace/StackTraceTest.java
@@ -0,0 +1,68 @@
+// 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.naming.retrace;
+
+import static com.android.tools.r8.naming.retrace.StackTrace.TAB_AT_PREFIX;
+import static org.junit.Assert.assertEquals;
+
+import com.android.tools.r8.naming.retrace.StackTrace.StackTraceLine;
+import com.android.tools.r8.utils.StringUtils;
+import org.junit.Test;
+
+public class StackTraceTest {
+
+  private static String oneLineStackTrace =
+      TAB_AT_PREFIX + "Test.main(Test.java:10)" + System.lineSeparator();
+  private static String twoLineStackTrace =
+      TAB_AT_PREFIX + "Test.a(Test.java:6)" + System.lineSeparator()
+          + TAB_AT_PREFIX + "Test.main(Test.java:10)" + System.lineSeparator();
+
+  private void testEquals(String stderr) {
+    StackTrace stackTrace = StackTrace.extractFromJvm(stderr);
+    assertEquals(stackTrace, stackTrace);
+    assertEquals(stackTrace, StackTrace.extractFromJvm(stderr));
+  }
+
+  @Test
+  public void testOneLine() {
+    StackTrace stackTrace = StackTrace.extractFromJvm(oneLineStackTrace);
+    assertEquals(1, stackTrace.size());
+    StackTraceLine stackTraceLine = stackTrace.get(0);
+    assertEquals("Test", stackTraceLine.className);
+    assertEquals("main", stackTraceLine.methodName);
+    assertEquals("Test.java", stackTraceLine.fileName);
+    assertEquals(10, stackTraceLine.lineNumber);
+    assertEquals(StringUtils.splitLines(oneLineStackTrace).get(0), stackTraceLine.originalLine);
+    assertEquals(oneLineStackTrace, stackTrace.toStringWithPrefix(TAB_AT_PREFIX));
+  }
+
+  @Test
+  public void testTwoLine() {
+    StackTrace stackTrace = StackTrace.extractFromJvm(twoLineStackTrace);
+    StackTraceLine stackTraceLine = stackTrace.get(0);
+    assertEquals("Test", stackTraceLine.className);
+    assertEquals("a", stackTraceLine.methodName);
+    assertEquals("Test.java", stackTraceLine.fileName);
+    assertEquals(6, stackTraceLine.lineNumber);
+    assertEquals(StringUtils.splitLines(twoLineStackTrace).get(0), stackTraceLine.originalLine);
+    stackTraceLine = stackTrace.get(1);
+    assertEquals("Test", stackTraceLine.className);
+    assertEquals("main", stackTraceLine.methodName);
+    assertEquals("Test.java", stackTraceLine.fileName);
+    assertEquals(10, stackTraceLine.lineNumber);
+    assertEquals(StringUtils.splitLines(twoLineStackTrace).get(1), stackTraceLine.originalLine);
+    assertEquals(twoLineStackTrace, stackTrace.toStringWithPrefix(TAB_AT_PREFIX));
+  }
+
+  @Test
+  public void testEqualsOneLine() {
+    testEquals(oneLineStackTrace);
+  }
+
+  @Test
+  public void testEqualsTwoLine() {
+    testEquals(twoLineStackTrace);
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/regress/b78493232/Regress78493232_WithPhi.java b/src/test/java/com/android/tools/r8/regress/b78493232/Regress78493232_WithPhi.java
index 6ee7392..4bd0776 100644
--- a/src/test/java/com/android/tools/r8/regress/b78493232/Regress78493232_WithPhi.java
+++ b/src/test/java/com/android/tools/r8/regress/b78493232/Regress78493232_WithPhi.java
@@ -52,6 +52,7 @@
         case V4_4_4:
         case V7_0_0:
         case V8_1_0:
+        case V9_0_0:
         case DEFAULT:
           assertNotEquals(-1, d8Result.stderr.indexOf("java.lang.VerifyError"));
           assertNotEquals(-1, r8Result.stderr.indexOf("java.lang.VerifyError"));
diff --git a/tools/archive.py b/tools/archive.py
index 07f138a..0fa811b 100755
--- a/tools/archive.py
+++ b/tools/archive.py
@@ -88,7 +88,10 @@
   shutil.copyfile(utils.R8_JAR, utils.R8_EXCLUDE_DEPS_JAR)
 
   # Ensure all archived artifacts has been built before archiving.
-  gradle.RunGradle([utils.D8, utils.R8, utils.COMPATDX, utils.COMPATPROGUARD])
+  # The target tasks postfixed by 'r8' depend on the actual target task so
+  # building it invokes the original task first.
+  gradle.RunGradle(map((lambda t: t + 'r8'),
+    [utils.D8, utils.R8, utils.COMPATDX, utils.COMPATPROGUARD]))
   version = GetVersion()
   is_master = IsMaster(version)
   if is_master:
@@ -107,12 +110,12 @@
           'releaser=go/r8bot (' + os.environ.get('BUILDBOT_SLAVENAME') + ')\n')
       version_writer.write('version-file.version.code=1\n')
 
-    for file in [utils.D8_JAR,
-                 utils.R8_JAR,
+    for file in [utils.D8_JAR, utils.D8R8_JAR,
+                 utils.R8_JAR, utils.R8R8_JAR,
                  utils.R8_SRC_JAR,
                  utils.R8_EXCLUDE_DEPS_JAR,
-                 utils.COMPATDX_JAR,
-                 utils.COMPATPROGUARD_JAR,
+                 utils.COMPATDX_JAR, utils.COMPATDXR8_JAR,
+                 utils.COMPATPROGUARD_JAR, utils.COMPATPROGUARDR8_JAR,
                  utils.MAVEN_ZIP,
                  utils.GENERATED_LICENSE]:
       file_name = os.path.basename(file)
diff --git a/tools/archive_logs.py b/tools/archive_logs.py
new file mode 100755
index 0000000..bdae32e
--- /dev/null
+++ b/tools/archive_logs.py
@@ -0,0 +1,11 @@
+#!/usr/bin/env python
+# 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.
+
+# Script for achiving gradle test logs.
+
+import utils
+
+if __name__ == '__main__':
+  utils.archive_failures()
diff --git a/tools/linux/README.art-versions b/tools/linux/README.art-versions
index 1512a64..095872b 100644
--- a/tools/linux/README.art-versions
+++ b/tools/linux/README.art-versions
@@ -42,6 +42,29 @@
   <continue with repo sync as above>
 
 
+art-9.0.0 (Android P)
+---------------------
+Build from branch android-9.0.0_r18.
+
+export BRANCH=android-9.0.0_r18
+mkdir ${BRANCH}
+cd ${BRANCH}
+repo init -u https://android.googlesource.com/platform/manifest -b ${BRANCH}
+repo sync -cq -j24
+source build/envsetup.sh
+lunch aosp_marlin-userdebug
+m -j24
+m -j24 build-art
+m -j24 test-art-host
+
+Collected into tools/linux/art-9.0.0.
+
+  cd <r8 checkout>
+  scripts/update-host-art.sh \
+    --android-checkout /usr/local/ssd/android/${BRANCH} \
+    --art-dir art-9.0.0 \
+    --android-product marlin
+
 art-8.1.0 (Android O MR1)
 -------------------------
 Build from branch android-8.1.0_r51.
@@ -59,6 +82,7 @@
 
 Collected into tools/linux/art-8.1.0.
 
+  cd <r8 checkout>
   scripts/update-host-art.sh \
     --android-checkout /usr/local/ssd/android/${BRANCH} \
     --art-dir art-8.1.0 \
diff --git a/tools/linux/art-9.0.0.tar.gz.sha1 b/tools/linux/art-9.0.0.tar.gz.sha1
new file mode 100644
index 0000000..788e039
--- /dev/null
+++ b/tools/linux/art-9.0.0.tar.gz.sha1
@@ -0,0 +1 @@
+bfd3d6f4c7d7245d93eecdcc386b41299266e2d1
\ No newline at end of file
diff --git a/tools/run-jdwp-tests.py b/tools/run-jdwp-tests.py
index db69197..2ef479d 100755
--- a/tools/run-jdwp-tests.py
+++ b/tools/run-jdwp-tests.py
@@ -15,6 +15,7 @@
 
 VERSIONS = [
   'default',
+  '9.0.0',
   '8.1.0',
   '7.0.0',
   '6.0.1',
@@ -101,6 +102,8 @@
     flags.extend(['-Ximage:%s' % IMAGE])
     if version != '5.1.1':
       flags.extend(['-Xcompiler-option', '--debuggable'])
+  if version == '9.0.0':
+    flags.extend(['-XjdwpProvider:internal'])
   return flags
 
 def get_debuggee_flags(version):
diff --git a/tools/test.py b/tools/test.py
index 31b2134..e4433b3 100755
--- a/tools/test.py
+++ b/tools/test.py
@@ -13,13 +13,17 @@
 import subprocess
 import sys
 import utils
-import uuid
 import notify
-import upload_to_x20
 
-
-ALL_ART_VMS = ["default", "8.1.0", "7.0.0", "6.0.1", "5.1.1", "4.4.4", "4.0.4"]
-BUCKET = 'r8-test-results'
+ALL_ART_VMS = [
+    "default",
+    "9.0.0",
+    "8.1.0",
+    "7.0.0",
+    "6.0.1",
+    "5.1.1",
+    "4.4.4",
+    "4.0.4"]
 
 def ParseOptions():
   result = optparse.OptionParser()
@@ -89,15 +93,6 @@
 
   return result.parse_args()
 
-def archive_failures():
-  upload_dir = os.path.join(utils.REPO_ROOT, 'build', 'reports', 'tests')
-  u_dir = uuid.uuid4()
-  destination = 'gs://%s/%s' % (BUCKET, u_dir)
-  utils.upload_dir_to_cloud_storage(upload_dir, destination, is_html=True)
-  url = 'http://storage.googleapis.com/%s/%s/test/index.html' % (BUCKET, u_dir)
-  print 'Test results available at: %s' % url
-  print '@@@STEP_LINK@Test failures@%s@@@' % url
-
 def Main():
   (options, args) = ParseOptions()
   if 'BUILDBOT_BUILDERNAME' in os.environ:
@@ -193,7 +188,7 @@
 
     if return_code != 0:
       if options.archive_failures and os.name != 'nt':
-        archive_failures()
+        utils.archive_failures()
       return return_code
 
   return 0
diff --git a/tools/update_prebuilds_in_android.py b/tools/update_prebuilds_in_android.py
index 7635ba6..395a4b4 100755
--- a/tools/update_prebuilds_in_android.py
+++ b/tools/update_prebuilds_in_android.py
@@ -35,7 +35,8 @@
     copyfile(src, dest)
 
 def copy_jar_targets(root, target_root):
-  srcs = map((lambda t: t + '.jar'), JAR_TARGETS)
+  # With the '-r8' postfix we're using the R8-processed jars.
+  srcs = map((lambda t: t + '-r8.jar'), JAR_TARGETS)
   dests = map((lambda t: t + '-master.jar'), JAR_TARGETS)
   copy_targets(root, target_root, srcs, dests)
 
@@ -61,12 +62,13 @@
   args = parse_arguments()
   target_root = args.android_root[0]
   if args.commit_hash == None and args.version == None:
-    gradle.RunGradle(JAR_TARGETS)
+    gradle.RunGradle(map((lambda t: t + 'r8'), JAR_TARGETS))
     copy_jar_targets(utils.LIBS, target_root)
     copy_other_targets(utils.GENERATED_LICENSE_DIR, target_root)
   else:
     assert args.commit_hash == None or args.version == None
-    targets = map((lambda t: t + '.jar'), JAR_TARGETS) + OTHER_TARGETS
+    # With the '-r8' postfix we're using the R8-processed jars.
+    targets = map((lambda t: t + '-r8.jar'), JAR_TARGETS) + OTHER_TARGETS
     with utils.TempDir() as root:
       for target in targets:
         if args.commit_hash:
diff --git a/tools/utils.py b/tools/utils.py
index d28643d..18f8870 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -12,6 +12,7 @@
 import sys
 import tarfile
 import tempfile
+import uuid
 
 ANDROID_JAR = 'third_party/android_jar/lib-v{api}/android.jar'
 TOOLS_DIR = os.path.abspath(os.path.normpath(os.path.join(__file__, '..')))
@@ -34,16 +35,22 @@
 COMPATPROGUARD = 'compatproguard'
 
 D8_JAR = os.path.join(LIBS, 'd8.jar')
+D8R8_JAR = os.path.join(LIBS, 'd8-r8.jar')
 R8_JAR = os.path.join(LIBS, 'r8.jar')
+R8R8_JAR = os.path.join(LIBS, 'r8-r8.jar')
 R8_SRC_JAR = os.path.join(LIBS, 'r8-src.jar')
 R8_EXCLUDE_DEPS_JAR = os.path.join(LIBS, 'r8-exclude-deps.jar')
 COMPATDX_JAR = os.path.join(LIBS, 'compatdx.jar')
+COMPATDXR8_JAR = os.path.join(LIBS, 'compatdx-r8.jar')
 COMPATPROGUARD_JAR = os.path.join(LIBS, 'compatproguard.jar')
+COMPATPROGUARDR8_JAR = os.path.join(LIBS, 'compatproguard-r8.jar')
 MAVEN_ZIP = os.path.join(LIBS, 'r8.zip')
 GENERATED_LICENSE = os.path.join(GENERATED_LICENSE_DIR, 'LICENSE')
 RT_JAR = os.path.join(REPO_ROOT, 'third_party/openjdk/openjdk-rt-1.8/rt.jar')
 R8LIB_KEEP_RULES = os.path.join(REPO_ROOT, 'src/main/keep.txt')
 
+TEST_RESULT_BUCKET = 'r8-test-results'
+
 def PrintCmd(s):
   if type(s) is list:
     s = ' '.join(s)
@@ -180,6 +187,15 @@
  def __exit__(self, *_):
    shutil.rmtree(self._temp_dir, ignore_errors=True)
 
+def archive_failures():
+  upload_dir = os.path.join(REPO_ROOT, 'build', 'reports', 'tests')
+  u_dir = uuid.uuid4()
+  destination = 'gs://%s/%s' % (TEST_RESULT_BUCKET, u_dir)
+  upload_dir_to_cloud_storage(upload_dir, destination, is_html=True)
+  url = 'http://storage.googleapis.com/%s/%s/test/index.html' % (TEST_RESULT_BUCKET, u_dir)
+  print 'Test results available at: %s' % url
+  print '@@@STEP_LINK@Test failures@%s@@@' % url
+
 class ChangedWorkingDirectory(object):
  def __init__(self, working_directory):
    self._working_directory = working_directory
