initial toolchain implementation, enables coroutines and also reorganize doc wireup
diff --git a/Makefile b/Makefile
index aa1cc29..21b4d4b 100644
--- a/Makefile
+++ b/Makefile
@@ -7,10 +7,10 @@
 	buildifier -mode=fix -v kotlin/rules/*.bzl
 
 docs.regen:
-	bazel build //kotlin:docs
-	unzip -o bazel-bin/kotlin/docs-skydoc.zip -d docs
+	bazel build //docs
+	unzip -o bazel-bin/docs/docs-skydoc.zip -d docs
 
 docs.preview_local:
-	bazel build //kotlin:docs --define local=1
-	unzip -o bazel-bin/kotlin/docs-skydoc.zip -d /tmp/rules_kotlin
+	bazel build //docs --define local=1
+	unzip -o bazel-bin/docs/docs-skydoc.zip -d /tmp/rules_kotlin
 	open /tmp/rules_kotlin/kotlin/kotlin.html
diff --git a/README.md b/README.md
index 81b5cce..8b5acd4 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,10 @@
 [Skydoc documentation](https://bazelbuild.github.io/rules_kotlin)
 
 # Announcements
+* <b>February 15, 2018.</b>. Toolchains for the JVM rules. Currently this allow tweaking: 
+    * The JVM target (bytecode level).
+    * API and Language levels.
+    * Coroutines, enabled by default. 
 * <b>February 9, 2018.</b> Annotation processing.
 * <b>February 5, 2018. JVM rule name change:</b> the prefix has changed from `kotlin_` to `kt_jvm_`.
 
diff --git a/WORKSPACE b/WORKSPACE
index 085dcf6..72bbc2a 100644
--- a/WORKSPACE
+++ b/WORKSPACE
@@ -29,8 +29,9 @@
 load("@io_bazel_skydoc//skylark:skylark.bzl", "skydoc_repositories")
 skydoc_repositories()
 
-load("//kotlin:kotlin.bzl", "kotlin_repositories")
+load("//kotlin:kotlin.bzl", "kotlin_repositories", "kt_register_toolchains")
 kotlin_repositories()
+kt_register_toolchains()
 
 # test and example dependencies.
 maven_jar(name = "junit_junit",artifact = "junit:junit:jar:4.12")
diff --git a/docs/BUILD b/docs/BUILD
new file mode 100644
index 0000000..0ce6af1
--- /dev/null
+++ b/docs/BUILD
@@ -0,0 +1,34 @@
+load("@io_bazel_skydoc//skylark:skylark.bzl", "skylark_doc", "skylark_library" )
+
+skylark_library(
+    name = "doc_public",
+    srcs = ["//kotlin:kotlin.bzl"],
+    visibility=["//visibility:private"]
+)
+
+skylark_library(
+    name = "doc_toolchains",
+    srcs = ["//kotlin:toolchains.bzl"],
+    visibility=["//visibility:private"]
+)
+
+skylark_doc(
+    name = "docs",
+    deps = [
+        ":doc_public",
+        ":doc_toolchains"
+    ],
+    format = "html",
+    site_root = select({
+        ":local": "/tmp/rules_kotlin",
+        "//conditions:default": "https://bazelbuild.github.io/rules_kotlin"
+    }),
+    visibility = ["//visibility:public"]
+)
+
+config_setting(
+    name = "local",
+    values = {
+        "define": "local=1",
+    }
+)
\ No newline at end of file
diff --git a/docs/index.html b/docs/index.html
index c0f2f8f..60c7bc9 100644
--- a/docs/index.html
+++ b/docs/index.html
@@ -58,6 +58,17 @@
     </li>
   </ul>
 </li>
+<li>
+  <a href="https://bazelbuild.github.io/rules_kotlin/kotlin/toolchains.html">Kotlin Toolchains</a>
+  <ul>
+    <li><a href="https://bazelbuild.github.io/rules_kotlin/kotlin/toolchains.html#overview">Overview</a></li>
+    <li>
+      <a href="https://bazelbuild.github.io/rules_kotlin/kotlin/toolchains.html#kt_jvm_toolchain">
+        kt_jvm_toolchain
+      </a>
+    </li>
+  </ul>
+</li>
 
           </ul>
         </nav>
@@ -72,6 +83,7 @@
   <h2>Rule sets</h2>
   <ul>
     <li><a href="#kotlin">Kotlin Rules</a></li>
+    <li><a href="#toolchains">Kotlin Toolchains</a></li>
   </ul>
 </nav>
 
@@ -149,6 +161,70 @@
 
       </td>
     </tr>
+    <tr>
+      <td>
+        <a href="https://bazelbuild.github.io/rules_kotlin/kotlin/kotlin.html#kt_register_toolchains">
+          <code>kt_register_toolchains</code>
+        </a>
+      </td>
+      <td>
+        <p>register all default toolchains</p>
+
+      </td>
+    </tr>
+  </tbody>
+</table>
+<h2><a href="https://bazelbuild.github.io/rules_kotlin/kotlin/toolchains.html">Kotlin Toolchains</a></h2>
+
+<h3>Rules</h3>
+<table class="overview-table">
+  <colgroup>
+    <col class="col-name" />
+    <col class="col-description" />
+  </colgroup>
+  <tbody>
+    <tr>
+      <td>
+        <a href="https://bazelbuild.github.io/rules_kotlin/kotlin/toolchains.html#kt_jvm_toolchain">
+          <code>kt_jvm_toolchain</code>
+        </a>
+      </td>
+      <td>
+        <p>The kotlin jvm toolchain</p>
+
+      </td>
+    </tr>
+  </tbody>
+</table>
+<h3>Macros</h3>
+<table class="overview-table">
+  <colgroup>
+    <col class="col-name" />
+    <col class="col-description" />
+  </colgroup>
+  <tbody>
+    <tr>
+      <td>
+        <a href="https://bazelbuild.github.io/rules_kotlin/kotlin/toolchains.html#define_kt_jvm_toolchain">
+          <code>define_kt_jvm_toolchain</code>
+        </a>
+      </td>
+      <td>
+        <p>Define a Kotlin JVM Toolchain, the name is used in the <code>toolchain</code> rule so can be used to register the toolchain in the WORKSPACE file.</p>
+
+      </td>
+    </tr>
+    <tr>
+      <td>
+        <a href="https://bazelbuild.github.io/rules_kotlin/kotlin/toolchains.html#kt_register_jvm_toolchain">
+          <code>kt_register_jvm_toolchain</code>
+        </a>
+      </td>
+      <td>
+        <p>Register the default JVM toolchain.</p>
+
+      </td>
+    </tr>
   </tbody>
 </table>
 
diff --git a/docs/kotlin/kotlin.html b/docs/kotlin/kotlin.html
index b2a3fd5..38077ff 100644
--- a/docs/kotlin/kotlin.html
+++ b/docs/kotlin/kotlin.html
@@ -58,6 +58,17 @@
     </li>
   </ul>
 </li>
+<li>
+  <a href="https://bazelbuild.github.io/rules_kotlin/kotlin/toolchains.html">Kotlin Toolchains</a>
+  <ul>
+    <li><a href="https://bazelbuild.github.io/rules_kotlin/kotlin/toolchains.html#overview">Overview</a></li>
+    <li>
+      <a href="https://bazelbuild.github.io/rules_kotlin/kotlin/toolchains.html#kt_jvm_toolchain">
+        kt_jvm_toolchain
+      </a>
+    </li>
+  </ul>
+</li>
 
           </ul>
         </nav>
@@ -79,6 +90,7 @@
   <h2>Macros</h2>
   <ul>
     <li><a href="#kotlin_repositories">kotlin_repositories</a></li>
+    <li><a href="#kt_register_toolchains">kt_register_toolchains</a></li>
   </ul>
 </nav>
           <hr>
@@ -90,8 +102,9 @@
     remote = &quot;https://github.com/bazelbuild/rules_kotlin.git&quot;,
     commit = &quot;&lt;COMMIT_HASH&gt;&quot;,
 )
-load(&quot;@io_bazel_rules_kotlin//kotlin:kotlin.bzl&quot;, &quot;kotlin_repositories&quot;)
+load(&quot;@io_bazel_rules_kotlin//kotlin:kotlin.bzl&quot;, &quot;kotlin_repositories&quot;, &quot;kt_register_toolchains&quot;)
 kotlin_repositories(kotlin_release_version = &quot;1.2.21&quot;)
+kt_register_toolchains()
 </code></pre>
 <p>To enable persistent worker support, add the following to the appropriate <code>bazelrc</code> file:</p>
 <pre><code>build --strategy=KotlinCompile=worker
@@ -149,6 +162,9 @@
           <pre>kotlin_repositories(<a href="#kotlin_repositories.kotlin_release_version">kotlin_release_version</a>)</pre>
 
           <p>Call this in the WORKSPACE file to setup the Kotlin rules.</p>
+<p>Args:a
+  kotlin_release_version: The kotlin compiler release version. If this is not set the latest release version is
+  chosen by default.</p>
 
 
           <h3 id="kotlin_repositories_args">Attributes</h3>
@@ -163,14 +179,22 @@
       <td><code>kotlin_release_version</code></td>
       <td>
         <p><code>Unknown; Optional</code></p>
-        <p>The kotlin compiler release version. If this is not set the latest release version is
-chosen by default.</p>
+        
       </td>
     </tr>
   </tbody>
 </table>
           <hr>
 
+          <h2 id="kt_register_toolchains">kt_register_toolchains</h2>
+
+          <pre>kt_register_toolchains()</pre>
+
+          <p>register all default toolchains</p>
+
+
+          <hr>
+
           <h2 id="kt_jvm_binary">kt_jvm_binary</h2>
 
           <pre>kt_jvm_binary(<a href="#kt_jvm_binary.name">name</a>, <a href="#kt_jvm_binary.deps">deps</a>, <a href="#kt_jvm_binary.data">data</a>, <a href="#kt_jvm_binary.resources">resources</a>, <a href="#kt_jvm_binary.srcs">srcs</a>, <a href="#kt_jvm_binary.jvm_flags">jvm_flags</a>, <a href="#kt_jvm_binary.main_class">main_class</a>, <a href="#kt_jvm_binary.plugins">plugins</a>, <a href="#kt_jvm_binary.resource_jars">resource_jars</a>, <a href="#kt_jvm_binary.resource_strip_prefix">resource_strip_prefix</a>, <a href="#kt_jvm_binary.runtime_deps">runtime_deps</a>)</pre>
diff --git a/docs/kotlin/toolchains.html b/docs/kotlin/toolchains.html
new file mode 100644
index 0000000..8b7764f
--- /dev/null
+++ b/docs/kotlin/toolchains.html
@@ -0,0 +1,243 @@
+
+
+<!--
+Documentation generated by Skydoc
+-->
+<!DOCTYPE html>
+<html>
+  <head>
+    <meta charset="utf-8">
+    <meta name="viewport" content="width=device-width initial-scale=1" />
+    <meta http-equiv="X-UA-Compatible" content="IE=edge">
+
+    <title>Kotlin Toolchains</title>
+
+    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,600,700" type="text/css">
+    <link rel="stylesheet" href="https://fonts.googleapis.com/icon?family=Material+Icons">
+    <link rel="stylesheet" href="https://code.getmdl.io/1.1.1/material.green-light_blue.min.css">
+    <script defer src="https://code.getmdl.io/1.1.1/material.min.js"></script>
+    <link rel="stylesheet" href="https://bazelbuild.github.io/rules_kotlin/main.css">
+  </head>
+  <body>
+    <div class="mdl-layout mdl-js-layout mdl-layout--fixed-drawer
+      mdl-layout--fixed-header">
+      <header class="mdl-layout__header">
+        <div class="mdl-layout__header-row">
+          <span class="mdl-layout-title">Kotlin Toolchains</span>
+        </div>
+      </header>
+      <div class="mdl-layout__drawer">
+        <span class="mdl-layout-title">Bazel</span>
+        <nav class="drawer-nav">
+          <ul class="drawer-nav">
+            
+<li><a href="https://bazelbuild.github.io/rules_kotlin/index.html">Overview</a></li>
+<li>
+  <a href="https://bazelbuild.github.io/rules_kotlin/kotlin/kotlin.html">Kotlin Rules</a>
+  <ul>
+    <li><a href="https://bazelbuild.github.io/rules_kotlin/kotlin/kotlin.html#overview">Overview</a></li>
+    <li>
+      <a href="https://bazelbuild.github.io/rules_kotlin/kotlin/kotlin.html#kt_jvm_binary">
+        kt_jvm_binary
+      </a>
+    </li>
+    <li>
+      <a href="https://bazelbuild.github.io/rules_kotlin/kotlin/kotlin.html#kt_jvm_import">
+        kt_jvm_import
+      </a>
+    </li>
+    <li>
+      <a href="https://bazelbuild.github.io/rules_kotlin/kotlin/kotlin.html#kt_jvm_library">
+        kt_jvm_library
+      </a>
+    </li>
+    <li>
+      <a href="https://bazelbuild.github.io/rules_kotlin/kotlin/kotlin.html#kt_jvm_test">
+        kt_jvm_test
+      </a>
+    </li>
+  </ul>
+</li>
+<li>
+  <a href="https://bazelbuild.github.io/rules_kotlin/kotlin/toolchains.html">Kotlin Toolchains</a>
+  <ul>
+    <li><a href="https://bazelbuild.github.io/rules_kotlin/kotlin/toolchains.html#overview">Overview</a></li>
+    <li>
+      <a href="https://bazelbuild.github.io/rules_kotlin/kotlin/toolchains.html#kt_jvm_toolchain">
+        kt_jvm_toolchain
+      </a>
+    </li>
+  </ul>
+</li>
+
+          </ul>
+        </nav>
+      </div>
+
+      <main class="mdl-layout__content">
+        <div class="page-content">
+          <h1>Kotlin Toolchains</h1>
+
+<nav class="toc">
+  <h2><a href="#overview">Overview</a></h2>
+  <h2>Rules</h2>
+  <ul>
+    <li><a href="#kt_jvm_toolchain">kt_jvm_toolchain</a></li>
+  </ul>
+  <h2>Macros</h2>
+  <ul>
+    <li><a href="#define_kt_jvm_toolchain">define_kt_jvm_toolchain</a></li>
+    <li><a href="#kt_register_jvm_toolchain">kt_register_jvm_toolchain</a></li>
+  </ul>
+</nav>
+          <hr>
+          <h2 id="overview">Overview</h2>
+          <p>This file contains macros for defining and registering specific toolchains.</p>
+<h3>Examples</h3>
+<p>To override a tool chain use the appropriate macro in a <code>BUILD</code> file to declare the toolchain:</p>
+<pre><code class="lang-bzl">load(&quot;@io_bazel_rules_kotlin//kotlin:toolchains.bzl&quot;, &quot;define_kt_jvm_toolchain&quot;)
+
+define_kt_jvm_toolchain(
+    name= &quot;custom_toolchain&quot;,
+    api_version = &quot;1.1&quot;,
+    language_version = &quot;1.1&quot;,
+)
+</code></pre>
+<p>and then register it in the <code>WORKSPACE</code>:</p>
+<pre><code class="lang-bzl">register_toolchains(&quot;//:custom_toolchain&quot;)
+</code></pre>
+
+          <hr>
+
+          <h2 id="define_kt_jvm_toolchain">define_kt_jvm_toolchain</h2>
+
+          <pre>define_kt_jvm_toolchain(<a href="#define_kt_jvm_toolchain.name">name</a>, <a href="#define_kt_jvm_toolchain.language_version">language_version</a>, <a href="#define_kt_jvm_toolchain.api_version">api_version</a>, <a href="#define_kt_jvm_toolchain.jvm_target">jvm_target</a>, <a href="#define_kt_jvm_toolchain.coroutines">coroutines</a>)</pre>
+
+          <p>Define a Kotlin JVM Toolchain, the name is used in the <code>toolchain</code> rule so can be used to register the toolchain in the WORKSPACE file.</p>
+
+
+          <h3 id="define_kt_jvm_toolchain_args">Attributes</h3>
+
+<table class="params-table">
+  <colgroup>
+    <col class="col-param" />
+    <col class="col-description" />
+  </colgroup>
+  <tbody>
+    <tr id="define_kt_jvm_toolchain.name">
+      <td><code>name</code></td>
+      <td>
+        <p><code><a href="https://bazel.build/docs/build-ref.html#name">Name</a>; Required</code></p>
+        <p>A unique name for this rule.</p>
+      </td>
+    </tr>
+    <tr id="define_kt_jvm_toolchain.language_version">
+      <td><code>language_version</code></td>
+      <td>
+        <p><code>Unknown; Optional</code></p>
+        
+      </td>
+    </tr>
+    <tr id="define_kt_jvm_toolchain.api_version">
+      <td><code>api_version</code></td>
+      <td>
+        <p><code>Unknown; Optional</code></p>
+        
+      </td>
+    </tr>
+    <tr id="define_kt_jvm_toolchain.jvm_target">
+      <td><code>jvm_target</code></td>
+      <td>
+        <p><code>Unknown; Optional</code></p>
+        
+      </td>
+    </tr>
+    <tr id="define_kt_jvm_toolchain.coroutines">
+      <td><code>coroutines</code></td>
+      <td>
+        <p><code>Unknown; Optional</code></p>
+        
+      </td>
+    </tr>
+  </tbody>
+</table>
+          <hr>
+
+          <h2 id="kt_register_jvm_toolchain">kt_register_jvm_toolchain</h2>
+
+          <pre>kt_register_jvm_toolchain()</pre>
+
+          <p>Register the default JVM toolchain.</p>
+
+
+          <hr>
+
+          <h2 id="kt_jvm_toolchain">kt_jvm_toolchain</h2>
+
+          <pre>kt_jvm_toolchain(<a href="#kt_jvm_toolchain.name">name</a>, <a href="#kt_jvm_toolchain.api_version">api_version</a>, <a href="#kt_jvm_toolchain.coroutines">coroutines</a>, <a href="#kt_jvm_toolchain.jvm_target">jvm_target</a>, <a href="#kt_jvm_toolchain.language_version">language_version</a>)</pre>
+
+          <p>The kotlin jvm toolchain</p>
+
+
+          <h3 id="kt_jvm_toolchain_args">Attributes</h3>
+
+<table class="params-table">
+  <colgroup>
+    <col class="col-param" />
+    <col class="col-description" />
+  </colgroup>
+  <tbody>
+    <tr id="kt_jvm_toolchain.name">
+      <td><code>name</code></td>
+      <td>
+        <p><code><a href="https://bazel.build/docs/build-ref.html#name">Name</a>; Required</code></p>
+        <p>A unique name for this rule.</p>
+      </td>
+    </tr>
+    <tr id="kt_jvm_toolchain.api_version">
+      <td><code>api_version</code></td>
+      <td>
+        <p><code>String; Optional; Default is '1.2'</code></p>
+        <p>the -api_version flag <a href="https://kotlinlang.org/docs/reference/compatibility.html">see</a>.</p>
+      </td>
+    </tr>
+    <tr id="kt_jvm_toolchain.coroutines">
+      <td><code>coroutines</code></td>
+      <td>
+        <p><code>String; Optional; Default is 'enable'</code></p>
+        <p>the -Xcoroutines flag, enabled by default as it's considered production ready 1.2.0 onward.</p>
+      </td>
+    </tr>
+    <tr id="kt_jvm_toolchain.jvm_target">
+      <td><code>jvm_target</code></td>
+      <td>
+        <p><code>String; Optional; Default is '1.8'</code></p>
+        <p>the -jvm_target flag.</p>
+      </td>
+    </tr>
+    <tr id="kt_jvm_toolchain.language_version">
+      <td><code>language_version</code></td>
+      <td>
+        <p><code>String; Optional; Default is '1.2'</code></p>
+        <p>the -languag_version flag <a href="https://kotlinlang.org/docs/reference/compatibility.html">see</a>.</p>
+      </td>
+    </tr>
+  </tbody>
+</table>
+
+
+        </div>
+
+        <footer class="mdl-mini-footer">
+          <div class="mdl-mini-footer__left-section">
+            <div class="mdl-logo">Bazel</div>
+            <ul class="mdl-mini-footer__link-list">
+              <li><a href="https://bazel.build">Home</a></li>
+              <li><a href="https://github.com/bazelbuild">GitHub</a></li>
+            </ul>
+          </div>
+        </footer>
+      </main>
+    </div>
+  </body>
+</html>
diff --git a/kotlin/BUILD b/kotlin/BUILD
index a8f1906..7411d64 100644
--- a/kotlin/BUILD
+++ b/kotlin/BUILD
@@ -11,33 +11,15 @@
 # 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("@io_bazel_skydoc//skylark:skylark.bzl", "skylark_doc", "skylark_library" )
+package(default_visibility = ["//visibility:public"])
 
-skylark_library(
-    name = "doc_public",
-    srcs = [
-        "kotlin.bzl"
-    ],
-    visibility=["//visibility:private"]
-)
+load("//kotlin:toolchains.bzl", "define_kt_jvm_toolchain")
 
-skylark_doc(
-    name = "docs",
-    deps = [
-        ":doc_public",
-    ],
-    format = "html",
-    site_root = select({
-        ":local": "/tmp/rules_kotlin",
-        "//conditions:default": "https://bazelbuild.github.io/rules_kotlin"
-    }),
+toolchain_type(
+    name = "kt_jvm_toolchain_type",
     visibility = ["//visibility:public"]
 )
 
-config_setting(
-    name = "local",
-    values = {
-        "define": "local=1",
-    }
-)
\ No newline at end of file
+define_kt_jvm_toolchain(name = "default_jvm_toolchain")
+
+exports_files(["toolchains.bzl", "kotlin.bzl"], visibility=["//docs:__subpackages__"])
\ No newline at end of file
diff --git a/kotlin/kotlin.bzl b/kotlin/kotlin.bzl
index f57965e..5d74015 100644
--- a/kotlin/kotlin.bzl
+++ b/kotlin/kotlin.bzl
@@ -23,8 +23,9 @@
     remote = "https://github.com/bazelbuild/rules_kotlin.git",
     commit = "<COMMIT_HASH>",
 )
-load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kotlin_repositories")
+load("@io_bazel_rules_kotlin//kotlin:kotlin.bzl", "kotlin_repositories", "kt_register_toolchains")
 kotlin_repositories(kotlin_release_version = "1.2.21")
+kt_register_toolchains()
 ```
 
 To enable persistent worker support, add the following to the appropriate `bazelrc` file:
@@ -220,7 +221,7 @@
 }.items())
 
 ########################################################################################################################
-# Repositories
+# Repositories and Toolchains
 ########################################################################################################################
 load(
     "//kotlin:kotlin_compiler_repositories.bzl",
@@ -239,6 +240,12 @@
     """
     _kotlin_compiler_repository(kotlin_release_version)
 
+load("//kotlin:toolchains.bzl", _kt_register_jvm_toolchain="kt_register_jvm_toolchain")
+
+def kt_register_toolchains():
+    """register all default toolchains"""
+    _kt_register_jvm_toolchain()
+
 ########################################################################################################################
 # Simple Rules:
 ########################################################################################################################
@@ -256,6 +263,7 @@
     }.items()),
     outputs = _common_outputs,
     implementation = _kotlin_library_impl,
+    toolchains = ["@io_bazel_rules_kotlin//kotlin:kt_jvm_toolchain_type"]
 )
 
 """This rule compiles and links Kotlin and Java sources into a .jar file.
@@ -281,6 +289,7 @@
     executable = True,
     outputs = _binary_outputs,
     implementation = _kotlin_binary_impl,
+    toolchains = ["@io_bazel_rules_kotlin//kotlin:kt_jvm_toolchain_type"]
 )
 
 """Builds a Java archive ("jar file"), plus a wrapper shell script with the same name as the rule. The wrapper shell script uses a classpath that includes,
@@ -307,6 +316,7 @@
     outputs = _binary_outputs,
     test = True,
     implementation = _kotlin_junit_test_impl,
+    toolchains = ["@io_bazel_rules_kotlin//kotlin:kt_jvm_toolchain_type"]
 )
 
 """Setup a simple kotlin_test.
diff --git a/kotlin/rules/compile.bzl b/kotlin/rules/compile.bzl
index b702e20..59348bb 100644
--- a/kotlin/rules/compile.bzl
+++ b/kotlin/rules/compile.bzl
@@ -45,7 +45,7 @@
       opts: struct containing Kotlin compilation options.
     """
     compiler_output_base=ctx.actions.declare_directory(ctx.label.name + "." + "kotlinc")
-
+    tc=ctx.toolchains["@io_bazel_rules_kotlin//kotlin:kt_jvm_toolchain_type"]
     args = [
         "--target_label", ctx.label,
         "--compiler_output_base", compiler_output_base.path,
@@ -53,7 +53,10 @@
         "--output_jdeps", ctx.outputs.jdeps.path,
         "--classpath", ":".join([f.path for f in compile_jars.to_list()]),
         "--sources", ":".join([f.path for f in ctx.files.srcs]),
-        "--kotlin_jvm_target", "1.8", "--kotlin_api_version", "1.2", "--kotlin_language_version", "1.2"
+        "--kotlin_jvm_target", tc.jvm_target,
+        "--kotlin_api_version", tc.api_version,
+        "--kotlin_language_version", tc.language_version,
+        "--kotlin_passthrough_flags", "-Xcoroutines=%s" % tc.coroutines 
     ]
     # Collect and prepare plugin descriptor for the worker.
     plugin_info=_merge_plugin_infos(ctx.attr.plugins + ctx.attr.deps)
diff --git a/kotlin/toolchains.bzl b/kotlin/toolchains.bzl
new file mode 100644
index 0000000..e7ce1fb
--- /dev/null
+++ b/kotlin/toolchains.bzl
@@ -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.
+"""Kotlin Toolchains
+
+This file contains macros for defining and registering specific toolchains.
+
+### Examples
+
+To override a tool chain use the appropriate macro in a `BUILD` file to declare the toolchain:
+
+```bzl
+load("@io_bazel_rules_kotlin//kotlin:toolchains.bzl", "define_kt_jvm_toolchain")
+
+define_kt_jvm_toolchain(
+    name= "custom_toolchain",
+    api_version = "1.1",
+    language_version = "1.1",
+)
+```
+and then register it in the `WORKSPACE`:
+```bzl
+register_toolchains("//:custom_toolchain")
+```
+"""
+# The toolchain rules are not made private, at least the jvm ones so that they may be introspected in Intelij.
+_common_attrs = {
+    'language_version': attr.string(default="1.2", values=["1.1", "1.2"]),
+    'api_version': attr.string(default="1.2", values=["1.1", "1.2"]),
+    "coroutines": attr.string(default="enable", values=["enable", "warn", "error"]),
+}
+
+_kt_jvm_attrs = dict(_common_attrs.items() + {
+    'jvm_target': attr.string(default="1.8", values=["1.6", "1.8"]),
+}.items())
+
+def _kotlin_jvm_toolchain_impl(ctx):
+    toolchain = platform_common.ToolchainInfo(
+        language_version = ctx.attr.language_version,
+        api_version = ctx.attr.api_version,
+        jvm_target = ctx.attr.jvm_target,
+        coroutines = ctx.attr.coroutines
+    )
+    return [toolchain]
+
+kt_jvm_toolchain = rule(
+    implementation = _kotlin_jvm_toolchain_impl,
+    attrs = _kt_jvm_attrs
+)
+"""The kotlin jvm toolchain
+Args:
+  language_version: the -languag_version flag [see](https://kotlinlang.org/docs/reference/compatibility.html).
+  api_version: the -api_version flag [see](https://kotlinlang.org/docs/reference/compatibility.html).
+  jvm_target: the -jvm_target flag.
+  coroutines: the -Xcoroutines flag, enabled by default as it's considered production ready 1.2.0 onward.
+"""
+
+def define_kt_jvm_toolchain(name, language_version=None, api_version=None, jvm_target=None, coroutines=None):
+    """Define a Kotlin JVM Toolchain, the name is used in the `toolchain` rule so can be used to register the toolchain in the WORKSPACE file."""
+    impl_name = name + "_impl"
+    kt_jvm_toolchain(
+        name = impl_name,
+        language_version = language_version,
+        api_version = api_version,
+        jvm_target = jvm_target,
+        coroutines = coroutines,
+        visibility = ["//visibility:public"]
+    )
+    native.toolchain(
+        name = name,
+        toolchain_type = "@io_bazel_rules_kotlin//kotlin:kt_jvm_toolchain_type",
+        toolchain = impl_name,
+        visibility = ["//visibility:public"]
+    )
+
+def kt_register_jvm_toolchain():
+    """Register the default JVM toolchain."""
+    native.register_toolchains("@io_bazel_rules_kotlin//kotlin:default_jvm_toolchain")
diff --git a/kotlin/workers/src/io/bazel/ruleskotlin/workers/compilers/jvm/actions/KotlinMainCompile.kt b/kotlin/workers/src/io/bazel/ruleskotlin/workers/compilers/jvm/actions/KotlinMainCompile.kt
index 21a677a..578a48c 100644
--- a/kotlin/workers/src/io/bazel/ruleskotlin/workers/compilers/jvm/actions/KotlinMainCompile.kt
+++ b/kotlin/workers/src/io/bazel/ruleskotlin/workers/compilers/jvm/actions/KotlinMainCompile.kt
@@ -61,6 +61,8 @@
                 .addAll("-module-name", Metas.TARGET[ctx])
                 .addAll("-d", compileDirectories.classes.toString())
 
+        Flags.KOTLIN_PASSTHROUGH_FLAGS[ctx]?.takeIf { it.isNotBlank() }?.also { args.addAll(it.split(" ")) }
+
         return args
     }
 
diff --git a/kotlin/workers/src/io/bazel/ruleskotlin/workers/model/Flags.kt b/kotlin/workers/src/io/bazel/ruleskotlin/workers/model/Flags.kt
index 4246b94..9e8deb5 100644
--- a/kotlin/workers/src/io/bazel/ruleskotlin/workers/model/Flags.kt
+++ b/kotlin/workers/src/io/bazel/ruleskotlin/workers/model/Flags.kt
@@ -34,4 +34,9 @@
     val KOTLIN_API_VERSION = Flag.Optional("--kotlin_api_version", "-api-version")
     val KOTLIN_LANGUAGE_VERSION = Flag.Optional("--kotlin_language_version", "-language-version")
     val KOTLIN_JVM_TARGET = Flag.Optional("--kotlin_jvm_target", "-jvm-target")
+    /**
+     * These flags are passed through to the compiler verbatim, the rules ensure they are safe. These flags are to toggle features or they carry a single value
+     * so the string is tokenized by space.
+     */
+    val KOTLIN_PASSTHROUGH_FLAGS = Flag.Optional("--kotlin_passthrough_flags")
 }
\ No newline at end of file