diff --git a/.gitignore b/.gitignore
index bd447f4..b3f67f4 100644
--- a/.gitignore
+++ b/.gitignore
@@ -94,8 +94,6 @@
 third_party/gradle/gradle
 third_party/gradle/gradle.tar.gz
 third_party/internal/*
-third_party/internal-apps/youtube_15_33
-third_party/internal-apps/youtube_15_33.tar.gz
 third_party/iosched_2019
 third_party/iosched_2019.tar.gz
 third_party/jacoco/0.8.2/*
@@ -250,8 +248,6 @@
 third_party/tachiyomi
 third_party/tachiyomi.tar.gz
 third_party/youtube/*
-third_party/youtube-developer/20200415
-third_party/youtube-developer/20200415.tar.gz
 tmp/
 tools/*.pyc
 tools/__pycache__
diff --git a/build.gradle b/build.gradle
index 9b2772c..5d4868a 100644
--- a/build.gradle
+++ b/build.gradle
@@ -460,7 +460,6 @@
         "proto",
         "protobuf-lite",
         "retrace_internal",
-        "youtube/youtube.android_15.33",
         "youtube/youtube.android_16.20",
         "youtube/youtube.android_17.19"
     ],
diff --git a/src/main/java/com/android/tools/r8/BaseCompilerCommand.java b/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
index b2e0f6d..7e93145 100644
--- a/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
+++ b/src/main/java/com/android/tools/r8/BaseCompilerCommand.java
@@ -54,6 +54,7 @@
   private final DumpInputFlags dumpInputFlags;
   private final MapIdProvider mapIdProvider;
   private final SourceFileProvider sourceFileProvider;
+  private final boolean isAndroidPlatformBuild;
 
   BaseCompilerCommand(boolean printHelp, boolean printVersion) {
     super(printHelp, printVersion);
@@ -72,6 +73,7 @@
     dumpInputFlags = DumpInputFlags.noDump();
     mapIdProvider = null;
     sourceFileProvider = null;
+    isAndroidPlatformBuild = false;
   }
 
   BaseCompilerCommand(
@@ -90,7 +92,8 @@
       int threadCount,
       DumpInputFlags dumpInputFlags,
       MapIdProvider mapIdProvider,
-      SourceFileProvider sourceFileProvider) {
+      SourceFileProvider sourceFileProvider,
+      boolean isAndroidPlatformBuild) {
     super(app);
     assert minApiLevel > 0;
     assert mode != null;
@@ -109,6 +112,7 @@
     this.dumpInputFlags = dumpInputFlags;
     this.mapIdProvider = mapIdProvider;
     this.sourceFileProvider = sourceFileProvider;
+    this.isAndroidPlatformBuild = isAndroidPlatformBuild;
   }
 
   /**
@@ -131,6 +135,9 @@
         .setOptimizeMultidexForLinearAlloc(isOptimizeMultidexForLinearAlloc())
         .setThreadCount(getThreadCount())
         .setDesugarState(getDesugarState());
+    if (getAndroidPlatformBuild()) {
+      builder.setAndroidPlatformBuild(true);
+    }
   }
 
   /**
@@ -197,6 +204,10 @@
     return threadCount;
   }
 
+  public boolean getAndroidPlatformBuild() {
+    return isAndroidPlatformBuild;
+  }
+
   DumpInputFlags getDumpInputFlags() {
     return dumpInputFlags;
   }
@@ -237,6 +248,7 @@
     private DumpInputFlags dumpInputFlags = DumpInputFlags.noDump();
     private MapIdProvider mapIdProvider = null;
     private SourceFileProvider sourceFileProvider = null;
+    private boolean isAndroidPlatformBuild = false;
 
     abstract CompilationMode defaultCompilationMode();
 
@@ -635,6 +647,23 @@
       return self();
     }
 
+    /**
+     * Configure the present build as a "Android platform build".
+     *
+     * <p>A platform build, is a build where the runtime "bootclasspath" is known at compile time.
+     * In other words, the specified <i>min-api</i> is also known to be the <i>max-api</i>. In this
+     * mode the compiler will disable various features that provide support for newer runtimes as
+     * well as disable workarounds for older runtimes.
+     */
+    public B setAndroidPlatformBuild(boolean isAndroidPlatformBuild) {
+      this.isAndroidPlatformBuild = isAndroidPlatformBuild;
+      return self();
+    }
+
+    public boolean getAndroidPlatformBuild() {
+      return isAndroidPlatformBuild;
+    }
+
     B dumpInputToFile(Path file) {
       dumpInputFlags = DumpInputFlags.dumpToFile(file);
       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 1495071..203b1d6 100644
--- a/src/main/java/com/android/tools/r8/D8Command.java
+++ b/src/main/java/com/android/tools/r8/D8Command.java
@@ -425,6 +425,7 @@
           getMapIdProvider(),
           proguardMapConsumer,
           enableMissingLibraryApiModeling,
+          getAndroidPlatformBuild(),
           factory);
     }
   }
@@ -516,6 +517,7 @@
       MapIdProvider mapIdProvider,
       StringConsumer proguardMapConsumer,
       boolean enableMissingLibraryApiModeling,
+      boolean isAndroidPlatformBuild,
       DexItemFactory factory) {
     super(
         inputApp,
@@ -533,7 +535,8 @@
         threadCount,
         dumpInputFlags,
         mapIdProvider,
-        null);
+        null,
+        isAndroidPlatformBuild);
     this.intermediate = intermediate;
     this.globalSyntheticsConsumer = globalSyntheticsConsumer;
     this.desugarGraphConsumer = desugarGraphConsumer;
@@ -654,6 +657,8 @@
       horizontalClassMergerOptions.disable();
     }
 
+    internal.configureAndroidPlatformBuild(getAndroidPlatformBuild());
+
     internal.setDumpInputFlags(getDumpInputFlags(), skipDump);
     internal.dumpOptions = dumpOptions();
 
@@ -667,6 +672,7 @@
         .setIntermediate(intermediate)
         .setDesugaredLibraryConfiguration(desugaredLibrarySpecification)
         .setMainDexKeepRules(mainDexKeepRules)
+        .setEnableMissingLibraryApiModeling(enableMissingLibraryApiModeling)
         .build();
   }
 }
diff --git a/src/main/java/com/android/tools/r8/DexSplitterHelper.java b/src/main/java/com/android/tools/r8/DexSplitterHelper.java
deleted file mode 100644
index 43b8e9a..0000000
--- a/src/main/java/com/android/tools/r8/DexSplitterHelper.java
+++ /dev/null
@@ -1,156 +0,0 @@
-// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8;
-
-import static com.android.tools.r8.utils.ExceptionUtils.unwrapExecutionException;
-
-import com.android.tools.r8.DexIndexedConsumer.DirectoryConsumer;
-import com.android.tools.r8.dex.ApplicationReader;
-import com.android.tools.r8.dex.ApplicationWriter;
-import com.android.tools.r8.dex.Marker;
-import com.android.tools.r8.graph.AppInfo;
-import com.android.tools.r8.graph.AppView;
-import com.android.tools.r8.graph.DexApplication;
-import com.android.tools.r8.graph.DexProgramClass;
-import com.android.tools.r8.graph.LazyLoadedDexApplication;
-import com.android.tools.r8.naming.ClassNameMapper;
-import com.android.tools.r8.shaking.MainDexInfo;
-import com.android.tools.r8.synthesis.SyntheticItems.GlobalSyntheticsStrategy;
-import com.android.tools.r8.utils.ExceptionUtils;
-import com.android.tools.r8.utils.FeatureClassMapping;
-import com.android.tools.r8.utils.FeatureClassMapping.FeatureMappingException;
-import com.android.tools.r8.utils.InternalOptions;
-import com.android.tools.r8.utils.InternalOptions.DesugarState;
-import com.android.tools.r8.utils.ThreadUtils;
-import com.android.tools.r8.utils.Timing;
-import java.io.IOException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.HashMap;
-import java.util.List;
-import java.util.Map;
-import java.util.Map.Entry;
-import java.util.concurrent.ExecutionException;
-import java.util.concurrent.ExecutorService;
-
-@Keep
-public final class DexSplitterHelper {
-
-  public static void run(
-      D8Command command, FeatureClassMapping featureClassMapping, String output, String proguardMap)
-      throws CompilationFailedException {
-    ExecutorService executor = ThreadUtils.getExecutorService(ThreadUtils.NOT_SPECIFIED);
-    try {
-      ExceptionUtils.withCompilationHandler(
-          command.getReporter(),
-          () -> run(command, featureClassMapping, output, proguardMap, executor));
-    } finally {
-      executor.shutdown();
-    }
-  }
-
-  public static void run(
-      D8Command command,
-      FeatureClassMapping featureClassMapping,
-      String output,
-      String proguardMap,
-      ExecutorService executor)
-      throws IOException {
-    InternalOptions options = command.getInternalOptions();
-    options.desugarState = DesugarState.OFF;
-    options.enableMainDexListCheck = false;
-    options.ignoreMainDexMissingClasses = true;
-    options.minimalMainDex = false;
-    assert !options.isMinifying();
-    options.inlinerOptions().enableInlining = false;
-    options.outline.enabled = false;
-
-    try {
-      Timing timing = new Timing("DexSplitter");
-      ApplicationReader applicationReader =
-          new ApplicationReader(command.getInputApp(), options, timing);
-      DexApplication app = applicationReader.read(executor);
-      MainDexInfo mainDexInfo = applicationReader.readMainDexClasses(app);
-
-      List<Marker> markers = app.dexItemFactory.extractMarkers();
-
-      ClassNameMapper mapper = null;
-      if (proguardMap != null) {
-        mapper = ClassNameMapper.mapperFromFile(Paths.get(proguardMap));
-      }
-      Map<String, LazyLoadedDexApplication.Builder> applications =
-          getDistribution(app, featureClassMapping, mapper);
-      for (Entry<String, LazyLoadedDexApplication.Builder> entry : applications.entrySet()) {
-        String feature = entry.getKey();
-        timing.begin("Feature " + feature);
-        DexApplication featureApp = entry.getValue().build();
-        assert !options.hasMethodsFilter();
-
-        // If this is the base, we add the main dex list.
-        AppInfo appInfo =
-            feature.equals(featureClassMapping.getBaseName())
-                ? AppInfo.createInitialAppInfo(
-                    featureApp, GlobalSyntheticsStrategy.forNonSynthesizing(), mainDexInfo)
-                : AppInfo.createInitialAppInfo(
-                    featureApp, GlobalSyntheticsStrategy.forNonSynthesizing());
-        AppView<AppInfo> appView = AppView.createForD8(appInfo);
-
-        // Run d8 optimize to ensure jumbo strings are handled.
-        D8.optimize(appView, options, timing, executor);
-
-        // We create a specific consumer for each split.
-        Path outputDir = Paths.get(output).resolve(entry.getKey());
-        if (!Files.exists(outputDir)) {
-          Files.createDirectory(outputDir);
-        }
-        DexIndexedConsumer consumer = new DirectoryConsumer(outputDir);
-
-        try {
-          new ApplicationWriter(
-                  appView,
-                  markers,
-                  consumer)
-              .write(executor);
-          options.printWarnings();
-        } finally {
-          consumer.finished(options.reporter);
-        }
-        timing.end();
-      }
-    } catch (ExecutionException e) {
-      throw unwrapExecutionException(e);
-    } catch (FeatureMappingException e) {
-      options.reporter.error(e.getMessage());
-    } finally {
-      options.signalFinishedToConsumers();
-    }
-  }
-
-  private static Map<String, LazyLoadedDexApplication.Builder> getDistribution(
-      DexApplication app, FeatureClassMapping featureClassMapping, ClassNameMapper mapper)
-      throws FeatureMappingException {
-    Map<String, LazyLoadedDexApplication.Builder> applications = new HashMap<>();
-    for (DexProgramClass clazz : app.classes()) {
-      String clazzName =
-          mapper != null ? mapper.deobfuscateClassName(clazz.toString()) : clazz.toString();
-      String feature = featureClassMapping.featureForClass(clazzName);
-      LazyLoadedDexApplication.Builder featureApplication = applications.get(feature);
-      if (featureApplication == null) {
-        featureApplication = DexApplication.builder(app.options, app.timing);
-        applications.put(feature, featureApplication);
-      }
-      featureApplication.addProgramClass(clazz);
-    }
-    return applications;
-  }
-
-  public static void runD8ForTesting(D8Command command, boolean dontCreateMarkerInD8)
-      throws CompilationFailedException {
-    InternalOptions options = command.getInternalOptions();
-    options.testing.dontCreateMarkerInD8 = dontCreateMarkerInD8;
-    D8.runForTesting(command.getInputApp(), options);
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/L8Command.java b/src/main/java/com/android/tools/r8/L8Command.java
index 2b50253..dce9604 100644
--- a/src/main/java/com/android/tools/r8/L8Command.java
+++ b/src/main/java/com/android/tools/r8/L8Command.java
@@ -116,7 +116,8 @@
         threadCount,
         dumpInputFlags,
         mapIdProvider,
-        null);
+        null,
+        false);
     this.d8Command = d8Command;
     this.r8Command = r8Command;
     this.desugaredLibrarySpecification = desugaredLibrarySpecification;
@@ -302,6 +303,11 @@
     }
 
     @Override
+    public Builder setAndroidPlatformBuild(boolean isAndroidPlatformBuild) {
+      throw getReporter().fatalError("L8 does not support configuring Android platform builds.");
+    }
+
+    @Override
     void validate() {
       if (isPrintHelp()) {
         return;
diff --git a/src/main/java/com/android/tools/r8/R8.java b/src/main/java/com/android/tools/r8/R8.java
index d70426f..2fd907e 100644
--- a/src/main/java/com/android/tools/r8/R8.java
+++ b/src/main/java/com/android/tools/r8/R8.java
@@ -441,7 +441,7 @@
       assert appView.appInfo().hasLiveness();
       AppView<AppInfoWithLiveness> appViewWithLiveness = appView.withLiveness();
 
-      new StartupInstrumentation(appView).instrumentClasses(executorService);
+      new StartupInstrumentation(appView).instrumentAllClasses(executorService);
 
       assert verifyNoJarApplicationReaders(appView.appInfo().classes());
       assert appView.checkForTesting(() -> allReferencesAssignedApiLevel(appViewWithLiveness));
diff --git a/src/main/java/com/android/tools/r8/R8Command.java b/src/main/java/com/android/tools/r8/R8Command.java
index 8d323ab..309a475 100644
--- a/src/main/java/com/android/tools/r8/R8Command.java
+++ b/src/main/java/com/android/tools/r8/R8Command.java
@@ -634,7 +634,8 @@
               getDumpInputFlags(),
               getMapIdProvider(),
               getSourceFileProvider(),
-              enableMissingLibraryApiModeling);
+              enableMissingLibraryApiModeling,
+              getAndroidPlatformBuild());
 
       if (inputDependencyGraphConsumer != null) {
         inputDependencyGraphConsumer.finished();
@@ -821,7 +822,8 @@
       DumpInputFlags dumpInputFlags,
       MapIdProvider mapIdProvider,
       SourceFileProvider sourceFileProvider,
-      boolean enableMissingLibraryApiModeling) {
+      boolean enableMissingLibraryApiModeling,
+      boolean isAndroidPlatformBuild) {
     super(
         inputApp,
         mode,
@@ -838,7 +840,8 @@
         threadCount,
         dumpInputFlags,
         mapIdProvider,
-        sourceFileProvider);
+        sourceFileProvider,
+        isAndroidPlatformBuild);
     assert proguardConfiguration != null;
     assert mainDexKeepRules != null;
     this.mainDexKeepRules = mainDexKeepRules;
@@ -1038,6 +1041,8 @@
         SourceFileRewriter.computeSourceFileProvider(
             getSourceFileProvider(), proguardConfiguration, internal);
 
+    internal.configureAndroidPlatformBuild(getAndroidPlatformBuild());
+
     if (!DETERMINISTIC_DEBUGGING) {
       assert internal.threadCount == ThreadUtils.NOT_SPECIFIED;
       internal.threadCount = getThreadCount();
@@ -1086,6 +1091,7 @@
         .setProguardConfiguration(proguardConfiguration)
         .setMainDexKeepRules(mainDexKeepRules)
         .setDesugaredLibraryConfiguration(desugaredLibrarySpecification)
+        .setEnableMissingLibraryApiModeling(enableMissingLibraryApiModeling)
         .build();
   }
 }
diff --git a/src/main/java/com/android/tools/r8/R8CommandParser.java b/src/main/java/com/android/tools/r8/R8CommandParser.java
index dadb96a..3b80233 100644
--- a/src/main/java/com/android/tools/r8/R8CommandParser.java
+++ b/src/main/java/com/android/tools/r8/R8CommandParser.java
@@ -165,6 +165,7 @@
     Path outputPath = state.outputPath != null ? state.outputPath : Paths.get(".");
     OutputMode outputMode = state.outputMode != null ? state.outputMode : OutputMode.DexIndexed;
     builder.setOutput(outputPath, outputMode, state.includeDataResources);
+    builder.setEnableExperimentalMissingLibraryApiModeling(true);
     return builder;
   }
 
diff --git a/src/main/java/com/android/tools/r8/SwissArmyKnife.java b/src/main/java/com/android/tools/r8/SwissArmyKnife.java
index 2d836ae..2e44e14 100644
--- a/src/main/java/com/android/tools/r8/SwissArmyKnife.java
+++ b/src/main/java/com/android/tools/r8/SwissArmyKnife.java
@@ -6,7 +6,6 @@
 import com.android.tools.r8.bisect.Bisect;
 import com.android.tools.r8.cf.CfVerifierTool;
 import com.android.tools.r8.compatproguard.CompatProguard;
-import com.android.tools.r8.dexsplitter.DexSplitter;
 import com.android.tools.r8.relocator.RelocatorCommandLine;
 import com.android.tools.r8.tracereferences.TraceReferences;
 import java.util.Arrays;
@@ -41,9 +40,6 @@
       case "dexsegments":
         DexSegments.main(shift(args));
         break;
-      case "dexsplitter":
-        DexSplitter.main(shift(args));
-        break;
       case "disasm":
         Disassemble.main(shift(args));
         break;
diff --git a/src/main/java/com/android/tools/r8/debuginfo/DebugRepresentation.java b/src/main/java/com/android/tools/r8/debuginfo/DebugRepresentation.java
index 19bf467..967453b 100644
--- a/src/main/java/com/android/tools/r8/debuginfo/DebugRepresentation.java
+++ b/src/main/java/com/android/tools/r8/debuginfo/DebugRepresentation.java
@@ -8,20 +8,24 @@
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexCode;
 import com.android.tools.r8.graph.DexDebugInfo;
-import com.android.tools.r8.graph.DexDebugInfo.PcBasedDebugInfo;
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.DexString;
 import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.utils.CollectionUtils;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.IterableUtils;
 import com.android.tools.r8.utils.LebUtils;
 import com.android.tools.r8.utils.LineNumberOptimizer;
 import com.android.tools.r8.utils.StringUtils;
+import it.unimi.dsi.fastutil.ints.Int2ReferenceAVLTreeMap;
 import it.unimi.dsi.fastutil.ints.Int2ReferenceMap;
 import it.unimi.dsi.fastutil.ints.Int2ReferenceOpenHashMap;
+import it.unimi.dsi.fastutil.ints.Int2ReferenceSortedMap;
 import it.unimi.dsi.fastutil.ints.IntIterators;
 import java.util.ArrayList;
 import java.util.Arrays;
+import java.util.Collection;
 import java.util.Comparator;
 import java.util.IdentityHashMap;
 import java.util.List;
@@ -34,12 +38,12 @@
 
   public interface DebugRepresentationPredicate {
 
-    int getDexPcEncodingCutoff(DexProgramClass holder, DexEncodedMethod method);
+    int getDexPcEncodingCutoff(ProgramMethod method);
   }
 
   public static DebugRepresentationPredicate none(InternalOptions options) {
     assert !options.canUseDexPc2PcAsDebugInformation();
-    return (holder, method) -> NO_PC_ENCODING;
+    return method -> NO_PC_ENCODING;
   }
 
   public static DebugRepresentationPredicate fromFiles(
@@ -48,29 +52,33 @@
       return none(options);
     }
     if (options.canUseNativeDexPcInsteadOfDebugInfo()) {
-      return (holder, method) -> ALWAYS_PC_ENCODING;
+      return method -> ALWAYS_PC_ENCODING;
     }
     // TODO(b/220999985): Avoid the need to maintain a class-to-file map.
     Map<DexProgramClass, VirtualFile> classMapping = new IdentityHashMap<>();
     for (VirtualFile file : files) {
+      if (options.testing.debugRepresentationCallback != null) {
+        options.testing.debugRepresentationCallback.accept(file.getDebugRepresentation());
+      }
       file.classes().forEach(c -> classMapping.put(c, file));
     }
-    return (holder, method) -> {
-      if (!isPcCandidate(method, options)) {
+    return method -> {
+      if (!isPcCandidate(method.getDefinition(), options)) {
         return NO_PC_ENCODING;
       }
-      VirtualFile file = classMapping.get(holder);
+      VirtualFile file = classMapping.get(method.getHolder());
       DebugRepresentation cutoffs = file.getDebugRepresentation();
       int maxPc = cutoffs.getDexPcEncodingCutoff(method);
       assert maxPc == NO_PC_ENCODING
-          || verifyLastExecutableInstructionWithinBound(method.getCode().asDexCode(), maxPc);
+          || verifyLastExecutableInstructionWithinBound(
+              method.getDefinition().getCode().asDexCode(), maxPc);
       return maxPc;
     };
   }
 
-  private final Int2ReferenceMap<CostSummary> paramToInfo;
+  private final Int2ReferenceMap<ConversionInfo> paramToInfo;
 
-  private DebugRepresentation(Int2ReferenceMap<CostSummary> paramToInfo) {
+  private DebugRepresentation(Int2ReferenceMap<ConversionInfo> paramToInfo) {
     this.paramToInfo = paramToInfo;
   }
 
@@ -113,23 +121,31 @@
         int lastPc = lastInstruction.getOffset();
         int debugInfoCost = estimatedDebugInfoSize(debugInfo);
         paramCountToCosts
-            .computeIfAbsent(debugInfo.getParameterCount(), DebugRepresentation.CostSummary::new)
+            .computeIfAbsent(debugInfo.getParameterCount(), CostSummary::new)
             .addCost(lastPc, debugInfoCost);
       }
     }
     // Second compute the cost of converting to a pc encoding.
-    paramCountToCosts.forEach((ignored, summary) -> summary.computeConversionCosts(appView));
+    Int2ReferenceMap<ConversionInfo> conversions =
+        new Int2ReferenceOpenHashMap<>(paramCountToCosts.size());
+    paramCountToCosts.forEach(
+        (param, summary) -> conversions.put(param, summary.computeConversionCosts(appView)));
     // The result is stored on the virtual files for thread safety.
     // TODO(b/220999985): Consider just passing this to the line number optimizer once fixed.
-    file.setDebugRepresentation(new DebugRepresentation(paramCountToCosts));
+    file.setDebugRepresentation(new DebugRepresentation(conversions));
   }
 
