diff --git a/src/main/java/com/android/tools/r8/BaseCommand.java b/src/main/java/com/android/tools/r8/BaseCommand.java
index 3141dfe..ec4f527 100644
--- a/src/main/java/com/android/tools/r8/BaseCommand.java
+++ b/src/main/java/com/android/tools/r8/BaseCommand.java
@@ -131,15 +131,9 @@
       return self();
     }
 
-    /** Add classpath file resources. */
-    public B addClasspathFiles(Path... files) throws IOException {
-      app.addClasspathFiles(files);
-      return self();
-    }
-
-    /** Add classpath file resources. */
-    public B addClasspathFiles(Collection<Path> files) throws IOException {
-      app.addClasspathFiles(files);
+    /** Add library file resource provider. */
+    public B addLibraryResourceProvider(ClassFileResourceProvider provider) {
+      getAppBuilder().addLibraryResourceProvider(provider);
       return self();
     }
 
diff --git a/src/main/java/com/android/tools/r8/D8Command.java b/src/main/java/com/android/tools/r8/D8Command.java
index 941a890..cbd16fd 100644
--- a/src/main/java/com/android/tools/r8/D8Command.java
+++ b/src/main/java/com/android/tools/r8/D8Command.java
@@ -3,19 +3,16 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8;
 
-import static com.android.tools.r8.utils.FileUtils.isArchive;
-
+import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.OffOrAuto;
 import com.android.tools.r8.utils.OutputMode;
-import com.android.tools.r8.utils.PreloadedClassFileProvider;
 import com.google.common.collect.ImmutableList;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.util.Arrays;
 import java.util.Collection;
 
 /**
@@ -46,35 +43,13 @@
 
     /** Add classpath file resources. */
     public Builder addClasspathFiles(Path... files) throws IOException {
-      return addClasspathFiles(Arrays.asList(files));
+      getAppBuilder().addClasspathFiles(files);
+      return this;
     }
 
     /** Add classpath file resources. */
     public Builder addClasspathFiles(Collection<Path> files) throws IOException {
-      for (Path file : files) {
-        if (isArchive(file)) {
-          addClasspathResourceProvider(PreloadedClassFileProvider.fromArchive(file));
-        } else {
-          super.addClasspathFiles(file);
-        }
-      }
-      return this;
-    }
-
-    /** Add library file resources. */
-    public Builder addLibraryFiles(Path... files) throws IOException {
-      return addLibraryFiles(Arrays.asList(files));
-    }
-
-    /** Add library file resources. */
-    public Builder addLibraryFiles(Collection<Path> files) throws IOException {
-      for (Path file : files) {
-        if (isArchive(file)) {
-          addLibraryResourceProvider(PreloadedClassFileProvider.fromArchive(file));
-        } else {
-          super.addLibraryFiles(file);
-        }
-      }
+      getAppBuilder().addClasspathFiles(files);
       return this;
     }
 
@@ -83,11 +58,6 @@
       return this;
     }
 
