diff --git a/src/test/examplesAndroidO/invokecustom/TestGenerator.java b/src/test/examplesAndroidO/invokecustom/TestGenerator.java
index a4cd89a..4879521 100644
--- a/src/test/examplesAndroidO/invokecustom/TestGenerator.java
+++ b/src/test/examplesAndroidO/invokecustom/TestGenerator.java
@@ -13,6 +13,7 @@
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
 import org.objectweb.asm.ClassReader;
 import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.ClassWriter;
@@ -26,19 +27,24 @@
 public class TestGenerator {
 
   private final Path classNamePath;
+  private final Path outputClassNamePath;
 
   public static void main(String[] args) throws IOException {
-    assert args.length == 1;
-    TestGenerator testGenerator = new TestGenerator(Paths.get(args[0],
-        TestGenerator.class.getPackage().getName(), InvokeCustom.class.getSimpleName() + ".class"));
+    assert args.length == 2;
+    String fileName = InvokeCustom.class.getSimpleName() + ".class";
+    Path inputFile = Paths.get(args[0], TestGenerator.class.getPackage().getName(), fileName);
+    Path outputFile = Paths.get(args[1], fileName);
+    TestGenerator testGenerator = new TestGenerator(inputFile, outputFile);
     testGenerator.generateTests();
   }
 
-  public TestGenerator(Path classNamePath) {
+  public TestGenerator(Path classNamePath, Path outputClassNamePath) {
     this.classNamePath = classNamePath;
+    this.outputClassNamePath = outputClassNamePath;
   }
 
   private void generateTests() throws IOException {
+    Files.createDirectories(outputClassNamePath.getParent());
     try (InputStream input = Files.newInputStream(classNamePath)) {
       ClassReader cr = new ClassReader(input);
       ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
@@ -63,7 +69,8 @@
               super.visitEnd();
             }
           }, 0);
-      try (OutputStream output = Files.newOutputStream(classNamePath)) {
+      try (OutputStream output =
+          Files.newOutputStream(outputClassNamePath, StandardOpenOption.CREATE)) {
         output.write(cw.toByteArray());
       }
     }
diff --git a/src/test/examplesAndroidO/invokecustom2/TestGenerator.java b/src/test/examplesAndroidO/invokecustom2/TestGenerator.java
index 377084e..2a4eba4 100644
--- a/src/test/examplesAndroidO/invokecustom2/TestGenerator.java
+++ b/src/test/examplesAndroidO/invokecustom2/TestGenerator.java
@@ -14,6 +14,7 @@
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
 import org.objectweb.asm.ClassReader;
 import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.ClassWriter;
@@ -25,19 +26,24 @@
 public class TestGenerator {
 
   private final Path classNamePath;
+  private final Path outputClassNamePath;
 
   public static void main(String[] args) throws IOException {
-    assert args.length == 1;
-    TestGenerator testGenerator = new TestGenerator(Paths.get(args[0],
-        TestGenerator.class.getPackage().getName(), InvokeCustom.class.getSimpleName() + ".class"));
+    assert args.length == 2;
+    String fileName = invokecustom.InvokeCustom.class.getSimpleName() + ".class";
+    Path inputFile = Paths.get(args[0], TestGenerator.class.getPackage().getName(), fileName);
+    Path outputFile = Paths.get(args[1], fileName);
+    TestGenerator testGenerator = new TestGenerator(inputFile, outputFile);
     testGenerator.generateTests();
   }
 
-  public TestGenerator(Path classNamePath) {
+  public TestGenerator(Path classNamePath, Path outputClassNamePath) {
     this.classNamePath = classNamePath;
+    this.outputClassNamePath = outputClassNamePath;
   }
 
   private void generateTests() throws IOException {
+    Files.createDirectories(outputClassNamePath.getParent());
     try (InputStream input = Files.newInputStream(classNamePath)) {
       ClassReader cr = new ClassReader(input);
       ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
@@ -58,7 +64,8 @@
               super.visitEnd();
             }
           }, 0);
-      try (OutputStream output = Files.newOutputStream(classNamePath)) {
+      try (OutputStream output =
+          Files.newOutputStream(outputClassNamePath, StandardOpenOption.CREATE)) {
         output.write(cw.toByteArray());
       }
     }
diff --git a/src/test/examplesAndroidO/stringconcat/TestGenerator.java b/src/test/examplesAndroidO/stringconcat/TestGenerator.java
index 72bdfbf..4755c4d 100644
--- a/src/test/examplesAndroidO/stringconcat/TestGenerator.java
+++ b/src/test/examplesAndroidO/stringconcat/TestGenerator.java
@@ -12,6 +12,7 @@
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
 import java.util.ArrayList;
 import java.util.List;
 import org.objectweb.asm.ClassReader;
@@ -40,13 +41,16 @@
       false);
 
   public static void main(String[] args) throws IOException {
-    assert args.length == 1;
-    generateTests(Paths.get(args[0],
-        TestGenerator.class.getPackage().getName(),
-        StringConcat.class.getSimpleName() + ".class"));
+    assert args.length == 2;
+    String fileName = StringConcat.class.getSimpleName() + ".class";
+    Path inputFile = Paths.get(args[0], TestGenerator.class.getPackage().getName(), fileName);
+    Path outputFile = Paths.get(args[1], fileName);
+    generateTests(inputFile, outputFile);
   }
 
-  private static void generateTests(Path classNamePath) throws IOException {
+  private static void generateTests(Path classNamePath, Path outputClassNamePath)
+      throws IOException {
+    Files.createDirectories(outputClassNamePath.getParent());
     try (InputStream input = Files.newInputStream(classNamePath)) {
       ClassReader cr = new ClassReader(input);
       ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
@@ -221,7 +225,8 @@
               };
             }
           }, 0);
