diff --git a/globallydynamic-android-lib/build.gradle b/globallydynamic-android-lib/build.gradle
index 79733f9..5733377 100644
--- a/globallydynamic-android-lib/build.gradle
+++ b/globallydynamic-android-lib/build.gradle
@@ -2,14 +2,12 @@ buildscript {
     apply from: 'deps.gradle'
 
     repositories {
-        jcenter()
         google()
         mavenCentral()
     }
     dependencies {
         classpath "com.android.tools.build:gradle:$versions.androidplugin"
         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$versions.kotlin"
-        classpath "com.github.ben-manes:gradle-versions-plugin:$versions.versionsplugin"
         classpath "com.jeppeman.globallydynamic.gradle:plugin:$versions.globallydynamic_gradle"
         classpath "com.vanniktech:gradle-android-javadoc-plugin:$versions.javadoc"
     }
@@ -31,7 +29,6 @@ ext {
 
 allprojects {
     repositories {
-        jcenter()
         google()
         mavenCentral()
         maven { url 'https://developer.huawei.com/repo' }
@@ -115,21 +112,6 @@ subprojects {
     }
 }
 
-apply plugin: "com.github.ben-manes.versions"
-
-dependencyUpdates.resolutionStrategy {
-    componentSelection { rules ->
-        rules.all { ComponentSelection selection ->
-            boolean rejected = ['alpha', 'beta', 'rc', 'cr', 'm'].any { qualifier ->
-                selection.candidate.version ==~ /(?i).*[.-]${qualifier}[.\d-]*/
-            }
-            if (rejected) {
-                selection.reject('Release candidate')
-            }
-        }
-    }
-}
-
 task clean(type: Delete) {
     delete rootProject.buildDir
 }
diff --git a/globallydynamic-android-lib/deps.gradle b/globallydynamic-android-lib/deps.gradle
index 3655661..e5dfdc5 100644
--- a/globallydynamic-android-lib/deps.gradle
+++ b/globallydynamic-android-lib/deps.gradle
@@ -2,7 +2,7 @@ def versions = [
         kotlin                : '1.9.0',
         appcompat             : '1.4.2',
         coroutines            : '1.6.2',
-        androidplugin         : '8.1.1',
+        androidplugin         : '8.6.0',
         lifecycle             : '2.4.1',
         lifecycle_extensions  : '2.2.0',
         mockito               : '5.4.0',
@@ -11,7 +11,6 @@ def versions = [
         truth                 : '1.2.0',
         espresso              : '3.4.0',
         runner                : '1.2.0',
-        versionsplugin        : '0.28.0',
         material              : '1.6.1',
         constraintlayout      : '2.1.4',
         core                  : '1.8.0',
@@ -25,7 +24,7 @@ def versions = [
         play                  : '1.10.3',
         dynamicability        : '1.0.17.300',
         autoservice           : '1.0-rc6',
-        globallydynamic_gradle: '1.7.0',
+        globallydynamic_gradle: '1.8.0',
         uiautomator           : '2.2.0',
         javadoc               : '0.3.0'
 ]
diff --git a/globallydynamic-android-lib/gradle/wrapper/gradle-wrapper.properties b/globallydynamic-android-lib/gradle/wrapper/gradle-wrapper.properties
index 5679c4a..cdf41a8 100644
--- a/globallydynamic-android-lib/gradle/wrapper/gradle-wrapper.properties
+++ b/globallydynamic-android-lib/gradle/wrapper/gradle-wrapper.properties
@@ -3,4 +3,4 @@ distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-8.3-all.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip
diff --git a/globallydynamic-android-lib/minimal-sample/build.gradle b/globallydynamic-android-lib/minimal-sample/build.gradle
index 519c09f..8151b0e 100644
--- a/globallydynamic-android-lib/minimal-sample/build.gradle
+++ b/globallydynamic-android-lib/minimal-sample/build.gradle
@@ -1,12 +1,11 @@
 buildscript {
     repositories {
-        jcenter()
         google()
         mavenCentral()
     }
     dependencies {
-        classpath "com.android.tools.build:gradle:8.1.1:"
-        classpath "com.jeppeman.globallydynamic.gradle:plugin:1.7.0"
+        classpath "com.android.tools.build:gradle:8.6.0"
+        classpath "com.jeppeman.globallydynamic.gradle:plugin:1.8.0"
     }
 }
 
diff --git a/globallydynamic-server-lib/build.gradle b/globallydynamic-server-lib/build.gradle
index a518258..d4ca2e2 100644
--- a/globallydynamic-server-lib/build.gradle
+++ b/globallydynamic-server-lib/build.gradle
@@ -2,7 +2,6 @@ buildscript {
     apply from: 'deps.gradle'
 
     repositories {
-        jcenter()
         google()
         mavenCentral()
         maven {
@@ -13,7 +12,6 @@ buildscript {
         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$versions.kotlin"
         classpath "org.jetbrains.dokka:dokka-gradle-plugin:0.10.1"
         classpath "com.github.gmazzo.buildconfig:com.github.gmazzo.buildconfig.gradle.plugin:3.0.3"
-        classpath "com.github.ben-manes:gradle-versions-plugin:$versions.versionsplugin"
         classpath "com.github.johnrengelman:shadow:$versions.shadowjar"
     }
 }
@@ -40,7 +38,6 @@ subprojects {
         }
 
         repositories {
-            jcenter()
             google()
             mavenCentral()
         }
@@ -63,21 +60,6 @@ subprojects {
     }
 }
 
-apply plugin: "com.github.ben-manes.versions"
-
-dependencyUpdates.resolutionStrategy = {
-    componentSelection { rules ->
-        rules.all { ComponentSelection selection ->
-            boolean rejected = ['alpha', 'beta', 'rc', 'cr', 'm'].any { qualifier ->
-                selection.candidate.version ==~ /(?i).*[.-]${qualifier}[.\d-]*/
-            }
-            if (rejected) {
-                selection.reject('Release candidate')
-            }
-        }
-    }
-}
-
 task clean(type: Delete) {
     delete rootProject.buildDir
 }
\ No newline at end of file
diff --git a/globallydynamic-server-lib/deps.gradle b/globallydynamic-server-lib/deps.gradle
index c2d8ae0..4a12282 100644
--- a/globallydynamic-server-lib/deps.gradle
+++ b/globallydynamic-server-lib/deps.gradle
@@ -3,7 +3,6 @@ import java.nio.file.Paths
 def versions = [
         kotlin        : '1.8.21',
         jetty         : '9.4.27.v20200227',
-        versionsplugin: '0.25.0',
         shadowjar     : '8.1.1',
         guava         : '30.1-jre',
         bundletool    : '1.11.2',
diff --git a/globallydynamic-studio-plugin/build.gradle b/globallydynamic-studio-plugin/build.gradle
index b9cbb99..9f8e681 100644
--- a/globallydynamic-studio-plugin/build.gradle
+++ b/globallydynamic-studio-plugin/build.gradle
@@ -1,6 +1,6 @@
 plugins {
-    id 'org.jetbrains.kotlin.jvm' version '1.9.22'
-    id 'org.jetbrains.intellij' version '1.16.1'
+    id 'org.jetbrains.kotlin.jvm' version '2.0.20'
+    id 'org.jetbrains.intellij' version '1.17.4'
 }
 
 apply from: 'deps.gradle'
@@ -45,7 +45,7 @@ intellij {
     localPath = "${System.getenv("ANDROID_STUDIO_PATH")}"
 }
 
-def instrumentCompilerVersion = "231.9392.1"
+def instrumentCompilerVersion = "241.18034.62"
 
 instrumentCode {
     compilerVersion = instrumentCompilerVersion
@@ -64,6 +64,10 @@ buildSearchableOptions.systemProperty("idea.is.internal", "")
 
 patchPluginXml {
     changeNotes = """
+    <h1>1.11.0</h1>
+    <ul>
+        <li>Android Studio Koala Feature Drop (2024.1.2) compatibility</li>
+    </ul>
     <h1>1.10.0</h1>
     <ul>
         <li>Android Studio Hedgehog (2023.1.1) compatibility</li>
diff --git a/globallydynamic-studio-plugin/gradle.properties b/globallydynamic-studio-plugin/gradle.properties
index 133e611..362ee17 100644
--- a/globallydynamic-studio-plugin/gradle.properties
+++ b/globallydynamic-studio-plugin/gradle.properties
@@ -1,5 +1,5 @@
 GROUP=com.jeppeman.globallydynamic.idea
-VERSION_NAME=1.11.0-SNAPSHOT
+VERSION_NAME=1.12.0-SNAPSHOT
 
 POM_DESCRIPTION=GloballyDynamic Studio - Embeds a GloballyDynamic server into Android Studio that apps will download their splits from.
 
diff --git a/globallydynamic-studio-plugin/gradle/wrapper/gradle-wrapper.properties b/globallydynamic-studio-plugin/gradle/wrapper/gradle-wrapper.properties
index 070cb70..e1adfb4 100644
--- a/globallydynamic-studio-plugin/gradle/wrapper/gradle-wrapper.properties
+++ b/globallydynamic-studio-plugin/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-7.6-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-8.10-bin.zip
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
diff --git a/globallydynamic-studio-plugin/src/main/kotlin/com/jeppeman/globallydynamic/idea/tooling/GloballyDynamicGradle.kt b/globallydynamic-studio-plugin/src/main/kotlin/com/jeppeman/globallydynamic/idea/tooling/GloballyDynamicGradle.kt
index 48919e2..b0473a9 100644
--- a/globallydynamic-studio-plugin/src/main/kotlin/com/jeppeman/globallydynamic/idea/tooling/GloballyDynamicGradle.kt
+++ b/globallydynamic-studio-plugin/src/main/kotlin/com/jeppeman/globallydynamic/idea/tooling/GloballyDynamicGradle.kt
@@ -1,11 +1,8 @@
 package com.jeppeman.globallydynamic.idea.tooling
 
-import com.android.tools.idea.gradle.util.ImportUtil
 import com.intellij.openapi.application.PathManager
 import com.intellij.openapi.project.Project
 import com.intellij.openapi.util.io.FileUtil
-import com.jeppeman.globallydynamic.idea.utils.runInBackground
-import com.jeppeman.globallydynamic.idea.utils.runInBackgroundAndWait
 import org.gradle.tooling.BuildAction
 import org.gradle.tooling.GradleConnector
 import org.gradle.tooling.ProjectConnection
@@ -129,7 +126,7 @@ private fun createClassPathString(paths: List<String?>): String? {
     classpath.append("classpath files([")
     val pathCount = paths.size
     for (i in 0 until pathCount) {
-        val jarPath = ImportUtil.escapeGroovyStringLiteral(paths[i]!!)
+        val jarPath = escapeGroovyStringLiteral(paths[i]!!)
         classpath.append("'").append(jarPath).append("'")
         if (i < pathCount - 1) {
             classpath.append(", ")
@@ -139,6 +136,21 @@ private fun createClassPathString(paths: List<String?>): String? {
     return classpath.toString()
 }
 
+private fun escapeGroovyStringLiteral(s: String): String {
+    val sb = java.lang.StringBuilder(s.length + 5)
+    var i = 0
+    val n = s.length
+    while (i < n) {
+        val c = s[i]
+        if (c == '\\' || c == '\'') {
+            sb.append('\\')
+        }
+        sb.append(c)
+        i++
+    }
+    return sb.toString()
+}
+
 private val jarPaths: List<String>
     get() = listOf(
         getJarPathForClass(GloballyDynamicToolingPlugin::class.java),