diff --git a/src/main/java/com/android/tools/r8/D8Command.java b/src/main/java/com/android/tools/r8/D8Command.java
index c8606ee..3618ab5 100644
--- a/src/main/java/com/android/tools/r8/D8Command.java
+++ b/src/main/java/com/android/tools/r8/D8Command.java
@@ -217,6 +217,8 @@
     internal.skipMinification = true;
     assert internal.useTreeShaking;
     internal.useTreeShaking = false;
+    assert internal.interfaceMethodDesugaring == OffOrAuto.Off;
+    assert internal.tryWithResourcesDesugaring == OffOrAuto.Off;
     assert internal.inlineAccessors;
     internal.inlineAccessors = false;
     assert internal.removeSwitchMaps;
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/ClassProcessor.java b/src/main/java/com/android/tools/r8/ir/desugar/ClassProcessor.java
index c40e2d5..b7036f5 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/ClassProcessor.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/ClassProcessor.java
@@ -15,7 +15,6 @@
 import com.android.tools.r8.ir.synthetic.SynthesizedCode;
 import com.google.common.collect.Sets;
 import java.util.ArrayList;
-import java.util.Collections;
 import java.util.IdentityHashMap;
 import java.util.Iterator;
 import java.util.List;
@@ -43,7 +42,9 @@
   }
 
   final void process(DexClass clazz) {
-    assert !clazz.isInterface();
+    if (clazz.isInterface()) {
+      throw new CompilationError("Interface in superclass chain.");
+    }
     if (!clazz.isProgramClass()) {
       // We assume that library classes don't need to be processed, since they
       // are provided by a runtime not supporting default interface methods.
@@ -60,15 +61,8 @@
     // about methods added to superclasses when we decide if we want to add a default
     // method to class `clazz`.
     DexType superType = clazz.superType;
-    // If superClass definition is missing, just skip this part and let real processing of its
-    // subclasses report the error if it is required.
-    DexClass superClass = superType == null ? null : rewriter.findDefinitionFor(superType);
-    if (superClass != null && superType != rewriter.factory.objectType) {
-      if (superClass.isInterface()) {
-        throw new CompilationError("Interface `" + superClass.toSourceString()
-        + "` used as super class of `" + clazz.toSourceString() + "`.");
-      }
-      process(superClass);
+    if (superType != null && superType != rewriter.factory.objectType) {
+      process(rewriter.findRequiredClass(superType));
     }
 
     if (clazz.interfaces.isEmpty()) {
@@ -101,10 +95,7 @@
 
   private DexEncodedMethod addForwardingMethod(DexEncodedMethod defaultMethod, DexClass clazz) {
     DexMethod method = defaultMethod.method;
-    // NOTE: Never add a forwarding method to methods of classes unknown or coming from android.jar
-    // even if this results in invalid code, these classes are never desugared.
-    assert rewriter.findDefinitionFor(method.holder) != null
-        && !rewriter.findDefinitionFor(method.holder).isLibraryClass();
+    assert !rewriter.findRequiredClass(method.holder).isLibraryClass();
     // New method will have the same name, proto, and also all the flags of the
     // default method, including bridge flag.
     DexMethod newMethod = rewriter.factory.createMethod(clazz.type, method.proto, method.name);
@@ -122,59 +113,23 @@
   // in this class.
   private List<DexEncodedMethod> collectMethodsToImplement(DexClass clazz) {
     DefaultMethodsHelper helper = new DefaultMethodsHelper();
-    DexClass current = clazz;
+
     // Collect candidate default methods by inspecting interfaces implemented
     // by this class as well as its superclasses.
-    //
-    // We assume here that interfaces implemented by java.lang.Object don't
-    // have default methods to desugar since they are library interfaces. And we assume object
-    // methods don't hide any default interface methods. Default interface method matching Object's
-    // methods is supposed to fail with a compilation error.
-    // Note that this last assumption will be broken if Object API is augmented with a new method in
-    // the future.
-    while (current.type != rewriter.factory.objectType) {
+    DexClass current = clazz;
+    while (true) {
       for (DexType type : current.interfaces.values) {
-        helper.merge(getOrCreateInterfaceInfo(clazz, current, type));
+        helper.merge(getOrCreateInterfaceInfo(type));
       }
 
-      List<DexEncodedMethod> defaultMethodsInDirectInterface = helper.createFullList();
-      List<DexEncodedMethod> toBeImplementedFromDirectInterface =
-          new ArrayList<>(defaultMethodsInDirectInterface.size());
-      hideCandidates(clazz.virtualMethods(),
-          defaultMethodsInDirectInterface,
-          toBeImplementedFromDirectInterface);
-      // toBeImplementedFromDirectInterface are those that we know for sure we need to implement by
-      // looking at the already desugared super classes.
-      // Remaining methods in defaultMethodsInDirectInterface are those methods we need to look at
-      // the hierarchy to know how they should be handled.
-      if (toBeImplementedFromDirectInterface.isEmpty()
-          && defaultMethodsInDirectInterface.isEmpty()) {
-        // No interface with default in direct hierarchy, nothing to do: super already has all that
-        // is needed.
-        return Collections.emptyList();
-      }
-
-      if (current.superType == null) {
+      DexType superType = current.superType;
+      if (superType == null || superType == rewriter.factory.objectType) {
+        // We assume here that interfaces implemented by java.lang.Object don't
+        // have default methods and don't hide any default interface methods since
+        // they must be library interfaces.
         break;
-      } else {
-        DexClass superClass = rewriter.findDefinitionFor(current.superType);
-        if (superClass != null) {
-          current = superClass;
-        } else {
-          String message = "Default method desugaring of `" + clazz.toSourceString() + "` failed";
-          if (current == clazz) {
-            message += " because its super class `" + clazz.superType.toSourceString()
-            + "` is missing";
-          } else {
-            message +=
-                " because it's hierarchy is incomplete. The class `"
-                    + current.superType.toSourceString()
-                    + "` is missing and it is the declared super class of `"
-                    + current.toSourceString() + "`";
-          }
-          throw new CompilationError(message);
-        }
       }
+      current = rewriter.findRequiredClass(superType);
     }
 
     List<DexEncodedMethod> candidates = helper.createCandidatesList();
@@ -193,31 +148,15 @@
       }
 
       DexType superType = current.superType;
-      DexClass superClass = null;
-      if (superType != null) {
-        superClass = rewriter.findDefinitionFor(superType);
-        // It's available or we would have failed while analyzing the hierarchy for interfaces.
-        assert superClass != null;
-      }
-      if (superClass == null || superType == rewriter.factory.objectType) {
+      if (superType == null || superType == rewriter.factory.objectType) {
         // Note that default interface methods must never have same
         // name/signature as any method in java.lang.Object (JLS §9.4.1.2).
 
         // Everything still in candidate list is not hidden.
         toBeImplemented.addAll(candidates);
-        // NOTE: we also intentionally remove all candidates coming from android.jar
-        // since it is only possible in case v24+ version of android.jar is provided.
-        // WARNING: This may result in incorrect code on older platforms!
-        toBeImplemented.removeIf(
-            method -> {
-              DexClass holder = rewriter.findDefinitionFor(method.method.holder);
-              // Holder of a found method to implement is a defined interface.
-              assert holder != null;
-              return holder.isLibraryClass();
-            });
         return toBeImplemented;
       }
-      current = superClass;
+      current = rewriter.findRequiredClass(superType);
     }
   }
 
@@ -249,56 +188,42 @@
     }
   }
 
-  private DefaultMethodsHelper.Collection getOrCreateInterfaceInfo(
-      DexClass classToDesugar,
-      DexClass implementing,
-      DexType iface) {
+  private DefaultMethodsHelper.Collection getOrCreateInterfaceInfo(DexType iface) {
     DefaultMethodsHelper.Collection collection = cache.get(iface);
     if (collection != null) {
       return collection;
     }
-    collection = createInterfaceInfo(classToDesugar, implementing, iface);
+    collection = createInterfaceInfo(iface);
     cache.put(iface, collection);
     return collection;
   }
 
-  private DefaultMethodsHelper.Collection createInterfaceInfo(
-      DexClass classToDesugar,
-      DexClass implementing,
-      DexType iface) {
+  private DefaultMethodsHelper.Collection createInterfaceInfo(DexType iface) {
     DefaultMethodsHelper helper = new DefaultMethodsHelper();
-    DexClass definedInterface = rewriter.findDefinitionFor(iface);
-    if (definedInterface == null) {
-      String message = "Interface `" + iface.toSourceString()
-              + "` not found. It's needed to make sure desugaring of `"
-              + classToDesugar.toSourceString() + "` is correct. Desugaring will assume that this"
-              + " interface has no default method";
-      if (classToDesugar != implementing) {
-        message += ". This missing interface is declared in the direct hierarchy of `"
-              + implementing.toString() + "`";
-      }
-      rewriter.warnMissingClass(iface, message);
-      return helper.wrapInCollection();
-    }
-
-    if (!definedInterface.isInterface()) {
+    DexClass clazz = rewriter.findRequiredClass(iface);
+    if (!clazz.isInterface()) {
       throw new CompilationError(
-          "Type " + iface.toSourceString() + " is referenced as an interface of `"
-          + implementing.toString() + "`.");
+          "Type " + iface.toSourceString() + " is expected to be an interface.");
+    }
+    if (clazz.isLibraryClass()) {
+      // For library interfaces we always assume there are no default
+      // methods, since the interface is part of framework provided by
+      // runtime which does not support default interface methods.
+      return DefaultMethodsHelper.Collection.EMPTY;
     }
 
     // Merge information from all superinterfaces.
-    for (DexType superinterface : definedInterface.interfaces.values) {
-      helper.merge(getOrCreateInterfaceInfo(classToDesugar, definedInterface, superinterface));
+    for (DexType superinterface : clazz.interfaces.values) {
+      helper.merge(getOrCreateInterfaceInfo(superinterface));
     }
 
     // Hide by virtual methods of this interface.
-    for (DexEncodedMethod virtual : definedInterface.virtualMethods()) {
+    for (DexEncodedMethod virtual : clazz.virtualMethods()) {
       helper.hideMatches(virtual.method);
     }
 
     // Add all default methods of this interface.
-    for (DexEncodedMethod encoded : definedInterface.virtualMethods()) {
+    for (DexEncodedMethod encoded : clazz.virtualMethods()) {
       if (rewriter.isDefaultMethod(encoded)) {
         helper.addDefaultMethod(encoded);
       }
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/DefaultMethodsHelper.java b/src/main/java/com/android/tools/r8/ir/desugar/DefaultMethodsHelper.java
index ae9a2ae..2f25b19 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/DefaultMethodsHelper.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/DefaultMethodsHelper.java
@@ -6,10 +6,8 @@
 
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexMethod;
-import com.google.common.collect.Iterables;
 import com.google.common.collect.Lists;
 import com.google.common.collect.Sets;
-import java.util.ArrayList;
 import java.util.Collections;
 import java.util.Iterator;
 import java.util.LinkedList;
@@ -104,18 +102,6 @@
     return candidates;
   }
 
-  final List<DexEncodedMethod> createFullList() {
-    if (candidates.isEmpty() && hidden.isEmpty()) {
-      return Collections.emptyList();
-    }
-
-    List<DexEncodedMethod> fullList =
-        new ArrayList<DexEncodedMethod>(candidates.size() + hidden.size());
-    fullList.addAll(candidates);
-    fullList.addAll(hidden);
-    return fullList;
-  }
-
   // Create default interface collection based on collected information.
   final Collection wrapInCollection() {
     candidates.removeAll(hidden);
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/InterfaceMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/InterfaceMethodRewriter.java
index 5c8faee..c3f2d08 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/InterfaceMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/InterfaceMethodRewriter.java
@@ -11,7 +11,6 @@
 import com.android.tools.r8.graph.DexCallSite;
 import com.android.tools.r8.graph.DexClass;
 import com.android.tools.r8.graph.DexEncodedMethod;
-import com.android.tools.r8.graph.DexItem;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexMethod;
 import com.android.tools.r8.graph.DexMethodHandle;
@@ -25,7 +24,6 @@
 import com.android.tools.r8.ir.code.InvokeStatic;
 import com.android.tools.r8.ir.code.InvokeSuper;
 import com.android.tools.r8.ir.conversion.IRConverter;
-import com.android.tools.r8.logging.Log;
 import com.google.common.collect.ImmutableSet;
 import com.google.common.collect.Sets;
 import java.util.ListIterator;
@@ -69,11 +67,6 @@
   // to this collection since it is only filled in ClassProcessor running synchronously.
   private final Set<DexEncodedMethod> forwardingMethods = Sets.newIdentityHashSet();
 
-  /**
-   * A set of dexitems we have reported missing to dedupe warnings.
-   */
-  private Set<DexItem> reportedMissing = Sets.newIdentityHashSet();
-
   /** Defines a minor variation in desugaring. */
   public enum Flavor {
     /** Process all application resources. */
@@ -106,11 +99,10 @@
           // Check that static interface methods are not referenced
           // from invoke-custom instructions via method handles.
           DexCallSite callSite = instruction.asInvokeCustom().getCallSite();
-          reportStaticInterfaceMethodHandle(encodedMethod.method, callSite.bootstrapMethod);
+          reportStaticInterfaceMethodHandle(callSite.bootstrapMethod);
           for (DexValue arg : callSite.bootstrapArgs) {
             if (arg instanceof DexValue.DexValueMethodHandle) {
-              reportStaticInterfaceMethodHandle(encodedMethod.method,
-                  ((DexValue.DexValueMethodHandle) arg).value);
+              reportStaticInterfaceMethodHandle(((DexValue.DexValueMethodHandle) arg).value);
             }
           }
           continue;
@@ -119,17 +111,7 @@
         if (instruction.isInvokeStatic()) {
           InvokeStatic invokeStatic = instruction.asInvokeStatic();
           DexMethod method = invokeStatic.getInvokedMethod();
-          DexClass clazz = findDefinitionFor(method.holder);
-          if (clazz == null) {
-            // NOTE: leave unchanged those calls to undefined targets. This may lead to runtime
-            // exception but we can not report it as error since it can also be the intended
-            // behavior.
-            warnMissingClass(encodedMethod.method, method.holder);
-          } else if (clazz.isInterface() && !clazz.isLibraryClass()) {
-            // NOTE: we intentionally don't desugar static calls into static interface
-            // methods coming from android.jar since it is only possible in case v24+
-            // version of android.jar is provided.
-            // WARNING: This may result in incorrect code on older platforms!
+          if (isInterfaceClass(method.holder)) {
             // Retarget call to an appropriate method of companion class.
             instructions.replaceCurrentInstruction(
                 new InvokeStatic(staticAsMethodOfCompanionClass(method),
@@ -141,17 +123,7 @@
         if (instruction.isInvokeSuper()) {
           InvokeSuper invokeSuper = instruction.asInvokeSuper();
           DexMethod method = invokeSuper.getInvokedMethod();
-          DexClass clazz = findDefinitionFor(method.holder);
-          if (clazz == null) {
-            // NOTE: leave unchanged those calls to undefined targets. This may lead to runtime
-            // exception but we can not report it as error since it can also be the intended
-            // behavior.
-            warnMissingClass(encodedMethod.method, method.holder);
-          } else if (clazz != null && (clazz.isInterface() && !clazz.isLibraryClass())) {
-            // NOTE: we intentionally don't desugar super calls into interface methods
-            // coming from android.jar since it is only possible in case v24+ version
-            // of android.jar is provided.
-            // WARNING: This may result in incorrect code on older platforms!
+          if (isInterfaceClass(method.holder)) {
             // Retarget call to an appropriate method of companion class.
             instructions.replaceCurrentInstruction(
                 new InvokeStatic(defaultAsMethodOfCompanionClass(method),
@@ -162,27 +134,25 @@
     }
   }
 
-  private void reportStaticInterfaceMethodHandle(DexMethod referencedFrom, DexMethodHandle handle) {
-    if (handle.type.isInvokeStatic()) {
-      DexClass holderClass = findDefinitionFor(handle.asMethod().holder);
-      // NOTE: If the class definition is missing we can't check. Let it be handled as any other
-      // missing call target.
-      if (holderClass == null) {
-        warnMissingClass(referencedFrom, handle.asMethod().holder);
-      } else if (holderClass.isInterface()) {
-        throw new Unimplemented(
-            "Desugaring of static interface method handle as in `"
-            + referencedFrom.toSourceString() + "` in is not yet supported.");
-      }
+  private void reportStaticInterfaceMethodHandle(DexMethodHandle handle) {
+    if (handle.type.isInvokeStatic() && isInterfaceClass(handle.asMethod().holder)) {
+      throw new Unimplemented(
+          "Desugaring of static interface method handle in is not yet supported.");
     }
   }
 
-  /**
-   * Returns the class definition for the specified type.
-   * @return may return null if no definition for the given type is available.
-   */
-  final DexClass findDefinitionFor(DexType type) {
-    return converter.appInfo.definitionFor(type);
+  private boolean isInterfaceClass(DexType type) {
+    return findRequiredClass(type).isInterface();
+  }
+
+  // Returns the class for the type specified, report errors for missing classes.
+  final DexClass findRequiredClass(DexType type) {
+    DexClass clazz = converter.appInfo.definitionFor(type);
+    if (clazz != null) {
+      return clazz;
+    }
+    throw new CompilationError("Type '" + type.toSourceString() +
+        "' required for default and static interface methods desugaring not found.");
   }
 
   // Gets the companion class for the interface `type`.
@@ -291,18 +261,4 @@
     }
     return true;
   }
-
-  void warnMissingClass(DexType missing, String message) {
-    // TODO replace by a proper warning mechanic (see b/65154707).
-    // TODO think about using a common deduplicating mechanic with Enqueuer
-    if (reportedMissing.add(missing)) {
-      System.err.println(message);
-    }
-  }
-
-  private void warnMissingClass(DexItem referencedFrom, DexType clazz) {
-      warnMissingClass(clazz,
-          "Type `" + clazz.toSourceString() + "` was not found, it is required for default or"
-          + " static interface methods desugaring of `" + referencedFrom.toSourceString() + "`");
-  }
 }
diff --git a/src/main/java/com/android/tools/r8/utils/InternalOptions.java b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
index 1b9272c..b03721f 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -83,9 +83,9 @@
   public List<String> logArgumentsFilter = ImmutableList.of();
 
   // Defines interface method rewriter behavior.
-  public OffOrAuto interfaceMethodDesugaring = OffOrAuto.Auto;
+  public OffOrAuto interfaceMethodDesugaring = OffOrAuto.Off;
   // Defines try-with-resources rewriter behavior.
-  public OffOrAuto tryWithResourcesDesugaring = OffOrAuto.Auto;
+  public OffOrAuto tryWithResourcesDesugaring = OffOrAuto.Off;
 
   // Application writing mode.
   public OutputMode outputMode = OutputMode.Indexed;
diff --git a/src/test/examplesAndroidO/desugaringwithandroidjar25/DefaultMethodInAndroidJar25.java b/src/test/examplesAndroidO/desugaringwithandroidjar25/DefaultMethodInAndroidJar25.java
deleted file mode 100644
index bec4e67..0000000
--- a/src/test/examplesAndroidO/desugaringwithandroidjar25/DefaultMethodInAndroidJar25.java
+++ /dev/null
@@ -1,100 +0,0 @@
-// Copyright (c) 2017, 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 desugaringwithandroidjar25;
-
-import java.util.ArrayList;
-import java.util.Collection;
-import java.util.Iterator;
-import java.util.function.Predicate;
-
-public class DefaultMethodInAndroidJar25 {
-  public static void main(String[] args) throws Exception {
-    ClassWithDefaultPlatformMethods.test();
-  }
-}
-
-class ClassWithDefaultPlatformMethods implements Collection<String> {
-  private final ArrayList<String> list =
-      new ArrayList<String>() {{
-        add("First");
-        add("Second");
-      }};
-
-  static void test() {
-    ClassWithDefaultPlatformMethods instance = new ClassWithDefaultPlatformMethods();
-    instance.forEach(x -> System.out.println("BEFORE: " + x));
-    instance.removeIf(x -> true);
-    instance.forEach(x -> System.out.println("AFTER: " + x));
-  }
-
-  @Override
-  public int size() {
-    throw new AssertionError();
-  }
-
-  @Override
-  public boolean isEmpty() {
-    throw new AssertionError();
-  }
-
-  @Override
-  public boolean contains(Object o) {
-    throw new AssertionError();
-  }
-
-  @Override
-  public Iterator<String> iterator() {
-    return list.iterator();
-  }
-
-  @Override
-  public Object[] toArray() {
-    throw new AssertionError();
-  }
-
-  @Override
-  public <T> T[] toArray(T[] a) {
-    throw new AssertionError();
-  }
-
-  @Override
-  public boolean add(String s) {
-    throw new AssertionError();
-  }
-
-  @Override
-  public boolean remove(Object o) {
-    return list.remove(o);
-  }
-
-  @Override
-  public boolean containsAll(Collection<?> c) {
-    throw new AssertionError();
-  }
-
-  @Override
-  public boolean addAll(Collection<? extends String> c) {
-    throw new AssertionError();
-  }
-
-  @Override
-  public boolean removeAll(Collection<?> c) {
-    throw new AssertionError();
-  }
-
-  @Override
-  public boolean retainAll(Collection<?> c) {
-    throw new AssertionError();
-  }
-
-  @Override
-  public void clear() {
-    throw new AssertionError();
-  }
-
-  @Override
-  public boolean removeIf(Predicate<? super String> filter) {
-    return Collection.super.removeIf(filter);
-  }
-}
diff --git a/src/test/examplesAndroidO/desugaringwithandroidjar25/StaticMethodInAndroidJar25.java b/src/test/examplesAndroidO/desugaringwithandroidjar25/StaticMethodInAndroidJar25.java
deleted file mode 100644
index f07ea8f..0000000
--- a/src/test/examplesAndroidO/desugaringwithandroidjar25/StaticMethodInAndroidJar25.java
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (c) 2017, 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 desugaringwithandroidjar25;
-
-import java.util.Comparator;
-
-public class StaticMethodInAndroidJar25 {
-  public static void main(String[] args) throws Exception {
-    Comparator<String> comparing =
-        Comparator.comparing(x -> x, String::compareTo);
-    System.out.println("'a' <> 'b' = " + comparing.compare("a", "b"));
-    System.out.println("'b' <> 'b' = " + comparing.compare("b", "b"));
-    System.out.println("'c' <> 'b' = " + comparing.compare("c", "b"));
-  }
-}
diff --git a/src/test/examplesAndroidO/desugaringwithmissingclasslib1/A.java b/src/test/examplesAndroidO/desugaringwithmissingclasslib1/A.java
deleted file mode 100644
index 98504bd..0000000
--- a/src/test/examplesAndroidO/desugaringwithmissingclasslib1/A.java
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright (c) 2017, 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 desugaringwithmissingclasslib1;
-
-public interface A {
-  default String foo() {
-    return "A";
-  }
-}
diff --git a/src/test/examplesAndroidO/desugaringwithmissingclasslib2/B.java b/src/test/examplesAndroidO/desugaringwithmissingclasslib2/B.java
deleted file mode 100644
index 1ab424e..0000000
--- a/src/test/examplesAndroidO/desugaringwithmissingclasslib2/B.java
+++ /dev/null
@@ -1,13 +0,0 @@
-// Copyright (c) 2017, 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 desugaringwithmissingclasslib2;
-
-import desugaringwithmissingclasslib1.A;
-
-public interface B extends A {
-  @Override
-  default String foo() {
-    return "B";
-  }
-}
diff --git a/src/test/examplesAndroidO/desugaringwithmissingclasslib3/C.java b/src/test/examplesAndroidO/desugaringwithmissingclasslib3/C.java
deleted file mode 100644
index 029f9f4..0000000
--- a/src/test/examplesAndroidO/desugaringwithmissingclasslib3/C.java
+++ /dev/null
@@ -1,9 +0,0 @@
-// Copyright (c) 2017, 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 desugaringwithmissingclasslib3;
-
-import desugaringwithmissingclasslib1.A;
-
-public class C implements A {
-}
diff --git a/src/test/examplesAndroidO/desugaringwithmissingclasstest1/ImplementMethodsWithDefault.java b/src/test/examplesAndroidO/desugaringwithmissingclasstest1/ImplementMethodsWithDefault.java
deleted file mode 100644
index 5f3c1c2..0000000
--- a/src/test/examplesAndroidO/desugaringwithmissingclasstest1/ImplementMethodsWithDefault.java
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright (c) 2017, 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 desugaringwithmissingclasstest1;
-
-import desugaringwithmissingclasslib1.A;
-import desugaringwithmissingclasslib2.B;
-
-public class ImplementMethodsWithDefault implements A, B {
-}
diff --git a/src/test/examplesAndroidO/desugaringwithmissingclasstest1/Main.java b/src/test/examplesAndroidO/desugaringwithmissingclasstest1/Main.java
deleted file mode 100644
index 411a016..0000000
--- a/src/test/examplesAndroidO/desugaringwithmissingclasstest1/Main.java
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright (c) 2017, 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 desugaringwithmissingclasstest1;
-
-public class Main {
-  public static void main(String[] args) throws Exception {
-    ImplementMethodsWithDefault instance = new ImplementMethodsWithDefault();
-    try {
-      String foo = instance.foo();
-      if (foo.equals("B")) {
-        System.out.println("OK");
-      } else {
-        System.out.println("NOT OK: " + foo);
-      }
-    } catch (Throwable t) {
-      System.out.println("NOT OK " + t.getClass() + " " + t.getMessage());
-      t.printStackTrace();
-    }
-  }
-}
diff --git a/src/test/examplesAndroidO/desugaringwithmissingclasstest2/ImplementMethodsWithDefault.java b/src/test/examplesAndroidO/desugaringwithmissingclasstest2/ImplementMethodsWithDefault.java
deleted file mode 100644
index f2ef1b6..0000000
--- a/src/test/examplesAndroidO/desugaringwithmissingclasstest2/ImplementMethodsWithDefault.java
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright (c) 2017, 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 desugaringwithmissingclasstest2;
-
-import desugaringwithmissingclasslib2.B;
-import desugaringwithmissingclasslib3.C;
-
-public class ImplementMethodsWithDefault extends C implements B {
-}
diff --git a/src/test/examplesAndroidO/desugaringwithmissingclasstest2/Main.java b/src/test/examplesAndroidO/desugaringwithmissingclasstest2/Main.java
deleted file mode 100644
index c42ac81..0000000
--- a/src/test/examplesAndroidO/desugaringwithmissingclasstest2/Main.java
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright (c) 2017, 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 desugaringwithmissingclasstest2;
-
-public class Main {
-  public static void main(String[] args) throws Exception {
-    ImplementMethodsWithDefault instance = new ImplementMethodsWithDefault();
-    try {
-      String foo = instance.foo();
-      if (foo.equals("B")) {
-        System.out.println("OK");
-      } else {
-        System.out.println("NOT OK: " + foo);
-      }
-    } catch (Throwable t) {
-      System.out.println("NOT OK " + t.getClass() + " " + t.getMessage());
-      t.printStackTrace();
-    }
-  }
-}
diff --git a/src/test/examplesAndroidO/desugaringwithmissingclasstest3/ImplementMethodsWithDefault.java b/src/test/examplesAndroidO/desugaringwithmissingclasstest3/ImplementMethodsWithDefault.java
deleted file mode 100644
index 4826237..0000000
--- a/src/test/examplesAndroidO/desugaringwithmissingclasstest3/ImplementMethodsWithDefault.java
+++ /dev/null
@@ -1,18 +0,0 @@
-// Copyright (c) 2017, 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 desugaringwithmissingclasstest3;
-
-import desugaringwithmissingclasslib2.B;
-import desugaringwithmissingclasslib3.C;
-
-public class ImplementMethodsWithDefault extends C implements B {
-  @Override
-  public String foo() {
-    return "ImplementMethodsWithDefault";
-  }
-
-  public String getB() {
-    return B.super.foo();
-  }
-}
diff --git a/src/test/examplesAndroidO/desugaringwithmissingclasstest3/Main.java b/src/test/examplesAndroidO/desugaringwithmissingclasstest3/Main.java
deleted file mode 100644
index bde4d09..0000000
--- a/src/test/examplesAndroidO/desugaringwithmissingclasstest3/Main.java
+++ /dev/null
@@ -1,32 +0,0 @@
-// Copyright (c) 2017, 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 desugaringwithmissingclasstest3;
-
-public class Main {
-  public static void main(String[] args) throws Exception {
-    ImplementMethodsWithDefault instance = new ImplementMethodsWithDefault();
-    try {
-      String b = instance.getB();
-      if (b.equals("B")) {
-        System.out.println("OK");
-      } else {
-        System.out.println("NOT OK: " + b);
-      }
-    } catch (Throwable t) {
-      System.out.println("NOT OK " + t.getClass() + " " + t.getMessage());
-      t.printStackTrace();
-    }
-    try {
-      String foo = instance.foo();
-      if (foo.equals("ImplementMethodsWithDefault")) {
-        System.out.println("OK");
-      } else {
-        System.out.println("NOT OK: " + foo);
-      }
-    } catch (Throwable t) {
-      System.out.println("NOT OK " + t.getClass() + " " + t.getMessage());
-      t.printStackTrace();
-    }
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java
index 2159d6b..803d760 100644
--- a/src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java
@@ -38,14 +38,14 @@
 public abstract class D8IncrementalRunExamplesAndroidOTest
     extends RunExamplesAndroidOTest<D8Command.Builder> {
 
-  abstract class D8IncrementalTestRunner extends TestRunner<D8IncrementalTestRunner> {
+  abstract class D8IncrementalTestRunner extends TestRunner {
 
     D8IncrementalTestRunner(String testName, String packageName, String mainClass) {
       super(testName, packageName, mainClass);
     }
 
     @Override
-    D8IncrementalTestRunner withMinApiLevel(int minApiLevel) {
+    TestRunner withMinApiLevel(int minApiLevel) {
       return withBuilderTransformation(builder -> builder.setMinApiLevel(minApiLevel));
     }
 
@@ -154,11 +154,12 @@
         builder = transformation.apply(builder);
       }
       builder = builder.setOutputMode(outputMode);
+      builder = builder.addLibraryFiles(
+          Paths.get(ToolHelper.getAndroidJar(builder.getMinApiLevel())));
       if (output != null) {
         builder = builder.setOutputPath(output);
       }
-      addLibraryReference(builder, Paths.get(ToolHelper.getAndroidJar(
-          androidJarVersion == null ? builder.getMinApiLevel() : androidJarVersion)));
+      addLibraryReference(builder, Paths.get(ToolHelper.getAndroidJar(builder.getMinApiLevel())));
       D8Command command = builder.build();
       try {
         return ToolHelper.runD8(command, this::combinedOptionConsumer);
@@ -287,7 +288,6 @@
     Assert.assertArrayEquals(expectedFileNames, dexFiles);
   }
 
-  @Override
   abstract D8IncrementalTestRunner test(String testName, String packageName, String mainClass);
 
   static byte[] readFromResource(Resource resource) throws IOException {
diff --git a/src/test/java/com/android/tools/r8/D8LazyRunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/D8LazyRunExamplesAndroidOTest.java
index c2ac969..d707614 100644
--- a/src/test/java/com/android/tools/r8/D8LazyRunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/D8LazyRunExamplesAndroidOTest.java
@@ -52,11 +52,6 @@
       builder.addLibraryResourceProvider(
           PreloadedClassFileProvider.fromArchive(location));
     }
-
-    @Override
-    D8LazyTestRunner self() {
-      return this;
-    }
   }
 
   @Override
diff --git a/src/test/java/com/android/tools/r8/D8NonLazyRunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/D8NonLazyRunExamplesAndroidOTest.java
index 99fe81c..5b2977c 100644
--- a/src/test/java/com/android/tools/r8/D8NonLazyRunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/D8NonLazyRunExamplesAndroidOTest.java
@@ -23,13 +23,7 @@
 
     @Override
     void addLibraryReference(D8Command.Builder builder, Path location) throws IOException {
-      builder.addLibraryFiles(Paths.get(ToolHelper.getAndroidJar(
-          androidJarVersion == null ? builder.getMinApiLevel() : androidJarVersion)));
-    }
-
-    @Override
-    D8LazyTestRunner self() {
-      return this;
+      builder.addLibraryFiles(Paths.get(ToolHelper.getAndroidJar(builder.getMinApiLevel())));
     }
   }
 
diff --git a/src/test/java/com/android/tools/r8/D8RunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/D8RunExamplesAndroidOTest.java
index b2adb20..6f51624 100644
--- a/src/test/java/com/android/tools/r8/D8RunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/D8RunExamplesAndroidOTest.java
@@ -4,58 +4,33 @@
 
 package com.android.tools.r8;
 
-import static com.android.tools.r8.dex.Constants.ANDROID_K_API;
-import static com.android.tools.r8.dex.Constants.ANDROID_O_API;
-
 import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.errors.InternalCompilerError;
 import com.android.tools.r8.errors.Unimplemented;
-import com.android.tools.r8.utils.OffOrAuto;
-import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.function.UnaryOperator;
-import org.hamcrest.core.CombinableMatcher;
-import org.hamcrest.core.IsInstanceOf;
-import org.hamcrest.core.StringContains;
-import org.junit.Assert;
-import org.junit.Test;
-import org.junit.internal.matchers.ThrowableMessageMatcher;
 
 public class D8RunExamplesAndroidOTest extends RunExamplesAndroidOTest<D8Command.Builder> {
 
-  class D8TestRunner extends TestRunner<D8TestRunner> {
+  class D8TestRunner extends TestRunner {
 
     D8TestRunner(String testName, String packageName, String mainClass) {
       super(testName, packageName, mainClass);
     }
 
     @Override
-    D8TestRunner withMinApiLevel(int minApiLevel) {
+    TestRunner withMinApiLevel(int minApiLevel) {
       return withBuilderTransformation(builder -> builder.setMinApiLevel(minApiLevel));
     }
 
-    D8TestRunner withClasspath(Path... classpath) {
-      return withBuilderTransformation(b -> {
-        try {
-          return b.addClasspathFiles(classpath);
-        } catch (IOException e) {
-          throw new AssertionError(e);
-        }
-      });
-    }
-
-
     @Override
     void build(Path inputFile, Path out) throws Throwable {
       D8Command.Builder builder = D8Command.builder();
       for (UnaryOperator<D8Command.Builder> transformation : builderTransformations) {
         builder = transformation.apply(builder);
       }
-      builder.addLibraryFiles(
-          Paths.get(
-              ToolHelper.getAndroidJar(
-                  androidJarVersion == null ? builder.getMinApiLevel() : androidJarVersion)));
+      builder.addLibraryFiles(Paths.get(ToolHelper.getAndroidJar(builder.getMinApiLevel())));
       D8Command command = builder.addProgramFiles(inputFile).setOutputPath(out).build();
       try {
         ToolHelper.runD8(command, this::combinedOptionConsumer);
@@ -65,361 +40,10 @@
         throw re.getCause() == null ? re : re.getCause();
       }
     }
-
-    @Override
-    D8TestRunner self() {
-      return this;
-    }
-  }
-
-  @Test
-  public void testDefaultInInterfaceWithoutDesugaring() throws Throwable {
-    // lib1: interface A { default String foo() { return "A"; } }
-    D8TestRunner lib1 =
-        test("testDefaultInInterfaceWithoutDesugaring", "desugaringwithmissingclasslib1", "N/A")
-            .withInterfaceMethodDesugaring(OffOrAuto.Off)
-            .withMinApiLevel(ANDROID_K_API);
-    try  {
-      lib1.build();
-
-      // compilation should have failed on CompilationError since A is declaring a default method.
-      Assert.fail();
-    } catch (CompilationError | CompilationException e) {
-      // Expected.
-    }
-  }
-
-  @Test
-  public void testMissingInterfaceDesugared() throws Throwable {
-    // lib1: interface A { default String foo() { return "A"; } }
-    D8TestRunner lib1 =
-        test("desugaringwithmissingclasslib1", "desugaringwithmissingclasslib1", "N/A")
-            .withInterfaceMethodDesugaring(OffOrAuto.Auto)
-            .withMinApiLevel(ANDROID_K_API);
-    lib1.build();
-
-    // lib2: interface B extends A { default String foo() { return "B"; } }
-    // lib2 is compiled with full classpath
-    D8TestRunner lib2 =
-        test("desugaringwithmissingclasslib2", "desugaringwithmissingclasslib2", "N/A")
-            .withInterfaceMethodDesugaring(OffOrAuto.Auto)
-            .withClasspath(lib1.getInputJar())
-            .withMinApiLevel(ANDROID_K_API);
-    lib2.build();
-
-    // test: class ImplementMethodsWithDefault implements A, B {} should get its foo implementation
-    // from B.
-    // test is compiled with incomplete classpath: lib2 is missing so ImplementMethodsWithDefault is
-    // missing one of it interfaces.
-    D8TestRunner test =
-        test("desugaringwithmissingclasstest1", "desugaringwithmissingclasstest1", "N/A")
-            .withInterfaceMethodDesugaring(OffOrAuto.Auto)
-            .withClasspath(lib1.getInputJar())
-            .withMinApiLevel(ANDROID_K_API);
-    test.build();
-
-    // TODO check compilation warnings are correctly reported
-    // B is missing so compiled code makes no sense, no need to test execution.
-  }
-
-  @Test
-  public void testMissingInterfaceDesugared2AndroidK() throws Throwable {
-    int minApi = ANDROID_K_API;
-
-    // lib1: interface A { default String foo() { return "A"; } }
-    D8TestRunner lib1 =
-        test("desugaringwithmissingclasslib1", "desugaringwithmissingclasslib1", "N/A")
-            .withInterfaceMethodDesugaring(OffOrAuto.Auto)
-            .withMinApiLevel(minApi);
-    Path lib1Dex = lib1.build();
-
-    // lib2: interface B extends A { default String foo() { return "B"; } }
-    // lib2 is compiled with full classpath
-    D8TestRunner lib2 =
-        test("desugaringwithmissingclasslib2", "desugaringwithmissingclasslib2", "N/A")
-            .withInterfaceMethodDesugaring(OffOrAuto.Auto)
-            .withClasspath(lib1.getInputJar())
-            .withMinApiLevel(minApi);
-    Path lib2Dex = lib2.build();
-
-    // lib3:  class C implements A {}
-    // lib3 is compiled with full classpath
-    D8TestRunner lib3 =
-        test("desugaringwithmissingclasslib3", "desugaringwithmissingclasslib3", "N/A")
-            .withInterfaceMethodDesugaring(OffOrAuto.Auto)
-            .withClasspath(lib1.getInputJar())
-            .withMinApiLevel(minApi);
-    Path lib3Dex = lib3.build();
-
-    // test: class ImplementMethodsWithDefault extends C implements B should get its foo
-    // implementation from B.
-    // test is compiled with incomplete classpath: lib2 and lib3 are missing so
-    // ImplementMethodsWithDefault is missing all its hierarchy.
-    D8TestRunner test =
-        test("desugaringwithmissingclasstest2", "desugaringwithmissingclasstest2", "N/A")
-            .withInterfaceMethodDesugaring(OffOrAuto.Auto)
-            .withClasspath(lib1.getInputJar())
-            .withMinApiLevel(minApi);
-    Path testDex = test.build();
-    // TODO check compilation warnings are correctly reported
-
-    // Missing interface B is causing the wrong code to be executed.
-    thrown.expect(AssertionError.class);
-    execute(
-        "testMissingInterfaceDesugared2AndroidK",
-        "desugaringwithmissingclasstest2.Main",
-        new Path[] {
-          lib1.getInputJar(), lib2.getInputJar(), lib3.getInputJar(), test.getInputJar()
-        },
-        new Path[] {lib1Dex, lib2Dex, lib3Dex, testDex});
-  }
-
-  @Test
-  public void testMissingInterfaceDesugared2AndroidO() throws Throwable {
-    int minApi = ANDROID_O_API;
-    // lib1: interface A { default String foo() { return "A"; } }
-    D8TestRunner lib1 =
-        test("desugaringwithmissingclasslib1", "desugaringwithmissingclasslib1", "N/A")
-            .withInterfaceMethodDesugaring(OffOrAuto.Auto)
-            .withMinApiLevel(minApi);
-    Path lib1Dex = lib1.build();
-
-    // lib2: interface B extends A { default String foo() { return "B"; } }
-    // lib2 is compiled with full classpath
-    D8TestRunner lib2 =
-        test("desugaringwithmissingclasslib2", "desugaringwithmissingclasslib2", "N/A")
-            .withInterfaceMethodDesugaring(OffOrAuto.Auto)
-            .withClasspath(lib1.getInputJar())
-            .withMinApiLevel(minApi);
-    Path lib2Dex = lib2.build();
-
-    // lib3:  class C implements A {}
-    // lib3 is compiled with full classpath
-    D8TestRunner lib3 =
-        test("desugaringwithmissingclasslib3", "desugaringwithmissingclasslib3", "N/A")
-            .withInterfaceMethodDesugaring(OffOrAuto.Auto)
-            .withClasspath(lib1.getInputJar())
-            .withMinApiLevel(minApi);
-    Path lib3Dex = lib3.build();
-
-    // test: class ImplementMethodsWithDefault extends C implements B should get its foo
-    // implementation from B.
-    // test is compiled with incomplete classpath: lib2 and lib3 are missing so
-    // ImplementMethodsWithDefault is missing all its hierarchy.
-    D8TestRunner test =
-        test("desugaringwithmissingclasstest2", "desugaringwithmissingclasstest2", "N/A")
-            .withInterfaceMethodDesugaring(OffOrAuto.Auto)
-            .withClasspath(lib1.getInputJar())
-            .withMinApiLevel(minApi);
-    Path testDex = test.build();
-    execute(
-        "testMissingInterfaceDesugared2AndroidO",
-        "desugaringwithmissingclasstest2.Main",
-        new Path[] {
-          lib1.getInputJar(), lib2.getInputJar(), lib3.getInputJar(), test.getInputJar()
-        },
-        new Path[] {lib1Dex, lib2Dex, lib3Dex, testDex});
-  }
-
-  @Test
-  public void testCallToMissingSuperInterfaceDesugaredAndroidK() throws Throwable {
-
-    int minApi = ANDROID_K_API;
-    // lib1: interface A { default String foo() { return "A"; } }
-    D8TestRunner lib1 =
-        test("desugaringwithmissingclasslib1", "desugaringwithmissingclasslib1", "N/A")
-            .withInterfaceMethodDesugaring(OffOrAuto.Auto)
-            .withMinApiLevel(minApi);
-    Path lib1Dex = lib1.build();
-
-    // lib2: interface B extends A { default String foo() { return "B"; } }
-    // lib2 is compiled with full classpath
-    D8TestRunner lib2 =
-        test("desugaringwithmissingclasslib2", "desugaringwithmissingclasslib2", "N/A")
-            .withInterfaceMethodDesugaring(OffOrAuto.Auto)
-            .withClasspath(lib1.getInputJar())
-            .withMinApiLevel(minApi);
-    Path lib2Dex = lib2.build();
-
-    // lib3:  class C implements A {}
-    // lib3 is compiled with full classpath
-    D8TestRunner lib3 =
-        test("desugaringwithmissingclasslib3", "desugaringwithmissingclasslib3", "N/A")
-            .withInterfaceMethodDesugaring(OffOrAuto.Auto)
-            .withClasspath(lib1.getInputJar())
-            .withMinApiLevel(minApi);
-    Path lib3Dex = lib3.build();
-
-    // test: class ImplementMethodsWithDefault extends C implements B
-    // { String getB() { return B.super.foo(); }
-    // Should be able to call implementation from B.
-    // test is compiled with incomplete classpath: lib2, i.e. B definition, is missing.
-    D8TestRunner test =
-        test("desugaringwithmissingclasstest3", "desugaringwithmissingclasstest3", "N/A")
-            .withInterfaceMethodDesugaring(OffOrAuto.Auto)
-            .withClasspath(lib1.getInputJar(), lib3.getInputJar())
-            .withMinApiLevel(minApi);
-    Path testDex = test.build();
-    // TODO check compilation warnings are correctly reported
-
-    // Missing interface B is causing the wrong method to be executed.
-    thrown.expect(AssertionError.class);
-    execute(
-        "testCallToMissingSuperInterfaceDesugaredAndroidK",
-        "desugaringwithmissingclasstest3.Main",
-        new Path[] {
-          lib1.getInputJar(), lib2.getInputJar(), lib3.getInputJar(), test.getInputJar()
-        },
-        new Path[] {lib1Dex, lib2Dex, lib3Dex, testDex});
-  }
-
-  @Test
-  public void testCallToMissingSuperInterfaceDesugaredAndroidO() throws Throwable {
-    int minApi = ANDROID_O_API;
-    // lib1: interface A { default String foo() { return "A"; } }
-    D8TestRunner lib1 =
-        test("desugaringwithmissingclasslib1", "desugaringwithmissingclasslib1", "N/A")
-            .withInterfaceMethodDesugaring(OffOrAuto.Auto)
-            .withMinApiLevel(minApi);
-    Path lib1Dex = lib1.build();
-
-    // lib2: interface B extends A { default String foo() { return "B"; } }
-    // lib2 is compiled with full classpath
-    D8TestRunner lib2 =
-        test("desugaringwithmissingclasslib2", "desugaringwithmissingclasslib2", "N/A")
-            .withInterfaceMethodDesugaring(OffOrAuto.Auto)
-            .withClasspath(lib1.getInputJar())
-            .withMinApiLevel(minApi);
-    Path lib2Dex = lib2.build();
-
-    // lib3:  class C implements A {}
-    // lib3 is compiled with full classpath
-    D8TestRunner lib3 =
-        test("desugaringwithmissingclasslib3", "desugaringwithmissingclasslib3", "N/A")
-            .withInterfaceMethodDesugaring(OffOrAuto.Auto)
-            .withClasspath(lib1.getInputJar())
-            .withMinApiLevel(minApi);
-    Path lib3Dex = lib3.build();
-
-    // test: class ImplementMethodsWithDefault extends C implements B
-    // { String getB() { return B.super.foo(); }
-    // Should be able to call implementation from B.
-    // test is compiled with incomplete classpath: lib2, i.e. B definition, is missing.
-    D8TestRunner test =
-        test("desugaringwithmissingclasstest3", "desugaringwithmissingclasstest3", "N/A")
-            .withInterfaceMethodDesugaring(OffOrAuto.Auto)
-            .withClasspath(lib1.getInputJar(), lib3.getInputJar())
-            .withMinApiLevel(minApi);
-    Path testDex = test.build();
-    execute(
-        "testCallToMissingSuperInterfaceDesugaredAndroidO",
-        "desugaringwithmissingclasstest3.Main",
-        new Path[] {
-          lib1.getInputJar(), lib2.getInputJar(), lib3.getInputJar(), test.getInputJar()
-        },
-        new Path[] {lib1Dex, lib2Dex, lib3Dex, testDex});
-  }
-
-  @Test
-  public void testMissingSuperDesugaredAndroidK() throws Throwable {
-    int minApi = ANDROID_K_API;
-
-    // lib1: interface A { default String foo() { return "A"; } }
-    D8TestRunner lib1 =
-        test("desugaringwithmissingclasslib1", "desugaringwithmissingclasslib1", "N/A")
-            .withInterfaceMethodDesugaring(OffOrAuto.Auto)
-            .withMinApiLevel(minApi);
-    lib1.build();
-
-    // lib2: interface B extends A { default String foo() { return "B"; } }
-    // lib2 is compiled with full classpath
-    D8TestRunner lib2 =
-        test("desugaringwithmissingclasslib2", "desugaringwithmissingclasslib2", "N/A")
-            .withInterfaceMethodDesugaring(OffOrAuto.Auto)
-            .withClasspath(lib1.getInputJar())
-            .withMinApiLevel(minApi);
-    lib2.build();
-
-    // lib3:  class C implements A {}
-    // lib3 is compiled with full classpath
-    D8TestRunner lib3 =
-        test("desugaringwithmissingclasslib3", "desugaringwithmissingclasslib3", "N/A")
-            .withInterfaceMethodDesugaring(OffOrAuto.Auto)
-            .withClasspath(lib1.getInputJar())
-            .withMinApiLevel(minApi);
-    lib3.build();
-
-    // test: class ImplementMethodsWithDefault extends C implements B should get its foo
-    // implementation from B.
-    // test is compiled with incomplete classpath: lib3 is missing so
-    // ImplementMethodsWithDefault is missing its super class.
-    D8TestRunner test =
-        test("desugaringwithmissingclasstest2", "desugaringwithmissingclasstest2", "N/A")
-            .withInterfaceMethodDesugaring(OffOrAuto.Auto)
-            .withClasspath(lib1.getInputJar())
-            .withClasspath(lib2.getInputJar())
-            .withMinApiLevel(minApi);
-    thrown.expect(
-        new CombinableMatcher<CompilationError>(new IsInstanceOf(CompilationError.class))
-        .and(new ThrowableMessageMatcher<CompilationError>(
-            new StringContains("desugaringwithmissingclasstest2.ImplementMethodsWithDefault")))
-        .and(new ThrowableMessageMatcher<CompilationError>(
-            new StringContains("desugaringwithmissingclasslib3.C"))));
-    test.build();
-  }
-
-  @Test
-  public void testMissingSuperDesugaredAndroidO() throws Throwable {
-    int minApi = ANDROID_O_API;
-
-    // lib1: interface A { default String foo() { return "A"; } }
-    D8TestRunner lib1 =
-        test("desugaringwithmissingclasslib1", "desugaringwithmissingclasslib1", "N/A")
-            .withInterfaceMethodDesugaring(OffOrAuto.Auto)
-            .withMinApiLevel(minApi);
-    Path lib1Dex = lib1.build();
-
-    // lib2: interface B extends A { default String foo() { return "B"; } }
-    // lib2 is compiled with full classpath
-    D8TestRunner lib2 =
-        test("desugaringwithmissingclasslib2", "desugaringwithmissingclasslib2", "N/A")
-            .withInterfaceMethodDesugaring(OffOrAuto.Auto)
-            .withClasspath(lib1.getInputJar())
-            .withMinApiLevel(minApi);
-    Path lib2Dex = lib2.build();
-
-    // lib3:  class C implements A {}
-    // lib3 is compiled with full classpath
-    D8TestRunner lib3 =
-        test("desugaringwithmissingclasslib3", "desugaringwithmissingclasslib3", "N/A")
-            .withInterfaceMethodDesugaring(OffOrAuto.Auto)
-            .withClasspath(lib1.getInputJar())
-            .withMinApiLevel(minApi);
-    Path lib3Dex = lib3.build();
-
-    // test: class ImplementMethodsWithDefault extends C implements B should get its foo
-    // implementation from B.
-    // test is compiled with incomplete classpath: lib3 is missing so
-    // ImplementMethodsWithDefault is missing its super class.
-    D8TestRunner test =
-        test("desugaringwithmissingclasstest2", "desugaringwithmissingclasstest2", "N/A")
-            .withInterfaceMethodDesugaring(OffOrAuto.Auto)
-            .withClasspath(lib1.getInputJar())
-            .withClasspath(lib2.getInputJar())
-            .withMinApiLevel(minApi);
-    Path testDex = test.build();
-
-    execute(
-        "testMissingSuperDesugaredAndroidO",
-        "desugaringwithmissingclasstest2.Main",
-        new Path[] {
-          lib1.getInputJar(), lib2.getInputJar(), lib3.getInputJar(), test.getInputJar()
-        },
-        new Path[] {lib1Dex, lib2Dex, lib3Dex, testDex});
   }
 
   @Override
-  D8TestRunner test(String testName, String packageName, String mainClass) {
+  TestRunner test(String testName, String packageName, String mainClass) {
     return new D8TestRunner(testName, packageName, mainClass);
   }
 }
diff --git a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
index 20b8b9c..aa30615 100644
--- a/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunArtTestsTest.java
@@ -136,6 +136,21 @@
           .put("975-iface-private", Constants.ANDROID_N_API)
           .build();
 
+  // Tests requiring interface method desugaring because they explicitly or
+  // implicitly define static or default interface methods and are enabled
+  // on pre-N Android.
+  private static List<String> enableInterfaceMethodDesugaring =
+      ImmutableList.of(
+          "563-checker-invoke-super",
+          "604-hot-static-interface",
+          "961-default-iface-resolution-gen",
+          "963-default-range-smali",
+          "965-default-verify",
+          "967-default-ame",
+          "969-iface-super",
+          "978-virtual-interface"
+      );
+
   // Tests that timeout when run with Art.
   private static final Multimap<String, TestCondition> timeoutOrSkipRunWithArt =
       new ImmutableListMultimap.Builder<String, TestCondition>()
@@ -184,9 +199,8 @@
 
   // Tests that are never compiled or run.
   private static List<String> skipAltogether = ImmutableList.of(
-      // Those tests contains an invalid type hierarchy, which we cannot currently handle.
+      // This test contains an invalid type hierarchy, which we cannot currently handle.
       "065-mismatched-implements",
-      "066-mismatched-super",
       // This test contains invalid dex code that reads uninitialized registers after an
       // an instruction that would in any case throw (implicit via aget null 0).
       "706-jit-skip-compilation",
@@ -1125,12 +1139,7 @@
         Integer minSdkVersion = needMinSdkVersion.get(name);
         if (minSdkVersion != null) {
           builder.setMinApiLevel(minSdkVersion);
-          builder.addLibraryFiles(Paths.get(ToolHelper.getAndroidJar(minSdkVersion)));
-        } else {
-          builder.addLibraryFiles(Paths.get(
-              ToolHelper.getAndroidJar(Constants.DEFAULT_ANDROID_API)));
         }
-
         D8Output output = D8.run(builder.build());
         output.write(Paths.get(resultPath));
         break;
@@ -1153,6 +1162,9 @@
         ToolHelper.runR8(
             builder.build(),
             options -> {
+              if (enableInterfaceMethodDesugaring.contains(name)) {
+                options.interfaceMethodDesugaring = OffOrAuto.Auto;
+              }
               if (disableInlining) {
                 options.inlineAccessors = false;
               }
diff --git a/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
index e63b155..6c45f40 100644
--- a/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/R8RunExamplesAndroidOTest.java
@@ -46,14 +46,14 @@
         .run();
   }
 
-  class R8TestRunner extends TestRunner<R8TestRunner> {
+  class R8TestRunner extends TestRunner {
 
     R8TestRunner(String testName, String packageName, String mainClass) {
       super(testName, packageName, mainClass);
     }
 
     @Override
-    R8TestRunner withMinApiLevel(int minApiLevel) {
+    TestRunner withMinApiLevel(int minApiLevel) {
       return withBuilderTransformation(builder -> builder.setMinApiLevel(minApiLevel));
     }
 
@@ -64,23 +64,16 @@
         for (UnaryOperator<R8Command.Builder> transformation : builderTransformations) {
           builder = transformation.apply(builder);
         }
-        builder.addLibraryFiles(Paths.get(ToolHelper.getAndroidJar(
-            androidJarVersion == null ? builder.getMinApiLevel() : androidJarVersion)));
         R8Command command = builder.addProgramFiles(inputFile).setOutputPath(out).build();
         ToolHelper.runR8(command, this::combinedOptionConsumer);
       } catch (ExecutionException e) {
         throw e.getCause();
       }
     }
-
-    @Override
-    R8TestRunner self() {
-      return this;
-    }
   }
 
   @Override
-  R8TestRunner test(String testName, String packageName, String mainClass) {
+  TestRunner test(String testName, String packageName, String mainClass) {
     return new R8TestRunner(testName, packageName, mainClass);
   }
 
diff --git a/src/test/java/com/android/tools/r8/RunExamplesAndroidNTest.java b/src/test/java/com/android/tools/r8/RunExamplesAndroidNTest.java
index 9d745f6..7594b0c 100644
--- a/src/test/java/com/android/tools/r8/RunExamplesAndroidNTest.java
+++ b/src/test/java/com/android/tools/r8/RunExamplesAndroidNTest.java
@@ -133,8 +133,7 @@
     thrown.expect(ApiLevelException.class);
     test("staticinterfacemethods-error-due-to-min-sdk", "interfacemethods",
         "StaticInterfaceMethods")
-        .withInterfaceMethodDesugaring(OffOrAuto.Off)
-       .run();
+        .run();
   }
 
   @Test
@@ -150,7 +149,6 @@
     thrown.expect(ApiLevelException.class);
     test("defaultmethods-error-due-to-min-sdk", "interfacemethods",
         "DefaultMethods")
-        .withInterfaceMethodDesugaring(OffOrAuto.Off)
         .run();
   }
 
diff --git a/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java
index 012a077..937f55c 100644
--- a/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/RunExamplesAndroidOTest.java
@@ -22,35 +22,29 @@
 import com.android.tools.r8.utils.OffOrAuto;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
-import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Iterator;
 import java.util.List;
 import java.util.Map;
 import java.util.function.Consumer;
 import java.util.function.Predicate;
 import java.util.function.UnaryOperator;
-import java.util.stream.Collectors;
 import org.junit.Assert;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.junit.rules.TemporaryFolder;
 
-public abstract class RunExamplesAndroidOTest
-      <B extends BaseCommand.Builder<? extends BaseCommand, B>> {
+public abstract class RunExamplesAndroidOTest<B> {
   static final String EXAMPLE_DIR = ToolHelper.EXAMPLES_ANDROID_O_BUILD_DIR;
 
-  abstract class TestRunner<C extends TestRunner<C>> {
+  abstract class TestRunner {
     final String testName;
     final String packageName;
     final String mainClass;
 
-    Integer androidJarVersion = null;
-
     final List<Consumer<InternalOptions>> optionConsumers = new ArrayList<>();
     final List<Consumer<DexInspector>> dexInspectorChecks = new ArrayList<>();
     final List<UnaryOperator<B>> builderTransformations = new ArrayList<>();
@@ -61,22 +55,20 @@
       this.mainClass = mainClass;
     }
 
-    abstract C self();
-
-    C withDexCheck(Consumer<DexInspector> check) {
+    TestRunner withDexCheck(Consumer<DexInspector> check) {
       dexInspectorChecks.add(check);
-      return self();
+      return this;
     }
 
-    C withClassCheck(Consumer<FoundClassSubject> check) {
+    TestRunner withClassCheck(Consumer<FoundClassSubject> check) {
       return withDexCheck(inspector -> inspector.forAllClasses(check));
     }
 
-    C withMethodCheck(Consumer<FoundMethodSubject> check) {
+    TestRunner withMethodCheck(Consumer<FoundMethodSubject> check) {
       return withClassCheck(clazz -> clazz.forAllMethods(check));
     }
 
-    <T extends InstructionSubject> C withInstructionCheck(
+    <T extends InstructionSubject> TestRunner withInstructionCheck(
         Predicate<InstructionSubject> filter, Consumer<T> check) {
       return withMethodCheck(method -> {
         if (method.isAbstract()) {
@@ -89,22 +81,22 @@
       });
     }
 
-    C withOptionConsumer(Consumer<InternalOptions> consumer) {
+    TestRunner withOptionConsumer(Consumer<InternalOptions> consumer) {
       optionConsumers.add(consumer);
-      return self();
+      return this;
     }
 
-    C withInterfaceMethodDesugaring(OffOrAuto behavior) {
+    TestRunner withInterfaceMethodDesugaring(OffOrAuto behavior) {
       return withOptionConsumer(o -> o.interfaceMethodDesugaring = behavior);
     }
 
-    C withTryWithResourcesDesugaring(OffOrAuto behavior) {
+    TestRunner withTryWithResourcesDesugaring(OffOrAuto behavior) {
       return withOptionConsumer(o -> o.tryWithResourcesDesugaring = behavior);
     }
 
-    C withBuilderTransformation(UnaryOperator<B> builderTransformation) {
+    TestRunner withBuilderTransformation(UnaryOperator<B> builderTransformation) {
       builderTransformations.add(builderTransformation);
-      return self();
+      return this;
     }
 
     void combinedOptionConsumer(InternalOptions options) {
@@ -113,18 +105,6 @@
       }
     }
 
-    Path build() throws Throwable {
-      Path inputFile = getInputJar();
-      Path out = temp.getRoot().toPath().resolve(testName + ZIP_EXTENSION);
-
-      build(inputFile, out);
-      return out;
-    }
-
-    Path getInputJar() {
-      return Paths.get(EXAMPLE_DIR, packageName + JAR_EXTENSION);
-    }
-
     void run() throws Throwable {
       if (compilationErrorExpected(testName)) {
         thrown.expect(CompilationError.class);
@@ -134,7 +114,7 @@
       }
 
       String qualifiedMainClass = packageName + "." + mainClass;
-      Path inputFile = getInputJar();
+      Path inputFile = Paths.get(EXAMPLE_DIR, packageName + JAR_EXTENSION);
       Path out = temp.getRoot().toPath().resolve(testName + ZIP_EXTENSION);
 
       build(inputFile, out);
@@ -143,6 +123,11 @@
         return;
       }
 
+      boolean expectedToFail = expectedToFail(testName);
+      if (expectedToFail) {
+        thrown.expect(Throwable.class);
+      }
+
       if (!dexInspectorChecks.isEmpty()) {
         DexInspector inspector = new DexInspector(out);
         for (Consumer<DexInspector> check : dexInspectorChecks) {
@@ -150,16 +135,21 @@
         }
       }
 
-      execute(testName, qualifiedMainClass, new Path[]{inputFile}, new Path[]{out});
+      String output = ToolHelper.runArtNoVerificationErrors(out.toString(), qualifiedMainClass);
+      if (!expectedToFail) {
+        ToolHelper.ProcessResult javaResult =
+            ToolHelper.runJava(ImmutableList.of(inputFile.toString()), qualifiedMainClass);
+        assertEquals("JVM run failed", javaResult.exitCode, 0);
+        assertTrue(
+            "JVM output does not match art output.\n\tjvm: "
+                + javaResult.stdout
+                + "\n\tart: "
+                + output,
+            output.equals(javaResult.stdout));
+      }
     }
 
-    abstract C withMinApiLevel(int minApiLevel);
-
-    C withAndroidJar(int androidJarVersion) {
-      assert this.androidJarVersion == null;
-      this.androidJarVersion = androidJarVersion;
-      return self();
-    }
+    abstract TestRunner withMinApiLevel(int minApiLevel);
 
     abstract void build(Path inputFile, Path out) throws Throwable;
   }
@@ -179,11 +169,7 @@
               // Dex version not supported
               "invokepolymorphic",
               "invokecustom",
-              "invokecustom2",
-              "DefaultMethodInAndroidJar25",
-              "StaticMethodInAndroidJar25",
-              "testMissingInterfaceDesugared2AndroidO",
-              "testCallToMissingSuperInterfaceDesugaredAndroidO"
+              "invokecustom2"
           ),
           DexVm.ART_5_1_1, ImmutableList.of(
               // API not supported
@@ -192,11 +178,7 @@
               // Dex version not supported
               "invokepolymorphic",
               "invokecustom",
-              "invokecustom2",
-              "DefaultMethodInAndroidJar25",
-              "StaticMethodInAndroidJar25",
-              "testMissingInterfaceDesugared2AndroidO",
-              "testCallToMissingSuperInterfaceDesugaredAndroidO"
+              "invokecustom2"
           ),
           DexVm.ART_6_0_1, ImmutableList.of(
               // API not supported
@@ -205,11 +187,7 @@
               // Dex version not supported
               "invokepolymorphic",
               "invokecustom",
-              "invokecustom2",
-              "DefaultMethodInAndroidJar25",
-              "StaticMethodInAndroidJar25",
-              "testMissingInterfaceDesugared2AndroidO",
-              "testCallToMissingSuperInterfaceDesugaredAndroidO"
+              "invokecustom2"
           ),
           DexVm.ART_7_0_0, ImmutableList.of(
               // API not supported
@@ -217,9 +195,7 @@
               // Dex version not supported
               "invokepolymorphic",
               "invokecustom",
-              "invokecustom2",
-              "testMissingInterfaceDesugared2AndroidO",
-              "testCallToMissingSuperInterfaceDesugaredAndroidO"
+              "invokecustom2"
           ),
           DexVm.ART_DEFAULT, ImmutableList.of(
           )
@@ -299,24 +275,6 @@
   }
 
   @Test
-  public void desugarDefaultMethodInAndroidJar25() throws Throwable {
-    test("DefaultMethodInAndroidJar25", "desugaringwithandroidjar25", "DefaultMethodInAndroidJar25")
-        .withMinApiLevel(ANDROID_K_API)
-        .withAndroidJar(ANDROID_O_API)
-        .withInterfaceMethodDesugaring(OffOrAuto.Auto)
-        .run();
-  }
-
-  @Test
-  public void desugarStaticMethodInAndroidJar25() throws Throwable {
-    test("StaticMethodInAndroidJar25", "desugaringwithandroidjar25", "StaticMethodInAndroidJar25")
-        .withMinApiLevel(ANDROID_K_API)
-        .withAndroidJar(ANDROID_O_API)
-        .withInterfaceMethodDesugaring(OffOrAuto.Auto)
-        .run();
-  }
-
-  @Test
   public void lambdaDesugaringValueAdjustments() throws Throwable {
     test("lambdadesugaring-value-adjustments", "lambdadesugaring", "ValueAdjustments")
         .withMinApiLevel(ANDROID_K_API)
@@ -366,34 +324,5 @@
         .run();
   }
 
-  abstract RunExamplesAndroidOTest<B>.TestRunner<?> test(String testName, String packageName, String mainClass);
-
-  void execute(
-      String testName,
-      String qualifiedMainClass, Path[] jars, Path[] dexes)
-      throws IOException {
-
-    boolean expectedToFail = expectedToFail(testName);
-    if (expectedToFail) {
-      thrown.expect(Throwable.class);
-    }
-    String output = ToolHelper.runArtNoVerificationErrors(
-        Arrays.stream(dexes).map(path -> path.toString()).collect(Collectors.toList()),
-        qualifiedMainClass,
-        null);
-    if (!expectedToFail) {
-      ToolHelper.ProcessResult javaResult =
-          ToolHelper.runJava(
-              Arrays.stream(jars).map(path -> path.toString()).collect(Collectors.toList()),
-              qualifiedMainClass);
-      assertEquals("JVM run failed", javaResult.exitCode, 0);
-      assertTrue(
-          "JVM output does not match art output.\n\tjvm: "
-              + javaResult.stdout
-              + "\n\tart: "
-              + output,
-          output.equals(javaResult.stdout));
-    }
-  }
-
+  abstract TestRunner test(String testName, String packageName, String mainClass);
 }
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 72e9e81..663d6bd 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -14,11 +14,15 @@
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.shaking.ProguardConfiguration;
 import com.android.tools.r8.shaking.ProguardConfigurationParser;
+import com.android.tools.r8.shaking.ProguardConfigurationRule;
 import com.android.tools.r8.shaking.ProguardRuleParserException;
+import com.android.tools.r8.shaking.RootSetBuilder;
+import com.android.tools.r8.shaking.RootSetBuilder.RootSet;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.ListUtils;
 import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.ThreadUtils;
 import com.android.tools.r8.utils.Timing;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
diff --git a/src/test/java/com/android/tools/r8/desugar/BasicTestDependenciesDesugaringTest.java b/src/test/java/com/android/tools/r8/desugar/BasicTestDependenciesDesugaringTest.java
index 39d90d6..b6debff 100644
--- a/src/test/java/com/android/tools/r8/desugar/BasicTestDependenciesDesugaringTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/BasicTestDependenciesDesugaringTest.java
@@ -45,6 +45,14 @@
   }
 
   private static Set<String> knownIssues = Sets.newHashSet(new String[]{
+      "espresso-core-3.0.0.jar",
+      "hamcrest-integration-1.3.jar",
+      "hamcrest-library-1.3.jar",
+      "junit-4.12.jar",
+      "support-core-ui-25.4.0.jar",
+      "support-media-compat-25.4.0.jar",
+      "support-fragment-25.4.0.jar",
+      "support-compat-25.4.0.jar"
   });
 
   @Rule
@@ -90,18 +98,4 @@
         .build(),
         options -> options.interfaceMethodDesugaring = OffOrAuto.Auto);
   }
-
-  @Test
-  public void testCompileDontDesugarDefault() throws IOException, CompilationException {
-    if (knownIssues.contains(name)) {
-      thrown.expect(CompilationError.class);
-    }
-    ToolHelper.runD8(
-        D8Command.builder().addClasspathFiles(classpath)
-        .addProgramFiles(toCompile)
-        .addLibraryFiles(Paths.get(ToolHelper.getAndroidJar(Constants.ANDROID_K_API)))
-        .setMinApiLevel(Constants.ANDROID_K_API)
-        .build(),
-        options -> options.interfaceMethodDesugaring = OffOrAuto.Off);
-  }
 }
