consolate all srcs under src
diff --git a/.bazelproject b/.bazelproject
index af125c4..b5daf79 100644
--- a/.bazelproject
+++ b/.bazelproject
@@ -26,15 +26,14 @@
   //examples/dagger/...
   # These targets are built for the ide only. Primary purpose is to ensure the builder can build the targets, but it's
   # also a good way of testing the intellij plugin.
-  //kotlin/builder/src/io/bazel/kotlin/builder:builder_kt_for_ide
-  //kotlin/builder:compiler_lib_for_ide
+  //src/main/kotlin/io/bazel/kotlin/builder:builder_kt_for_ide
+  //src/main/kotlin:compiler_lib_for_ide
 
 test_sources:
-  */unittests/*
-  */integrationtests/*
+  src/test/*
 
 additional_languages:
   kotlin
 
 import_run_configurations:
-  tests/Bazel_all_local_tests.xml
\ No newline at end of file
+  src/test/Bazel_all_local_tests.xml
\ No newline at end of file
diff --git a/BUILD b/BUILD
index ed426b9..d8637e6 100644
--- a/BUILD
+++ b/BUILD
@@ -16,9 +16,8 @@
 test_suite(
     name = "all_tests",
     tests = [
-        "//kotlin/builder/integrationtests",
-        "//kotlin/builder/unittests",
-        "//tests/integrationtests",
+        "//src/test/kotlin/io/bazel/kotlin:assertion_tests",
+        "//src/test/kotlin/io/bazel/kotlin/builder:builder_tests",
     ],
 )
 
@@ -27,6 +26,6 @@
     name = "all_local_tests",
     tests = [
         ":all_tests",
-        "//tests/integrationtests:integrationtests_local",
+        "//src/test/kotlin/io/bazel/kotlin:local_assertion_tests",
     ],
 )
diff --git a/kotlin/builder/integrationtests/BUILD b/kotlin/builder/integrationtests/BUILD
deleted file mode 100644
index 4485930..0000000
--- a/kotlin/builder/integrationtests/BUILD
+++ /dev/null
@@ -1,19 +0,0 @@
-# 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.
-java_test(
-    name = "integrationtests",
-    srcs = glob(["*.java"]),
-    test_class = "io.bazel.kotlin.builder.KotlinBuilderTestSuite",
-    deps = ["//kotlin/builder:builder_lib_for_tests"],
-)
diff --git a/kotlin/builder/integrationtests/KotlinBuilderActionTests.java b/kotlin/builder/integrationtests/KotlinBuilderActionTests.java
deleted file mode 100644
index 2c6a829..0000000
--- a/kotlin/builder/integrationtests/KotlinBuilderActionTests.java
+++ /dev/null
@@ -1,13 +0,0 @@
-package io.bazel.kotlin.builder;
-
-import org.junit.Test;
-
-public class KotlinBuilderActionTests extends KotlinBuilderTestCase {
-  @Test
-  public void testCompileSimple() {
-    addSource("AClass.kt", "package something;" + "class AClass{}");
-    component().jvmTaskExecutor().compileKotlin(builderCommand(), context(), true);
-    assertFileExists(DirectoryType.CLASSES, "something/AClass.class");
-    assertFileDoesNotExist(outputs().getJar());
-  }
-}
diff --git a/kotlin/builder/integrationtests/KotlinBuilderTestSuite.java b/kotlin/builder/integrationtests/KotlinBuilderTestSuite.java
deleted file mode 100644
index 649c0f2..0000000
--- a/kotlin/builder/integrationtests/KotlinBuilderTestSuite.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package io.bazel.kotlin.builder;
-
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-
-@RunWith(Suite.class)
-@Suite.SuiteClasses({KotlinBuilderActionTests.class, KotlinBuilderTests.class})
-public class KotlinBuilderTestSuite {}
diff --git a/kotlin/builder/unittests/BUILD b/kotlin/builder/unittests/BUILD
deleted file mode 100644
index aeaac28..0000000
--- a/kotlin/builder/unittests/BUILD
+++ /dev/null
@@ -1,26 +0,0 @@
-# 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.
-java_test(
-    name = "unittests",
-    size = "small",
-    srcs = glob(["**/*.java"]),
-    test_class = "io.bazel.kotlin.builder.BuilderUnitTestSuite",
-    deps = [
-        "//kotlin/builder:builder_lib_for_tests",
-        "//third_party/jvm/com/google/truth",
-        "@com_github_jetbrains_kotlin//:kotlin-stdlib",
-        "@io_bazel_rules_kotlin//kotlin/builder/proto:deps",
-        "@io_bazel_rules_kotlin_com_google_protobuf_protobuf_java//jar",
-    ],
-)
diff --git a/kotlin/builder/unittests/io/bazel/kotlin/workers/BuilderUnitTestSuite.java b/kotlin/builder/unittests/io/bazel/kotlin/workers/BuilderUnitTestSuite.java
deleted file mode 100644
index 0830110..0000000
--- a/kotlin/builder/unittests/io/bazel/kotlin/workers/BuilderUnitTestSuite.java
+++ /dev/null
@@ -1,25 +0,0 @@
-/*
- * 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.tasks.jvm.JdepsParserTest;
-import io.bazel.kotlin.builder.utils.jars.SourceJarCreatorUnitTests;
-import org.junit.runner.RunWith;
-import org.junit.runners.Suite;
-
-@RunWith(Suite.class)
-@Suite.SuiteClasses({JdepsParserTest.class, SourceJarCreatorUnitTests.class})
-public class BuilderUnitTestSuite {}
diff --git a/kotlin/internal/toolchains.bzl b/kotlin/internal/toolchains.bzl
index 1f37feb..1631cbb 100644
--- a/kotlin/internal/toolchains.bzl
+++ b/kotlin/internal/toolchains.bzl
@@ -73,7 +73,7 @@
         ),
         "kotlinbuilder": attr.label(
             doc = "the kotlin builder executable",
-            default = Label("//kotlin/builder"),
+            default = Label("//src/main/kotlin:builder"),
             executable = True,
             allow_files = True,
             cfg = "host",
diff --git a/scripts/gen_proto_jars b/scripts/gen_proto_jars
index 217d1b3..1e71414 100755
--- a/scripts/gen_proto_jars
+++ b/scripts/gen_proto_jars
@@ -19,7 +19,7 @@
 # If (when) Bazel distributes a host protoc this file can be removed.
 
 WS_ROOT=$(bazel info workspace)
-PROTO_PATH=kotlin/builder/proto
+PROTO_PATH=src/main/protobuf
 JAR_DIR=${WS_ROOT}/${PROTO_PATH}/jars
 
 function build_lib() {
diff --git a/kotlin/builder/BUILD b/src/main/kotlin/BUILD
similarity index 80%
rename from kotlin/builder/BUILD
rename to src/main/kotlin/BUILD
index 234c3f9..ede4bea 100644
--- a/kotlin/builder/BUILD
+++ b/src/main/kotlin/BUILD
@@ -11,13 +11,13 @@
 # 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.
-load("//kotlin/builder:bootstrap.bzl", "kt_bootstrap_library")
+load("//src/main/kotlin:bootstrap.bzl", "kt_bootstrap_library")
 load("//kotlin:kotlin.bzl", "kt_jvm_library")
 
 # The compiler library, this is co-located in the kotlin compiler classloader.
 kt_bootstrap_library(
     name = "compiler_lib",
-    srcs = glob(["src/io/bazel/kotlin/compiler/**/*.kt"]),
+    srcs = glob(["io/bazel/kotlin/compiler/*.kt"]),
     neverlink_deps = [
         "@com_github_jetbrains_kotlin//:kotlin-compiler",
         "@com_github_jetbrains_kotlin//:kotlin-annotation-processing",
@@ -31,7 +31,7 @@
     data = [":compiler_lib.jar"],
     main_class = "io.bazel.kotlin.builder.KotlinBuilderMain",
     visibility = ["//visibility:public"],
-    runtime_deps = ["//kotlin/builder/src/io/bazel/kotlin/builder"],
+    runtime_deps = ["//src/main/kotlin/io/bazel/kotlin/builder"],
 )
 
 filegroup(
@@ -51,15 +51,14 @@
     testonly = 1,
     data = [":data_for_tests"],
     visibility = [
-        "//kotlin/builder/integrationtests:__subpackages__",
-        "//kotlin/builder/unittests:__subpackages__",
+        "//src/test:__subpackages__",
     ],
     exports = [
-        "//kotlin/builder/src/io/bazel/kotlin/builder",
+        "//src/main/kotlin/io/bazel/kotlin/builder:builder",
         "//third_party/jvm/com/google/truth",
         "//third_party/jvm/junit",
-        "@io_bazel_rules_kotlin//kotlin/builder/proto:deps",
-        "@io_bazel_rules_kotlin//kotlin/builder/proto:kotlin_model",
+        "//src/main/protobuf:deps",
+        "//src/main/protobuf:kotlin_model",
         "@io_bazel_rules_kotlin_com_google_guava_guava//jar",
         "@io_bazel_rules_kotlin_com_google_protobuf_protobuf_java//jar",
     ],
diff --git a/kotlin/builder/bootstrap.bzl b/src/main/kotlin/bootstrap.bzl
similarity index 90%
rename from kotlin/builder/bootstrap.bzl
rename to src/main/kotlin/bootstrap.bzl
index 663fd4e..02e184b 100644
--- a/kotlin/builder/bootstrap.bzl
+++ b/src/main/kotlin/bootstrap.bzl
@@ -16,7 +16,7 @@
 _BOOTSTRAP_LIB_ARGS = ["-jvm-target", "1.8"]
 
 def _resolve_dep_label(d):
-    if d.startswith("//kotlin/builder/src/io/bazel/kotlin") and not d.endswith("_for_ide"):
+    if d.startswith("///src/main/kotlin/io/bazel/kotlin") and not d.endswith("_for_ide"):
         prefix, _, target = d.rpartition(":")
         if target == None:
             # untested
@@ -32,7 +32,7 @@
     Simple compilation of a kotlin library using a non-persistent worker. The target is a JavaInfo provider.
 
     The target is tagged `"no-ide"` as intellij can't compile it. A seperate private target is created which is suffixed
-    with `_for_ide`. If the dep is under the package `//kotlin/builder/src/io/bazel/kotlin/builder/...` then it will be
+    with `_for_ide`. If the dep is under the package `//src/main/kotlin/io/bazel/kotlin/builder/...` then it will be
     added to the `_for_ide` target by adding a `_for_ide` prefix.
 
     deps: the dependenices, the are setup as runtime_deps of the library.
@@ -87,13 +87,14 @@
         jars = [jar_label],
         tags = ["no-ide"],
         runtime_deps = deps + runtime_deps,
-        visibility = ["//visibility:public"],
+        visibility = ["//visibility:private"],
     )
 
     # hsyed todo this part of the graph should not be wired up outside of development.
     _for_ide(
         name = name + "_for_ide",
         srcs = srcs,
+        neverlink = 1,
         deps = [_resolve_dep_label(d) for d in deps] + neverlink_deps,
-        visibility = ["//kotlin/builder:__subpackages__"],
+        visibility = ["//visibility:private"],
     )
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/BUILD b/src/main/kotlin/io/bazel/kotlin/builder/BUILD
similarity index 81%
rename from kotlin/builder/src/io/bazel/kotlin/builder/BUILD
rename to src/main/kotlin/io/bazel/kotlin/builder/BUILD
index ca0cfa2..6957022 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/BUILD
+++ b/src/main/kotlin/io/bazel/kotlin/builder/BUILD
@@ -11,7 +11,7 @@
 # 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.
