diff --git a/src/main/java/com/android/tools/r8/D8.java b/src/main/java/com/android/tools/r8/D8.java
index 0f0b38f..9b79616 100644
--- a/src/main/java/com/android/tools/r8/D8.java
+++ b/src/main/java/com/android/tools/r8/D8.java
@@ -9,8 +9,6 @@
 import com.android.tools.r8.dex.ApplicationWriter;
 import com.android.tools.r8.dex.Marker;
 import com.android.tools.r8.dex.Marker.Tool;
-import com.android.tools.r8.errors.CompilationError;
-import com.android.tools.r8.errors.DexOverflowException;
 import com.android.tools.r8.graph.AppInfo;
 import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.ir.conversion.IRConverter;
@@ -168,8 +166,6 @@
       AndroidApp inputApp, InternalOptions options, ExecutorService executor)
       throws IOException, CompilationException {
     try {
-      assert !inputApp.hasPackageDistribution();
-
       // Disable global optimizations.
       options.skipMinification = true;
       options.inlineAccessors = false;
@@ -191,7 +187,7 @@
           new CompilationResult(
               new ApplicationWriter(
                   app, appInfo, options, marker, null, NamingLens.getIdentityLens(), null)
-                  .write(null, executor),
+                  .write(executor),
               app,
               appInfo);
 
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index 1306e3b..dce4879 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -45,7 +45,6 @@
 import com.android.tools.r8.utils.CfgPrinter;
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.PackageDistribution;
 import com.android.tools.r8.utils.ThreadUtils;
 import com.android.tools.r8.utils.Timing;
 import com.google.common.io.ByteStreams;
@@ -63,9 +62,7 @@
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.nio.file.StandardOpenOption;
-import java.util.ArrayList;
 import java.util.HashSet;
-import java.util.List;
 import java.util.Set;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
@@ -98,14 +95,13 @@
       byte[] deadCode,
       NamingLens namingLens,
       byte[] proguardSeedsData,
-      PackageDistribution packageDistribution,
       InternalOptions options)
       throws ExecutionException, DexOverflowException {
     try {
       Marker marker = getMarker(options);
       return new ApplicationWriter(
           application, appInfo, options, marker, deadCode, namingLens, proguardSeedsData)
-          .write(packageDistribution, executorService);
+          .write(executorService);
     } catch (IOException e) {
       throw new RuntimeException("Cannot write dex application", e);
     }
@@ -373,13 +369,6 @@
         return null;
       }
 
-      PackageDistribution packageDistribution = null;
-      if (inputApp.hasPackageDistribution()) {
-        try (Closer closer = Closer.create()) {
-          packageDistribution = PackageDistribution.load(inputApp.getPackageDistribution(closer));
-        }
-      }
-
       // Generate the resulting application resources.
       AndroidApp androidApp =
           writeApplication(
@@ -389,7 +378,6 @@
               application.deadCode,
               namingLens,
               proguardSeedsData,
-              packageDistribution,
               options);
 
       options.printWarnings();
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 301c266..2053abd 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -37,7 +37,6 @@
     private Optional<Boolean> minification = Optional.empty();
     private boolean ignoreMissingClasses = false;
     private Path printMappingFile = null;
-    private Path packageDistributionFile = null;
 
     private Builder() {
       super(CompilationMode.RELEASE);
@@ -160,14 +159,6 @@
     }
 
     /**
-     * Set a package distribution file resource.
-     */
-    public Builder setPackageDistributionFile(Path path) {
-      packageDistributionFile = path;
-      return self();
-    }
-
-    /**
      * Deprecated flag to avoid failing if classes are missing during compilation.
      *
      * <p>TODO: Make compilation safely assume this flag to be true and remove the flag.
@@ -189,10 +180,6 @@
         throw new CompilationException(
             "Option --main-dex-list-output require --main-dex-rules and/or --main-dex-list");
       }
-      if (getMode() == CompilationMode.DEBUG && packageDistributionFile != null) {
-        throw new CompilationException(
-            "Package distribution file is not supported in debug mode");
-      }
     }
 
     @Override
@@ -237,10 +224,6 @@
 
       // TODO(b/64802420): setProguardMapFile if configuration.hasApplyMappingFile
 
-      if (packageDistributionFile != null) {
-        getAppBuilder().setPackageDistributionFile(packageDistributionFile);
-      }
-
       boolean useTreeShaking = treeShaking.orElse(configuration.isShrinking());
       boolean useDiscardedChecker = discardedChecker.orElse(true);
       boolean useMinification = minification.orElse(configuration.isObfuscating());
diff --git a/src/main/java/com/android/tools/r8/bisect/Bisect.java b/src/main/java/com/android/tools/r8/bisect/Bisect.java
index 81d5f9a..b2c02b0 100644
--- a/src/main/java/com/android/tools/r8/bisect/Bisect.java
+++ b/src/main/java/com/android/tools/r8/bisect/Bisect.java
@@ -179,7 +179,7 @@
     InternalOptions options = new InternalOptions();
     AppInfo appInfo = new AppInfo(app);
     ApplicationWriter writer = new ApplicationWriter(app, appInfo, options, null, null, null, null);
-    AndroidApp outApp = writer.write(null, executor);
+    AndroidApp outApp = writer.write(executor);
     outApp.writeToDirectory(output, OutputMode.Indexed);
   }
 
diff --git a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
index 58c3a5b..6f92740 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
@@ -26,7 +26,6 @@
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.InternalOptions;
 import com.android.tools.r8.utils.OutputMode;
-import com.android.tools.r8.utils.PackageDistribution;
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.io.PrintStream;
@@ -126,7 +125,7 @@
     this.proguardSeedsData = proguardSeedsData;
   }
 
-  public AndroidApp write(PackageDistribution packageDistribution, ExecutorService executorService)
+  public AndroidApp write(ExecutorService executorService)
       throws IOException, ExecutionException, DexOverflowException {
     application.timing.begin("DexApplication.write");
     try {
@@ -139,24 +138,11 @@
       // Distribute classes into dex files.
       VirtualFile.Distributor distributor = null;
       if (options.outputMode == OutputMode.FilePerInputClass) {
-        assert packageDistribution == null :
-            "Cannot combine package distribution definition with file-per-class option.";
         distributor = new VirtualFile.FilePerInputClassDistributor(this);
       } else if (!options.canUseMultidex()
           && options.mainDexKeepRules.isEmpty()
           && application.mainDexList.isEmpty()) {
-        if (packageDistribution != null) {
-          throw new CompilationError("Cannot apply package distribution. Multidex is not"
-              + " supported with API level " + options.minApiLevel +"."
-              + " For API level < " + Constants.ANDROID_L_API + ", main dex classes list or"
-              + " rules must be specified.");
-        }
         distributor = new VirtualFile.MonoDexDistributor(this);
-      } else if (packageDistribution != null) {
-        assert !options.minimalMainDex :
-            "Cannot combine package distribution definition with minimal-main-dex option.";
-        distributor =
-            new VirtualFile.PackageMapDistributor(this, packageDistribution, executorService);
       } else {
         distributor = new VirtualFile.FillFilesDistributor(this, options.minimalMainDex);
       }
diff --git a/src/main/java/com/android/tools/r8/dex/VirtualFile.java b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
index 32fb175..746c62e 100644
--- a/src/main/java/com/android/tools/r8/dex/VirtualFile.java
+++ b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
@@ -24,16 +24,11 @@
 import com.android.tools.r8.naming.NamingLens;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.FileUtils;
-import com.android.tools.r8.utils.PackageDistribution;
-import com.android.tools.r8.utils.ThreadUtils;
+
 import com.google.common.collect.Iterators;
 import com.google.common.collect.Maps;
 import com.google.common.collect.Sets;
 import java.io.IOException;
-import java.io.OutputStreamWriter;
-import java.io.Writer;
-import java.nio.file.Path;
-import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
@@ -44,13 +39,10 @@
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Map.Entry;
 import java.util.Set;
 import java.util.TreeSet;
 import java.util.concurrent.Callable;
 import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-import java.util.concurrent.Future;
 import java.util.function.Function;
 
 public class VirtualFile {
@@ -402,95 +394,6 @@
     }
   }
 
-  public static class PackageMapDistributor extends DistributorBase {
-    private final PackageDistribution packageDistribution;
-    private final ExecutorService executorService;
-
-    PackageMapDistributor(
-        ApplicationWriter writer,
-        PackageDistribution packageDistribution,
-        ExecutorService executorService) {
-      super(writer);
-      this.packageDistribution = packageDistribution;
-      this.executorService = executorService;
-    }
-
-    @Override
-    public Map<Integer, VirtualFile> run()
-        throws ExecutionException, IOException, DexOverflowException {
-      // Strategy for distributing classes for write out:
-      // 1. Place all files in the package distribution file in the proposed files (if any).
-      // 2. Place the remaining files based on their packages in sorted order.
-
-      assert nameToFileMap.size() == 1;
-      assert nameToFileMap.containsKey(0);
-      int maxReferencedIndex = packageDistribution.maxReferencedIndex();
-      for (int index = 1; index <= maxReferencedIndex; index++) {
-        VirtualFile file = new VirtualFile(index, writer.namingLens);
-        nameToFileMap.put(index, file);
-      }
-
-      // First fill required classes into the main dex file.
-      fillForMainDexList(classes);
-
-      // Sort the remaining classes based on the original names.
-      // This with make classes from the same package be adjacent.
-      classes = sortClassesByPackage(classes, originalNames);
-
-      Set<String> usedPrefixes = fillForDistribution(classes, originalNames);
-
-      // TODO(zerny): Add the package map to AndroidApp and refactor its generation.
-      Map<String, Integer> newAssignments;
-      if (classes.isEmpty()) {
-        newAssignments = Collections.emptyMap();
-      } else {
-        newAssignments =
-            new PackageSplitPopulator(
-                nameToFileMap, classes, originalNames, usedPrefixes, application.dexItemFactory,
-                FillStrategy.LEAVE_SPACE_FOR_GROWTH, writer.namingLens)
-                .call();
-        if (!newAssignments.isEmpty() && nameToFileMap.size() > 1) {
-          System.err.println(" * The used package map is missing entries. The following default "
-              + "mappings have been used:");
-          writeAssignments(newAssignments, new OutputStreamWriter(System.err));
-          System.err.println(" * Consider updating the map.");
-        }
-      }
-
-      Path newPackageMap = Paths.get("package.map");
-      System.out.println(" - " + newPackageMap.toString());
-      PackageDistribution.writePackageToFileMap(newPackageMap, newAssignments, packageDistribution);
-
-      return nameToFileMap;
-    }
-
-    private Set<String> fillForDistribution(Set<DexProgramClass> classes,
-        Map<DexProgramClass, String> originalNames) throws ExecutionException {
-      Set<String> usedPrefixes = null;
-      if (packageDistribution != null) {
-        ArrayList<Future<List<DexProgramClass>>> futures = new ArrayList<>(nameToFileMap.size());
-        usedPrefixes = packageDistribution.getFiles();
-        for (VirtualFile file : nameToFileMap.values()) {
-          PackageMapPopulator populator =
-              new PackageMapPopulator(file, classes, packageDistribution, originalNames);
-          futures.add(executorService.submit(populator));
-        }
-        ThreadUtils.awaitFutures(futures).forEach(classes::removeAll);
-      }
-      return usedPrefixes;
-    }
-
-    private void writeAssignments(Map<String, Integer> assignments, Writer output)
-        throws IOException{
-      for (Entry<String, Integer> entry : assignments.entrySet()) {
-        output.write("    ");
-        PackageDistribution.formatEntry(entry, output);
-        output.write("\n");
-      }
-      output.flush();
-    }
-  }
-
   private static class VirtualFileIndexedItemCollection implements IndexedItemCollection {
 
     final int id;
@@ -719,96 +622,6 @@
   }
 
   /**
-   * Adds all classes from the given set that are covered by a corresponding package map
-   * specification to the given file.
-   */
-  private static class PackageMapPopulator implements Callable<List<DexProgramClass>> {
-
-    private final VirtualFile file;
-    private final Collection<DexProgramClass> classes;
-    private final PackageDistribution packageDistribution;
-    private final Map<DexProgramClass, String> originalNames;
-
-    PackageMapPopulator(
-        VirtualFile file,
-        Collection<DexProgramClass> classes,
-        PackageDistribution packageDistribution,
-        Map<DexProgramClass, String> originalNames) {
-      this.file = file;
-      this.classes = classes;
-      this.packageDistribution = packageDistribution;
-      this.originalNames = originalNames;
-    }
-
-    @Override
-    public List<DexProgramClass> call() {
-      String currentPrefix = null;
-      int currentFileId = -1;
-      List<DexProgramClass> inserted = new ArrayList<>();
-      for (DexProgramClass clazz : classes) {
-        String originalName = originalNames.get(clazz);
-        assert originalName != null;
-        if (!coveredByPrefix(originalName, currentPrefix)) {
-          if (currentPrefix != null) {
-            file.commitTransaction();
-          }
-          currentPrefix = lookupPrefixFor(originalName);
-          if (currentPrefix == null) {
-            currentFileId = -1;
-          } else {
-            currentFileId = packageDistribution.get(currentPrefix);
-          }
-        }
-        if (currentFileId == file.id) {
-          file.addClass(clazz);
-          inserted.add(clazz);
-        }
-        if (file.isFull()) {
-          throw new CompilationError(
-              "Cannot fit package " + currentPrefix
-                  + " in requested dex file, consider removing mapping.");
-        }
-      }
-      file.commitTransaction();
-      return inserted;
-    }
-
-    private String lookupPrefixFor(String originalName) {
-      // First, check whether we have a match on the full package name.
-      int lastIndexOfDot = originalName.lastIndexOf('.');
-      if (lastIndexOfDot < 0) {
-        return null;
-      }
-      String prefix = originalName.substring(0, lastIndexOfDot);
-      if (packageDistribution.containsFile(prefix)) {
-        return prefix;
-      }
-      // Second, look for .* qualified entries.
-      int index;
-      prefix = originalName;
-      while ((index = prefix.lastIndexOf('.')) != -1) {
-        prefix = prefix.substring(0, index);
-        if (packageDistribution.containsFile(prefix + ".*")) {
-          return prefix + ".*";
-        }
-      }
-      return null;
-    }
-
-    static boolean coveredByPrefix(String originalName, String currentPrefix) {
-      if (currentPrefix == null) {
-        return false;
-      }
-      if (currentPrefix.endsWith(".*")) {
-        return originalName.startsWith(currentPrefix.substring(0, currentPrefix.length() - 2));
-      } else {
-        return originalName.startsWith(currentPrefix)
-            && originalName.lastIndexOf('.') == currentPrefix.length();
-      }
-    }
-  }
-
-  /**
    * Helper class to cycle through the set of virtual files.
    *
    * Iteration starts at the first file and iterates through all files.
@@ -915,6 +728,18 @@
       this.cycler = new VirtualFileCycler(files, namingLens, fillStrategy);
     }
 
+    static boolean coveredByPrefix(String originalName, String currentPrefix) {
+      if (currentPrefix == null) {
+        return false;
+      }
+      if (currentPrefix.endsWith(".*")) {
+        return originalName.startsWith(currentPrefix.substring(0, currentPrefix.length() - 2));
+      } else {
+        return originalName.startsWith(currentPrefix)
+            && originalName.lastIndexOf('.') == currentPrefix.length();
+      }
+    }
+
     private String getOriginalName(DexProgramClass clazz) {
       return originalNames != null ? originalNames.get(clazz) : clazz.toString();
     }
@@ -931,7 +756,7 @@
       for (int classIndex = 0; classIndex < classes.size(); classIndex++) {
         DexProgramClass clazz = classes.get(classIndex);
         String originalName = getOriginalName(clazz);
-        if (!PackageMapPopulator.coveredByPrefix(originalName, currentPrefix)) {
+        if (!coveredByPrefix(originalName, currentPrefix)) {
           if (currentPrefix != null) {
             current.commitTransaction();
             // Reset the cycler to again iterate over all files, starting with the current one.
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 9b99be5..439c1d9 100644
--- a/src/main/java/com/android/tools/r8/utils/AndroidApp.java
+++ b/src/main/java/com/android/tools/r8/utils/AndroidApp.java
@@ -63,7 +63,6 @@
   private final Resource deadCode;
   private final Resource proguardMap;
   private final Resource proguardSeeds;
-  private final Resource packageDistribution;
   private final List<Resource> mainDexListResources;
   private final List<String> mainDexClasses;
   private final Resource mainDexListOutput;
@@ -78,7 +77,6 @@
       Resource deadCode,
       Resource proguardMap,
       Resource proguardSeeds,
-      Resource packageDistribution,
       List<Resource> mainDexListResources,
       List<String> mainDexClasses,
       Resource mainDexListOutput) {
@@ -90,7 +88,6 @@
     this.deadCode = deadCode;
     this.proguardMap = proguardMap;
     this.proguardSeeds = proguardSeeds;
-    this.packageDistribution = packageDistribution;
     this.mainDexListResources = mainDexListResources;
     this.mainDexClasses = mainDexClasses;
     this.mainDexListOutput = mainDexListOutput;
@@ -255,20 +252,6 @@
   }
 
   /**
-   * True if the package distribution resource exists.
-   */
-  public boolean hasPackageDistribution() {
-    return packageDistribution != null;
-  }
-
-  /**
-   * Get the input stream of the package distribution resource if it exists.
-   */
-  public InputStream getPackageDistribution(Closer closer) throws IOException {
-    return packageDistribution == null ? null : closer.register(packageDistribution.getStream());
-  }
-
-  /**
    * True if the main dex list resources exists.
    */
   public boolean hasMainDexList() {
@@ -464,7 +447,6 @@
     private Resource deadCode;
     private Resource proguardMap;
     private Resource proguardSeeds;
-    private Resource packageDistribution;
     private List<Resource> mainDexListResources = new ArrayList<>();
     private List<String> mainDexListClasses = new ArrayList<>();
     private Resource mainDexListOutput;
@@ -484,7 +466,6 @@
       deadCode = app.deadCode;
       proguardMap = app.proguardMap;
       proguardSeeds = app.proguardSeeds;
-      packageDistribution = app.packageDistribution;
       mainDexListResources = app.mainDexListResources;
       mainDexListClasses = app.mainDexClasses;
       mainDexListOutput = app.mainDexListOutput;
@@ -685,14 +666,6 @@
     }
 
     /**
-     * Set the package-distribution file.
-     */
-    public Builder setPackageDistributionFile(Path file) {
-      packageDistribution = file == null ? null : Resource.fromFile(null, file);
-      return this;
-    }
-
-    /**
      * Add a main-dex list file.
      */
     public Builder addMainDexListFiles(Path... files) throws IOException {
@@ -773,7 +746,6 @@
           deadCode,
           proguardMap,
           proguardSeeds,
-          packageDistribution,
           mainDexListResources,
           mainDexListClasses,
           mainDexListOutput);
diff --git a/src/main/java/com/android/tools/r8/utils/PackageDistribution.java b/src/main/java/com/android/tools/r8/utils/PackageDistribution.java
deleted file mode 100644
index b242b9d..0000000
--- a/src/main/java/com/android/tools/r8/utils/PackageDistribution.java
+++ /dev/null
@@ -1,171 +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 com.android.tools.r8.utils;
-
-import java.io.BufferedReader;
-import java.io.BufferedWriter;
-import java.io.IOException;
-import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.Writer;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.util.HashMap;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.Set;
-
-public class PackageDistribution {
-
-  private static final String OLDFILE_PREFIX_TEXT =
-      "\n"
-          + "# Below follow the original package to file mapping rules. These have not been\n"
-          + "# changed by R8.\n"
-          + "\n";
-
-  private static final String APPENDED_PREFIX_TEXT =
-      "# The following packages had no mapping in the supplied package file. The\n"
-          + "# mapping rules provided below reflect the mapping that was used by R8. Please\n"
-          + "# use this updated map moving forward to ensure stability of package placement\n"
-          + "# in DEX files (and thus minimize patch size).\n"
-          + "#\n"
-          + "# Note that the updated package placement might not be optimal. Shifting the new\n"
-          + "# packages to DEX files that contain related packages might yield smaller DEX\n"
-          + "# file sizes.\n"
-          + "\n";
-
-  private static final String NEW_PACKAGE_MAP_PREFIX_TEXT =
-      "# This file provides a mapping of classes to DEX files in an Android multi-dex\n"
-          +"# application. It is used in conjunction with the R8 DEX file optimizer\n"
-          + "# to enforce a fixed distribution of classes to DEX files.\n"
-          + "#\n"
-          + "# Fixing the class distribution serves two purposes:\n"
-          + "#\n"
-          + "# 1. Keeping classes in the same DEX file reduces the size of patches between\n"
-          + "#    two versions of an application.\n"
-          + "# 2. Co-locating classes with their uses can reduce DEX file size. For example,\n"
-          + "#    one might want to place the helper classes for credit card processing in\n"
-          + "#    the same DEX file that contains the payment related logic.\n"
-          + "#\n"
-          + "# Entries in this file have the following form:\n"
-          + "#\n"
-          + "# <packageSpec>:<file number>\n"
-          + "#\n"
-          + "# Where packageSpec is either the name of a package, e.g., 'com.google.foo', or\n"
-          + "# a package wildcard of the form 'com.google.bar.*'. The former matches exactly\n"
-          + "# the classes in the given package, whereas the latter also matches classes in\n"
-          + "# subpackages. PackageSpec entries may not overlap.\n"
-          + "#\n"
-          + "# Empty lines and lines starting with a '#' are ignored.\n"
-          + "\n";
-
-  private static final String NO_PACKAGE_MAP_REQUIRED_TEXT =
-      "\n"
-          +  "# Intentionally empty, as the output only has a single DEX file.\n"
-          + "\n";
-
-  private final Map<String, Integer> map;
-
-  private PackageDistribution(Map<String, Integer> map) {
-    this.map = map;
-  }
-
-  public static PackageDistribution load(InputStream input) throws IOException {
-    return read(new BufferedReader(new InputStreamReader(input)));
-  }
-
-  public static PackageDistribution load(Path path) {
-    try (BufferedReader reader = Files.newBufferedReader(path, StandardCharsets.UTF_8)) {
-      return read(reader);
-    } catch (IOException e) {
-      throw new RuntimeException("Error reading file " + path, e);
-    }
-  }
-
-  private static PackageDistribution read(BufferedReader reader) throws IOException {
-    String line = null;
-    try {
-      Map<String, Integer> result = new HashMap<>();
-      while ((line = reader.readLine()) != null) {
-        if (line.length() == 0 || line.startsWith("#")) {
-          continue;
-        }
-        String[] parts = line.split(":");
-        if (parts.length != 2) {
-          throw new RuntimeException("Error parsing package map line " + line);
-        }
-        String prefix = parts[0];
-        if (result.containsKey(prefix)) {
-          throw new RuntimeException("Prefix is assigned twice: " + prefix);
-        }
-        int file = Integer.parseInt(parts[1]);
-        result.put(prefix, file);
-      }
-      return new PackageDistribution(result);
-    } catch (NumberFormatException e) {
-      throw new RuntimeException("Error parsing package map line " + line, e);
-    }
-  }
-
-  public static void formatEntry(Entry<String, Integer> entry, Writer writer) throws IOException {
-    writer.write(entry.getKey());
-    writer.write(":");
-    writer.write(entry.getValue().toString());
-  }
-
-  public static void writePackageToFileMap(
-      Path target, Map<String, Integer> mappings, PackageDistribution original) throws IOException {
-    BufferedWriter writer = Files.newBufferedWriter(target, StandardCharsets.UTF_8);
-    if (mappings.isEmpty()) {
-      if (original != null) {
-        copyOriginalPackageMap(original, writer);
-      } else {
-        writer.write(NEW_PACKAGE_MAP_PREFIX_TEXT);
-        writer.write(NO_PACKAGE_MAP_REQUIRED_TEXT);
-      }
-      writer.close();
-      return;
-    }
-    if (original == null) {
-      writer.write(NEW_PACKAGE_MAP_PREFIX_TEXT);
-    } else {
-      writer.write(APPENDED_PREFIX_TEXT);
-    }
-    for (Entry<String, Integer> entry : mappings.entrySet()) {
-      formatEntry(entry, writer);
-      writer.newLine();
-    }
-    if (original != null) {
-      // Copy the original
-      writer.write(OLDFILE_PREFIX_TEXT);
-      copyOriginalPackageMap(original, writer);
-    }
-    writer.close();
-  }
-
-  private static void copyOriginalPackageMap(PackageDistribution original, BufferedWriter writer)
-      throws IOException {
-    for (Entry<String, Integer> entry : original.map.entrySet()) {
-      formatEntry(entry, writer);
-      writer.newLine();
-    }
-  }
-
-  public int maxReferencedIndex() {
-    return map.values().stream().max(Integer::compare).orElse(0);
-  }
-
-  public Set<String> getFiles() {
-    return map.keySet();
-  }
-
-  public int get(String file) {
-    return map.getOrDefault(file, -1);
-  }
-
-  public boolean containsFile(String file) {
-    return map.containsKey(file);
-  }
-}
diff --git a/src/test/examples/memberrebinding/package.map b/src/test/examples/memberrebinding/package.map
deleted file mode 100644
index e9bfd68..0000000
--- a/src/test/examples/memberrebinding/package.map
+++ /dev/null
@@ -1,4 +0,0 @@
-#
-# package.map file used by java/com/android/tools/r8/dex/ExtraFileTest.java
-#
-memberrebinding.subpackage:1
diff --git a/src/test/java/com/android/tools/r8/dex/ExtraFileTest.java b/src/test/java/com/android/tools/r8/dex/ExtraFileTest.java
deleted file mode 100644
index 6114f61..0000000
--- a/src/test/java/com/android/tools/r8/dex/ExtraFileTest.java
+++ /dev/null
@@ -1,95 +0,0 @@
-// Copyright (c) 2016, 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.dex;
-
-import com.android.tools.r8.CompilationException;
-import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.R8Command;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.shaking.ProguardRuleParserException;
-import com.google.common.collect.ImmutableList;
-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.List;
-import java.util.concurrent.ExecutionException;
-import org.junit.Assert;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.ExpectedException;
-import org.junit.rules.TemporaryFolder;
-
-public class ExtraFileTest {
-
-  private static final String EXAMPLE_DIR = ToolHelper.EXAMPLES_BUILD_DIR;
-  private static final String EXAMPLE_DEX = "memberrebinding/classes.dex";
-  private static final String EXAMPLE_LIB = "memberrebindinglib/classes.dex";
-  private static final String EXAMPLE_CLASS = "memberrebinding.Memberrebinding";
-  private static final String EXAMPLE_PACKAGE_MAP = "memberrebinding/package.map";
-  private static final String EXAMPLE_PROGUARD_MAP = "memberrebinding/proguard.map";
-
-  @Rule
-  public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
-  @Rule
-  public ExpectedException thrown = ExpectedException.none();
-
-  @Test
-  public void splitMemberRebindingTwoFilesRelease()
-      throws IOException, ProguardRuleParserException, ExecutionException, CompilationException {
-    if (!ToolHelper.artSupported()) {
-      return;
-    }
-
-    Path out = temp.getRoot().toPath();
-    Path original = Paths.get(EXAMPLE_DIR, EXAMPLE_DEX);
-    Path packageMap = Paths.get(ToolHelper.EXAMPLES_DIR, EXAMPLE_PACKAGE_MAP);
-    Path proguardMap = Paths.get(ToolHelper.EXAMPLES_DIR, EXAMPLE_PROGUARD_MAP);
-    R8Command command =
-        R8Command.builder()
-            .addProgramFiles(original)
-            .setMode(CompilationMode.RELEASE)
-            .setOutputPath(out)
-            .setMinApiLevel(Constants.ANDROID_L_API) // Allow native multidex.
-            .setProguardMapFile(proguardMap)
-            .setPackageDistributionFile(packageMap)
-            .build();
-    ToolHelper.runR8(command);
-    List<String> outs =
-        new ArrayList<>(
-            ImmutableList.of(
-                out.resolve("classes.dex").toString(),
-                out.resolve("classes2.dex").toString(),
-                EXAMPLE_DIR + EXAMPLE_LIB));
-    outs.forEach(f -> Assert.assertTrue("Failed to find file " + f, Files.exists(Paths.get(f))));
-    ToolHelper.checkArtOutputIdentical(
-        ImmutableList.of(original.toString(), EXAMPLE_DIR + EXAMPLE_LIB),
-        outs,
-        EXAMPLE_CLASS,
-        null,
-        null);
-  }
-
-  @Test
-  public void splitMemberRebindingTwoFilesDebug()
-      throws IOException, ProguardRuleParserException, ExecutionException, CompilationException {
-    thrown.expect(CompilationException.class);
-    Path out = temp.getRoot().toPath();
-    Path original = Paths.get(EXAMPLE_DIR, EXAMPLE_DEX);
-    Path packageMap = Paths.get(ToolHelper.EXAMPLES_DIR, EXAMPLE_PACKAGE_MAP);
-    Path proguardMap = Paths.get(ToolHelper.EXAMPLES_DIR, EXAMPLE_PROGUARD_MAP);
-    R8Command command =
-        R8Command.builder()
-            .addProgramFiles(original)
-            .setMode(CompilationMode.DEBUG)
-            .setOutputPath(out)
-            .setMinApiLevel(Constants.ANDROID_L_API) // Allow native multidex.
-            .setProguardMapFile(proguardMap)
-            .setPackageDistributionFile(packageMap)
-            .build();
-    ToolHelper.runR8(command);
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java b/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java
index 92a755e..9da8e0e 100644
--- a/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java
+++ b/src/test/java/com/android/tools/r8/jasmin/JasminTestBase.java
@@ -98,7 +98,6 @@
             null,
             NamingLens.getIdentityLens(),
             null,
-            null,
             options);
     return runOnArt(outputApp, main);
   }
@@ -183,7 +182,6 @@
           null,
           NamingLens.getIdentityLens(),
           null,
-          null,
           options);
     } catch (ExecutionException e) {
       throw new RuntimeException(e);
diff --git a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
index a316969..0acd445 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
@@ -597,7 +597,7 @@
         application, appInfo, options, null, null, NamingLens.getIdentityLens(), null);
     ExecutorService executor = ThreadUtils.getExecutorService(options);
     try {
-      return writer.write(null, executor);
+      return writer.write(executor);
     } finally {
       executor.shutdown();
     }
