fix error rendering to console
diff --git a/kotlin/builder/integrationtests/KotlinBuilderTestCase.java b/kotlin/builder/integrationtests/KotlinBuilderTestCase.java
index 8e4b25d..01ed512 100644
--- a/kotlin/builder/integrationtests/KotlinBuilderTestCase.java
+++ b/kotlin/builder/integrationtests/KotlinBuilderTestCase.java
@@ -25,7 +25,7 @@
 
   private final KotlinModel.BuilderCommand.Builder builder =
       KotlinModel.BuilderCommand.newBuilder();
-  private final Injector injector = KotlinToolchain.createInjector(System.out, null);
+  private final Injector injector = KotlinToolchain.createInjector(() -> System.out, null);
   private String label = null;
   private Path inputSourceDir = null;
 
diff --git a/kotlin/builder/integrationtests/KotlinBuilderTests.java b/kotlin/builder/integrationtests/KotlinBuilderTests.java
index f3d0b23..0d515e9 100644
--- a/kotlin/builder/integrationtests/KotlinBuilderTests.java
+++ b/kotlin/builder/integrationtests/KotlinBuilderTests.java
@@ -33,7 +33,7 @@
 
   private void runCompileTask() {
     int timeoutSeconds = 10;
-    KotlinJvmCompilationExecutor executor= instance(KotlinJvmCompilationExecutor.class);
+    KotlinJvmCompilationExecutor executor = instance(KotlinJvmCompilationExecutor.class);
     try {
       CompletableFuture.runAsync(() -> executor.compile(builderCommand()))
           .get(timeoutSeconds, TimeUnit.SECONDS);
@@ -44,7 +44,7 @@
     }
     assertFileExists(outputs().getOutput());
     assertFileExists(outputs().getOutputJdeps());
-    try(FileInputStream fs = new FileInputStream(Paths.get(outputs().getOutputJdeps()).toFile())) {
+    try (FileInputStream fs = new FileInputStream(Paths.get(outputs().getOutputJdeps()).toFile())) {
       Deps.Dependencies dependencies = Deps.Dependencies.parseFrom(fs);
       Truth.assertThat(dependencies.getRuleLabel()).endsWith(label());
     } catch (IOException e) {
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/BazelWorker.kt b/kotlin/builder/src/io/bazel/kotlin/builder/BazelWorker.kt
index d839009..c2895fd 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/BazelWorker.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/BazelWorker.kt
@@ -26,25 +26,17 @@
 
 sealed class ToolException(
     msg: String,
-    val category: Category,
     ex: Throwable? = null
-) : RuntimeException(msg, ex) {
-    enum class Category(val code: Int) {
-        COMPILER_ERROR(1), // 1 is a standard compilation error
-        INTERNAL(2),// 2 is an internal error
-        SCRIPT(3)// 3 is the script execution error
-    }
-}
+) : RuntimeException(msg, ex)
 
-class CompilationException(msg: String, cause: Throwable? = null, category: Category = Category.INTERNAL) :
-    ToolException(msg, category, cause)
+class CompilationException(msg: String, cause: Throwable? = null) :
+    ToolException(msg, cause)
 
 class CompilationStatusException(
     msg: String,
     val status: Int,
-    val lines: List<String> = emptyList(),
-    category: Category = Category.COMPILER_ERROR
-) : ToolException("$msg:${lines.joinToString("\n", "\n")}", category)
+    val lines: List<String> = emptyList()
+) : ToolException("$msg:${lines.joinToString("\n", "\n")}")
 
 
 /**
@@ -85,9 +77,6 @@
     companion object {
         private const val INTERUPTED_STATUS = 0
         private const val ERROR_STATUS = 1
-
-        @JvmStatic
-        val IS_DEBUG: Boolean = System.getProperty("bazel.kotlin.worker.debug") != null
     }
 
     override fun apply(args: List<String>): Int {
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/KotlinBuilder.kt b/kotlin/builder/src/io/bazel/kotlin/builder/KotlinBuilder.kt
index 7830d46..c610c2f 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/KotlinBuilder.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/KotlinBuilder.kt
@@ -17,6 +17,7 @@
 
 import com.google.common.collect.ImmutableList
 import com.google.inject.Inject
+import com.google.inject.Provider
 import com.google.inject.Singleton
 import io.bazel.kotlin.builder.mode.jvm.KotlinJvmCompilationExecutor
 import io.bazel.kotlin.builder.utils.ArgMap
@@ -47,12 +48,9 @@
     private fun doExecute(command: KotlinModel.BuilderCommand): Int {
         return try {
             compilationExector.compile(command)
-            // gets basic timings on the tasks - create a better interface for this. and remove the line.
-            // println(res.command.info.label + "\n" + res.timings.joinToString("\n"))
             0
         } catch (ex: CompilationStatusException) {
-            ex.lines.forEach { println(it) }
-            return ex.status
+            ex.status
         }
     }
 
@@ -101,7 +99,7 @@
     companion object {
         @JvmStatic
         fun main(args: Array<String>) {
-            val worker = KotlinToolchain.createInjector(System.err).getInstance(BazelWorker::class.java)
+            val worker = KotlinToolchain.createInjector(Provider { System.err }).getInstance(BazelWorker::class.java)
             System.exit(worker.apply(args.toList()))
         }
     }
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/KotlinToolchain.kt b/kotlin/builder/src/io/bazel/kotlin/builder/KotlinToolchain.kt
index 9220c38..197810e 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/KotlinToolchain.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/KotlinToolchain.kt
@@ -39,12 +39,16 @@
     companion object {
         internal val NO_ARGS = arrayOf<Any>()
 
+        /**
+         * @param outputProvider A provider for the output stream to write to. A provider is used here as the System.err
+         * gets rebound when the worker is executing.
+         */
         @JvmStatic
-        fun createInjector(output: PrintStream, overrides: Module? = null): Injector =
+        fun createInjector(outputProvider: Provider<PrintStream>, overrides: Module? = null): Injector =
             Guice.createInjector(
                 object : AbstractModule() {
                     override fun configure() {
-                        bind(PrintStream::class.java).toInstance(output)
+                        bind(PrintStream::class.java).toProvider(outputProvider)
                         install(
                             KotlinToolchain.TCModule(
                                 javaHome = Paths.get("external", "local_jdk"),
@@ -52,7 +56,7 @@
                             )
                         )
                     }
-                }.let { module -> overrides?.let { Modules.override(module).with(it) }?: module }
+                }.let { module -> overrides?.let { Modules.override(module).with(it) } ?: module }
             )
     }
 