-    public Builder addLibraryResourceProvider(ClassFileResourceProvider provider) {
-      getAppBuilder().addLibraryResourceProvider(provider);
-      return this;
-    }
-
     @Override
     Builder self() {
       return this;
@@ -136,49 +106,53 @@
     CompilationMode modeSet = null;
     Path outputPath = null;
     Builder builder = builder();
-    for (int i = 0; i < args.length; i++) {
-      String arg = args[i].trim();
-      if (arg.length() == 0) {
-        continue;
-      } else if (arg.equals("--help")) {
-        builder.setPrintHelp(true);
-      } else if (arg.equals("--version")) {
-        builder.setPrintVersion(true);
-      } else if (arg.equals("--debug")) {
-        if (modeSet == CompilationMode.RELEASE) {
-          throw new CompilationException("Cannot compile in both --debug and --release mode.");
+    try {
+      for (int i = 0; i < args.length; i++) {
+        String arg = args[i].trim();
+        if (arg.length() == 0) {
+          continue;
+        } else if (arg.equals("--help")) {
+          builder.setPrintHelp(true);
+        } else if (arg.equals("--version")) {
+          builder.setPrintVersion(true);
+        } else if (arg.equals("--debug")) {
+          if (modeSet == CompilationMode.RELEASE) {
+            throw new CompilationException("Cannot compile in both --debug and --release mode.");
+          }
+          builder.setMode(CompilationMode.DEBUG);
+          modeSet = CompilationMode.DEBUG;
+        } else if (arg.equals("--release")) {
+          if (modeSet == CompilationMode.DEBUG) {
+            throw new CompilationException("Cannot compile in both --debug and --release mode.");
+          }
+          builder.setMode(CompilationMode.RELEASE);
+          modeSet = CompilationMode.RELEASE;
+        } else if (arg.equals("--file-per-class")) {
+          builder.setOutputMode(OutputMode.FilePerClass);
+        } else if (arg.equals("--output")) {
+          String output = args[++i];
+          if (outputPath != null) {
+            throw new CompilationException(
+                "Cannot output both to '" + outputPath.toString() + "' and '" + output + "'");
+          }
+          outputPath = Paths.get(output);
+        } else if (arg.equals("--lib")) {
+          builder.addLibraryFiles(Paths.get(args[++i]));
+        } else if (arg.equals("--classpath")) {
+          builder.addClasspathFiles(Paths.get(args[++i]));
+        } else if (arg.equals("--min-api")) {
+          builder.setMinApiLevel(Integer.valueOf(args[++i]));
+        } else {
+          if (arg.startsWith("--")) {
+            throw new CompilationException("Unknown option: " + arg);
+          }
+          builder.addProgramFiles(Paths.get(arg));
         }
-        builder.setMode(CompilationMode.DEBUG);
-        modeSet = CompilationMode.DEBUG;
-      } else if (arg.equals("--release")) {
-        if (modeSet == CompilationMode.DEBUG) {
-          throw new CompilationException("Cannot compile in both --debug and --release mode.");
-        }
-        builder.setMode(CompilationMode.RELEASE);
-        modeSet = CompilationMode.RELEASE;
-      } else if (arg.equals("--file-per-class")) {
-        builder.setOutputMode(OutputMode.FilePerClass);
-      } else if (arg.equals("--output")) {
-        String output = args[++i];
-        if (outputPath != null) {
-          throw new CompilationException(
-              "Cannot output both to '" + outputPath.toString() + "' and '" + output + "'");
-        }
-        outputPath = Paths.get(output);
-      } else if (arg.equals("--lib")) {
-        builder.addLibraryFiles(Paths.get(args[++i]));
-      } else if (arg.equals("--classpath")) {
-        builder.addClasspathFiles(Paths.get(args[++i]));
-      } else if (arg.equals("--min-api")) {
-        builder.setMinApiLevel(Integer.valueOf(args[++i]));
-      } else {
-        if (arg.startsWith("--")) {
-          throw new CompilationException("Unknown option: " + arg);
-        }
-        builder.addProgramFiles(Paths.get(arg));
       }
+      return builder.setOutputPath(outputPath);
+    } catch (CompilationError e) {
+      throw new CompilationException(e.getMessage(), e);
     }
-    return builder.setOutputPath(outputPath);
   }
 
   private D8Command(
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
index c7a66c2..36b65d7 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationReader.java
@@ -213,11 +213,7 @@
 
     void readSources() throws IOException, ExecutionException {
       readDexSources(inputApp.getDexProgramResources(), PROGRAM, programClasses);
-      readDexSources(inputApp.getDexClasspathResources(), CLASSPATH, classpathClasses);
-      readDexSources(inputApp.getDexLibraryResources(), LIBRARY, libraryClasses);
       readClassSources(inputApp.getClassProgramResources(), PROGRAM, programClasses);
-      readClassSources(inputApp.getClassClasspathResources(), CLASSPATH, classpathClasses);
-      readClassSources(inputApp.getClassLibraryResources(), LIBRARY, libraryClasses);
     }
 
     private <T extends DexClass> ClassProvider<T> buildClassProvider(ClassKind classKind,
diff --git a/src/main/java/com/android/tools/r8/graph/DexApplication.java b/src/main/java/com/android/tools/r8/graph/DexApplication.java
index e57cd05..2c9366c 100644
--- a/src/main/java/com/android/tools/r8/graph/DexApplication.java
+++ b/src/main/java/com/android/tools/r8/graph/DexApplication.java
@@ -126,6 +126,9 @@
   }
 
   public DexClass definitionFor(DexType type) {
+    if (type == null) {
+      return null;
+    }
     DexClass clazz = programClasses.get(type);
     if (clazz == null && classpathClasses != null) {
       clazz = classpathClasses.get(type);
diff --git a/src/main/java/com/android/tools/r8/utils/AndroidApp.java b/src/main/java/com/android/tools/r8/utils/AndroidApp.java
index 7d8bada..3877f1a 100644
--- a/src/main/java/com/android/tools/r8/utils/AndroidApp.java
+++ b/src/main/java/com/android/tools/r8/utils/AndroidApp.java
@@ -10,8 +10,6 @@
 import com.android.tools.r8.ClassFileResourceProvider;
 import com.android.tools.r8.Resource;
 import com.android.tools.r8.errors.CompilationError;
-import com.android.tools.r8.errors.Unreachable;
-import com.android.tools.r8.graph.ClassKind;
 import com.google.common.collect.ImmutableList;
 import com.google.common.io.ByteStreams;
 import com.google.common.io.Closer;
@@ -52,8 +50,6 @@
   public static final String DEFAULT_PROGUARD_MAP_FILE = "proguard.map";
 
   private final ImmutableList<Resource> programResources;
-  private final ImmutableList<Resource> classpathResources;
-  private final ImmutableList<Resource> libraryResources;
   private final ImmutableList<ClassFileResourceProvider> classpathResourceProviders;
   private final ImmutableList<ClassFileResourceProvider> libraryResourceProviders;
   private final Resource proguardMap;
@@ -64,8 +60,6 @@
   // See factory methods and AndroidApp.Builder below.
   private AndroidApp(
       ImmutableList<Resource> programResources,
-      ImmutableList<Resource> classpathResources,
-      ImmutableList<Resource> libraryResources,
       ImmutableList<ClassFileResourceProvider> classpathResourceProviders,
       ImmutableList<ClassFileResourceProvider> libraryResourceProviders,
       Resource proguardMap,
@@ -73,8 +67,6 @@
       Resource packageDistribution,
       Resource mainDexList) {
     this.programResources = programResources;
-    this.classpathResources = classpathResources;
-    this.libraryResources = libraryResources;
     this.classpathResourceProviders = classpathResourceProviders;
     this.libraryResourceProviders = libraryResourceProviders;
     this.proguardMap = proguardMap;
@@ -156,26 +148,6 @@
     return filter(programResources, Resource.Kind.CLASSFILE);
   }
 
-  /** Get input streams for all dex program classpath resources. */
-  public List<Resource> getDexClasspathResources() {
-    return filter(classpathResources, Resource.Kind.DEX);
-  }
-
-  /** Get input streams for all Java-bytecode classpath resources. */
-  public List<Resource> getClassClasspathResources() {
-    return filter(classpathResources, Resource.Kind.CLASSFILE);
-  }
-
-  /** Get input streams for all dex library resources. */
-  public List<Resource> getDexLibraryResources() {
-    return filter(libraryResources, Resource.Kind.DEX);
-  }
-
-  /** Get input streams for all Java-bytecode library resources. */
-  public List<Resource> getClassLibraryResources() {
-    return filter(libraryResources, Resource.Kind.CLASSFILE);
-  }
-
   /** Get classpath resource providers. */
   public List<ClassFileResourceProvider> getClasspathResourceProviders() {
     return classpathResourceProviders;
@@ -371,8 +343,6 @@
   public static class Builder {
 
     private final List<Resource> programResources = new ArrayList<>();
-    private final List<Resource> classpathResources = new ArrayList<>();
-    private final List<Resource> libraryResources = new ArrayList<>();
     private final List<ClassFileResourceProvider> classpathResourceProviders = new ArrayList<>();
     private final List<ClassFileResourceProvider> libraryResourceProviders = new ArrayList<>();
     private Resource proguardMap;
@@ -387,8 +357,6 @@
     // See AndroidApp::builder(AndroidApp).
     private Builder(AndroidApp app) {
       programResources.addAll(app.programResources);
-      classpathResources.addAll(app.classpathResources);
-      libraryResources.addAll(app.libraryResources);
       classpathResourceProviders.addAll(app.classpathResourceProviders);
       libraryResourceProviders.addAll(app.libraryResourceProviders);
       proguardMap = app.proguardMap;
@@ -409,10 +377,10 @@
      * @param directory Directory containing dex program files and optional proguard-map file.
      */
     public Builder addProgramDirectory(Path directory) throws IOException {
-      File[] resources = directory.toFile().listFiles(file -> isDexFile(file.toPath()));
-      for (File source : resources) {
-        addFile(source.toPath(), ClassKind.PROGRAM);
-      }
+      List<Path> resources =
+          Arrays.asList(directory.toFile().listFiles(file -> isDexFile(file.toPath()))).stream()
+          .map(file -> file.toPath()).collect(Collectors.toList());
+      addProgramFiles(resources);
       File mapFile = new File(directory.toFile(), DEFAULT_PROGUARD_MAP_FILE);
       if (mapFile.exists()) {
         setProguardMapFile(mapFile.toPath());
@@ -432,7 +400,7 @@
      */
     public Builder addProgramFiles(Collection<Path> files) throws IOException {
       for (Path file : files) {
-        addFile(file, ClassKind.PROGRAM);
+        addProgramFile(file);
       }
       return this;
     }
@@ -449,7 +417,7 @@
      */
     public Builder addClasspathFiles(Collection<Path> files) throws IOException {
       for (Path file : files) {
-        addFile(file, ClassKind.CLASSPATH);
+        addClassProvider(file, classpathResourceProviders);
       }
       return this;
     }
@@ -474,7 +442,7 @@
      */
     public Builder addLibraryFiles(Collection<Path> files) throws IOException {
       for (Path file : files) {
-        addFile(file, ClassKind.LIBRARY);
+        addClassProvider(file, libraryResourceProviders);
       }
       return this;
     }
@@ -491,7 +459,7 @@
      * Add dex program-data with class descriptor.
      */
     public Builder addDexProgramData(byte[] data, Set<String> classDescriptors) {
-      resources(ClassKind.PROGRAM).add(
+      programResources.add(
           Resource.fromBytes(Resource.Kind.DEX, data, classDescriptors));
       return this;
     }
@@ -508,7 +476,7 @@
      */
     public Builder addDexProgramData(Collection<byte[]> data) {
       for (byte[] datum : data) {
-        resources(ClassKind.PROGRAM).add(Resource.fromBytes(Resource.Kind.DEX, datum));
+        programResources.add(Resource.fromBytes(Resource.Kind.DEX, datum));
       }
       return this;
     }
@@ -525,7 +493,7 @@
      */
     public Builder addClassProgramData(Collection<byte[]> data) {
       for (byte[] datum : data) {
-        resources(ClassKind.PROGRAM).add(Resource.fromBytes(Resource.Kind.CLASSFILE, datum));
+        programResources.add(Resource.fromBytes(Resource.Kind.CLASSFILE, datum));
       }
       return this;
     }
@@ -591,8 +559,6 @@
     public AndroidApp build() {
       return new AndroidApp(
           ImmutableList.copyOf(programResources),
-          ImmutableList.copyOf(classpathResources),
-          ImmutableList.copyOf(libraryResources),
           ImmutableList.copyOf(classpathResourceProviders),
           ImmutableList.copyOf(libraryResourceProviders),
           proguardMap,
@@ -601,34 +567,36 @@
           mainDexList);
     }
 
-    private List<Resource> resources(ClassKind classKind) {
-      switch (classKind) {
-        case PROGRAM:
-          return programResources;
-        case CLASSPATH:
-          return classpathResources;
-        case LIBRARY:
-          return libraryResources;
-      }
-      throw new Unreachable();
-    }
-
-    private void addFile(Path file, ClassKind classKind) throws IOException {
+    private void addProgramFile(Path file) throws IOException {
       if (!Files.exists(file)) {
         throw new FileNotFoundException("Non-existent input file: " + file);
       }
       if (isDexFile(file)) {
-        resources(classKind).add(Resource.fromFile(Resource.Kind.DEX, file));
+        programResources.add(Resource.fromFile(Resource.Kind.DEX, file));
       } else if (isClassFile(file)) {
-        resources(classKind).add(Resource.fromFile(Resource.Kind.CLASSFILE, file));
+        programResources.add(Resource.fromFile(Resource.Kind.CLASSFILE, file));
       } else if (isArchive(file)) {
-        addArchive(file, classKind);
+        addProgramArchive(file);
       } else {
         throw new CompilationError("Unsupported source file type for file: " + file);
       }
     }
 
-    private void addArchive(Path archive, ClassKind classKind) throws IOException {
+    private void addClassProvider(Path file, List<ClassFileResourceProvider> providerList)
+        throws IOException {
+      if (!Files.exists(file)) {
+        throw new FileNotFoundException("Non-existent input file: " + file);
+      }
+      if (isArchive(file)) {
+        providerList.add(PreloadedClassFileProvider.fromArchive(file));
+      } else if (Files.isDirectory(file) ) {
+        providerList.add(DirectoryClassFileProvider.fromDirectory(file));
+      } else {
+        throw new CompilationError("Unsupported source file type for file: " + file);
+      }
+    }
+
+    private void addProgramArchive(Path archive) throws IOException {
       assert isArchive(archive);
       boolean containsDexData = false;
       boolean containsClassData = false;
@@ -638,12 +606,12 @@
           Path name = Paths.get(entry.getName());
           if (isDexFile(name)) {
             containsDexData = true;
-            resources(classKind).add(Resource.fromBytes(
+            programResources.add(Resource.fromBytes(
                 Resource.Kind.DEX, ByteStreams.toByteArray(stream)));
           } else if (isClassFile(name)) {
             containsClassData = true;
             String descriptor = PreloadedClassFileProvider.guessTypeDescriptor(name);
-            resources(classKind).add(Resource.fromBytes(Resource.Kind.CLASSFILE,
+            programResources.add(Resource.fromBytes(Resource.Kind.CLASSFILE,
                 ByteStreams.toByteArray(stream), Collections.singleton(descriptor)));
           }
         }
diff --git a/src/main/java/com/android/tools/r8/utils/DirectoryClassFileProvider.java b/src/main/java/com/android/tools/r8/utils/DirectoryClassFileProvider.java
index c060ead..7de53d2 100644
--- a/src/main/java/com/android/tools/r8/utils/DirectoryClassFileProvider.java
+++ b/src/main/java/com/android/tools/r8/utils/DirectoryClassFileProvider.java
@@ -69,6 +69,10 @@
     return new DirectoryClassFileProvider(dir.toAbsolutePath());
   }
 
+  public Path getRoot() {
+    return root;
+  }
+
   @Override
   public String toString() {
     return "directory(" + root + ")";
diff --git a/src/main/java/com/android/tools/r8/utils/ZipUtils.java b/src/main/java/com/android/tools/r8/utils/ZipUtils.java
index 59f0702..47d8e01 100644
--- a/src/main/java/com/android/tools/r8/utils/ZipUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/ZipUtils.java
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.utils;
 
+import com.android.tools.r8.errors.CompilationError;
 import com.google.common.io.ByteStreams;
 import java.io.File;
 import java.io.FileInputStream;
 import java.io.FileOutputStream;
 import java.io.IOException;
+import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.List;
 import java.util.function.Predicate;
@@ -35,11 +37,18 @@
 
   public static List<File> unzip(String zipFile, File outDirectory, Predicate<ZipEntry> filter)
       throws IOException {
+    final Path outDirectoryPath = outDirectory.toPath();
     final List<File> outFiles = new ArrayList<>();
       iter(zipFile, (entry, input) -> {
         String name = entry.getName();
-        if (filter.test(entry)) {
-          File outFile = outDirectory.toPath().resolve(name).toFile();
+        if (!entry.isDirectory() && filter.test(entry)) {
+          if (name.contains("..")) {
+            // Protect against malicious archives.
+            throw new CompilationError("Invalid entry name \"" + name + "\"");
+          }
+          Path outPath = outDirectoryPath.resolve(name);
+          File outFile = outPath.toFile();
+          outFile.getParentFile().mkdirs();
           FileOutputStream output = new FileOutputStream(outFile);
           ByteStreams.copy(input, output);
           outFiles.add(outFile);
diff --git a/src/test/java/com/android/tools/r8/D8LazyRunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/D8LazyRunExamplesAndroidOTest.java
index 34cd83c..9c80561 100644
--- a/src/test/java/com/android/tools/r8/D8LazyRunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/D8LazyRunExamplesAndroidOTest.java
@@ -4,10 +4,26 @@
 
 package com.android.tools.r8;
 
+import static com.android.tools.r8.dex.Constants.ANDROID_K_API;
+import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
+import static org.junit.Assert.assertTrue;
+
+import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.DirectoryClassFileProvider;
+import com.android.tools.r8.utils.FileUtils;
+import com.android.tools.r8.utils.OffOrAuto;
 import com.android.tools.r8.utils.PreloadedClassFileProvider;
+import com.android.tools.r8.utils.ZipUtils;
 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.Iterator;
+import java.util.List;
+import java.util.stream.Collectors;
+import org.junit.Test;
 
 public class D8LazyRunExamplesAndroidOTest
     extends D8IncrementalRunExamplesAndroidOTest {
@@ -39,4 +55,64 @@
   D8IncrementalTestRunner test(String testName, String packageName, String mainClass) {
     return new D8LazyTestRunner(testName, packageName, mainClass);
   }
+
+  @Test
+  public void dexPerClassFileWithDesugaringAndFolderClasspath() throws Throwable {
+    int minAPILevel = ANDROID_K_API;
+    Path inputFile =
+        Paths.get(ToolHelper.EXAMPLES_ANDROID_N_BUILD_DIR, "interfacemethods" + JAR_EXTENSION);
+    Path tmpClassesDir = temp.newFolder().toPath();
+    ZipUtils.unzip(inputFile.toString(), tmpClassesDir.toFile());
+    Path androidJar = Paths.get(ToolHelper.getAndroidJar(minAPILevel));
+
+    // Build all at once.
+    AndroidApp fullBuildResult;
+    {
+      D8Command command = D8Command.builder()
+          .setMinApiLevel(minAPILevel)
+          .addLibraryFiles(androidJar)
+          .addProgramFiles(inputFile)
+          .build();
+
+      fullBuildResult = ToolHelper.runD8(
+          command, (options) -> options.interfaceMethodDesugaring = OffOrAuto.Auto);
+    }
+
+    // Build each class individually using tmpClassesDir as classpath for desugaring.
+    List<Resource> individalDexes = new ArrayList<>();
+    List<Path> individualClassFiles =
+        Files.walk(tmpClassesDir)
+        .filter(classFile -> FileUtils.isClassFile(classFile))
+        .collect(Collectors.toList());
+    for (Path classFile : individualClassFiles) {
+      D8Command.Builder builder =
+          D8Command.builder()
+              .setMinApiLevel(minAPILevel)
+              .addLibraryFiles(androidJar)
+              .addClasspathFiles(tmpClassesDir)
+              .addProgramFiles(classFile);
+      AndroidApp individualResult =
+          ToolHelper.runD8(
+              builder.build(),
+              (options) -> options.interfaceMethodDesugaring = OffOrAuto.Auto);
+      individalDexes.add(individualResult.getDexProgramResources().get(0));
+    }
+    AndroidApp mergedResult = mergeDexResources(minAPILevel, individalDexes);
+
+    assertTrue(Arrays.equals(
+        readFromResource(fullBuildResult.getDexProgramResources().get(0)),
+        readFromResource(mergedResult.getDexProgramResources().get(0))));
+  }
+
+  private AndroidApp mergeDexResources(int minAPILevel, List<Resource> individalDexes)
+      throws IOException, CompilationException {
+    D8Command.Builder builder = D8Command.builder()
+        .setMinApiLevel(minAPILevel);
+    for (Resource resource : individalDexes) {
+      builder.addDexProgramData(readFromResource(resource));
+    }
+    AndroidApp mergedResult = ToolHelper.runD8(builder.build());
+    return mergedResult;
+  }
+
 }
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index e74eb2c..e01ecc0 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -455,7 +455,7 @@
         throws ProguardRuleParserException, ExecutionException, IOException {
    // TODO(zerny): Should we really be adding the android library in ToolHelper?
     AndroidApp app = command.getInputApp();
-    if (app.getClassLibraryResources().isEmpty()) {
+    if (app.getLibraryResourceProviders().isEmpty()) {
       app =
           AndroidApp.builder(app)
               .addLibraryFiles(Paths.get(getAndroidJar(command.getMinApiLevel())))
diff --git a/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingTest.java b/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingTest.java
index c617c25..a80f46d 100644
--- a/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingTest.java
+++ b/src/test/java/com/android/tools/r8/memberrebinding/MemberRebindingTest.java
@@ -40,10 +40,8 @@
 public class MemberRebindingTest {
 
   private static final String ANDROID_JAR = ToolHelper.getDefaultAndroidJar();
-  private static final List<String> JAR_LIBRARIES = ImmutableList
-      .of(ANDROID_JAR, ToolHelper.EXAMPLES_BUILD_DIR + "memberrebindinglib.jar");
-  private static final List<String> DEX_LIBRARIES = ImmutableList
-      .of(ANDROID_JAR, ToolHelper.EXAMPLES_BUILD_DIR + "memberrebindinglib/classes.dex");
+  private static final List<Path> JAR_LIBRARIES = ListUtils.map(ImmutableList
+      .of(ANDROID_JAR, ToolHelper.EXAMPLES_BUILD_DIR + "memberrebindinglib.jar"), Paths::get);
 
   private enum Frontend {
     DEX, JAR;
@@ -82,14 +80,13 @@
       throws IOException, ProguardRuleParserException, ExecutionException, CompilationException {
     // Generate R8 processed version without library option.
     String out = temp.getRoot().getCanonicalPath();
-    List<String> libs = kind == Frontend.DEX ? DEX_LIBRARIES : JAR_LIBRARIES;
     // NOTE: It is important to turn off inlining to ensure
     // dex inspection of invokes is predictable.
     ToolHelper.runR8(
         R8Command.builder()
             .setOutputPath(Paths.get(out))
             .addProgramFiles(programFile)
-            .addLibraryFiles(ListUtils.map(libs, Paths::get))
+            .addLibraryFiles(JAR_LIBRARIES)
             .setMinApiLevel(minApiLevel)
             .build(),
         options -> options.inlineAccessors = false);
diff --git a/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java b/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java
index 0904569..3487694 100644
--- a/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java
+++ b/src/test/java/com/android/tools/r8/shaking/TreeShakingTest.java
@@ -57,10 +57,8 @@
 public class TreeShakingTest {
 
   private static final String ANDROID_JAR = ToolHelper.getDefaultAndroidJar();
-  private static final List<String> JAR_LIBRARIES = ImmutableList
-      .of(ANDROID_JAR, ToolHelper.EXAMPLES_BUILD_DIR + "shakinglib.jar");
-  private static final List<String> DEX_LIBRARIES = ImmutableList
-      .of(ANDROID_JAR, ToolHelper.EXAMPLES_BUILD_DIR + "shakinglib/classes.dex");
+  private static final List<Path> JAR_LIBRARIES = ListUtils.map(ImmutableList
+      .of(ANDROID_JAR, ToolHelper.EXAMPLES_BUILD_DIR + "shakinglib.jar"), Paths::get);
   private static final String EMPTY_FLAGS = "src/test/proguard/valid/empty.flags";
   private static Set<String> IGNORED = ImmutableSet.of(
       // there's no point in running those without obfuscation
@@ -116,7 +114,6 @@
       throws IOException, ProguardRuleParserException, ExecutionException, CompilationException {
     // Generate R8 processed version without library option.
     Path out = temp.getRoot().toPath();
-    List<String> libs = kind == Frontend.DEX ? DEX_LIBRARIES : JAR_LIBRARIES;
     boolean inline = programFile.contains("inlining");
 
     R8Command command =
@@ -124,7 +121,7 @@
             .setOutputPath(out)
             .addProgramFiles(Paths.get(programFile))
             .addProguardConfigurationFiles(ListUtils.map(keepRulesFiles, Paths::get))
-            .addLibraryFiles(ListUtils.map(libs, Paths::get))
+            .addLibraryFiles(JAR_LIBRARIES)
             .setMinification(minify)
             .build();
     ToolHelper.runR8(command, options -> {
diff --git a/src/test/java/com/android/tools/r8/utils/D8CommandTest.java b/src/test/java/com/android/tools/r8/utils/D8CommandTest.java
index 1db48c4..5bae2ed 100644
--- a/src/test/java/com/android/tools/r8/utils/D8CommandTest.java
+++ b/src/test/java/com/android/tools/r8/utils/D8CommandTest.java
@@ -4,6 +4,7 @@
 package com.android.tools.r8.utils;
 
 import static com.android.tools.r8.ToolHelper.EXAMPLES_BUILD_DIR;
+import static com.android.tools.r8.utils.FileUtils.JAR_EXTENSION;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
@@ -48,8 +49,6 @@
   private void verifyEmptyCommand(D8Command command) {
     assertEquals(0, ToolHelper.getApp(command).getDexProgramResources().size());
     assertEquals(0, ToolHelper.getApp(command).getClassProgramResources().size());
-    assertEquals(0, ToolHelper.getApp(command).getDexLibraryResources().size());
-    assertEquals(0, ToolHelper.getApp(command).getClassLibraryResources().size());
     assertFalse(ToolHelper.getApp(command).hasMainDexList());
     assertFalse(ToolHelper.getApp(command).hasProguardMap());
     assertFalse(ToolHelper.getApp(command).hasProguardSeeds());
@@ -164,6 +163,40 @@
   }
 
   @Test
+  public void folderLibAndClasspath() throws Throwable {
+    Path inputFile =
+        Paths.get(ToolHelper.EXAMPLES_ANDROID_N_BUILD_DIR, "interfacemethods" + JAR_EXTENSION);
+    Path tmpClassesDir = temp.newFolder().toPath();
+    ZipUtils.unzip(inputFile.toString(), tmpClassesDir.toFile());
+    D8Command command = parse("--lib", tmpClassesDir.toString(), "--classpath",
+        tmpClassesDir.toString());
+    AndroidApp inputApp = ToolHelper.getApp(command);
+    assertEquals(1, inputApp.getClasspathResourceProviders().size());
+    assertEquals(tmpClassesDir,
+        ((DirectoryClassFileProvider) inputApp.getClasspathResourceProviders().get(0)).getRoot());
+    assertEquals(1, inputApp.getLibraryResourceProviders().size());
+    assertEquals(tmpClassesDir,
+        ((DirectoryClassFileProvider) inputApp.getLibraryResourceProviders().get(0)).getRoot());
+  }
+
+  @Test
+  public void classFolderProgram() throws Throwable {
+    thrown.expect(CompilationException.class);
+    Path inputFile =
+        Paths.get(ToolHelper.EXAMPLES_ANDROID_N_BUILD_DIR, "interfacemethods" + JAR_EXTENSION);
+    Path tmpClassesDir = temp.newFolder().toPath();
+    ZipUtils.unzip(inputFile.toString(), tmpClassesDir.toFile());
+    parse(tmpClassesDir.toString());
+  }
+
+  @Test
+  public void emptyFolderProgram() throws Throwable {
+    thrown.expect(CompilationException.class);
+    Path tmpClassesDir = temp.newFolder().toPath();
+    parse(tmpClassesDir.toString());
+  }
+
+  @Test
   public void nonExistingOutputJar() throws Throwable {
     Path nonExistingJar = temp.getRoot().toPath().resolve("non-existing-archive.jar");
     D8Command.builder().setOutputPath(nonExistingJar).build();
diff --git a/src/test/java/com/android/tools/r8/utils/R8CommandTest.java b/src/test/java/com/android/tools/r8/utils/R8CommandTest.java
index 2af79cb..0c737b9 100644
--- a/src/test/java/com/android/tools/r8/utils/R8CommandTest.java
+++ b/src/test/java/com/android/tools/r8/utils/R8CommandTest.java
@@ -49,8 +49,6 @@
   private void verifyEmptyCommand(R8Command command) {
     assertEquals(0, ToolHelper.getApp(command).getDexProgramResources().size());
     assertEquals(0, ToolHelper.getApp(command).getClassProgramResources().size());
-    assertEquals(0, ToolHelper.getApp(command).getDexLibraryResources().size());
-    assertEquals(0, ToolHelper.getApp(command).getClassLibraryResources().size());
     assertFalse(ToolHelper.getApp(command).hasMainDexList());
     assertFalse(ToolHelper.getApp(command).hasProguardMap());
     assertFalse(ToolHelper.getApp(command).hasProguardSeeds());