-load("//kotlin/builder:bootstrap.bzl", "kt_bootstrap_library")
+load("//src/main/kotlin:bootstrap.bzl", "kt_bootstrap_library")
 
 kt_bootstrap_library(
     name = "builder_kt",
@@ -22,9 +22,9 @@
     ]),
     deps = [
         "@com_github_jetbrains_kotlin//:kotlin-preloader",
-        "@io_bazel_rules_kotlin//kotlin/builder/proto:deps",
-        "@io_bazel_rules_kotlin//kotlin/builder/proto:kotlin_model",
-        "@io_bazel_rules_kotlin//kotlin/builder/proto:worker",
+        "//src/main/protobuf:deps",
+        "//src/main/protobuf:kotlin_model",
+        "//src/main/protobuf:worker",
         "@io_bazel_rules_kotlin_com_google_protobuf_protobuf_java//jar",
         "@io_bazel_rules_kotlin_com_google_protobuf_protobuf_java_util//jar",
         "@io_bazel_rules_kotlin_javax_inject_javax_inject//jar",
@@ -34,7 +34,7 @@
 java_library(
     name = "builder",
     srcs = glob(["*.java"]),
-    visibility = ["//kotlin/builder:__subpackages__"],
+    visibility = ["//src/main/kotlin:__subpackages__"],
     exports = [":builder_kt"],
     runtime_deps = [
         "@com_github_jetbrains_kotlin//:kotlin-stdlib-jdk7",
@@ -43,7 +43,7 @@
     ],
     deps = [
         ":builder_kt",
-        "//kotlin/builder/proto:kotlin_model",
+        "//src/main/protobuf:kotlin_model",
         "//third_party:dagger",
         "@com_github_jetbrains_kotlin//:kotlin-stdlib",
         "@io_bazel_rules_kotlin_com_google_protobuf_protobuf_java//jar",
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/KotlinBuilderComponent.java b/src/main/kotlin/io/bazel/kotlin/builder/KotlinBuilderComponent.java
similarity index 100%
rename from kotlin/builder/src/io/bazel/kotlin/builder/KotlinBuilderComponent.java
rename to src/main/kotlin/io/bazel/kotlin/builder/KotlinBuilderComponent.java
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/KotlinBuilderMain.java b/src/main/kotlin/io/bazel/kotlin/builder/KotlinBuilderMain.java
similarity index 100%
rename from kotlin/builder/src/io/bazel/kotlin/builder/KotlinBuilderMain.java
rename to src/main/kotlin/io/bazel/kotlin/builder/KotlinBuilderMain.java
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/tasks/BazelWorker.kt b/src/main/kotlin/io/bazel/kotlin/builder/tasks/BazelWorker.kt
similarity index 100%
rename from kotlin/builder/src/io/bazel/kotlin/builder/tasks/BazelWorker.kt
rename to src/main/kotlin/io/bazel/kotlin/builder/tasks/BazelWorker.kt
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/tasks/KotlinBuilder.kt b/src/main/kotlin/io/bazel/kotlin/builder/tasks/KotlinBuilder.kt
similarity index 100%
rename from kotlin/builder/src/io/bazel/kotlin/builder/tasks/KotlinBuilder.kt
rename to src/main/kotlin/io/bazel/kotlin/builder/tasks/KotlinBuilder.kt
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/tasks/js/Kotlin2JsTaskExecutor.kt b/src/main/kotlin/io/bazel/kotlin/builder/tasks/js/Kotlin2JsTaskExecutor.kt
similarity index 100%
rename from kotlin/builder/src/io/bazel/kotlin/builder/tasks/js/Kotlin2JsTaskExecutor.kt
rename to src/main/kotlin/io/bazel/kotlin/builder/tasks/js/Kotlin2JsTaskExecutor.kt
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/tasks/jvm/JDepsGenerator.kt b/src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/JDepsGenerator.kt
similarity index 100%
rename from kotlin/builder/src/io/bazel/kotlin/builder/tasks/jvm/JDepsGenerator.kt
rename to src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/JDepsGenerator.kt
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/tasks/jvm/JavaCompiler.kt b/src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/JavaCompiler.kt
similarity index 100%
rename from kotlin/builder/src/io/bazel/kotlin/builder/tasks/jvm/JavaCompiler.kt
rename to src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/JavaCompiler.kt
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/tasks/jvm/JdepsParser.kt b/src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/JdepsParser.kt
similarity index 100%
rename from kotlin/builder/src/io/bazel/kotlin/builder/tasks/jvm/JdepsParser.kt
rename to src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/JdepsParser.kt
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/tasks/jvm/KotlinJvmTaskExecutor.kt b/src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/KotlinJvmTaskExecutor.kt
similarity index 100%
rename from kotlin/builder/src/io/bazel/kotlin/builder/tasks/jvm/KotlinJvmTaskExecutor.kt
rename to src/main/kotlin/io/bazel/kotlin/builder/tasks/jvm/KotlinJvmTaskExecutor.kt
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/toolchain/KotlinToolException.kt b/src/main/kotlin/io/bazel/kotlin/builder/toolchain/KotlinToolException.kt
similarity index 100%
rename from kotlin/builder/src/io/bazel/kotlin/builder/toolchain/KotlinToolException.kt
rename to src/main/kotlin/io/bazel/kotlin/builder/toolchain/KotlinToolException.kt
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/toolchain/KotlinToolchain.kt b/src/main/kotlin/io/bazel/kotlin/builder/toolchain/KotlinToolchain.kt
similarity index 98%
rename from kotlin/builder/src/io/bazel/kotlin/builder/toolchain/KotlinToolchain.kt
rename to src/main/kotlin/io/bazel/kotlin/builder/toolchain/KotlinToolchain.kt
index 3b74053..167ba0f 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/toolchain/KotlinToolchain.kt
+++ b/src/main/kotlin/io/bazel/kotlin/builder/toolchain/KotlinToolchain.kt
@@ -50,7 +50,7 @@
         private fun createClassLoader(javaHome: Path, kotlinHome: Path): ClassLoader {
             val preloadJars = mutableListOf<File>().also {
                 it += kotlinHome.resolveVerified("lib", "kotlin-compiler.jar")
-                it += javaRunfiles.resolveVerified("io_bazel_rules_kotlin", "kotlin", "builder", "compiler_lib.jar")
+                it += javaRunfiles.resolveVerified("io_bazel_rules_kotlin", "src", "main", "kotlin", "compiler_lib.jar")
                 if (!isJdk9OrNewer) {
                     it += javaHome.resolveVerified("lib", "tools.jar")
                 }
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/utils/ArgMap.kt b/src/main/kotlin/io/bazel/kotlin/builder/utils/ArgMap.kt
similarity index 100%
rename from kotlin/builder/src/io/bazel/kotlin/builder/utils/ArgMap.kt
rename to src/main/kotlin/io/bazel/kotlin/builder/utils/ArgMap.kt
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/utils/CompilationTaskContext.kt b/src/main/kotlin/io/bazel/kotlin/builder/utils/CompilationTaskContext.kt
similarity index 100%
rename from kotlin/builder/src/io/bazel/kotlin/builder/utils/CompilationTaskContext.kt
rename to src/main/kotlin/io/bazel/kotlin/builder/utils/CompilationTaskContext.kt
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/utils/IOUtils.kt b/src/main/kotlin/io/bazel/kotlin/builder/utils/IOUtils.kt
similarity index 100%
rename from kotlin/builder/src/io/bazel/kotlin/builder/utils/IOUtils.kt
rename to src/main/kotlin/io/bazel/kotlin/builder/utils/IOUtils.kt
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/utils/KotlinCompilerPluginArgsEncoder.kt b/src/main/kotlin/io/bazel/kotlin/builder/utils/KotlinCompilerPluginArgsEncoder.kt
similarity index 100%
rename from kotlin/builder/src/io/bazel/kotlin/builder/utils/KotlinCompilerPluginArgsEncoder.kt
rename to src/main/kotlin/io/bazel/kotlin/builder/utils/KotlinCompilerPluginArgsEncoder.kt
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/utils/MiscUtils.kt b/src/main/kotlin/io/bazel/kotlin/builder/utils/MiscUtils.kt
similarity index 100%
rename from kotlin/builder/src/io/bazel/kotlin/builder/utils/MiscUtils.kt
rename to src/main/kotlin/io/bazel/kotlin/builder/utils/MiscUtils.kt
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/utils/TaskUtils.kt b/src/main/kotlin/io/bazel/kotlin/builder/utils/TaskUtils.kt
similarity index 100%
rename from kotlin/builder/src/io/bazel/kotlin/builder/utils/TaskUtils.kt
rename to src/main/kotlin/io/bazel/kotlin/builder/utils/TaskUtils.kt
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/utils/jars/JarCreator.kt b/src/main/kotlin/io/bazel/kotlin/builder/utils/jars/JarCreator.kt
similarity index 100%
rename from kotlin/builder/src/io/bazel/kotlin/builder/utils/jars/JarCreator.kt
rename to src/main/kotlin/io/bazel/kotlin/builder/utils/jars/JarCreator.kt
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/utils/jars/JarExtractor.kt b/src/main/kotlin/io/bazel/kotlin/builder/utils/jars/JarExtractor.kt
similarity index 100%
rename from kotlin/builder/src/io/bazel/kotlin/builder/utils/jars/JarExtractor.kt
rename to src/main/kotlin/io/bazel/kotlin/builder/utils/jars/JarExtractor.kt
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/utils/jars/JarHelper.kt b/src/main/kotlin/io/bazel/kotlin/builder/utils/jars/JarHelper.kt
similarity index 100%
rename from kotlin/builder/src/io/bazel/kotlin/builder/utils/jars/JarHelper.kt
rename to src/main/kotlin/io/bazel/kotlin/builder/utils/jars/JarHelper.kt
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/utils/jars/SourceJarCreator.kt b/src/main/kotlin/io/bazel/kotlin/builder/utils/jars/SourceJarCreator.kt
similarity index 100%
rename from kotlin/builder/src/io/bazel/kotlin/builder/utils/jars/SourceJarCreator.kt
rename to src/main/kotlin/io/bazel/kotlin/builder/utils/jars/SourceJarCreator.kt
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/utils/jars/SourceJarExtractor.kt b/src/main/kotlin/io/bazel/kotlin/builder/utils/jars/SourceJarExtractor.kt
similarity index 100%
rename from kotlin/builder/src/io/bazel/kotlin/builder/utils/jars/SourceJarExtractor.kt
rename to src/main/kotlin/io/bazel/kotlin/builder/utils/jars/SourceJarExtractor.kt
diff --git a/kotlin/builder/src/io/bazel/kotlin/compiler/BazelK2JVMCompiler.kt b/src/main/kotlin/io/bazel/kotlin/compiler/BazelK2JVMCompiler.kt
similarity index 100%
rename from kotlin/builder/src/io/bazel/kotlin/compiler/BazelK2JVMCompiler.kt
rename to src/main/kotlin/io/bazel/kotlin/compiler/BazelK2JVMCompiler.kt
diff --git a/kotlin/builder/proto/BUILD b/src/main/protobuf/BUILD
similarity index 100%
rename from kotlin/builder/proto/BUILD
rename to src/main/protobuf/BUILD
diff --git a/kotlin/builder/proto/deps.proto b/src/main/protobuf/deps.proto
similarity index 100%
rename from kotlin/builder/proto/deps.proto
rename to src/main/protobuf/deps.proto
diff --git a/kotlin/builder/proto/jars/libdeps_proto-speed.jar b/src/main/protobuf/jars/libdeps_proto-speed.jar
similarity index 92%
rename from kotlin/builder/proto/jars/libdeps_proto-speed.jar
rename to src/main/protobuf/jars/libdeps_proto-speed.jar
index 3749615..d3a8e29 100755
--- a/kotlin/builder/proto/jars/libdeps_proto-speed.jar
+++ b/src/main/protobuf/jars/libdeps_proto-speed.jar
Binary files differ
diff --git a/kotlin/builder/proto/jars/libkotlin_model_proto-speed.jar b/src/main/protobuf/jars/libkotlin_model_proto-speed.jar
similarity index 94%
rename from kotlin/builder/proto/jars/libkotlin_model_proto-speed.jar
rename to src/main/protobuf/jars/libkotlin_model_proto-speed.jar
index 5c04b63..38960a0 100755
--- a/kotlin/builder/proto/jars/libkotlin_model_proto-speed.jar
+++ b/src/main/protobuf/jars/libkotlin_model_proto-speed.jar
Binary files differ
diff --git a/kotlin/builder/proto/jars/libworker_protocol_proto-speed.jar b/src/main/protobuf/jars/libworker_protocol_proto-speed.jar
similarity index 91%
rename from kotlin/builder/proto/jars/libworker_protocol_proto-speed.jar
rename to src/main/protobuf/jars/libworker_protocol_proto-speed.jar
index 672d622..6fb7dc9 100755
--- a/kotlin/builder/proto/jars/libworker_protocol_proto-speed.jar
+++ b/src/main/protobuf/jars/libworker_protocol_proto-speed.jar
Binary files differ
diff --git a/kotlin/builder/proto/kotlin_model.proto b/src/main/protobuf/kotlin_model.proto
similarity index 100%
rename from kotlin/builder/proto/kotlin_model.proto
rename to src/main/protobuf/kotlin_model.proto
diff --git a/kotlin/builder/proto/worker_protocol.proto b/src/main/protobuf/worker_protocol.proto
similarity index 100%
rename from kotlin/builder/proto/worker_protocol.proto
rename to src/main/protobuf/worker_protocol.proto
diff --git a/tests/Bazel_all_local_tests.xml b/src/test/Bazel_all_local_tests.xml
similarity index 100%
rename from tests/Bazel_all_local_tests.xml
rename to src/test/Bazel_all_local_tests.xml
diff --git a/tests/integrationtests/jvm/basic/BUILD b/src/test/data/jvm/basic/BUILD
similarity index 85%
rename from tests/integrationtests/jvm/basic/BUILD
rename to src/test/data/jvm/basic/BUILD
index fdda127..16a016c 100644
--- a/tests/integrationtests/jvm/basic/BUILD
+++ b/src/test/data/jvm/basic/BUILD
@@ -11,6 +11,7 @@
 # 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(default_visibility=["//visibility:private"])
 load("//kotlin:kotlin.bzl", "kt_jvm_binary", "kt_jvm_library", "kt_jvm_test")
 
 kt_jvm_binary(
@@ -33,7 +34,7 @@
 # a test resource library.
 java_library(
     name = "resourcejar",
-    resource_strip_prefix = "tests/integrationtests/jvm/basic/resourcejar",
+    resource_strip_prefix = "src/test/data/jvm/basic/resourcejar",
     resources = glob(["resourcejar/**"]),
 )
 
@@ -54,7 +55,7 @@
 kt_jvm_library(
     name = "test_embed_resources_strip_prefix",
     srcs = glob(["testresources/src/*.kt"]),
-    resource_strip_prefix = "tests/integrationtests/jvm/basic/testresources/resources",
+    resource_strip_prefix = "src/test/data/jvm/basic/testresources/resources",
     resources = glob(["testresources/resources/**/*"]),
 )
 
@@ -103,21 +104,11 @@
 kt_jvm_library(
     name = "test_friends_library",
     srcs = ["test_friends/Service.kt"],
-)
-
-# This test should be explicetly executed as module name mangling handling could regress otherwise.
-kt_jvm_test(
-    name = "friends_tests",
-    srcs = ["test_friends/TestFriendsTest.kt"],
-    friends = [":test_friends_library"],
-    test_class = "test.TestFriendsTest",
-    deps = [
-        "//third_party/jvm/junit",
-    ],
+    visibility = ["//src/test/kotlin:__subpackages__"]
 )
 
 filegroup(
-    name = "cases",
+    name = "basic",
     srcs = [
         ":conventional_strip_resources.jar",
         ":propagation_ct_consumer",
@@ -131,5 +122,5 @@
         ":test_module_name_bin.jar",
         ":test_module_name_lib",
     ],
-    visibility = ["//tests/integrationtests:__subpackages__"],
+    visibility = ["//visibility:public"],
 )
diff --git a/tests/integrationtests/jvm/basic/conventional_strip_resources/src/main/resources/main.txt b/src/test/data/jvm/basic/conventional_strip_resources/src/main/resources/main.txt
similarity index 100%
rename from tests/integrationtests/jvm/basic/conventional_strip_resources/src/main/resources/main.txt
rename to src/test/data/jvm/basic/conventional_strip_resources/src/main/resources/main.txt
diff --git a/tests/integrationtests/jvm/basic/conventional_strip_resources/src/test/resources/test.txt b/src/test/data/jvm/basic/conventional_strip_resources/src/test/resources/test.txt
similarity index 100%
rename from tests/integrationtests/jvm/basic/conventional_strip_resources/src/test/resources/test.txt
rename to src/test/data/jvm/basic/conventional_strip_resources/src/test/resources/test.txt
diff --git a/tests/integrationtests/jvm/basic/helloworld/Main.kt b/src/test/data/jvm/basic/helloworld/Main.kt
similarity index 100%
rename from tests/integrationtests/jvm/basic/helloworld/Main.kt
rename to src/test/data/jvm/basic/helloworld/Main.kt
diff --git a/tests/integrationtests/jvm/basic/propagation/CompileTimeDependent.java b/src/test/data/jvm/basic/propagation/CompileTimeDependent.java
similarity index 100%
rename from tests/integrationtests/jvm/basic/propagation/CompileTimeDependent.java
rename to src/test/data/jvm/basic/propagation/CompileTimeDependent.java
diff --git a/tests/integrationtests/jvm/basic/propagation/RuntimeDependent.java b/src/test/data/jvm/basic/propagation/RuntimeDependent.java
similarity index 100%
rename from tests/integrationtests/jvm/basic/propagation/RuntimeDependent.java
rename to src/test/data/jvm/basic/propagation/RuntimeDependent.java
diff --git a/tests/integrationtests/jvm/basic/propagation/Stub.kt b/src/test/data/jvm/basic/propagation/Stub.kt
similarity index 100%
rename from tests/integrationtests/jvm/basic/propagation/Stub.kt
rename to src/test/data/jvm/basic/propagation/Stub.kt
diff --git a/tests/integrationtests/jvm/basic/resourcejar/pkg/file.txt b/src/test/data/jvm/basic/resourcejar/pkg/file.txt
similarity index 100%
rename from tests/integrationtests/jvm/basic/resourcejar/pkg/file.txt
rename to src/test/data/jvm/basic/resourcejar/pkg/file.txt
diff --git a/tests/integrationtests/jvm/basic/test_friends/Service.kt b/src/test/data/jvm/basic/test_friends/Service.kt
similarity index 100%
rename from tests/integrationtests/jvm/basic/test_friends/Service.kt
rename to src/test/data/jvm/basic/test_friends/Service.kt
diff --git a/tests/integrationtests/jvm/basic/testresources/resources/one/alsoAFile.txt b/src/test/data/jvm/basic/testresources/resources/one/alsoAFile.txt
similarity index 100%
rename from tests/integrationtests/jvm/basic/testresources/resources/one/alsoAFile.txt
rename to src/test/data/jvm/basic/testresources/resources/one/alsoAFile.txt
diff --git a/tests/integrationtests/jvm/basic/testresources/resources/one/two/aFile.txt b/src/test/data/jvm/basic/testresources/resources/one/two/aFile.txt
similarity index 100%
rename from tests/integrationtests/jvm/basic/testresources/resources/one/two/aFile.txt
rename to src/test/data/jvm/basic/testresources/resources/one/two/aFile.txt
diff --git a/tests/integrationtests/jvm/basic/testresources/src/AClass.kt b/src/test/data/jvm/basic/testresources/src/AClass.kt
similarity index 100%
rename from tests/integrationtests/jvm/basic/testresources/src/AClass.kt
rename to src/test/data/jvm/basic/testresources/src/AClass.kt
diff --git a/tests/integrationtests/jvm/kapt/BUILD b/src/test/data/jvm/kapt/BUILD
similarity index 97%
rename from tests/integrationtests/jvm/kapt/BUILD
rename to src/test/data/jvm/kapt/BUILD
index 9ab3b6f..358b6ed 100644
--- a/tests/integrationtests/jvm/kapt/BUILD
+++ b/src/test/data/jvm/kapt/BUILD
@@ -142,7 +142,7 @@
 )
 
 filegroup(
-    name = "cases",
+    name = "kapt",
     srcs = [
         ":ap_kotlin.jar",
         ":ap_kotlin_mixed",
@@ -153,5 +153,5 @@
         ":ap_kotlin_resources",
         ":ap_kotlin_resources_mixed",
     ],
-    visibility = ["//tests/integrationtests:__subpackages__"],
+    visibility = ["//visibility:public"],
 )
diff --git a/tests/integrationtests/jvm/kapt/java/TestAPNoGenReferences.java b/src/test/data/jvm/kapt/java/TestAPNoGenReferences.java
similarity index 100%
rename from tests/integrationtests/jvm/kapt/java/TestAPNoGenReferences.java
rename to src/test/data/jvm/kapt/java/TestAPNoGenReferences.java
diff --git a/tests/integrationtests/jvm/kapt/java/TestAutoValue.java b/src/test/data/jvm/kapt/java/TestAutoValue.java
similarity index 100%
rename from tests/integrationtests/jvm/kapt/java/TestAutoValue.java
rename to src/test/data/jvm/kapt/java/TestAutoValue.java
diff --git a/tests/integrationtests/jvm/kapt/java/TestJavaService.java b/src/test/data/jvm/kapt/java/TestJavaService.java
similarity index 100%
rename from tests/integrationtests/jvm/kapt/java/TestJavaService.java
rename to src/test/data/jvm/kapt/java/TestJavaService.java
diff --git a/tests/integrationtests/jvm/kapt/kotlin/TestKtAPNoGenReference.kt b/src/test/data/jvm/kapt/kotlin/TestKtAPNoGenReference.kt
similarity index 100%
rename from tests/integrationtests/jvm/kapt/kotlin/TestKtAPNoGenReference.kt
rename to src/test/data/jvm/kapt/kotlin/TestKtAPNoGenReference.kt
diff --git a/tests/integrationtests/jvm/kapt/kotlin/TestKtService.kt b/src/test/data/jvm/kapt/kotlin/TestKtService.kt
similarity index 100%
rename from tests/integrationtests/jvm/kapt/kotlin/TestKtService.kt
rename to src/test/data/jvm/kapt/kotlin/TestKtService.kt
diff --git a/tests/integrationtests/jvm/kapt/kotlin/TestKtValue.kt b/src/test/data/jvm/kapt/kotlin/TestKtValue.kt
similarity index 100%
rename from tests/integrationtests/jvm/kapt/kotlin/TestKtValue.kt
rename to src/test/data/jvm/kapt/kotlin/TestKtValue.kt
diff --git a/src/test/kotlin/io/bazel/kotlin/BUILD b/src/test/kotlin/io/bazel/kotlin/BUILD
new file mode 100644
index 0000000..d0b9697
--- /dev/null
+++ b/src/test/kotlin/io/bazel/kotlin/BUILD
@@ -0,0 +1,82 @@
+# 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(default_visibility=["//visibility:private"])
+
+load("//kotlin:kotlin.bzl", "kt_jvm_library")
+load(":defs.bzl", "kt_rules_e2e_test", "kt_rules_test")
+
+kt_jvm_library(
+    name = "assertion_test_case",
+    testonly = 1,
+    srcs = ["KotlinAssertionTestCase.kt"],
+    visibility = ["//visibility:public"],
+    deps = [
+        "@com_github_jetbrains_kotlin//:kotlin-test",
+        "@io_bazel_rules_kotlin_com_google_guava_guava//jar",
+    ],
+    exports = [
+        "//third_party/jvm/com/google/truth",
+        "//third_party/jvm/junit:junit",
+        "@com_github_jetbrains_kotlin//:kotlin-test",
+        "@io_bazel_rules_kotlin_com_google_guava_guava//jar",
+    ]
+)
+
+kt_rules_e2e_test(
+    name = "KotlinJvmBasicAssertionTest",
+    srcs = ["KotlinJvmBasicAssertionTest.kt"],
+    data = [ "//src/test/data/jvm/basic"]
+)
+
+kt_rules_e2e_test(
+    name = "KotlinNormalizationAssertionTest",
+    srcs =["KotlinNormalizationAssertionTest.kt"],
+    data = ["//src/test/data/jvm/basic"],
+)
+
+kt_rules_e2e_test(
+    name = "KotlinJvmKaptAssertionTest",
+    srcs = ["KotlinJvmKaptAssertionTest.kt"],
+    data = ["//src/test/data/jvm/kapt"]
+)
+
+kt_rules_e2e_test(
+    name = "KotlinJvmDaggerExampleTest",
+    srcs =["KotlinJvmDaggerExampleTest.kt"],
+    data = ["//examples/dagger:coffee_app"],
+)
+
+kt_rules_e2e_test(
+    name = "KotlinJvmFriendsVisibilityTest",
+    srcs = ["KotlinJvmFriendsVisibilityTest.kt"],
+    friends = ["//src/test/data/jvm/basic:test_friends_library"]
+)
+
+test_suite(
+    name = "assertion_tests",
+    tests = [
+        "KotlinJvmBasicAssertionTest",
+        "KotlinJvmKaptAssertionTest",
+        "KotlinJvmDaggerExampleTest",
+        "KotlinJvmFriendsVisibilityTest",
+    ]
+)
+
+test_suite(
+    name = "local_assertion_tests",
+    tests = [
+        ":assertion_tests",
+        ":KotlinNormalizationAssertionTest"
+    ]
+)
diff --git a/tests/rules/AssertionTestCase.kt b/src/test/kotlin/io/bazel/kotlin/KotlinAssertionTestCase.kt
similarity index 97%
rename from tests/rules/AssertionTestCase.kt
rename to src/test/kotlin/io/bazel/kotlin/KotlinAssertionTestCase.kt
index 3ecc098..ecaff2c 100644
--- a/tests/rules/AssertionTestCase.kt
+++ b/src/test/kotlin/io/bazel/kotlin/KotlinAssertionTestCase.kt
@@ -13,7 +13,7 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package io.bazel.kotlin.testing
+package io.bazel.kotlin
 
 import com.google.common.hash.Hashing
 import java.io.File
@@ -34,7 +34,7 @@
 class TestCaseFailedException(name: String? = null, description: String? = null, cause: Throwable) :
     AssertionError(""""${name?.let { "jar: $it " } ?: ""} "$description" failed, error: ${cause.message}""", cause)
 
-abstract class AssertionTestCase(root: String) : BasicAssertionTestCase() {
+abstract class KotlinAssertionTestCase(root: String) : BasicAssertionTestCase() {
     private lateinit var currentFile: File
 
     private val testRunfileRoot: Path = Paths.get(root).also {
diff --git a/tests/integrationtests/jvm/JvmBasicFunctionalTests.kt b/src/test/kotlin/io/bazel/kotlin/KotlinJvmBasicAssertionTest.kt
similarity index 80%
rename from tests/integrationtests/jvm/JvmBasicFunctionalTests.kt
rename to src/test/kotlin/io/bazel/kotlin/KotlinJvmBasicAssertionTest.kt
index a92835a..0c3ae8d 100644
--- a/tests/integrationtests/jvm/JvmBasicFunctionalTests.kt
+++ b/src/test/kotlin/io/bazel/kotlin/KotlinJvmBasicAssertionTest.kt
@@ -13,21 +13,20 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package io.bazel.kotlin.testing.jvm
+package io.bazel.kotlin
 
-import io.bazel.kotlin.testing.AssertionTestCase
 import org.junit.Test
 
 
-class JvmBasicFunctionalTests : AssertionTestCase("tests/integrationtests/jvm/basic") {
+class KotlinJvmBasicAssertionTest: KotlinAssertionTestCase("src/test/data/jvm/basic") {
     @Test
     fun testResourceMerging() {
         jarTestCase("test_embed_resources.jar", description = "The rules should support including resource directories") {
             assertContainsEntries(
                     "testresources/AClass.class",
                     "testresources/BClass.class",
-                    "tests/integrationtests/jvm/basic/testresources/resources/one/alsoAFile.txt",
-                    "tests/integrationtests/jvm/basic/testresources/resources/one/two/aFile.txt"
+                    "src/test/data/jvm/basic/testresources/resources/one/alsoAFile.txt",
+                    "src/test/data/jvm/basic/testresources/resources/one/two/aFile.txt"
             )
         }
         jarTestCase("test_merge_resourcesjar.jar", description = "the rules should support merging jars") {
@@ -56,10 +55,10 @@
     @Test
     fun testModuleNaming() {
         jarTestCase("test_module_name_bin.jar", description = "A binary rule should support default module naming") {
-            assertContainsEntries("META-INF/tests_integrationtests_jvm_basic-test_module_name_bin.kotlin_module")
+            assertContainsEntries("META-INF/src_test_data_jvm_basic-test_module_name_bin.kotlin_module")
         }
         jarTestCase("test_module_name_lib.jar", description = "A library rule should support default module naming") {
-            assertContainsEntries("META-INF/tests_integrationtests_jvm_basic-test_module_name_lib.kotlin_module")
+            assertContainsEntries("META-INF/src_test_data_jvm_basic-test_module_name_lib.kotlin_module")
         }
         jarTestCase("test_module_name_attr_lib.jar", description = "The kotlin rules should support the module_name attribute") {
             assertContainsEntries("META-INF/hello-module.kotlin_module")
diff --git a/tests/integrationtests/jvm/JvmExampleTests.kt b/src/test/kotlin/io/bazel/kotlin/KotlinJvmDaggerExampleTest.kt
similarity index 86%
rename from tests/integrationtests/jvm/JvmExampleTests.kt
rename to src/test/kotlin/io/bazel/kotlin/KotlinJvmDaggerExampleTest.kt
index 0f7f7c2..f236eae 100644
--- a/tests/integrationtests/jvm/JvmExampleTests.kt
+++ b/src/test/kotlin/io/bazel/kotlin/KotlinJvmDaggerExampleTest.kt
@@ -13,15 +13,14 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package io.bazel.kotlin.testing.jvm
+package io.bazel.kotlin
 
-import io.bazel.kotlin.testing.BasicAssertionTestCase
 import org.junit.Test
 
 /**
  * These tests verify properties of the example.
  */
-class JvmExampleTests : BasicAssertionTestCase() {
+class KotlinJvmDaggerExampleTest : BasicAssertionTestCase() {
     @Test
     fun daggerExampleIsRunnable() {
         assertExecutableRunfileSucceeds(
diff --git a/src/test/kotlin/io/bazel/kotlin/KotlinJvmFriendsVisibilityTest.kt b/src/test/kotlin/io/bazel/kotlin/KotlinJvmFriendsVisibilityTest.kt
new file mode 100644
index 0000000..a172dab
--- /dev/null
+++ b/src/test/kotlin/io/bazel/kotlin/KotlinJvmFriendsVisibilityTest.kt
@@ -0,0 +1,18 @@
+package io.bazel.kotlin
+
+import test.Service
+import test.DEFAULT_FRIEND
+
+/**
+ * This test validates that friend visibility is working. Services and DEFAULT_FRIEND are internal another compilation
+ * unit.
+ */
+class KotlinJvmFriendsVisibilityTest {
+    val service: Service = Service()
+
+    @org.junit.Test
+    fun testCanAccessFriendMembers() {
+        println(service.value)
+        println(service.iSayHolla(DEFAULT_FRIEND))
+    }
+}
\ No newline at end of file
diff --git a/tests/integrationtests/jvm/KaptTests.kt b/src/test/kotlin/io/bazel/kotlin/KotlinJvmKaptAssertionTest.kt
similarity index 95%
rename from tests/integrationtests/jvm/KaptTests.kt
rename to src/test/kotlin/io/bazel/kotlin/KotlinJvmKaptAssertionTest.kt
index 2e817c7..7d5fc5c 100644
--- a/tests/integrationtests/jvm/KaptTests.kt
+++ b/src/test/kotlin/io/bazel/kotlin/KotlinJvmKaptAssertionTest.kt
@@ -13,12 +13,11 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package io.bazel.kotlin.testing.jvm
+package io.bazel.kotlin
 
-import io.bazel.kotlin.testing.AssertionTestCase
 import org.junit.Test
 
-class KaptTests : AssertionTestCase("tests/integrationtests/jvm/kapt") {
+class KotlinJvmKaptAssertionTest : KotlinAssertionTestCase("src/test/data/jvm/kapt") {
     @Test
     fun testKotlinOnlyAnnotationProcessing() {
         jarTestCase("ap_kotlin.jar", description = "annotation processing should work") {
diff --git a/tests/integrationtests/jvm/JvmBasicLocalTests.kt b/src/test/kotlin/io/bazel/kotlin/KotlinNormalizationAssertionTest.kt
similarity index 77%
rename from tests/integrationtests/jvm/JvmBasicLocalTests.kt
rename to src/test/kotlin/io/bazel/kotlin/KotlinNormalizationAssertionTest.kt
index 384a71d..df89bb6 100644
--- a/tests/integrationtests/jvm/JvmBasicLocalTests.kt
+++ b/src/test/kotlin/io/bazel/kotlin/KotlinNormalizationAssertionTest.kt
@@ -13,13 +13,12 @@
  * See the License for the specific language governing permissions and
  * limitations under the License.
  */
-package io.bazel.kotlin.testing.jvm
+package io.bazel.kotlin
 
-import io.bazel.kotlin.testing.AssertionTestCase
 import org.junit.Test
 
 
-class JvmBasicLocalTests : AssertionTestCase("tests/integrationtests/jvm/basic") {
+class KotlinNormalizationAssertionTest : KotlinAssertionTestCase("src/test/data/jvm/basic") {
     /*
      * (hsyed) This test is running locally because things hash differently on the ci servers. Don't have the time to
      * look into it.
@@ -32,7 +31,7 @@
             name = "test_module_name_lib.jar",
             description = "Builder jars should be normalized with and include stamp data"
         ) {
-            validateFileSha256("f26827dd09160adb436b31a12aa3b86f6da8ae1c317150c264ed8d1427a68dea")
+            validateFileSha256("1d26035bda6f384b9cc6bbe5a5bf0727b4da0aeec59545c421de32775149d4cf")
             assertManifestStamped()
             assertEntryCompressedAndNormalizedTimestampYear("helloworld/Main.class")
         }
@@ -40,11 +39,11 @@
             name = "test_embed_resources.jar",
             description = "Merging resources into the main output jar should still result in a normalized jar"
         ) {
-            validateFileSha256("270ea8758f38d9ef15013aea222cc8f609affaf9acc2f2cd206dbd73a4872082")
+            validateFileSha256("ff35e9779be25c5803ab74cd5cee46bfd35da9412fe78395d1ebc2fb2e20880a")
             assertManifestStamped()
             assertEntryCompressedAndNormalizedTimestampYear("testresources/AClass.class")
             assertEntryCompressedAndNormalizedTimestampYear(
-                "tests/integrationtests/jvm/basic/testresources/resources/one/two/aFile.txt"
+                "src/test/data/jvm/basic/testresources/resources/one/two/aFile.txt"
             )
         }
     }
diff --git a/src/test/kotlin/io/bazel/kotlin/builder/BUILD b/src/test/kotlin/io/bazel/kotlin/builder/BUILD
new file mode 100644
index 0000000..599ac4a
--- /dev/null
+++ b/src/test/kotlin/io/bazel/kotlin/builder/BUILD
@@ -0,0 +1,49 @@
+# 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(default_visibility=["//visibility:private"])
+load("//src/test/kotlin/io/bazel/kotlin:defs.bzl", "kt_rules_test")
+
+java_library(
+    name = "test_lib",
+    testonly = 1,
+    srcs = [":KotlinBuilderTestCase.java"],
+    exports = ["//src/main/kotlin:builder_lib_for_tests"],
+    deps = ["//src/main/kotlin:builder_lib_for_tests"],
+)
+
+kt_rules_test(
+    name = "SourceJarCreatorTest",
+    srcs = ["utils/jars/SourceJarCreatorTest.java"],
+)
+
+kt_rules_test(
+    name = "JdepsParserTest",
+    srcs = ["tasks/jvm/JdepsParserTest.java"],
+)
+
+kt_rules_test(
+    name = "KotlinBuilderJvmTest",
+    srcs = ["tasks/jvm/KotlinBuilderJvmTest.java"],
+)
+
+test_suite(
+    name = "builder_tests",
+    tests = [
+        ":SourceJarCreatorTest",
+        ":JdepsParserTest",
+        ":KotlinBuilderJvmTest"
+    ],
+    visibility = ["//visibility:public"]
+)
+
diff --git a/kotlin/builder/integrationtests/KotlinBuilderTestCase.java b/src/test/kotlin/io/bazel/kotlin/builder/KotlinBuilderTestCase.java
similarity index 95%
rename from kotlin/builder/integrationtests/KotlinBuilderTestCase.java
rename to src/test/kotlin/io/bazel/kotlin/builder/KotlinBuilderTestCase.java
index c5759b5..3a3b7de 100644
--- a/kotlin/builder/integrationtests/KotlinBuilderTestCase.java
+++ b/src/test/kotlin/io/bazel/kotlin/builder/KotlinBuilderTestCase.java
@@ -22,7 +22,7 @@
 import static com.google.common.base.Charsets.UTF_8;
 import static com.google.common.truth.Truth.assertWithMessage;
 
-abstract class KotlinBuilderTestCase {
+public abstract class KotlinBuilderTestCase {
   private static final Path BAZEL_TEST_DIR =
       Paths.get(Preconditions.checkNotNull(System.getenv("TEST_TMPDIR")));
   private static final AtomicInteger counter = new AtomicInteger(0);
@@ -144,7 +144,7 @@
     TEMP,
     SOURCE_GEN;
 
-    protected static Path select(DirectoryType type, JvmCompilationTask command) {
+    public static Path select(DirectoryType type, JvmCompilationTask command) {
       Path ret;
       switch (type) {
         case CLASSES:
@@ -166,7 +166,7 @@
     }
   }
 
-  void assertFileExists(DirectoryType dir, String filePath) {
+  protected void assertFileExists(DirectoryType dir, String filePath) {
     Path file = DirectoryType.select(dir, builderCommand()).resolve(filePath);
     assertFileExists(file.toString());
   }
@@ -175,7 +175,7 @@
     assertWithMessage("file exisst: " + filePath).that(new File(filePath).exists()).isFalse();
   }
 
-  void assertFileExists(String filePath) {
+  protected void assertFileExists(String filePath) {
     assertWithMessage("file did not exist: " + filePath).that(new File(filePath).exists()).isTrue();
   }
 }
diff --git a/kotlin/builder/unittests/io/bazel/kotlin/workers/tasks/jvm/JdepsParserTest.java b/src/test/kotlin/io/bazel/kotlin/builder/tasks/jvm/JdepsParserTest.java
similarity index 100%
rename from kotlin/builder/unittests/io/bazel/kotlin/workers/tasks/jvm/JdepsParserTest.java
rename to src/test/kotlin/io/bazel/kotlin/builder/tasks/jvm/JdepsParserTest.java
diff --git a/kotlin/builder/integrationtests/KotlinBuilderTests.java b/src/test/kotlin/io/bazel/kotlin/builder/tasks/jvm/KotlinBuilderJvmTest.java
similarity index 92%
rename from kotlin/builder/integrationtests/KotlinBuilderTests.java
rename to src/test/kotlin/io/bazel/kotlin/builder/tasks/jvm/KotlinBuilderJvmTest.java
index df4ebea..e1e4373 100644
--- a/kotlin/builder/integrationtests/KotlinBuilderTests.java
+++ b/src/test/kotlin/io/bazel/kotlin/builder/tasks/jvm/KotlinBuilderJvmTest.java
@@ -1,7 +1,8 @@
-package io.bazel.kotlin.builder;
+package io.bazel.kotlin.builder.tasks.jvm;
 
 import com.google.common.truth.Truth;
 import com.google.devtools.build.lib.view.proto.Deps;
+import io.bazel.kotlin.builder.KotlinBuilderTestCase;
 import io.bazel.kotlin.builder.utils.CompilationTaskContext;
 import io.bazel.kotlin.model.JvmCompilationTask;
 import org.junit.Test;
@@ -15,7 +16,7 @@
 import java.util.concurrent.TimeUnit;
 import java.util.concurrent.TimeoutException;
 
-public class KotlinBuilderTests extends KotlinBuilderTestCase {
+public class KotlinBuilderJvmTest extends KotlinBuilderTestCase {
   @Test
   public void testSimpleCompile() {
     addSource("AClass.kt", "package something;" + "class AClass{}");
diff --git a/kotlin/builder/unittests/io/bazel/kotlin/workers/utils/jars/SourceJarCreatorUnitTests.java b/src/test/kotlin/io/bazel/kotlin/builder/utils/jars/SourceJarCreatorTest.java
similarity index 97%
rename from kotlin/builder/unittests/io/bazel/kotlin/workers/utils/jars/SourceJarCreatorUnitTests.java
rename to src/test/kotlin/io/bazel/kotlin/builder/utils/jars/SourceJarCreatorTest.java
index c0ffa76..4f1093e 100644
--- a/kotlin/builder/unittests/io/bazel/kotlin/workers/utils/jars/SourceJarCreatorUnitTests.java
+++ b/src/test/kotlin/io/bazel/kotlin/builder/utils/jars/SourceJarCreatorTest.java
@@ -23,7 +23,7 @@
 
 import static com.google.common.truth.Truth.assertWithMessage;
 
-public class SourceJarCreatorUnitTests {
+public class SourceJarCreatorTest {
   private final String expectedPackage = "iO.some1.package";
 
   private final List<String> cases =
diff --git a/src/test/kotlin/io/bazel/kotlin/defs.bzl b/src/test/kotlin/io/bazel/kotlin/defs.bzl
new file mode 100644
index 0000000..3272c8e
--- /dev/null
+++ b/src/test/kotlin/io/bazel/kotlin/defs.bzl
@@ -0,0 +1,39 @@
+# 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.
+load("//kotlin:kotlin.bzl", "kt_jvm_test")
+
+def _get_class_name(kwargs):
+    if len(kwargs.get("srcs", [])) == 1:
+        return (
+            native.package_name().replace("src/test/kotlin/", "") +
+            "." + kwargs["srcs"][0]
+        ).replace("/", ".").replace(".java", "").replace(".kt", "")
+    else:
+        return kwargs["test_classes"]
+
+def kt_rules_test(name, **kwargs):
+    kwargs.setdefault("size", "small")
+    kwargs["deps"] = kwargs.setdefault("deps", []) + ["//src/test/kotlin/io/bazel/kotlin/builder:test_lib"]
+    kwargs.setdefault("test_class", _get_class_name(kwargs))
+    for f in kwargs.get("srcs"):
+        if f.endswith(".kt"):
+            kt_jvm_test(name = name, **kwargs)
+            return
+    native.java_test(name = name, **kwargs)
+
+def kt_rules_e2e_test(name, **kwargs):
+    kwargs.setdefault("size", "small")
+    kwargs["deps"] = kwargs.setdefault("deps", []) + ["//src/test/kotlin/io/bazel/kotlin:assertion_test_case"]
+    kwargs.setdefault("test_class", _get_class_name(kwargs))
+    kt_jvm_test(name = name, **kwargs)
\ No newline at end of file
diff --git a/tests/integrationtests/BUILD b/tests/integrationtests/BUILD
deleted file mode 100644
index 6f22d63..0000000
--- a/tests/integrationtests/BUILD
+++ /dev/null
@@ -1,28 +0,0 @@
-# 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(default_visibility = ["//tests/integrationtests:__subpackages__"])
-
-test_suite(
-    name = "integrationtests",
-    tests = [
-        "//tests/integrationtests/jvm",
-    ],
-)
-
-test_suite(
-    name = "integrationtests_local",
-    tests = [
-        "//tests/integrationtests/jvm:jvm_local",
-    ],
-)
diff --git a/tests/integrationtests/jvm/BUILD b/tests/integrationtests/jvm/BUILD
deleted file mode 100644
index 27ad6f4..0000000
--- a/tests/integrationtests/jvm/BUILD
+++ /dev/null
@@ -1,58 +0,0 @@
-# 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(default_visibility = ["//visibility:private"])
-
-# The tests are written in Kotlin, so the tests inately test a lot of the rule functionality.
-load("//tests/rules:defs.bzl", "kt_it_assertion_test")
-
-kt_it_assertion_test(
-    name = "basic_tests",
-    cases = "//tests/integrationtests/jvm/basic:cases",
-    test_class = "io.bazel.kotlin.testing.jvm.JvmBasicFunctionalTests",
-)
-
-kt_it_assertion_test(
-    name = "basic_local_tests",
-    cases = "//tests/integrationtests/jvm/basic:cases",
-    test_class = "io.bazel.kotlin.testing.jvm.JvmBasicLocalTests",
-)
-
-kt_it_assertion_test(
-    name = "kapt_tests",
-    cases = "//tests/integrationtests/jvm/kapt:cases",
-    test_class = "io.bazel.kotlin.testing.jvm.KaptTests",
-)
-
-kt_it_assertion_test(
-    name = "example_tests",
-    data = ["//examples/dagger:coffee_app"],
-    test_class = "io.bazel.kotlin.testing.jvm.JvmExampleTests",
-)
-
-test_suite(
-    name = "jvm",
-    tests = [
-        ":basic_tests",
-        ":example_tests",
-        ":kapt_tests",
-        "//tests/integrationtests/jvm/basic:friends_tests",
-    ],
-)
-
-test_suite(
-    name = "jvm_local",
-    tests = [
-        ":basic_local_tests",
-    ],
-)
diff --git a/tests/integrationtests/jvm/basic/test_friends/TestFriendsTest.kt b/tests/integrationtests/jvm/basic/test_friends/TestFriendsTest.kt
deleted file mode 100644
index ad25e2c..0000000
--- a/tests/integrationtests/jvm/basic/test_friends/TestFriendsTest.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package test
-
-import org.junit.Test
-
-class TestFriendsTest {
-    val service: Service = Service()
-
-    @Test
-    fun testCanAccessFriendMembers() {
-        println(service.value)
-        println(service.iSayHolla(DEFAULT_FRIEND))
-    }
-}
\ No newline at end of file
diff --git a/tests/rules/BUILD b/tests/rules/BUILD
deleted file mode 100644
index 780a73f..0000000
--- a/tests/rules/BUILD
+++ /dev/null
@@ -1,27 +0,0 @@
-# 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(default_visibility = ["//tests:__subpackages__"])
-
-load("//kotlin:kotlin.bzl", "kt_jvm_library")
-
-kt_jvm_library(
-    name = "assertion_test_case",
-    testonly = 1,
-    srcs = ["AssertionTestCase.kt"],
-    visibility = ["//tests:__subpackages__"],
-    deps = [
-        "@com_github_jetbrains_kotlin//:kotlin-test",
-        "@io_bazel_rules_kotlin_com_google_guava_guava//jar",
-    ],
-)
diff --git a/tests/rules/defs.bzl b/tests/rules/defs.bzl
deleted file mode 100644
index d72e4f5..0000000
--- a/tests/rules/defs.bzl
+++ /dev/null
@@ -1,33 +0,0 @@
-# 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.
-load("//kotlin:kotlin.bzl", "kt_jvm_test")
-
-TEST_COMMON_DEPS = [
-    "//tests/rules:assertion_test_case",
-    "//third_party/jvm/com/google/truth",
-    "//third_party/jvm/junit:junit",
-]
-
-def kt_it_assertion_test(name, test_class, cases = None, data = [], deps = []):
-    parts = test_class.split(".")
-    if cases:
-        data = data + [cases]
-    kt_jvm_test(
-        name = name,
-        srcs = ["%s.kt" % parts[len(parts) - 1]],
-        deps = TEST_COMMON_DEPS + deps,
-        test_class = test_class,
-        data = data,
-        visibility = ["//visibility:private"],
-    )