diff --git a/src/test/java/com/android/tools/r8/dexmerger/Class1.java b/src/test/examples/dexmergesample/Class1.java
similarity index 88%
rename from src/test/java/com/android/tools/r8/dexmerger/Class1.java
rename to src/test/examples/dexmergesample/Class1.java
index e87a0e8..18084b2 100644
--- a/src/test/java/com/android/tools/r8/dexmerger/Class1.java
+++ b/src/test/examples/dexmergesample/Class1.java
@@ -2,7 +2,7 @@
 // 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.dexmerger;
+package dexmergesample;
 
 public class Class1 {
   public static void main(String[] args) {
diff --git a/src/test/java/com/android/tools/r8/dexmerger/Class2.java b/src/test/examples/dexmergesample/Class2.java
similarity index 88%
rename from src/test/java/com/android/tools/r8/dexmerger/Class2.java
rename to src/test/examples/dexmergesample/Class2.java
index fe9c125..eaec61f 100644
--- a/src/test/java/com/android/tools/r8/dexmerger/Class2.java
+++ b/src/test/examples/dexmergesample/Class2.java
@@ -2,7 +2,7 @@
 // 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.dexmerger;
+package dexmergesample;
 
 public class Class2 {
   public static void main(String[] args) {
diff --git a/src/test/java/com/android/tools/r8/compatdexbuilder/CompatDexBuilderTests.java b/src/test/java/com/android/tools/r8/compatdexbuilder/CompatDexBuilderTests.java
new file mode 100644
index 0000000..2ab7a0c
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/compatdexbuilder/CompatDexBuilderTests.java
@@ -0,0 +1,102 @@
+// 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.compatdexbuilder;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertTrue;
+
+import com.android.tools.r8.CompilationFailedException;
+import com.android.tools.r8.D8;
+import com.android.tools.r8.D8Command;
+import com.android.tools.r8.D8Output;
+import com.android.tools.r8.ToolHelper;
+import com.android.tools.r8.ToolHelper.ArtCommandBuilder;
+import com.google.common.collect.ImmutableList;
+import java.io.IOException;
+import java.nio.file.Path;
+import java.util.Enumeration;
+import java.util.HashSet;
+import java.util.List;
+import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import java.util.zip.ZipEntry;
+import java.util.zip.ZipFile;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.rules.TemporaryFolder;
+
+public class CompatDexBuilderTests {
+
+  @Rule public TemporaryFolder temp = ToolHelper.getTemporaryFolderForTest();
+
+  @Test
+  public void compileManyClasses() throws IOException, InterruptedException, ExecutionException {
+    final String SUBDIR = "naming001";
+    final String INPUT_JAR = ToolHelper.TESTS_BUILD_DIR + "examples/" + SUBDIR + ".jar";
+    final List<String> CLASS_NAMES =
+        ImmutableList.of(
+            "A",
+            "B",
+            "C",
+            "D",
+            "E",
+            "F",
+            "G",
+            "H",
+            "I",
+            "J",
+            "K",
+            "L",
+            "Reflect2$A",
+            "Reflect2$B",
+            "Reflect2",
+            "Reflect");
+
+    // Run CompatDexBuilder on naming001.jar
+    Path outputZip = temp.getRoot().toPath().resolve("out.zip");
+    CompatDexBuilder.main(
+        new String[] {"--input_jar", INPUT_JAR, "--output_zip", outputZip.toString()});
+    assertTrue(outputZip.toFile().exists());
+
+    // Verify if all the classes have their corresponding ".class.dex" files in the zip.
+    Set<String> expectedNames = new HashSet<>();
+    for (String className : CLASS_NAMES) {
+      expectedNames.add(SUBDIR + "/" + className + ".class.dex");
+    }
+    try (ZipFile zipFile = new ZipFile(outputZip.toFile())) {
+      for (Enumeration<? extends ZipEntry> e = zipFile.entries(); e.hasMoreElements(); ) {
+        ZipEntry ze = e.nextElement();
+        expectedNames.remove(ze.getName());
+      }
+    }
+    assertTrue(expectedNames.isEmpty());
+  }
+
+  @Test
+  public void compileTwoClassesAndRun()
+      throws IOException, InterruptedException, ExecutionException, CompilationFailedException {
+    // Run CompatDexBuilder on dexMergeSample.jar
+    final String INPUT_JAR = ToolHelper.EXAMPLES_BUILD_DIR + "dexmergesample.jar";
+    Path outputZip = temp.getRoot().toPath().resolve("out.zip");
+    CompatDexBuilder.main(
+        new String[] {"--input_jar", INPUT_JAR, "--output_zip", outputZip.toString()});
+
+    // Merge zip content into a single dex file.
+    Path d8OutDir = temp.newFolder().toPath();
+    D8Command.Builder d8CommandBuilder = D8Command.builder().setOutputPath(d8OutDir);
+    d8CommandBuilder.addProgramFiles(outputZip);
+    D8Output d8Output = D8.run(d8CommandBuilder.build());
+    assertEquals(d8Output.getDexResources().size(), 1);
+
+    // Validate by running methods of Class1 and Class2
+    for (String className : new String[] {"Class1", "Class2"}) {
+      ArtCommandBuilder artCommandBuilder = new ArtCommandBuilder();
+      artCommandBuilder.appendClasspath(d8OutDir.resolve("classes.dex").toString());
+      artCommandBuilder.setMainClass("dexmergesample." + className);
+      String out = ToolHelper.runArt(artCommandBuilder);
+      assertEquals(out, className + "\n");
+    }
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/dexmerger/DexMergerTests.java b/src/test/java/com/android/tools/r8/dexmerger/DexMergerTests.java
index f741c91..cddb42d 100644
--- a/src/test/java/com/android/tools/r8/dexmerger/DexMergerTests.java
+++ b/src/test/java/com/android/tools/r8/dexmerger/DexMergerTests.java
@@ -29,8 +29,7 @@
 
 public class DexMergerTests {
 
-  private static final String CLASS_DIR =
-      ToolHelper.TESTS_BUILD_DIR + "../classes/test/com/android/tools/r8/dexmerger";
+  private static final String CLASS_DIR = ToolHelper.EXAMPLES_BUILD_DIR + "classes/dexmergesample";
   private static final String CLASS1_CLASS = CLASS_DIR + "/Class1.class";
   private static final String CLASS2_CLASS = CLASS_DIR + "/Class2.class";
   private static final int MAX_METHOD_COUNT = Constants.U16BIT_MAX;
@@ -63,7 +62,7 @@
     for (String className : new String[] {"Class1", "Class2"}) {
       ArtCommandBuilder builder = new ArtCommandBuilder();
       builder.appendClasspath(outDex.toString());
-      builder.setMainClass("com.android.tools.r8.dexmerger." + className);
+      builder.setMainClass("dexmergesample." + className);
       String out = ToolHelper.runArt(builder);
       assertEquals(out, className + "\n");
     }
