diff --git a/build.gradle.kts b/build.gradle.kts
index 7c470204f52560d17168897848ec6d8706dc246a..096a024bc97bd33435236a11c1b97f3b7598e913 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -17,17 +17,20 @@ plugins {
   id("org.jetbrains.dokka") version "1.4.32"
 }
 
-subprojects {
-  apply(plugin = "org.jetbrains.kotlin.jvm")
-  apply(plugin = "org.jlleitschuh.gradle.ktlint")
-  apply(plugin = "jacoco")
-  apply(plugin = "de.justjanne.jacoco-cobertura-converter")
+allprojects {
   apply(plugin = "org.jetbrains.dokka")
 
   repositories {
     mavenCentral()
     google()
   }
+}
+
+subprojects {
+  apply(plugin = "org.jetbrains.kotlin.jvm")
+  apply(plugin = "org.jlleitschuh.gradle.ktlint")
+  apply(plugin = "jacoco")
+  apply(plugin = "de.justjanne.jacoco-cobertura-converter")
 
   dependencies {
     val implementation by configurations
diff --git a/gradle.properties b/gradle.properties
index f1ce9c2844a8d5e22eab2c35cb5336fe09e49f8a..c1b78d239812b6e82022592e5483dddadbb79de6 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -14,7 +14,7 @@ kotlinPoetVersion=1.8.0
 kspVersion=1.5.10-1.0.0-beta01
 
 GROUP=de.justjanne.libquassel
-VERSION_NAME=0.4.0
+VERSION_NAME=0.4.1
 
 POM_URL=https://git.kuschku.de/justJanne/libquassel
 POM_SCM_URL=https://git.kuschku.de/justJanne/libquassel
diff --git a/protocol/src/main/kotlin/de/justjanne/libquassel/protocol/features/QuasselFeatureName.kt b/protocol/src/main/kotlin/de/justjanne/libquassel/protocol/features/QuasselFeatureName.kt
index 42270b653ce975e3287b294d40f81cbb3e24ce1b..5d71270bb5cae9fc0742597d4f2b31b490a8b012 100644
--- a/protocol/src/main/kotlin/de/justjanne/libquassel/protocol/features/QuasselFeatureName.kt
+++ b/protocol/src/main/kotlin/de/justjanne/libquassel/protocol/features/QuasselFeatureName.kt
@@ -15,7 +15,8 @@ import de.justjanne.libquassel.annotations.Generated
  * Inline class encapsulating a quassel feature name
  */
 @Generated
-inline class QuasselFeatureName(
+@JvmInline
+value class QuasselFeatureName(
   /**
    * Standardized name of the feature
    */
diff --git a/protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/ids/BufferId.kt b/protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/ids/BufferId.kt
index 7ef839abe04bf77a1c72564f0c8df11e3b37a32c..4e33d6c6d15e0c1f4c80b8502c051a22d7db8b5a 100644
--- a/protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/ids/BufferId.kt
+++ b/protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/ids/BufferId.kt
@@ -14,7 +14,8 @@ private typealias BufferIdType = SignedIdType
 /**
  * A [SignedId] for a chat/buuffer
  */
-inline class BufferId(
+@JvmInline
+value class BufferId(
   /**
    * Native value
    */
diff --git a/protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/ids/IdentityId.kt b/protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/ids/IdentityId.kt
index bf50408f08b6cf1b7a4faa4322cbd8460918893d..8b49eb55ed0c35cb371a20fa6350b92e6cdbfeee 100644
--- a/protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/ids/IdentityId.kt
+++ b/protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/ids/IdentityId.kt
@@ -13,7 +13,8 @@ private typealias IdentityIdType = SignedIdType
 /**
  * A [SignedId] for an identity object
  */
-inline class IdentityId(
+@JvmInline
+value class IdentityId(
   /**
    * Native value
    */
diff --git a/protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/ids/MsgId.kt b/protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/ids/MsgId.kt
index adbd50c070845d174655db599601ff3603cfdd5e..6fafc34efa68c29ead3503a160606ff026544a58 100644
--- a/protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/ids/MsgId.kt
+++ b/protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/ids/MsgId.kt
@@ -15,7 +15,8 @@ private typealias MsgIdType = SignedId64Type
  * A [SignedId] for an individual message
  * Warning: this is the only id which can be backed by a 64-bit value
  */
-inline class MsgId(
+@JvmInline
+value class MsgId(
   /**
    * Native value
    */
diff --git a/protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/ids/NetworkId.kt b/protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/ids/NetworkId.kt
index 62368a4a15de7179b802cf3855592232c5ffd193..53b29fc590146f29a9f6e5322d208a4866b51693 100644
--- a/protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/ids/NetworkId.kt
+++ b/protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/ids/NetworkId.kt
@@ -14,7 +14,8 @@ private typealias NetworkIdType = SignedIdType
 /**
  * A [SignedId] for an irc network
  */
-inline class NetworkId(
+@JvmInline
+value class NetworkId(
   /**
    * Native value
    */
diff --git a/protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/state/NetworkState.kt b/protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/state/NetworkState.kt
index c8cd134cb81762838fd87c525e66c71a0cbb15e8..bc844617948a66488005d2287305e4bab4c80dbb 100644
--- a/protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/state/NetworkState.kt
+++ b/protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/state/NetworkState.kt
@@ -72,12 +72,12 @@ data class NetworkState(
   fun identifier() = "${networkId.id}"
 
   fun caseMapper() = IrcCaseMapper[supportValue(IrcISupport.CASEMAPPING)]
-  fun supports(key: String) = supports.containsKey(key.toUpperCase(Locale.ROOT))
-  fun supportValue(key: String) = supports[key.toUpperCase(Locale.ROOT)]
+  fun supports(key: String) = supports.containsKey(key.uppercase(Locale.ROOT))
+  fun supportValue(key: String) = supports[key.uppercase(Locale.ROOT)]
 
-  fun capAvailable(capability: String) = caps.containsKey(capability.toLowerCase(Locale.ROOT))
-  fun capEnabled(capability: String) = capsEnabled.contains(capability.toLowerCase(Locale.ROOT))
-  fun capValue(capability: String) = caps[capability.toLowerCase(Locale.ROOT)] ?: ""
+  fun capAvailable(capability: String) = caps.containsKey(capability.lowercase(Locale.ROOT))
+  fun capEnabled(capability: String) = capsEnabled.contains(capability.lowercase(Locale.ROOT))
+  fun capValue(capability: String) = caps[capability.lowercase(Locale.ROOT)] ?: ""
 
   fun isSaslSupportLikely(mechanism: String): Boolean {
     if (!capAvailable(IrcCapability.SASL)) {
diff --git a/protocol/src/main/kotlin/de/justjanne/libquassel/protocol/util/irc/IrcCaseMapper.kt b/protocol/src/main/kotlin/de/justjanne/libquassel/protocol/util/irc/IrcCaseMapper.kt
index cf12f6d12e672cdae33774ffbcdca98a53c60451..9ce7a218c23c0388f5feca4c2e1785d3bca44855 100644
--- a/protocol/src/main/kotlin/de/justjanne/libquassel/protocol/util/irc/IrcCaseMapper.kt
+++ b/protocol/src/main/kotlin/de/justjanne/libquassel/protocol/util/irc/IrcCaseMapper.kt
@@ -35,10 +35,10 @@ abstract class IrcCaseMapper {
       a.equals(b, ignoreCase = true)
 
     override fun toLowerCase(value: String): String =
-      value.toLowerCase(Locale.ENGLISH)
+      value.lowercase(Locale.ROOT)
 
     override fun toUpperCase(value: String): String =
-      value.toUpperCase(Locale.ENGLISH)
+      value.uppercase(Locale.ROOT)
   }
 
   object Rfc1459 : IrcCaseMapper() {
@@ -46,13 +46,13 @@ abstract class IrcCaseMapper {
       toLowerCase(a) == toLowerCase(b) || toUpperCase(a) == toUpperCase(b)
 
     override fun toLowerCase(value: String): String =
-      value.toLowerCase(Locale.ROOT)
+      value.lowercase(Locale.ROOT)
         .replace('[', '{')
         .replace(']', '}')
         .replace('\\', '|')
 
     override fun toUpperCase(value: String): String =
-      value.toUpperCase(Locale.ROOT)
+      value.uppercase(Locale.ROOT)
         .replace('{', '[')
         .replace('}', ']')
         .replace('|', '\\')