diff --git a/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java b/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java
index 2e3088a..42e289a 100644
--- a/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java
+++ b/src/test/java/com/android/tools/r8/smali/SmaliTestBase.java
@@ -588,7 +588,6 @@
           null,
           NamingLens.getIdentityLens(),
           null,
-          null,
           options);
     } catch (ExecutionException e) {
       throw new RuntimeException(e);
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 92ad06d..941ba84 100644
--- a/src/test/java/com/android/tools/r8/utils/D8CommandTest.java
+++ b/src/test/java/com/android/tools/r8/utils/D8CommandTest.java
@@ -54,7 +54,6 @@
     assertFalse(ToolHelper.getApp(command).hasMainDexListResources());
     assertFalse(ToolHelper.getApp(command).hasProguardMap());
     assertFalse(ToolHelper.getApp(command).hasProguardSeeds());
-    assertFalse(ToolHelper.getApp(command).hasPackageDistribution());
     assertNull(command.getOutputPath());
     assertEquals(CompilationMode.DEBUG, command.getMode());
   }
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 322f15e..2054b22 100644
--- a/src/test/java/com/android/tools/r8/utils/R8CommandTest.java
+++ b/src/test/java/com/android/tools/r8/utils/R8CommandTest.java
@@ -56,7 +56,6 @@
     assertFalse(ToolHelper.getApp(command).hasMainDexListResources());
     assertFalse(ToolHelper.getApp(command).hasProguardMap());
     assertFalse(ToolHelper.getApp(command).hasProguardSeeds());
-    assertFalse(ToolHelper.getApp(command).hasPackageDistribution());
     assertNull(command.getOutputPath());
     assertFalse(command.useMinification());
     assertFalse(command.useTreeShaking());
diff --git a/src/test/java/com/android/tools/r8/utils/Smali.java b/src/test/java/com/android/tools/r8/utils/Smali.java
index 93edf4d..6a26a1a 100644
--- a/src/test/java/com/android/tools/r8/utils/Smali.java
+++ b/src/test/java/com/android/tools/r8/utils/Smali.java
@@ -106,7 +106,7 @@
           app, options, new Timing("smali")).read(executor);
       ApplicationWriter writer = new ApplicationWriter(
           dexApp, null, options, null, null, NamingLens.getIdentityLens(), null);
-      AndroidApp trimmed = writer.write(null, executor);
+      AndroidApp trimmed = writer.write(executor);
       return ByteStreams.toByteArray(trimmed.getDexProgramResources().get(0).getStream());
     } finally {
       executor.shutdown();