@@ -84,7 +88,7 @@
         javaHome: Path,
         kotlinHome: Path,
         kotlinLibraryDirectory: Path = kotlinHome.resolveVerified("lib").toPath(),
-        kapt3Jar: File= kotlinLibraryDirectory.resolveVerified("kotlin-annotation-processing.jar"),
+        kapt3Jar: File = kotlinLibraryDirectory.resolveVerified("kotlin-annotation-processing.jar"),
         classloader: ClassLoader = ClassPreloadingUtils.preloadClasses(
             mutableListOf<File>().let {
                 it.addAll(kotlinLibraryDirectory.verifiedRelativeFiles(Paths.get("kotlin-compiler.jar")))
@@ -95,7 +99,7 @@
             Thread.currentThread().contextClassLoader,
             null
         )
-    ): AbstractModule() {
+    ) : AbstractModule() {
         private val toolchain = KotlinToolchain(kotlinHome)
 
         private val kapt3 = CompilerPlugin(kapt3Jar.toString(), "org.jetbrains.kotlin.kapt3")
@@ -134,13 +138,8 @@
 
 
             override fun compile(args: Array<String>, out: PrintStream): Int {
-                val exitCodeInstance: Any
-                try {
-                    exitCodeInstance = execMethod.invoke(compiler, out, args)
-                    return getCodeMethod.invoke(exitCodeInstance, *NO_ARGS) as Int
-                } catch (e: Exception) {
-                    throw RuntimeException(e)
-                }
+                val exitCodeInstance = execMethod.invoke(compiler, out, args)
+                return getCodeMethod.invoke(exitCodeInstance, *NO_ARGS) as Int
             }
         }
 
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/KotlinJvmCompilationExecutor.kt b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/KotlinJvmCompilationExecutor.kt
index 7887a2a..096ce49 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/KotlinJvmCompilationExecutor.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/KotlinJvmCompilationExecutor.kt
@@ -20,6 +20,8 @@
 import com.google.inject.Inject
 import com.google.inject.Singleton
 import io.bazel.kotlin.builder.BuildCommandBuilder
