diff --git a/build.gradle b/build.gradle
index 58b0aaf..b4b63dd 100644
--- a/build.gradle
+++ b/build.gradle
@@ -12,6 +12,7 @@
 apply from: 'copyAdditionalJctfCommonFiles.gradle'
 
 repositories {
+    maven { url 'https://maven.google.com' }
     mavenCentral()
 }
 
@@ -94,6 +95,10 @@
     }
 }
 
+configurations {
+    supportLibs
+}
+
 dependencies {
     compile 'net.sf.jopt-simple:jopt-simple:4.6'
     compile group: 'com.google.guava', name: 'guava', version: '19.0'
@@ -114,6 +119,9 @@
     examplesAndroidOCompile group: 'org.ow2.asm', name: 'asm', version: '5.1'
     examplesCompile 'com.google.protobuf:protobuf-lite:3.0.0'
     examplesRuntime 'com.google.protobuf:protobuf-lite:3.0.0'
+    supportLibs 'com.android.support:support-v4:25.4.0'
+    supportLibs 'junit:junit:4.12'
+    supportLibs 'com.android.support.test.espresso:espresso-core:3.0.0'
 }
 
 protobuf {
@@ -791,7 +799,56 @@
     includeEmptyDirs = false
 }
 
+task supportLibDir() {
+    doLast {
+        File dir = file("build/supportlibraries")
+        dir.mkdir()
+    }
+}
+
+configurations.supportLibs.files.each { file ->
+    if (file.getName().endsWith(".aar")) {
+        def name = "extract_"+file.getName()
+        task "${name}"(type: Copy) {
+            dependsOn supportLibDir
+            from zipTree(file)
+            into "build/supportlibraries"
+            eachFile { FileCopyDetails fcp ->
+                if (fcp.relativePath.pathString.equals("classes.jar")) {
+                    // remap the file to the root with correct name
+                    fcp.relativePath = new RelativePath(true, file.getName().replace(".aar", ".jar"))
+                } else {
+                    fcp.exclude()
+                }
+            }
+        }
+    }
+}
+
+task supportLibList() {
+    configurations.supportLibs.files.each {
+        if (it.getName().endsWith(".aar")) {
+            dependsOn "extract_"+it.getName()
+        }
+    }
+    doLast {
+        def file = file("build/generated/supportlibraries.txt")
+        file.createNewFile()
+        file.text = ""
+        configurations.supportLibs.files.each {
+            if (it.getName().endsWith(".aar")) {
+                def outName =  it.getName().replace(".aar", ".jar")
+                file.text += ("build/supportlibraries/"
+                  + outName + "\n")
+            } else {
+                file.text += (it.getPath() + "\n")
+            }
+        }
+    }
+}
+
 test {
+    dependsOn supportLibList
     testLogging.exceptionFormat = 'full'
     if (project.hasProperty('print_test_stdout')) {
         testLogging.showStandardStreams = true
diff --git a/src/test/java/com/android/tools/r8/desugar/BasicTestDependenciesDesugaringTest.java b/src/test/java/com/android/tools/r8/desugar/BasicTestDependenciesDesugaringTest.java
new file mode 100644
index 0000000..b6debff
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugar/BasicTestDependenciesDesugaringTest.java
@@ -0,0 +1,101 @@
+// 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 com.android.tools.r8.desugar;
+
+import com.android.tools.r8.CompilationException;
+import com.android.tools.r8.D8Command;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.dex.Constants;
+import com.android.tools.r8.errors.CompilationError;
+import com.android.tools.r8.utils.OffOrAuto;
+import com.google.common.collect.Sets;
+import java.io.File;
+import java.io.IOException;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.Paths;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collection;
+import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.ExpectedException;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class BasicTestDependenciesDesugaringTest {
+
+  private static final String CLASSPATH_SEPARATOR = File.pathSeparator;
+
+  private static final String[] allLibs;
+  static {
+    try {
+      allLibs =
+          Files.readAllLines(Paths.get(ToolHelper.BUILD_DIR, "generated", "supportlibraries.txt"))
+          .toArray(new String[0]);
+    } catch (IOException e) {
+      throw new AssertionError(e);
+    }
+  }
+
+  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
+  public ExpectedException thrown = ExpectedException.none();
+
+  @Parameters(name = "{0}")
+  public static Collection<String[]> data() {
+    int libCount = allLibs.length;
+    Collection<String[]> datas = new ArrayList<String[]>(libCount);
+    for (int i = 0; i < libCount; i++) {
+      StringBuilder classpath = new StringBuilder();
+      for (int j = 0; j < libCount; j++) {
+        if (j != i) {
+          classpath.append(allLibs[j]).append(CLASSPATH_SEPARATOR);
+        }
+      }
+      datas.add(new String[] {new File(allLibs[i]).getName(), allLibs[i], classpath.toString()});
+    }
+    return datas;
+  }
+
+  private String name;
+  private Path toCompile;
+  private List<Path> classpath;
+
+  public  BasicTestDependenciesDesugaringTest(String name, String toCompile, String classpath) {
+    this.name = name;
+    this.toCompile = Paths.get(toCompile);
+    this.classpath = Arrays.asList(classpath.split(CLASSPATH_SEPARATOR)).stream()
+        .map(string -> Paths.get(string)).collect(Collectors.toList());
+  }
+
+  @Test
+  public void testCompile() 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.Auto);
+  }
+}