-  private int getDexPcEncodingCutoff(DexEncodedMethod method) {
-    DexCode code = method.getCode().asDexCode();
+  private int getDexPcEncodingCutoff(ProgramMethod method) {
+    if (paramToInfo.isEmpty()) {
+      // This should only be the case if the method has overloads and thus *cannot* use pc encoding.
+      assert verifyMethodHasOverloads(method);
+      return NO_PC_ENCODING;
+    }
+    DexCode code = method.getDefinition().getCode().asDexCode();
     int paramCount = method.getParameters().size();
     assert code.getDebugInfo() == null || code.getDebugInfo().getParameterCount() == paramCount;
-    CostSummary conversionInfo = paramToInfo.get(paramCount);
-    if (conversionInfo == null || conversionInfo.cutoff < 0) {
+    ConversionInfo conversionInfo = paramToInfo.get(paramCount);
+    if (conversionInfo == null || !conversionInfo.hasConversions()) {
       // We expect all methods calling this to have computed conversion info.
       assert conversionInfo != null;
       return NO_PC_ENCODING;
@@ -139,14 +155,24 @@
       return NO_PC_ENCODING;
     }
     int maxPc = lastInstruction.getOffset();
-    return maxPc <= conversionInfo.cutoff ? conversionInfo.cutoff : NO_PC_ENCODING;
+    return conversionInfo.getConversionPointFor(maxPc);
+  }
+
+  private boolean verifyMethodHasOverloads(ProgramMethod method) {
+    assert 1
+        < IterableUtils.size(method.getHolder().methods(m -> m.getName().equals(method.getName())));
+    return true;
   }
 
   @Override
   public String toString() {
-    List<CostSummary> sorted = new ArrayList<>(paramToInfo.values());
+    return toString(false);
+  }
+
+  public String toString(boolean printCostSummary) {
+    List<ConversionInfo> sorted = new ArrayList<>(paramToInfo.values());
     sorted.sort(Comparator.comparing(i -> i.paramCount));
-    return StringUtils.join("\n", sorted, CostSummary::toString);
+    return StringUtils.join("\n", sorted, c -> c.toString(printCostSummary));
   }
 
   private static boolean isPcCandidate(DexEncodedMethod method, InternalOptions options) {
@@ -157,14 +183,32 @@
     return LineNumberOptimizer.mustHaveResidualDebugInfo(code, options);
   }
 
-  /** The cost of representing normal debug info for all methods with this max pc value. */
-  private static class PcNormalCost {
-
+  /** Cost information for debug info at a given PC. */
+  private static class PcCostInfo {
+    // PC point for which the information pertains to.
     final int pc;
-    int cost;
-    int methods;
 
-    public PcNormalCost(int pc) {
+    // Normal debug-info encoding cost.
+    int cost = 0;
+
+    // Number of methods this information pertains to.
+    int methods = 0;
+
+    @Override
+    public String toString() {
+      return "pc="
+          + pc
+          + ", cost="
+          + cost
+          + ", methods="
+          + methods
+          + ", saved="
+          + (cost - pc)
+          + ", overhead="
+          + getExpansionOverhead(pc, methods, cost);
+    }
+
+    public PcCostInfo(int pc) {
       assert pc >= 0;
       this.pc = pc;
     }
@@ -176,20 +220,76 @@
     }
   }
 
+  /** Conversion judgment up to a given PC bound (the lower bound is context dependent). */
+  private static class PcConversionInfo {
+    static final PcConversionInfo NO_CONVERSION = new PcConversionInfo(-1, false, 0, 0);
+
+    // PC bound for which the information pertains to.
+    final int pc;
+
+    // Judgment of whether the methods in this grouping should be converted to pc2pc encoding.
+    final boolean converted;
+
+    // Info for debugging.
+    private final int methods;
+    private final int normalCost;
+
+    public PcConversionInfo(int pc, boolean converted, int methods, int normalCost) {
+      this.pc = pc;
+      this.converted = converted;
+      this.methods = methods;
+      this.normalCost = normalCost;
+    }
+
+    @Override
+    public String toString() {
+      return "pc="
+          + pc
+          + ", converted="
+          + converted
+          + ", cost="
+          + normalCost
+          + ", methods="
+          + methods
+          + ", saved="
+          + (normalCost - pc)
+          + ", overhead="
+          + getExpansionOverhead(pc, methods, normalCost);
+    }
+  }
+
+  // A pc2pc stream is approximately one event more than the pc.
+  private static int pcEventCount(int pc) {
+    return pc + 1;
+  }
+
+  /**
+   * Figure for the overhead that the pc2pc encoding can result in.
+   *
+   * <p>This overhead is not in the encoding size but rather if the encoding is expanded at each
+   * method referencing the shared PC encoding.
+   */
+  private static int getExpansionOverhead(int currentPc, int methodCount, int normalCost) {
+    long expansion = ((long) pcEventCount(currentPc)) * methodCount;
+    long cost = expansion - normalCost;
+    return cost > Integer.MAX_VALUE ? Integer.MAX_VALUE : (int) cost;
+  }
+
+  private static boolean isWithinExpansionThreshold(
+      int threshold, int currentPc, int methodCount, int normalCost) {
+    // A negative threshold denotes unbounded.
+    if (threshold < 0) {
+      return true;
+    }
+    return getExpansionOverhead(currentPc, methodCount, normalCost) <= threshold;
+  }
+
   /** The summary of normal costs for all debug info with a particular parameter size. */
   private static class CostSummary {
-
     private final int paramCount;
 
     // Values for the normal encoding costs per-pc.
-    private final Int2ReferenceMap<PcNormalCost> pcToCost = new Int2ReferenceOpenHashMap<>();
-    private int minPc = Integer.MAX_VALUE;
-    private int maxPc = Integer.MIN_VALUE;
-
-    // Values for the conversion costs. These are computed only after all per-pc costs are known.
-    private int cutoff;
-    private int normalPreCutoffCost;
-    private int normalPostCutoffCost;
+    private Int2ReferenceMap<PcCostInfo> pcToCost = new Int2ReferenceOpenHashMap<>();
 
     private CostSummary(int paramCount) {
       assert paramCount >= 0;
@@ -198,82 +298,166 @@
 
     private void addCost(int pc, int cost) {
       assert pc >= 0;
-      pcToCost.computeIfAbsent(pc, PcNormalCost::new).add(cost);
-      minPc = Math.min(minPc, pc);
-      maxPc = Math.max(maxPc, pc);
+      pcToCost.computeIfAbsent(pc, PcCostInfo::new).add(cost);
     }
 
-    private void computeConversionCosts(AppView<?> appView) {
+    private static class ConversionState {
+      Int2ReferenceSortedMap<PcConversionInfo> groups = new Int2ReferenceAVLTreeMap<>();
+      PcConversionInfo converted = PcConversionInfo.NO_CONVERSION;
+      int flushedPc = 0;
+      int unconvertedPc = 0;
+      int normalCost = 0;
+      int methods = 0;
+
+      void reset() {
+        converted = PcConversionInfo.NO_CONVERSION;
+        unconvertedPc = 0;
+        normalCost = 0;
+        methods = 0;
+      }
+
+      void add(PcCostInfo costInfo) {
+        methods += costInfo.methods;
+        normalCost += costInfo.cost;
+      }
+
+      void flush() {
+        if (flushedPc < converted.pc) {
+          groups.put(converted.pc, converted);
+          flushedPc = converted.pc;
+        }
+        if (flushedPc < unconvertedPc) {
+          if (0 < flushedPc && !groups.get(flushedPc).converted) {
+            groups.remove(flushedPc);
+          }
+          PcConversionInfo unconverted =
+              new PcConversionInfo(unconvertedPc, false, methods, normalCost);
+          groups.put(unconvertedPc, unconverted);
+          flushedPc = unconvertedPc;
+        }
+        reset();
+      }
+
+      void update(int currentPc, boolean convertToPc) {
+        if (convertToPc) {
+          converted = new PcConversionInfo(currentPc, true, methods, normalCost);
+          unconvertedPc = 0;
+        } else {
+          unconvertedPc = currentPc;
+        }
+      }
+
+      public Int2ReferenceSortedMap<PcConversionInfo> getFinalConversions() {
+        // If there is only a single group check it is actually a converted range.
+        if (groups.size() > 1
+            || (groups.size() == 1 && groups.values().iterator().next().converted)) {
+          return groups;
+        }
+        return null;
+      }
+    }
+
+    private ConversionInfo computeConversionCosts(AppView<?> appView) {
+      int threshold = appView.options().testing.pcBasedDebugEncodingOverheadThreshold;
       boolean forcePcBasedEncoding = appView.options().testing.forcePcBasedEncoding;
       assert !pcToCost.isEmpty();
-      // Point at which it is estimated that conversion to PC-encoding is viable.
-      int currentConvertedPc = -1;
-      // The normal cost of the part that is viable for conversion (this is just for debugging).
-      int normalConvertedCost = 0;
-      // The normal cost of the part that is not yet part of the converted range.
-      int normalOutstandingCost = 0;
       // Iterate in ascending order as the point conversion cost is the sum of the preceding costs.
       int[] sortedPcs = new int[pcToCost.size()];
       IntIterators.unwrap(pcToCost.keySet().iterator(), sortedPcs);
       Arrays.sort(sortedPcs);
+      ConversionState state = new ConversionState();
       for (int currentPc : sortedPcs) {
-        PcNormalCost pcSummary = pcToCost.get(currentPc);
-        // The cost of the debug info unconverted is the sum of the unconverted up to this point.
-        normalOutstandingCost += pcSummary.cost;
-        // The cost of the conversion is the delta between the already converted and the current.
-        // This does not account for the header overhead on converting the first point. However,
-        // the few bytes overhead per param-count should not affect much.
-        int costToConvert = currentPc - currentConvertedPc;
-        // If the estimated cost is larger we convert. The order here could be either way as
-        // both the normal cost and converted cost are estimates. Canonicalization could reduce
-        // the former and compaction could reduce the latter.
-        if (forcePcBasedEncoding || normalOutstandingCost > costToConvert) {
-          normalConvertedCost += normalOutstandingCost;
-          normalOutstandingCost = 0;
-          currentConvertedPc = currentPc;
+        PcCostInfo current = pcToCost.get(currentPc);
+        assert currentPc == current.pc;
+        // Don't extend the conversion group as it could potentially become too large if expanded.
+        // Any pending conversion can be flushed now.
+        if (!isWithinExpansionThreshold(
+            threshold,
+            currentPc,
+            state.methods + current.methods,
+            state.normalCost + current.cost)) {
+          state.flush();
         }
+        state.add(current);
+        int costToConvert = pcEventCount(currentPc);
+        boolean canExpand =
+            isWithinExpansionThreshold(threshold, currentPc, state.methods, state.normalCost);
+        state.update(
+            currentPc, canExpand && (forcePcBasedEncoding || state.normalCost > costToConvert));
       }
-      cutoff = currentConvertedPc;
-      normalPreCutoffCost = normalConvertedCost;
-      normalPostCutoffCost = normalOutstandingCost;
-      assert cutoff >= -1;
-      assert normalPreCutoffCost >= 0;
-      assert normalPostCutoffCost >= 0;
-      assert preCutoffPcCost() >= 0;
-      assert postCutoffPcCost() >= 0;
-    }
-
-    private int preCutoffPcCost() {
-      return cutoff > 0 ? PcBasedDebugInfo.estimatedWriteSize(paramCount, cutoff) : 0;
-    }
-
-    private int postCutoffPcCost() {
-      return cutoff < maxPc ? PcBasedDebugInfo.estimatedWriteSize(paramCount, maxPc - cutoff) : 0;
+      state.flush();
+      return new ConversionInfo(
+          paramCount,
+          state.getFinalConversions(),
+          appView.options().testing.debugRepresentationCallback != null ? this : null);
     }
 
     @Override
     public String toString() {
       StringBuilder builder = new StringBuilder();
-      builder
-          .append("p:")
-          .append(paramCount)
-          .append(", c:")
-          .append(cutoff)
-          .append(", m:")
-          .append(maxPc);
-      if (cutoff > 0) {
-        builder
-            .append(", preCutNormal:")
-            .append(normalPreCutoffCost)
-            .append(", preCutPC:")
-            .append(preCutoffPcCost());
+      builder.append("params:").append(paramCount).append('\n');
+      Collection<Integer> keys = CollectionUtils.sort(pcToCost.keySet(), Integer::compareTo);
+      for (int key : keys) {
+        builder.append(pcToCost.get(key)).append('\n');
       }
-      if (cutoff < maxPc) {
-        builder
-            .append(", postCutNormal:")
-            .append(normalPostCutoffCost)
-            .append(", postCutPC:")
-            .append(postCutoffPcCost());
+      return builder.toString();
+    }
+  }
+
+  /** The computed conversion points all debug info with a particular parameter size. */
+  private static class ConversionInfo {
+    private final int paramCount;
+    private final Int2ReferenceSortedMap<PcConversionInfo> conversions;
+
+    // For debugging purposes.
+    private final CostSummary costSummary;
+
+    private ConversionInfo(
+        int paramCount,
+        Int2ReferenceSortedMap<PcConversionInfo> conversions,
+        CostSummary costSummary) {
+      assert paramCount >= 0;
+      this.paramCount = paramCount;
+      this.conversions = conversions;
+      this.costSummary = costSummary;
+    }
+
+    boolean hasConversions() {
+      return conversions != null;
+    }
+
+    int getConversionPointFor(int pc) {
+      Int2ReferenceSortedMap<PcConversionInfo> tailMap = conversions.tailMap(pc);
+      if (tailMap.isEmpty()) {
+        return -1;
+      }
+      int pcGroupBound = tailMap.firstIntKey();
+      PcConversionInfo entryUpToIncludingMax = conversions.get(pcGroupBound);
+      if (entryUpToIncludingMax.converted) {
+        assert pcGroupBound == entryUpToIncludingMax.pc;
+        return pcGroupBound;
+      }
+      return -1;
+    }
+
+    @Override
+    public String toString() {
+      return toString(false);
+    }
+
+    public String toString(boolean printCostSummaries) {
+      StringBuilder builder = new StringBuilder();
+      builder.append("params:").append(paramCount).append('\n');
+      if (conversions != null) {
+        for (PcConversionInfo group : conversions.values()) {
+          builder.append(group).append('\n');
+        }
+      } else {
+        builder.append(" no conversions").append('\n');
+      }
+      if (printCostSummaries && costSummary != null) {
+        builder.append("Cost summaries:\n");
+        builder.append(costSummary);
       }
       return builder.toString();
     }
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 d4f1195..3e59e50 100644
--- a/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
+++ b/src/main/java/com/android/tools/r8/dex/ApplicationWriter.java
@@ -727,16 +727,18 @@
               options.itemFactory));
     }
 
-    if (clazz.isNestHost()) {
-      annotations.add(
-          DexAnnotation.createNestMembersAnnotation(
-              clazz.getNestMembersClassAttributes(), options.itemFactory));
-    }
+    if (options.emitNestAnnotationsInDex) {
+      if (clazz.isNestHost()) {
+        annotations.add(
+            DexAnnotation.createNestMembersAnnotation(
+                clazz.getNestMembersClassAttributes(), options.itemFactory));
+      }
 
-    if (clazz.isNestMember()) {
-      annotations.add(
-          DexAnnotation.createNestHostAnnotation(
-              clazz.getNestHostClassAttribute(), options.itemFactory));
+      if (clazz.isNestMember()) {
+        annotations.add(
+            DexAnnotation.createNestHostAnnotation(
+                clazz.getNestHostClassAttribute(), options.itemFactory));
+      }
     }
 
     if (clazz.hasPermittedSubclassAttributes() && options.canUseSealedClasses()) {
diff --git a/src/main/java/com/android/tools/r8/dex/MixedSectionLayoutStrategy.java b/src/main/java/com/android/tools/r8/dex/MixedSectionLayoutStrategy.java
index 5454b0f..7143d6b 100644
--- a/src/main/java/com/android/tools/r8/dex/MixedSectionLayoutStrategy.java
+++ b/src/main/java/com/android/tools/r8/dex/MixedSectionLayoutStrategy.java
@@ -29,11 +29,22 @@
                 .getStartupOrder()
                 .toStartupOrderForWriting(appView)
             : StartupOrder.empty();
-    if (startupOrderForWriting.isEmpty()) {
-      return new DefaultMixedSectionLayoutStrategy(appView, mixedSectionOffsets);
-    }
-    return new StartupMixedSectionLayoutStrategy(
-        appView, mixedSectionOffsets, startupOrderForWriting, virtualFile);
+    MixedSectionLayoutStrategy mixedSectionLayoutStrategy =
+        startupOrderForWriting.isEmpty()
+            ? new DefaultMixedSectionLayoutStrategy(appView, mixedSectionOffsets)
+            : new StartupMixedSectionLayoutStrategy(
+                appView, mixedSectionOffsets, startupOrderForWriting, virtualFile);
+    return wrapForTesting(appView, mixedSectionLayoutStrategy, virtualFile);
+  }
+
+  private static MixedSectionLayoutStrategy wrapForTesting(
+      AppView<?> appView,
+      MixedSectionLayoutStrategy mixedSectionLayoutStrategy,
+      VirtualFile virtualFile) {
+    return appView
+        .testing()
+        .mixedSectionLayoutStrategyInspector
+        .apply(mixedSectionLayoutStrategy, virtualFile);
   }
 
   public abstract Collection<DexAnnotation> getAnnotationLayout();
diff --git a/src/main/java/com/android/tools/r8/dex/StartupMixedSectionLayoutStrategy.java b/src/main/java/com/android/tools/r8/dex/StartupMixedSectionLayoutStrategy.java
index b5ccc6b..eb03451 100644
--- a/src/main/java/com/android/tools/r8/dex/StartupMixedSectionLayoutStrategy.java
+++ b/src/main/java/com/android/tools/r8/dex/StartupMixedSectionLayoutStrategy.java
@@ -5,6 +5,7 @@
 package com.android.tools.r8.dex;
 
 import com.android.tools.r8.dex.FileWriter.MixedSectionOffsets;
+import com.android.tools.r8.experimental.startup.StartupClass;
 import com.android.tools.r8.experimental.startup.StartupOrder;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexAnnotation;
@@ -30,7 +31,6 @@
 import java.util.Collection;
 import java.util.LinkedHashSet;
 import java.util.Map;
-import java.util.Set;
 
 public class StartupMixedSectionLayoutStrategy extends DefaultMixedSectionLayoutStrategy {
 
@@ -79,8 +79,9 @@
             virtualFile.classes().size());
     LensCodeRewriterUtils rewriter = new LensCodeRewriterUtils(appView, true);
     StartupIndexedItemCollection indexedItemCollection = new StartupIndexedItemCollection();
-    for (DexType startupClass : startupOrderForWriting.getClasses()) {
-      DexProgramClass definition = virtualFileDefinitions.get(startupClass);
+    for (StartupClass<DexType> startupClass : startupOrderForWriting.getClasses()) {
+      assert !startupClass.isSynthetic();
+      DexProgramClass definition = virtualFileDefinitions.get(startupClass.getReference());
       if (definition != null) {
         definition.collectIndexedItems(appView, indexedItemCollection, rewriter);
       }
@@ -120,10 +121,7 @@
 
   @Override
   public Collection<ProgramMethod> getCodeLayout() {
-    Set<DexProgramClass> nonStartupClasses =
-        new LinkedHashSet<>(mixedSectionOffsets.getClassesWithData());
-    nonStartupClasses.removeIf(clazz -> startupOrderForWriting.contains(clazz.getType()));
-    return amendStartupLayout(codeLayout, super.getCodeLayoutForClasses(nonStartupClasses));
+    return amendStartupLayout(codeLayout, super.getCodeLayout());
   }
 
   @Override
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 80b9a6c..839545d 100644
--- a/src/main/java/com/android/tools/r8/dex/VirtualFile.java
+++ b/src/main/java/com/android/tools/r8/dex/VirtualFile.java
@@ -10,7 +10,10 @@
 import com.android.tools.r8.debuginfo.DebugRepresentation;
 import com.android.tools.r8.errors.DexFileOverflowDiagnostic;
 import com.android.tools.r8.errors.InternalCompilerError;
+import com.android.tools.r8.experimental.startup.StartupClass;
+import com.android.tools.r8.experimental.startup.StartupOrder;
 import com.android.tools.r8.features.ClassToFeatureSplitMap;
+import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexCallSite;
 import com.android.tools.r8.graph.DexEncodedMethod;
@@ -44,6 +47,7 @@
 import com.android.tools.r8.utils.Timing;
 import com.google.common.collect.ImmutableList;
 import com.google.common.collect.ImmutableMap;
+import com.google.common.collect.Iterables;
 import com.google.common.collect.Iterators;
 import com.google.common.collect.Sets;
 import it.unimi.dsi.fastutil.ints.Int2ReferenceMaps;
@@ -407,15 +411,17 @@
         return ImmutableMap.of();
       }
 
+      AppView<? extends AppInfoWithClassHierarchy> appViewWithClassHierarchy =
+          appView.withClassHierarchy();
       ClassToFeatureSplitMap classToFeatureSplitMap =
-          appView.appInfo().withClassHierarchy().getClassToFeatureSplitMap();
+          appViewWithClassHierarchy.appInfo().getClassToFeatureSplitMap();
       if (classToFeatureSplitMap.isEmpty()) {
         return ImmutableMap.of();
       }
 
       // Pull out the classes that should go into feature splits.
       Map<FeatureSplit, Set<DexProgramClass>> featureSplitClasses =
-          classToFeatureSplitMap.getFeatureSplitClasses(classes, appView.getSyntheticItems());
+          classToFeatureSplitMap.getFeatureSplitClasses(classes, appViewWithClassHierarchy);
       if (featureSplitClasses.size() > 0) {
         for (Set<DexProgramClass> featureClasses : featureSplitClasses.values()) {
           classes.removeAll(featureClasses);
@@ -939,11 +945,19 @@
         if (!appView.hasClassHierarchy()) {
           return alwaysFalse();
         }
-        ClassToFeatureSplitMap classToFeatureSplitMap =
-            appView.appInfo().withClassHierarchy().getClassToFeatureSplitMap();
+        StartupOrder startupOrder = appView.appInfoWithClassHierarchy().getStartupOrder();
         SyntheticItems syntheticItems = appView.getSyntheticItems();
-        return clazz ->
-            classToFeatureSplitMap.getFeatureSplit(clazz, syntheticItems).isStartupBase();
+        return clazz -> {
+          if (syntheticItems.isSyntheticClass(clazz)) {
+            return Iterables.any(
+                syntheticItems.getSynthesizingContextTypes(clazz.getType()),
+                startupOrder::containsSyntheticClassesSynthesizedFrom);
+          } else {
+            StartupClass<DexType> startupClass =
+                StartupClass.<DexType>builder().setReference(clazz.getType()).build();
+            return startupOrder.contains(startupClass);
+          }
+        };
       }
 
       public List<DexProgramClass> getStartupClasses() {
diff --git a/src/main/java/com/android/tools/r8/dexsplitter/DexSplitter.java b/src/main/java/com/android/tools/r8/dexsplitter/DexSplitter.java
deleted file mode 100644
index 4ee416c..0000000
--- a/src/main/java/com/android/tools/r8/dexsplitter/DexSplitter.java
+++ /dev/null
@@ -1,377 +0,0 @@
-// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-package com.android.tools.r8.dexsplitter;
-
-import com.android.tools.r8.CompilationFailedException;
-import com.android.tools.r8.D8Command;
-import com.android.tools.r8.DexIndexedConsumer;
-import com.android.tools.r8.DexSplitterHelper;
-import com.android.tools.r8.Diagnostic;
-import com.android.tools.r8.DiagnosticsHandler;
-import com.android.tools.r8.Keep;
-import com.android.tools.r8.origin.PathOrigin;
-import com.android.tools.r8.utils.AbortException;
-import com.android.tools.r8.utils.ExceptionDiagnostic;
-import com.android.tools.r8.utils.ExceptionUtils;
-import com.android.tools.r8.utils.FeatureClassMapping;
-import com.android.tools.r8.utils.FeatureClassMapping.FeatureMappingException;
-import com.android.tools.r8.utils.OptionsParsing;
-import com.android.tools.r8.utils.OptionsParsing.ParseContext;
-import com.android.tools.r8.utils.StringDiagnostic;
-import com.android.tools.r8.utils.ZipUtils;
-import com.google.common.collect.ImmutableList;
-import java.io.IOException;
-import java.io.InputStream;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.ArrayList;
-import java.util.Enumeration;
-import java.util.List;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-
-@Keep
-public final class DexSplitter {
-
-  private static final String DEFAULT_OUTPUT_DIR = "output";
-  private static final String DEFAULT_BASE_NAME = "base";
-
-  private static final boolean PRINT_ARGS = false;
-
-  public static class FeatureJar {
-    private String jar;
-    private String outputName;
-
-    public FeatureJar(String jar, String outputName) {
-      this.jar = jar;
-      this.outputName = outputName;
-    }
-
-    public FeatureJar(String jar) {
-      this(jar, featureNameFromJar(jar));
-    }
-
-    public String getJar() {
-      return jar;
-    }
-
-    public String getOutputName() {
-      return outputName;
-    }
-
-    private static String featureNameFromJar(String jar) {
-      Path jarPath = Paths.get(jar);
-      String featureName = jarPath.getFileName().toString();
-      if (featureName.endsWith(".jar") || featureName.endsWith(".zip")) {
-        featureName = featureName.substring(0, featureName.length() - 4);
-      }
-      return featureName;
-    }
-  }
-
-  private static class ZipFileOrigin extends PathOrigin {
-
-    public ZipFileOrigin(Path path) {
-      super(path);
-    }
-
-    @Override
-    public String part() {
-      return "splitting of file '" + super.part() + "'";
-    }
-  }
-
-  @Keep
-  public static final class Options {
-    private final DiagnosticsHandler diagnosticsHandler;
-    private List<String> inputArchives = new ArrayList<>();
-    private List<FeatureJar> featureJars = new ArrayList<>();
-    private List<String> baseJars = new ArrayList<>();
-    private String baseOutputName = DEFAULT_BASE_NAME;
-    private String output = DEFAULT_OUTPUT_DIR;
-    private String featureSplitMapping;
-    private String proguardMap;
-    private String mainDexList;
-    private boolean splitNonClassResources = false;
-
-    public Options() {
-      this(new DiagnosticsHandler() {});
-    }
-
-    public Options(DiagnosticsHandler diagnosticsHandler) {
-      this.diagnosticsHandler = diagnosticsHandler;
-    }
-
-    public DiagnosticsHandler getDiagnosticsHandler() {
-      return diagnosticsHandler;
-    }
-
-    public String getMainDexList() {
-      return mainDexList;
-    }
-
-    public void setMainDexList(String mainDexList) {
-      this.mainDexList = mainDexList;
-    }
-
-    public String getOutput() {
-      return output;
-    }
-
-    public void setOutput(String output) {
-      this.output = output;
-    }
-
-    public String getFeatureSplitMapping() {
-      return featureSplitMapping;
-    }
-
-    public void setFeatureSplitMapping(String featureSplitMapping) {
-      this.featureSplitMapping = featureSplitMapping;
-    }
-
-    public String getProguardMap() {
-      return proguardMap;
-    }
-
-    public void setProguardMap(String proguardMap) {
-      this.proguardMap = proguardMap;
-    }
-
-    public String getBaseOutputName() {
-      return baseOutputName;
-    }
-
-    public void setBaseOutputName(String baseOutputName) {
-      this.baseOutputName = baseOutputName;
-    }
-
-    public void addInputArchive(String inputArchive) {
-      inputArchives.add(inputArchive);
-    }
-
-    public void addBaseJar(String baseJar) {
-      baseJars.add(baseJar);
-    }
-
-    private void addFeatureJar(FeatureJar featureJar) {
-      featureJars.add(featureJar);
-    }
-
-    public void addFeatureJar(String jar) {
-      featureJars.add(new FeatureJar(jar));
-    }
-
-    public void addFeatureJar(String jar, String outputName) {
-      featureJars.add(new FeatureJar(jar, outputName));
-    }
-
-    public void setSplitNonClassResources(boolean value) {
-      splitNonClassResources = value;
-    }
-
-    public ImmutableList<String> getInputArchives() {
-      return ImmutableList.copyOf(inputArchives);
-    }
-
-    ImmutableList<FeatureJar> getFeatureJars() {
-      return ImmutableList.copyOf(featureJars);
-    }
-
-    ImmutableList<String> getBaseJars() {
-      return ImmutableList.copyOf(baseJars);
-    }
-
-    // Shorthand error messages.
-    public Diagnostic error(String msg) {
-      StringDiagnostic error = new StringDiagnostic(msg);
-      diagnosticsHandler.error(error);
-      return error;
-    }
-  }
-
-  /**
-   * Parse a feature jar argument and return the corresponding FeatureJar representation.
-   * Default to use the name of the jar file if the argument contains no ':', if the argument
-   * contains ':', then use the value after the ':' as the name.
-   * @param argument
-   */
-  private static FeatureJar parseFeatureJarArgument(String argument) {
-    if (argument.contains(":")) {
-      String[] parts = argument.split(":");
-      if (parts.length > 2) {
-        throw new RuntimeException("--feature-jar argument contains more than one :");
-      }
-      return new FeatureJar(parts[0], parts[1]);
-    }
-    return new FeatureJar(argument);
-  }
-
-  private static Options parseArguments(String[] args) {
-    Options options = new Options();
-    ParseContext context = new ParseContext(args);
-    while (context.head() != null) {
-      List<String> inputs = OptionsParsing.tryParseMulti(context, "--input");
-      if (inputs != null) {
-        inputs.forEach(options::addInputArchive);
-        continue;
-      }
-      List<String> featureJars = OptionsParsing.tryParseMulti(context, "--feature-jar");
-      if (featureJars != null) {
-        featureJars.forEach((feature) -> options.addFeatureJar(parseFeatureJarArgument(feature)));
-        continue;
-      }
-      List<String> baseJars = OptionsParsing.tryParseMulti(context, "--base-jar");
-      if (baseJars != null) {
-        baseJars.forEach(options::addBaseJar);
-        continue;
-      }
-      String output = OptionsParsing.tryParseSingle(context, "--output", "-o");
-      if (output != null) {
-        options.setOutput(output);
-        continue;
-      }
-
-      String mainDexList= OptionsParsing.tryParseSingle(context, "--main-dex-list", null);
-      if (mainDexList!= null) {
-        options.setMainDexList(mainDexList);
-        continue;
-      }
-
-      String proguardMap = OptionsParsing.tryParseSingle(context, "--proguard-map", null);
-      if (proguardMap != null) {
-        options.setProguardMap(proguardMap);
-        continue;
-      }
-      String baseOutputName = OptionsParsing.tryParseSingle(context, "--base-output-name", null);
-      if (baseOutputName != null) {
-        options.setBaseOutputName(baseOutputName);
-        continue;
-      }
-      String featureSplit = OptionsParsing.tryParseSingle(context, "--feature-splits", null);
-      if (featureSplit != null) {
-        options.setFeatureSplitMapping(featureSplit);
-        continue;
-      }
-      Boolean b = OptionsParsing.tryParseBoolean(context, "--split-non-class-resources");
-      if (b != null) {
-        options.setSplitNonClassResources(b);
-        continue;
-      }
-      throw new RuntimeException(String.format("Unknown options: '%s'.", context.head()));
-    }
-    return options;
-  }
-
-  private static FeatureClassMapping createFeatureClassMapping(Options options)
-      throws FeatureMappingException {
-    if (options.getFeatureSplitMapping() != null) {
-      return FeatureClassMapping.fromSpecification(
-          Paths.get(options.getFeatureSplitMapping()), options.getDiagnosticsHandler());
-    }
-    assert !options.getFeatureJars().isEmpty();
-    return FeatureClassMapping.Internal.fromJarFiles(options.getFeatureJars(),
-        options.getBaseJars(), options.getBaseOutputName(), options.getDiagnosticsHandler());
-  }
-
-  private static void run(String[] args)
-      throws CompilationFailedException, FeatureMappingException {
-    Options options = parseArguments(args);
-    run(options);
-  }
-
-  public static void run(Options options)
-      throws FeatureMappingException, CompilationFailedException {
-    Diagnostic error = null;
-    if (options.getInputArchives().isEmpty()) {
-      error = options.error("Need at least one --input");
-    }
-    if (options.getFeatureSplitMapping() == null && options.getFeatureJars().isEmpty()) {
-      error = options.error("You must supply a feature split mapping or feature jars");
-    }
-    if (options.getFeatureSplitMapping() != null && !options.getFeatureJars().isEmpty()) {
-      error = options.error("You can't supply both a feature split mapping and feature jars");
-    }
-    if (error != null) {
-      throw new AbortException(error);
-    }
-
-    D8Command.Builder builder = D8Command.builder(options.diagnosticsHandler);
-
-
-    for (String s : options.inputArchives) {
-      builder.addProgramFiles(Paths.get(s));
-    }
-    // We set the actual consumer on the ApplicationWriter when we have calculated the distribution
-    // since we don't yet know the distribution.
-    builder.setProgramConsumer(DexIndexedConsumer.emptyConsumer());
-    if (options.getMainDexList() != null) {
-      builder.addMainDexListFiles(Paths.get(options.getMainDexList()));
-    }
-
-    FeatureClassMapping featureClassMapping = createFeatureClassMapping(options);
-
-    DexSplitterHelper.run(
-        builder.build(), featureClassMapping, options.getOutput(), options.getProguardMap());
-
-    if (options.splitNonClassResources) {
-      splitNonClassResources(options, featureClassMapping);
-    }
-  }
-
-  private static void splitNonClassResources(Options options,
-      FeatureClassMapping featureClassMapping) {
-    for (String s : options.inputArchives) {
-      try (ZipFile zipFile = new ZipFile(s, StandardCharsets.UTF_8)) {
-        Enumeration<? extends ZipEntry> entries = zipFile.entries();
-        while (entries.hasMoreElements()) {
-          ZipEntry entry = entries.nextElement();
-          String name = entry.getName();
-          if (!ZipUtils.isDexFile(name) && !ZipUtils.isClassFile(name)) {
-            String feature = featureClassMapping.featureForNonClass(name);
-            Path outputDir = Paths.get(options.getOutput()).resolve(feature);
-            try (InputStream stream = zipFile.getInputStream(entry)) {
-              Path outputFile = outputDir.resolve(name);
-              Path parent = outputFile.getParent();
-              if (parent != null) {
-                Files.createDirectories(parent);
-              }
-              Files.copy(stream, outputFile);
-            }
-          }
-        }
-      } catch (IOException e) {
-        ExceptionDiagnostic error = new ExceptionDiagnostic(e, new ZipFileOrigin(Paths.get(s)));
-        options.getDiagnosticsHandler().error(error);
-        throw new AbortException(error);
-      }
-    }
-  }
-
-  public static void main(String[] args) {
-    if (PRINT_ARGS) {
-      printArgs(args);
-    }
-    ExceptionUtils.withMainProgramHandler(
-        () -> {
-          try {
-            run(args);
-          } catch (FeatureMappingException e) {
-            // TODO(ricow): Report feature mapping errors via the reporter.
-            throw new RuntimeException("Splitting failed: " + e.getMessage());
-          }
-        });
-  }
-
-  private static void printArgs(String[] args) {
-    System.err.printf("r8.DexSplitter");
-    for (String s : args) {
-      System.err.printf(" %s", s);
-    }
-    System.err.println("");
-  }
-}
diff --git a/src/main/java/com/android/tools/r8/dump/DumpOptions.java b/src/main/java/com/android/tools/r8/dump/DumpOptions.java
index 224d24a..a604608 100644
--- a/src/main/java/com/android/tools/r8/dump/DumpOptions.java
+++ b/src/main/java/com/android/tools/r8/dump/DumpOptions.java
@@ -40,6 +40,9 @@
   private static final String MINIFICATION_KEY = "minification";
   private static final String FORCE_PROGUARD_COMPATIBILITY_KEY = "force-proguard-compatibility";
   private static final String SYSTEM_PROPERTY_PREFIX = "system-property-";
+  private static final String ENABLE_MISSING_LIBRARY_API_MODELING =
+      "enable-missing-library-api-modeling";
+  private static final String ANDROID_PLATFORM_BUILD = "android-platform-build";
 
   private final Tool tool;
   private final CompilationMode compilationMode;
@@ -58,6 +61,8 @@
   private final FeatureSplitConfiguration featureSplitConfiguration;
   private final ProguardConfiguration proguardConfiguration;
   private final List<ProguardConfigurationRule> mainDexKeepRules;
+  private final boolean enableMissingLibraryApiModeling;
+  private final boolean isAndroidPlatformBuild;
 
   private final Map<String, String> systemProperties;
 
@@ -80,6 +85,8 @@
       FeatureSplitConfiguration featureSplitConfiguration,
       ProguardConfiguration proguardConfiguration,
       List<ProguardConfigurationRule> mainDexKeepRules,
+      boolean enableMissingLibraryApiModeling,
+      boolean isAndroidPlatformBuild,
       Map<String, String> systemProperties,
       boolean dumpInputToFile) {
     this.tool = tool;
@@ -97,6 +104,8 @@
     this.featureSplitConfiguration = featureSplitConfiguration;
     this.proguardConfiguration = proguardConfiguration;
     this.mainDexKeepRules = mainDexKeepRules;
+    this.enableMissingLibraryApiModeling = enableMissingLibraryApiModeling;
+    this.isAndroidPlatformBuild = isAndroidPlatformBuild;
     this.systemProperties = systemProperties;
     this.dumpInputToFile = dumpInputToFile;
   }
@@ -115,6 +124,10 @@
       addDumpEntry(builder, THREAD_COUNT_KEY, threadCount);
     }
     addDumpEntry(builder, DESUGAR_STATE_KEY, desugarState);
+    addDumpEntry(builder, ENABLE_MISSING_LIBRARY_API_MODELING, enableMissingLibraryApiModeling);
+    if (isAndroidPlatformBuild) {
+      addDumpEntry(builder, ANDROID_PLATFORM_BUILD, isAndroidPlatformBuild);
+    }
     addOptionalDumpEntry(builder, INTERMEDIATE_KEY, intermediate);
     addOptionalDumpEntry(builder, INCLUDE_DATA_RESOURCES_KEY, includeDataResources);
     addOptionalDumpEntry(builder, TREE_SHAKING_KEY, treeShaking);
@@ -273,6 +286,9 @@
     private ProguardConfiguration proguardConfiguration;
     private List<ProguardConfigurationRule> mainDexKeepRules;
 
+    private boolean enableMissingLibraryApiModeling = false;
+    private boolean isAndroidPlatformBuild = false;
+
     private Map<String, String> systemProperties = new HashMap<>();
 
     // Reporting only.
@@ -362,6 +378,16 @@
       return this;
     }
 
+    public Builder setEnableMissingLibraryApiModeling(boolean value) {
+      enableMissingLibraryApiModeling = value;
+      return this;
+    }
+
+    public Builder setAndroidPlatformBuild(boolean value) {
+      isAndroidPlatformBuild = value;
+      return this;
+    }
+
     public Builder setSystemProperty(String key, String value) {
       this.systemProperties.put(key, value);
       return this;
@@ -398,6 +424,8 @@
           featureSplitConfiguration,
           proguardConfiguration,
           mainDexKeepRules,
+          enableMissingLibraryApiModeling,
+          isAndroidPlatformBuild,
           systemProperties,
           dumpInputToFile);
     }
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/EmptyStartupOrder.java b/src/main/java/com/android/tools/r8/experimental/startup/EmptyStartupOrder.java
index 7279ee7..00f0db2 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/EmptyStartupOrder.java
+++ b/src/main/java/com/android/tools/r8/experimental/startup/EmptyStartupOrder.java
@@ -8,6 +8,7 @@
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.GraphLens;
 import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.synthesis.SyntheticItems;
 import java.util.Collection;
 import java.util.Collections;
 
@@ -16,12 +17,17 @@
   EmptyStartupOrder() {}
 
   @Override
-  public boolean contains(DexType type) {
+  public boolean contains(StartupClass<DexType> startupClass) {
     return false;
   }
 
   @Override
-  public Collection<DexType> getClasses() {
+  public boolean containsSyntheticClassesSynthesizedFrom(DexType synthesizingContextType) {
+    return false;
+  }
+
+  @Override
+  public Collection<StartupClass<DexType>> getClasses() {
     return Collections.emptyList();
   }
 
@@ -41,7 +47,8 @@
   }
 
   @Override
-  public EmptyStartupOrder withoutPrunedItems(PrunedItems prunedItems) {
+  public EmptyStartupOrder withoutPrunedItems(
+      PrunedItems prunedItems, SyntheticItems syntheticItems) {
     return this;
   }
 }
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/NonEmptyStartupOrder.java b/src/main/java/com/android/tools/r8/experimental/startup/NonEmptyStartupOrder.java
index 0427fc37..1b8eab9 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/NonEmptyStartupOrder.java
+++ b/src/main/java/com/android/tools/r8/experimental/startup/NonEmptyStartupOrder.java
@@ -5,33 +5,48 @@
 package com.android.tools.r8.experimental.startup;
 
 import com.android.tools.r8.graph.AppView;
+import com.android.tools.r8.graph.DexApplication;
 import com.android.tools.r8.graph.DexProgramClass;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.GraphLens;
 import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.synthesis.SyntheticItems;
+import com.android.tools.r8.utils.LazyBox;
+import com.google.common.collect.Sets;
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.IdentityHashMap;
 import java.util.LinkedHashSet;
 import java.util.List;
 import java.util.Map;
+import java.util.Set;
 
 public class NonEmptyStartupOrder extends StartupOrder {
 
-  private final LinkedHashSet<DexType> startupClasses;
+  private final LinkedHashSet<StartupClass<DexType>> startupClasses;
 
-  NonEmptyStartupOrder(LinkedHashSet<DexType> startupClasses) {
+  NonEmptyStartupOrder(LinkedHashSet<StartupClass<DexType>> startupClasses) {
     assert !startupClasses.isEmpty();
     this.startupClasses = startupClasses;
   }
 
   @Override
-  public boolean contains(DexType type) {
-    return startupClasses.contains(type);
+  public boolean contains(StartupClass<DexType> startupClass) {
+    return startupClasses.contains(startupClass);
   }
 
   @Override
-  public Collection<DexType> getClasses() {
+  public boolean containsSyntheticClassesSynthesizedFrom(DexType synthesizingContextType) {
+    return contains(
+        StartupClass.<DexType>builder()
+            .setReference(synthesizingContextType)
+            .setSynthetic()
+            .build());
+  }
+
+  @Override
+  public Collection<StartupClass<DexType>> getClasses() {
     return startupClasses;
   }
 
@@ -42,17 +57,22 @@
 
   @Override
   public StartupOrder rewrittenWithLens(GraphLens graphLens) {
-    LinkedHashSet<DexType> rewrittenStartupClasses = new LinkedHashSet<>(startupClasses.size());
-    for (DexType startupClass : startupClasses) {
-      DexType rewrittenStartupClass = graphLens.lookupType(startupClass);
-      rewrittenStartupClasses.add(rewrittenStartupClass);
+    LinkedHashSet<StartupClass<DexType>> rewrittenStartupClasses =
+        new LinkedHashSet<>(startupClasses.size());
+    for (StartupClass<DexType> startupClass : startupClasses) {
+      rewrittenStartupClasses.add(
+          StartupClass.<DexType>builder()
+              .setFlags(startupClass.getFlags())
+              .setReference(graphLens.lookupType(startupClass.getReference()))
+              .build());
     }
     return createNonEmpty(rewrittenStartupClasses);
   }
 
   @Override
   public StartupOrder toStartupOrderForWriting(AppView<?> appView) {
-    LinkedHashSet<DexType> rewrittenStartupClasses = new LinkedHashSet<>(startupClasses.size());
+    LinkedHashSet<StartupClass<DexType>> rewrittenStartupClasses =
+        new LinkedHashSet<>(startupClasses.size());
     Map<DexType, List<DexProgramClass>> syntheticContextsToSyntheticClasses =
         new IdentityHashMap<>();
     for (DexProgramClass clazz : appView.appInfo().classes()) {
@@ -65,81 +85,98 @@
         }
       }
     }
-    for (DexType startupClass : startupClasses) {
-      addClassAndParentClasses(
+    for (StartupClass<DexType> startupClass : startupClasses) {
+      addStartupClass(
           startupClass, rewrittenStartupClasses, syntheticContextsToSyntheticClasses, appView);
     }
+    assert rewrittenStartupClasses.stream().noneMatch(StartupClass::isSynthetic);
     return createNonEmpty(rewrittenStartupClasses);
   }
 
+  private static void addStartupClass(
+      StartupClass<DexType> startupClass,
+      LinkedHashSet<StartupClass<DexType>> rewrittenStartupClasses,
+      Map<DexType, List<DexProgramClass>> syntheticContextsToSyntheticClasses,
+      AppView<?> appView) {
+    if (startupClass.isSynthetic()) {
+      List<DexProgramClass> syntheticClassesForContext =
+          syntheticContextsToSyntheticClasses.getOrDefault(
+              startupClass.getReference(), Collections.emptyList());
+      for (DexProgramClass clazz : syntheticClassesForContext) {
+        addClassAndParentClasses(clazz, rewrittenStartupClasses, appView);
+      }
+    } else {
+      addClassAndParentClasses(startupClass.getReference(), rewrittenStartupClasses, appView);
+    }
+  }
+
   private static boolean addClass(
-      DexProgramClass clazz, LinkedHashSet<DexType> rewrittenStartupClasses) {
-    return rewrittenStartupClasses.add(clazz.getType());
+      DexProgramClass clazz, LinkedHashSet<StartupClass<DexType>> rewrittenStartupClasses) {
+    return rewrittenStartupClasses.add(
+        StartupClass.<DexType>builder().setReference(clazz.getType()).build());
   }
 
   private static void addClassAndParentClasses(
       DexType type,
-      LinkedHashSet<DexType> rewrittenStartupClasses,
-      Map<DexType, List<DexProgramClass>> syntheticContextsToSyntheticClasses,
+      LinkedHashSet<StartupClass<DexType>> rewrittenStartupClasses,
       AppView<?> appView) {
     DexProgramClass definition = appView.app().programDefinitionFor(type);
     if (definition != null) {
-      addClassAndParentClasses(
-          definition, rewrittenStartupClasses, syntheticContextsToSyntheticClasses, appView);
+      addClassAndParentClasses(definition, rewrittenStartupClasses, appView);
     }
   }
 
   private static void addClassAndParentClasses(
       DexProgramClass clazz,
-      LinkedHashSet<DexType> rewrittenStartupClasses,
-      Map<DexType, List<DexProgramClass>> syntheticContextsToSyntheticClasses,
+      LinkedHashSet<StartupClass<DexType>> rewrittenStartupClasses,
       AppView<?> appView) {
     if (addClass(clazz, rewrittenStartupClasses)) {
-      addSyntheticClassesAndParentClasses(
-          clazz, rewrittenStartupClasses, syntheticContextsToSyntheticClasses, appView);
-      addParentClasses(
-          clazz, rewrittenStartupClasses, syntheticContextsToSyntheticClasses, appView);
-    }
-  }
-
-  private static void addSyntheticClassesAndParentClasses(
-      DexProgramClass clazz,
-      LinkedHashSet<DexType> rewrittenStartupClasses,
-      Map<DexType, List<DexProgramClass>> syntheticContextsToSyntheticClasses,
-      AppView<?> appView) {
-    List<DexProgramClass> derivedClasses =
-        syntheticContextsToSyntheticClasses.remove(clazz.getType());
-    if (derivedClasses != null) {
-      for (DexProgramClass derivedClass : derivedClasses) {
-        addClassAndParentClasses(
-            derivedClass, rewrittenStartupClasses, syntheticContextsToSyntheticClasses, appView);
-      }
+      addParentClasses(clazz, rewrittenStartupClasses, appView);
     }
   }
 
   private static void addParentClasses(
       DexProgramClass clazz,
-      LinkedHashSet<DexType> rewrittenStartupClasses,
-      Map<DexType, List<DexProgramClass>> syntheticContextsToSyntheticClasses,
+      LinkedHashSet<StartupClass<DexType>> rewrittenStartupClasses,
       AppView<?> appView) {
     clazz.forEachImmediateSupertype(
-        supertype ->
-            addClassAndParentClasses(
-                supertype, rewrittenStartupClasses, syntheticContextsToSyntheticClasses, appView));
+        supertype -> addClassAndParentClasses(supertype, rewrittenStartupClasses, appView));
   }
 
   @Override
-  public StartupOrder withoutPrunedItems(PrunedItems prunedItems) {
-    LinkedHashSet<DexType> rewrittenStartupClasses = new LinkedHashSet<>(startupClasses.size());
-    for (DexType startupClass : startupClasses) {
-      if (!prunedItems.isRemoved(startupClass)) {
+  public StartupOrder withoutPrunedItems(PrunedItems prunedItems, SyntheticItems syntheticItems) {
+    LinkedHashSet<StartupClass<DexType>> rewrittenStartupClasses =
+        new LinkedHashSet<>(startupClasses.size());
+    LazyBox<Set<DexType>> contextsOfLiveSynthetics =
+        new LazyBox<>(
+            () -> computeContextsOfLiveSynthetics(prunedItems.getPrunedApp(), syntheticItems));
+    for (StartupClass<DexType> startupClass : startupClasses) {
+      // Only prune non-synthetic classes, since the pruning of a class does not imply that all
+      // classes synthesized from it have been pruned.
+      if (startupClass.isSynthetic()) {
+        if (contextsOfLiveSynthetics.computeIfAbsent().contains(startupClass.getReference())) {
+          rewrittenStartupClasses.add(startupClass);
+        }
+      } else if (!prunedItems.isRemoved(startupClass.getReference())) {
         rewrittenStartupClasses.add(startupClass);
       }
     }
     return createNonEmpty(rewrittenStartupClasses);
   }
 
-  private StartupOrder createNonEmpty(LinkedHashSet<DexType> startupClasses) {
+  private Set<DexType> computeContextsOfLiveSynthetics(
+      DexApplication app, SyntheticItems syntheticItems) {
+    Set<DexType> contextsOfLiveSynthetics = Sets.newIdentityHashSet();
+    for (DexProgramClass clazz : app.classes()) {
+      if (syntheticItems.isSyntheticClass(clazz)) {
+        contextsOfLiveSynthetics.addAll(
+            syntheticItems.getSynthesizingContextTypes(clazz.getType()));
+      }
+    }
+    return contextsOfLiveSynthetics;
+  }
+
+  private StartupOrder createNonEmpty(LinkedHashSet<StartupClass<DexType>> startupClasses) {
     if (startupClasses.isEmpty()) {
       assert false;
       return empty();
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/StartupClass.java b/src/main/java/com/android/tools/r8/experimental/startup/StartupClass.java
new file mode 100644
index 0000000..9338d5f
--- /dev/null
+++ b/src/main/java/com/android/tools/r8/experimental/startup/StartupClass.java
@@ -0,0 +1,87 @@
+// Copyright (c) 2022, 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.experimental.startup;
+
+public class StartupClass<T> {
+
+  private static final int FLAG_SYNTHETIC = 1;
+
+  private final int flags;
+  private final T reference;
+
+  public StartupClass(int flags, T reference) {
+    this.flags = flags;
+    this.reference = reference;
+  }
+
+  public static <T> Builder<T> builder() {
+    return new Builder<>();
+  }
+
+  public int getFlags() {
+    return flags;
+  }
+
+  public T getReference() {
+    return reference;
+  }
+
+  public boolean isSynthetic() {
+    return (flags & FLAG_SYNTHETIC) != 0;
+  }
+
+  @Override
+  public boolean equals(Object obj) {
+    if (this == obj) {
+      return true;
+    }
+    if (obj == null || getClass() != obj.getClass()) {
+      return false;
+    }
+    StartupClass<?> startupClass = (StartupClass<?>) obj;
+    return flags == startupClass.flags && reference.equals(startupClass.reference);
+  }
+
+  @Override
+  public int hashCode() {
+    assert flags <= 1;
+    return (reference.hashCode() << 1) | flags;
+  }
+
+  @Override
+  public String toString() {
+    StringBuilder builder = new StringBuilder();
+    if (isSynthetic()) {
+      builder.append('S');
+    }
+    builder.append(reference);
+    return builder.toString();
+  }
+
+  public static class Builder<T> {
+
+    private int flags;
+    private T reference;
+
+    public Builder<T> setFlags(int flags) {
+      this.flags = flags;
+      return this;
+    }
+
+    public Builder<T> setReference(T reference) {
+      this.reference = reference;
+      return this;
+    }
+
+    public Builder<T> setSynthetic() {
+      this.flags |= FLAG_SYNTHETIC;
+      return this;
+    }
+
+    public StartupClass<T> build() {
+      return new StartupClass<>(flags, reference);
+    }
+  }
+}
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/StartupConfiguration.java b/src/main/java/com/android/tools/r8/experimental/startup/StartupConfiguration.java
index 7e78009..9f16dce 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/StartupConfiguration.java
+++ b/src/main/java/com/android/tools/r8/experimental/startup/StartupConfiguration.java
@@ -13,22 +13,29 @@
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.Reporter;
 import com.android.tools.r8.utils.StringDiagnostic;
+import com.google.common.collect.ImmutableList;
 import java.io.IOException;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.ArrayList;
 import java.util.List;
+import java.util.function.Consumer;
 
 public class StartupConfiguration {
 
-  private final List<DexType> startupClasses;
+  private final List<StartupClass<DexType>> startupClasses;
   private final List<DexMethod> startupMethods;
 
-  public StartupConfiguration(List<DexType> startupClasses, List<DexMethod> startupMethods) {
+  public StartupConfiguration(
+      List<StartupClass<DexType>> startupClasses, List<DexMethod> startupMethods) {
     this.startupClasses = startupClasses;
     this.startupMethods = startupMethods;
   }
 
+  public static Builder builder() {
+    return new Builder();
+  }
+
   /**
    * Parses the supplied startup configuration, if any. The startup configuration is a list of class
    * and method descriptors.
@@ -67,18 +74,26 @@
       return null;
     }
 
-    List<DexType> startupClasses = new ArrayList<>();
+    return createStartupConfigurationFromLines(dexItemFactory, reporter, startupDescriptors);
+  }
+
+  public static StartupConfiguration createStartupConfigurationFromLines(
+      DexItemFactory dexItemFactory, Reporter reporter, List<String> startupDescriptors) {
+    List<StartupClass<DexType>> startupClasses = new ArrayList<>();
     List<DexMethod> startupMethods = new ArrayList<>();
     for (String startupDescriptor : startupDescriptors) {
       if (startupDescriptor.isEmpty()) {
         continue;
       }
+      StartupClass.Builder<DexType> startupClassBuilder = StartupClass.builder();
+      startupDescriptor = parseSyntheticFlag(startupDescriptor, startupClassBuilder);
       int methodNameStartIndex = getMethodNameStartIndex(startupDescriptor);
       if (methodNameStartIndex >= 0) {
         DexMethod startupMethod =
             parseStartupMethodDescriptor(startupDescriptor, methodNameStartIndex, dexItemFactory);
         if (startupMethod != null) {
-          startupClasses.add(startupMethod.getHolderType());
+          startupClasses.add(
+              startupClassBuilder.setReference(startupMethod.getHolderType()).build());
           startupMethods.add(startupMethod);
         } else {
           reporter.warning(
@@ -87,7 +102,7 @@
       } else {
         DexType startupClass = parseStartupClassDescriptor(startupDescriptor, dexItemFactory);
         if (startupClass != null) {
-          startupClasses.add(startupClass);
+          startupClasses.add(startupClassBuilder.setReference(startupClass).build());
         } else {
           reporter.warning(
               new StringDiagnostic("Invalid descriptor for startup class: " + startupDescriptor));
@@ -97,6 +112,15 @@
     return new StartupConfiguration(startupClasses, startupMethods);
   }
 
+  public static String parseSyntheticFlag(
+      String startupDescriptor, StartupClass.Builder<?> startupClassBuilder) {
+    if (!startupDescriptor.isEmpty() && startupDescriptor.charAt(0) == 'S') {
+      startupClassBuilder.setSynthetic();
+      return startupDescriptor.substring(1);
+    }
+    return startupDescriptor;
+  }
+
   private static int getMethodNameStartIndex(String startupDescriptor) {
     int arrowIndex = startupDescriptor.indexOf("->");
     return arrowIndex >= 0 ? arrowIndex + 2 : arrowIndex;
@@ -147,7 +171,28 @@
     return !startupClasses.isEmpty();
   }
 
-  public List<DexType> getStartupClasses() {
+  public List<StartupClass<DexType>> getStartupClasses() {
     return startupClasses;
   }
+
+  public static class Builder {
+
+    private final ImmutableList.Builder<StartupClass<DexType>> startupClassesBuilder =
+        ImmutableList.builder();
+    private final ImmutableList.Builder<DexMethod> startupMethodsBuilder = ImmutableList.builder();
+
+    public Builder addStartupClass(StartupClass<DexType> startupClass) {
+      this.startupClassesBuilder.add(startupClass);
+      return this;
+    }
+
+    public Builder apply(Consumer<Builder> consumer) {
+      consumer.accept(this);
+      return this;
+    }
+
+    public StartupConfiguration build() {
+      return new StartupConfiguration(startupClassesBuilder.build(), startupMethodsBuilder.build());
+    }
+  }
 }
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/StartupInstrumentation.java b/src/main/java/com/android/tools/r8/experimental/startup/StartupInstrumentation.java
index 8995dbc..aa97fa6 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/StartupInstrumentation.java
+++ b/src/main/java/com/android/tools/r8/experimental/startup/StartupInstrumentation.java
@@ -19,11 +19,15 @@
 import com.android.tools.r8.graph.DexEncodedMethod;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexProgramClass;
+import com.android.tools.r8.graph.DexString;
+import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.MethodAccessFlags;
 import com.android.tools.r8.graph.ProgramMethod;
+import com.android.tools.r8.synthesis.SyntheticItems;
 import com.android.tools.r8.utils.ThreadUtils;
 import com.google.common.collect.ImmutableList;
 import java.util.ArrayList;
+import java.util.Collection;
 import java.util.List;
 import java.util.concurrent.ExecutionException;
 import java.util.concurrent.ExecutorService;
@@ -41,12 +45,18 @@
     this.options = appView.options().getStartupOptions();
   }
 
-  public void instrumentClasses(ExecutorService executorService) throws ExecutionException {
+  public void instrumentAllClasses(ExecutorService executorService) throws ExecutionException {
+    instrumentClasses(appView.appInfo().classes(), executorService);
+  }
+
+  public boolean instrumentClasses(
+      Collection<DexProgramClass> classes, ExecutorService executorService)
+      throws ExecutionException {
     if (!appView.options().getStartupOptions().isStartupInstrumentationEnabled()) {
-      return;
+      return false;
     }
-    ThreadUtils.processItems(
-        appView.appInfo().classes(), this::internalInstrumentClass, executorService);
+    ThreadUtils.processItems(classes, this::internalInstrumentClass, executorService);
+    return true;
   }
 
   public void instrumentClass(DexProgramClass clazz) {
@@ -90,20 +100,31 @@
       return;
     }
 
+    SyntheticItems syntheticItems = appView.getSyntheticItems();
+    DexString message;
+    if (syntheticItems.isSyntheticClass(classInitializer.getHolder())) {
+      Collection<DexType> synthesizingContexts =
+          syntheticItems.getSynthesizingContextTypes(classInitializer.getHolderType());
+      assert synthesizingContexts.size() == 1;
+      message = synthesizingContexts.iterator().next().getDescriptor().prepend("S", dexItemFactory);
+    } else {
+      message = classInitializer.getHolderType().getDescriptor();
+    }
+
     CfCode cfCode = code.asCfCode();
     List<CfInstruction> instructions;
     if (options.hasStartupInstrumentationTag()) {
       instructions = new ArrayList<>(4 + cfCode.getInstructions().size());
       instructions.add(
           new CfConstString(dexItemFactory.createString(options.getStartupInstrumentationTag())));
-      instructions.add(new CfConstString(classInitializer.getHolderType().getDescriptor()));
+      instructions.add(new CfConstString(message));
       instructions.add(
           new CfInvoke(Opcodes.INVOKESTATIC, dexItemFactory.androidUtilLogMembers.i, false));
       instructions.add(new CfStackInstruction(Opcode.Pop));
     } else {
       instructions = new ArrayList<>(3 + cfCode.getInstructions().size());
       instructions.add(new CfStaticFieldRead(dexItemFactory.javaLangSystemMembers.out));
-      instructions.add(new CfConstString(classInitializer.getHolderType().getDescriptor()));
+      instructions.add(new CfConstString(message));
       instructions.add(
           new CfInvoke(
               Opcodes.INVOKEVIRTUAL,
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/StartupOptions.java b/src/main/java/com/android/tools/r8/experimental/startup/StartupOptions.java
index c633722..15fbf6c 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/StartupOptions.java
+++ b/src/main/java/com/android/tools/r8/experimental/startup/StartupOptions.java
@@ -30,12 +30,17 @@
     return startupInstrumentationTag;
   }
 
+  public StartupOptions setStartupInstrumentationTag(String startupInstrumentationTag) {
+    this.startupInstrumentationTag = startupInstrumentationTag;
+    return this;
+  }
+
   public boolean isMinimalStartupDexEnabled() {
     return enableMinimalStartupDex;
   }
 
-  public StartupOptions setEnableMinimalStartupDex() {
-    enableMinimalStartupDex = true;
+  public StartupOptions setEnableMinimalStartupDex(boolean enableMinimalStartupDex) {
+    this.enableMinimalStartupDex = enableMinimalStartupDex;
     return this;
   }
 
@@ -65,7 +70,8 @@
     return startupConfiguration;
   }
 
-  public void setStartupConfiguration(StartupConfiguration startupConfiguration) {
+  public StartupOptions setStartupConfiguration(StartupConfiguration startupConfiguration) {
     this.startupConfiguration = startupConfiguration;
+    return this;
   }
 }
diff --git a/src/main/java/com/android/tools/r8/experimental/startup/StartupOrder.java b/src/main/java/com/android/tools/r8/experimental/startup/StartupOrder.java
index da68a15..78126fd 100644
--- a/src/main/java/com/android/tools/r8/experimental/startup/StartupOrder.java
+++ b/src/main/java/com/android/tools/r8/experimental/startup/StartupOrder.java
@@ -8,6 +8,7 @@
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.graph.GraphLens;
 import com.android.tools.r8.graph.PrunedItems;
+import com.android.tools.r8.synthesis.SyntheticItems;
 import com.android.tools.r8.utils.InternalOptions;
 import java.util.Collection;
 import java.util.LinkedHashSet;
@@ -32,9 +33,11 @@
     return new EmptyStartupOrder();
   }
 
-  public abstract boolean contains(DexType type);
+  public abstract boolean contains(StartupClass<DexType> startupClass);
 
-  public abstract Collection<DexType> getClasses();
+  public abstract boolean containsSyntheticClassesSynthesizedFrom(DexType synthesizingContextType);
+
+  public abstract Collection<StartupClass<DexType>> getClasses();
 
   public abstract boolean isEmpty();
 
@@ -42,5 +45,6 @@
 
   public abstract StartupOrder toStartupOrderForWriting(AppView<?> appView);
 
-  public abstract StartupOrder withoutPrunedItems(PrunedItems prunedItems);
+  public abstract StartupOrder withoutPrunedItems(
+      PrunedItems prunedItems, SyntheticItems syntheticItems);
 }
diff --git a/src/main/java/com/android/tools/r8/features/ClassToFeatureSplitMap.java b/src/main/java/com/android/tools/r8/features/ClassToFeatureSplitMap.java
index 82b0243..b721f6f 100644
--- a/src/main/java/com/android/tools/r8/features/ClassToFeatureSplitMap.java
+++ b/src/main/java/com/android/tools/r8/features/ClassToFeatureSplitMap.java
@@ -8,7 +8,10 @@
 import com.android.tools.r8.ProgramResource;
 import com.android.tools.r8.ProgramResourceProvider;
 import com.android.tools.r8.ResourceException;
+import com.android.tools.r8.experimental.startup.StartupClass;
 import com.android.tools.r8.experimental.startup.StartupConfiguration;
+import com.android.tools.r8.experimental.startup.StartupOrder;
+import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexProgramClass;
@@ -93,20 +96,25 @@
 
     FeatureSplit baseStartup;
     if (startupConfiguration != null && startupConfiguration.hasStartupClasses()) {
-      DexType representativeType = null;
-      for (DexType startupClass : startupConfiguration.getStartupClasses()) {
-        if (classToFeatureSplitMap.containsKey(startupClass)) {
+      StartupClass<DexType> representativeStartupClass = null;
+      for (StartupClass<DexType> startupClass : startupConfiguration.getStartupClasses()) {
+        if (startupClass.isSynthetic()
+            || classToFeatureSplitMap.containsKey(startupClass.getReference())) {
           continue;
         }
-        classToFeatureSplitMap.put(startupClass, FeatureSplit.BASE_STARTUP);
-        if (representativeType == null
-            || startupClass.getDescriptor().compareTo(representativeType.getDescriptor()) > 0) {
-          representativeType = startupClass;
+        classToFeatureSplitMap.put(startupClass.getReference(), FeatureSplit.BASE_STARTUP);
+        if (representativeStartupClass == null
+            || startupClass
+                    .getReference()
+                    .getDescriptor()
+                    .compareTo(representativeStartupClass.getReference().getDescriptor())
+                > 0) {
+          representativeStartupClass = startupClass;
         }
       }
       baseStartup = FeatureSplit.BASE_STARTUP;
       representativeStringsForFeatureSplit.put(
-          baseStartup, representativeType.toDescriptorString());
+          baseStartup, representativeStartupClass.getReference().toDescriptorString());
     } else {
       baseStartup = FeatureSplit.BASE;
     }
@@ -141,10 +149,16 @@
   }
 
   public Map<FeatureSplit, Set<DexProgramClass>> getFeatureSplitClasses(
-      Set<DexProgramClass> classes, SyntheticItems syntheticItems) {
+      Set<DexProgramClass> classes, AppView<? extends AppInfoWithClassHierarchy> appView) {
+    return getFeatureSplitClasses(
+        classes, appView.appInfo().getStartupOrder(), appView.getSyntheticItems());
+  }
+
+  public Map<FeatureSplit, Set<DexProgramClass>> getFeatureSplitClasses(
+      Set<DexProgramClass> classes, StartupOrder startupOrder, SyntheticItems syntheticItems) {
     Map<FeatureSplit, Set<DexProgramClass>> result = new IdentityHashMap<>();
     for (DexProgramClass clazz : classes) {
-      FeatureSplit featureSplit = getFeatureSplit(clazz, syntheticItems);
+      FeatureSplit featureSplit = getFeatureSplit(clazz, startupOrder, syntheticItems);
       if (featureSplit != null && !featureSplit.isBase()) {
         result.computeIfAbsent(featureSplit, ignore -> Sets.newIdentityHashSet()).add(clazz);
       }
@@ -152,18 +166,39 @@
     return result;
   }
 
-  public FeatureSplit getFeatureSplit(ProgramDefinition clazz, SyntheticItems syntheticItems) {
-    return getFeatureSplit(clazz.getContextType(), syntheticItems);
+  public FeatureSplit getFeatureSplit(
+      ProgramDefinition definition, AppView<? extends AppInfoWithClassHierarchy> appView) {
+    return getFeatureSplit(
+        definition, appView.appInfo().getStartupOrder(), appView.getSyntheticItems());
   }
 
-  public FeatureSplit getFeatureSplit(DexType type, SyntheticItems syntheticItems) {
+  public FeatureSplit getFeatureSplit(
+      ProgramDefinition definition, StartupOrder startupOrder, SyntheticItems syntheticItems) {
+    return getFeatureSplit(definition.getContextType(), startupOrder, syntheticItems);
+  }
+
+  public FeatureSplit getFeatureSplit(
+      DexType type, AppView<? extends AppInfoWithClassHierarchy> appView) {
+    return getFeatureSplit(type, appView.appInfo().getStartupOrder(), appView.getSyntheticItems());
+  }
+
+  public FeatureSplit getFeatureSplit(
+      DexType type, StartupOrder startupOrder, SyntheticItems syntheticItems) {
     FeatureSplit feature = classToFeatureSplitMap.get(type);
     if (feature != null) {
+      assert !syntheticItems.isSyntheticClass(type);
       return feature;
     }
-    feature = syntheticItems.getContextualFeatureSplit(type, this);
-    if (feature != null) {
-      return feature;
+    if (syntheticItems != null) {
+      feature = syntheticItems.getContextualFeatureSplit(type, this);
+      if (feature != null && !feature.isBase()) {
+        return feature;
+      }
+      for (DexType context : syntheticItems.getSynthesizingContextTypes(type)) {
+        if (startupOrder.containsSyntheticClassesSynthesizedFrom(context)) {
+          return FeatureSplit.BASE_STARTUP;
+        }
+      }
     }
     return FeatureSplit.BASE;
   }
@@ -175,33 +210,79 @@
     return classToFeatureSplitMap.isEmpty();
   }
 
-  public boolean isInBase(DexProgramClass clazz, SyntheticItems syntheticItems) {
-    return getFeatureSplit(clazz, syntheticItems).isBase();
+  public boolean isInBase(
+      DexProgramClass clazz, AppView<? extends AppInfoWithClassHierarchy> appView) {
+    return isInBase(clazz, appView.appInfo().getStartupOrder(), appView.getSyntheticItems());
+  }
+
+  public boolean isInBase(
+      DexProgramClass clazz, StartupOrder startupOrder, SyntheticItems syntheticItems) {
+    return getFeatureSplit(clazz, startupOrder, syntheticItems).isBase();
   }
 
   public boolean isInBaseOrSameFeatureAs(
-      DexProgramClass clazz, ProgramDefinition context, SyntheticItems syntheticItems) {
-    return isInBaseOrSameFeatureAs(clazz.getContextType(), context, syntheticItems);
+      DexProgramClass clazz,
+      ProgramDefinition context,
+      AppView<? extends AppInfoWithClassHierarchy> appView) {
+    return isInBaseOrSameFeatureAs(
+        clazz, context, appView.appInfo().getStartupOrder(), appView.getSyntheticItems());
   }
 
   public boolean isInBaseOrSameFeatureAs(
-      DexType clazz, ProgramDefinition context, SyntheticItems syntheticItems) {
-    FeatureSplit split = getFeatureSplit(clazz, syntheticItems);
-    return split.isBase() || split == getFeatureSplit(context, syntheticItems);
+      DexProgramClass clazz,
+      ProgramDefinition context,
+      StartupOrder startupOrder,
+      SyntheticItems syntheticItems) {
+    return isInBaseOrSameFeatureAs(clazz.getContextType(), context, startupOrder, syntheticItems);
   }
 
-  public boolean isInFeature(DexProgramClass clazz, SyntheticItems syntheticItems) {
-    return !isInBase(clazz, syntheticItems);
+  public boolean isInBaseOrSameFeatureAs(
+      DexType clazz,
+      ProgramDefinition context,
+      AppView<? extends AppInfoWithClassHierarchy> appView) {
+    return isInBaseOrSameFeatureAs(
+        clazz, context, appView.appInfo().getStartupOrder(), appView.getSyntheticItems());
+  }
+
+  public boolean isInBaseOrSameFeatureAs(
+      DexType clazz,
+      ProgramDefinition context,
+      StartupOrder startupOrder,
+      SyntheticItems syntheticItems) {
+    FeatureSplit split = getFeatureSplit(clazz, startupOrder, syntheticItems);
+    return split.isBase() || split == getFeatureSplit(context, startupOrder, syntheticItems);
+  }
+
+  public boolean isInFeature(
+      DexProgramClass clazz, StartupOrder startupOrder, SyntheticItems syntheticItems) {
+    return !isInBase(clazz, startupOrder, syntheticItems);
   }
 
   public boolean isInSameFeatureOrBothInSameBase(
-      ProgramMethod a, ProgramMethod b, SyntheticItems syntheticItems) {
-    return isInSameFeatureOrBothInSameBase(a.getHolder(), b.getHolder(), syntheticItems);
+      ProgramMethod a, ProgramMethod b, AppView<? extends AppInfoWithClassHierarchy> appView) {
+    return isInSameFeatureOrBothInSameBase(
+        a, b, appView.appInfo().getStartupOrder(), appView.getSyntheticItems());
   }
 
   public boolean isInSameFeatureOrBothInSameBase(
-      DexProgramClass a, DexProgramClass b, SyntheticItems syntheticItems) {
-    return getFeatureSplit(a, syntheticItems) == getFeatureSplit(b, syntheticItems);
+      ProgramMethod a, ProgramMethod b, StartupOrder startupOrder, SyntheticItems syntheticItems) {
+    return isInSameFeatureOrBothInSameBase(
+        a.getHolder(), b.getHolder(), startupOrder, syntheticItems);
+  }
+
+  public boolean isInSameFeatureOrBothInSameBase(
+      DexProgramClass a, DexProgramClass b, AppView<? extends AppInfoWithClassHierarchy> appView) {
+    return isInSameFeatureOrBothInSameBase(
+        a, b, appView.appInfo().getStartupOrder(), appView.getSyntheticItems());
+  }
+
+  public boolean isInSameFeatureOrBothInSameBase(
+      DexProgramClass a,
+      DexProgramClass b,
+      StartupOrder startupOrder,
+      SyntheticItems syntheticItems) {
+    return getFeatureSplit(a, startupOrder, syntheticItems)
+        == getFeatureSplit(b, startupOrder, syntheticItems);
   }
 
   public ClassToFeatureSplitMap rewrittenWithLens(GraphLens lens) {
@@ -240,6 +321,7 @@
   }
 
   public static boolean isInFeature(DexProgramClass clazz, AppView<AppInfoWithLiveness> appView) {
-    return getMap(appView).isInFeature(clazz, appView.getSyntheticItems());
+    return getMap(appView)
+        .isInFeature(clazz, appView.appInfo().getStartupOrder(), appView.getSyntheticItems());
   }
 }
diff --git a/src/main/java/com/android/tools/r8/graph/AccessControl.java b/src/main/java/com/android/tools/r8/graph/AccessControl.java
index cf2c789..428d0fd 100644
--- a/src/main/java/com/android/tools/r8/graph/AccessControl.java
+++ b/src/main/java/com/android/tools/r8/graph/AccessControl.java
@@ -3,6 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 package com.android.tools.r8.graph;
 
+import com.android.tools.r8.experimental.startup.StartupOrder;
 import com.android.tools.r8.features.ClassToFeatureSplitMap;
 import com.android.tools.r8.synthesis.SyntheticItems;
 import com.android.tools.r8.utils.OptionalBool;
@@ -20,13 +21,18 @@
       ProgramDefinition context,
       AppView<? extends AppInfoWithClassHierarchy> appView) {
     return isClassAccessible(
-        clazz, context, appView.appInfo().getClassToFeatureSplitMap(), appView.getSyntheticItems());
+        clazz,
+        context,
+        appView.appInfo().getClassToFeatureSplitMap(),
+        appView.appInfo().getStartupOrder(),
+        appView.getSyntheticItems());
   }
 
   public static OptionalBool isClassAccessible(
       DexClass clazz,
       Definition context,
       ClassToFeatureSplitMap classToFeatureSplitMap,
+      StartupOrder startupOrder,
       SyntheticItems syntheticItems) {
     if (!clazz.isPublic() && !clazz.getType().isSamePackage(context.getContextType())) {
       return OptionalBool.FALSE;
@@ -34,7 +40,7 @@
     if (clazz.isProgramClass()
         && context.isProgramDefinition()
         && !classToFeatureSplitMap.isInBaseOrSameFeatureAs(
-            clazz.asProgramClass(), context.asProgramDefinition(), syntheticItems)) {
+            clazz.asProgramClass(), context.asProgramDefinition(), startupOrder, syntheticItems)) {
       return OptionalBool.UNKNOWN;
     }
     return OptionalBool.TRUE;
@@ -72,6 +78,7 @@
             initialResolutionHolder,
             context,
             appInfo.getClassToFeatureSplitMap(),
+            appInfo.getStartupOrder(),
             appInfo.getSyntheticItems());
     if (classAccessibility.isFalse()) {
       return OptionalBool.FALSE;
diff --git a/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java b/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java
index 836f1a5..1a029f8 100644
--- a/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java
+++ b/src/main/java/com/android/tools/r8/graph/AppInfoWithClassHierarchy.java
@@ -140,7 +140,7 @@
         getClassToFeatureSplitMap().withoutPrunedItems(prunedItems),
         getMainDexInfo().withoutPrunedItems(prunedItems),
         getMissingClasses(),
-        getStartupOrder().withoutPrunedItems(prunedItems));
+        getStartupOrder().withoutPrunedItems(prunedItems, getSyntheticItems()));
   }
 
   public ClassToFeatureSplitMap getClassToFeatureSplitMap() {
diff --git a/src/main/java/com/android/tools/r8/graph/AppServices.java b/src/main/java/com/android/tools/r8/graph/AppServices.java
index b5b0c60..6776d2c 100644
--- a/src/main/java/com/android/tools/r8/graph/AppServices.java
+++ b/src/main/java/com/android/tools/r8/graph/AppServices.java
@@ -110,8 +110,7 @@
     assert featureImplementations.size() <= 2;
     // Check if service is defined feature
     DexProgramClass serviceClass = appView.definitionForProgramType(serviceType);
-    if (serviceClass != null
-        && classToFeatureSplitMap.isInFeature(serviceClass, appView.getSyntheticItems())) {
+    if (serviceClass != null && classToFeatureSplitMap.isInFeature(serviceClass, appView)) {
       return true;
     }
     for (Entry<FeatureSplit, List<DexType>> entry : featureImplementations.entrySet()) {
@@ -121,8 +120,7 @@
       for (DexType implementationType : implementationTypes) {
         DexProgramClass implementationClass = appView.definitionForProgramType(implementationType);
         if (implementationClass != null
-            && classToFeatureSplitMap.isInFeature(
-                implementationClass, appView.getSyntheticItems())) {
+            && classToFeatureSplitMap.isInFeature(implementationClass, appView)) {
           return true;
         }
       }
diff --git a/src/main/java/com/android/tools/r8/graph/DexString.java b/src/main/java/com/android/tools/r8/graph/DexString.java
index f6d0d19..2a9db3a 100644
--- a/src/main/java/com/android/tools/r8/graph/DexString.java
+++ b/src/main/java/com/android/tools/r8/graph/DexString.java
@@ -492,6 +492,20 @@
     return true;
   }
 
+  public DexString prepend(String prefix, DexItemFactory dexItemFactory) {
+    return prepend(dexItemFactory.createString(prefix), dexItemFactory);
+  }
+
+  public DexString prepend(DexString prefix, DexItemFactory dexItemFactory) {
+    int newSize = prefix.size + this.size;
+    // Each string ends with a 0 terminating byte, hence the +/- 1.
+    byte[] newContent = new byte[prefix.content.length + this.content.length - 1];
+    System.arraycopy(prefix.content, 0, newContent, 0, prefix.content.length - 1);
+    System.arraycopy(
+        this.content, 0, newContent, prefix.content.length - 1, this.content.length - 1);
+    return dexItemFactory.createString(newSize, newContent);
+  }
+
   public DexString withNewPrefix(
       DexString prefix, DexString rewrittenPrefix, DexItemFactory factory) {
     // Copy bytes over to avoid decoding/encoding cost.
diff --git a/src/main/java/com/android/tools/r8/graph/MethodResolutionResult.java b/src/main/java/com/android/tools/r8/graph/MethodResolutionResult.java
index c56866e..8730c35 100644
--- a/src/main/java/com/android/tools/r8/graph/MethodResolutionResult.java
+++ b/src/main/java/com/android/tools/r8/graph/MethodResolutionResult.java
@@ -1253,25 +1253,26 @@
       }
       BooleanBox seenNoAccess = new BooleanBox(false);
       forEachFailureDependency(
-          type -> {
-            appInfo
-                .contextIndependentDefinitionForWithResolutionResult(type)
-                .forEachClassResolutionResult(
-                    clazz -> {
-                      AccessControl.isClassAccessible(
-                          clazz,
-                          context,
-                          appInfo.getClassToFeatureSplitMap(),
-                          appInfo.getSyntheticItems());
-                    });
-          },
+          type ->
+              appInfo
+                  .contextIndependentDefinitionForWithResolutionResult(type)
+                  .forEachClassResolutionResult(
+                      clazz ->
+                          seenNoAccess.or(
+                              AccessControl.isClassAccessible(
+                                      clazz,
+                                      context,
+                                      appInfo.getClassToFeatureSplitMap(),
+                                      appInfo.getStartupOrder(),
+                                      appInfo.getSyntheticItems())
+                                  .isPossiblyFalse())),
           method -> {
             DexClass holder = appInfo.definitionFor(method.getHolderType());
             DexClassAndMethod classAndMethod = DexClassAndMethod.create(holder, method);
             seenNoAccess.or(
                 AccessControl.isMemberAccessible(
                         classAndMethod, initialResolutionHolder, context, appInfo)
-                    .isFalse());
+                    .isPossiblyFalse());
           });
       return seenNoAccess.get();
     }
diff --git a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SameFeatureSplit.java b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SameFeatureSplit.java
index 58054a2..73dfa2a 100644
--- a/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SameFeatureSplit.java
+++ b/src/main/java/com/android/tools/r8/horizontalclassmerging/policies/SameFeatureSplit.java
@@ -19,10 +19,7 @@
 
   @Override
   public FeatureSplit getMergeKey(DexProgramClass clazz) {
-    return appView
-        .appInfo()
-        .getClassToFeatureSplitMap()
-        .getFeatureSplit(clazz, appView.getSyntheticItems());
+    return appView.appInfo().getClassToFeatureSplitMap().getFeatureSplit(clazz, appView);
   }
 
   @Override
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleConstClassValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleConstClassValue.java
index fe41e44..80718a7 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleConstClassValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleConstClassValue.java
@@ -25,7 +25,6 @@
 import com.android.tools.r8.ir.code.Value;
 import com.android.tools.r8.ir.optimize.info.field.InstanceFieldInitializationInfo;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
-import com.android.tools.r8.synthesis.SyntheticItems;
 
 public class SingleConstClassValue extends SingleConstValue {
 
@@ -110,9 +109,8 @@
         return false;
       }
       ClassToFeatureSplitMap classToFeatureSplitMap = appView.appInfo().getClassToFeatureSplitMap();
-      SyntheticItems syntheticItems = appView.getSyntheticItems();
       if (clazz.isProgramClass()
-          && classToFeatureSplitMap.isInFeature(clazz.asProgramClass(), syntheticItems)) {
+          && classToFeatureSplitMap.isInFeature(clazz.asProgramClass(), appView)) {
         return false;
       }
       return true;
diff --git a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java
index d7442d5..da02bae 100644
--- a/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java
+++ b/src/main/java/com/android/tools/r8/ir/analysis/value/SingleFieldValue.java
@@ -30,7 +30,6 @@
 import com.android.tools.r8.ir.optimize.info.field.InstanceFieldInitializationInfo;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.shaking.ObjectAllocationInfoCollectionUtils;
-import com.android.tools.r8.synthesis.SyntheticItems;
 
 public abstract class SingleFieldValue extends SingleValue {
 
@@ -129,9 +128,8 @@
       return false;
     }
     ClassToFeatureSplitMap classToFeatureSplitMap = appView.appInfo().getClassToFeatureSplitMap();
-    SyntheticItems syntheticItems = appView.getSyntheticItems();
     if (holder.isProgramClass()
-        && classToFeatureSplitMap.isInFeature(holder.asProgramClass(), syntheticItems)) {
+        && classToFeatureSplitMap.isInFeature(holder.asProgramClass(), appView)) {
       return false;
     }
     return true;
diff --git a/src/main/java/com/android/tools/r8/ir/conversion/ClassConverter.java b/src/main/java/com/android/tools/r8/ir/conversion/ClassConverter.java
index d0eab48..e195eac 100644
--- a/src/main/java/com/android/tools/r8/ir/conversion/ClassConverter.java
+++ b/src/main/java/com/android/tools/r8/ir/conversion/ClassConverter.java
@@ -158,7 +158,8 @@
       // Finalize the desugaring of the processed classes. This may require processing (and
       // reprocessing) of some methods.
       List<ProgramMethod> needsProcessing =
-          instructionDesugaringEventConsumer.finalizeDesugaring(appView, resultBuilder);
+          instructionDesugaringEventConsumer.finalizeDesugaring(
+              appView, executorService, resultBuilder);
       if (!needsProcessing.isEmpty()) {
         // Create a new processor context to ensure unique method processing contexts.
         methodProcessor.newWave();
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java
index fcf37fb..15c214a 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/CfInstructionDesugaringEventConsumer.java
@@ -4,6 +4,7 @@
 
 package com.android.tools.r8.ir.desugar;
 
+import com.android.tools.r8.experimental.startup.StartupInstrumentation;
 import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.DexClasspathClass;
@@ -40,6 +41,8 @@
 import java.util.Map;
 import java.util.Map.Entry;
 import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.ExecutorService;
 import java.util.function.BiConsumer;
 import java.util.function.Consumer;
 
@@ -87,6 +90,7 @@
 
     private final D8MethodProcessor methodProcessor;
 
+    private final Set<DexProgramClass> synthesizedClasses = Sets.newConcurrentHashSet();
     private final Map<DexReference, InvokeSpecialBridgeInfo> pendingInvokeSpecialBridges =
         new LinkedHashMap<>();
     private final List<LambdaClass> synthesizedLambdaClasses = new ArrayList<>();
@@ -96,9 +100,18 @@
       this.methodProcessor = methodProcessor;
     }
 
+    private void acceptClass(DexProgramClass clazz) {
+      synthesizedClasses.add(clazz);
+    }
+
+    private void acceptMethod(ProgramMethod method) {
+      acceptClass(method.getHolder());
+    }
+
     @Override
     public void acceptCompanionMethod(ProgramMethod method, ProgramMethod companionMethod) {
       // Intentionally empty. Methods are moved when processing the interface definition.
+      acceptMethod(method);
     }
 
     @Override
@@ -113,21 +126,25 @@
 
     @Override
     public void acceptCollectionConversion(ProgramMethod arrayConversion) {
+      acceptMethod(arrayConversion);
       methodProcessor.scheduleMethodForProcessing(arrayConversion, this);
     }
 
     @Override
     public void acceptCovariantRetargetMethod(ProgramMethod method) {
+      acceptMethod(method);
       methodProcessor.scheduleMethodForProcessing(method, this);
     }
 
     @Override
     public void acceptBackportedMethod(ProgramMethod backportedMethod, ProgramMethod context) {
+      acceptMethod(backportedMethod);
       methodProcessor.scheduleMethodForProcessing(backportedMethod, this);
     }
 
     @Override
     public void acceptRecordMethod(ProgramMethod method) {
+      acceptMethod(method);
       methodProcessor.scheduleDesugaredMethodForProcessing(method);
     }
 
@@ -141,11 +158,13 @@
 
     @Override
     public void acceptRecordClass(DexProgramClass recordClass) {
+      acceptClass(recordClass);
       methodProcessor.scheduleDesugaredMethodsForProcessing(recordClass.programMethods());
     }
 
     @Override
     public void acceptLambdaClass(LambdaClass lambdaClass, ProgramMethod context) {
+      acceptClass(lambdaClass.getLambdaProgramClass());
       synchronized (synthesizedLambdaClasses) {
         synthesizedLambdaClasses.add(lambdaClass);
       }
@@ -154,6 +173,7 @@
     @Override
     public void acceptConstantDynamicClass(
         ConstantDynamicClass constantDynamicClass, ProgramMethod context) {
+      acceptClass(constantDynamicClass.getConstantDynamicProgramClass());
       synchronized (synthesizedConstantDynamicClasses) {
         synthesizedConstantDynamicClasses.add(constantDynamicClass);
       }
@@ -176,17 +196,20 @@
 
     @Override
     public void acceptTwrCloseResourceMethod(ProgramMethod closeMethod, ProgramMethod context) {
+      acceptMethod(closeMethod);
       methodProcessor.scheduleMethodForProcessing(closeMethod, this);
     }
 
     @Override
     public void acceptThrowMethod(ProgramMethod method, ProgramMethod context) {
+      acceptMethod(method);
       methodProcessor.scheduleDesugaredMethodForProcessing(method);
     }
 
     @Override
     public void acceptInvokeStaticInterfaceOutliningMethod(
         ProgramMethod method, ProgramMethod context) {
+      acceptMethod(method);
       methodProcessor.scheduleDesugaredMethodForProcessing(method);
     }
 
@@ -202,20 +225,31 @@
 
     @Override
     public void acceptAPIConversion(ProgramMethod method) {
+      acceptMethod(method);
       methodProcessor.scheduleDesugaredMethodForProcessing(method);
     }
 
     @Override
     public void acceptCompanionClassClinit(ProgramMethod method) {
+      acceptMethod(method);
       methodProcessor.scheduleDesugaredMethodForProcessing(method);
     }
 
     public List<ProgramMethod> finalizeDesugaring(
-        AppView<?> appView, ClassConverterResult.Builder classConverterResultBuilder) {
+        AppView<?> appView,
+        ExecutorService executorService,
+        ClassConverterResult.Builder classConverterResultBuilder)
+        throws ExecutionException {
       List<ProgramMethod> needsProcessing = new ArrayList<>();
       finalizeInvokeSpecialDesugaring(appView, needsProcessing::add);
       finalizeLambdaDesugaring(classConverterResultBuilder, needsProcessing::add);
       finalizeConstantDynamicDesugaring(needsProcessing::add);
+      if (new StartupInstrumentation(appView)
+          .instrumentClasses(synthesizedClasses, executorService)) {
+        for (DexProgramClass synthesizedClass : synthesizedClasses) {
+          needsProcessing.add(synthesizedClass.getProgramClassInitializer());
+        }
+      }
       return needsProcessing;
     }
 
diff --git a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
index 8e8541b..955183a 100644
--- a/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
+++ b/src/main/java/com/android/tools/r8/ir/desugar/itf/InterfaceMethodRewriter.java
@@ -593,6 +593,19 @@
     // 1.7 or below, this will make a VerificationError on the input a VerificationError
     // on the output. If the input was 1.8 or above the runtime behaviour (potential ICCE)
     // will remain the same.
+    upgradeCfVersionToSupportInterfaceMethodInvoke(method);
+  }
+
+  private void leavingSuperInvokeToInterface(ProgramMethod method) {
+    // When leaving interface method invokes possibly upgrade the class file
+    // version, but don't go above the initial class file version. If the input was
+    // 1.7 or below, this will make a VerificationError on the input a VerificationError
+    // on the output. If the input was 1.8 or above the runtime behaviour (potential ICCE)
+    // will remain the same.
+    upgradeCfVersionToSupportInterfaceMethodInvoke(method);
+  }
+
+  private void upgradeCfVersionToSupportInterfaceMethodInvoke(ProgramMethod method) {
     if (method.getHolder().hasClassFileVersion()) {
       method
           .getDefinition()
@@ -649,7 +662,7 @@
       return computeInvokeAsThrowRewrite(invoke, resolutionResult, context);
     }
 
-    if (clazz.isInterface() && !clazz.isLibraryClass()) {
+    if (clazz.isInterface() && !resolutionResult.getResolutionPair().getHolder().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.
@@ -714,20 +727,27 @@
 
     DesugarDescription emulatedInterfaceDesugaring =
         computeEmulatedInterfaceInvokeSpecial(clazz, invokedMethod, context);
-    if (!emulatedInterfaceDesugaring.needsDesugaring() && context.isDefaultMethod()) {
-      return AlwaysThrowingInstructionDesugaring.computeInvokeAsThrowNSMERewrite(
-          appView,
-          invoke,
-          () ->
-              appView
-                  .reporter()
-                  .warning(
-                      new StringDiagnostic(
-                          "Interface method desugaring has inserted NoSuchMethodError replacing a"
-                              + " super call in "
-                              + context.toSourceString(),
-                          context.getOrigin())));
+    if (!emulatedInterfaceDesugaring.needsDesugaring()) {
+      if (context.isDefaultMethod()) {
+        return AlwaysThrowingInstructionDesugaring.computeInvokeAsThrowNSMERewrite(
+            appView,
+            invoke,
+            () ->
+                appView
+                    .reporter()
+                    .warning(
+                        new StringDiagnostic(
+                            "Interface method desugaring has inserted NoSuchMethodError replacing a"
+                                + " super call in "
+                                + context.toSourceString(),
+                            context.getOrigin())));
+      } else {
+        return DesugarDescription.builder()
+            .addScanEffect(() -> leavingSuperInvokeToInterface(context))
+            .build();
+      }
     }
+
     return emulatedInterfaceDesugaring;
   }
 
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
index 75c275f..d3d0ece 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/DefaultInliningOracle.java
@@ -45,7 +45,6 @@
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
 import com.android.tools.r8.shaking.AssumeInfoCollection;
 import com.android.tools.r8.shaking.MainDexInfo;
-import com.android.tools.r8.synthesis.SyntheticItems;
 import com.android.tools.r8.utils.BooleanUtils;
 import com.android.tools.r8.utils.InternalOptions.InlinerOptions;
 import com.google.common.collect.Sets;
@@ -164,12 +163,10 @@
       return false;
     }
 
-    SyntheticItems syntheticItems = appView.getSyntheticItems();
     ClassToFeatureSplitMap classToFeatureSplitMap = appView.appInfo().getClassToFeatureSplitMap();
-    if (!classToFeatureSplitMap.isInSameFeatureOrBothInSameBase(
-        singleTarget, method, syntheticItems)) {
+    if (!classToFeatureSplitMap.isInSameFeatureOrBothInSameBase(singleTarget, method, appView)) {
       // Still allow inlining if we inline from the base into a feature.
-      if (!classToFeatureSplitMap.isInBase(singleTarget.getHolder(), syntheticItems)) {
+      if (!classToFeatureSplitMap.isInBase(singleTarget.getHolder(), appView)) {
         whyAreYouNotInliningReporter.reportInliningAcrossFeatureSplit();
         return false;
       }
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java b/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
index 59e06c4..96b79b1 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/InliningConstraints.java
@@ -386,9 +386,7 @@
         .appInfo()
         .getClassToFeatureSplitMap()
         .isInBaseOrSameFeatureAs(
-            resolvedMember.getHolderType(),
-            context.asProgramMethod(),
-            appView.getSyntheticItems())) {
+            resolvedMember.getHolderType(), context.asProgramMethod(), appView)) {
       // We never inline into the base from a feature (calls should never happen) and we
       // never inline between features, so this check should be sufficient.
       return ConstraintWithTarget.NEVER;
diff --git a/src/main/java/com/android/tools/r8/ir/optimize/ReflectionOptimizer.java b/src/main/java/com/android/tools/r8/ir/optimize/ReflectionOptimizer.java
index 879646e..be176f2 100644
--- a/src/main/java/com/android/tools/r8/ir/optimize/ReflectionOptimizer.java
+++ b/src/main/java/com/android/tools/r8/ir/optimize/ReflectionOptimizer.java
@@ -264,9 +264,7 @@
 
     // Make sure the (base) type is visible.
     ClassToFeatureSplitMap classToFeatureSplitMap = appView.appInfo().getClassToFeatureSplitMap();
-    if (AccessControl.isClassAccessible(
-            baseClass, context, classToFeatureSplitMap, appView.getSyntheticItems())
-        .isPossiblyFalse()) {
+    if (AccessControl.isClassAccessible(baseClass, context, appView).isPossiblyFalse()) {
       return;
     }
 
@@ -274,7 +272,7 @@
     // or in the base.
     assert !baseClass.isProgramClass()
         || classToFeatureSplitMap.isInBaseOrSameFeatureAs(
-            baseClass.asProgramClass(), context, appView.getSyntheticItems());
+            baseClass.asProgramClass(), context, appView);
 
     consumer.accept(type, baseClass);
   }
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/ProguardMapReaderWithFiltering.java b/src/main/java/com/android/tools/r8/retrace/internal/ProguardMapReaderWithFiltering.java
index d42da83..0d764a5 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/ProguardMapReaderWithFiltering.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/ProguardMapReaderWithFiltering.java
@@ -18,7 +18,7 @@
 import java.nio.charset.StandardCharsets;
 import java.nio.file.Path;
 import java.nio.file.StandardOpenOption;
-import java.util.Set;
+import java.util.function.Predicate;
 
 public abstract class ProguardMapReaderWithFiltering implements LineReader {
 
@@ -188,9 +188,9 @@
   private int startIndex = 0;
   private int endIndex = 0;
 
-  private final Set<String> filter;
+  private final Predicate<String> filter;
 
-  protected ProguardMapReaderWithFiltering(Set<String> filter) {
+  protected ProguardMapReaderWithFiltering(Predicate<String> filter) {
     this.filter = filter;
   }
 
@@ -220,7 +220,7 @@
         seenFirstClass = true;
         String classMapping = getBufferAsString(bytes);
         String obfuscatedClassName = getObfuscatedClassName(classMapping);
-        isInsideClassOfInterest = filter.contains(obfuscatedClassName);
+        isInsideClassOfInterest = filter.test(obfuscatedClassName);
         return classMapping;
       } else if (lineParserState == IS_COMMENT_SOURCE_FILE) {
         return getBufferAsString(bytes);
@@ -284,7 +284,7 @@
     private int temporaryBufferPosition = 0;
 
     public ProguardMapReaderWithFilteringMappedBuffer(
-        Path mappingFile, Set<String> classNamesOfInterest) throws IOException {
+        Path mappingFile, Predicate<String> classNamesOfInterest) throws IOException {
       super(classNamesOfInterest);
       fileChannel = FileChannel.open(mappingFile, StandardOpenOption.READ);
       channelSize = fileChannel.size();
@@ -364,7 +364,7 @@
     private int endReadIndex = 0;
 
     public ProguardMapReaderWithFilteringInputBuffer(
-        InputStream inputStream, Set<String> classNamesOfInterest) {
+        InputStream inputStream, Predicate<String> classNamesOfInterest) {
       super(classNamesOfInterest);
       this.inputStream = inputStream;
     }
diff --git a/src/main/java/com/android/tools/r8/retrace/internal/ProguardMappingProviderBuilderImpl.java b/src/main/java/com/android/tools/r8/retrace/internal/ProguardMappingProviderBuilderImpl.java
index ebba380..8cf9ace 100644
--- a/src/main/java/com/android/tools/r8/retrace/internal/ProguardMappingProviderBuilderImpl.java
+++ b/src/main/java/com/android/tools/r8/retrace/internal/ProguardMappingProviderBuilderImpl.java
@@ -15,6 +15,7 @@
 import com.android.tools.r8.retrace.internal.ProguardMapReaderWithFiltering.ProguardMapReaderWithFilteringMappedBuffer;
 import java.util.HashSet;
 import java.util.Set;
+import java.util.function.Predicate;
 
 public class ProguardMappingProviderBuilderImpl extends ProguardMappingProvider.Builder {
 
@@ -64,7 +65,7 @@
   @Override
   public ProguardMappingProvider build() {
     try {
-      Set<String> buildForClass = allowLookupAllClasses ? null : allowedLookup;
+      Predicate<String> buildForClass = allowLookupAllClasses ? null : allowedLookup::contains;
       LineReader reader =
           proguardMapProducer.isFileBacked()
               ? new ProguardMapReaderWithFilteringMappedBuffer(
diff --git a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
index 677338b..f4e27a1 100644
--- a/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
+++ b/src/main/java/com/android/tools/r8/shaking/AppInfoWithLiveness.java
@@ -319,7 +319,7 @@
         previous.getClassToFeatureSplitMap().withoutPrunedItems(prunedItems),
         previous.getMainDexInfo().withoutPrunedItems(prunedItems),
         previous.getMissingClasses(),
-        previous.getStartupOrder().withoutPrunedItems(prunedItems),
+        previous.getStartupOrder().withoutPrunedItems(prunedItems, previous.getSyntheticItems()),
         previous.deadProtoTypes,
         pruneClasses(previous.liveTypes, prunedItems, executorService, futures),
         pruneMethods(previous.targetedMethods, prunedItems, executorService, futures),
diff --git a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
index 3addb2d..c731f7d 100644
--- a/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
+++ b/src/main/java/com/android/tools/r8/shaking/Enqueuer.java
@@ -460,6 +460,8 @@
 
   private final InterfaceProcessor interfaceProcessor;
 
+  private final Thread mainThreadForTesting = Thread.currentThread();
+
   Enqueuer(
       AppView<? extends AppInfoWithClassHierarchy> appView,
       ExecutorService executorService,
@@ -686,6 +688,7 @@
       ProgramDerivedContext context,
       BiConsumer<DexClass, ProgramDerivedContext> foundClassConsumer,
       BiConsumer<DexType, ProgramDerivedContext> missingClassConsumer) {
+    assert verifyIsMainThread();
     return internalDefinitionFor(type, context, foundClassConsumer, missingClassConsumer)
         .toSingleClassWithProgramOverLibrary();
   }
@@ -1958,6 +1961,11 @@
   // Actual actions performed.
   //
 
+  private boolean verifyIsMainThread() {
+    assert Thread.currentThread() == mainThreadForTesting;
+    return true;
+  }
+
   private boolean verifyMethodIsTargeted(ProgramMethod method) {
     DexEncodedMethod definition = method.getDefinition();
     assert !definition.isClassInitializer() : "Class initializers are never targeted";
@@ -3943,7 +3951,7 @@
           lambdaCallback.andThen(
               (clazz, context) -> {
                 for (DexType itf : clazz.getLambdaProgramClass().getInterfaces()) {
-                  if (definitionFor(itf, context) == null) {
+                  if (appInfo().definitionFor(itf, context) == null) {
                     for (ProgramMethod method :
                         clazz.getLambdaProgramClass().virtualProgramMethods()) {
                       synchronized (additions) {
diff --git a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
index b5898c5..37641f0 100644
--- a/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
+++ b/src/main/java/com/android/tools/r8/shaking/VerticalClassMerger.java
@@ -389,7 +389,7 @@
 
     if (!appInfo
         .getClassToFeatureSplitMap()
-        .isInSameFeatureOrBothInSameBase(sourceClass, targetClass, appView.getSyntheticItems())) {
+        .isInSameFeatureOrBothInSameBase(sourceClass, targetClass, appView)) {
       return false;
     }
     if (appView.appServices().allServiceTypes().contains(sourceClass.type)
diff --git a/src/main/java/com/android/tools/r8/synthesis/SynthesizingContext.java b/src/main/java/com/android/tools/r8/synthesis/SynthesizingContext.java
index 3b3aeea..8c2a3bf 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SynthesizingContext.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SynthesizingContext.java
@@ -7,6 +7,7 @@
 import static com.android.tools.r8.utils.DescriptorUtils.getDescriptorFromClassBinaryName;
 
 import com.android.tools.r8.FeatureSplit;
+import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.ClasspathOrLibraryClass;
 import com.android.tools.r8.graph.DexProgramClass;
@@ -69,11 +70,18 @@
       DexProgramClass clazz, DexType synthesizingContextType, AppView<?> appView) {
     // A context that is itself synthetic must denote a synthesizing context from which to ensure
     // hygiene. This synthesizing context type is encoded on the synthetic for intermediate builds.
-    FeatureSplit featureSplit =
-        appView
-            .appInfoForDesugaring()
-            .getClassToFeatureSplitMap()
-            .getFeatureSplit(clazz, appView.getSyntheticItems());
+    FeatureSplit featureSplit;
+    if (appView.hasClassHierarchy()) {
+      AppView<? extends AppInfoWithClassHierarchy> appViewWithClassHierarchy =
+          appView.withClassHierarchy();
+      featureSplit =
+          appViewWithClassHierarchy
+              .appInfo()
+              .getClassToFeatureSplitMap()
+              .getFeatureSplit(clazz, appViewWithClassHierarchy);
+    } else {
+      featureSplit = FeatureSplit.BASE;
+    }
     return new SynthesizingContext(synthesizingContextType, clazz.type, clazz.origin, featureSplit);
   }
 
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
index 86206f6..eb764c0 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticFinalization.java
@@ -642,11 +642,13 @@
       boolean mustBeRepresentative = isPinned(appView, synthetic);
       EquivalenceGroup<T> equivalenceGroup = null;
       for (EquivalenceGroup<T> group : groups) {
+        boolean includeContext =
+            intermediate || appView.options().getStartupOptions().isStartupInstrumentationEnabled();
         if (synthetic.isEquivalentTo(
             group.hasRepresentative()
                 ? group.getRepresentative()
                 : group.getFirstNonRepresentativeMember(),
-            intermediate,
+            includeContext,
             appView.graphLens(),
             classToFeatureSplitMap)) {
           if (mustBeRepresentative && group.hasRepresentative()) {
diff --git a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
index e3d52a4..2c2f503 100644
--- a/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
+++ b/src/main/java/com/android/tools/r8/synthesis/SyntheticItems.java
@@ -9,8 +9,10 @@
 import com.android.tools.r8.contexts.CompilationContext.UniqueContext;
 import com.android.tools.r8.errors.MissingGlobalSyntheticsConsumerDiagnostic;
 import com.android.tools.r8.errors.Unreachable;
+import com.android.tools.r8.experimental.startup.StartupOrder;
 import com.android.tools.r8.features.ClassToFeatureSplitMap;
 import com.android.tools.r8.graph.AppInfo;
+import com.android.tools.r8.graph.AppInfoWithClassHierarchy;
 import com.android.tools.r8.graph.AppView;
 import com.android.tools.r8.graph.ClassResolutionResult;
 import com.android.tools.r8.graph.ClasspathMethod;
@@ -209,14 +211,6 @@
     return globalSyntheticsStrategy;
   }
 
-  // Empty collection for use only in tests and utilities.
-  public static SyntheticItems empty() {
-    return new SyntheticItems(
-        State.FINALIZED,
-        CommittedSyntheticsCollection.empty(null),
-        GlobalSyntheticsStrategy.forNonSynthesizing());
-  }
-
   // Only for use from initial AppInfo/AppInfoWithClassHierarchy create functions. */
   public static CommittedItems createInitialSyntheticItems(
       DexApplication application, GlobalSyntheticsStrategy globalSyntheticsStrategy) {
@@ -534,13 +528,18 @@
 
   private SynthesizingContext getSynthesizingContext(
       ProgramDefinition context, AppView<?> appView) {
+    if (appView.hasClassHierarchy()) {
+      AppInfoWithClassHierarchy appInfo = appView.appInfoWithClassHierarchy();
+      return getSynthesizingContext(
+          context, appInfo.getClassToFeatureSplitMap(), appInfo.getStartupOrder());
+    }
     return getSynthesizingContext(
-        context, appView.appInfoForDesugaring().getClassToFeatureSplitMap());
+        context, ClassToFeatureSplitMap.createEmptyClassToFeatureSplitMap(), StartupOrder.empty());
   }
 
   /** Used to find the synthesizing context for a new synthetic that is about to be created. */
   private SynthesizingContext getSynthesizingContext(
-      ProgramDefinition context, ClassToFeatureSplitMap featureSplits) {
+      ProgramDefinition context, ClassToFeatureSplitMap featureSplits, StartupOrder startupOrder) {
     DexType contextType = context.getContextType();
     SyntheticDefinition<?, ?, ?> existingDefinition = pending.definitions.get(contextType);
     if (existingDefinition != null) {
@@ -556,7 +555,7 @@
           .getContext();
     }
     // This context is not nested in an existing synthetic context so create a new "leaf" context.
-    FeatureSplit featureSplit = featureSplits.getFeatureSplit(context, this);
+    FeatureSplit featureSplit = featureSplits.getFeatureSplit(context, startupOrder, this);
     return SynthesizingContext.fromNonSyntheticInputContext(context, featureSplit);
   }
 
diff --git a/src/main/java/com/android/tools/r8/utils/AccessUtils.java b/src/main/java/com/android/tools/r8/utils/AccessUtils.java
index 6e54e2a..84f644a 100644
--- a/src/main/java/com/android/tools/r8/utils/AccessUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/AccessUtils.java
@@ -11,7 +11,6 @@
 import com.android.tools.r8.graph.DexItemFactory;
 import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.shaking.AppInfoWithLiveness;
-import com.android.tools.r8.synthesis.SyntheticItems;
 
 public class AccessUtils {
 
@@ -43,13 +42,11 @@
     // If the new class is a program class, we need to check if it is in a feature.
     if (newBaseClass.isProgramClass()) {
       ClassToFeatureSplitMap classToFeatureSplitMap = appView.appInfo().getClassToFeatureSplitMap();
-      SyntheticItems syntheticItems = appView.getSyntheticItems();
       if (classToFeatureSplitMap != null) {
         FeatureSplit newFeatureSplit =
-            classToFeatureSplitMap.getFeatureSplit(newBaseClass.asProgramClass(), syntheticItems);
+            classToFeatureSplitMap.getFeatureSplit(newBaseClass.asProgramClass(), appView);
         if (!newFeatureSplit.isBase()
-            && newFeatureSplit
-                != classToFeatureSplitMap.getFeatureSplit(oldBaseType, syntheticItems)) {
+            && newFeatureSplit != classToFeatureSplitMap.getFeatureSplit(oldBaseType, appView)) {
           return false;
         }
       }
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 14d7941..40c5a67 100644
--- a/src/main/java/com/android/tools/r8/utils/AndroidApp.java
+++ b/src/main/java/com/android/tools/r8/utils/AndroidApp.java
@@ -35,6 +35,7 @@
 import com.android.tools.r8.errors.InternalCompilerError;
 import com.android.tools.r8.errors.Unreachable;
 import com.android.tools.r8.experimental.startup.StartupConfiguration;
+import com.android.tools.r8.experimental.startup.StartupOrder;
 import com.android.tools.r8.features.ClassToFeatureSplitMap;
 import com.android.tools.r8.features.FeatureSplitConfiguration;
 import com.android.tools.r8.graph.DexItemFactory;
@@ -627,8 +628,10 @@
                       classDescriptor -> {
                         if (featureSplitConfiguration != null) {
                           DexType type = dexItemFactory.createType(classDescriptor);
+                          SyntheticItems syntheticItems = null;
                           FeatureSplit featureSplit =
-                              classToFeatureSplitMap.getFeatureSplit(type, SyntheticItems.empty());
+                              classToFeatureSplitMap.getFeatureSplit(
+                                  type, StartupOrder.empty(), syntheticItems);
                           if (featureSplit != null && !featureSplit.isBase()) {
                             return featureSplitArchiveOutputStreams.get(featureSplit);
                           }
diff --git a/src/main/java/com/android/tools/r8/utils/FeatureClassMapping.java b/src/main/java/com/android/tools/r8/utils/FeatureClassMapping.java
deleted file mode 100644
index 00412d9..0000000
--- a/src/main/java/com/android/tools/r8/utils/FeatureClassMapping.java
+++ /dev/null
@@ -1,313 +0,0 @@
-// Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-package com.android.tools.r8.utils;
-
-import com.android.tools.r8.ArchiveClassFileProvider;
-import com.android.tools.r8.DiagnosticsHandler;
-import com.android.tools.r8.Keep;
-import com.android.tools.r8.dexsplitter.DexSplitter.FeatureJar;
-import com.android.tools.r8.origin.PathOrigin;
-import java.io.IOException;
-import java.nio.charset.StandardCharsets;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.HashMap;
-import java.util.HashSet;
-import java.util.List;
-import java.util.Map;
-import java.util.Set;
-import java.util.regex.Pattern;
-import java.util.stream.Collectors;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipFile;
-
-/**
- * Provides a mappings of classes to modules. The structure of the input file is as follows:
- * packageOrClass:module
- *
- * <p>Lines with a # prefix are ignored.
- *
- * <p>We will do most specific matching, i.e.,
- * <pre>
- *   com.google.foobar.*:feature2
- *   com.google.*:base
- * </pre>
- * will put everything in the com.google namespace into base, except classes in com.google.foobar
- * that will go to feature2. Class based mappings takes precedence over packages (since they are
- * more specific):
- * <pre>
- *   com.google.A:feature2
- *   com.google.*:base
- *  </pre>
- * Puts A into feature2, and all other classes from com.google into base.
- *
- * <p>Note that this format does not allow specifying inter-module dependencies, this is simply a
- * placement tool.
- */
-@Keep
-public final class FeatureClassMapping {
-
-  Map<String, String> parsedRules = new HashMap<>(); // Already parsed rules.
-  Map<String, String> parseNonClassRules = new HashMap<>();
-  boolean usesOnlyExactMappings = true;
-
-  Set<FeaturePredicate> mappings = new HashSet<>();
-
-  Path mappingFile;
-  String baseName = DEFAULT_BASE_NAME;
-
-  static final String DEFAULT_BASE_NAME = "base";
-
-  static final String COMMENT = "#";
-  static final String SEPARATOR = ":";
-
-  public String getBaseName() {
-    return baseName;
-  }
-
-  private static class SpecificationOrigin extends PathOrigin {
-
-    public SpecificationOrigin(Path path) {
-      super(path);
-    }
-
-    @Override
-    public String part() {
-      return "specification file '" + super.part() + "'";
-    }
-  }
-
-  private static class JarFileOrigin extends PathOrigin {
-
-    public JarFileOrigin(Path path) {
-      super(path);
-    }
-
-    @Override
-    public String part() {
-      return "jar file '" + super.part() + "'";
-    }
-  }
-
-  public static FeatureClassMapping fromSpecification(Path file) throws FeatureMappingException {
-    return fromSpecification(file, new DiagnosticsHandler() {});
-  }
-
-  public static FeatureClassMapping fromSpecification(Path file, DiagnosticsHandler reporter)
-      throws FeatureMappingException {
-    FeatureClassMapping mapping = new FeatureClassMapping();
-    List<String> lines = null;
-    try {
-      lines = FileUtils.readAllLines(file);
-    } catch (IOException e) {
-      ExceptionDiagnostic error = new ExceptionDiagnostic(e, new SpecificationOrigin(file));
-      reporter.error(error);
-      throw new AbortException(error);
-    }
-    for (int i = 0; i < lines.size(); i++) {
-      String line = lines.get(i);
-      mapping.parseAndAdd(line, i);
-    }
-    return mapping;
-  }
-
-  public static class Internal {
-    private static List<String> getClassFileDescriptors(String jar, DiagnosticsHandler reporter) {
-      Path jarPath = Paths.get(jar);
-      try {
-        return new ArchiveClassFileProvider(jarPath).getClassDescriptors()
-            .stream()
-            .map(DescriptorUtils::descriptorToJavaType)
-            .collect(Collectors.toList());
-      } catch (IOException e) {
-        ExceptionDiagnostic error = new ExceptionDiagnostic(e, new JarFileOrigin(jarPath));
-        reporter.error(error);
-        throw new AbortException(error);
-      }
-    }
-
-    private static List<String> getNonClassFiles(String jar, DiagnosticsHandler reporter) {
-      try (ZipFile zipfile = new ZipFile(jar, StandardCharsets.UTF_8)) {
-          return zipfile.stream()
-              .filter(entry -> !ZipUtils.isClassFile(entry.getName()))
-              .map(ZipEntry::getName)
-              .collect(Collectors.toList());
-        } catch (IOException e) {
-        ExceptionDiagnostic error = new ExceptionDiagnostic(e, new JarFileOrigin(Paths.get(jar)));
-        reporter.error(error);
-        throw new AbortException(error);
-        }
-    }
-
-    public static FeatureClassMapping fromJarFiles(
-        List<FeatureJar> featureJars, List<String> baseJars, String baseName,
-        DiagnosticsHandler reporter)
-        throws FeatureMappingException {
-      FeatureClassMapping mapping = new FeatureClassMapping();
-      if (baseName != null) {
-        mapping.baseName = baseName;
-      }
-      for (FeatureJar featureJar : featureJars) {
-        for (String javaType : getClassFileDescriptors(featureJar.getJar(), reporter)) {
-          mapping.addMapping(javaType, featureJar.getOutputName());
-        }
-        for (String nonClass : getNonClassFiles(featureJar.getJar(), reporter)) {
-          mapping.addNonClassMapping(nonClass, featureJar.getOutputName());
-        }
-      }
-      for (String baseJar : baseJars) {
-        for (String javaType : getClassFileDescriptors(baseJar, reporter)) {
-          mapping.addBaseMapping(javaType);
-        }
-        for (String nonClass : getNonClassFiles(baseJar, reporter)) {
-          mapping.addBaseNonClassMapping(nonClass);
-        }
-      }
-      assert mapping.usesOnlyExactMappings;
-      return mapping;
-    }
-
-  }
-
-  private FeatureClassMapping() {}
-
-  public void addBaseMapping(String clazz) throws FeatureMappingException {
-    addMapping(clazz, baseName);
-  }
-
-  public void addBaseNonClassMapping(String name) {
-    addNonClassMapping(name, baseName);
-  }
-
-  public void addMapping(String clazz, String feature) throws FeatureMappingException {
-    addRule(clazz, feature, 0);
-  }
-
-  public void addNonClassMapping(String name, String feature) {
-    // If a non-class file is present in multiple features put the resource in the base.
-    parseNonClassRules.put(name, parseNonClassRules.containsKey(name) ? baseName : feature);
-  }
-
-  FeatureClassMapping(List<String> lines) throws FeatureMappingException {
-    for (int i = 0; i < lines.size(); i++) {
-      String line = lines.get(i);
-      parseAndAdd(line, i);
-    }
-  }
-
-  public String featureForClass(String clazz) {
-    if (usesOnlyExactMappings) {
-      return parsedRules.getOrDefault(clazz, baseName);
-    } else {
-      FeaturePredicate bestMatch = null;
-      for (FeaturePredicate mapping : mappings) {
-        if (mapping.match(clazz)) {
-          if (bestMatch == null || bestMatch.predicate.length() < mapping.predicate.length()) {
-            bestMatch = mapping;
-          }
-        }
-      }
-      if (bestMatch == null) {
-        return baseName;
-      }
-      return bestMatch.feature;
-    }
-  }
-
-  public String featureForNonClass(String nonClass) {
-    return parseNonClassRules.getOrDefault(nonClass, baseName);
-  }
-
-  private void parseAndAdd(String line, int lineNumber) throws FeatureMappingException {
-    if (line.startsWith(COMMENT)) {
-      return; // Ignore comments
-    }
-    if (line.isEmpty()) {
-      return; // Ignore blank lines
-    }
-
-    if (!line.contains(SEPARATOR)) {
-      error("Mapping lines must contain a " + SEPARATOR, lineNumber);
-    }
-    String[] values = line.split(SEPARATOR);
-    if (values.length != 2) {
-      error("Mapping lines can only contain one " + SEPARATOR, lineNumber);
-    }
-
-    String predicate = values[0];
-    String feature = values[1];
-    addRule(predicate, feature, lineNumber);
-  }
-
-  private void addRule(String predicate, String feature, int lineNumber)
-      throws FeatureMappingException {
-    if (parsedRules.containsKey(predicate)) {
-      if (!parsedRules.get(predicate).equals(feature)) {
-        error("Redefinition of predicate " + predicate + "not allowed", lineNumber);
-      }
-      return; // Already have this rule.
-    }
-    parsedRules.put(predicate, feature);
-    FeaturePredicate featurePredicate = new FeaturePredicate(predicate, feature);
-    mappings.add(featurePredicate);
-    usesOnlyExactMappings &= featurePredicate.isExactmapping();
-  }
-
-  private void error(String error, int line) throws FeatureMappingException {
-    throw new FeatureMappingException(
-        "Invalid mappings specification: " + error + "\n in file " + mappingFile + ":" + line);
-  }
-
-  @Keep
-  public static class FeatureMappingException extends Exception {
-    FeatureMappingException(String message) {
-      super(message);
-    }
-  }
-
-  /** A feature predicate can either be a wildcard or class predicate. */
-  private static class FeaturePredicate {
-    private static Pattern identifier = Pattern.compile("[A-Za-z_\\-][A-Za-z0-9_$\\-]*");
-    final String predicate;
-    final String feature;
-    final boolean isCatchAll;
-    // False implies class predicate.
-    final boolean isWildcard;
-
-    FeaturePredicate(String predicate, String feature) throws FeatureMappingException {
-      isWildcard = predicate.endsWith(".*");
-      isCatchAll =  predicate.equals("*");
-      if (isCatchAll) {
-        this.predicate = "";
-      } else if (isWildcard) {
-        String packageName = predicate.substring(0, predicate.length() - 2);
-        if (!DescriptorUtils.isValidJavaType(packageName)) {
-          throw new FeatureMappingException(packageName + " is not a valid identifier");
-        }
-        // Prefix of a fully-qualified class name, including a terminating dot.
-        this.predicate = predicate.substring(0, predicate.length() - 1);
-      } else {
-        if (!DescriptorUtils.isValidJavaType(predicate)) {
-          throw new FeatureMappingException(predicate + " is not a valid identifier");
-        }
-        this.predicate = predicate;
-      }
-      this.feature = feature;
-    }
-
-    boolean match(String className) {
-      if (isCatchAll) {
-        return true;
-      } else if (isWildcard) {
-        return className.startsWith(predicate);
-      } else {
-        return className.equals(predicate);
-      }
-    }
-
-    boolean isExactmapping() {
-      return !isWildcard && !isCatchAll;
-    }
-  }
-}
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 c836c46..ee15be2 100644
--- a/src/main/java/com/android/tools/r8/utils/InternalOptions.java
+++ b/src/main/java/com/android/tools/r8/utils/InternalOptions.java
@@ -21,9 +21,12 @@
 import com.android.tools.r8.Version;
 import com.android.tools.r8.androidapi.ComputedApiLevel;
 import com.android.tools.r8.cf.CfVersion;
+import com.android.tools.r8.debuginfo.DebugRepresentation;
 import com.android.tools.r8.dex.Marker;
 import com.android.tools.r8.dex.Marker.Backend;
 import com.android.tools.r8.dex.Marker.Tool;
+import com.android.tools.r8.dex.MixedSectionLayoutStrategy;
+import com.android.tools.r8.dex.VirtualFile;
 import com.android.tools.r8.dump.DumpOptions;
 import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.errors.IncompleteNestNestDesugarDiagnosic;
@@ -104,6 +107,7 @@
 import java.util.TreeSet;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.function.BiConsumer;
+import java.util.function.BiFunction;
 import java.util.function.BiPredicate;
 import java.util.function.Consumer;
 import java.util.function.Function;
@@ -259,6 +263,16 @@
     horizontalClassMergerOptions.setRestrictToSynthetics();
   }
 
+  public void configureAndroidPlatformBuild(boolean isAndroidPlatformBuild) {
+    if (!isAndroidPlatformBuild) {
+      return;
+    }
+    // Configure options according to platform build assumptions.
+    // See go/r8platformflag and b/232073181.
+    minApiLevel = ANDROID_PLATFORM;
+    apiModelingOptions().disableMissingApiModeling();
+  }
+
   public boolean printTimes = System.getProperty("com.android.tools.r8.printtimes") != null;
   // To print memory one also have to enable printtimes.
   public boolean printMemory = System.getProperty("com.android.tools.r8.printmemory") != null;
@@ -853,6 +867,10 @@
     return startupOptions;
   }
 
+  public TestingOptions getTestingOptions() {
+    return testing;
+  }
+
   private static Set<String> getExtensiveLoggingFilter() {
     String property = System.getProperty("com.android.tools.r8.extensiveLoggingFilter");
     if (property != null) {
@@ -1756,6 +1774,15 @@
             ? NondeterministicIROrdering.getInstance()
             : IdentityIROrdering.getInstance();
 
+    public BiFunction<MixedSectionLayoutStrategy, VirtualFile, MixedSectionLayoutStrategy>
+        mixedSectionLayoutStrategyInspector = (strategy, virtualFile) -> strategy;
+
+    public void setMixedSectionLayoutStrategyInspector(
+        BiFunction<MixedSectionLayoutStrategy, VirtualFile, MixedSectionLayoutStrategy>
+            mixedSectionLayoutStrategyInspector) {
+      this.mixedSectionLayoutStrategyInspector = mixedSectionLayoutStrategyInspector;
+    }
+
     public BiConsumer<AppInfoWithLiveness, Enqueuer.Mode> enqueuerInspector = null;
 
     public Consumer<String> processingContextsConsumer = null;
@@ -1778,6 +1805,8 @@
 
     public Consumer<Deque<ProgramMethodSet>> waveModifier = waves -> {};
 
+    public Consumer<DebugRepresentation> debugRepresentationCallback = null;
+
     /**
      * If this flag is enabled, we will also compute the set of possible targets for invoke-
      * interface and invoke-virtual instructions that target a library method, and add the
@@ -1819,6 +1848,10 @@
     public boolean dontCreateMarkerInD8 = false;
     public boolean forceJumboStringProcessing = false;
     public boolean forcePcBasedEncoding = false;
+    public int pcBasedDebugEncodingOverheadThreshold =
+        System.getProperty("com.android.tools.r8.pc2pcOverheadThreshold") != null
+            ? Integer.parseInt(System.getProperty("com.android.tools.r8.pc2pcOverheadThreshold"))
+            : 200000;
     public Set<Inliner.Reason> validInliningReasons = null;
     public boolean noLocalsTableOnInput = false;
     public boolean forceNameReflectionOptimization = false;
diff --git a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
index 389fd36..660a5fd 100644
--- a/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
+++ b/src/main/java/com/android/tools/r8/utils/LineNumberOptimizer.java
@@ -76,9 +76,8 @@
 import it.unimi.dsi.fastutil.ints.Int2IntLinkedOpenHashMap;
 import it.unimi.dsi.fastutil.ints.Int2IntMap;
 import it.unimi.dsi.fastutil.ints.Int2IntSortedMap;
-import it.unimi.dsi.fastutil.objects.Object2ReferenceMap;
-import it.unimi.dsi.fastutil.objects.Object2ReferenceOpenHashMap;
 import java.util.ArrayList;
+import java.util.HashMap;
 import java.util.IdentityHashMap;
 import java.util.List;
 import java.util.Map;
@@ -354,10 +353,10 @@
 
   private interface PcBasedDebugInfoRecorder {
     /** Callback to record a code object with a given max instruction PC and parameter count. */
-    void recordPcMappingFor(DexCode code, int parameterCount, int maxEncodingPc);
+    void recordPcMappingFor(ProgramMethod method, int maxEncodingPc);
 
     /** Callback to record a code object with only a single "line". */
-    void recordSingleLineFor(DexCode code, int parameterCount, int maxEncodingPc);
+    void recordSingleLineFor(ProgramMethod method, int maxEncodingPc);
 
     /**
      * Install the correct debug info objects.
@@ -406,32 +405,44 @@
       singleLineCodesToClear = allowDiscardingSourceFile ? new ArrayList<>() : null;
     }
 
+    private int getLastInstructionOffset(DexCode code) {
+      return DebugRepresentation.getLastExecutableInstruction(code).getOffset();
+    }
+
+    private boolean cantAddToClearSet(ProgramMethod method) {
+      assert method.getDefinition().getCode().isDexCode();
+      if (singleLineCodesToClear == null) {
+        return true;
+      }
+      singleLineCodesToClear.add(method.getDefinition().getCode().asDexCode());
+      return false;
+    }
+
     @Override
-    public void recordPcMappingFor(DexCode code, int parameterCount, int maxEncodingPc) {
+    public void recordPcMappingFor(ProgramMethod method, int maxEncodingPc) {
+      assert method.getDefinition().getCode().isDexCode();
+      int parameterCount = method.getParameters().size();
+      DexCode code = method.getDefinition().getCode().asDexCode();
       assert DebugRepresentation.verifyLastExecutableInstructionWithinBound(code, maxEncodingPc);
       codesToUpdate.add(new UpdateInfo(code, parameterCount, maxEncodingPc));
     }
 
     @Override
-    public void recordSingleLineFor(DexCode code, int parameterCount, int maxEncodingPc) {
-      if (singleLineCodesToClear != null) {
-        singleLineCodesToClear.add(code);
-        return;
+    public void recordSingleLineFor(ProgramMethod method, int maxEncodingPc) {
+      if (cantAddToClearSet(method)) {
+        recordPcMappingFor(method, maxEncodingPc);
       }
-      recordPcMappingFor(code, parameterCount, maxEncodingPc);
     }
 
     @Override
     public void updateDebugInfoInCodeObjects() {
-      Object2ReferenceMap<UpdateInfo, DexDebugInfo> debugInfos =
-          new Object2ReferenceOpenHashMap<>();
+      Map<UpdateInfo, DexDebugInfo> debugInfos = new HashMap<>();
       codesToUpdate.forEach(
           entry -> {
             assert DebugRepresentation.verifyLastExecutableInstructionWithinBound(
                 entry.code, entry.maxEncodingPc);
             DexDebugInfo debugInfo =
-                debugInfos.computeIfAbsent(
-                    entry, key -> buildPc2PcDebugInfo(key.maxEncodingPc, key.paramCount));
+                debugInfos.computeIfAbsent(entry, Pc2PcMappingSupport::buildPc2PcDebugInfo);
             assert debugInfo.asPcBasedInfo().getMaxPc() == entry.maxEncodingPc;
             entry.code.setDebugInfo(debugInfo);
           });
@@ -440,23 +451,26 @@
       }
     }
 
-    private static DexDebugInfo buildPc2PcDebugInfo(int lastInstructionPc, int parameterCount) {
-      return new DexDebugInfo.PcBasedDebugInfo(parameterCount, lastInstructionPc);
+    private static DexDebugInfo buildPc2PcDebugInfo(UpdateInfo info) {
+      return new DexDebugInfo.PcBasedDebugInfo(info.paramCount, info.maxEncodingPc);
     }
   }
 
   private static class NativePcSupport implements PcBasedDebugInfoRecorder {
 
-    @Override
-    public void recordPcMappingFor(DexCode code, int length, int maxEncodingPc) {
-      // Strip the info in full as the runtime will emit the PC directly.
-      code.setDebugInfo(null);
+    private void clearDebugInfo(ProgramMethod method) {
+      // Always strip the info in full as the runtime will emit the PC directly.
+      method.getDefinition().getCode().asDexCode().setDebugInfo(null);
     }
 
     @Override
-    public void recordSingleLineFor(DexCode code, int parameterCount, int maxEncodingPc) {
-      // Strip the info at once as it does not conflict with any PC mapping update.
-      code.setDebugInfo(null);
+    public void recordPcMappingFor(ProgramMethod method, int maxEncodingPc) {
+      clearDebugInfo(method);
+    }
+
+    @Override
+    public void recordSingleLineFor(ProgramMethod method, int maxEncodingPc) {
+      clearDebugInfo(method);
     }
 
     @Override
@@ -567,7 +581,7 @@
           List<MappedPosition> mappedPositions;
           Code code = definition.getCode();
           int pcEncodingCutoff =
-              methods.size() == 1 ? representation.getDexPcEncodingCutoff(clazz, definition) : -1;
+              methods.size() == 1 ? representation.getDexPcEncodingCutoff(method) : -1;
           boolean canUseDexPc = pcEncodingCutoff > 0;
           if (code != null) {
             if (code.isDexCode()
@@ -575,7 +589,7 @@
               if (canUseDexPc) {
                 mappedPositions =
                     optimizeDexCodePositionsForPc(
-                        definition, appView, kotlinRemapper, pcBasedDebugInfo, pcEncodingCutoff);
+                        method, pcEncodingCutoff, appView, kotlinRemapper, pcBasedDebugInfo);
               } else {
                 mappedPositions =
                     optimizeDexCodePositions(
@@ -749,8 +763,7 @@
           if (definition.getCode().isDexCode()
               && definition.getCode().asDexCode().getDebugInfo()
                   == DexDebugInfoForSingleLineMethod.getInstance()) {
-            pcBasedDebugInfo.recordSingleLineFor(
-                definition.getCode().asDexCode(), method.getParameters().size(), pcEncodingCutoff);
+            pcBasedDebugInfo.recordSingleLineFor(method, pcEncodingCutoff);
           }
         } // for each method of the group
       } // for each method group, grouped by name
@@ -1194,15 +1207,16 @@
   }
 
   private static List<MappedPosition> optimizeDexCodePositionsForPc(
-      DexEncodedMethod method,
+      ProgramMethod method,
+      int pcEncodingCutoff,
       AppView<?> appView,
       PositionRemapper positionRemapper,
-      PcBasedDebugInfoRecorder debugInfoProvider,
-      int pcEncodingCutoff) {
+      PcBasedDebugInfoRecorder debugInfoProvider) {
     List<MappedPosition> mappedPositions = new ArrayList<>();
     // Do the actual processing for each method.
-    DexCode dexCode = method.getCode().asDexCode();
-    EventBasedDebugInfo debugInfo = getEventBasedDebugInfo(method, dexCode, appView);
+    DexCode dexCode = method.getDefinition().getCode().asDexCode();
+    EventBasedDebugInfo debugInfo =
+        getEventBasedDebugInfo(method.getDefinition(), dexCode, appView);
     IntBox firstDefaultEventPc = new IntBox(-1);
     BooleanBox singleOriginalLine = new BooleanBox(true);
     Pair<Integer, Position> lastPosition = new Pair<>();
@@ -1269,10 +1283,9 @@
         && lastPosition.getSecond() != null
         && (mappedPositions.isEmpty() || !mappedPositions.get(0).isOutlineCaller())) {
       dexCode.setDebugInfo(DexDebugInfoForSingleLineMethod.getInstance());
-      debugInfoProvider.recordSingleLineFor(
-          dexCode, method.getParameters().size(), pcEncodingCutoff);
+      debugInfoProvider.recordSingleLineFor(method, pcEncodingCutoff);
     } else {
-      debugInfoProvider.recordPcMappingFor(dexCode, debugInfo.parameters.length, pcEncodingCutoff);
+      debugInfoProvider.recordPcMappingFor(method, pcEncodingCutoff);
     }
     return mappedPositions;
   }
diff --git a/src/main/java/com/android/tools/r8/utils/StringUtils.java b/src/main/java/com/android/tools/r8/utils/StringUtils.java
index 59011c5..7275934 100644
--- a/src/main/java/com/android/tools/r8/utils/StringUtils.java
+++ b/src/main/java/com/android/tools/r8/utils/StringUtils.java
@@ -184,7 +184,12 @@
     return join(LINE_SEPARATOR, collection, BraceType.NONE);
   }
 
+
   public static List<String> splitLines(String content) {
+    return splitLines(content, false);
+  }
+
+  public static List<String> splitLines(String content, boolean includeTrailingEmptyLine) {
     int length = content.length();
     List<String> lines = new ArrayList<>();
     int start = 0;
@@ -201,7 +206,7 @@
     }
     if (start < length) {
       String line = content.substring(start);
-      if (!line.isEmpty()) {
+      if (includeTrailingEmptyLine || !line.isEmpty()) {
         lines.add(line);
       }
     }
diff --git a/src/main/keep.txt b/src/main/keep.txt
index e376924..deb8e6d 100644
--- a/src/main/keep.txt
+++ b/src/main/keep.txt
@@ -12,7 +12,6 @@
 -keep public class com.android.tools.r8.D8 { public static void main(java.lang.String[]); }
 -keep public class com.android.tools.r8.R8 { public static void main(java.lang.String[]); }
 -keep public class com.android.tools.r8.ExtractMarker { public static void main(java.lang.String[]); }
--keep public class com.android.tools.r8.dexsplitter.DexSplitter { public static void main(java.lang.String[]); }
 
 -keep public class com.android.tools.r8.Version { public static final java.lang.String LABEL; }
 -keep public class com.android.tools.r8.Version { public static java.lang.String getVersionString(); }
diff --git a/src/test/java/com/android/tools/r8/R8CommandTest.java b/src/test/java/com/android/tools/r8/R8CommandTest.java
index 302b84a..8b951c9 100644
--- a/src/test/java/com/android/tools/r8/R8CommandTest.java
+++ b/src/test/java/com/android/tools/r8/R8CommandTest.java
@@ -25,6 +25,7 @@
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.FileUtils;
 import com.android.tools.r8.utils.InternalOptions;
+import com.android.tools.r8.utils.InternalOptions.ApiModelTestingOptions;
 import com.android.tools.r8.utils.ThreadUtils;
 import com.android.tools.r8.utils.ZipUtils;
 import com.google.common.collect.ImmutableList;
@@ -901,6 +902,14 @@
     numThreadsOptionInvalid("two");
   }
 
+  @Test
+  public void defaultApiModelingState() throws Exception {
+    ApiModelTestingOptions options = parse("").getInternalOptions().apiModelingOptions();
+    assertTrue(options.enableApiCallerIdentification);
+    assertTrue(options.enableOutliningOfMethods);
+    assertTrue(options.enableStubbingOfClasses);
+  }
+
   @Override
   String[] requiredArgsForTest() {
     return new String[0];
diff --git a/src/test/java/com/android/tools/r8/R8TestCompileResult.java b/src/test/java/com/android/tools/r8/R8TestCompileResult.java
index fe500f8..f343c0f 100644
--- a/src/test/java/com/android/tools/r8/R8TestCompileResult.java
+++ b/src/test/java/com/android/tools/r8/R8TestCompileResult.java
@@ -118,8 +118,10 @@
     getApp().writeToDirectory(out, OutputMode.DexIndexed);
     consumers[0].accept(new CodeInspector(out.resolve("classes.dex"), getProguardMap()));
     for (int i = 1; i < consumers.length; i++) {
-      consumers[i].accept(
-          new CodeInspector(out.resolve("classes" + (i + 1) + ".dex"), getProguardMap()));
+      Path dex = out.resolve("classes" + (i + 1) + ".dex");
+      CodeInspector inspector =
+          dex.toFile().exists() ? new CodeInspector(dex, getProguardMap()) : CodeInspector.empty();
+      consumers[i].accept(inspector);
     }
     return self();
   }
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index eb7df8c..b22d6d3 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -2117,7 +2117,7 @@
   public static class ProcessResult {
 
     public final int exitCode;
-    public final String stdout;
+    public String stdout;
     public final String stderr;
     public final String command;
 
@@ -2132,6 +2132,10 @@
       this(exitCode, stdout, stderr, null);
     }
 
+    public void setStdout(String stdout) {
+      this.stdout = stdout;
+    }
+
     @Override
     public String toString() {
       StringBuilder builder = new StringBuilder();
diff --git a/src/test/java/com/android/tools/r8/apimodel/ApiModelCovariantReturnTypeTest.java b/src/test/java/com/android/tools/r8/apimodel/ApiModelCovariantReturnTypeTest.java
new file mode 100644
index 0000000..0726238
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/apimodel/ApiModelCovariantReturnTypeTest.java
@@ -0,0 +1,66 @@
+// Copyright (c) 2022, 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.apimodel;
+
+import static com.android.tools.r8.apimodel.ApiModelingTestHelper.addTracedApiReferenceLevelCallBack;
+import static org.junit.Assert.assertNull;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.references.Reference;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import java.lang.reflect.Method;
+import java.util.concurrent.ConcurrentHashMap;
+import java.util.concurrent.ConcurrentHashMap.KeySetView;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class ApiModelCovariantReturnTypeTest extends TestBase {
+
+  private final TestParameters parameters;
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withAllRuntimesAndApiLevels().build();
+  }
+
+  public ApiModelCovariantReturnTypeTest(TestParameters parameters) {
+    this.parameters = parameters;
+  }
+
+  @Test
+  public void testR8() throws Exception {
+    Method main = Main.class.getDeclaredMethod("main", String[].class);
+    testForR8(parameters.getBackend())
+        .addProgramClasses(Main.class)
+        .setMinApi(parameters.getApiLevel())
+        .applyIf(
+            parameters.isDexRuntime() && parameters.getApiLevel().isLessThan(AndroidApiLevel.N),
+            b -> b.addDontWarn(KeySetView.class))
+        .addKeepMainRule(Main.class)
+        .apply(ApiModelingTestHelper::enableApiCallerIdentification)
+        .apply(
+            addTracedApiReferenceLevelCallBack(
+                (method, apiLevel) -> {
+                  if (Reference.methodFromMethod(main).equals(method)) {
+                    // TODO(b/232891189): Should be api level 28.
+                    assertNull(apiLevel);
+                  }
+                }))
+        .compile();
+  }
+
+  public static class Main {
+
+    public static void main(String[] args) {
+      ConcurrentHashMap<String, String> map = new ConcurrentHashMap<>();
+      KeySetView<String, String> strings = map.keySet();
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingWithStartupClassesTest.java b/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingWithStartupClassesTest.java
index ae8d0b6..e77e3d9 100644
--- a/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingWithStartupClassesTest.java
+++ b/src/test/java/com/android/tools/r8/classmerging/horizontal/HorizontalClassMergingWithStartupClassesTest.java
@@ -7,12 +7,13 @@
 import com.android.tools.r8.NeverInline;
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.experimental.startup.StartupClass;
 import com.android.tools.r8.experimental.startup.StartupConfiguration;
 import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.graph.DexType;
 import com.google.common.collect.ImmutableList;
 import java.util.Collections;
 import java.util.List;
-import java.util.stream.Collectors;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -47,11 +48,17 @@
               options
                   .getStartupOptions()
                   .setStartupConfiguration(
-                      new StartupConfiguration(
-                          startupClasses.stream()
-                              .map(clazz -> toDexType(clazz, dexItemFactory))
-                              .collect(Collectors.toList()),
-                          Collections.emptyList()));
+                      StartupConfiguration.builder()
+                          .apply(
+                              builder ->
+                                  startupClasses.forEach(
+                                      startupClass ->
+                                          builder.addStartupClass(
+                                              StartupClass.<DexType>builder()
+                                                  .setReference(
+                                                      toDexType(startupClass, dexItemFactory))
+                                                  .build())))
+                          .build());
             })
         .addHorizontallyMergedClassesInspector(
             inspector ->
diff --git a/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTestCollection.java b/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTestCollection.java
index 0dcd986..017c652 100644
--- a/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTestCollection.java
+++ b/src/test/java/com/android/tools/r8/compilerapi/CompilerApiTestCollection.java
@@ -8,6 +8,7 @@
 import static com.android.tools.r8.ToolHelper.isTestingR8Lib;
 
 import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.compilerapi.androidplatformbuild.AndroidPlatformBuildApiTest;
 import com.android.tools.r8.compilerapi.assertionconfiguration.AssertionConfigurationTest;
 import com.android.tools.r8.compilerapi.desugardependencies.DesugarDependenciesTest;
 import com.android.tools.r8.compilerapi.globalsynthetics.GlobalSyntheticsTest;
@@ -45,7 +46,8 @@
       ImmutableList.of(
           GlobalSyntheticsTest.ApiTest.class,
           CommandLineParserTest.ApiTest.class,
-          EnableMissingLibraryApiModelingTest.ApiTest.class);
+          EnableMissingLibraryApiModelingTest.ApiTest.class,
+          AndroidPlatformBuildApiTest.ApiTest.class);
 
   private final TemporaryFolder temp;
 
diff --git a/src/test/java/com/android/tools/r8/compilerapi/androidplatformbuild/AndroidPlatformBuildApiTest.java b/src/test/java/com/android/tools/r8/compilerapi/androidplatformbuild/AndroidPlatformBuildApiTest.java
new file mode 100644
index 0000000..07d01cc
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/compilerapi/androidplatformbuild/AndroidPlatformBuildApiTest.java
@@ -0,0 +1,94 @@
+// Copyright (c) 2022, 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.compilerapi.androidplatformbuild;
+
+import static com.android.tools.r8.MarkerMatcher.markerMinApi;
+import static org.hamcrest.MatcherAssert.assertThat;
+
+import com.android.tools.r8.D8;
+import com.android.tools.r8.D8Command;
+import com.android.tools.r8.DexIndexedConsumer;
+import com.android.tools.r8.ProgramConsumer;
+import com.android.tools.r8.R8;
+import com.android.tools.r8.R8Command;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.compilerapi.CompilerApiTest;
+import com.android.tools.r8.compilerapi.CompilerApiTestRunner;
+import com.android.tools.r8.origin.Origin;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.ThrowingConsumer;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import java.nio.file.Path;
+import org.hamcrest.CoreMatchers;
+import org.junit.Test;
+
+public class AndroidPlatformBuildApiTest extends CompilerApiTestRunner {
+
+  public AndroidPlatformBuildApiTest(TestParameters parameters) {
+    super(parameters);
+  }
+
+  @Override
+  public Class<? extends CompilerApiTest> binaryTestClass() {
+    return ApiTest.class;
+  }
+
+  @Test
+  public void testD8() throws Exception {
+    ApiTest test = new ApiTest(ApiTest.PARAMETERS);
+    runTest(test::runD8);
+  }
+
+  @Test
+  public void testR8() throws Exception {
+    ApiTest test = new ApiTest(ApiTest.PARAMETERS);
+    runTest(test::runR8);
+  }
+
+  private void runTest(ThrowingConsumer<ProgramConsumer, Exception> test) throws Exception {
+    Path output = temp.newFolder().toPath().resolve("out.jar");
+    test.accept(new DexIndexedConsumer.ArchiveConsumer(output));
+    assertThat(
+        new CodeInspector(output).getMarkers(),
+        CoreMatchers.everyItem(markerMinApi(AndroidApiLevel.ANDROID_PLATFORM)));
+  }
+
+  public static class ApiTest extends CompilerApiTest {
+
+    public ApiTest(Object parameters) {
+      super(parameters);
+    }
+
+    public void runD8(ProgramConsumer programConsumer) throws Exception {
+      D8.run(
+          D8Command.builder()
+              .addClassProgramData(getBytesForClass(getMockClass()), Origin.unknown())
+              .addLibraryFiles(getJava8RuntimeJar())
+              .setProgramConsumer(programConsumer)
+              .setAndroidPlatformBuild(true)
+              .build());
+    }
+
+    public void runR8(ProgramConsumer programConsumer) throws Exception {
+      R8.run(
+          R8Command.builder()
+              .addClassProgramData(getBytesForClass(getMockClass()), Origin.unknown())
+              .addProguardConfiguration(getKeepMainRules(getMockClass()), Origin.unknown())
+              .addLibraryFiles(getJava8RuntimeJar())
+              .setProgramConsumer(programConsumer)
+              .setAndroidPlatformBuild(true)
+              .build());
+    }
+
+    @Test
+    public void testD8() throws Exception {
+      runD8(DexIndexedConsumer.emptyConsumer());
+    }
+
+    @Test
+    public void testR8() throws Exception {
+      runR8(DexIndexedConsumer.emptyConsumer());
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/debuginfo/NoLineInfoTest.java b/src/test/java/com/android/tools/r8/debuginfo/NoLineInfoTest.java
index 6891000..08b55f8 100644
--- a/src/test/java/com/android/tools/r8/debuginfo/NoLineInfoTest.java
+++ b/src/test/java/com/android/tools/r8/debuginfo/NoLineInfoTest.java
@@ -4,15 +4,20 @@
 package com.android.tools.r8.debuginfo;
 
 import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertEquals;
 import static org.junit.Assume.assumeFalse;
 
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.graph.DexDebugInfo;
 import com.android.tools.r8.naming.retrace.StackTrace;
 import com.android.tools.r8.naming.retrace.StackTrace.StackTraceLine;
 import com.android.tools.r8.utils.BooleanUtils;
 import java.io.IOException;
+import java.util.Collections;
 import java.util.List;
+import java.util.Set;
+import java.util.stream.Collectors;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -91,6 +96,25 @@
             b -> b.getBuilder().setSourceFileProvider(environment -> CUSTOM_SOURCE_FILE))
         .run(parameters.getRuntime(), TestClass.class)
         .assertFailureWithErrorThatThrows(NullPointerException.class)
+        .inspectFailure(
+            i -> {
+              if (parameters.isDexRuntime()) {
+                Set<DexDebugInfo> debugInfos =
+                    i.allClasses().stream()
+                        .flatMap(c -> c.allMethods().stream())
+                        .map(m -> m.getMethod().getCode().asDexCode().getDebugInfo())
+                        .collect(Collectors.toSet());
+                if (isCompileWithPcAsLineNumberSupport() && !customSourceFile) {
+                  // If debug info is stripped all items are null pointers.
+                  assertEquals(Collections.singleton(null), debugInfos);
+                } else {
+                  // If debug info remains it is two canonical items and one null pointer.
+                  // The presence of 'null' debug info items is for methods with no actual lines at
+                  // all.
+                  assertEquals(3, debugInfos.size());
+                }
+              }
+            })
         .inspectOriginalStackTrace(
             stackTrace ->
                 assertThat(
diff --git a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/r8ondex/R8CompiledThroughDexTest.java b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/r8ondex/R8CompiledThroughDexTest.java
index a9aae3f..af9ac89 100644
--- a/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/r8ondex/R8CompiledThroughDexTest.java
+++ b/src/test/java/com/android/tools/r8/desugar/desugaredlibrary/r8ondex/R8CompiledThroughDexTest.java
@@ -217,6 +217,8 @@
     // Manually construct the R8 command as the test builder will change defaults compared
     // to the CLI invocation (eg, compressed and pg-map output).
     Builder builder = R8Command.builder().setOutput(outputThroughCf, OutputMode.DexIndexed);
+    // Set API model until default changes.
+    builder.setEnableExperimentalMissingLibraryApiModeling(true);
     getSharedBuilder().accept(builder);
     ToolHelper.runR8WithOptionsModificationOnly(
         builder.build(),
diff --git a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDex.java b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexTest.java
similarity index 83%
rename from src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDex.java
rename to src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexTest.java
index 8c5cdd0..b5ad377 100644
--- a/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDex.java
+++ b/src/test/java/com/android/tools/r8/desugar/nestaccesscontrol/NestAttributesInDexTest.java
@@ -4,6 +4,7 @@
 package com.android.tools.r8.desugar.nestaccesscontrol;
 
 import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.fail;
 import static org.junit.Assume.assumeTrue;
@@ -11,17 +12,19 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestRuntime.CfVm;
-import com.android.tools.r8.desugar.nestaccesscontrol.NestAttributesInDex.Host.Member1;
-import com.android.tools.r8.desugar.nestaccesscontrol.NestAttributesInDex.Host.Member2;
+import com.android.tools.r8.desugar.nestaccesscontrol.NestAttributesInDexTest.Host.Member1;
+import com.android.tools.r8.desugar.nestaccesscontrol.NestAttributesInDexTest.Host.Member2;
 import com.android.tools.r8.transformers.ClassFileTransformer;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.DescriptorUtils;
 import com.android.tools.r8.utils.StringUtils;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.TypeSubject;
 import com.google.common.collect.ImmutableList;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashSet;
 import java.util.List;
 import java.util.Set;
@@ -33,7 +36,7 @@
 import org.objectweb.asm.Opcodes;
 
 @RunWith(Parameterized.class)
-public class NestAttributesInDex extends TestBase {
+public class NestAttributesInDexTest extends TestBase {
 
   @Parameter() public TestParameters parameters;
 
@@ -62,15 +65,18 @@
         .assertSuccessWithOutput(EXPECTED_OUTPUT);
   }
 
-  private void inspect(CodeInspector inspector) {
+  private void inspect(CodeInspector inspector, boolean emitNestAnnotationsInDex) {
     ClassSubject host = inspector.clazz(Host.class);
     ClassSubject member1 = inspector.clazz(Member1.class);
     ClassSubject member2 = inspector.clazz(Member2.class);
     assertEquals(
-        ImmutableList.of(member1.asTypeSubject(), member2.asTypeSubject()),
+        emitNestAnnotationsInDex
+            ? ImmutableList.of(member1.asTypeSubject(), member2.asTypeSubject())
+            : Collections.emptyList(),
         host.getFinalNestMembersAttribute());
-    assertEquals(host.asTypeSubject(), member1.getFinalNestHostAttribute());
-    assertEquals(host.asTypeSubject(), member2.getFinalNestHostAttribute());
+    TypeSubject expectedNestHostAttribute = emitNestAnnotationsInDex ? host.asTypeSubject() : null;
+    assertEquals(expectedNestHostAttribute, member1.getFinalNestHostAttribute());
+    assertEquals(expectedNestHostAttribute, member2.getFinalNestHostAttribute());
     ClassSubject otherHost = inspector.clazz(OtherHost.class);
     assertNull(otherHost.getFinalNestHostAttribute());
     assertEquals(0, otherHost.getFinalNestMembersAttribute().size());
@@ -83,17 +89,29 @@
         .addProgramClassFileData(getTransformedClasses())
         .addProgramClasses(OtherHost.class)
         .setMinApi(parameters.getApiLevel())
-        .addOptionsModification(
-            options -> {
-              options.emitNestAnnotationsInDex = true;
-            })
+        .addOptionsModification(options -> options.emitNestAnnotationsInDex = true)
         .compile()
-        .inspect(this::inspect)
+        .inspect(inspector -> inspect(inspector, true))
         .run(parameters.getRuntime(), TestClass.class)
         // No Art versions have support for nest attributes yet.
         .assertFailureWithErrorThatThrows(NoSuchMethodError.class);
   }
 
+  @Test
+  public void testD8NoDesugar() throws Exception {
+    assumeTrue(parameters.isDexRuntime());
+    testForD8(parameters.getBackend())
+        .addProgramClassFileData(getTransformedClasses())
+        .addProgramClasses(OtherHost.class)
+        .disableDesugaring()
+        .setMinApi(parameters.getApiLevel())
+        .addOptionsModification(options -> assertFalse(options.emitNestAnnotationsInDex))
+        .compile()
+        .inspect(inspector -> inspect(inspector, false))
+        .run(parameters.getRuntime(), TestClass.class)
+        .assertFailureWithErrorThatThrows(NoSuchMethodError.class);
+  }
+
   public Collection<byte[]> getTransformedClasses() throws Exception {
     ClassFileTransformer transformer =
         transformer(TestClass.class)
diff --git a/src/test/java/com/android/tools/r8/desugaring/interfacemethods/InvokeSuperInDefaultMethodResolvingToLibraryTest.java b/src/test/java/com/android/tools/r8/desugaring/interfacemethods/InvokeSuperInDefaultMethodResolvingToLibraryTest.java
new file mode 100644
index 0000000..6e19e01
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/desugaring/interfacemethods/InvokeSuperInDefaultMethodResolvingToLibraryTest.java
@@ -0,0 +1,183 @@
+// Copyright (c) 2022, 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.desugaring.interfacemethods;
+
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assume.assumeTrue;
+
+import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.testing.AndroidBuildVersion;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.android.tools.r8.utils.codeinspector.InstructionSubject;
+import java.util.function.Function;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class InvokeSuperInDefaultMethodResolvingToLibraryTest extends TestBase {
+
+  @Parameter() public TestParameters parameters;
+
+  @Parameters(name = "{0}")
+  public static TestParametersCollection data() {
+    return getTestParameters().withAllRuntimes().withAllApiLevelsAlsoForCf().build();
+  }
+
+  private static final String EXPECTED_OUTPUT = StringUtils.lines("8");
+
+  private void inspect(CodeInspector inspector) {
+    assertTrue(
+        inspector
+            .clazz(B.class)
+            .uniqueMethodWithName("compose")
+            .streamInstructions()
+            .filter(InstructionSubject::isInvoke)
+            .map(invoke -> invoke.getMethod().getHolderType().toString())
+            .noneMatch(name -> name.endsWith("$-CC")));
+  }
+
+  @Test
+  public void testDesugaring() throws Exception {
+    testForD8(parameters.getBackend())
+        .addInnerClasses(getClass())
+        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.T))
+        .setMinApi(parameters.getApiLevel())
+        .compile()
+        .inspect(this::inspect)
+        .run(parameters.getRuntime(), TestClass.class)
+        .applyIf(
+            parameters.isDexRuntime()
+                && parameters
+                    .getRuntime()
+                    .asDex()
+                    .maxSupportedApiLevel()
+                    .isLessThan(AndroidApiLevel.N),
+            r -> r.assertFailureWithErrorThatThrows(NoClassDefFoundError.class),
+            r -> r.assertSuccessWithOutput(EXPECTED_OUTPUT));
+  }
+
+  @Test
+  public void testDesugaringWithApiLevelCheck() throws Exception {
+    assumeTrue(parameters.isDexRuntime());
+    testForD8(parameters.getBackend())
+        .addInnerClasses(getClass())
+        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.T))
+        .addAndroidBuildVersion(parameters.getRuntime().asDex().maxSupportedApiLevel())
+        .setMinApi(parameters.getApiLevel())
+        .compile()
+        .inspect(this::inspect)
+        .run(parameters.getRuntime(), TestClassWithApiLevelCheck.class)
+        .applyIf(
+            parameters.isDexRuntime()
+                && parameters
+                    .getRuntime()
+                    .asDex()
+                    .maxSupportedApiLevel()
+                    .isLessThan(AndroidApiLevel.N),
+            r -> r.assertSuccessWithOutputLines("No call"),
+            r -> r.assertSuccessWithOutput(EXPECTED_OUTPUT));
+  }
+
+  @Test
+  public void testR8() throws Exception {
+    try {
+      testForR8(parameters.getBackend())
+          .addInnerClasses(getClass())
+          .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.T))
+          .setMinApi(parameters.getApiLevel())
+          .addKeepMainRule(TestClass.class)
+          .compile()
+          // .inspect(this::inspect)
+          .run(parameters.getRuntime(), TestClass.class)
+          .applyIf(
+              parameters.isDexRuntime()
+                  && parameters
+                      .getRuntime()
+                      .asDex()
+                      .maxSupportedApiLevel()
+                      .isLessThan(AndroidApiLevel.N),
+              r -> r.assertFailureWithErrorThatThrows(NoClassDefFoundError.class),
+              r -> r.assertSuccessWithOutput(EXPECTED_OUTPUT));
+    } catch (CompilationFailedException e) {
+      // TODO(b/235184674): Fix this.
+      assertTrue(parameters.isCfRuntime());
+    }
+  }
+
+  // TODO(b/235184674): Fix this.
+  @Test(expected = CompilationFailedException.class)
+  public void testR8WithApiLevelCheck() throws Exception {
+    testForR8(parameters.getBackend())
+        .addInnerClasses(getClass())
+        .addLibraryFiles(ToolHelper.getAndroidJar(AndroidApiLevel.T))
+        .setMinApi(parameters.getApiLevel())
+        .addKeepMainRule(TestClassWithApiLevelCheck.class)
+        .compile()
+        .inspect(this::inspect)
+        .run(parameters.getRuntime(), TestClassWithApiLevelCheck.class)
+        .applyIf(
+            parameters.isDexRuntime()
+                && parameters
+                    .getRuntime()
+                    .asDex()
+                    .maxSupportedApiLevel()
+                    .isLessThan(AndroidApiLevel.N),
+            r -> r.assertFailureWithErrorThatThrows(NoClassDefFoundError.class),
+            r -> r.assertSuccessWithOutput(EXPECTED_OUTPUT));
+  }
+
+  static class TestClass {
+
+    private static void m(C c) {
+      System.out.println(c.compose(c).apply(2));
+    }
+
+    public static void main(String[] args) {
+      m(new C());
+    }
+  }
+
+  static class TestClassWithApiLevelCheck {
+
+    private static void m(C c) {
+      System.out.println(c.compose(c).apply(2));
+    }
+
+    public static void main(String[] args) {
+      if (AndroidBuildVersion.VERSION >= 24) {
+        m(new C());
+      } else {
+        System.out.println("No call");
+      }
+    }
+  }
+
+  interface MyFunction<V, R> extends Function<V, R> {}
+
+  abstract static class B<V, R> implements MyFunction<V, R> {
+
+    @Override
+    public <V1> Function<V1, R> compose(Function<? super V1, ? extends V> before) {
+      return MyFunction.super.compose(before);
+    }
+  }
+
+  static class C extends B<Integer, Integer> {
+
+    @Override
+    public Integer apply(Integer integer) {
+      return integer * 2;
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterFieldTypeStrengtheningTest.java b/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterFieldTypeStrengtheningTest.java
index 45a3be4..71e7df5 100644
--- a/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterFieldTypeStrengtheningTest.java
+++ b/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterFieldTypeStrengtheningTest.java
@@ -47,28 +47,6 @@
   }
 
   @Test
-  public void testPropagationFromFeature() throws Exception {
-    ThrowingConsumer<R8TestCompileResult, Exception> ensureGetFromFeatureGone =
-        r8TestCompileResult -> {
-          // Ensure that getFromFeature from FeatureClass is inlined into the run method.
-          ClassSubject clazz = r8TestCompileResult.inspector().clazz(FeatureClass.class);
-          assertThat(clazz.uniqueMethodWithName("getFromFeature"), not(isPresent()));
-        };
-    ProcessResult processResult =
-        testDexSplitter(
-            parameters,
-            ImmutableSet.of(BaseSuperClass.class),
-            ImmutableSet.of(FeatureClass.class),
-            FeatureClass.class,
-            EXPECTED,
-            ensureGetFromFeatureGone,
-            TestShrinkerBuilder::noMinification);
-    // We expect art to fail on this with the dex splitter, see b/122902374
-    assertNotEquals(processResult.exitCode, 0);
-    assertTrue(processResult.stderr.contains("NoClassDefFoundError"));
-  }
-
-  @Test
   public void testOnR8Splitter() throws IOException, CompilationFailedException {
     assumeTrue(parameters.isDexRuntime());
     ProcessResult processResult =
diff --git a/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterInlineRegression.java b/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterInlineRegression.java
index 96220f8..53af2b6 100644
--- a/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterInlineRegression.java
+++ b/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterInlineRegression.java
@@ -48,31 +48,6 @@
   }
 
   @Test
-  public void testInliningFromFeature() throws Exception {
-    ThrowingConsumer<R8TestCompileResult, Exception> ensureGetFromFeatureGone =
-        r8TestCompileResult -> {
-          // Ensure that getFromFeature from FeatureClass is inlined into the run method.
-          ClassSubject clazz = r8TestCompileResult.inspector().clazz(FeatureClass.class);
-          assertThat(clazz.uniqueMethodWithName("getFromFeature"), not(isPresent()));
-        };
-    Consumer<R8FullTestBuilder> configurator =
-        r8FullTestBuilder ->
-            r8FullTestBuilder.enableNoVerticalClassMergingAnnotations().noMinification();
-    ProcessResult processResult =
-        testDexSplitter(
-            parameters,
-            ImmutableSet.of(BaseSuperClass.class),
-            ImmutableSet.of(FeatureClass.class),
-            FeatureClass.class,
-            EXPECTED,
-            ensureGetFromFeatureGone,
-            configurator);
-    // We expect art to fail on this with the dex splitter, see b/122902374
-    assertNotEquals(processResult.exitCode, 0);
-    assertTrue(processResult.stderr.contains("NoClassDefFoundError"));
-  }
-
-  @Test
   public void testOnR8Splitter() throws IOException, CompilationFailedException {
     assumeTrue(parameters.isDexRuntime());
     ThrowableConsumer<R8FullTestBuilder> configurator =
diff --git a/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterMemberValuePropagationRegression.java b/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterMemberValuePropagationRegression.java
index 38d19da..a2e1b1d 100644
--- a/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterMemberValuePropagationRegression.java
+++ b/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterMemberValuePropagationRegression.java
@@ -46,28 +46,6 @@
   }
 
   @Test
-  public void testPropagationFromFeature() throws Exception {
-    ThrowingConsumer<R8TestCompileResult, Exception> ensureGetFromFeatureGone =
-        r8TestCompileResult -> {
-          // Ensure that getFromFeature from FeatureClass is inlined into the run method.
-          ClassSubject clazz = r8TestCompileResult.inspector().clazz(FeatureClass.class);
-          assertThat(clazz.uniqueMethodWithName("getFromFeature"), not(isPresent()));
-        };
-    ProcessResult processResult =
-        testDexSplitter(
-            parameters,
-            ImmutableSet.of(BaseSuperClass.class),
-            ImmutableSet.of(FeatureClass.class, FeatureEnum.class),
-            FeatureClass.class,
-            EXPECTED,
-            ensureGetFromFeatureGone,
-            builder -> builder.enableInliningAnnotations().noMinification());
-    // We expect art to fail on this with the dex splitter, see b/122902374
-    assertNotEquals(processResult.exitCode, 0);
-    assertTrue(processResult.stderr.contains("NoClassDefFoundError"));
-  }
-
-  @Test
   public void testOnR8Splitter() throws IOException, CompilationFailedException {
     assumeTrue(parameters.isDexRuntime());
     ProcessResult processResult =
diff --git a/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterMergeRegression.java b/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterMergeRegression.java
index 71ddab8..a7d137f 100644
--- a/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterMergeRegression.java
+++ b/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterMergeRegression.java
@@ -48,43 +48,6 @@
   }
 
   @Test
-  public void testInliningFromFeature() throws Exception {
-    // Static merging is based on sorting order, we assert that we merged to the feature.
-    ThrowingConsumer<R8TestCompileResult, Exception> ensureMergingToFeature =
-        r8TestCompileResult -> {
-          ClassSubject clazz = r8TestCompileResult.inspector().clazz(AFeatureWithStatic.class);
-          assertEquals(2, clazz.allMethods().size());
-          assertThat(clazz.uniqueMethodWithName("getBase42"), isPresent());
-          assertThat(clazz.uniqueMethodWithName("getFoobar"), isPresent());
-        };
-    Consumer<R8FullTestBuilder> configurator =
-        r8FullTestBuilder ->
-            r8FullTestBuilder
-                .addOptionsModification(
-                    options ->
-                        options.testing.horizontalClassMergingTarget =
-                            (appView, candidates, target) -> candidates.iterator().next())
-                .addHorizontallyMergedClassesInspector(
-                    inspector ->
-                        inspector.assertMergedInto(BaseWithStatic.class, AFeatureWithStatic.class))
-                .enableNoVerticalClassMergingAnnotations()
-                .enableInliningAnnotations()
-                .noMinification();
-    ProcessResult processResult =
-        testDexSplitter(
-            parameters,
-            ImmutableSet.of(BaseClass.class, BaseWithStatic.class),
-            ImmutableSet.of(FeatureClass.class, AFeatureWithStatic.class),
-            FeatureClass.class,
-            EXPECTED,
-            ensureMergingToFeature,
-            configurator);
-    // We expect art to fail on this with the dex splitter.
-    assertNotEquals(processResult.exitCode, 0);
-    assertTrue(processResult.stderr.contains("NoClassDefFoundError"));
-  }
-
-  @Test
   public void testOnR8Splitter() throws IOException, CompilationFailedException {
     assumeTrue(parameters.isDexRuntime());
     ThrowableConsumer<R8FullTestBuilder> configurator =
diff --git a/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterTests.java b/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterTests.java
deleted file mode 100644
index e90e0ab..0000000
--- a/src/test/java/com/android/tools/r8/dexsplitter/DexSplitterTests.java
+++ /dev/null
@@ -1,484 +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.dexsplitter;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertFalse;
-import static org.junit.Assert.assertTrue;
-
-import com.android.tools.r8.CompilationFailedException;
-import com.android.tools.r8.D8Command;
-import com.android.tools.r8.DexSplitterHelper;
-import com.android.tools.r8.ExtractMarker;
-import com.android.tools.r8.OutputMode;
-import com.android.tools.r8.R8;
-import com.android.tools.r8.R8Command;
-import com.android.tools.r8.ResourceException;
-import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.ToolHelper.ArtCommandBuilder;
-import com.android.tools.r8.dex.Marker;
-import com.android.tools.r8.dexsplitter.DexSplitter.Options;
-import com.android.tools.r8.origin.Origin;
-import com.android.tools.r8.utils.FeatureClassMapping.FeatureMappingException;
-import com.android.tools.r8.utils.StringUtils;
-import com.android.tools.r8.utils.codeinspector.ClassSubject;
-import com.android.tools.r8.utils.codeinspector.CodeInspector;
-import com.google.common.collect.ImmutableList;
-import com.google.common.collect.Lists;
-import java.io.FileNotFoundException;
-import java.io.IOException;
-import java.io.PrintWriter;
-import java.io.UnsupportedEncodingException;
-import java.nio.file.Files;
-import java.nio.file.Path;
-import java.nio.file.Paths;
-import java.util.Arrays;
-import java.util.Collection;
-import java.util.List;
-import java.util.concurrent.ExecutionException;
-import java.util.zip.ZipEntry;
-import java.util.zip.ZipOutputStream;
-import org.junit.Rule;
-import org.junit.Test;
-import org.junit.rules.TemporaryFolder;
-
-public class DexSplitterTests {
-
-  private static final String CLASS_DIR =
-      ToolHelper.EXAMPLES_ANDROID_N_BUILD_DIR + "classes/dexsplitsample";
-  private static final String CLASS1_CLASS = CLASS_DIR + "/Class1.class";
-  private static final String CLASS2_CLASS = CLASS_DIR + "/Class2.class";
-  private static final String CLASS3_CLASS = CLASS_DIR + "/Class3.class";
-  private static final String CLASS3_INNER_CLASS = CLASS_DIR + "/Class3$InnerClass.class";
-  private static final String CLASS3_SYNTHETIC_CLASS = CLASS_DIR + "/Class3$1.class";
-  private static final String CLASS4_CLASS = CLASS_DIR + "/Class4.class";
-  private static final String CLASS4_LAMBDA_INTERFACE = CLASS_DIR + "/Class4$LambdaInterface.class";
-  private static final String TEXT_FILE =
-      ToolHelper.EXAMPLES_ANDROID_N_DIR + "dexsplitsample/TextFile.txt";
-
-
-  @Rule public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
-
-  private Path createInput(boolean dontCreateMarkerInD8)
-      throws IOException, CompilationFailedException {
-    // Initial normal compile to create dex files.
-    Path inputZip = temp.newFolder().toPath().resolve("input.zip");
-    D8Command command =
-        D8Command.builder()
-            .setOutput(inputZip, OutputMode.DexIndexed)
-            .addProgramFiles(Paths.get(CLASS1_CLASS))
-            .addProgramFiles(Paths.get(CLASS2_CLASS))
-            .addProgramFiles(Paths.get(CLASS3_CLASS))
-            .addProgramFiles(Paths.get(CLASS3_INNER_CLASS))
-            .addProgramFiles(Paths.get(CLASS3_SYNTHETIC_CLASS))
-            .addProgramFiles(Paths.get(CLASS4_CLASS))
-            .addProgramFiles(Paths.get(CLASS4_LAMBDA_INTERFACE))
-            .build();
-
-    DexSplitterHelper.runD8ForTesting(command, dontCreateMarkerInD8);
-
-    return inputZip;
-  }
-
-  private void testMarker(boolean addMarkerToInput)
-      throws CompilationFailedException, IOException, ResourceException, ExecutionException {
-    Path inputZip = createInput(!addMarkerToInput);
-
-    Path output = temp.newFolder().toPath().resolve("output");
-    Files.createDirectory(output);
-    Path splitSpec = createSplitSpec();
-
-    DexSplitter.main(
-        new String[] {
-          "--input", inputZip.toString(),
-          "--output", output.toString(),
-          "--feature-splits", splitSpec.toString()
-        });
-
-    Path base = output.resolve("base").resolve("classes.dex");
-    Path feature = output.resolve("feature1").resolve("classes.dex");
-
-    for (Path path : new Path[] {inputZip, base, feature}) {
-      Collection<Marker> markers = ExtractMarker.extractMarkerFromDexFile(path);
-      assertEquals(addMarkerToInput ? 1 : 0, markers.size());
-    }
-  }
-
-  @Test
-  public void testMarkerPreserved()
-      throws CompilationFailedException, IOException, ResourceException, ExecutionException {
-    testMarker(true);
-  }
-
-  @Test
-  public void testMarkerNotAdded()
-      throws CompilationFailedException, IOException, ResourceException, ExecutionException {
-    testMarker(false);
-  }
-
-  /**
-   * To test the file splitting we have 3 classes that we distribute like this: Class1 -> base
-   * Class2 -> feature1 Class3 -> feature1
-   *
-   * <p>Class1 and Class2 works independently of each other, but Class3 extends Class1, and
-   * therefore can't run without the base being loaded.
-   */
-  @Test
-  public void splitFilesNoObfuscation()
-      throws CompilationFailedException, IOException, FeatureMappingException {
-    noObfuscation(false);
-    noObfuscation(true);
-  }
-
-  private void noObfuscation(boolean useOptions)
-      throws IOException, CompilationFailedException, FeatureMappingException {
-    Path inputZip = createInput(false);
-    Path output = temp.newFolder().toPath().resolve("output");
-    Files.createDirectory(output);
-    Path splitSpec = createSplitSpec();
-
-    if (useOptions) {
-      Options options = new Options();
-      options.addInputArchive(inputZip.toString());
-      options.setFeatureSplitMapping(splitSpec.toString());
-      options.setOutput(output.toString());
-      DexSplitter.run(options);
-    } else {
-      DexSplitter.main(
-          new String[] {
-              "--input", inputZip.toString(),
-              "--output", output.toString(),
-              "--feature-splits", splitSpec.toString()
-          });
-    }
-
-    Path base = output.resolve("base").resolve("classes.dex");
-    Path feature = output.resolve("feature1").resolve("classes.dex");
-    validateUnobfuscatedOutput(base, feature);
-  }
-
-  private void validateUnobfuscatedOutput(Path base, Path feature) throws IOException {
-    // Both classes should still work if we give all dex files to the system.
-    for (String className : new String[] {"Class1", "Class2", "Class3"}) {
-      ArtCommandBuilder builder = new ArtCommandBuilder();
-      builder.appendClasspath(base.toString());
-      builder.appendClasspath(feature.toString());
-      builder.setMainClass("dexsplitsample." + className);
-      String out = ToolHelper.runArt(builder);
-      assertEquals(out, className + "\n");
-    }
-    // Individual classes should also work from the individual files.
-    String className = "Class1";
-    ArtCommandBuilder builder = new ArtCommandBuilder();
-    builder.appendClasspath(base.toString());
-    builder.setMainClass("dexsplitsample." + className);
-    String out = ToolHelper.runArt(builder);
-    assertEquals(out, className + "\n");
-
-    className = "Class2";
-    builder = new ArtCommandBuilder();
-    builder.appendClasspath(feature.toString());
-    builder.setMainClass("dexsplitsample." + className);
-    out = ToolHelper.runArt(builder);
-    assertEquals(out, className + "\n");
-
-    className = "Class3";
-    builder = new ArtCommandBuilder();
-    builder.appendClasspath(feature.toString());
-    builder.setMainClass("dexsplitsample." + className);
-    try {
-      ToolHelper.runArt(builder);
-      assertFalse(true);
-    } catch (AssertionError assertionError) {
-      // We expect this to throw since base is not in the path and Class3 depends on Class1
-    }
-
-    className = "Class4";
-    builder = new ArtCommandBuilder();
-    builder.appendClasspath(feature.toString());
-    builder.setMainClass("dexsplitsample." + className);
-    try {
-      ToolHelper.runArt(builder);
-      assertFalse(true);
-    } catch (AssertionError assertionError) {
-      // We expect this to throw since base is not in the path and Class4 includes a lambda that
-      // would have been pushed to base.
-    }
-  }
-
-  private Path createSplitSpec() throws FileNotFoundException, UnsupportedEncodingException {
-    Path splitSpec = temp.getRoot().toPath().resolve("split_spec");
-    try (PrintWriter out = new PrintWriter(splitSpec.toFile(), "UTF-8")) {
-      out.write(
-          "dexsplitsample.Class1:base\n"
-              + "dexsplitsample.Class2:feature1\n"
-              + "dexsplitsample.Class3:feature1\n"
-              + "dexsplitsample.Class4:feature1");
-    }
-    return splitSpec;
-  }
-
-  private List<String> getProguardConf() {
-    return ImmutableList.of(
-        "-keep class dexsplitsample.Class3 {",
-        "  public static void main(java.lang.String[]);",
-        "}");
-  }
-
-  @Test
-  public void splitFilesFromJar()
-      throws IOException, CompilationFailedException, FeatureMappingException {
-    for (boolean useOptions : new boolean[]{false, true}) {
-      for (boolean explicitBase: new boolean[]{false, true}) {
-        for (boolean renameBase: new boolean[]{false, true}) {
-          splitFromJars(useOptions, explicitBase, renameBase);
-        }
-      }
-    }
-  }
-
-  private void splitFromJars(boolean useOptions, boolean explicitBase, boolean renameBase)
-      throws IOException, CompilationFailedException, FeatureMappingException {
-    Path inputZip = createInput(false);
-    Path output = temp.newFolder().toPath().resolve("output");
-    Files.createDirectory(output);
-    Path baseJar = temp.getRoot().toPath().resolve("base.jar");
-    Path featureJar = temp.getRoot().toPath().resolve("feature1.jar");
-    ZipOutputStream baseStream = new ZipOutputStream(Files.newOutputStream(baseJar));
-    String name = "dexsplitsample/Class1.class";
-    baseStream.putNextEntry(new ZipEntry(name));
-    baseStream.write(Files.readAllBytes(Paths.get(CLASS1_CLASS)));
-    baseStream.closeEntry();
-    baseStream.close();
-
-    ZipOutputStream featureStream = new ZipOutputStream(Files.newOutputStream(featureJar));
-    name = "dexsplitsample/Class2.class";
-    featureStream.putNextEntry(new ZipEntry(name));
-    featureStream.write(Files.readAllBytes(Paths.get(CLASS2_CLASS)));
-    featureStream.closeEntry();
-    name = "dexsplitsample/Class3.class";
-    featureStream.putNextEntry(new ZipEntry(name));
-    featureStream.write(Files.readAllBytes(Paths.get(CLASS3_CLASS)));
-    featureStream.closeEntry();
-    name = "dexsplitsample/Class3$InnerClass.class";
-    featureStream.putNextEntry(new ZipEntry(name));
-    featureStream.write(Files.readAllBytes(Paths.get(CLASS3_INNER_CLASS)));
-    featureStream.closeEntry();
-    name = "dexsplitsample/Class3$1.class";
-    featureStream.putNextEntry(new ZipEntry(name));
-    featureStream.write(Files.readAllBytes(Paths.get(CLASS3_SYNTHETIC_CLASS)));
-    featureStream.closeEntry();
-    name = "dexsplitsample/Class4";
-    featureStream.putNextEntry(new ZipEntry(name));
-    featureStream.write(Files.readAllBytes(Paths.get(CLASS4_CLASS)));
-    featureStream.closeEntry();
-    name = "dexsplitsample/Class4$LambdaInterface";
-    featureStream.putNextEntry(new ZipEntry(name));
-    featureStream.write(Files.readAllBytes(Paths.get(CLASS4_LAMBDA_INTERFACE)));
-    featureStream.closeEntry();
-    featureStream.close();
-    // Make sure that we can pass in a name for the output.
-    String specificOutputName = "renamed";
-    if (useOptions) {
-      Options options = new Options();
-      options.addInputArchive(inputZip.toString());
-      options.setOutput(output.toString());
-      if (explicitBase) {
-        options.addBaseJar(baseJar.toString());
-      } else if (renameBase){
-        // Ensure that we can rename base (if people called a feature base)
-        options.setBaseOutputName("base_renamed");
-      }
-      options.addFeatureJar(featureJar.toString(), specificOutputName);
-      DexSplitter.run(options);
-    } else {
-      List<String> args = Lists.newArrayList(
-          "--input",
-          inputZip.toString(),
-          "--output",
-          output.toString(),
-          "--feature-jar",
-          featureJar.toString().concat(":").concat(specificOutputName));
-      if (explicitBase) {
-        args.add("--base-jar");
-        args.add(baseJar.toString());
-      } else if (renameBase) {
-        args.add("--base-output-name");
-        args.add("base_renamed");
-      }
-
-      DexSplitter.main(args.toArray(StringUtils.EMPTY_ARRAY));
-    }
-    String baseOutputName = explicitBase || !renameBase ? "base" : "base_renamed";
-    Path base = output.resolve(baseOutputName).resolve("classes.dex");
-    Path feature = output.resolve(specificOutputName).resolve("classes.dex");;
-    validateUnobfuscatedOutput(base, feature);
-  }
-
-  @Test
-  public void splitFilesObfuscation()
-      throws CompilationFailedException, IOException, ExecutionException {
-    // Initial normal compile to create dex files.
-    Path inputDex = temp.newFolder().toPath().resolve("input.zip");
-    Path proguardMap = temp.getRoot().toPath().resolve("proguard.map");
-
-    R8.run(
-        R8Command.builder()
-            .setOutput(inputDex, OutputMode.DexIndexed)
-            .addProgramFiles(Paths.get(CLASS1_CLASS))
-            .addProgramFiles(Paths.get(CLASS2_CLASS))
-            .addProgramFiles(Paths.get(CLASS3_CLASS))
-            .addProgramFiles(Paths.get(CLASS3_INNER_CLASS))
-            .addProgramFiles(Paths.get(CLASS3_SYNTHETIC_CLASS))
-            .addProgramFiles(Paths.get(CLASS4_CLASS))
-            .addProgramFiles(Paths.get(CLASS4_LAMBDA_INTERFACE))
-            .addLibraryFiles(ToolHelper.getDefaultAndroidJar())
-            .setProguardMapOutputPath(proguardMap)
-            .addProguardConfiguration(getProguardConf(), Origin.unknown())
-            .build());
-
-    Path outputDex = temp.newFolder().toPath().resolve("output");
-    Files.createDirectory(outputDex);
-    Path splitSpec = createSplitSpec();
-
-    DexSplitter.main(
-        new String[] {
-          "--input", inputDex.toString(),
-          "--output", outputDex.toString(),
-          "--feature-splits", splitSpec.toString(),
-          "--proguard-map", proguardMap.toString()
-        });
-
-    Path base = outputDex.resolve("base").resolve("classes.dex");
-    Path feature = outputDex.resolve("feature1").resolve("classes.dex");
-    String class3 = "dexsplitsample.Class3";
-    // We should still be able to run the Class3 which we kept, it has a call to the obfuscated
-    // class1 which is in base.
-    ArtCommandBuilder builder = new ArtCommandBuilder();
-    builder.appendClasspath(base.toString());
-    builder.appendClasspath(feature.toString());
-    builder.setMainClass(class3);
-    String out = ToolHelper.runArt(builder);
-    assertEquals(out, "Class3\n");
-
-    // Class1 should not be in the feature, it should still be in base.
-    builder = new ArtCommandBuilder();
-    builder.appendClasspath(feature.toString());
-    builder.setMainClass(class3);
-    try {
-      ToolHelper.runArt(builder);
-      assertFalse(true);
-    } catch (AssertionError assertionError) {
-      // We expect this to throw since base is not in the path and Class3 depends on Class1.
-    }
-
-    // Ensure that the Class1 is actually in the correct split. Note that Class2 would have been
-    // shaken away.
-    CodeInspector inspector = new CodeInspector(base, proguardMap);
-    ClassSubject subject = inspector.clazz("dexsplitsample.Class1");
-    assertTrue(subject.isPresent());
-    assertTrue(subject.isRenamed());
-  }
-
-  @Test
-  public void splitNonClassFiles()
-      throws CompilationFailedException, IOException, FeatureMappingException {
-    Path inputZip = temp.getRoot().toPath().resolve("input-zip-with-non-class-files.jar");
-    ZipOutputStream inputZipStream = new ZipOutputStream(Files.newOutputStream(inputZip));
-    String name = "dexsplitsample/TextFile.txt";
-    inputZipStream.putNextEntry(new ZipEntry(name));
-    byte[] fileBytes = Files.readAllBytes(Paths.get(TEXT_FILE));
-    inputZipStream.write(fileBytes);
-    inputZipStream.closeEntry();
-    name = "dexsplitsample/TextFile2.txt";
-    inputZipStream.putNextEntry(new ZipEntry(name));
-    inputZipStream.write(fileBytes);
-    inputZipStream.write(fileBytes);
-    inputZipStream.closeEntry();
-    inputZipStream.close();
-    Path output = temp.newFolder().toPath().resolve("output");
-    Files.createDirectory(output);
-    Path baseJar = temp.getRoot().toPath().resolve("base.jar");
-    Path featureJar = temp.getRoot().toPath().resolve("feature1.jar");
-    ZipOutputStream baseStream = new ZipOutputStream(Files.newOutputStream(baseJar));
-    name = "dexsplitsample/TextFile.txt";
-    baseStream.putNextEntry(new ZipEntry(name));
-    baseStream.write(fileBytes);
-    baseStream.closeEntry();
-    baseStream.close();
-    ZipOutputStream featureStream = new ZipOutputStream(Files.newOutputStream(featureJar));
-    name = "dexsplitsample/TextFile2.txt";
-    featureStream.putNextEntry(new ZipEntry(name));
-    featureStream.write(fileBytes);
-    featureStream.write(fileBytes);
-    featureStream.closeEntry();
-    featureStream.close();
-    Options options = new Options();
-    options.addInputArchive(inputZip.toString());
-    options.setOutput(output.toString());
-    options.addFeatureJar(baseJar.toString());
-    options.addFeatureJar(featureJar.toString());
-    options.setSplitNonClassResources(true);
-    DexSplitter.run(options);
-    Path baseDir = output.resolve("base");
-    Path featureDir = output.resolve("feature1");
-    byte[] contents = fileBytes;
-    byte[] contents2 = new byte[contents.length * 2];
-    System.arraycopy(contents, 0, contents2, 0, contents.length);
-    System.arraycopy(contents, 0, contents2, contents.length, contents.length);
-    Path baseTextFile = baseDir.resolve("dexsplitsample/TextFile.txt");
-    Path featureTextFile = featureDir.resolve("dexsplitsample/TextFile2.txt");
-    assert Files.exists(baseTextFile);
-    assert Files.exists(featureTextFile);
-    assert Arrays.equals(Files.readAllBytes(baseTextFile), contents);
-    assert Arrays.equals(Files.readAllBytes(featureTextFile), contents2);
-  }
-
-  @Test
-  public void splitDuplicateNonClassFiles()
-      throws IOException, CompilationFailedException, FeatureMappingException {
-    Path inputZip = temp.getRoot().toPath().resolve("input-zip-with-non-class-files.jar");
-    ZipOutputStream inputZipStream = new ZipOutputStream(Files.newOutputStream(inputZip));
-    String name = "dexsplitsample/TextFile.txt";
-    inputZipStream.putNextEntry(new ZipEntry(name));
-    byte[] fileBytes = Files.readAllBytes(Paths.get(TEXT_FILE));
-    inputZipStream.write(fileBytes);
-    inputZipStream.closeEntry();
-    inputZipStream.close();
-    Path output = temp.newFolder().toPath().resolve("output");
-    Files.createDirectory(output);
-    Path featureJar = temp.getRoot().toPath().resolve("feature1.jar");
-    Path feature2Jar = temp.getRoot().toPath().resolve("feature2.jar");
-    ZipOutputStream featureStream = new ZipOutputStream(Files.newOutputStream(featureJar));
-    name = "dexsplitsample/TextFile.txt";
-    featureStream.putNextEntry(new ZipEntry(name));
-    featureStream.write(fileBytes);
-    featureStream.closeEntry();
-    featureStream.close();
-    ZipOutputStream feature2Stream = new ZipOutputStream(Files.newOutputStream(feature2Jar));
-    name = "dexsplitsample/TextFile.txt";
-    feature2Stream.putNextEntry(new ZipEntry(name));
-    feature2Stream.write(fileBytes);
-    feature2Stream.closeEntry();
-    feature2Stream.close();
-    Options options = new Options();
-    options.addInputArchive(inputZip.toString());
-    options.setOutput(output.toString());
-    options.addFeatureJar(feature2Jar.toString());
-    options.addFeatureJar(featureJar.toString());
-    options.setSplitNonClassResources(true);
-    DexSplitter.run(options);
-    Path baseDir = output.resolve("base");
-    Path feature1Dir = output.resolve("feature1");
-    Path feature2Dir = output.resolve("feature2");
-    Path baseTextFile = baseDir.resolve("dexsplitsample/TextFile.txt");
-    Path feature1TextFile = feature1Dir.resolve("dexsplitsample/TextFile2.txt");
-    Path feature2TextFile = feature2Dir.resolve("dexsplitsample/TextFile2.txt");
-    assert !Files.exists(feature1TextFile);
-    assert !Files.exists(feature2TextFile);
-    assert Files.exists(baseTextFile);
-    assert Arrays.equals(Files.readAllBytes(baseTextFile), fileBytes);
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/dexsplitter/SplitterTestBase.java b/src/test/java/com/android/tools/r8/dexsplitter/SplitterTestBase.java
index 05d6d3d..bd7929d 100644
--- a/src/test/java/com/android/tools/r8/dexsplitter/SplitterTestBase.java
+++ b/src/test/java/com/android/tools/r8/dexsplitter/SplitterTestBase.java
@@ -17,12 +17,9 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.ToolHelper.ArtCommandBuilder;
 import com.android.tools.r8.ToolHelper.ProcessResult;
-import com.android.tools.r8.dexsplitter.DexSplitter.Options;
 import com.android.tools.r8.utils.ArchiveResourceProvider;
 import com.android.tools.r8.utils.Pair;
-import com.android.tools.r8.utils.ThrowingConsumer;
 import com.android.tools.r8.utils.ZipUtils;
-import com.google.common.collect.ImmutableList;
 import com.google.common.io.ByteStreams;
 import dalvik.system.PathClassLoader;
 import java.io.IOException;
@@ -31,9 +28,7 @@
 import java.nio.file.Path;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.List;
 import java.util.Set;
-import java.util.function.Consumer;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipInputStream;
 import java.util.zip.ZipOutputStream;
@@ -155,96 +150,6 @@
         toRun, baseOutput, r8TestCompileResult.getFeature(0), parameters.getRuntime());
   }
 
-  // Compile the passed in classes plus RunInterface and SplitRunner using R8, then split
-  // based on the base/feature sets. toRun must implement the BaseRunInterface
-  <E extends Throwable> ProcessResult testDexSplitter(
-      TestParameters parameters,
-      Set<Class<?>> baseClasses,
-      Set<Class<?>> featureClasses,
-      Class<?> toRun,
-      String expectedOutput,
-      ThrowingConsumer<R8TestCompileResult, E> compileResultConsumer,
-      Consumer<R8FullTestBuilder> r8TestConfigurator)
-      throws Exception, E {
-    List<Class<?>> baseClassesWithRunner =
-        ImmutableList.<Class<?>>builder()
-            .add(RunInterface.class, SplitRunner.class)
-            .addAll(baseClasses)
-            .build();
-
-    Path baseJar = jarTestClasses(baseClassesWithRunner);
-    Path featureJar = jarTestClasses(featureClasses);
-
-    Path featureOnly =
-        testForR8(parameters.getBackend())
-            .addProgramClasses(featureClasses)
-            .addClasspathClasses(baseClasses)
-            .addClasspathClasses(RunInterface.class)
-            .addKeepAllClassesRule()
-            .addInliningAnnotations()
-            .setMinApi(parameters.getApiLevel())
-            .compile()
-            .writeToZip();
-    if (parameters.isDexRuntime()) {
-      // With D8 this should just work. We compile all of the base classes, then run with the
-      // feature loaded at runtime. Since there is no inlining/class merging we don't
-      // have any issues.
-      testForD8()
-          .addProgramClasses(SplitRunner.class, RunInterface.class)
-          .addProgramClasses(baseClasses)
-          .setMinApi(parameters.getApiLevel())
-          .compile()
-          .run(
-              parameters.getRuntime(),
-              SplitRunner.class,
-              toRun.getName(),
-              featureOnly.toAbsolutePath().toString())
-          .assertSuccessWithOutput(expectedOutput);
-    }
-
-    R8FullTestBuilder builder = testForR8(parameters.getBackend());
-    if (parameters.isCfRuntime()) {
-      // Compiling to jar we need to support the same way of loading code at runtime as
-      // android supports.
-      builder
-          .addProgramClasses(PathClassLoader.class)
-          .addKeepClassAndMembersRules(PathClassLoader.class);
-    }
-
-    R8FullTestBuilder r8FullTestBuilder =
-        builder
-            .setMinApi(parameters.getApiLevel())
-            .addProgramClasses(SplitRunner.class, RunInterface.class)
-            .addProgramClasses(baseClasses)
-            .addProgramClasses(featureClasses)
-            .addKeepMainRule(SplitRunner.class)
-            .addKeepClassRules(toRun);
-    r8TestConfigurator.accept(r8FullTestBuilder);
-    R8TestCompileResult r8TestCompileResult = r8FullTestBuilder.compile();
-    compileResultConsumer.accept(r8TestCompileResult);
-    Path fullFiles = r8TestCompileResult.writeToZip();
-
-    // Ensure that we can run the program as a unit (i.e., without splitting)
-    r8TestCompileResult
-        .run(parameters.getRuntime(), SplitRunner.class, toRun.getName())
-        .assertSuccessWithOutput(expectedOutput);
-
-    Path splitterOutput = temp.newFolder().toPath();
-    Path splitterBaseDexFile = splitterOutput.resolve("base").resolve("classes.dex");
-    Path splitterFeatureDexFile = splitterOutput.resolve("feature").resolve("classes.dex");
-
-    Options options = new Options();
-    options.setOutput(splitterOutput.toString());
-    options.addBaseJar(baseJar.toString());
-    options.addFeatureJar(featureJar.toString(), "feature");
-
-    options.addInputArchive(fullFiles.toString());
-    DexSplitter.run(options);
-
-    return runFeatureOnArt(
-        toRun, splitterBaseDexFile, splitterFeatureDexFile, parameters.getRuntime());
-  }
-
   ProcessResult runFeatureOnArt(
       Class toRun, Path splitterBaseDexFile, Path splitterFeatureDexFile, TestRuntime runtime)
       throws IOException {
diff --git a/src/test/java/com/android/tools/r8/dump/DumpInputsTest.java b/src/test/java/com/android/tools/r8/dump/DumpInputsTest.java
index 5437118..05824cc 100644
--- a/src/test/java/com/android/tools/r8/dump/DumpInputsTest.java
+++ b/src/test/java/com/android/tools/r8/dump/DumpInputsTest.java
@@ -105,6 +105,7 @@
     Path unzipped = temp.newFolder().toPath();
     ZipUtils.unzip(dumpFile.toString(), unzipped.toFile());
     assertTrue(Files.exists(unzipped.resolve("r8-version")));
+    assertTrue(Files.exists(unzipped.resolve("build.properties")));
     assertTrue(Files.exists(unzipped.resolve("program.jar")));
     assertTrue(Files.exists(unzipped.resolve("library.jar")));
     if (hasClasspath) {
diff --git a/src/test/java/com/android/tools/r8/internal/YouTubeV1533TreeShakeJarVerificationTest.java b/src/test/java/com/android/tools/r8/internal/YouTubeV1533TreeShakeJarVerificationTest.java
deleted file mode 100644
index 9ae3939..0000000
--- a/src/test/java/com/android/tools/r8/internal/YouTubeV1533TreeShakeJarVerificationTest.java
+++ /dev/null
@@ -1,80 +0,0 @@
-// Copyright (c) 2020, 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.internal;
-
-import static com.android.tools.r8.ToolHelper.isLocalDevelopment;
-import static com.android.tools.r8.ToolHelper.shouldRunSlowTests;
-import static org.junit.Assert.assertTrue;
-import static org.junit.Assume.assumeTrue;
-
-import com.android.tools.r8.R8TestCompileResult;
-import com.android.tools.r8.TestParameters;
-import com.android.tools.r8.TestParametersCollection;
-import com.android.tools.r8.utils.AndroidApiLevel;
-import com.google.common.collect.ImmutableList;
-import java.nio.file.Paths;
-import org.junit.Test;
-import org.junit.runner.RunWith;
-import org.junit.runners.Parameterized;
-import org.junit.runners.Parameterized.Parameters;
-
-@RunWith(Parameterized.class)
-public class YouTubeV1533TreeShakeJarVerificationTest extends YouTubeCompilationTestBase {
-
-  private static final boolean DUMP = false;
-  private static final int MAX_SIZE = 27500000;
-
-  @Parameters(name = "{0}")
-  public static TestParametersCollection data() {
-    return getTestParameters().withNoneRuntime().build();
-  }
-
-  public YouTubeV1533TreeShakeJarVerificationTest(TestParameters parameters) {
-    super(15, 33, AndroidApiLevel.H_MR2);
-    parameters.assertNoneRuntime();
-  }
-
-  @Test
-  public void testR8() throws Exception {
-    // TODO(b/141603168): Enable this on the bots.
-    assumeTrue(isLocalDevelopment());
-    assumeTrue(shouldRunSlowTests());
-
-    LibrarySanitizer librarySanitizer =
-        new LibrarySanitizer(temp)
-            .addProgramFiles(getProgramFiles())
-            .addLibraryFiles(ImmutableList.of(getLibraryFile()))
-            .sanitize()
-            .assertSanitizedProguardConfigurationIsEmpty();
-
-    R8TestCompileResult compileResult =
-        testForR8(Backend.DEX)
-            .addProgramFiles(getProgramFiles())
-            .addLibraryFiles(librarySanitizer.getSanitizedLibrary())
-            .addKeepRuleFiles(getKeepRuleFiles())
-            .addMainDexRuleFiles(getMainDexRuleFiles())
-            .addIgnoreWarnings()
-            .allowDiagnosticMessages()
-            .allowUnusedDontWarnPatterns()
-            .allowUnusedProguardConfigurationRules()
-            .setMinApi(getApiLevel())
-            .compile()
-            .apply(this::printProtoStats);
-
-    if (isLocalDevelopment()) {
-      if (DUMP) {
-        long time = System.currentTimeMillis();
-        compileResult.writeToZip(Paths.get("YouTubeV1533-" + time + ".zip"));
-        compileResult.writeProguardMap(Paths.get("YouTubeV1533-" + time + ".map"));
-      }
-    }
-
-    int applicationSize = compileResult.app.applicationSize();
-    System.out.println(applicationSize);
-
-    assertTrue(
-        "Expected max size of " + MAX_SIZE + ", got " + applicationSize,
-        applicationSize < MAX_SIZE);
-  }
-}
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 5d54843..2eb6a7f 100644
--- a/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
+++ b/src/test/java/com/android/tools/r8/maindexlist/MainDexListTests.java
@@ -25,8 +25,6 @@
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.dex.ApplicationWriter;
 import com.android.tools.r8.dex.Constants;
-import com.android.tools.r8.dexsplitter.DexSplitter;
-import com.android.tools.r8.dexsplitter.DexSplitter.Options;
 import com.android.tools.r8.errors.CompilationError;
 import com.android.tools.r8.errors.DexFileOverflowDiagnostic;
 import com.android.tools.r8.errors.Unreachable;
@@ -255,49 +253,6 @@
   }
 
   @Test
-  public void everyThirdClassInMainWithDexSplitter() throws Throwable {
-    List<String> featureMappings = new ArrayList<>();
-    List<String> inFeatureMapping = new ArrayList<>();
-
-    ImmutableList.Builder<String> mainDexBuilder = ImmutableList.builder();
-    for (int i = 0; i < MANY_CLASSES.size(); i++) {
-      String clazz = MANY_CLASSES.get(i);
-      // Write the first 2 classes into the split.
-      if (i < 10) {
-        featureMappings.add(clazz + ":feature1");
-        inFeatureMapping.add(clazz);
-      }
-      if (i % 3 == 0) {
-        mainDexBuilder.add(clazz);
-      }
-    }
-    Path featureSplitMapping = temp.getRoot().toPath().resolve("splitmapping");
-    Path mainDexFile = temp.getRoot().toPath().resolve("maindex");
-    FileUtils.writeTextFile(featureSplitMapping, featureMappings);
-    List<String> mainDexList = mainDexBuilder.build();
-    FileUtils.writeTextFile(mainDexFile, ListUtils.map(mainDexList, MainDexListTests::typeToEntry));
-    Path output = temp.getRoot().toPath().resolve("split_output");
-    Files.createDirectories(output);
-    TestDiagnosticsHandler diagnosticsHandler = new TestDiagnosticsHandler();
-    Options options = new Options(diagnosticsHandler);
-    options.addInputArchive(getManyClassesMultiDexAppPath().toString());
-    options.setFeatureSplitMapping(featureSplitMapping.toString());
-    options.setOutput(output.toString());
-    options.setMainDexList(mainDexFile.toString());
-    DexSplitter.run(options);
-    assertEquals(0, diagnosticsHandler.numberOfErrorsAndWarnings());
-    Path baseDir = output.resolve("base");
-    CodeInspector inspector =
-        new CodeInspector(
-            AndroidApp.builder().addProgramFiles(baseDir.resolve("classes.dex")).build());
-    for (String clazz : mainDexList) {
-      if (!inspector.clazz(clazz).isPresent() && !inFeatureMapping.contains(clazz)) {
-        failedToFindClassInExpectedFile(baseDir, clazz);
-      }
-    }
-  }
-
-  @Test
   public void singleClassInMainDex() throws Throwable {
     ImmutableList<String> mainDex = ImmutableList.of(MANY_CLASSES.get(0));
     verifyMainDexContains(mainDex, getManyClassesSingleDexAppPath(), true);
diff --git a/src/test/java/com/android/tools/r8/startup/MinimalStartupDexTest.java b/src/test/java/com/android/tools/r8/startup/MinimalStartupDexTest.java
index a6dbbb7..4419055 100644
--- a/src/test/java/com/android/tools/r8/startup/MinimalStartupDexTest.java
+++ b/src/test/java/com/android/tools/r8/startup/MinimalStartupDexTest.java
@@ -12,13 +12,13 @@
 import com.android.tools.r8.TestBase;
 import com.android.tools.r8.TestParameters;
 import com.android.tools.r8.TestParametersCollection;
+import com.android.tools.r8.experimental.startup.StartupClass;
 import com.android.tools.r8.experimental.startup.StartupConfiguration;
+import com.android.tools.r8.graph.DexType;
 import com.android.tools.r8.utils.AndroidApiLevel;
 import com.android.tools.r8.utils.codeinspector.ClassSubject;
 import com.android.tools.r8.utils.codeinspector.InstructionSubject;
 import com.android.tools.r8.utils.codeinspector.MethodSubject;
-import com.google.common.collect.Lists;
-import java.util.Collections;
 import org.junit.Test;
 import org.junit.runner.RunWith;
 import org.junit.runners.Parameterized;
@@ -48,21 +48,27 @@
             options ->
                 options
                     .getStartupOptions()
-                    .setEnableMinimalStartupDex()
+                    .setEnableMinimalStartupDex(true)
                     .setEnableStartupCompletenessCheckForTesting()
                     .setStartupConfiguration(
-                        new StartupConfiguration(
-                            Lists.newArrayList(
-                                toDexType(Main.class, options.dexItemFactory()),
-                                toDexType(StartupClass.class, options.dexItemFactory())),
-                            Collections.emptyList())))
+                        StartupConfiguration.builder()
+                            .addStartupClass(
+                                StartupClass.<DexType>builder()
+                                    .setReference(toDexType(Main.class, options.dexItemFactory()))
+                                    .build())
+                            .addStartupClass(
+                                StartupClass.<DexType>builder()
+                                    .setReference(
+                                        toDexType(AStartupClass.class, options.dexItemFactory()))
+                                    .build())
+                            .build()))
         .enableInliningAnnotations()
         .setMinApi(parameters.getApiLevel())
         .compile()
         .inspectMultiDex(
             primaryDexInspector -> {
               // StartupClass should be in the primary dex.
-              ClassSubject startupClassSubject = primaryDexInspector.clazz(StartupClass.class);
+              ClassSubject startupClassSubject = primaryDexInspector.clazz(AStartupClass.class);
               assertThat(startupClassSubject, isPresent());
 
               MethodSubject startupMethodSubject = startupClassSubject.uniqueMethodWithName("foo");
@@ -99,7 +105,7 @@
   static class Main {
 
     public static void main(String[] args) {
-      StartupClass.foo();
+      AStartupClass.foo();
     }
 
     // @Keep
@@ -108,7 +114,7 @@
     }
   }
 
-  static class StartupClass {
+  static class AStartupClass {
 
     @NeverInline
     static void foo() {
diff --git a/src/test/java/com/android/tools/r8/startup/StartupInstrumentationTest.java b/src/test/java/com/android/tools/r8/startup/StartupInstrumentationTest.java
index 8a73ac4..6364cb0 100644
--- a/src/test/java/com/android/tools/r8/startup/StartupInstrumentationTest.java
+++ b/src/test/java/com/android/tools/r8/startup/StartupInstrumentationTest.java
@@ -57,16 +57,13 @@
   }
 
   private static List<String> getExpectedOutput() {
-    return ImmutableList.of(
-        "Lcom/android/tools/r8/startup/StartupInstrumentationTest$Main;",
-        "Lcom/android/tools/r8/startup/StartupInstrumentationTest$StartupClass;",
-        "foo");
+    return ImmutableList.of(descriptor(Main.class), descriptor(AStartupClass.class), "foo");
   }
 
   static class Main {
 
     public static void main(String[] args) {
-      StartupClass.foo();
+      AStartupClass.foo();
     }
 
     // @Keep
@@ -75,7 +72,7 @@
     }
   }
 
-  static class StartupClass {
+  static class AStartupClass {
 
     @NeverInline
     static void foo() {
diff --git a/src/test/java/com/android/tools/r8/startup/StartupSyntheticPlacementTest.java b/src/test/java/com/android/tools/r8/startup/StartupSyntheticPlacementTest.java
new file mode 100644
index 0000000..884c1bf
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/startup/StartupSyntheticPlacementTest.java
@@ -0,0 +1,212 @@
+// Copyright (c) 2022, 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.startup;
+
+import static com.android.tools.r8.startup.utils.StartupTestingMatchers.isEqualToClassDataLayout;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.notIf;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.experimental.startup.StartupClass;
+import com.android.tools.r8.graph.DexProgramClass;
+import com.android.tools.r8.references.ClassReference;
+import com.android.tools.r8.references.Reference;
+import com.android.tools.r8.startup.utils.MixedSectionLayoutInspector;
+import com.android.tools.r8.startup.utils.StartupTestingUtils;
+import com.android.tools.r8.synthesis.SyntheticItemsTestUtils;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.BooleanUtils;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.google.common.collect.ImmutableList;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import java.util.function.Consumer;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class StartupSyntheticPlacementTest extends TestBase {
+
+  @Parameter(0)
+  public TestParameters parameters;
+
+  @Parameter(1)
+  public boolean enableMinimalStartupDex;
+
+  @Parameter(2)
+  public boolean useLambda;
+
+  @Parameters(name = "{0}, minimal startup dex: {1}, use lambda: {2}")
+  public static List<Object[]> data() {
+    return buildParameters(
+        // N so that java.util.function.Consumer is present.
+        getTestParameters().withDexRuntimes().withApiLevel(AndroidApiLevel.N).build(),
+        BooleanUtils.values(),
+        BooleanUtils.values());
+  }
+
+  @Test
+  public void test() throws Exception {
+    List<StartupClass<ClassReference>> startupList = new ArrayList<>();
+    testForD8(parameters.getBackend())
+        .addInnerClasses(getClass())
+        .apply(StartupTestingUtils.enableStartupInstrumentation(parameters))
+        .setMinApi(parameters.getApiLevel())
+        .compile()
+        .addRunClasspathFiles(StartupTestingUtils.getAndroidUtilLog(temp))
+        .run(parameters.getRuntime(), Main.class, Boolean.toString(useLambda))
+        .apply(StartupTestingUtils.removeStartupClassesFromStdout(startupList::add))
+        .assertSuccessWithOutputLines(getExpectedOutput());
+    assertEquals(getExpectedStartupList(), startupList);
+
+    testForR8(parameters.getBackend())
+        .addInnerClasses(getClass())
+        .addKeepMainRule(Main.class)
+        .addKeepClassAndMembersRules(A.class, B.class, C.class)
+        .addOptionsModification(
+            options -> {
+              options.getStartupOptions().setEnableMinimalStartupDex(enableMinimalStartupDex);
+              options
+                  .getTestingOptions()
+                  .setMixedSectionLayoutStrategyInspector(getMixedSectionLayoutInspector());
+            })
+        .apply(testBuilder -> StartupTestingUtils.setStartupConfiguration(testBuilder, startupList))
+        .setMinApi(parameters.getApiLevel())
+        .compile()
+        .inspectMultiDex(this::inspectPrimaryDex, this::inspectSecondaryDex)
+        .run(parameters.getRuntime(), Main.class, Boolean.toString(useLambda))
+        .assertSuccessWithOutputLines(getExpectedOutput());
+  }
+
+  private List<String> getExpectedOutput() {
+    return ImmutableList.of("A", "B", "C");
+  }
+
+  private List<StartupClass<ClassReference>> getExpectedStartupList() {
+    ImmutableList.Builder<StartupClass<ClassReference>> builder = ImmutableList.builder();
+    builder.add(
+        StartupClass.<ClassReference>builder()
+            .setReference(Reference.classFromClass(Main.class))
+            .build());
+    builder.add(
+        StartupClass.<ClassReference>builder()
+            .setReference(Reference.classFromClass(A.class))
+            .build());
+    builder.add(
+        StartupClass.<ClassReference>builder()
+            .setReference(Reference.classFromClass(B.class))
+            .build());
+    if (useLambda) {
+      builder.add(
+          StartupClass.<ClassReference>builder()
+              .setReference(Reference.classFromClass(B.class))
+              .setSynthetic()
+              .build());
+    }
+    builder.add(
+        StartupClass.<ClassReference>builder()
+            .setReference(Reference.classFromClass(C.class))
+            .build());
+    return builder.build();
+  }
+
+  private List<ClassReference> getExpectedClassDataLayout(int virtualFile) {
+    // The synthetic lambda should only be placed alongside its synthetic context (B) if it is used.
+    // Otherwise, it should be last, or in the second dex file if compiling with minimal startup.
+    ImmutableList.Builder<ClassReference> layoutBuilder = ImmutableList.builder();
+    if (virtualFile == 0) {
+      layoutBuilder.add(
+          Reference.classFromClass(Main.class),
+          Reference.classFromClass(A.class),
+          Reference.classFromClass(B.class));
+      if (useLambda) {
+        layoutBuilder.add(getSyntheticLambdaClassReference());
+      }
+      layoutBuilder.add(Reference.classFromClass(C.class));
+    }
+    if (!useLambda) {
+      if (!enableMinimalStartupDex || virtualFile == 1) {
+        layoutBuilder.add(getSyntheticLambdaClassReference());
+      }
+    }
+    return layoutBuilder.build();
+  }
+
+  private MixedSectionLayoutInspector getMixedSectionLayoutInspector() {
+    return new MixedSectionLayoutInspector() {
+      @Override
+      public void inspectClassDataLayout(int virtualFile, Collection<DexProgramClass> layout) {
+        assertThat(layout, isEqualToClassDataLayout(getExpectedClassDataLayout(virtualFile)));
+      }
+    };
+  }
+
+  private void inspectPrimaryDex(CodeInspector inspector) {
+    assertThat(inspector.clazz(Main.class), isPresent());
+    assertThat(inspector.clazz(A.class), isPresent());
+    assertThat(inspector.clazz(B.class), isPresent());
+    assertThat(inspector.clazz(C.class), isPresent());
+    assertThat(
+        inspector.clazz(getSyntheticLambdaClassReference()),
+        notIf(isPresent(), enableMinimalStartupDex && !useLambda));
+  }
+
+  private void inspectSecondaryDex(CodeInspector inspector) {
+    if (enableMinimalStartupDex && !useLambda) {
+      assertEquals(1, inspector.allClasses().size());
+      assertThat(inspector.clazz(getSyntheticLambdaClassReference()), isPresent());
+    } else {
+      assertTrue(inspector.allClasses().isEmpty());
+    }
+  }
+
+  private static ClassReference getSyntheticLambdaClassReference() {
+    return SyntheticItemsTestUtils.syntheticLambdaClass(B.class, 0);
+  }
+
+  static class Main {
+
+    public static void main(String[] args) {
+      boolean useLambda = args.length > 0 && args[0].equals("true");
+      A.a();
+      B.b(useLambda);
+      C.c();
+    }
+  }
+
+  static class A {
+
+    static void a() {
+      System.out.println("A");
+    }
+  }
+
+  static class B {
+
+    static void b(boolean useLambda) {
+      String message = System.currentTimeMillis() > 0 ? "B" : null;
+      if (useLambda) {
+        Consumer<Object> consumer = obj -> {};
+        consumer.accept(consumer);
+      }
+      System.out.println(message);
+    }
+  }
+
+  static class C {
+
+    static void c() {
+      System.out.println("C");
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/startup/StartupSyntheticWithoutContextTest.java b/src/test/java/com/android/tools/r8/startup/StartupSyntheticWithoutContextTest.java
new file mode 100644
index 0000000..18ed52b
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/startup/StartupSyntheticWithoutContextTest.java
@@ -0,0 +1,199 @@
+// Copyright (c) 2022, 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.startup;
+
+import static com.android.tools.r8.startup.utils.StartupTestingMatchers.isEqualToClassDataLayout;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isAbsent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.isPresent;
+import static com.android.tools.r8.utils.codeinspector.Matchers.notIf;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.experimental.startup.StartupClass;
+import com.android.tools.r8.graph.DexProgramClass;
+import com.android.tools.r8.references.ClassReference;
+import com.android.tools.r8.references.Reference;
+import com.android.tools.r8.startup.utils.MixedSectionLayoutInspector;
+import com.android.tools.r8.startup.utils.StartupTestingUtils;
+import com.android.tools.r8.synthesis.SyntheticItemsTestUtils;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.BooleanUtils;
+import com.android.tools.r8.utils.codeinspector.CodeInspector;
+import com.google.common.collect.ImmutableList;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.Parameterized;
+import org.junit.runners.Parameterized.Parameter;
+import org.junit.runners.Parameterized.Parameters;
+
+@RunWith(Parameterized.class)
+public class StartupSyntheticWithoutContextTest extends TestBase {
+
+  @Parameter(0)
+  public TestParameters parameters;
+
+  @Parameter(1)
+  public boolean enableMinimalStartupDex;
+
+  @Parameters(name = "{0}, minimal startup dex: {1}")
+  public static List<Object[]> data() {
+    return buildParameters(
+        // N so that java.util.function.Consumer is present.
+        getTestParameters().withDexRuntimes().withApiLevel(AndroidApiLevel.N).build(),
+        BooleanUtils.values());
+  }
+
+  @Test
+  public void test() throws Exception {
+    List<StartupClass<ClassReference>> startupList = new ArrayList<>();
+    testForD8(parameters.getBackend())
+        .addInnerClasses(getClass())
+        .apply(StartupTestingUtils.enableStartupInstrumentation(parameters))
+        .setMinApi(parameters.getApiLevel())
+        .compile()
+        .addRunClasspathFiles(StartupTestingUtils.getAndroidUtilLog(temp))
+        .run(parameters.getRuntime(), Main.class)
+        .apply(StartupTestingUtils.removeStartupClassesFromStdout(startupList::add))
+        .assertSuccessWithOutputLines(getExpectedOutput());
+    assertEquals(getExpectedStartupList(), startupList);
+
+    testForR8(parameters.getBackend())
+        .addInnerClasses(getClass())
+        .addKeepMainRule(Main.class)
+        .addKeepClassAndMembersRules(A.class, C.class)
+        .addOptionsModification(
+            options -> {
+              options.getStartupOptions().setEnableMinimalStartupDex(enableMinimalStartupDex);
+              options
+                  .getTestingOptions()
+                  .setMixedSectionLayoutStrategyInspector(getMixedSectionLayoutInspector());
+            })
+        .apply(testBuilder -> StartupTestingUtils.setStartupConfiguration(testBuilder, startupList))
+        .setMinApi(parameters.getApiLevel())
+        .compile()
+        .inspectMultiDex(this::inspectPrimaryDex, this::inspectSecondaryDex)
+        .run(parameters.getRuntime(), Main.class)
+        .assertSuccessWithOutputLines(getExpectedOutput());
+  }
+
+  private List<String> getExpectedOutput() {
+    return ImmutableList.of("A", "B", "C");
+  }
+
+  private List<StartupClass<ClassReference>> getExpectedStartupList() {
+    ImmutableList.Builder<StartupClass<ClassReference>> builder = ImmutableList.builder();
+    builder.add(
+        StartupClass.<ClassReference>builder()
+            .setReference(Reference.classFromClass(Main.class))
+            .build());
+    builder.add(
+        StartupClass.<ClassReference>builder()
+            .setReference(Reference.classFromClass(A.class))
+            .build());
+    builder.add(
+        StartupClass.<ClassReference>builder()
+            .setReference(Reference.classFromClass(B.class))
+            .build());
+    builder.add(
+        StartupClass.<ClassReference>builder()
+            .setReference(Reference.classFromClass(B.class))
+            .setSynthetic()
+            .build());
+    builder.add(
+        StartupClass.<ClassReference>builder()
+            .setReference(Reference.classFromClass(C.class))
+            .build());
+    return builder.build();
+  }
+
+  private List<ClassReference> getExpectedClassDataLayout(int virtualFile) {
+    ImmutableList.Builder<ClassReference> builder = ImmutableList.builder();
+    if (virtualFile == 0) {
+      builder.add(
+          Reference.classFromClass(Main.class),
+          Reference.classFromClass(A.class),
+          getSyntheticLambdaClassReference(B.class),
+          Reference.classFromClass(C.class));
+    }
+    if (!enableMinimalStartupDex || virtualFile == 1) {
+      builder.add(getSyntheticLambdaClassReference(Main.class));
+    }
+    return builder.build();
+  }
+
+  private MixedSectionLayoutInspector getMixedSectionLayoutInspector() {
+    return new MixedSectionLayoutInspector() {
+      @Override
+      public void inspectClassDataLayout(int virtualFile, Collection<DexProgramClass> layout) {
+        assertThat(layout, isEqualToClassDataLayout(getExpectedClassDataLayout(virtualFile)));
+      }
+    };
+  }
+
+  private void inspectPrimaryDex(CodeInspector inspector) {
+    assertThat(inspector.clazz(Main.class), isPresent());
+    assertThat(inspector.clazz(A.class), isPresent());
+    assertThat(inspector.clazz(B.class), isAbsent());
+    assertThat(inspector.clazz(C.class), isPresent());
+    assertThat(inspector.clazz(getSyntheticLambdaClassReference(B.class)), isPresent());
+    assertThat(
+        inspector.clazz(getSyntheticLambdaClassReference(Main.class)),
+        notIf(isPresent(), enableMinimalStartupDex));
+  }
+
+  private void inspectSecondaryDex(CodeInspector inspector) {
+    if (enableMinimalStartupDex) {
+      assertEquals(1, inspector.allClasses().size());
+      assertThat(inspector.clazz(getSyntheticLambdaClassReference(Main.class)), isPresent());
+    } else {
+      assertTrue(inspector.allClasses().isEmpty());
+    }
+  }
+
+  private static ClassReference getSyntheticLambdaClassReference(Class<?> synthesizingContext) {
+    return SyntheticItemsTestUtils.syntheticLambdaClass(synthesizingContext, 0);
+  }
+
+  static class Main {
+
+    public static void main(String[] args) {
+      A.a();
+      Runnable r = System.currentTimeMillis() > 0 ? B.b() : Main::error;
+      r.run();
+      C.c();
+    }
+
+    static void error() {
+      throw new RuntimeException();
+    }
+  }
+
+  static class A {
+
+    static void a() {
+      System.out.println("A");
+    }
+  }
+
+  static class B {
+
+    static Runnable b() {
+      return () -> System.out.println("B");
+    }
+  }
+
+  static class C {
+
+    static void c() {
+      System.out.println("C");
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/startup/utils/MixedSectionLayoutInspector.java b/src/test/java/com/android/tools/r8/startup/utils/MixedSectionLayoutInspector.java
new file mode 100644
index 0000000..c2d5285
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/startup/utils/MixedSectionLayoutInspector.java
@@ -0,0 +1,133 @@
+// Copyright (c) 2022, 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.startup.utils;
+
+import com.android.tools.r8.dex.MixedSectionLayoutStrategy;
+import com.android.tools.r8.dex.VirtualFile;
+import com.android.tools.r8.graph.DexAnnotation;
+import com.android.tools.r8.graph.DexAnnotationDirectory;
+import com.android.tools.r8.graph.DexAnnotationSet;
+import com.android.tools.r8.graph.DexEncodedArray;
+import com.android.tools.r8.graph.DexProgramClass;
+import com.android.tools.r8.graph.DexString;
+import com.android.tools.r8.graph.DexTypeList;
+import com.android.tools.r8.graph.ParameterAnnotationsList;
+import com.android.tools.r8.graph.ProgramMethod;
+import java.util.Collection;
+import java.util.function.BiFunction;
+
+public abstract class MixedSectionLayoutInspector
+    implements BiFunction<MixedSectionLayoutStrategy, VirtualFile, MixedSectionLayoutStrategy> {
+
+  public void inspectAnnotationLayout(int virtualFile, Collection<DexAnnotation> layout) {
+    // Intentionally empty.
+  }
+
+  public void inspectAnnotationDirectoryLayout(
+      int virtualFile, Collection<DexAnnotationDirectory> layout) {
+    // Intentionally empty.
+  }
+
+  public void inspectAnnotationSetLayout(int virtualFile, Collection<DexAnnotationSet> layout) {
+    // Intentionally empty.
+  }
+
+  public void inspectAnnotationSetRefListLayout(
+      int virtualFile, Collection<ParameterAnnotationsList> layout) {
+    // Intentionally empty.
+  }
+
+  public void inspectClassDataLayout(int virtualFile, Collection<DexProgramClass> layout) {
+    // Intentionally empty.
+  }
+
+  public void inspectCodeLayout(int virtualFile, Collection<ProgramMethod> layout) {
+    // Intentionally empty.
+  }
+
+  public void inspectEncodedArrayLayout(int virtualFile, Collection<DexEncodedArray> layout) {
+    // Intentionally empty.
+  }
+
+  public void inspectStringDataLayout(int virtualFile, Collection<DexString> layout) {
+    // Intentionally empty.
+  }
+
+  public void inspectTypeListLayout(int virtualFile, Collection<DexTypeList> layout) {
+    // Intentionally empty.
+  }
+
+  @Override
+  public MixedSectionLayoutStrategy apply(
+      MixedSectionLayoutStrategy mixedSectionLayoutStrategy, VirtualFile virtualFile) {
+    return new MixedSectionLayoutStrategy() {
+
+      @Override
+      public Collection<DexAnnotation> getAnnotationLayout() {
+        Collection<DexAnnotation> layout = mixedSectionLayoutStrategy.getAnnotationLayout();
+        inspectAnnotationLayout(virtualFile.getId(), layout);
+        return layout;
+      }
+
+      @Override
+      public Collection<DexAnnotationDirectory> getAnnotationDirectoryLayout() {
+        Collection<DexAnnotationDirectory> layout =
+            mixedSectionLayoutStrategy.getAnnotationDirectoryLayout();
+        inspectAnnotationDirectoryLayout(virtualFile.getId(), layout);
+        return layout;
+      }
+
+      @Override
+      public Collection<DexAnnotationSet> getAnnotationSetLayout() {
+        Collection<DexAnnotationSet> layout = mixedSectionLayoutStrategy.getAnnotationSetLayout();
+        inspectAnnotationSetLayout(virtualFile.getId(), layout);
+        return layout;
+      }
+
+      @Override
+      public Collection<ParameterAnnotationsList> getAnnotationSetRefListLayout() {
+        Collection<ParameterAnnotationsList> layout =
+            mixedSectionLayoutStrategy.getAnnotationSetRefListLayout();
+        inspectAnnotationSetRefListLayout(virtualFile.getId(), layout);
+        return layout;
+      }
+
+      @Override
+      public Collection<DexProgramClass> getClassDataLayout() {
+        Collection<DexProgramClass> layout = mixedSectionLayoutStrategy.getClassDataLayout();
+        inspectClassDataLayout(virtualFile.getId(), layout);
+        return layout;
+      }
+
+      @Override
+      public Collection<ProgramMethod> getCodeLayout() {
+        Collection<ProgramMethod> layout = mixedSectionLayoutStrategy.getCodeLayout();
+        inspectCodeLayout(virtualFile.getId(), layout);
+        return layout;
+      }
+
+      @Override
+      public Collection<DexEncodedArray> getEncodedArrayLayout() {
+        Collection<DexEncodedArray> layout = mixedSectionLayoutStrategy.getEncodedArrayLayout();
+        inspectEncodedArrayLayout(virtualFile.getId(), layout);
+        return layout;
+      }
+
+      @Override
+      public Collection<DexString> getStringDataLayout() {
+        Collection<DexString> layout = mixedSectionLayoutStrategy.getStringDataLayout();
+        inspectStringDataLayout(virtualFile.getId(), layout);
+        return layout;
+      }
+
+      @Override
+      public Collection<DexTypeList> getTypeListLayout() {
+        Collection<DexTypeList> layout = mixedSectionLayoutStrategy.getTypeListLayout();
+        inspectTypeListLayout(virtualFile.getId(), layout);
+        return layout;
+      }
+    };
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/startup/utils/StartupTestingMatchers.java b/src/test/java/com/android/tools/r8/startup/utils/StartupTestingMatchers.java
new file mode 100644
index 0000000..618e644
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/startup/utils/StartupTestingMatchers.java
@@ -0,0 +1,56 @@
+// Copyright (c) 2022, 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.startup.utils;
+
+import com.android.tools.r8.graph.DexClass;
+import com.android.tools.r8.graph.DexProgramClass;
+import com.android.tools.r8.references.ClassReference;
+import com.android.tools.r8.references.TypeReference;
+import com.android.tools.r8.utils.StringUtils;
+import java.util.Collection;
+import java.util.Iterator;
+import org.hamcrest.Description;
+import org.hamcrest.Matcher;
+import org.hamcrest.TypeSafeMatcher;
+
+public class StartupTestingMatchers {
+
+  public static Matcher<Collection<DexProgramClass>> isEqualToClassDataLayout(
+      Collection<ClassReference> expectedLayout) {
+    return new TypeSafeMatcher<Collection<DexProgramClass>>() {
+      @Override
+      protected boolean matchesSafely(Collection<DexProgramClass> actualLayout) {
+        if (actualLayout.size() != expectedLayout.size()) {
+          return false;
+        }
+        Iterator<ClassReference> expectedLayoutIterator = expectedLayout.iterator();
+        for (DexProgramClass clazz : actualLayout) {
+          if (!clazz.getClassReference().equals(expectedLayoutIterator.next())) {
+            return false;
+          }
+        }
+        return true;
+      }
+
+      @Override
+      public void describeTo(Description description) {
+        description.appendText(
+            "is equal to ["
+                + StringUtils.join(", ", expectedLayout, TypeReference::getTypeName)
+                + "]");
+      }
+
+      @Override
+      public void describeMismatchSafely(
+          Collection<DexProgramClass> actualLayout, Description description) {
+        description
+            .appendText("class data layout was not: ")
+            .appendText("[")
+            .appendText(StringUtils.join(", ", actualLayout, DexClass::getTypeName))
+            .appendText("]");
+      }
+    };
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/startup/utils/StartupTestingUtils.java b/src/test/java/com/android/tools/r8/startup/utils/StartupTestingUtils.java
new file mode 100644
index 0000000..dad4d44
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/startup/utils/StartupTestingUtils.java
@@ -0,0 +1,120 @@
+// Copyright (c) 2022, 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.startup.utils;
+
+import static com.android.tools.r8.TestBase.transformer;
+
+import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.D8TestBuilder;
+import com.android.tools.r8.D8TestRunResult;
+import com.android.tools.r8.R8TestBuilder;
+import com.android.tools.r8.TestBase;
+import com.android.tools.r8.TestParameters;
+import com.android.tools.r8.ThrowableConsumer;
+import com.android.tools.r8.experimental.startup.StartupClass;
+import com.android.tools.r8.experimental.startup.StartupConfiguration;
+import com.android.tools.r8.graph.DexItemFactory;
+import com.android.tools.r8.graph.DexType;
+import com.android.tools.r8.references.ClassReference;
+import com.android.tools.r8.references.Reference;
+import com.android.tools.r8.utils.AndroidApiLevel;
+import com.android.tools.r8.utils.StringUtils;
+import com.android.tools.r8.utils.ThrowingConsumer;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.List;
+import java.util.function.Consumer;
+import org.junit.rules.TemporaryFolder;
+
+public class StartupTestingUtils {
+
+  private static String startupInstrumentationTag = "startup";
+
+  public static ThrowableConsumer<D8TestBuilder> enableStartupInstrumentation(
+      TestParameters parameters) {
+    return testBuilder -> enableStartupInstrumentation(testBuilder, parameters);
+  }
+
+  public static void enableStartupInstrumentation(
+      D8TestBuilder testBuilder, TestParameters parameters) throws IOException {
+    testBuilder
+        .addOptionsModification(
+            options ->
+                options
+                    .getStartupOptions()
+                    .setEnableStartupInstrumentation()
+                    .setStartupInstrumentationTag(startupInstrumentationTag))
+        .addLibraryFiles(parameters.getDefaultRuntimeLibrary())
+        .addLibraryClassFileData(getTransformedAndroidUtilLog());
+  }
+
+  public static Path getAndroidUtilLog(TemporaryFolder temporaryFolder)
+      throws CompilationFailedException, IOException {
+    return TestBase.testForD8(temporaryFolder)
+        .addProgramClassFileData(getTransformedAndroidUtilLog())
+        .setMinApi(AndroidApiLevel.B)
+        .compile()
+        .writeToZip();
+  }
+
+  public static ThrowingConsumer<D8TestRunResult, RuntimeException> removeStartupClassesFromStdout(
+      Consumer<StartupClass<ClassReference>> startupClassConsumer) {
+    return runResult -> removeStartupClassesFromStdout(runResult, startupClassConsumer);
+  }
+
+  public static void removeStartupClassesFromStdout(
+      D8TestRunResult runResult, Consumer<StartupClass<ClassReference>> startupClassConsumer) {
+    StringBuilder stdoutBuilder = new StringBuilder();
+    String startupDescriptorPrefix = "[" + startupInstrumentationTag + "] ";
+    for (String line : StringUtils.splitLines(runResult.getStdOut(), true)) {
+      if (line.startsWith(startupDescriptorPrefix)) {
+        StartupClass.Builder<ClassReference> startupClassBuilder = StartupClass.builder();
+        String message = line.substring(startupDescriptorPrefix.length());
+        message = StartupConfiguration.parseSyntheticFlag(message, startupClassBuilder);
+        startupClassBuilder.setReference(Reference.classFromDescriptor(message));
+        startupClassConsumer.accept(startupClassBuilder.build());
+      } else {
+        stdoutBuilder.append(line).append(System.lineSeparator());
+      }
+    }
+    runResult.getResult().setStdout(stdoutBuilder.toString());
+  }
+
+  public static void setStartupConfiguration(
+      R8TestBuilder<?> testBuilder, List<StartupClass<ClassReference>> startupClasses) {
+    testBuilder.addOptionsModification(
+        options -> {
+          DexItemFactory dexItemFactory = options.dexItemFactory();
+          options
+              .getStartupOptions()
+              .setStartupConfiguration(
+                  StartupConfiguration.builder()
+                      .apply(
+                          builder ->
+                              startupClasses.forEach(
+                                  startupClass ->
+                                      builder.addStartupClass(
+                                          StartupClass.<DexType>builder()
+                                              .setFlags(startupClass.getFlags())
+                                              .setReference(
+                                                  dexItemFactory.createType(
+                                                      startupClass.getReference().getDescriptor()))
+                                              .build())))
+                      .build());
+        });
+  }
+
+  private static byte[] getTransformedAndroidUtilLog() throws IOException {
+    return transformer(Log.class).setClassDescriptor("Landroid/util/Log;").transform();
+  }
+
+  public static class Log {
+
+    public static int i(String tag, String msg) {
+      System.out.println("[" + tag + "] " + msg);
+      return 42;
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/utils/FeatureClassMappingTest.java b/src/test/java/com/android/tools/r8/utils/FeatureClassMappingTest.java
deleted file mode 100644
index f41be5c..0000000
--- a/src/test/java/com/android/tools/r8/utils/FeatureClassMappingTest.java
+++ /dev/null
@@ -1,132 +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.utils;
-
-import static junit.framework.TestCase.assertEquals;
-import static junit.framework.TestCase.assertFalse;
-
-import com.android.tools.r8.utils.FeatureClassMapping.FeatureMappingException;
-import com.google.common.collect.ImmutableList;
-import java.util.List;
-import org.junit.Test;
-
-public class FeatureClassMappingTest {
-
-  @Test
-  public void testSimpleParse() throws Exception {
-
-    List<String> lines =
-        ImmutableList.of(
-            "# Comment, don't care about contents: even more ::::",
-            "com.google.base:base",
-            "", // Empty lines allowed
-            "com.google.feature1:feature1",
-            "com.google.feature1:feature1", // Multiple definitions of the same predicate allowed.
-            "com.google$:feature1",
-            "_com.google:feature21",
-            "com.google.*:feature32");
-    FeatureClassMapping mapping = new FeatureClassMapping(lines);
-  }
-
-  private void ensureThrowsMappingException(List<String> lines) {
-    try {
-      new FeatureClassMapping(lines);
-      assertFalse(true);
-    } catch (FeatureMappingException e) {
-      // Expected
-    }
-  }
-
-  private void ensureThrowsMappingException(String string) {
-    ensureThrowsMappingException(ImmutableList.of(string));
-  }
-
-  @Test
-  public void testLookup() throws Exception {
-    List<String> lines =
-        ImmutableList.of(
-            "com.google.Base:base",
-            "",
-            "com.google.Feature1:feature1",
-            "com.google.Feature1:feature1", // Multiple definitions of the same predicate allowed.
-            "com.google.different.*:feature1",
-            "_com.Google:feature21",
-            "com.google.bas42.*:feature42");
-    FeatureClassMapping mapping = new FeatureClassMapping(lines);
-    assertEquals(mapping.featureForClass("com.google.Feature1"), "feature1");
-    assertEquals(mapping.featureForClass("com.google.different.Feature1"), "feature1");
-    assertEquals(mapping.featureForClass("com.google.different.Foobar"), "feature1");
-    assertEquals(mapping.featureForClass("com.google.Base"), "base");
-    assertEquals(mapping.featureForClass("com.google.bas42.foo.bar.bar.Foo"), "feature42");
-    assertEquals(mapping.featureForClass("com.google.bas42.f$o$o$.bar43.bar.Foo"), "feature42");
-    assertEquals(mapping.featureForClass("_com.Google"), "feature21");
-  }
-
-  @Test
-  public void testCatchAllWildcards() throws Exception {
-    testBaseWildcard(true);
-    testBaseWildcard(false);
-    testNonBaseCatchAll();
-  }
-
-  private void testNonBaseCatchAll() throws FeatureMappingException {
-    List<String> lines =
-        ImmutableList.of(
-            "com.google.Feature1:feature1",
-            "*:nonbase",
-            "com.strange.*:feature2");
-    FeatureClassMapping mapping = new FeatureClassMapping(lines);
-    assertEquals(mapping.featureForClass("com.google.Feature1"), "feature1");
-    assertEquals(mapping.featureForClass("com.google.different.Feature1"), "nonbase");
-    assertEquals(mapping.featureForClass("com.strange.different.Feature1"), "feature2");
-    assertEquals(mapping.featureForClass("Feature1"), "nonbase");
-    assertEquals(mapping.featureForClass("a.b.z.A"), "nonbase");
-  }
-
-  private void testBaseWildcard(boolean explicitBase) throws FeatureMappingException {
-    List<String> lines =
-        ImmutableList.of(
-            "com.google.Feature1:feature1",
-            explicitBase ? "*:base" : "",
-            "com.strange.*:feature2");
-    FeatureClassMapping mapping = new FeatureClassMapping(lines);
-    assertEquals(mapping.featureForClass("com.google.Feature1"), "feature1");
-    assertEquals(mapping.featureForClass("com.google.different.Feature1"), "base");
-    assertEquals(mapping.featureForClass("com.strange.different.Feature1"), "feature2");
-    assertEquals(mapping.featureForClass("com.stranger.Clazz"), "base");
-    assertEquals(mapping.featureForClass("Feature1"), "base");
-    assertEquals(mapping.featureForClass("a.b.z.A"), "base");
-  }
-
-  @Test
-  public void testWrongLines() throws Exception {
-    // No colon.
-    ensureThrowsMappingException("foo");
-    ensureThrowsMappingException("com.google.base");
-    // Two colons.
-    ensureThrowsMappingException(ImmutableList.of("a:b:c"));
-
-    // Empty identifier.
-    ensureThrowsMappingException("com..google:feature1");
-
-    // Ambiguous redefinition
-    ensureThrowsMappingException(
-        ImmutableList.of("com.google.foo:feature1", "com.google.foo:feature2"));
-    ensureThrowsMappingException(
-        ImmutableList.of("com.google.foo.*:feature1", "com.google.foo.*:feature2"));
-  }
-
-  @Test
-  public void testUsesOnlyExactMappings() throws Exception {
-    List<String> lines =
-        ImmutableList.of(
-            "com.pkg1.Clazz:feature1",
-            "com.pkg2.Clazz:feature2");
-    FeatureClassMapping mapping = new FeatureClassMapping(lines);
-
-    assertEquals(mapping.featureForClass("com.pkg1.Clazz"), "feature1");
-    assertEquals(mapping.featureForClass("com.pkg2.Clazz"), "feature2");
-    assertEquals(mapping.featureForClass("com.pkg1.Other"), mapping.baseName);
-  }
-}
diff --git a/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java b/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
index 402ef93..efcf8a9 100644
--- a/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
+++ b/src/test/java/com/android/tools/r8/utils/codeinspector/CodeInspector.java
@@ -132,6 +132,10 @@
             .read(app.getProguardMapOutputData()));
   }
 
+  public static CodeInspector empty() throws IOException {
+    return new CodeInspector(ImmutableList.of(), null, null);
+  }
+
   private static InternalOptions runOptionsConsumer(Consumer<InternalOptions> optionsConsumer) {
     InternalOptions internalOptions = new InternalOptions();
     if (optionsConsumer != null) {
diff --git a/third_party/internal-apps/youtube_15_33.tar.gz.sha1 b/third_party/internal-apps/youtube_15_33.tar.gz.sha1
deleted file mode 100644
index 9a04d6e..0000000
--- a/third_party/internal-apps/youtube_15_33.tar.gz.sha1
+++ /dev/null
@@ -1 +0,0 @@
-907babdaf04052eed13f22400175307131df1610
\ No newline at end of file
diff --git a/third_party/youtube-developer/20200415.tar.gz.sha1 b/third_party/youtube-developer/20200415.tar.gz.sha1
deleted file mode 100644
index f44d810..0000000
--- a/third_party/youtube-developer/20200415.tar.gz.sha1
+++ /dev/null
@@ -1 +0,0 @@
-bfc2082c67a28dc43c975ccc3b0e10d3d31cae5d
\ No newline at end of file
diff --git a/third_party/youtube/youtube.android_15.33.tar.gz.sha1 b/third_party/youtube/youtube.android_15.33.tar.gz.sha1
deleted file mode 100644
index 3ce1c4a..0000000
--- a/third_party/youtube/youtube.android_15.33.tar.gz.sha1
+++ /dev/null
@@ -1 +0,0 @@
-cdff350c62bf8c72d97be51590e90ad9105b5499
\ No newline at end of file
diff --git a/tools/dexsplitter.py b/tools/dexsplitter.py
deleted file mode 100755
index a97d089..0000000
--- a/tools/dexsplitter.py
+++ /dev/null
@@ -1,10 +0,0 @@
-#!/usr/bin/env python3
-# Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-import sys
-import toolhelper
-
-if __name__ == '__main__':
-  sys.exit(toolhelper.run('dexsplitter', sys.argv[1:]))
diff --git a/tools/golem.py b/tools/golem.py
deleted file mode 100755
index 6a4e399..0000000
--- a/tools/golem.py
+++ /dev/null
@@ -1,59 +0,0 @@
-#!/usr/bin/env python3
-# Copyright (c) 2018, the R8 project authors. Please see the AUTHORS file
-# for details. All rights reserved. Use of this source code is governed by a
-# BSD-style license that can be found in the LICENSE file.
-
-# Utility methods to make running on our performance tracking system easier.
-import os
-import sys
-
-LINKED_THIRD_PARTY_DIRECTORIES = [
-    'android_jar',
-    'android_sdk',
-    'benchmarks',
-    'framework',
-    'gmail',
-    'gmscore',
-    'gradle',
-    'gradle-plugin',
-    'openjdk',
-    'proguard',
-    'proguardsettings',
-    'r8',
-    'remapper',
-    'retrace_benchmark',
-    'sample_libraries',
-    'youtube',
-]
-
-LINKED_TOOL_DIRECTORIES = [
-  'linux/dx',
-]
-
-# Path to our internally updated third party
-THIRD_PARTY_SOURCE = "/usr/local/google/home/golem/r8/third_party"
-TOOLS_SOURCE = "/usr/local/google/home/golem/r8/tools"
-
-def link_third_party():
-  assert os.path.exists('third_party')
-  for dir in LINKED_THIRD_PARTY_DIRECTORIES:
-    src = os.path.join(THIRD_PARTY_SOURCE, dir)
-    dest = os.path.join('third_party', dir)
-    if os.path.exists(dest):
-      raise Exception('Destination "{}" already exists, are you running with'
-                      ' --golem locally'.format(dest))
-    print('Symlinking {} to {}'.format(src, dest))
-    os.symlink(src, dest)
-  for dir in LINKED_TOOL_DIRECTORIES:
-    src = os.path.join(TOOLS_SOURCE, dir)
-    dest = os.path.join('tools', dir)
-    if os.path.exists(dest):
-      raise Exception('Destination "{}" already exists, are you running with'
-                      ' --golem locally'.format(dest))
-    print('Symlinking {} to {}'.format(src, dest))
-    if '/' in dir:
-      os.makedirs(os.path.dirname(dest))
-    os.symlink(src, dest)
-
-if __name__ == '__main__':
-  sys.exit(link_third_party())
diff --git a/tools/keeprule_benchmark.py b/tools/keeprule_benchmark.py
index 4b843c6..1401084 100755
--- a/tools/keeprule_benchmark.py
+++ b/tools/keeprule_benchmark.py
@@ -125,10 +125,6 @@
 def parse_arguments(argv):
   parser = argparse.ArgumentParser(
                     description = 'Run keep-rule benchmarks.')
-  parser.add_argument('--golem',
-                    help = 'Link in third party dependencies.',
-                    default = False,
-                    action = 'store_true')
   parser.add_argument('--ignore-java-version',
                     help='Do not check java version',
                     default=False,
@@ -239,8 +235,6 @@
 
 if __name__ == '__main__':
   options = parse_arguments(sys.argv[1:])
-  if options.golem:
-    golem.link_third_party()
   if not options.ignore_java_version:
     utils.check_java_version()
   with utils.TempDir() as temp:
diff --git a/tools/run_kotlin_benchmarks.py b/tools/run_kotlin_benchmarks.py
index ce0f1ad..86adbe2 100755
--- a/tools/run_kotlin_benchmarks.py
+++ b/tools/run_kotlin_benchmarks.py
@@ -5,7 +5,6 @@
 
 # Script for running kotlin based benchmarks
 
-import golem
 import optparse
 import os
 import subprocess
@@ -45,9 +44,6 @@
                     help='The benchmark to run',
                     default='rgx',
                     choices=['rgx', 'deltablue', 'sta', 'empty'])
-  result.add_option('--golem',
-                    help='Don\'t build r8 and link in third_party deps',
-                    default=False, action='store_true')
   result.add_option('--use-device',
                     help='Run the benchmark on an attaced device',
                     default=False, action='store_true')
@@ -85,8 +81,6 @@
 
 def Main():
   (options, args) = parse_options()
-  if options.golem:
-    golem.link_third_party()
   with utils.TempDir() as temp:
     dex_path = os.path.join(temp, "classes.jar")
     proguard_conf = os.path.join(temp, 'proguard.conf')
@@ -100,7 +94,7 @@
         '--min-api', str(options.api),
         benchmark_jar
     ]
-    toolhelper.run('r8', r8_args, build=not options.golem)
+    toolhelper.run('r8', r8_args, True)
     if options.use_device:
       result = run_art_device(dex_path)
     else:
diff --git a/tools/run_on_app.py b/tools/run_on_app.py
index 8c72939..a0542d4 100755
--- a/tools/run_on_app.py
+++ b/tools/run_on_app.py
@@ -16,7 +16,6 @@
 import gradle
 import gmail_data
 import gmscore_data
-import golem
 import nest_data
 from sanitize_libraries import SanitizeLibraries, SanitizeLibrariesInPgconf
 import toolhelper
@@ -106,10 +105,6 @@
                     type='int',
                     default=0,
                     help='Set timeout instead of waiting for OOM.')
-  result.add_option('--golem',
-                    help='Running on golem, do not build or download',
-                    default=False,
-                    action='store_true')
   result.add_option('--ignore-java-version',
                     help='Do not check java version',
                     default=False,
@@ -138,8 +133,6 @@
                          'Same as --compiler-flags, keeping it for backward'
                          ' compatibility. ' +
                          'If passing several options use a quoted string.')
-  # TODO(tamaskenez) remove track-memory-to-file as soon as we updated golem
-  # to use --print-memoryuse instead
   result.add_option('--track-memory-to-file',
                     help='Track how much memory the jvm is using while ' +
                     ' compiling. Output to the specified file.')
@@ -447,7 +440,7 @@
           raise Exception("Unexpected -libraryjars found in " + pgconf)
 
 def should_build(options):
-  return not options.no_build and not options.golem
+  return not options.no_build
 
 def build_desugared_library_dex(
     options,
@@ -519,9 +512,6 @@
       extra_args.append('-Xmx%sM' % options.max_memory)
     else:
       extra_args.append('-Xmx8G')
-  if options.golem:
-    golem.link_third_party()
-    options.out = os.getcwd()
   if not options.ignore_java_version:
     utils.check_java_version()
 
@@ -743,9 +733,8 @@
   if options.print_dexsegments:
     dex_files = glob(os.path.join(outdir, '*.dex'))
     utils.print_dexsegments(options.print_dexsegments, dex_files)
-    if not options.golem:
-      print('{}-Total(CodeSize): {}'.format(
-              options.print_dexsegments, compute_size_of_dex_files(dex_files)))
+    print('{}-Total(CodeSize): {}'.format(
+            options.print_dexsegments, compute_size_of_dex_files(dex_files)))
   return 0
 
 def compute_size_of_dex_files(dex_files):
diff --git a/tools/run_on_app_dump.py b/tools/run_on_app_dump.py
index b047d72..4f22dc5 100755
--- a/tools/run_on_app_dump.py
+++ b/tools/run_on_app_dump.py
@@ -440,16 +440,6 @@
     'revision': '779cf9e187b8ee2c6b620b2abb4524719b3f10f8',
     'folder': 'android/compose-samples/rally',
   }),
-  App({
-    'id': 'youtube_15_33',
-    'name': 'youtube_15_33',
-    'dump_app': 'dump.zip',
-    'apk_app': 'YouTubeRelease_unsigned.apk',
-    'folder': 'youtube_15_33',
-    'internal': True,
-    # TODO(b/181629268): Fix recompilation
-    'skip_recompilation': True,
-  })
 ]
 
 
diff --git a/tools/test_gradle_benchmarks.py b/tools/test_gradle_benchmarks.py
index d9c00e6..7346830 100755
--- a/tools/test_gradle_benchmarks.py
+++ b/tools/test_gradle_benchmarks.py
@@ -6,7 +6,6 @@
 from __future__ import print_function
 import argparse
 import gradle
-import golem
 import os
 import subprocess
 import sys
@@ -20,9 +19,6 @@
     description='Run D8 or DX on gradle apps located in'
                 ' third_party/benchmarks/.'
                 ' Report Golem-compatible RunTimeRaw values.')
-  parser.add_argument('--golem',
-                      help = 'Running on golem, link in third_party resources.',
-                      default = False, action = 'store_true')
   parser.add_argument('--skip_download',
                     help='Don\'t automatically pull down dependencies.',
                     default=False, action='store_true')
@@ -124,7 +120,7 @@
 
   return any(namePattern in taskname for namePattern in acceptedGradleTasks)
 
-def PrintBuildTimeForGolem(benchmark, stdOut):
+def PrintBuildTime(benchmark, stdOut):
   for line in stdOut.splitlines():
     if 'BENCH' in line and benchmark.moduleName in line:
       commaSplit = line.split(',')
@@ -160,12 +156,6 @@
 
 def Main():
   args = parse_arguments()
-  if args.golem:
-    # Ensure that we don't have a running daemon
-    exitcode = subprocess.call(['pkill', 'java'])
-    assert exitcode == 0 or exitcode == 1
-    golem.link_third_party()
-
   if args.tool == 'd8':
     tool = Benchmark.Tools.D8
     desugarMode = Benchmark.DesugarMode.D8_DESUGARING
@@ -217,7 +207,7 @@
               ['clean']),
 
   ]
-  if not args.skip_download and not args.golem:
+  if not args.skip_download:
     EnsurePresence(os.path.join('third_party', 'benchmarks', 'android-sdk'),
                    'android SDK')
     EnsurePresence(os.path.join('third_party', 'gradle-plugin'),
@@ -232,7 +222,7 @@
       benchmark.EnsurePresence()
     benchmark.Clean()
     stdOut = benchmark.Build(tool, desugarMode)
-    PrintBuildTimeForGolem(benchmark, stdOut)
+    PrintBuildTime(benchmark, stdOut)
 
 
 if __name__ == '__main__':
diff --git a/tools/test_r8cfsegments.py b/tools/test_r8cfsegments.py
index be8e49c..2081ee2 100755
--- a/tools/test_r8cfsegments.py
+++ b/tools/test_r8cfsegments.py
@@ -22,7 +22,6 @@
 
 from __future__ import print_function
 import argparse
-import golem
 import minify_tool
 import os
 import sys
@@ -37,10 +36,6 @@
       choices = ['pg', 'r8'],
       required = True,
       help = 'Compiler tool to use.')
-  parser.add_argument('--golem',
-      help = 'Running on golem, link in third_party resources.',
-      default = False,
-      action = 'store_true')
   parser.add_argument('--name',
       required = True,
       help = 'Results will be printed using the specified benchmark name (e.g.'
@@ -59,8 +54,6 @@
 
 def Main():
   args = parse_arguments()
-  if args.golem:
-    golem.link_third_party()
   utils.check_java_version()
   output_dir = args.output
   with utils.TempDir() as temp_dir:
diff --git a/tools/youtube_data.py b/tools/youtube_data.py
index cd47f66..0dec031 100644
--- a/tools/youtube_data.py
+++ b/tools/youtube_data.py
@@ -5,15 +5,11 @@
 import os
 import utils
 
-ANDROID_H_MR2_API = '13'
 ANDROID_L_API = '21'
 ANDROID_M_API = '23'
 
 BASE = os.path.join(utils.THIRD_PARTY, 'youtube')
 
-V15_33_BASE = os.path.join(BASE, 'youtube.android_15.33')
-V15_33_PREFIX = os.path.join(V15_33_BASE, 'YouTubeRelease')
-
 V16_20_BASE = os.path.join(BASE, 'youtube.android_16.20')
 V16_20_PREFIX = os.path.join(V16_20_BASE, 'YouTubeRelease')
 
@@ -23,37 +19,6 @@
 LATEST_VERSION = '17.19'
 
 VERSIONS = {
-  '15.33': {
-    'dex' : {
-      'inputs': [os.path.join(V15_33_BASE, 'YouTubeRelease_unsigned.apk')],
-      'pgmap': '%s_proguard.map' % V15_33_PREFIX,
-      'libraries' : [utils.get_android_jar(25)],
-      'min-api' : ANDROID_L_API,
-    },
-    'deploy' : {
-      # When -injars and -libraryjars are used for specifying inputs library
-      # sanitization is on by default. For this version of YouTube -injars and
-      # -libraryjars are not used, but library sanitization is still required.
-      'sanitize_libraries': True,
-      'inputs': ['%s_deploy.jar' % V15_33_PREFIX],
-      'libraries' : [os.path.join(V15_33_BASE, 'legacy_YouTubeRelease_combined_library_jars.jar')],
-      'pgconf': [
-          '%s_proguard.config' % V15_33_PREFIX,
-          '%s_proguard_missing_classes.config' % V15_33_PREFIX,
-          '%s/proguardsettings/YouTubeRelease_proguard.config' % utils.THIRD_PARTY,
-          utils.IGNORE_WARNINGS_RULES],
-      'maindexrules' : [
-          os.path.join(V15_33_BASE, 'mainDexClasses.rules'),
-          os.path.join(V15_33_BASE, 'main-dex-classes-release-optimized.pgcfg'),
-          os.path.join(V15_33_BASE, 'main_dex_YouTubeRelease_proguard.cfg')],
-      'min-api' : ANDROID_H_MR2_API,
-    },
-    'proguarded' : {
-      'inputs': ['%s_proguard.jar' % V15_33_PREFIX],
-      'pgmap': '%s_proguard.map' % V15_33_PREFIX,
-      'min-api' : ANDROID_L_API,
-    }
-  },
   '16.20': {
     'deploy' : {
       'sanitize_libraries': False,
