diff --git a/build.gradle b/build.gradle
index 8a5830d..7fcbda6 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1165,6 +1165,23 @@
     includeEmptyDirs = false
 }
 
+task buildPreNJdwpTestsDex(type: Exec, dependsOn: "buildPreNJdwpTestsJar") {
+    def inFile = buildPreNJdwpTestsJar.archivePath
+    def outFile = new File(buildPreNJdwpTestsJar.destinationDir, buildPreNJdwpTestsJar.baseName + '-dex.jar')
+    inputs.file inFile
+    outputs.file outFile
+    if (OperatingSystem.current().isWindows()) {
+        executable file("tools/windows/dx/bin/dx.bat")
+    } else if (OperatingSystem.current().isMacOsX()) {
+        executable file("tools/mac/dx/bin/dx");
+    } else {
+        executable file("tools/linux/dx/bin/dx");
+    }
+    args "--dex"
+    args "--output=${outFile}"
+    args inFile
+}
+
 task supportLibDir() {
     doLast {
         File dir = file("build/supportlibraries")
diff --git a/src/test/java/com/android/tools/r8/ToolHelper.java b/src/test/java/com/android/tools/r8/ToolHelper.java
index 321e712..ea1a6c6 100644
--- a/src/test/java/com/android/tools/r8/ToolHelper.java
+++ b/src/test/java/com/android/tools/r8/ToolHelper.java
@@ -448,7 +448,7 @@
         minSdkVersion == AndroidApiLevel.getDefault().getLevel() ? DEFAULT_MIN_SDK : minSdkVersion);
   }
 
