diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml
index 23d15a54..b98a2918 100644
--- a/.github/workflows/build.yml
+++ b/.github/workflows/build.yml
@@ -42,7 +42,7 @@ jobs:
           version: 1.7.21
 
       - name: Setup Gradle
-        uses: gradle/gradle-build-action@v2.4.2
+        uses: gradle/gradle-build-action@v2
         with:
           gradle-version: 8.0.2
 
@@ -64,23 +64,25 @@ jobs:
           
           echo "OsType:         $OSTYPE"
           
-          gradle clean assemble test || { echo 'Compilation or Unit tests failed' ; exit 1; }
+          chmod +x ./gradlew
+          
+          ./gradlew clean assemble test || { echo 'Compilation or Unit tests failed' ; exit 1; }
           
           if [[ "$OSTYPE" == "linux"* ]]; then
             echo "Linux test..."
-            gradle -DosType=$OSTYPE -DincludeTags='posix | linux' integrationTest
+            ./gradlew -DosType=$OSTYPE -DincludeTags='posix | linux' integrationTest
           elif [[ "$OSTYPE" == "darwin"* ]]; then
             echo "MacOs test..."
-            gradle -DosType=$OSTYPE -DincludeTags='posix | macos' integrationTest
+            ./gradlew -DosType=$OSTYPE -DincludeTags='posix | macos' integrationTest
           elif [[ "$OSTYPE" == "cygwin" ]]; then
             echo "Cygwin test..."
-            gradle -DosType=$OSTYPE -DincludeTags='posix | cygwin' integrationTest
+            ./gradlew -DosType=$OSTYPE -DincludeTags='posix | cygwin' integrationTest
           elif [[ "$OSTYPE" == "msys" ]]; then
             echo "MSys test..."
-            gradle -DosType=$OSTYPE -DincludeTags='posix | msys' integrationTest
+            ./gradlew -DosType=$OSTYPE -DincludeTags='posix | msys' integrationTest
           elif [[ "$OSTYPE" == "freebsd"* ]]; then
             echo "FreeBsd test..."
-            gradle -DosType=$OSTYPE -DincludeTags='posix' integrationTest
+            ./gradlew -DosType=$OSTYPE -DincludeTags='posix' integrationTest
           else
             echo "Unknown OS"
             exit 1
@@ -91,7 +93,7 @@ jobs:
         shell: cmd
         run: |
           echo "Windows test..."
-          gradle -DosType=windows -DincludeTags="windows" clean assemble test integrationTest
+          .\gradlew -DosType=windows -DincludeTags="windows" clean assemble test integrationTest
 
       - name: Install Cygwin (only Windows)
         if: matrix.variant == 'cygwin'
@@ -105,5 +107,5 @@ jobs:
           echo "Cygwin test..."
           echo "Changing directory to $GITHUB_WORKSPACE ..."
           cd $GITHUB_WORKSPACE
