diff --git a/src/test/kotlin/io/bazel/kotlin/builder/BUILD b/src/test/kotlin/io/bazel/kotlin/builder/BUILD
index ee20997..9a554b2 100644
--- a/src/test/kotlin/io/bazel/kotlin/builder/BUILD
+++ b/src/test/kotlin/io/bazel/kotlin/builder/BUILD
@@ -27,6 +27,7 @@
     name = "test_lib",
     testonly = 1,
     srcs = [
+        "Dep.java",
         "KotlinBuilderJsTestTask.java",
         "KotlinBuilderJvmTestTask.java",
         "KotlinBuilderResource.java",
@@ -43,7 +44,9 @@
         "@com_github_jetbrains_kotlin//:kotlin-reflect",
         "@com_github_jetbrains_kotlin//:kotlin-stdlib",
     ],
-    deps = _COMMON_DEPS,
+    deps = _COMMON_DEPS + [
+        "//third_party:autovalue",
+    ],
 )
 
 kt_rules_test(
@@ -57,16 +60,21 @@
 )
 
 kt_rules_test(
-    name = "KotlinBuilderJvmTest",
-    srcs = ["tasks/jvm/KotlinBuilderJvmTest.java"],
+    name = "KotlinBuilderJvmBasicTest",
+    srcs = ["tasks/jvm/KotlinBuilderJvmBasicTest.java"],
+)
+
+kt_rules_test(
+    name = "KotlinBuilderJvmKaptTest",
+    srcs = ["tasks/jvm/KotlinBuilderJvmKaptTest.java"],
     data = [
         "//third_party/jvm/com/google/auto/value:auto_value",
-    ],
+    ]
 )
 
 kt_rules_test(
     name = "KotlinBuilderJsTest",
-    srcs = ["tasks/js/KotlinBuilderJsTest.java"],
+    srcs = ["tasks/js/KotlinBuilderJsTest.java"]
 )
 
 test_suite(
@@ -74,7 +82,8 @@
     tests = [
         ":JdepsParserTest",
         ":KotlinBuilderJsTest",
-        ":KotlinBuilderJvmTest",
+        ":KotlinBuilderJvmKaptTest",
+        ":KotlinBuilderJvmBasicTest",
         ":SourceJarCreatorTest",
     ],
     visibility = ["//visibility:public"],
diff --git a/src/test/kotlin/io/bazel/kotlin/builder/Dep.java b/src/test/kotlin/io/bazel/kotlin/builder/Dep.java
new file mode 100644
index 0000000..4a3e1d4
--- /dev/null
+++ b/src/test/kotlin/io/bazel/kotlin/builder/Dep.java
@@ -0,0 +1,78 @@
+/*
+ * Copyright 2018 The Bazel Authors. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.bazel.kotlin.builder;
+
+import com.google.auto.value.AutoValue;
+import com.google.common.collect.ImmutableSet;
+import io.bazel.kotlin.builder.utils.BazelRunFiles;
+
+import java.util.Optional;
+import java.util.Set;
+import java.util.stream.Stream;
+
+@SuppressWarnings({"WeakerAccess", "unused"})
+@AutoValue
+public abstract class Dep {
+  public abstract String label();
+
+  public abstract String moduleName();
+
+  public abstract Set<String> runtimeDeps();
+
+  public abstract Set<String> compileJars();
+
+  public static Builder builder() {
+    return new AutoValue_Dep.Builder().runtimeDeps(ImmutableSet.of());
+  }
+
+  @SuppressWarnings("UnusedReturnValue")
+  @AutoValue.Builder
+  public abstract static class Builder {
+    public abstract Builder compileJars(Set<String> compileJars);
+
+    public abstract Builder label(String label);
+
+    public abstract Builder runtimeDeps(Set<String> runtimeDeps);
+
+    public abstract Builder moduleName(String moduleName);
+
+    abstract String label();
+
+    abstract Optional<String> moduleName();
+
+    abstract Dep autoBuild();
+
+    public Dep build() {
+      if (!moduleName().isPresent()) {
+        moduleName(label());
+      }
+      return autoBuild();
+    }
+  }
+
+  /** Collect all of the compile jars of all the dependencies. */
+  public static Stream<String> classpathOf(Dep... dependencies) {
+    return Stream.of(dependencies).flatMap(it -> it.compileJars().stream());
+  }
+
+  /** Import a single dep. Similar to a `kt_jvm_import` or a `kt_js_import`. */
+  public static Dep importJar(String label, String compileJar) {
+    return Dep.builder()
+        .label(label)
+        .compileJars(ImmutableSet.of(BazelRunFiles.resolveVerified(compileJar).getAbsolutePath()))
+        .build();
+  }
+}
diff --git a/src/test/kotlin/io/bazel/kotlin/builder/KotlinBuilderJsTestTask.java b/src/test/kotlin/io/bazel/kotlin/builder/KotlinBuilderJsTestTask.java
index ed5e822..ff65016 100644
--- a/src/test/kotlin/io/bazel/kotlin/builder/KotlinBuilderJsTestTask.java
+++ b/src/test/kotlin/io/bazel/kotlin/builder/KotlinBuilderJsTestTask.java
@@ -1,5 +1,21 @@
+/*
+ * Copyright 2018 The Bazel Authors. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package io.bazel.kotlin.builder;
 
+import io.bazel.kotlin.builder.toolchain.KotlinToolchain;
 import io.bazel.kotlin.model.CompilationTaskInfo;
 import io.bazel.kotlin.model.JsCompilationTask;
 
@@ -11,6 +27,8 @@
   private static final List<String> PASSTHROUGH_FLAGS =
       Arrays.asList("-source-map", "-meta-info", "-module-kind", "commonjs", "-target", "v5");
   private static final JsCompilationTask.Builder taskBuilder = JsCompilationTask.newBuilder();
+  private static final KotlinBuilderComponent component =
+      DaggerKotlinBuilderComponent.builder().toolchain(KotlinToolchain.createToolchain()).build();
 
   @Override
   CompilationTaskInfo.Builder infoBuilder() {
@@ -39,4 +57,19 @@
     Path sourcePath = super.writeSourceFile(filename, lines);
     taskBuilder.getInputsBuilder().addKotlinSources(sourcePath.toString());
   }
+
+  public void runCompilationTask() {
+    runCompileTask(
+        (taskContext, task) -> {
+          component.jsTaskExecutor().execute(taskContext, task);
+          String jsFile = task.getOutputs().getJs();
+          assertFilesExist(
+              jsFile,
+              jsFile + ".map",
+              jsFile.substring(0, jsFile.length() - 3) + ".meta.js",
+              task.getOutputs().getJar(),
+              task.getOutputs().getSrcjar());
+          return null;
+        });
+  }
 }
diff --git a/src/test/kotlin/io/bazel/kotlin/builder/KotlinBuilderJvmTestTask.java b/src/test/kotlin/io/bazel/kotlin/builder/KotlinBuilderJvmTestTask.java
index bc80def..e2c294f 100644
--- a/src/test/kotlin/io/bazel/kotlin/builder/KotlinBuilderJvmTestTask.java
+++ b/src/test/kotlin/io/bazel/kotlin/builder/KotlinBuilderJvmTestTask.java
@@ -1,13 +1,53 @@
+/*
+ * Copyright 2018 The Bazel Authors. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package io.bazel.kotlin.builder;
 
+import com.google.common.collect.ImmutableSet;
+import io.bazel.kotlin.builder.toolchain.KotlinToolchain;
 import io.bazel.kotlin.model.AnnotationProcessor;
 import io.bazel.kotlin.model.CompilationTaskInfo;
 import io.bazel.kotlin.model.JvmCompilationTask;
 
 import java.util.Arrays;
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+import java.util.stream.Stream;
 
 public final class KotlinBuilderJvmTestTask extends KotlinBuilderResource<JvmCompilationTask> {
+  @SuppressWarnings({"unused", "WeakerAccess"})
+  public static Dep
+      KOTLIN_ANNOTATIONS =
+          Dep.importJar(
+              "kotlin-annotations",
+              "external/com_github_jetbrains_kotlin/lib/annotations-13.0.jar"),
+      KOTLIN_STDLIB =
+          Dep.importJar(
+              "kotlin-stdlib", "external/com_github_jetbrains_kotlin/lib/kotlin-stdlib.jar"),
+      KOTLIN_STDLIB_JDK7 =
+          Dep.importJar(
+              "kotlin-stdlib-jdk7",
+              "external/com_github_jetbrains_kotlin/lib/kotlin-stdlib-jdk7.jar"),
+      KOTLIN_STDLIB_JDK8 =
+          Dep.importJar(
+              "kotlin-stdlib-jdk8",
+              "external/com_github_jetbrains_kotlin/lib/kotlin-stdlib-jdk8.jar");
+
   private static final JvmCompilationTask.Builder taskBuilder = JvmCompilationTask.newBuilder();
+  private static final KotlinBuilderComponent component =
+      DaggerKotlinBuilderComponent.builder().toolchain(KotlinToolchain.createToolchain()).build();
 
   @Override
   CompilationTaskInfo.Builder infoBuilder() {
@@ -20,7 +60,7 @@
   }
 
   @Override
-  protected void before() throws Throwable {
+  protected final void before() throws Throwable {
     taskBuilder.clear();
     super.before();
 
@@ -38,6 +78,14 @@
         .setSrcjar(instanceRoot().resolve("jar_file-sources.jar").toAbsolutePath().toString());
   }
 
+  private void resetForNext() {
+    try {
+      before();
+    } catch (Throwable throwable) {
+      throw new RuntimeException(throwable);
+    }
+  }
+
   public void addSource(String filename, String... lines) {
     String pathAsString = super.writeSourceFile(filename, lines).toString();
     if (pathAsString.endsWith(".kt")) {
@@ -57,12 +105,34 @@
   }
 
   public void addDirectDependencies(Dep... dependencies) {
-    Dep.merge(dependencies)
-        .compileJars()
-        .forEach(
-            (dependency) ->
-                taskBuilder
-                    .getInputsBuilder()
-                    .addClasspath(dependency));
+    Dep.classpathOf(dependencies)
+        .forEach((dependency) -> taskBuilder.getInputsBuilder().addClasspath(dependency));
+  }
+
+  private Dep currentDep() {
+    return Dep.builder()
+        .label(label())
+        .compileJars(ImmutableSet.of(taskBuilder.getOutputs().getJar()))
+        .runtimeDeps(ImmutableSet.copyOf(taskBuilder.getInputs().getClasspathList()))
+        .build();
+  }
+
+  @SafeVarargs
+  public final Dep runCompileTask(Consumer<KotlinBuilderJvmTestTask>... setup) {
+    Stream.of(setup).forEach(it -> it.accept(this));
+    return runCompileTask(
+        (taskContext, task) -> {
+          component.jvmTaskExecutor().execute(taskContext, task);
+          assertFilesExist(task.getOutputs().getJar(), task.getOutputs().getJdeps());
+          return currentDep();
+        });
+  }
+
+  /** Run a single compile task returning a dep and resetting the context. */
+  @SafeVarargs
+  public final Dep supplyDepTask(Consumer<KotlinBuilderJvmTestTask>... setup) {
+    Dep dep = runCompileTask(setup);
+    resetForNext();
+    return dep;
   }
 }