-  public static Path getJdwpTestsJarPath(int minSdk) {
+  public static Path getJdwpTestsCfJarPath(int minSdk) {
     if (minSdk >= AndroidApiLevel.N.getLevel()) {
       return Paths.get("third_party", "jdwp-tests", "apache-harmony-jdwp-tests-host.jar");
     } else {
@@ -456,6 +456,14 @@
     }
   }
 
+  public static Path getJdwpTestsDexJarPath(int minSdk) {
+    if (minSdk >= AndroidApiLevel.N.getLevel()) {
+      return Paths.get("third_party", "jdwp-tests", "apache-harmony-jdwp-tests-hostdex.jar");
+    } else {
+      return Paths.get(ToolHelper.BUILD_DIR, "libs", "jdwp-tests-preN-dex.jar");
+    }
+  }
+
   static class RetainedTemporaryFolder extends TemporaryFolder {
 
     RetainedTemporaryFolder(java.io.File parentFolder) {
diff --git a/src/test/java/com/android/tools/r8/debug/BlockReorderingTest.java b/src/test/java/com/android/tools/r8/debug/BlockReorderingTest.java
index cdc3ae4..4d4844f 100644
--- a/src/test/java/com/android/tools/r8/debug/BlockReorderingTest.java
+++ b/src/test/java/com/android/tools/r8/debug/BlockReorderingTest.java
@@ -29,11 +29,12 @@
   public static void setup() throws Exception {
     // Force inversion of all conditionals to reliably construct a regression test for incorrect
     // line information when reordering blocks.
-    d8Config = new D8DebugTestConfig(temp);
-    d8Config.compileAndAddPaths(
-        temp,
-        Collections.singletonList(DEBUGGEE_JAR),
-        options -> options.testing.invertConditionals = true);
+    d8Config =
+        new D8DebugTestConfig()
+            .compileAndAdd(
+                temp,
+                Collections.singletonList(DEBUGGEE_JAR),
+                options -> options.testing.invertConditionals = true);
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/debug/CfDebugTestConfig.java b/src/test/java/com/android/tools/r8/debug/CfDebugTestConfig.java
index ac1852c..6049b7d 100644
--- a/src/test/java/com/android/tools/r8/debug/CfDebugTestConfig.java
+++ b/src/test/java/com/android/tools/r8/debug/CfDebugTestConfig.java
@@ -10,9 +10,11 @@
 import java.util.Collections;
 import java.util.List;
 
+/** Base test configuration with CF version of JDWP. */
 public class CfDebugTestConfig extends DebugTestConfig {
 
-  public static final Path JDWP_JAR = ToolHelper.getJdwpTestsJarPath(AndroidApiLevel.N.getLevel());
+  public static final Path JDWP_JAR =
+      ToolHelper.getJdwpTestsCfJarPath(AndroidApiLevel.N.getLevel());
 
   public CfDebugTestConfig() {
     this(Collections.emptyList());
@@ -28,7 +30,7 @@
   }
 
   @Override
-  public RuntimeKind getRuntimeKind() {
+  public final RuntimeKind getRuntimeKind() {
     return RuntimeKind.CF;
   }
 }
diff --git a/src/test/java/com/android/tools/r8/debug/D8DebugTestConfig.java b/src/test/java/com/android/tools/r8/debug/D8DebugTestConfig.java
index 7e5ecc9..3edaaaf 100644
--- a/src/test/java/com/android/tools/r8/debug/D8DebugTestConfig.java
+++ b/src/test/java/com/android/tools/r8/debug/D8DebugTestConfig.java
@@ -11,30 +11,13 @@
 import com.android.tools.r8.utils.OutputMode;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.util.Collections;
+import java.util.Arrays;
 import java.util.List;
 import java.util.function.Consumer;
 import org.junit.rules.TemporaryFolder;
 
-/**
- * Base test configuration for running a DEX debuggee with a D8 compiled version of JDWP.
- *
- * <p>This class also provides utilities for compiling with D8 and adding it to the classpath.
- */
-public class D8DebugTestConfig extends DebugTestConfig {
-
-  public static final Path JDWP_JAR =
-      ToolHelper.getJdwpTestsJarPath(ToolHelper.getMinApiLevelForDexVm(ToolHelper.getDexVm()));
-
-  // Internal cache to avoid multiple compilations of the base JDWP code.
-  private static AndroidApp compiledJdwp = null;
-
-  private static synchronized AndroidApp getCompiledJdwp() {
-    if (compiledJdwp == null) {
-      compiledJdwp = d8Compile(Collections.singletonList(JDWP_JAR), null);
-    }
-    return compiledJdwp;
-  }
+/** Test configuration with utilities for compiling with D8 and adding results to the classpath. */
+public class D8DebugTestConfig extends DexDebugTestConfig {
 
   public static AndroidApp d8Compile(List<Path> paths, Consumer<InternalOptions> optionsConsumer) {
     try {
@@ -52,42 +35,21 @@
     }
   }
 
-  public static D8DebugTestConfig fromUncompiledPaths(TemporaryFolder temp, List<Path> paths) {
-    D8DebugTestConfig config = new D8DebugTestConfig(temp);
-    config.compileAndAddPaths(temp, paths);
-    return config;
+  public D8DebugTestConfig compileAndAdd(TemporaryFolder temp, Path... paths) {
+    return compileAndAdd(temp, Arrays.asList(paths), null);
   }
 
-  public static D8DebugTestConfig fromCompiledPaths(TemporaryFolder temp, List<Path> paths) {
-    D8DebugTestConfig config = new D8DebugTestConfig(temp);
-    config.addPaths(paths);
-    return config;
+  public D8DebugTestConfig compileAndAdd(TemporaryFolder temp, List<Path> paths) {
+    return compileAndAdd(temp, paths, null);
   }
 
-  public D8DebugTestConfig(TemporaryFolder temp) {
-    try {
-      Path out = temp.newFolder().toPath().resolve("d8_jdwp.jar");
-      getCompiledJdwp().write(out, OutputMode.Indexed);
-    } catch (Throwable e) {
-      throw new RuntimeException(e);
-    }
-  }
-
-  @Override
-  public RuntimeKind getRuntimeKind() {
-    return RuntimeKind.DEX;
-  }
-
-  public void compileAndAddPaths(TemporaryFolder temp, List<Path> paths) {
-    compileAndAddPaths(temp, paths, null);
-  }
-
-  public void compileAndAddPaths(
+  public D8DebugTestConfig compileAndAdd(
       TemporaryFolder temp, List<Path> paths, Consumer<InternalOptions> optionsConsumer) {
     try {
       Path out = temp.newFolder().toPath().resolve("d8_compiled.jar");
       d8Compile(paths, optionsConsumer).write(out, OutputMode.Indexed);
       addPaths(out);
+      return this;
     } catch (Exception e) {
       throw new RuntimeException(e);
     }
diff --git a/src/test/java/com/android/tools/r8/debug/D8DebugTestResourcesConfig.java b/src/test/java/com/android/tools/r8/debug/D8DebugTestResourcesConfig.java
index 4989df2..3534cad 100644
--- a/src/test/java/com/android/tools/r8/debug/D8DebugTestResourcesConfig.java
+++ b/src/test/java/com/android/tools/r8/debug/D8DebugTestResourcesConfig.java
@@ -22,7 +22,6 @@
   }
 
   public D8DebugTestResourcesConfig(TemporaryFolder temp) {
-    super(temp);
     try {
       Path path = temp.newFolder().toPath().resolve("d8_debug_test_resources.jar");
       getCompiledResources().write(path, OutputMode.Indexed);
diff --git a/src/test/java/com/android/tools/r8/debug/DebugInfoWhenInliningTest.java b/src/test/java/com/android/tools/r8/debug/DebugInfoWhenInliningTest.java
index a693f4e..cf7d10b 100644
--- a/src/test/java/com/android/tools/r8/debug/DebugInfoWhenInliningTest.java
+++ b/src/test/java/com/android/tools/r8/debug/DebugInfoWhenInliningTest.java
@@ -33,9 +33,7 @@
             .setOutputPath(outjar)
             .build(),
         options -> options.lineNumberOptimization = lineNumberOptimization);
-    DebugTestConfig config = new D8DebugTestConfig(temp);
-    config.addPaths(outjar);
-    return config;
+    return new DexDebugTestConfig(outjar);
   }
 
   @Test
diff --git a/src/test/java/com/android/tools/r8/debug/DexDebugTestConfig.java b/src/test/java/com/android/tools/r8/debug/DexDebugTestConfig.java
new file mode 100644
index 0000000..27e3d30
--- /dev/null
+++ b/src/test/java/com/android/tools/r8/debug/DexDebugTestConfig.java
@@ -0,0 +1,35 @@
+// 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.debug;
+
+import com.android.tools.r8.ToolHelper;
+import java.nio.file.Path;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
+/** Base test configuration with DEX version of JDWP. */
+public class DexDebugTestConfig extends DebugTestConfig {
+
+  public static final Path JDWP_DEX_JAR =
+      ToolHelper.getJdwpTestsDexJarPath(ToolHelper.getMinApiLevelForDexVm(ToolHelper.getDexVm()));
+
+  public DexDebugTestConfig() {
+    this(Collections.emptyList());
+  }
+
+  public DexDebugTestConfig(Path... paths) {
+    this(Arrays.asList(paths));
+  }
+
+  public DexDebugTestConfig(List<Path> paths) {
+    addPaths(JDWP_DEX_JAR);
+    addPaths(paths);
+  }
+
+  @Override
+  public final RuntimeKind getRuntimeKind() {
+    return RuntimeKind.DEX;
+  }
+}
diff --git a/src/test/java/com/android/tools/r8/debug/InterfaceMethodTest.java b/src/test/java/com/android/tools/r8/debug/InterfaceMethodTest.java
index c4cf839..c5c21a7 100644
--- a/src/test/java/com/android/tools/r8/debug/InterfaceMethodTest.java
+++ b/src/test/java/com/android/tools/r8/debug/InterfaceMethodTest.java
@@ -9,7 +9,6 @@
 import java.nio.file.Path;
 import java.util.ArrayList;
 import java.util.Collection;
-import java.util.Collections;
 import java.util.List;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -25,14 +24,8 @@
   @Parameters(name = "{0}")
   public static Collection configs() {
     ImmutableList.Builder<Object[]> builder = ImmutableList.builder();
-    DelayedDebugTestConfig cfConfig = temp -> {
-      DebugTestConfig config = new CfDebugTestConfig();
-      config.addPaths(JAR);
-      return config;
-    };
-    DelayedDebugTestConfig d8Config = temp -> {
-      return D8DebugTestConfig.fromUncompiledPaths(temp, Collections.singletonList(JAR));
-    };
+    DelayedDebugTestConfig cfConfig = temp -> new CfDebugTestConfig(JAR);
+    DelayedDebugTestConfig d8Config = temp -> new D8DebugTestConfig().compileAndAdd(temp, JAR);
     builder.add(new Object[]{"CF", cfConfig});
     builder.add(new Object[]{"D8", d8Config});
     return builder.build();
diff --git a/src/test/java/com/android/tools/r8/debug/JasminDebugTest.java b/src/test/java/com/android/tools/r8/debug/JasminDebugTest.java
index 91d97aa..f4ffc59 100644
--- a/src/test/java/com/android/tools/r8/debug/JasminDebugTest.java
+++ b/src/test/java/com/android/tools/r8/debug/JasminDebugTest.java
@@ -36,7 +36,7 @@
   public void testUselessCheckcastD8() throws Throwable {
     JasminBuilder builder = getBuilderForUselessCheckcast(className, methodName);
     List<Path> outputs = builder.writeClassFiles(temp.newFolder().toPath());
-    runUselessCheckcast(D8DebugTestConfig.fromUncompiledPaths(temp, outputs));
+    runUselessCheckcast(new D8DebugTestConfig().compileAndAdd(temp, outputs));
   }
 
   private void runUselessCheckcast(DebugTestConfig config) throws Throwable {
diff --git a/src/test/java/com/android/tools/r8/debug/KotlinDebugTestBase.java b/src/test/java/com/android/tools/r8/debug/KotlinDebugTestBase.java
index 065686c..cbbcfb0 100644
--- a/src/test/java/com/android/tools/r8/debug/KotlinDebugTestBase.java
+++ b/src/test/java/com/android/tools/r8/debug/KotlinDebugTestBase.java
@@ -4,14 +4,13 @@
 
 package com.android.tools.r8.debug;
 
-import com.android.tools.r8.CompilationMode;
-import com.android.tools.r8.D8Command;
 import com.android.tools.r8.ToolHelper;
 import com.android.tools.r8.utils.AndroidApp;
 import com.android.tools.r8.utils.OutputMode;
 import java.nio.file.Path;
 import java.nio.file.Paths;
 import java.util.Arrays;
+import java.util.Collections;
 import java.util.List;
 import org.apache.harmony.jpda.tests.framework.jdwp.Frame.Variable;
 import org.apache.harmony.jpda.tests.framework.jdwp.Location;
@@ -32,21 +31,14 @@
 
     private static synchronized AndroidApp getCompiledResources() throws Throwable {
       if (compiledResources == null) {
-        int minSdk = ToolHelper.getMinApiLevelForDexVm(ToolHelper.getDexVm());
         compiledResources =
-            ToolHelper.runD8(
-                D8Command.builder()
-                    .addProgramFiles(DEBUGGEE_KOTLIN_JAR)
-                    .setMinApiLevel(minSdk)
-                    .setMode(CompilationMode.DEBUG)
-                    .addLibraryFiles(Paths.get(ToolHelper.getAndroidJar(minSdk)))
-                    .build());
+            D8DebugTestConfig.d8Compile(Collections.singletonList(DEBUGGEE_KOTLIN_JAR), null);
       }
       return compiledResources;
     }
 
     public KotlinD8Config(TemporaryFolder temp) {
-      super(temp);
+      super();
       try {
         Path out = temp.newFolder().toPath().resolve("d8_debug_test_resources_kotlin.jar");
         getCompiledResources().write(out, OutputMode.Indexed);
diff --git a/src/test/java/com/android/tools/r8/debug/LambdaTest.java b/src/test/java/com/android/tools/r8/debug/LambdaTest.java
index fc59c51..1b413ba 100644
--- a/src/test/java/com/android/tools/r8/debug/LambdaTest.java
+++ b/src/test/java/com/android/tools/r8/debug/LambdaTest.java
@@ -7,7 +7,6 @@
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.util.Collection;
-import java.util.Collections;
 import org.junit.Assert;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -24,14 +23,8 @@
   @Parameters(name = "{0}")
   public static Collection configs() {
     ImmutableList.Builder<Object[]> builder = ImmutableList.builder();
-    DelayedDebugTestConfig cfConfig = temp -> {
-      DebugTestConfig config = new CfDebugTestConfig();
-      config.addPaths(JAR);
-      return config;
-    };
-    DelayedDebugTestConfig d8Config = temp -> {
-      return D8DebugTestConfig.fromUncompiledPaths(temp, Collections.singletonList(JAR));
-    };
+    DelayedDebugTestConfig cfConfig = temp -> new CfDebugTestConfig(JAR);
+    DelayedDebugTestConfig d8Config = temp -> new D8DebugTestConfig().compileAndAdd(temp, JAR);
     builder.add(new Object[]{"CF", cfConfig});
     builder.add(new Object[]{"D8", d8Config});
     return builder.build();
diff --git a/src/test/java/com/android/tools/r8/debug/LineNumberOptimizationTest.java b/src/test/java/com/android/tools/r8/debug/LineNumberOptimizationTest.java
index b5221f2..0f6975b 100644
--- a/src/test/java/com/android/tools/r8/debug/LineNumberOptimizationTest.java
+++ b/src/test/java/com/android/tools/r8/debug/LineNumberOptimizationTest.java
@@ -33,7 +33,7 @@
           options.lineNumberOptimization = lineNumberOptimization;
           options.inlineAccessors = false;
         });
-    DebugTestConfig config = new D8DebugTestConfig(temp);
+    DebugTestConfig config = new D8DebugTestConfig();
     config.addPaths(outjar);
     return config;
   }
diff --git a/src/test/java/com/android/tools/r8/debug/MinificationTest.java b/src/test/java/com/android/tools/r8/debug/MinificationTest.java
index e2d366a..7acd0e0 100644
--- a/src/test/java/com/android/tools/r8/debug/MinificationTest.java
+++ b/src/test/java/com/android/tools/r8/debug/MinificationTest.java
@@ -84,9 +84,7 @@
     }
     ToolHelper.runR8(builder.build());
 
-    D8DebugTestConfig config =
-        D8DebugTestConfig.fromCompiledPaths(
-            temp, Collections.singletonList(dexOutputDir.resolve("classes.dex")));
+    DexDebugTestConfig config = new DexDebugTestConfig(dexOutputDir.resolve("classes.dex"));
     config.setProguardMap(proguardMap);
     return config;
   }
diff --git a/src/test/java/com/android/tools/r8/debug/SmaliDebugTest.java b/src/test/java/com/android/tools/r8/debug/SmaliDebugTest.java
index e830164..262297c 100644
--- a/src/test/java/com/android/tools/r8/debug/SmaliDebugTest.java
+++ b/src/test/java/com/android/tools/r8/debug/SmaliDebugTest.java
@@ -46,7 +46,7 @@
   public void testSimpleIf() throws Throwable {
     String methodName = "simpleIf";
     runDebugTest(
-        D8DebugTestConfig.fromCompiledPaths(temp, buildSimpleIf(methodName)),
+        new DexDebugTestConfig(buildSimpleIf(methodName)),
         CLASS,
         breakpoint(CLASS, methodName),
         run(),
@@ -129,7 +129,7 @@
 
     // Run debugger to verify that we step to line 4 and the values of v0 and v1 are unchanged.
     runDebugTest(
-        D8DebugTestConfig.fromCompiledPaths(temp, outs),
+        new DexDebugTestConfig(outs),
         CLASS,
         breakpoint(CLASS, methodName),
         run(),
diff --git a/src/test/java/com/android/tools/r8/jdwp/RunJdwpTests.java b/src/test/java/com/android/tools/r8/jdwp/RunJdwpTests.java
index 4b011a2..9b5b618 100644
--- a/src/test/java/com/android/tools/r8/jdwp/RunJdwpTests.java
+++ b/src/test/java/com/android/tools/r8/jdwp/RunJdwpTests.java
@@ -29,11 +29,7 @@
 import org.junit.Test;
 import org.junit.rules.TemporaryFolder;
 
-/**
- * Wrapper for the art JDWP tests.
- *
- * A new version of this file can be generated using ./tools/create-jdwp-tests.py.
- */
+/** Wrapper for the art JDWP tests. */
 public class RunJdwpTests {
 
   enum Tool {
@@ -238,7 +234,7 @@
   public static void compileLibraries() throws Exception {
     // Selects appropriate jar according to min api level for the selected runtime.
     int minApi = ToolHelper.getMinApiLevelForDexVm(ToolHelper.getDexVm());
-    Path jdwpTestsJar = ToolHelper.getJdwpTestsJarPath(minApi);
+    Path jdwpTestsJar = ToolHelper.getJdwpTestsCfJarPath(minApi);
 
     d8Out = temp.newFolder("d8-out");
     D8.run(
diff --git a/src/test/java/com/android/tools/r8/naming/RenameSourceFileDebugTest.java b/src/test/java/com/android/tools/r8/naming/RenameSourceFileDebugTest.java
index 72444d2..461f408 100644
--- a/src/test/java/com/android/tools/r8/naming/RenameSourceFileDebugTest.java
+++ b/src/test/java/com/android/tools/r8/naming/RenameSourceFileDebugTest.java
@@ -6,13 +6,12 @@
 import com.android.tools.r8.CompilationMode;
 import com.android.tools.r8.R8Command;
 import com.android.tools.r8.ToolHelper;
-import com.android.tools.r8.debug.D8DebugTestConfig;
 import com.android.tools.r8.debug.DebugTestBase;
 import com.android.tools.r8.debug.DebugTestConfig;
+import com.android.tools.r8.debug.DexDebugTestConfig;
 import com.google.common.collect.ImmutableList;
 import java.nio.file.Path;
 import java.nio.file.Paths;
-import java.util.Collections;
 import org.junit.BeforeClass;
 import org.junit.Test;
 
@@ -43,7 +42,7 @@
                   pg.addKeepAttributePatterns(ImmutableList.of("SourceFile", "LineNumberTable"));
                 })
             .build());
-    config = D8DebugTestConfig.fromCompiledPaths(temp, Collections.singletonList(outjar));
+    config = new DexDebugTestConfig(outjar);
   }
 
   /**