-          gradle clean assemble test || { echo 'Compilation or Unit tests failed' ; exit 1; }
-          gradle -DosType=$OSTYPE -DincludeTags='posix | cygwin' integrationTest
+          ./gradlew clean assemble test || { echo 'Compilation or Unit tests failed' ; exit 1; }
+          ./gradlew -DosType=$OSTYPE -DincludeTags='posix | cygwin' integrationTest
diff --git a/build.gradle.kts b/build.gradle.kts
index 91893b3c..38e7862f 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -303,7 +303,8 @@ dependencies {
     implementation("com.konghq:unirest-java:3.14.2")
 
     implementation("net.igsoft:tablevis:0.6.0")
-    implementation("io.github.kscripting:shell:0.5.2")
+    implementation("io.github.kscripting:shell:0.6.0-SNAPSHOT")
+    implementation("io.github.kscripting:shell:0.6.0-SNAPSHOT:test")
 
     implementation("org.slf4j:slf4j-nop:2.0.7")
 
diff --git a/src/integration/kotlin/io/github/kscripting/kscript/integration/AnnotationTest.kt b/src/integration/kotlin/io/github/kscripting/kscript/integration/AnnotationTest.kt
index a00f264d..e87e84ab 100644
--- a/src/integration/kotlin/io/github/kscripting/kscript/integration/AnnotationTest.kt
+++ b/src/integration/kotlin/io/github/kscripting/kscript/integration/AnnotationTest.kt
@@ -1,10 +1,6 @@
 package io.github.kscripting.kscript.integration
 
-import io.github.kscripting.kscript.integration.tools.TestAssertion.any
-import io.github.kscripting.kscript.integration.tools.TestAssertion.startsWith
-import io.github.kscripting.kscript.integration.tools.TestAssertion.verify
-import io.github.kscripting.kscript.integration.tools.TestContext.projectDir
-import io.github.kscripting.kscript.integration.tools.TestContext.resolvePath
+import io.github.kscripting.shell.integration.tools.TestContext.projectPath
 import org.apache.commons.io.FileUtils
 import org.junit.jupiter.api.Tag
 import org.junit.jupiter.api.Test
@@ -15,28 +11,48 @@ class AnnotationTest : TestBase {
     @Tag("posix")
     @Tag("windows")
     fun `There are some dependencies which are not jar, but maybe pom, aar and others - make sure they work, too`() {
-        verify("kscript ${resolvePath("$projectDir/test/resources/depends_on_with_type.kts")}", 0, "getBigDecimal(1L): 1\n", any())
+        verify(
+            "kscript ${projectPath / "test/resources/depends_on_with_type.kts"}",
+            0,
+            "getBigDecimal(1L): 1[nl]",
+            any()
+        )
     }
 
     @Test
     @Tag("posix")
     @Tag("windows")
     fun `Make sure that DependsOn is parsed correctly`() {
-        verify("kscript ${resolvePath("$projectDir/test/resources/depends_on_annot.kts")}", 0, "kscript with annotations rocks!\n", any())
+        verify(
+            "kscript ${projectPath / "test/resources/depends_on_annot.kts"}",
+            0,
+            "kscript with annotations rocks![nl]",
+            any()
+        )
     }
 
     @Test
     @Tag("posix")
     @Tag("windows")
     fun `Make sure that DependsOnMaven is parsed correctly`() {
-        verify("kscript ${resolvePath("$projectDir/test/resources/depends_on_maven_annot.kts")}", 0, "kscript with annotations rocks!\n", any())
+        verify(
+            "kscript ${projectPath / "test/resources/depends_on_maven_annot.kts"}",
+            0,
+            "kscript with annotations rocks![nl]",
+            any()
+        )
     }
 
     @Test
     @Tag("posix")
     @Tag("windows")
     fun `Make sure that dynamic versions are matched properly`() {
-        verify("kscript ${resolvePath("$projectDir/test/resources/depends_on_dynamic.kts")}", 0, "dynamic kscript rocks!\n", any())
+        verify(
+            "kscript ${projectPath / "test/resources/depends_on_dynamic.kts"}",
+            0,
+            "dynamic kscript rocks![nl]",
+            any()
+        )
     }
 
     @Test
@@ -44,18 +60,18 @@ class AnnotationTest : TestBase {
     @Tag("windows")
     fun `Make sure that MavenRepository is parsed correctly`() {
         verify(
-            "kscript ${resolvePath("$projectDir/test/resources/custom_mvn_repo_annot.kts")}",
+            "kscript ${projectPath / "test/resources/custom_mvn_repo_annot.kts"}",
             0,
-            "kscript with annotations rocks!\n",
-            startsWith("[kscript] Adding repository: Repository(id=, url=http://maven.imagej.net/content/repositories/releases, user=, password=)\n")
+            "kscript with annotations rocks![nl]",
+            startsWith("[kscript] Adding repository: Repository(id=, url=http://maven.imagej.net/content/repositories/releases, user=, password=)[nl]")
         )
         verify(
-            "kscript ${resolvePath("$projectDir/test/resources/illegal_depends_on_arg.kts")}",
+            "kscript ${projectPath / "test/resources/illegal_depends_on_arg.kts"}",
             1,
             "",
-            "[kscript] [ERROR] Artifact locators must be provided as separate annotation arguments and not as comma-separated list: [com.squareup.moshi:moshi:1.5.0,com.squareup.moshi:moshi-adapters:1.5.0]\n\n"
+            "[kscript] [ERROR] Artifact locators must be provided as separate annotation arguments and not as comma-separated list: [com.squareup.moshi:moshi:1.5.0,com.squareup.moshi:moshi-adapters:1.5.0][nl][nl]"
         )
-        verify("kscript $projectDir/test/resources/script_with_compile_flags.kts", 0, "hoo_ray\n", any())
+        verify("kscript ${projectPath / "test/resources/script_with_compile_flags.kts"}", 0, "hoo_ray[nl]", any())
     }
 
     @Test
@@ -68,10 +84,10 @@ class AnnotationTest : TestBase {
         }
 
         verify(
-            "kscript ${resolvePath("$projectDir/test/resources/depends_on_klaxon.kts")}",
+            "kscript ${projectPath / "test/resources/depends_on_klaxon.kts"}",
             0,
-            "Successfully resolved klaxon\n",
-            startsWith("[kscript] Resolving com.beust:klaxon:5.5...\n")
+            "Successfully resolved klaxon[nl]",
+            startsWith("[kscript] Resolving com.beust:klaxon:5.5...[nl]")
         )
     }
 }
diff --git a/src/integration/kotlin/io/github/kscripting/kscript/integration/BootstrapHeaderTest.kt b/src/integration/kotlin/io/github/kscripting/kscript/integration/BootstrapHeaderTest.kt
index 065b56ee..8744108a 100644
--- a/src/integration/kotlin/io/github/kscripting/kscript/integration/BootstrapHeaderTest.kt
+++ b/src/integration/kotlin/io/github/kscripting/kscript/integration/BootstrapHeaderTest.kt
@@ -1,11 +1,7 @@
 package io.github.kscripting.kscript.integration
 
-import io.github.kscripting.kscript.integration.tools.TestAssertion.contains
-import io.github.kscripting.kscript.integration.tools.TestAssertion.startsWith
-import io.github.kscripting.kscript.integration.tools.TestAssertion.verify
-import io.github.kscripting.kscript.integration.tools.TestContext.copyToTestPath
-import io.github.kscripting.kscript.integration.tools.TestContext.resolvePath
-import io.github.kscripting.kscript.integration.tools.TestContext.testDir
+import io.github.kscripting.shell.integration.tools.TestContext
+import io.github.kscripting.shell.integration.tools.TestContext.testPath
 import org.junit.jupiter.api.Tag
 import org.junit.jupiter.api.Test
 
@@ -16,25 +12,30 @@ class BootstrapHeaderTest : TestBase {
     //TODO: Doesn't work on msys and cygwin for some reason
     fun `Test adding bootstrap header`() {
         // ensure script works as is
-        val testFile = resolvePath("$testDir/echo_stdin_args.kts")
-        verify("echo stdin | '$testFile' --foo bar", 0, "stdin | script --foo bar\n")
+        val testFile = testPath / "echo_stdin_args.kts"
+        verify("echo stdin | '$testFile' --foo bar", 0, "stdin | script --foo bar[nl]")
 
         // add bootstrap header
         verify("kscript --add-bootstrap-header '$testFile'", 0, "", contains("echo_stdin_args.kts updated"))
 
         // ensure adding it again raises an error
-        verify("kscript --add-bootstrap-header '$testFile'", 1, "", startsWith("[kscript] [ERROR] Bootstrap header already detected:"))
+        verify(
+            "kscript --add-bootstrap-header '$testFile'",
+            1,
+            "",
+            startsWith("[kscript] [ERROR] Bootstrap header already detected:")
+        )
 
         // ensure scripts works with header, including stdin
-        verify("echo stdin | '$testFile' --foo bar", 0, "stdin | script --foo bar\n")
+        verify("echo stdin | '$testFile' --foo bar", 0, "stdin | script --foo bar[nl]")
 
         // ensure scripts works with header invoked with explicit `kscript`
-        verify("echo stdin | kscript '$testFile' --foo bar", 0, "stdin | script --foo bar\n")
+        verify("echo stdin | kscript '$testFile' --foo bar", 0, "stdin | script --foo bar[nl]")
     }
 
     companion object {
         init {
-            copyToTestPath("test/resources/echo_stdin_args.kts")
+            TestContext.copyFile("test/resources/echo_stdin_args.kts", testPath)
         }
     }
 }
diff --git a/src/integration/kotlin/io/github/kscripting/kscript/integration/CliReplTest.kt b/src/integration/kotlin/io/github/kscripting/kscript/integration/CliReplTest.kt
index 969285e6..7582c200 100644
--- a/src/integration/kotlin/io/github/kscripting/kscript/integration/CliReplTest.kt
+++ b/src/integration/kotlin/io/github/kscripting/kscript/integration/CliReplTest.kt
@@ -1,7 +1,5 @@
 package io.github.kscripting.kscript.integration
 
-import io.github.kscripting.kscript.integration.tools.TestAssertion.startsWith
-import io.github.kscripting.kscript.integration.tools.TestAssertion.verify
 import org.junit.jupiter.api.Tag
 import org.junit.jupiter.api.Test
 
diff --git a/src/integration/kotlin/io/github/kscripting/kscript/integration/CustomInterpretersTest.kt b/src/integration/kotlin/io/github/kscripting/kscript/integration/CustomInterpretersTest.kt
index 961e1729..d5426107 100644
--- a/src/integration/kotlin/io/github/kscripting/kscript/integration/CustomInterpretersTest.kt
+++ b/src/integration/kotlin/io/github/kscripting/kscript/integration/CustomInterpretersTest.kt
@@ -1,9 +1,8 @@
 package io.github.kscripting.kscript.integration
 
-import io.github.kscripting.kscript.integration.tools.TestContext.copyToExecutablePath
-import io.github.kscripting.kscript.integration.tools.TestAssertion.any
-import io.github.kscripting.kscript.integration.tools.TestAssertion.verify
-import io.github.kscripting.kscript.integration.tools.TestContext.projectDir
+import io.github.kscripting.shell.integration.tools.TestContext.copyFile
+import io.github.kscripting.shell.integration.tools.TestContext.execPath
+import io.github.kscripting.shell.integration.tools.TestContext.projectPath
 import org.junit.jupiter.api.Tag
 import org.junit.jupiter.api.Test
 
@@ -11,18 +10,18 @@ class CustomInterpretersTest : TestBase {
     @Test
     @Tag("posix")
     fun `Execute mydsl as interpreter`() {
-        verify("mydsl \"println(foo)\"", 0, "bar\n", any())
+        verify("mydsl \"println(foo)\"", 0, "bar[nl]", any())
     }
 
     @Test
     @Tag("posix")
     fun `Execute mydsl test with deps`() {
-        verify("$projectDir/test/resources/custom_dsl/mydsl_test_with_deps.kts", 0, "foobar\n", any())
+        verify((projectPath / "test/resources/custom_dsl/mydsl_test_with_deps.kts").stringPath(), 0, "foobar[nl]", any())
     }
 
     companion object {
         init {
-            copyToExecutablePath("test/resources/custom_dsl/mydsl")
+            copyFile("test/resources/custom_dsl/mydsl", execPath)
         }
     }
 }
diff --git a/src/integration/kotlin/io/github/kscripting/kscript/integration/DeprecatedReportTest.kt b/src/integration/kotlin/io/github/kscripting/kscript/integration/DeprecatedReportTest.kt
index 08efd453..d2d055f1 100644
--- a/src/integration/kotlin/io/github/kscripting/kscript/integration/DeprecatedReportTest.kt
+++ b/src/integration/kotlin/io/github/kscripting/kscript/integration/DeprecatedReportTest.kt
@@ -1,10 +1,6 @@
 package io.github.kscripting.kscript.integration
 
-import io.github.kscripting.kscript.integration.tools.TestAssertion.contains
-import io.github.kscripting.kscript.integration.tools.TestAssertion.startsWith
-import io.github.kscripting.kscript.integration.tools.TestAssertion.verify
-import io.github.kscripting.kscript.integration.tools.TestContext.projectDir
-import io.github.kscripting.kscript.integration.tools.TestContext.resolvePath
+import io.github.kscripting.shell.integration.tools.TestContext.projectPath
 import org.junit.jupiter.api.Tag
 import org.junit.jupiter.api.Test
 
@@ -14,9 +10,9 @@ class DeprecatedReportTest : TestBase {
     @Tag("windows")
     fun `Make sure that for deprecated features warn is generated`() {
         verify(
-            "kscript ${resolvePath("$projectDir/test/resources/deprecated_report.kt")}",
+            "kscript ${projectPath / "test/resources/deprecated_report.kt"}",
             0,
-            "made it!\n",
+            "made it![nl]",
             startsWith("[kscript] [WARN] There are deprecated features in scripts. Use --report option to print full report.")
         )
     }
@@ -26,7 +22,7 @@ class DeprecatedReportTest : TestBase {
     @Tag("windows")
     fun `Assert that report with deprecated features is generated`() {
         verify(
-            "kscript --report ${resolvePath("$projectDir/test/resources/deprecated_report.kt")}",
+            "kscript --report ${projectPath / "test/resources/deprecated_report.kt"}",
             0,
             "",
             contains("@file:DependsOn(\"org.apache.commons:commons-lang3:3.12.0\")")
diff --git a/src/integration/kotlin/io/github/kscripting/kscript/integration/EnvironmentTest.kt b/src/integration/kotlin/io/github/kscripting/kscript/integration/EnvironmentTest.kt
index 0d3ab77e..a023f2f6 100644
--- a/src/integration/kotlin/io/github/kscripting/kscript/integration/EnvironmentTest.kt
+++ b/src/integration/kotlin/io/github/kscripting/kscript/integration/EnvironmentTest.kt
@@ -1,7 +1,6 @@
 package io.github.kscripting.kscript.integration
 
-import io.github.kscripting.kscript.integration.tools.TestAssertion.verify
-import io.github.kscripting.kscript.integration.tools.TestContext.projectDir
+import io.github.kscripting.shell.integration.tools.TestContext.projectPath
 import org.junit.jupiter.api.Tag
 import org.junit.jupiter.api.Test
 
@@ -10,7 +9,7 @@ class EnvironmentTest : TestBase {
     @Tag("posix")
     @Tag("windows")
     fun `Make sure that KOTLIN_HOME can be guessed from kotlinc correctly`() {
-        verify("kscript \"println(99)\"", 0, "99\n") { env -> env.remove("KOTLIN_HOME") }
+        verify("kscript \"println(99)\"", 0, "99[nl]") { env -> env.remove("KOTLIN_HOME") }
     }
 
     //TODO: test what happens if kotlin/kotlinc/java/gradle/idea is not in PATH
@@ -18,7 +17,7 @@ class EnvironmentTest : TestBase {
     @Test
     @Tag("posix")
     fun `Run script that tries to find out its own filename via environment variable`() {
-        val path = "$projectDir/test/resources/uses_self_file_name.kts"
-        verify(path, 0, "Usage: uses_self_file_name.kts [-ae] [--foo] file+\n")
+        val path = (projectPath / "test/resources/uses_self_file_name.kts").toString()
+        verify(path, 0, "Usage: uses_self_file_name.kts [-ae] [--foo] file+[nl]")
     }
 }
diff --git a/src/integration/kotlin/io/github/kscripting/kscript/integration/IdeaTest.kt b/src/integration/kotlin/io/github/kscripting/kscript/integration/IdeaTest.kt
index 66992a3e..3feb85fe 100644
--- a/src/integration/kotlin/io/github/kscripting/kscript/integration/IdeaTest.kt
+++ b/src/integration/kotlin/io/github/kscripting/kscript/integration/IdeaTest.kt
@@ -1,10 +1,9 @@
 package io.github.kscripting.kscript.integration
 
-import io.github.kscripting.kscript.integration.tools.TestAssertion.any
-import io.github.kscripting.kscript.integration.tools.TestAssertion.verify
-import io.github.kscripting.kscript.integration.tools.TestContext.copyToExecutablePath
-import io.github.kscripting.kscript.integration.tools.TestContext.projectDir
-import io.github.kscripting.kscript.integration.tools.TestContext.resolvePath
+import io.github.kscripting.shell.integration.tools.TestContext.copyFile
+import io.github.kscripting.shell.integration.tools.TestContext.execPath
+import io.github.kscripting.shell.integration.tools.TestContext.projectPath
+import io.github.kscripting.shell.util.Sanitizer
 import org.junit.jupiter.api.Tag
 import org.junit.jupiter.api.Test
 
@@ -14,7 +13,9 @@ class IdeaTest : TestBase {
     @Tag("macos")
     //TODO: On MSys and Cygwin test doesn't work, and is accomplished with timeout
     fun `Temp projects with include symlinks`() {
-        val result = verify("kscript --idea ${resolvePath("$projectDir/test/resources/includes/include_variations.kts")}", 0, any(), any())
+        val result = verify(
+            "kscript --idea ${projectPath / "test/resources/includes/include_variations.kts"}", 0, any(), any(), outputSanitizer = Sanitizer.EMPTY_SANITIZER
+        )
         val ideaDir = result.stderr.trim().lines().last().removePrefix("[kscript] ")
         verify("cd $ideaDir && gradle build", 0, any(), any())
     }
@@ -24,14 +25,15 @@ class IdeaTest : TestBase {
     @Tag("macos")
     //TODO: On MSys and Cygwin test doesn't work, and is accomplished with timeout
     fun `Support diamond-shaped include schemes (see #133)`() {
-        val result = verify("kscript --idea ${resolvePath("$projectDir/test/resources/includes/diamond.kts")}", 0, any(), any())
+        val result =
+            verify("kscript --idea ${projectPath / "test/resources/includes/diamond.kts"}", 0, any(), any(), outputSanitizer = Sanitizer.EMPTY_SANITIZER)
         val ideaDir = result.stderr.trim().lines().last().removePrefix("[kscript] ")
         verify("cd $ideaDir && gradle build", 0, any(), any())
     }
 
     companion object {
         init {
-            copyToExecutablePath("test/resources/idea")
+            copyFile("test/resources/idea", execPath)
         }
     }
 }
diff --git a/src/integration/kotlin/io/github/kscripting/kscript/integration/KtSupportTest.kt b/src/integration/kotlin/io/github/kscripting/kscript/integration/KtSupportTest.kt
index dc895b11..45f6b093 100644
--- a/src/integration/kotlin/io/github/kscripting/kscript/integration/KtSupportTest.kt
+++ b/src/integration/kotlin/io/github/kscripting/kscript/integration/KtSupportTest.kt
@@ -1,9 +1,6 @@
 package io.github.kscripting.kscript.integration
 
-import io.github.kscripting.kscript.integration.tools.TestAssertion.any
-import io.github.kscripting.kscript.integration.tools.TestAssertion.verify
-import io.github.kscripting.kscript.integration.tools.TestContext.projectDir
-import io.github.kscripting.kscript.integration.tools.TestContext.resolvePath
+import io.github.kscripting.shell.integration.tools.TestContext.projectPath
 import org.junit.jupiter.api.Tag
 import org.junit.jupiter.api.Test
 
@@ -11,14 +8,19 @@ class KtSupportTest : TestBase {
     @Test
     @Tag("posix")
     fun `Run kt via interpreter mode`() {
-        verify(resolvePath("$projectDir/test/resources/kt_tests/simple_app.kt").stringPath(), 0, "main was called\n", any())
+        verify((projectPath / "test/resources/kt_tests/simple_app.kt").stringPath(), 0, "main was called[nl]", any())
     }
 
     @Test
     @Tag("posix")
     @Tag("windows")
     fun `Run kt via interpreter mode with dependencies`() {
-        verify("kscript ${resolvePath("$projectDir/test/resources/kt_tests/main_with_deps.kt")}", 0, "made it!\n", "[kscript] Resolving log4j:log4j:1.2.14...\n")
+        verify(
+            "kscript ${projectPath / "test/resources/kt_tests/main_with_deps.kt"}",
+            0,
+            "made it![nl]",
+            "[kscript] Resolving log4j:log4j:1.2.14...[nl]"
+        )
     }
 
     @Test
@@ -28,21 +30,39 @@ class KtSupportTest : TestBase {
     @Tag("windows")
     //TODO: Additional new lines are in stdout for cygwin
     fun `Test misc entry point with or without package configurations (no cygwin)`() {
-        verify("kscript ${resolvePath("$projectDir/test/resources/kt_tests/default_entry_nopckg.kt")}", 0, "main was called\n", any())
-        verify("kscript ${resolvePath("$projectDir/test/resources/kt_tests/default_entry_withpckg.kt")}", 0, "main was called\n", any())
+        verify(
+            "kscript ${projectPath / "test/resources/kt_tests/default_entry_nopckg.kt"}",
+            0,
+            "main was called[nl]",
+            any()
+        )
+        verify(
+            "kscript ${projectPath / "test/resources/kt_tests/default_entry_withpckg.kt"}",
+            0,
+            "main was called[nl]",
+            any()
+        )
     }
 
     @Test
     @Tag("posix")
     @Tag("windows")
     fun `Test misc entry point with or without package configurations`() {
-        verify("kscript ${resolvePath("$projectDir/test/resources/kt_tests/custom_entry_nopckg.kt")}", 0, "foo companion was called\n")
-        verify("kscript ${resolvePath("$projectDir/test/resources/kt_tests/custom_entry_withpckg.kt")}", 0, "foo companion was called\n")
+        verify(
+            "kscript ${projectPath / "test/resources/kt_tests/custom_entry_nopckg.kt"}",
+            0,
+            "foo companion was called[nl]"
+        )
+        verify(
+            "kscript ${projectPath / "test/resources/kt_tests/custom_entry_withpckg.kt"}",
+            0,
+            "foo companion was called[nl]"
+        )
     }
 
     @Test
     @Tag("posix")
     fun `Also make sure that kts in package can be run via kscript`() {
-        verify(resolvePath("$projectDir/test/resources/script_in_pckg.kts").stringPath(), 0, "I live in a package!\n", any())
+        verify((projectPath / "test/resources/script_in_pckg.kts").stringPath(), 0, "I live in a package![nl]", any())
     }
 }
diff --git a/src/integration/kotlin/io/github/kscripting/kscript/integration/MiscTest.kt b/src/integration/kotlin/io/github/kscripting/kscript/integration/MiscTest.kt
index 30d53c79..a21626c2 100644
--- a/src/integration/kotlin/io/github/kscripting/kscript/integration/MiscTest.kt
+++ b/src/integration/kotlin/io/github/kscripting/kscript/integration/MiscTest.kt
@@ -1,11 +1,7 @@
 package io.github.kscripting.kscript.integration
 
-import io.github.kscripting.kscript.integration.tools.TestAssertion.any
-import io.github.kscripting.kscript.integration.tools.TestAssertion.contains
-import io.github.kscripting.kscript.integration.tools.TestAssertion.verify
-import io.github.kscripting.kscript.integration.tools.TestContext.projectDir
-import io.github.kscripting.kscript.integration.tools.TestContext.resolvePath
-import io.github.kscripting.kscript.integration.tools.TestContext.testDir
+import io.github.kscripting.shell.integration.tools.TestContext.projectPath
+import io.github.kscripting.shell.integration.tools.TestContext.testPath
 import org.junit.jupiter.api.Tag
 import org.junit.jupiter.api.Test
 
@@ -14,7 +10,7 @@ class MiscTest : TestBase {
     @Tag("posix")
     @Tag("windows")
     fun `Clearing cache test`() {
-        verify("kscript --clear-cache", 0, "", "Cleaning up cache...\n")
+        verify("kscript --clear-cache", 0, "", "Cleaning up cache...[nl]")
     }
 
     @Test
@@ -49,7 +45,7 @@ class MiscTest : TestBase {
     @Test
     @Tag("posix")
     fun `Prevent regression of #181`() {
-        verify("""echo "println(123)" > $testDir/123foo.kts; kscript $testDir/123foo.kts""", 0, "123\n")
+        verify("""echo "println(123)" > $testPath/123foo.kts; kscript $testPath/123foo.kts""", 0, "123[nl]")
     }
 
     @Test
@@ -58,19 +54,19 @@ class MiscTest : TestBase {
     @Tag("msys")
     //TODO: @Tag("cygwin") - doesn't work on cygwin
     fun `Prevent regression of #185`() {
-        verify("source $projectDir/test/resources/home_dir_include.sh $testDir", 0, "42\n")
+        verify("source $projectPath/test/resources/home_dir_include.sh $testPath", 0, "42[nl]")
     }
 
     @Test
     @Tag("posix")
     fun `Prevent regression of #173`() {
-        verify("source $projectDir/test/resources/compiler_opts_with_includes.sh $testDir", 0, "hello42\n", any())
+        verify("source $projectPath/test/resources/compiler_opts_with_includes.sh $testPath", 0, "hello42[nl]", any())
     }
 
     @Test
     @Tag("posix")
     fun `Ensure relative includes with in shebang mode`() {
-        verify("$projectDir/test/resources/includes/shebang_mode_includes", 0, "include_1\n")
+        verify("$projectPath/test/resources/includes/shebang_mode_includes", 0, "include_1[nl]")
     }
 
     @Test
@@ -78,21 +74,21 @@ class MiscTest : TestBase {
     @Tag("windows")
     fun `Ensure that compilation errors are not cached #349`() {
         //first run (not yet cached)
-        verify("kscript $projectDir/test/resources/invalid_script.kts", 1, "", contains("error: expecting ')'"))
+        verify("kscript $projectPath/test/resources/invalid_script.kts", 1, "", contains("error: expecting ')'"))
         //real test
-        verify("kscript $projectDir/test/resources/invalid_script.kts", 1, "", contains("error: expecting ')'"))
+        verify("kscript $projectPath/test/resources/invalid_script.kts", 1, "", contains("error: expecting ')'"))
     }
 
     @Test
     @Tag("posix")
     @Tag("windows")
     fun `Test local jar dir referenced in ENV variable`() {
-        val shellPath = resolvePath("$projectDir/test/resources/config/")
+        val shellPath = projectPath / "test/resources/config/"
 
         verify(
-            "kscript ${shellPath.resolve("script_with_local_jars.kts")}",
+            "kscript ${shellPath / "script_with_local_jars.kts"}",
             0,
-            "I am living in Test1 class...\nAnd I come from Test2 class...\n",
+            "I am living in Test1 class...[nl]And I come from Test2 class...[nl]",
             ""
         ) { env ->
             env["KSCRIPT_DIRECTORY_ARTIFACTS"] = shellPath.resolve("jars").stringPath()
diff --git a/src/integration/kotlin/io/github/kscripting/kscript/integration/PackagingTest.kt b/src/integration/kotlin/io/github/kscripting/kscript/integration/PackagingTest.kt
index f296e794..d8b00aa0 100644
--- a/src/integration/kotlin/io/github/kscripting/kscript/integration/PackagingTest.kt
+++ b/src/integration/kotlin/io/github/kscripting/kscript/integration/PackagingTest.kt
@@ -1,10 +1,7 @@
 package io.github.kscripting.kscript.integration
 
-import io.github.kscripting.kscript.integration.tools.TestAssertion.any
-import io.github.kscripting.kscript.integration.tools.TestAssertion.startsWith
-import io.github.kscripting.kscript.integration.tools.TestAssertion.verify
-import io.github.kscripting.kscript.integration.tools.TestContext.projectDir
-import io.github.kscripting.kscript.integration.tools.TestContext.resolvePath
+import io.github.kscripting.shell.integration.tools.TestContext.projectPath
+import io.github.kscripting.shell.util.Sanitizer
 import org.junit.jupiter.api.Tag
 import org.junit.jupiter.api.Test
 
@@ -26,9 +23,9 @@ class PackagingTest : TestBase {
     //TODO: doesn't work on msys, cygwin, windows
     fun `Packaging of simple script`() {
         val result =
-            verify("kscript --package ${resolvePath("$projectDir/test/resources/package_example.kts")}", 0, "", any())
+            verify("kscript --package ${projectPath / "test/resources/package_example.kts"}", 0, "", any(), outputSanitizer = Sanitizer.EMPTY_SANITIZER)
         val command = result.stderr.trim().lines().last().removePrefix("[kscript] ")
-        verify("$command argument", 0, "package_me_args_1_mem_536870912\n")
+        verify("$command argument", 0, "package_me_args_1_mem_536870912[nl]")
     }
 
     @Test
@@ -36,8 +33,8 @@ class PackagingTest : TestBase {
     @Tag("macos")
     //TODO: doesn't work on msys, cygwin, windows
     fun `Packaging provided source code and execution with arguments`() {
-        val result = verify("""kscript --package "println(args.size)"""", 0, "", any())
+        val result = verify("""kscript --package "println(args.size)"""", 0, "", any(), outputSanitizer = Sanitizer.EMPTY_SANITIZER)
         val command = result.stderr.trim().lines().last().removePrefix("[kscript] ")
-        verify("$command three arg uments", 0, "3\n")
+        verify("$command three arg uments", 0, "3[nl]")
     }
 }
diff --git a/src/integration/kotlin/io/github/kscripting/kscript/integration/ResolverTest.kt b/src/integration/kotlin/io/github/kscripting/kscript/integration/ResolverTest.kt
index 790e9e0a..c5a3c5ec 100644
--- a/src/integration/kotlin/io/github/kscripting/kscript/integration/ResolverTest.kt
+++ b/src/integration/kotlin/io/github/kscripting/kscript/integration/ResolverTest.kt
@@ -1,9 +1,6 @@
 package io.github.kscripting.kscript.integration
 
-import io.github.kscripting.kscript.integration.tools.TestAssertion.startsWith
-import io.github.kscripting.kscript.integration.tools.TestAssertion.verify
-import io.github.kscripting.kscript.integration.tools.TestContext.projectDir
-import io.github.kscripting.kscript.integration.tools.TestContext.resolvePath
+import io.github.kscripting.shell.integration.tools.TestContext.projectPath
 import org.junit.jupiter.api.Tag
 import org.junit.jupiter.api.Test
 import java.io.File
@@ -15,9 +12,9 @@ class ResolverTest : TestBase {
     fun `It should run kscript and resolve dependencies`() {
         // The first time artifact resolution is started because the cache is cleaned...
         verify(
-            "kscript ${resolvePath("$projectDir/test/resources/depends_on_annot.kts")}",
+            "kscript ${projectPath / "test/resources/depends_on_annot.kts"}",
             0,
-            "kscript with annotations rocks!\n",
+            "kscript with annotations rocks![nl]",
             startsWith("[kscript] Resolving log4j:log4j:1.2.14")
         )
 
@@ -32,9 +29,9 @@ class ResolverTest : TestBase {
 
         // The second time it is because of removing artifact from cache...
         verify(
-            "kscript ${resolvePath("$projectDir/test/resources/depends_on_annot.kts")}",
+            "kscript ${projectPath / "test/resources/depends_on_annot.kts"}",
             0,
-            "kscript with annotations rocks!\n",
+            "kscript with annotations rocks![nl]",
             startsWith("[kscript] Resolving log4j:log4j:1.2.14")
         )
     }
diff --git a/src/integration/kotlin/io/github/kscripting/kscript/integration/ScriptInputModesTest.kt b/src/integration/kotlin/io/github/kscripting/kscript/integration/ScriptInputModesTest.kt
index fbdaf2ac..14977e82 100644
--- a/src/integration/kotlin/io/github/kscripting/kscript/integration/ScriptInputModesTest.kt
+++ b/src/integration/kotlin/io/github/kscripting/kscript/integration/ScriptInputModesTest.kt
@@ -1,10 +1,7 @@
 package io.github.kscripting.kscript.integration
 
-import io.github.kscripting.kscript.integration.tools.TestAssertion.any
-import io.github.kscripting.kscript.integration.tools.TestAssertion.verify
-import io.github.kscripting.kscript.integration.tools.TestContext.projectDir
-import io.github.kscripting.kscript.integration.tools.TestContext.resolvePath
-import io.github.kscripting.kscript.integration.tools.TestContext.testDir
+import io.github.kscripting.shell.integration.tools.TestContext.projectPath
+import io.github.kscripting.shell.integration.tools.TestContext.testPath
 import org.junit.jupiter.api.Tag
 import org.junit.jupiter.api.Test
 
@@ -12,7 +9,7 @@ class ScriptInputModesTest : TestBase {
     @Test
     @Tag("posix")
     fun `Make sure that scripts can be piped into kscript`() {
-        verify("source $projectDir/test/resources/direct_script_arg.sh", 0, "kotlin rocks\n", "")
+        verify("source ${projectPath / "test/resources/direct_script_arg.sh"}", 0, "kotlin rocks[nl]", "")
     }
 
     @Test
@@ -26,7 +23,7 @@ class ScriptInputModesTest : TestBase {
     @Tag("posix")
     @Tag("windows")
     fun `Provide script as direct argument`() {
-        verify("""kscript "println(1+1)"""", 0, "2\n", "")
+        verify("""kscript "println(1+1)"""", 0, "2[nl]", "")
     }
 
     @Test
@@ -35,30 +32,30 @@ class ScriptInputModesTest : TestBase {
     @Tag("windows")
     //TODO: Doesn't work on msys, cygwin as during test execution " is replaced with '. It causes syntax error in Kotlin.
     fun `Use dashed arguments`() {
-        verify("""kscript "println(args.joinToString(\"\"))" --arg u ments""", 0, "--arguments\n", "")
+        verify("""kscript "println(args.joinToString(\"\"))" --arg u ments""", 0, "--arguments[nl]", "")
         verify("""kscript -s "print(args.joinToString(\"\"))" --arg u ments""", 0, "--arguments", "")
     }
 
     @Test
     @Tag("posix")
     fun `Provide script via stidin`() {
-        verify("echo 'println(1+1)' | kscript -", 0, "2\n")
+        verify("echo 'println(1+1)' | kscript -", 0, "2[nl]")
         //stdin and further switch (to avoid regressions of #94)
-        verify("echo 'println(1+3)' | kscript - --foo", 0, "4\n")
+        verify("echo 'println(1+3)' | kscript - --foo", 0, "4[nl]")
     }
 
     @Test
     @Tag("windows")
     fun `Provide script via stidin (windows version without quotes)`() {
-        verify("echo println(1+1) | kscript -", 0, "2\n")
+        verify("echo println(1+1) | kscript -", 0, "2[nl]")
         //stdin and further switch (to avoid regressions of #94)
-        verify("echo println(1+3) | kscript - --foo", 0, "4\n")
+        verify("echo println(1+3) | kscript - --foo", 0, "4[nl]")
     }
 
     @Test
     @Tag("posix")
     fun `Make sure that heredoc is accepted as argument`() {
-        verify("source ${projectDir}/test/resources/here_doc_test.sh", 0, "hello kotlin\n")
+        verify("source ${projectPath / "test/resources/here_doc_test.sh"}", 0, "hello kotlin[nl]")
     }
 
     @Test
@@ -66,13 +63,13 @@ class ScriptInputModesTest : TestBase {
     @Tag("macos")
     //Command substitution doesn't work on msys and cygwin
     fun `Make sure that command substitution works as expected`() {
-        verify("source ${projectDir}/test/resources/cmd_subst_test.sh", 0, "command substitution works as well\n")
+        verify("source ${projectPath / "test/resources/cmd_subst_test.sh"}", 0, "command substitution works as well[nl]")
     }
 
     @Test
     @Tag("posix")
     fun `Make sure that it runs with local bash script files`() {
-        verify("source ${projectDir}/test/resources/local_script_file.sh $testDir", 0, "kscript rocks!\n")
+        verify("source ${projectPath / "test/resources/local_script_file.sh"} $testPath", 0, "kscript rocks![nl]")
     }
 
     @Test
@@ -80,10 +77,10 @@ class ScriptInputModesTest : TestBase {
     @Tag("windows")
     fun `Make sure that it runs with local script files`() {
         verify(
-            "kscript ${resolvePath("${projectDir}/test/resources/multi_line_deps.kts")}",
+            "kscript ${projectPath / "test/resources/multi_line_deps.kts"}",
             0,
-            "kscript is  cool!\n",
-            "[kscript] Resolving com.offbytwo:docopt:0.6.0.20150202...\n[kscript] Resolving log4j:log4j:1.2.14...\n"
+            "kscript is  cool![nl]",
+            "[kscript] Resolving com.offbytwo:docopt:0.6.0.20150202...[nl][kscript] Resolving log4j:log4j:1.2.14...[nl]"
         )
     }
 
@@ -91,7 +88,7 @@ class ScriptInputModesTest : TestBase {
     @Tag("posix")
     @Tag("windows")
     fun `Scripts with dashes in the file name should work as well`() {
-        verify("kscript ${resolvePath("$projectDir/test/resources/dash-test.kts")}", 0, "dash alarm!\n")
+        verify("kscript ${projectPath / "test/resources/dash-test.kts"}", 0, "dash alarm![nl]")
     }
 
     @Test
@@ -99,7 +96,7 @@ class ScriptInputModesTest : TestBase {
     @Tag("windows")
     fun `Scripts with additional dots in the file name should work as well`() {
         //We also test inner uppercase letters in file name here by using .*T*est
-        verify("kscript ${resolvePath("$projectDir/test/resources/dot.Test.kts")}", 0, "dot alarm!\n")
+        verify("kscript ${projectPath / "test/resources/dot.Test.kts"}", 0, "dot alarm![nl]")
     }
 
     @Test
@@ -108,9 +105,9 @@ class ScriptInputModesTest : TestBase {
     fun `Make sure that it runs with remote URLs`() {
         verify(
             "kscript https://raw.githubusercontent.com/kscripting/kscript/master/test/resources/url_test.kts",
-            0, "I came from the internet\n", any()
+            0, "I came from the internet[nl]", any()
         )
-        verify("kscript https://git.io/fxHBv", 0, "main was called\n", any())
+        verify("kscript https://git.io/fxHBv", 0, "main was called[nl]", any())
     }
 
     @Test
@@ -118,10 +115,10 @@ class ScriptInputModesTest : TestBase {
     @Tag("windows")
     fun `Missing script gives always error on execution`() {
         verify(
-            "kscript i_do_not_exist.kts", 1, "", "[kscript] [ERROR] Could not read script from 'i_do_not_exist.kts'\n\n"
+            "kscript i_do_not_exist.kts", 1, "", "[kscript] [ERROR] Could not read script from 'i_do_not_exist.kts'[nl][nl]"
         )
         verify(
-            "kscript i_do_not_exist.kts", 1, "", "[kscript] [ERROR] Could not read script from 'i_do_not_exist.kts'\n\n"
+            "kscript i_do_not_exist.kts", 1, "", "[kscript] [ERROR] Could not read script from 'i_do_not_exist.kts'[nl][nl]"
         )
     }
 }
diff --git a/src/integration/kotlin/io/github/kscripting/kscript/integration/SimpleTest.kt b/src/integration/kotlin/io/github/kscripting/kscript/integration/SimpleTest.kt
index b489a674..140eeed3 100644
--- a/src/integration/kotlin/io/github/kscripting/kscript/integration/SimpleTest.kt
+++ b/src/integration/kotlin/io/github/kscripting/kscript/integration/SimpleTest.kt
@@ -1,8 +1,5 @@
 package io.github.kscripting.kscript.integration
 
-import io.github.kscripting.kscript.integration.tools.TestAssertion.contains
-import io.github.kscripting.kscript.integration.tools.TestAssertion.startsWith
-import io.github.kscripting.kscript.integration.tools.TestAssertion.verify
 import org.junit.jupiter.api.Tag
 import org.junit.jupiter.api.Test
 
@@ -11,14 +8,14 @@ class SimpleTest : TestBase {
     @Tag("posix")
     @Tag("windows")
     fun `Providing source code works`() {
-        verify("kscript \"println(1+1)\"", 0, "2\n")
+        verify("kscript \"println(1+1)\"", 0, "2[nl]")
     }
 
     @Test
     @Tag("posix")
     @Tag("windows")
     fun `Debugging information is printed`() {
-        verify("kscript -d \"println(1+1)\"", 0, "2\n", contains("Debugging information for KScript"))
+        verify("kscript -d \"println(1+1)\"", 0, "2[nl]", contains("Debugging information for KScript"))
     }
 
     @Test
diff --git a/src/integration/kotlin/io/github/kscripting/kscript/integration/SupportApiTest.kt b/src/integration/kotlin/io/github/kscripting/kscript/integration/SupportApiTest.kt
index bb8525f2..8ddaf7a5 100644
--- a/src/integration/kotlin/io/github/kscripting/kscript/integration/SupportApiTest.kt
+++ b/src/integration/kotlin/io/github/kscripting/kscript/integration/SupportApiTest.kt
@@ -1,9 +1,6 @@
 package io.github.kscripting.kscript.integration
 
-import io.github.kscripting.kscript.integration.tools.TestAssertion.any
-import io.github.kscripting.kscript.integration.tools.TestAssertion.startsWith
-import io.github.kscripting.kscript.integration.tools.TestAssertion.verify
-import io.github.kscripting.kscript.integration.tools.TestContext.nl
+import io.github.kscripting.shell.integration.tools.TestContext.nl
 import org.junit.jupiter.api.Tag
 import org.junit.jupiter.api.Test
 
@@ -11,12 +8,12 @@ class SupportApiTest : TestBase {
     @Test
     @Tag("posix")
     fun `Make sure that one-liners include support-api`() {
-        verify("""echo "foo${nl}bar" | kscript -t "stdin.print()"""", 0, "foo\nbar\n", any())
-        verify("""echo "foo${nl}bar" | kscript -t "lines.print()"""", 0, "foo\nbar\n", any())
-        verify("""echo 'foo${nl}bar' | kscript -t 'lines.print()'""", 0, "foo\nbar\n", any())
+        verify("""echo "foo${nl}bar" | kscript -t "stdin.print()"""", 0, "foo[nl]bar[nl]", any())
+        verify("""echo "foo${nl}bar" | kscript -t "lines.print()"""", 0, "foo[nl]bar[nl]", any())
+        verify("""echo 'foo${nl}bar' | kscript -t 'lines.print()'""", 0, "foo[nl]bar[nl]", any())
         verify(
             """echo 'foo${nl}bar' | kscript -s --text 'lines.split().select(1,2,-3)'""", 1, "",
-            startsWith("[ERROR] Can not mix positive and negative selections\n")
+            startsWith("[ERROR] Can not mix positive and negative selections[nl]")
         )
     }
 }
diff --git a/src/integration/kotlin/io/github/kscripting/kscript/integration/TestBase.kt b/src/integration/kotlin/io/github/kscripting/kscript/integration/TestBase.kt
index 9c3ded3e..de2055bd 100644
--- a/src/integration/kotlin/io/github/kscripting/kscript/integration/TestBase.kt
+++ b/src/integration/kotlin/io/github/kscripting/kscript/integration/TestBase.kt
@@ -1,16 +1,42 @@
 package io.github.kscripting.kscript.integration
 
-import io.github.kscripting.kscript.integration.tools.TestContext
+import io.github.kscripting.shell.integration.tools.TestContext
+import io.github.kscripting.kscript.util.ShellUtils
+import io.github.kscripting.shell.ShellExecutor
+import io.github.kscripting.shell.integration.tools.ShellTestBase
+import io.github.kscripting.shell.integration.tools.ShellTestCompanionBase
+import io.github.kscripting.shell.process.EnvAdjuster
 import org.junit.jupiter.api.BeforeAll
 
-interface TestBase {
-    companion object {
+interface TestBase : ShellTestBase {
+    companion object : ShellTestCompanionBase() {
         @BeforeAll
         @JvmStatic
         fun setUp() {
-            TestContext.clearCache()
-            TestContext.printPaths()
+            clearCache()
+            printPaths()
             println("[nl] - new line; [bs] - backspace")
         }
+
+        override fun commonEnvAdjuster(specificEnvAdjuster: EnvAdjuster): EnvAdjuster {
+            return { map ->
+                map[TestContext.pathEnvVariableName] = TestContext.pathEnvVariableCalculatedPath
+                specificEnvAdjuster(map)
+                ShellUtils.environmentAdjuster(map)
+            }
+        }
+
+        private fun printPaths() {
+            val kscriptPath = ShellUtils.which(TestContext.osType, "kscript", commonEnvAdjuster())
+            println("kscript path: $kscriptPath")
+            val kotlincPath = ShellUtils.which(TestContext.osType, "kotlinc", commonEnvAdjuster())
+            println("kotlinc path: $kotlincPath")
+        }
+
+        private fun clearCache() {
+            print("Clearing kscript cache... ")
+            ShellExecutor.eval("kscript --clear-cache", TestContext.osType, null, envAdjuster = commonEnvAdjuster())
+            println("done.")
+        }
     }
 }
diff --git a/src/integration/kotlin/io/github/kscripting/kscript/integration/tools/TestAssertion.kt b/src/integration/kotlin/io/github/kscripting/kscript/integration/tools/TestAssertion.kt
deleted file mode 100644
index fdc918e1..00000000
--- a/src/integration/kotlin/io/github/kscripting/kscript/integration/tools/TestAssertion.kt
+++ /dev/null
@@ -1,56 +0,0 @@
-package io.github.kscripting.kscript.integration.tools
-
-import io.github.kscripting.kscript.integration.tools.TestContext.runProcess
-import io.github.kscripting.shell.model.GobbledProcessResult
-import io.github.kscripting.shell.process.EnvAdjuster
-
-object TestAssertion {
-    fun <T : Any> geq(value: T) = GenericEquals(value)
-
-    fun any() = AnyMatch()
-    fun eq(string: String, ignoreCase: Boolean = false) = Equals(string, ignoreCase)
-    fun startsWith(string: String, ignoreCase: Boolean = false) = StartsWith(string, ignoreCase)
-    fun contains(string: String, ignoreCase: Boolean = false) = Contains(string, ignoreCase)
-
-    fun verify(
-        command: String,
-        exitCode: Int = 0,
-        stdOut: TestMatcher<String>,
-        stdErr: String = "",
-        envAdjuster: EnvAdjuster = {}
-    ): GobbledProcessResult = verify(command, exitCode, stdOut, eq(stdErr), envAdjuster)
-
-    fun verify(
-        command: String,
-        exitCode: Int = 0,
-        stdOut: String,
-        stdErr: TestMatcher<String>,
-        envAdjuster: EnvAdjuster = {}
-    ): GobbledProcessResult = verify(command, exitCode, eq(stdOut), stdErr, envAdjuster)
-
-    fun verify(
-        command: String,
-        exitCode: Int = 0,
-        stdOut: String = "",
-        stdErr: String = "",
-        envAdjuster: EnvAdjuster = {}
-    ): GobbledProcessResult = verify(command, exitCode, eq(stdOut), eq(stdErr), envAdjuster)
-
-    fun verify(
-        command: String,
-        exitCode: Int = 0,
-        stdOut: TestMatcher<String>,
-        stdErr: TestMatcher<String>,
-        envAdjuster: EnvAdjuster = {}
-    ): GobbledProcessResult {
-        val processResult = runProcess(command, envAdjuster)
-        val extCde = geq(exitCode)
-
-        extCde.checkAssertion("ExitCode", processResult.exitCode)
-        stdOut.checkAssertion("StdOut", processResult.stdout)
-        stdErr.checkAssertion("StdErr", processResult.stderr)
-        println()
-
-        return processResult
-    }
-}
diff --git a/src/integration/kotlin/io/github/kscripting/kscript/integration/tools/TestContext.kt b/src/integration/kotlin/io/github/kscripting/kscript/integration/tools/TestContext.kt
deleted file mode 100644
index d3c41529..00000000
--- a/src/integration/kotlin/io/github/kscripting/kscript/integration/tools/TestContext.kt
+++ /dev/null
@@ -1,94 +0,0 @@
-package io.github.kscripting.kscript.integration.tools
-
-import io.github.kscripting.kscript.util.ShellUtils
-import io.github.kscripting.kscript.util.ShellUtils.which
-import io.github.kscripting.shell.ShellExecutor
-import io.github.kscripting.shell.model.*
-import io.github.kscripting.shell.process.EnvAdjuster
-
-object TestContext {
-    private val osType: OsType = OsType.findOrThrow(System.getProperty("osType"))
-    private val nativeType = if (osType.isPosixHostedOnWindows()) OsType.WINDOWS else osType
-
-    private val projectPath: OsPath = OsPath.createOrThrow(nativeType, System.getProperty("projectPath"))
-    private val execPath: OsPath = projectPath.resolve("build/kscript/bin")
-    private val testPath: OsPath = projectPath.resolve("build/tmp/test")
-    private val pathEnvName = if (osType.isWindowsLike()) "Path" else "PATH"
-    private val systemPath: String = System.getenv()[pathEnvName]!!
-
-    private val pathSeparator: String = if (osType.isWindowsLike() || osType.isPosixHostedOnWindows()) ";" else ":"
-    private val envPath: String = "${execPath.convert(osType)}$pathSeparator$systemPath"
-
-    val nl: String = System.getProperty("line.separator")
-    val projectDir: String = projectPath.convert(osType).stringPath()
-    val testDir: String = testPath.convert(osType).stringPath()
-
-    init {
-        println("osType         : $osType")
-        println("nativeType     : $nativeType")
-        println("projectDir     : $projectDir")
-        println("testDir        : $testDir")
-        println("execDir        : ${execPath.convert(osType)}")
-        println("Kotlin version : ${ShellExecutor.evalAndGobble(osType, "kotlin -version", null, ::adjustEnv)}")
-
-        testPath.createDirectories()
-    }
-
-    fun resolvePath(path: String): OsPath {
-        return OsPath.createOrThrow(osType, path)
-    }
-
-    fun runProcess(command: String, envAdjuster: EnvAdjuster): GobbledProcessResult {
-        //In MSYS all quotes should be single quotes, otherwise content is interpreted e.g. backslashes.
-        //(MSYS bash interpreter is also replacing double quotes into the single quotes: see: bash -xc 'kscript "println(1+1)"')
-        val newCommand = when {
-            osType.isPosixHostedOnWindows() -> command.replace('"', '\'')
-            else -> command
-        }
-
-        fun internalEnvAdjuster(map: MutableMap<String, String>) {
-            ShellUtils.environmentAdjuster(map)
-            map[pathEnvName] = envPath
-            envAdjuster(map)
-        }
-
-        val result = ShellExecutor.evalAndGobble(osType, newCommand, null, ::internalEnvAdjuster)
-        println(result)
-
-        return result
-    }
-
-    fun copyToExecutablePath(source: String) {
-        val sourceFile = projectPath.resolve(source).toNativeFile()
-        val targetFile = execPath.resolve(sourceFile.name).toNativeFile()
-
-        sourceFile.copyTo(targetFile, overwrite = true)
-        targetFile.setExecutable(true)
-    }
-
-    fun copyToTestPath(source: String) {
-        val sourceFile = projectPath.resolve(source).toNativeFile()
-        val targetFile = testPath.resolve(sourceFile.name).toNativeFile()
-
-        sourceFile.copyTo(targetFile, overwrite = true)
-        targetFile.setExecutable(true) //Needed if the file is kotlin script
-    }
-
-    fun printPaths() {
-        val kscriptPath = which(osType, "kscript", ::adjustEnv)
-        println("kscript path: $kscriptPath")
-        val kotlincPath = which(osType, "kotlinc", ::adjustEnv)
-        println("kotlinc path: $kotlincPath")
-    }
-
-    fun clearCache() {
-        print("Clearing kscript cache... ")
-        ShellExecutor.eval(osType, "kscript --clear-cache", null, ::adjustEnv)
-        println("done.")
-    }
-
-    private fun adjustEnv(map: MutableMap<String, String>) {
-        map[pathEnvName] = envPath
-        ShellUtils.environmentAdjuster(map)
-    }
-}
diff --git a/src/integration/kotlin/io/github/kscripting/kscript/integration/tools/TestMatcher.kt b/src/integration/kotlin/io/github/kscripting/kscript/integration/tools/TestMatcher.kt
deleted file mode 100644
index 4941aff7..00000000
--- a/src/integration/kotlin/io/github/kscripting/kscript/integration/tools/TestMatcher.kt
+++ /dev/null
@@ -1,49 +0,0 @@
-package io.github.kscripting.kscript.integration.tools
-
-import io.github.kscripting.kscript.integration.tools.TestContext.nl
-import org.opentest4j.AssertionFailedError
-
-abstract class TestMatcher<T>(protected val expectedValue: T, private val expressionName: String) {
-    abstract fun matches(value: T): Boolean
-
-    fun checkAssertion(assertionName: String, value: T) {
-        if (matches(value)) {
-            return
-        }
-
-        throw AssertionFailedError(
-            "$nl$nl$assertionName: expected that value '${
-                whitespaceCharsToSymbols(value.toString())
-            }' $expressionName '${
-                whitespaceCharsToSymbols(expectedValue.toString())
-            }'$nl$nl"
-        )
-    }
-}
-
-class GenericEquals<T : Any>(expectedValue: T) : TestMatcher<T>(expectedValue, "is equal to") {
-    override fun matches(value: T): Boolean = (value == expectedValue)
-}
-
-class AnyMatch : TestMatcher<String>("", "has any value") {
-    override fun matches(value: String): Boolean = true
-}
-
-class Equals(private val expectedString: String, private val ignoreCase: Boolean) :
-    TestMatcher<String>(expectedString, "is equal to") {
-    override fun matches(value: String): Boolean = value.equals(normalize(expectedString), ignoreCase)
-}
-
-class StartsWith(private val expectedString: String, private val ignoreCase: Boolean) :
-    TestMatcher<String>(expectedString, "starts with") {
-    override fun matches(value: String): Boolean = value.startsWith(normalize(expectedString), ignoreCase)
-}
-
-class Contains(private val expectedString: String, private val ignoreCase: Boolean) :
-    TestMatcher<String>(expectedString, "contains") {
-    override fun matches(value: String): Boolean = value.contains(normalize(expectedString), ignoreCase)
-}
-
-private fun normalize(string: String) = string.replace("\n", nl)
-
-private fun whitespaceCharsToSymbols(string: String): String = string.replace("\\", "[bs]").lines().joinToString("[nl]")
diff --git a/src/main/kotlin/io/github/kscripting/kscript/KscriptHandler.kt b/src/main/kotlin/io/github/kscripting/kscript/KscriptHandler.kt
index bcadedb4..3b2ca40f 100644
--- a/src/main/kotlin/io/github/kscripting/kscript/KscriptHandler.kt
+++ b/src/main/kotlin/io/github/kscripting/kscript/KscriptHandler.kt
@@ -14,7 +14,7 @@ import io.github.kscripting.kscript.util.FileUtils.getArtifactsRecursively
 import io.github.kscripting.kscript.util.Logger.info
 import io.github.kscripting.kscript.util.Logger.infoMsg
 import io.github.kscripting.kscript.util.Logger.warnMsg
-import io.github.kscripting.shell.model.ScriptType
+import io.github.kscripting.kscript.model.ScriptType
 import java.net.URI
 
 class KscriptHandler(
diff --git a/src/main/kotlin/io/github/kscripting/kscript/cache/Cache.kt b/src/main/kotlin/io/github/kscripting/kscript/cache/Cache.kt
index db6bf69f..c05aa38e 100644
--- a/src/main/kotlin/io/github/kscripting/kscript/cache/Cache.kt
+++ b/src/main/kotlin/io/github/kscripting/kscript/cache/Cache.kt
@@ -2,6 +2,7 @@ package io.github.kscripting.kscript.cache
 
 import io.github.kscripting.kscript.creator.JarArtifact
 import io.github.kscripting.kscript.model.Content
+import io.github.kscripting.kscript.model.ScriptType
 import io.github.kscripting.shell.model.*
 import org.apache.commons.codec.digest.DigestUtils
 import org.apache.commons.io.FileUtils
diff --git a/src/main/kotlin/io/github/kscripting/kscript/code/Templates.kt b/src/main/kotlin/io/github/kscripting/kscript/code/Templates.kt
index d64cfbea..5b35e60f 100644
--- a/src/main/kotlin/io/github/kscripting/kscript/code/Templates.kt
+++ b/src/main/kotlin/io/github/kscripting/kscript/code/Templates.kt
@@ -2,7 +2,7 @@ package io.github.kscripting.kscript.code
 
 import io.github.kscripting.kscript.model.KotlinOpt
 import io.github.kscripting.kscript.model.PackageName
-import io.github.kscripting.shell.model.ScriptType
+import io.github.kscripting.kscript.model.ScriptType
 import org.intellij.lang.annotations.Language
 import java.time.ZonedDateTime
 
diff --git a/src/main/kotlin/io/github/kscripting/kscript/creator/BootstrapCreator.kt b/src/main/kotlin/io/github/kscripting/kscript/creator/BootstrapCreator.kt
index 63b02863..4245f0d7 100644
--- a/src/main/kotlin/io/github/kscripting/kscript/creator/BootstrapCreator.kt
+++ b/src/main/kotlin/io/github/kscripting/kscript/creator/BootstrapCreator.kt
@@ -2,8 +2,8 @@ package io.github.kscripting.kscript.creator
 
 import io.github.kscripting.kscript.code.Templates
 import io.github.kscripting.kscript.model.Script
+import io.github.kscripting.kscript.model.ScriptSource
 import io.github.kscripting.kscript.util.Logger.infoMsg
-import io.github.kscripting.shell.model.*
 import java.io.File
 
 class BootstrapCreator {
diff --git a/src/main/kotlin/io/github/kscripting/kscript/creator/DeprecatedInfoCreator.kt b/src/main/kotlin/io/github/kscripting/kscript/creator/DeprecatedInfoCreator.kt
index 09f6208d..7c95571b 100644
--- a/src/main/kotlin/io/github/kscripting/kscript/creator/DeprecatedInfoCreator.kt
+++ b/src/main/kotlin/io/github/kscripting/kscript/creator/DeprecatedInfoCreator.kt
@@ -1,7 +1,7 @@
 package io.github.kscripting.kscript.creator
 
 import io.github.kscripting.kscript.model.DeprecatedItem
-import io.github.kscripting.shell.model.*
+import io.github.kscripting.kscript.model.ScriptLocation
 import net.igsoft.tablevis.TableBuilder
 import net.igsoft.tablevis.printer.text.TextTablePrinter
 import net.igsoft.tablevis.style.text.BoxTextTableStyleSet
diff --git a/src/main/kotlin/io/github/kscripting/kscript/creator/JarArtifactCreator.kt b/src/main/kotlin/io/github/kscripting/kscript/creator/JarArtifactCreator.kt
index 4813f9a2..b9d0fabb 100644
--- a/src/main/kotlin/io/github/kscripting/kscript/creator/JarArtifactCreator.kt
+++ b/src/main/kotlin/io/github/kscripting/kscript/creator/JarArtifactCreator.kt
@@ -3,6 +3,7 @@ package io.github.kscripting.kscript.creator
 import io.github.kscripting.kscript.code.Templates
 import io.github.kscripting.kscript.model.CompilerOpt
 import io.github.kscripting.kscript.model.Script
+import io.github.kscripting.kscript.model.ScriptType
 import io.github.kscripting.kscript.util.Executor
 import io.github.kscripting.kscript.util.FileUtils
 import io.github.kscripting.shell.model.OsPath
diff --git a/src/main/kotlin/io/github/kscripting/kscript/model/Content.kt b/src/main/kotlin/io/github/kscripting/kscript/model/Content.kt
index 2ab000b6..43b454a6 100644
--- a/src/main/kotlin/io/github/kscripting/kscript/model/Content.kt
+++ b/src/main/kotlin/io/github/kscripting/kscript/model/Content.kt
@@ -1,7 +1,6 @@
 package io.github.kscripting.kscript.model
 
 import io.github.kscripting.shell.model.OsPath
-import io.github.kscripting.shell.model.ScriptType
 import java.net.URI
 
 data class Content(
diff --git a/src/main/kotlin/io/github/kscripting/kscript/model/Script.kt b/src/main/kotlin/io/github/kscripting/kscript/model/Script.kt
index 5ee6f435..3776870f 100644
--- a/src/main/kotlin/io/github/kscripting/kscript/model/Script.kt
+++ b/src/main/kotlin/io/github/kscripting/kscript/model/Script.kt
@@ -1,7 +1,5 @@
 package io.github.kscripting.kscript.model
 
-import io.github.kscripting.shell.model.ScriptLocation
-
 data class Script(
     val scriptLocation: ScriptLocation,
 
diff --git a/src/main/kotlin/io/github/kscripting/kscript/model/ScriptAnnotation.kt b/src/main/kotlin/io/github/kscripting/kscript/model/ScriptAnnotation.kt
index 55ff0a39..7684dbfb 100644
--- a/src/main/kotlin/io/github/kscripting/kscript/model/ScriptAnnotation.kt
+++ b/src/main/kotlin/io/github/kscripting/kscript/model/ScriptAnnotation.kt
@@ -1,7 +1,5 @@
 package io.github.kscripting.kscript.model
 
-import io.github.kscripting.shell.model.ScriptLocation
-
 sealed interface ScriptAnnotation
 
 @JvmInline
diff --git a/src/main/kotlin/io/github/kscripting/kscript/model/ScriptContext.kt b/src/main/kotlin/io/github/kscripting/kscript/model/ScriptContext.kt
new file mode 100644
index 00000000..f14d35df
--- /dev/null
+++ b/src/main/kotlin/io/github/kscripting/kscript/model/ScriptContext.kt
@@ -0,0 +1,11 @@
+package io.github.kscripting.kscript.model
+
+import io.github.kscripting.shell.model.OsPath
+import io.github.kscripting.shell.model.OsType
+
+data class ScriptContext(
+    val osType: OsType,
+    val workingDir: OsPath,
+    val executorDir: OsPath,
+    val scriptLocation: ScriptLocation
+)
diff --git a/src/main/kotlin/io/github/kscripting/kscript/model/ScriptLocation.kt b/src/main/kotlin/io/github/kscripting/kscript/model/ScriptLocation.kt
new file mode 100644
index 00000000..76cb3645
--- /dev/null
+++ b/src/main/kotlin/io/github/kscripting/kscript/model/ScriptLocation.kt
@@ -0,0 +1,12 @@
+package io.github.kscripting.kscript.model
+
+import java.net.URI
+
+data class ScriptLocation(
+    val level: Int,
+    val scriptSource: ScriptSource,
+    val scriptType: ScriptType,
+    val sourceUri: URI?,
+    val sourceContextUri: URI,
+    val scriptName: String //without Kotlin extension (but possibly with other extensions)
+)
diff --git a/src/main/kotlin/io/github/kscripting/kscript/model/ScriptNode.kt b/src/main/kotlin/io/github/kscripting/kscript/model/ScriptNode.kt
index e8dfcad4..7e9da65d 100644
--- a/src/main/kotlin/io/github/kscripting/kscript/model/ScriptNode.kt
+++ b/src/main/kotlin/io/github/kscripting/kscript/model/ScriptNode.kt
@@ -1,7 +1,5 @@
 package io.github.kscripting.kscript.model
 
-import io.github.kscripting.shell.model.ScriptLocation
-
 data class ScriptNode(
     val scriptLocation: ScriptLocation,
     val sections: List<Section>,
diff --git a/src/main/kotlin/io/github/kscripting/kscript/model/ScriptSource.kt b/src/main/kotlin/io/github/kscripting/kscript/model/ScriptSource.kt
new file mode 100644
index 00000000..ab7878bc
--- /dev/null
+++ b/src/main/kotlin/io/github/kscripting/kscript/model/ScriptSource.kt
@@ -0,0 +1,3 @@
+package io.github.kscripting.kscript.model
+
+enum class ScriptSource { FILE, HTTP, STD_INPUT, OTHER_FILE, PARAMETER }
diff --git a/src/main/kotlin/io/github/kscripting/kscript/model/ScriptType.kt b/src/main/kotlin/io/github/kscripting/kscript/model/ScriptType.kt
new file mode 100644
index 00000000..bd01fefe
--- /dev/null
+++ b/src/main/kotlin/io/github/kscripting/kscript/model/ScriptType.kt
@@ -0,0 +1,9 @@
+package io.github.kscripting.kscript.model
+
+enum class ScriptType(val extension: String) {
+    KT(".kt"), KTS(".kts");
+
+    companion object {
+        fun findByExtension(name: String): ScriptType? = values().find { type -> name.endsWith(type.extension, true) }
+    }
+}
diff --git a/src/main/kotlin/io/github/kscripting/kscript/parser/LineParser.kt b/src/main/kotlin/io/github/kscripting/kscript/parser/LineParser.kt
index c336f825..97151709 100644
--- a/src/main/kotlin/io/github/kscripting/kscript/parser/LineParser.kt
+++ b/src/main/kotlin/io/github/kscripting/kscript/parser/LineParser.kt
@@ -1,7 +1,7 @@
 package io.github.kscripting.kscript.parser
 
 import io.github.kscripting.kscript.model.*
-import io.github.kscripting.shell.model.ScriptLocation
+import io.github.kscripting.kscript.model.ScriptLocation
 
 @Suppress("UNUSED_PARAMETER")
 object LineParser {
diff --git a/src/main/kotlin/io/github/kscripting/kscript/parser/Parser.kt b/src/main/kotlin/io/github/kscripting/kscript/parser/Parser.kt
index c7cfe37e..a8c6d529 100644
--- a/src/main/kotlin/io/github/kscripting/kscript/parser/Parser.kt
+++ b/src/main/kotlin/io/github/kscripting/kscript/parser/Parser.kt
@@ -2,7 +2,7 @@ package io.github.kscripting.kscript.parser
 
 import io.github.kscripting.kscript.model.Code
 import io.github.kscripting.kscript.model.Section
-import io.github.kscripting.shell.model.ScriptLocation
+import io.github.kscripting.kscript.model.ScriptLocation
 
 class Parser {
     private val annotationParsers = listOf(
diff --git a/src/main/kotlin/io/github/kscripting/kscript/resolver/ScriptResolver.kt b/src/main/kotlin/io/github/kscripting/kscript/resolver/ScriptResolver.kt
index 353c1d07..44868e88 100644
--- a/src/main/kotlin/io/github/kscripting/kscript/resolver/ScriptResolver.kt
+++ b/src/main/kotlin/io/github/kscripting/kscript/resolver/ScriptResolver.kt
@@ -1,6 +1,9 @@
 package io.github.kscripting.kscript.resolver
 
 import io.github.kscripting.kscript.model.*
+import io.github.kscripting.kscript.model.ScriptLocation
+import io.github.kscripting.kscript.model.ScriptSource
+import io.github.kscripting.kscript.model.ScriptType
 import io.github.kscripting.kscript.parser.LineParser.extractValues
 import io.github.kscripting.kscript.util.ScriptUtils
 import io.github.kscripting.kscript.util.UriUtils
diff --git a/src/main/kotlin/io/github/kscripting/kscript/resolver/SectionResolver.kt b/src/main/kotlin/io/github/kscripting/kscript/resolver/SectionResolver.kt
index 08811162..8cecea1b 100644
--- a/src/main/kotlin/io/github/kscripting/kscript/resolver/SectionResolver.kt
+++ b/src/main/kotlin/io/github/kscripting/kscript/resolver/SectionResolver.kt
@@ -3,8 +3,8 @@ package io.github.kscripting.kscript.resolver
 import io.github.kscripting.kscript.model.*
 import io.github.kscripting.kscript.parser.Parser
 import io.github.kscripting.kscript.util.UriUtils
-import io.github.kscripting.shell.model.ScriptLocation
-import io.github.kscripting.shell.model.ScriptSource
+import io.github.kscripting.kscript.model.ScriptLocation
+import io.github.kscripting.kscript.model.ScriptSource
 import java.net.URI
 
 class SectionResolver(
diff --git a/src/main/kotlin/io/github/kscripting/kscript/util/Executor.kt b/src/main/kotlin/io/github/kscripting/kscript/util/Executor.kt
index 89656ccd..0d96ba80 100644
--- a/src/main/kotlin/io/github/kscripting/kscript/util/Executor.kt
+++ b/src/main/kotlin/io/github/kscripting/kscript/util/Executor.kt
@@ -17,10 +17,7 @@ class Executor(private val commandResolver: CommandResolver) {
         val command = commandResolver.getKotlinJreVersion()
 
         return ShellExecutor.evalAndGobble(
-            commandResolver.osConfig.osType,
-            command,
-            null,
-            ShellUtils::environmentAdjuster
+            command, commandResolver.osConfig.osType, null, envAdjuster = ShellUtils::environmentAdjuster
         ).stdout
     }
 
@@ -33,7 +30,10 @@ class Executor(private val commandResolver: CommandResolver) {
         devMsg("JAR compile command: $command")
 
         val processResult = ShellExecutor.evalAndGobble(
-            commandResolver.osConfig.osType, command, envAdjuster = ShellUtils::environmentAdjuster, waitTimeMinutes = 30
+            command,
+            commandResolver.osConfig.osType,
+            envAdjuster = ShellUtils::environmentAdjuster,
+            waitTimeMinutes = 30
         )
 
         devMsg("Script compilation result:\n$processResult")
@@ -50,8 +50,8 @@ class Executor(private val commandResolver: CommandResolver) {
         devMsg("Kotlin execute command: $command")
 
         val processResult = ShellExecutor.eval(
-            commandResolver.osConfig.osType,
             command,
+            commandResolver.osConfig.osType,
             envAdjuster = ShellUtils::environmentAdjuster,
             waitTimeMinutes = Int.MAX_VALUE,
             inheritInput = true
@@ -59,7 +59,7 @@ class Executor(private val commandResolver: CommandResolver) {
 
         devMsg("Script execution result:\n$processResult")
 
-        if (processResult.exitCode != 0) {
+        if (processResult != 0) {
             throw IllegalStateException("Execution of scriplet failed:\n$processResult")
         }
     }
@@ -73,8 +73,8 @@ class Executor(private val commandResolver: CommandResolver) {
         devMsg("REPL Kotlin command: $command")
 
         val processResult = ShellExecutor.eval(
-            commandResolver.osConfig.osType,
             command,
+            commandResolver.osConfig.osType,
             envAdjuster = ShellUtils::environmentAdjuster,
             waitTimeMinutes = Int.MAX_VALUE,
             inheritInput = true
@@ -86,7 +86,9 @@ class Executor(private val commandResolver: CommandResolver) {
     fun runGradleInIdeaProject(projectPath: OsPath) {
         if (isInPath(commandResolver.osConfig.osType, commandResolver.osConfig.gradleCommand)) {
             // Create gradle wrapper
-            ShellExecutor.evalAndGobble(commandResolver.osConfig.osType, "gradle wrapper", workingDirectory = projectPath)
+            ShellExecutor.evalAndGobble(
+                "gradle wrapper", commandResolver.osConfig.osType, workingDirectory = projectPath
+            )
         } else {
             warnMsg("Could not find '${commandResolver.osConfig.gradleCommand}' in your PATH. You must set the command used to launch your intellij as 'KSCRIPT_COMMAND_GRADLE' env property")
         }
@@ -95,9 +97,7 @@ class Executor(private val commandResolver: CommandResolver) {
             val command = commandResolver.executeIdea(projectPath)
             devMsg("Idea execute command: $command")
 
-            val processResult = ShellExecutor.evalAndGobble(
-                commandResolver.osConfig.osType, command
-            )
+            val processResult = ShellExecutor.evalAndGobble(command, commandResolver.osConfig.osType)
 
             devMsg("Script execution result:\n$processResult")
 
@@ -117,7 +117,8 @@ class Executor(private val commandResolver: CommandResolver) {
         val command = commandResolver.createPackage()
         devMsg("Create package command: $command")
 
-        val result = ShellExecutor.evalAndGobble(commandResolver.osConfig.osType, command, workingDirectory = projectPath)
+        val result =
+            ShellExecutor.evalAndGobble(command, commandResolver.osConfig.osType, workingDirectory = projectPath)
 
         if (result.exitCode != 0) {
             throw IllegalStateException("Packaging for path: '$projectPath' failed:$result")
diff --git a/src/main/kotlin/io/github/kscripting/kscript/util/FileUtils.kt b/src/main/kotlin/io/github/kscripting/kscript/util/FileUtils.kt
index e5e490c9..97c552b1 100644
--- a/src/main/kotlin/io/github/kscripting/kscript/util/FileUtils.kt
+++ b/src/main/kotlin/io/github/kscripting/kscript/util/FileUtils.kt
@@ -1,11 +1,10 @@
 package io.github.kscripting.kscript.util
 
+import io.github.kscripting.kscript.model.ScriptType
 import io.github.kscripting.kscript.util.Logger.warnMsg
 import io.github.kscripting.shell.model.*
 import java.io.IOException
 import java.nio.file.Files
-import kotlin.io.path.createDirectories
-import kotlin.io.path.exists
 
 object FileUtils {
     fun createFile(path: OsPath, content: String): OsPath {
diff --git a/src/main/kotlin/io/github/kscripting/kscript/util/ScriptUtils.kt b/src/main/kotlin/io/github/kscripting/kscript/util/ScriptUtils.kt
index 93a8b25e..a250bc64 100644
--- a/src/main/kotlin/io/github/kscripting/kscript/util/ScriptUtils.kt
+++ b/src/main/kotlin/io/github/kscripting/kscript/util/ScriptUtils.kt
@@ -5,7 +5,7 @@ import io.github.kscripting.kscript.model.ImportName
 import io.github.kscripting.kscript.model.PackageName
 import io.github.kscripting.kscript.model.ScriptNode
 import io.github.kscripting.kscript.resolver.ResolutionContext
-import io.github.kscripting.shell.model.ScriptType
+import io.github.kscripting.kscript.model.ScriptType
 import org.apache.commons.codec.digest.DigestUtils
 import java.net.URI
 
diff --git a/src/main/kotlin/io/github/kscripting/kscript/util/ShellUtils.kt b/src/main/kotlin/io/github/kscripting/kscript/util/ShellUtils.kt
index b4adbf7c..30361d23 100644
--- a/src/main/kotlin/io/github/kscripting/kscript/util/ShellUtils.kt
+++ b/src/main/kotlin/io/github/kscripting/kscript/util/ShellUtils.kt
@@ -15,7 +15,7 @@ object ShellUtils {
     }
 
     fun guessPosixKotlinHome(osType: OsType): String? {
-        val kotlinHome = ShellExecutor.evalAndGobble(osType, "KOTLIN_RUNNER=1 JAVACMD=echo kotlinc").stdout.run {
+        val kotlinHome = ShellExecutor.evalAndGobble("KOTLIN_RUNNER=1 JAVACMD=echo kotlinc", osType).stdout.run {
             "kotlin.home=([^\\s]*)".toRegex().find(this)?.groups?.get(1)?.value
         } ?: return null
 
@@ -59,9 +59,10 @@ object ShellUtils {
         return null
     }
 
-    fun which(osType: OsType, command: String, envAdjuster: EnvAdjuster = {}): List<String> = ShellExecutor.evalAndGobble(
-        osType, "${if (osType == OsType.WINDOWS) "where" else "which"} $command", null, envAdjuster
-    ).stdout.trim().lines()
+    fun which(osType: OsType, command: String, envAdjuster: EnvAdjuster = {}): List<String> =
+        ShellExecutor.evalAndGobble(
+            "${if (osType == OsType.WINDOWS) "where" else "which"} $command", osType, null, envAdjuster = envAdjuster
+        ).stdout.trim().lines()
 
     fun isInPath(osType: OsType, command: String, envAdjuster: EnvAdjuster = {}): Boolean {
         val paths = which(osType, command, envAdjuster)
diff --git a/src/test/kotlin/io/github/kscripting/kscript/code/GradleTemplatesTest.kt b/src/test/kotlin/io/github/kscripting/kscript/code/GradleTemplatesTest.kt
index 2f3ca696..9d0ed22d 100644
--- a/src/test/kotlin/io/github/kscripting/kscript/code/GradleTemplatesTest.kt
+++ b/src/test/kotlin/io/github/kscripting/kscript/code/GradleTemplatesTest.kt
@@ -3,13 +3,14 @@ package io.github.kscripting.kscript.code
 import assertk.assertThat
 import assertk.assertions.isEqualTo
 import io.github.kscripting.kscript.model.*
-import io.github.kscripting.shell.model.ScriptLocation
-import io.github.kscripting.shell.model.ScriptSource
-import io.github.kscripting.shell.model.ScriptType
+import io.github.kscripting.kscript.model.ScriptLocation
+import io.github.kscripting.kscript.model.ScriptSource
+import io.github.kscripting.kscript.model.ScriptType
 import org.junit.jupiter.api.Test
 import java.net.URI
 
 class GradleTemplatesTest {
+    private val kotlinVersion = KotlinVersion.CURRENT
 
     @Test
     fun `Create Idea script without any Gradle additions`() {
@@ -36,7 +37,7 @@ class GradleTemplatesTest {
         assertThat(scriptText).isEqualTo(
             """
             |plugins {
-            |    id("org.jetbrains.kotlin.jvm") version "1.7.21"
+            |    id("org.jetbrains.kotlin.jvm") version "$kotlinVersion"
             |}
             |
             |repositories {
@@ -47,7 +48,7 @@ class GradleTemplatesTest {
             |
             |dependencies {
             |    implementation("org.jetbrains.kotlin:kotlin-stdlib")
-            |    implementation("org.jetbrains.kotlin:kotlin-script-runtime:1.7.21")
+            |    implementation("org.jetbrains.kotlin:kotlin-script-runtime:$kotlinVersion")
             |    implementation("io.github.kscripting:kscript-annotations:1.5.0")
             |}
             |
@@ -87,7 +88,7 @@ class GradleTemplatesTest {
         assertThat(scriptText).isEqualTo(
             """
             |plugins {
-            |    id("org.jetbrains.kotlin.jvm") version "1.7.21"
+            |    id("org.jetbrains.kotlin.jvm") version "$kotlinVersion"
             |}
             |
             |repositories {
@@ -111,7 +112,7 @@ class GradleTemplatesTest {
             |
             |dependencies {
             |    implementation("org.jetbrains.kotlin:kotlin-stdlib")
-            |    implementation("org.jetbrains.kotlin:kotlin-script-runtime:1.7.21")
+            |    implementation("org.jetbrains.kotlin:kotlin-script-runtime:$kotlinVersion")
             |    implementation("io.github.kscripting:kscript-annotations:1.5.0")
             |}
             |
diff --git a/src/test/kotlin/io/github/kscripting/kscript/parser/LineParserTest.kt b/src/test/kotlin/io/github/kscripting/kscript/parser/LineParserTest.kt
index 36687b22..14abd68f 100644
--- a/src/test/kotlin/io/github/kscripting/kscript/parser/LineParserTest.kt
+++ b/src/test/kotlin/io/github/kscripting/kscript/parser/LineParserTest.kt
@@ -10,9 +10,9 @@ import io.github.kscripting.kscript.parser.LineParser.parseEntry
 import io.github.kscripting.kscript.parser.LineParser.parseImport
 import io.github.kscripting.kscript.parser.LineParser.parseKotlinOpts
 import io.github.kscripting.kscript.parser.LineParser.parseRepository
-import io.github.kscripting.shell.model.ScriptLocation
-import io.github.kscripting.shell.model.ScriptSource
-import io.github.kscripting.shell.model.ScriptType
+import io.github.kscripting.kscript.model.ScriptLocation
+import io.github.kscripting.kscript.model.ScriptSource
+import io.github.kscripting.kscript.model.ScriptType
 import org.junit.jupiter.api.Test
 import org.junit.jupiter.params.ParameterizedTest
 import org.junit.jupiter.params.provider.Arguments
diff --git a/src/test/kotlin/io/github/kscripting/kscript/resolver/ScriptResolverTest.kt b/src/test/kotlin/io/github/kscripting/kscript/resolver/ScriptResolverTest.kt
index 4a855231..4f590c9a 100644
--- a/src/test/kotlin/io/github/kscripting/kscript/resolver/ScriptResolverTest.kt
+++ b/src/test/kotlin/io/github/kscripting/kscript/resolver/ScriptResolverTest.kt
@@ -7,6 +7,9 @@ import assertk.assertions.isEqualTo
 import assertk.assertions.prop
 import io.github.kscripting.kscript.cache.Cache
 import io.github.kscripting.kscript.model.*
+import io.github.kscripting.kscript.model.ScriptLocation
+import io.github.kscripting.kscript.model.ScriptSource
+import io.github.kscripting.kscript.model.ScriptType
 import io.github.kscripting.kscript.parser.Parser
 import io.github.kscripting.shell.model.*
 import org.junit.jupiter.api.Test