diff --git a/src/test/kotlin/io/bazel/kotlin/builder/KotlinBuilderResource.java b/src/test/kotlin/io/bazel/kotlin/builder/KotlinBuilderResource.java
index 699104f..3b66a12 100644
--- a/src/test/kotlin/io/bazel/kotlin/builder/KotlinBuilderResource.java
+++ b/src/test/kotlin/io/bazel/kotlin/builder/KotlinBuilderResource.java
@@ -1,10 +1,27 @@
+/*
+ * Copyright 2018 The Bazel Authors. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
 package io.bazel.kotlin.builder;
 
 import io.bazel.kotlin.builder.toolchain.CompilationException;
 import io.bazel.kotlin.builder.toolchain.CompilationStatusException;
-import io.bazel.kotlin.builder.utils.BazelRunFiles;
 import io.bazel.kotlin.builder.utils.CompilationTaskContext;
-import io.bazel.kotlin.model.*;
+import io.bazel.kotlin.model.CompilationTaskInfo;
+import io.bazel.kotlin.model.KotlinToolchainInfo;
+import io.bazel.kotlin.model.Platform;
+import io.bazel.kotlin.model.RuleKind;
 import org.junit.rules.ExternalResource;
 
 import java.io.*;
@@ -17,7 +34,6 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 import java.util.concurrent.atomic.AtomicInteger;
-import java.util.function.BiConsumer;
 import java.util.function.BiFunction;
 import java.util.function.Consumer;
 import java.util.stream.Collectors;
@@ -49,51 +65,9 @@
     }
   }
 
-  public abstract static class Dep {
-    private Dep() {}
-
-    abstract Stream<String> compileJars();
-
-    private static class Simple extends Dep {
-      private final List<String> compileJars;
-
-      private Simple(List<String> compileJars) {
-        this.compileJars = compileJars;
-      }
-
-      @Override
-      Stream<String> compileJars() {
-        return compileJars.stream();
-      }
-    }
-
-    static Dep merge(Dep... dependencies) {
-      return new Simple(
-          Stream.of(dependencies).flatMap(Dep::compileJars).collect(Collectors.toList()));
-    }
-
-    public static List<String> classpathOf(Dep... dependencies) {
-      return merge(dependencies).compileJars().collect(Collectors.toList());
-    }
-
-    public static Dep simpleOf(String compileJar) {
-      return new Simple(
-          Collections.singletonList(BazelRunFiles.resolveVerified(compileJar).getAbsolutePath()));
-    }
-  }
-
   private static final Path
       BAZEL_TEST_DIR = Paths.get(Objects.requireNonNull(System.getenv("TEST_TMPDIR"))),
       EXTERNAL_PATH = Paths.get("external");
-  @SuppressWarnings("unused")
-  public static Dep
-      KOTLIN_ANNOTATIONS =
-          Dep.simpleOf("external/com_github_jetbrains_kotlin/lib/annotations-13.0.jar"),
-      KOTLIN_STDLIB = Dep.simpleOf("external/com_github_jetbrains_kotlin/lib/kotlin-stdlib.jar"),
-      KOTLIN_STDLIB_JDK7 =
-          Dep.simpleOf("external/com_github_jetbrains_kotlin/lib/kotlin-stdlib-jdk7.jar"),
-      KOTLIN_STDLIB_JDK8 =
-          Dep.simpleOf("external/com_github_jetbrains_kotlin/lib/kotlin-stdlib-jdk8.jar");
 
   private static final AtomicInteger counter = new AtomicInteger(0);
   private static final int DEFAULT_TIMEOUT = 10;
@@ -233,21 +207,10 @@
     }
   }
 
-  public final void runCompileTask(BiConsumer<CompilationTaskContext, T> operation) {
+  final <R> R runCompileTask(BiFunction<CompilationTaskContext, T, R> operation) {
     CompilationTaskInfo info = infoBuilder().build();
     T task = buildTask();
-    runCompileTask(
-        info,
-        task,
-        (ctx, t) -> {
-          operation.accept(ctx, task);
-          return null;
-        });
-  }
-
-  @SuppressWarnings("unused")
-  public final <R> R runCompileTask(BiFunction<CompilationTaskContext, T, R> operation) {
-    return runCompileTask(infoBuilder().build(), buildTask(), operation);
+    return runCompileTask(info, task, (ctx, t) -> operation.apply(ctx, task));
   }
 
   /**
@@ -257,9 +220,9 @@
    * @param validator a consumer for the output produced by the task.
    */
   public final void runFailingCompileTaskAndValidateOutput(
-      BiConsumer<CompilationTaskContext, T> task, Consumer<List<String>> validator) {
+      Runnable task, Consumer<List<String>> validator) {
     try {
-      runCompileTask(task);
+      task.run();
     } catch (CompilationStatusException ex) {
       validator.accept(outLines());
       return;
@@ -271,7 +234,7 @@
     assertFileExistence(resolved(dir, paths), true);
   }
 
-  public final void assertFilesExist(String... paths) {
+  final void assertFilesExist(String... paths) {
     assertFileExistence(Stream.of(paths).map(Paths::get), true);
   }
 
diff --git a/src/test/kotlin/io/bazel/kotlin/builder/tasks/js/KotlinBuilderJsTest.java b/src/test/kotlin/io/bazel/kotlin/builder/tasks/js/KotlinBuilderJsTest.java
index de300cf..41c2ef6 100644
--- a/src/test/kotlin/io/bazel/kotlin/builder/tasks/js/KotlinBuilderJsTest.java
+++ b/src/test/kotlin/io/bazel/kotlin/builder/tasks/js/KotlinBuilderJsTest.java
@@ -1,11 +1,6 @@
 package io.bazel.kotlin.builder.tasks.js;
 
-import io.bazel.kotlin.builder.DaggerKotlinBuilderComponent;
-import io.bazel.kotlin.builder.KotlinBuilderComponent;
 import io.bazel.kotlin.builder.KotlinBuilderJsTestTask;
-import io.bazel.kotlin.builder.toolchain.KotlinToolchain;
-import io.bazel.kotlin.builder.utils.CompilationTaskContext;
-import io.bazel.kotlin.model.JsCompilationTask;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.runner.RunWith;
@@ -17,31 +12,17 @@
 public class KotlinBuilderJsTest {
   @Rule public KotlinBuilderJsTestTask ctx = new KotlinBuilderJsTestTask();
 
-  private static final KotlinBuilderComponent component =
-      DaggerKotlinBuilderComponent.builder().toolchain(KotlinToolchain.createToolchain()).build();
-
   @Test
   public void testSimpleJsCompile() {
     ctx.addSource("AClass.kt", "package something", "class AClass{}");
-    ctx.runCompileTask(this::jsCompilationTask);
+    ctx.runCompilationTask();
   }
 
   @Test
   public void testJsErrorRendering() {
     ctx.addSource("AClass.kt", "package something", "class AClass{");
     ctx.runFailingCompileTaskAndValidateOutput(
-        this::jsCompilationTask,
+        ctx::runCompilationTask,
         lines -> assertThat(lines.get(0)).startsWith(ctx.toPlatform("sources/AClass.kt")));
   }
-
-  private void jsCompilationTask(CompilationTaskContext taskContext, JsCompilationTask task) {
-    component.jsTaskExecutor().execute(taskContext, task);
-    String jsFile = task.getOutputs().getJs();
-    ctx.assertFilesExist(
-        jsFile,
-        jsFile + ".map",
-        jsFile.substring(0, jsFile.length() - 3) + ".meta.js",
-        task.getOutputs().getJar(),
-        task.getOutputs().getSrcjar());
-  }
 }
diff --git a/src/test/kotlin/io/bazel/kotlin/builder/tasks/jvm/KotlinBuilderJvmBasicTest.java b/src/test/kotlin/io/bazel/kotlin/builder/tasks/jvm/KotlinBuilderJvmBasicTest.java
new file mode 100644
index 0000000..ffe49ce
--- /dev/null
+++ b/src/test/kotlin/io/bazel/kotlin/builder/tasks/jvm/KotlinBuilderJvmBasicTest.java
@@ -0,0 +1,88 @@
+/*
+ * Copyright 2018 The Bazel Authors. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.bazel.kotlin.builder.tasks.jvm;
+
+import io.bazel.kotlin.builder.KotlinBuilderJvmTestTask;
+import io.bazel.kotlin.builder.KotlinBuilderResource.DirectoryType;
+import org.junit.Ignore;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+import static com.google.common.truth.Truth.assertThat;
+
+@RunWith(JUnit4.class)
+public class KotlinBuilderJvmBasicTest {
+  @Rule public KotlinBuilderJvmTestTask ctx = new KotlinBuilderJvmTestTask();
+
+  @Test
+  public void testSimpleMixedModeCompile() {
+    ctx.addSource("AClass.kt", "package something;" + "class AClass{}");
+    ctx.addSource("AnotherClass.java", "package something;", "", "class AnotherClass{}");
+    ctx.runCompileTask();
+    ctx.assertFilesExist(
+        DirectoryType.CLASSES, "something/AClass.class", "something/AnotherClass.class");
+  }
+
+  @Test
+  public void testMixedBiReferences() {
+    ctx.addSource(
+        "AClass.java",
+        "package a;",
+        "",
+        "import b.BClass;",
+        "",
+        "public class AClass {",
+        "  static BClass b = new BClass();",
+        "}");
+    ctx.addSource(
+        "BClass.kt",
+        "package b",
+        "",
+        "import a.AClass",
+        "",
+        "class BClass() {",
+        "  val a = AClass()",
+        "}");
+    ctx.runCompileTask();
+    ctx.assertFilesExist(DirectoryType.CLASSES, "a/AClass.class", "b/BClass.class");
+  }
+
+  @Test
+  public void testKotlinErrorRendering() {
+    ctx.addSource("AClass.kt", "package something;" + "class AClass{");
+    ctx.runFailingCompileTaskAndValidateOutput(
+        ctx::runCompileTask,
+        lines -> assertThat(lines.get(0)).startsWith(ctx.toPlatform("sources/AClass")));
+  }
+
+  @Test
+  public void testJavaErrorRendering() {
+    ctx.addSource("AClass.kt", "package something;" + "class AClass{}");
+    ctx.addSource("AnotherClass.java", "package something;", "", "class AnotherClass{");
+    ctx.runFailingCompileTaskAndValidateOutput(
+        ctx::runCompileTask,
+        lines -> assertThat(lines.get(0)).startsWith(ctx.toPlatform("sources/AnotherClass")));
+  }
+
+  @Test
+  @Ignore("The Kotlin compiler expects a single kotlin file at least.")
+  public void testCompileSingleJavaFile() {
+    ctx.runCompileTask(
+        (c) -> c.addSource("AnotherClass.java", "package something;", "", "class AnotherClass{}"));
+  }
+}
diff --git a/src/test/kotlin/io/bazel/kotlin/builder/tasks/jvm/KotlinBuilderJvmKaptTest.java b/src/test/kotlin/io/bazel/kotlin/builder/tasks/jvm/KotlinBuilderJvmKaptTest.java
new file mode 100644
index 0000000..c3ca842
--- /dev/null
+++ b/src/test/kotlin/io/bazel/kotlin/builder/tasks/jvm/KotlinBuilderJvmKaptTest.java
@@ -0,0 +1,144 @@
+/*
+ * Copyright 2018 The Bazel Authors. All rights reserved.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *    http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package io.bazel.kotlin.builder.tasks.jvm;
+
+import io.bazel.kotlin.builder.Dep;
+import io.bazel.kotlin.builder.KotlinBuilderJvmTestTask;
+import io.bazel.kotlin.builder.KotlinBuilderResource;
+import io.bazel.kotlin.model.AnnotationProcessor;
+import org.junit.Rule;
+import org.junit.Test;
+import org.junit.runner.RunWith;
+import org.junit.runners.JUnit4;
+
+import java.util.function.Consumer;
+import java.util.stream.Collectors;
+
+import static io.bazel.kotlin.builder.KotlinBuilderJvmTestTask.KOTLIN_ANNOTATIONS;
+import static io.bazel.kotlin.builder.KotlinBuilderJvmTestTask.KOTLIN_STDLIB;
+
+@RunWith(JUnit4.class)
+public class KotlinBuilderJvmKaptTest {
+  private static final Dep AUTO_VALUE =
+      Dep.importJar(
+          "autovalue",
+          "external/io_bazel_rules_kotlin_com_google_auto_value_auto_value"
+              + "/jar/io_bazel_rules_kotlin_com_google_auto_value_auto_value.jar");
+  private static final AnnotationProcessor AUTO_VALUE_ANNOTATION_PROCESSOR =
+      AnnotationProcessor.newBuilder()
+          .setLabel("autovalue")
+          .setProcessorClass("com.google.auto.value.processor.AutoValueProcessor")
+          .addAllClasspath(
+              Dep.classpathOf(AUTO_VALUE, KOTLIN_ANNOTATIONS).collect(Collectors.toList()))
+          .build();
+
+  @Rule public KotlinBuilderJvmTestTask ctx = new KotlinBuilderJvmTestTask();
+
+  private static final Consumer<KotlinBuilderJvmTestTask> ADD_AUTO_VALUE_PLUGIN =
+      (c) -> {
+        c.addAnnotationProcessors(AUTO_VALUE_ANNOTATION_PROCESSOR);
+        c.addDirectDependencies(AUTO_VALUE, KOTLIN_STDLIB);
+      };
+
+  @Test
+  public void testKaptKt() {
+    ctx.runCompileTask(
+        ADD_AUTO_VALUE_PLUGIN,
+        c ->
+            c.addSource(
+                "TestKtValue.kt",
+                "package autovalue\n"
+                    + "\n"
+                    + "import com.google.auto.value.AutoValue\n"
+                    + "\n"
+                    + "@AutoValue\n"
+                    + "abstract class TestKtValue {\n"
+                    + "    abstract fun name(): String\n"
+                    + "    fun builder(): Builder = AutoValue_TestKtValue.Builder()\n"
+                    + "\n"
+                    + "    @AutoValue.Builder\n"
+                    + "    abstract class Builder {\n"
+                    + "        abstract fun setName(name: String): Builder\n"
+                    + "        abstract fun build(): TestKtValue\n"
+                    + "    }\n"
+                    + "}"));
+
+    ctx.assertFilesExist(
+        KotlinBuilderResource.DirectoryType.CLASSES,
+        "autovalue/TestKtValue.class",
+        "autovalue/AutoValue_TestKtValue.class");
+    ctx.assertFilesExist(
+        KotlinBuilderResource.DirectoryType.SOURCE_GEN, "autovalue/AutoValue_TestKtValue.java");
+  }
+
+  @Test
+  public void testMixedKaptBiReferences() {
+    ctx.runCompileTask(
+        ADD_AUTO_VALUE_PLUGIN,
+        ctx -> {
+          ctx.addSource(
+              "TestKtValue.kt",
+              "package autovalue.a\n"
+                  + "\n"
+                  + "import com.google.auto.value.AutoValue\n"
+                  + "import autovalue.b.TestAutoValue\n"
+                  + "\n"
+                  + "@AutoValue\n"
+                  + "abstract class TestKtValue {\n"
+                  + "    abstract fun name(): String\n"
+                  + "    fun builder(): Builder = AutoValue_TestKtValue.Builder()\n"
+                  + "\n"
+                  + "    @AutoValue.Builder\n"
+                  + "    abstract class Builder {\n"
+                  + "        abstract fun setName(name: String): Builder\n"
+                  + "        abstract fun build(): TestKtValue\n"
+                  + "    }\n"
+                  + "}");
+
+          ctx.addSource(
+              "TestAutoValue.java",
+              "package autovalue.b;\n"
+                  + "\n"
+                  + "import com.google.auto.value.AutoValue;\n"
+                  + "import autovalue.a.TestKtValue;\n"
+                  + "\n"
+                  + "@AutoValue\n"
+                  + "public abstract class TestAutoValue {\n"
+                  + "    abstract String name();\n"
+                  + "\n"
+                  + "\n"
+                  + "    static Builder builder() {\n"
+                  + "        return new AutoValue_TestAutoValue.Builder();\n"
+                  + "    }\n"
+                  + "\n"
+                  + "    @AutoValue.Builder\n"
+                  + "    abstract static class Builder {\n"
+                  + "        abstract Builder setName(String name);\n"
+                  + "        abstract TestAutoValue build();\n"
+                  + "    }\n"
+                  + "\n"
+                  + "}");
+        });
+    ctx.assertFilesExist(
+        KotlinBuilderResource.DirectoryType.SOURCE_GEN,
+        "autovalue/a/AutoValue_TestKtValue.java",
+        "autovalue/b/AutoValue_TestAutoValue.java");
+    ctx.assertFilesExist(
+        KotlinBuilderResource.DirectoryType.CLASSES,
+        "autovalue/a/AutoValue_TestKtValue.class",
+        "autovalue/b/AutoValue_TestAutoValue.class");
+  }
+}
diff --git a/src/test/kotlin/io/bazel/kotlin/builder/tasks/jvm/KotlinBuilderJvmTest.java b/src/test/kotlin/io/bazel/kotlin/builder/tasks/jvm/KotlinBuilderJvmTest.java
deleted file mode 100644
index 3fff0e0..0000000
--- a/src/test/kotlin/io/bazel/kotlin/builder/tasks/jvm/KotlinBuilderJvmTest.java
+++ /dev/null
@@ -1,185 +0,0 @@
-package io.bazel.kotlin.builder.tasks.jvm;
-
-import io.bazel.kotlin.builder.DaggerKotlinBuilderComponent;
-import io.bazel.kotlin.builder.KotlinBuilderComponent;
-import io.bazel.kotlin.builder.KotlinBuilderJvmTestTask;
-import io.bazel.kotlin.builder.KotlinBuilderResource.Dep;
-import io.bazel.kotlin.builder.KotlinBuilderResource.DirectoryType;
-import io.bazel.kotlin.builder.toolchain.KotlinToolchain;
-import io.bazel.kotlin.builder.utils.CompilationTaskContext;
-import io.bazel.kotlin.model.AnnotationProcessor;
-import io.bazel.kotlin.model.JvmCompilationTask;
-import org.junit.Ignore;
-import org.junit.Rule;
-import org.junit.Test;
-
-import static com.google.common.truth.Truth.assertThat;
-import static io.bazel.kotlin.builder.KotlinBuilderResource.KOTLIN_ANNOTATIONS;
-import static io.bazel.kotlin.builder.KotlinBuilderResource.KOTLIN_STDLIB;
-
-public class KotlinBuilderJvmTest {
-  private static Dep AUTO_VALUE =
-      Dep.simpleOf(
-          "external/io_bazel_rules_kotlin_com_google_auto_value_auto_value"
-              + "/jar/io_bazel_rules_kotlin_com_google_auto_value_auto_value.jar");
-
-  private static final AnnotationProcessor AUTO_VALUE_ANNOTATION_PROCESSOR =
-      AnnotationProcessor.newBuilder()
-          .setLabel("autovalue")
-          .setProcessorClass("com.google.auto.value.processor.AutoValueProcessor")
-          .addAllClasspath(Dep.classpathOf(AUTO_VALUE, KOTLIN_ANNOTATIONS))
-          .build();
-
-  private static final KotlinBuilderComponent component =
-      DaggerKotlinBuilderComponent.builder().toolchain(KotlinToolchain.createToolchain()).build();
-
-  @Rule public KotlinBuilderJvmTestTask ctx = new KotlinBuilderJvmTestTask();
-
-  @Test
-  public void testSimpleMixedModeCompile() {
-    ctx.addSource("AClass.kt", "package something;" + "class AClass{}");
-    ctx.addSource("AnotherClass.java", "package something;", "", "class AnotherClass{}");
-    ctx.runCompileTask(this::jvmCompilationTask);
-    ctx.assertFilesExist(
-        DirectoryType.CLASSES, "something/AClass.class", "something/AnotherClass.class");
-  }
-
-  @Test
-  public void testMixedBiReferences() {
-    ctx.addSource(
-        "AClass.java",
-        "package a;",
-        "",
-        "import b.BClass;",
-        "",
-        "public class AClass {",
-        "  static BClass b = new BClass();",
-        "}");
-    ctx.addSource(
-        "BClass.kt",
-        "package b",
-        "",
-        "import a.AClass",
-        "",
-        "class BClass() {",
-        "  val a = AClass()",
-        "}");
-    ctx.runCompileTask(this::jvmCompilationTask);
-    ctx.assertFilesExist(DirectoryType.CLASSES, "a/AClass.class", "b/BClass.class");
-  }
-
-  @Test
-  public void testKaptKt() {
-    ctx.addSource(
-        "TestKtValue.kt",
-        "package autovalue\n"
-            + "\n"
-            + "import com.google.auto.value.AutoValue\n"
-            + "\n"
-            + "@AutoValue\n"
-            + "abstract class TestKtValue {\n"
-            + "    abstract fun name(): String\n"
-            + "    fun builder(): Builder = AutoValue_TestKtValue.Builder()\n"
-            + "\n"
-            + "    @AutoValue.Builder\n"
-            + "    abstract class Builder {\n"
-            + "        abstract fun setName(name: String): Builder\n"
-            + "        abstract fun build(): TestKtValue\n"
-            + "    }\n"
-            + "}");
-    ctx.addAnnotationProcessors(AUTO_VALUE_ANNOTATION_PROCESSOR);
-    ctx.addDirectDependencies(AUTO_VALUE, KOTLIN_STDLIB);
-    ctx.runCompileTask(this::jvmCompilationTask);
-    ctx.assertFilesExist(
-        DirectoryType.CLASSES,
-        "autovalue/TestKtValue.class",
-        "autovalue/AutoValue_TestKtValue.class");
-    ctx.assertFilesExist(DirectoryType.SOURCE_GEN, "autovalue/AutoValue_TestKtValue.java");
-  }
-
-  @Test
-  public void testMixedKaptBiReferences() {
-    ctx.addSource(
-        "TestKtValue.kt",
-        "package autovalue.a\n"
-            + "\n"
-            + "import com.google.auto.value.AutoValue\n"
-            + "import autovalue.b.TestAutoValue\n"
-            + "\n"
-            + "@AutoValue\n"
-            + "abstract class TestKtValue {\n"
-            + "    abstract fun name(): String\n"
-            + "    fun builder(): Builder = AutoValue_TestKtValue.Builder()\n"
-            + "\n"
-            + "    @AutoValue.Builder\n"
-            + "    abstract class Builder {\n"
-            + "        abstract fun setName(name: String): Builder\n"
-            + "        abstract fun build(): TestKtValue\n"
-            + "    }\n"
-            + "}");
-    ctx.addSource(
-        "TestAutoValue.java",
-        "package autovalue.b;\n"
-            + "\n"
-            + "import com.google.auto.value.AutoValue;\n"
-            + "import autovalue.a.TestKtValue;\n"
-            + "\n"
-            + "@AutoValue\n"
-            + "public abstract class TestAutoValue {\n"
-            + "    abstract String name();\n"
-            + "\n"
-            + "\n"
-            + "    static Builder builder() {\n"
-            + "        return new AutoValue_TestAutoValue.Builder();\n"
-            + "    }\n"
-            + "\n"
-            + "    @AutoValue.Builder\n"
-            + "    abstract static class Builder {\n"
-            + "        abstract Builder setName(String name);\n"
-            + "        abstract TestAutoValue build();\n"
-            + "    }\n"
-            + "\n"
-            + "}");
-
-    ctx.addAnnotationProcessors(AUTO_VALUE_ANNOTATION_PROCESSOR);
-    ctx.addDirectDependencies(AUTO_VALUE, KOTLIN_STDLIB);
-    ctx.runCompileTask(this::jvmCompilationTask);
-    ctx.assertFilesExist(
-        DirectoryType.SOURCE_GEN,
-        "autovalue/a/AutoValue_TestKtValue.java",
-        "autovalue/b/AutoValue_TestAutoValue.java");
-    ctx.assertFilesExist(
-        DirectoryType.CLASSES,
-        "autovalue/a/AutoValue_TestKtValue.class",
-        "autovalue/b/AutoValue_TestAutoValue.class");
-  }
-
-  @Test
-  public void testKotlinErrorRendering() {
-    ctx.addSource("AClass.kt", "package something;" + "class AClass{");
-    ctx.runFailingCompileTaskAndValidateOutput(
-        this::jvmCompilationTask,
-        lines -> assertThat(lines.get(0)).startsWith(ctx.toPlatform("sources/AClass")));
-  }
-
-  @Test
-  public void testJavaErrorRendering() {
-    ctx.addSource("AClass.kt", "package something;" + "class AClass{}");
-    ctx.addSource("AnotherClass.java", "package something;", "", "class AnotherClass{");
-    ctx.runFailingCompileTaskAndValidateOutput(
-        this::jvmCompilationTask,
-        lines -> assertThat(lines.get(0)).startsWith(ctx.toPlatform("sources/AnotherClass")));
-  }
-
-  @Test
-  @Ignore("The Kotlin compiler expects a single kotlin file at least.")
-  public void testCompileSingleJavaFile() {
-    ctx.addSource("AnotherClass.java", "package something;", "", "class AnotherClass{}");
-    ctx.runCompileTask(this::jvmCompilationTask);
-  }
-
-  private void jvmCompilationTask(CompilationTaskContext taskContext, JvmCompilationTask task) {
-    component.jvmTaskExecutor().execute(taskContext, task);
-    ctx.assertFilesExist(task.getOutputs().getJar(), task.getOutputs().getJdeps());
-  }
-}
diff --git a/third_party/BUILD b/third_party/BUILD
index 3e01d88..d585557 100644
--- a/third_party/BUILD
+++ b/third_party/BUILD
@@ -29,6 +29,21 @@
 )
 
 java_plugin(
+    name = "autovalue_plugin",
+    generates_api = 1,
+    processor_class = "com.google.auto.value.processor.AutoValueProcessor",
+    visibility = ["//visibility:private"],
+    deps = ["//third_party/jvm/com/google/auto/value:auto_value"],
+)
+
+java_library(
+    name = "autovalue",
+    exported_plugins = [":autovalue_plugin"],
+    neverlink = 1,
+    exports = ["//third_party/jvm/com/google/auto/value:auto_value"],
+)
+
+java_plugin(
     name = "dagger_component_plugin",
     generates_api = 1,
     processor_class = "dagger.internal.codegen.ComponentProcessor",