+import io.bazel.kotlin.builder.CompilationStatusException
+import io.bazel.kotlin.builder.ToolException
 import io.bazel.kotlin.builder.mode.jvm.KotlinJvmCompilationExecutor.Result
 import io.bazel.kotlin.builder.mode.jvm.actions.JDepsGenerator
 import io.bazel.kotlin.builder.mode.jvm.actions.JavaCompiler
@@ -74,15 +76,23 @@
         }
 
     private fun compileClasses(context: Context, command: BuilderCommand) {
-        val result = context.execute("kotlinc") {
-            kotlinCompiler.compile(command)
+        var kotlinError: CompilationStatusException? = null
+        var result: List<String>? = null
+        context.execute("kotlinc") {
+            result = try {
+                kotlinCompiler.compile(command)
+            } catch (ex: CompilationStatusException) {
+                kotlinError = ex
+                ex.lines
+            }
         }
         try {
             context.execute("javac") {
                 javaCompiler.compile(command)
             }
         } finally {
-            result.forEach(outputSink::deliver)
+            checkNotNull(result).also(outputSink::deliver)
+            kotlinError?.also { throw it }
         }
     }
 
diff --git a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/utils/KotlinCompilerOutputSink.kt b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/utils/KotlinCompilerOutputSink.kt
index 0958724..42ddf53 100644
--- a/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/utils/KotlinCompilerOutputSink.kt
+++ b/kotlin/builder/src/io/bazel/kotlin/builder/mode/jvm/utils/KotlinCompilerOutputSink.kt
@@ -17,6 +17,7 @@
 
 import com.google.inject.ImplementedBy
 import com.google.inject.Inject
+import com.google.inject.Provider
 import java.io.File
 import java.io.PrintStream
 import java.nio.file.Paths
@@ -24,21 +25,26 @@
 @ImplementedBy(DefaultOutputProcessorFactory::class)
 interface KotlinCompilerOutputSink {
     fun deliver(line: String)
+    fun deliver(lines: List<String>)
 }
 
 private class DefaultOutputProcessorFactory @Inject constructor(
-    val stream: PrintStream
+    val streamProvider: Provider<PrintStream>
 ) : KotlinCompilerOutputSink {
     private val executionRoot: String = Paths.get("").toAbsolutePath().toString() + File.separator
 
     override fun deliver(line: String) {
-        stream.println(trimExecutionRootPrefix(line))
+        streamProvider.get().println(trimExecutionRootPrefix(line))
+    }
+
+    override fun deliver(lines: List<String>) {
+        streamProvider.get().also { stream -> lines.map(::trimExecutionRootPrefix).forEach(stream::println) }
     }
 
     private fun trimExecutionRootPrefix(toPrint: String): String {
         // trim off the workspace component
         return if (toPrint.startsWith(executionRoot)) {
-            toPrint.replaceFirst(executionRoot.toRegex(), "")
+            toPrint.replaceFirst(executionRoot, "")
         } else toPrint
     }
 }