-      try (OutputStream output = Files.newOutputStream(classNamePath)) {
+      try (OutputStream output =
+          Files.newOutputStream(outputClassNamePath, StandardOpenOption.CREATE)) {
         output.write(cw.toByteArray());
       }
     }
diff --git a/src/test/examplesAndroidP/invokecustom/TestGenerator.java b/src/test/examplesAndroidP/invokecustom/TestGenerator.java
index b08441c..ef5f8de 100644
--- a/src/test/examplesAndroidP/invokecustom/TestGenerator.java
+++ b/src/test/examplesAndroidP/invokecustom/TestGenerator.java
@@ -13,6 +13,7 @@
 import java.nio.file.Files;
 import java.nio.file.Path;
 import java.nio.file.Paths;
+import java.nio.file.StandardOpenOption;
 import org.objectweb.asm.ClassReader;
 import org.objectweb.asm.ClassVisitor;
 import org.objectweb.asm.ClassWriter;
@@ -24,19 +25,24 @@
 public class TestGenerator {
 
   private final Path classNamePath;
+  private final Path outputClassNamePath;
 
   public static void main(String[] args) throws IOException {
-    assert args.length == 1;
-    TestGenerator testGenerator = new TestGenerator(Paths.get(args[0],
-        TestGenerator.class.getPackage().getName(), InvokeCustom.class.getSimpleName() + ".class"));
+    assert args.length == 2;
+    String fileName = InvokeCustom.class.getSimpleName() + ".class";
+    Path inputFile = Paths.get(args[0], TestGenerator.class.getPackage().getName(), fileName);
+    Path outputFile = Paths.get(args[1], fileName);
+    TestGenerator testGenerator = new TestGenerator(inputFile, outputFile);
     testGenerator.generateTests();
   }
 
-  public TestGenerator(Path classNamePath) {
+  public TestGenerator(Path classNamePath, Path outputClassNamePath) {
     this.classNamePath = classNamePath;
+    this.outputClassNamePath = outputClassNamePath;
   }
 
   private void generateTests() throws IOException {
+    Files.createDirectories(outputClassNamePath.getParent());
     try (InputStream inputStream = Files.newInputStream(classNamePath)) {
       ClassReader cr = new ClassReader(inputStream);
       ClassWriter cw = new ClassWriter(ClassWriter.COMPUTE_MAXS | ClassWriter.COMPUTE_FRAMES);
@@ -52,7 +58,8 @@
               super.visitEnd();
             }
           }, 0);
-      try (OutputStream output = Files.newOutputStream(classNamePath)) {
+      try (OutputStream output =
+          Files.newOutputStream(outputClassNamePath, StandardOpenOption.CREATE)) {
         output.write(cw.toByteArray());
       }
     }
diff --git a/src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java b/src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java
index dd3311b..d3a155f 100644
--- a/src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java
+++ b/src/test/java/com/android/tools/r8/D8IncrementalRunExamplesAndroidOTest.java
@@ -33,6 +33,7 @@
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
+import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Set;
@@ -130,14 +131,22 @@
     }
 
     private List<String> collectClassFiles(Path testJarFile) {
-      List<String> result = new ArrayList<>();
+      Map<String, String> result = new HashMap<>();
       // Collect Java 8 classes.
-      visitFiles(getClassesRoot(testJarFile), path -> result.add(path.toString()));
+      visitFiles(
+          getClassesRoot(testJarFile),
+          path -> result.put(path.toFile().getName(), path.toString()));
+      // Collect generated classes, overwrite non-generated files.
+      visitFiles(
+          getGeneratedRoot(testJarFile),
+          path -> result.put(path.toFile().getName(), path.toString()));
       // Collect legacy classes.
       visitFiles(
-          getLegacyClassesRoot(testJarFile, packageName), path -> result.add(path.toString()));
-      Collections.sort(result);
-      return result;
+          getLegacyClassesRoot(testJarFile, packageName),
+          path -> result.put(path.toFile().getName(), path.toString()));
+      List<String> files = new ArrayList<>(result.values());
+      Collections.sort(files);
+      return files;
     }
 
     Path getClassesRoot(Path testJarFile) {
@@ -145,6 +154,12 @@
       return parent.resolve(Paths.get("classes", packageName));
     }
 
+    Path getGeneratedRoot(Path testJarFile) {
+      String sourceSet = testJarFile.getParent().toFile().getName();
+      Path parent = testJarFile.getParent().getParent().getParent();
+      return parent.resolve(Paths.get("generated", sourceSet, packageName));
+    }
+
     AndroidApp compileClassFilesInIntermediate(
         Path testJarFile, List<String> inputFiles, Path outputPath, OutputMode outputMode)
         throws Throwable {
