diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt
index 83d1dd8003ace89b3a989da1ce637e46bf02d684..00d03abd5943a5c42b82ce40a66783ab3f08b770 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt
@@ -78,12 +78,13 @@ class IrcChannel(
   }
 
   override fun initSetUserModes(usermodes: QVariantMap) {
-    _userModes.putAll(
-      usermodes.entries.map { (key, value) ->
-        network().newIrcUser(key) to value.value("")
-      }.toMap()
-    )
-    live_userModes.onNext(_userModes)
+    val users = usermodes.map { (key, _) ->
+      network().newIrcUser(key)
+    }
+    val modes = usermodes.map { (_, value) ->
+      value.value("")
+    }
+    joinIrcUsersInternal(users, modes)
   }
 
   override fun initSetProperties(properties: QVariantMap) {
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt
index e0be80108be439ec05e5a3857ac6a091226277ab..5b981d535bc1285e800c321fa60096401e1e7f8d 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt
@@ -9,6 +9,7 @@ import de.kuschku.libquassel.session.SignalProxy
 import de.kuschku.libquassel.util.helpers.getOr
 import de.kuschku.libquassel.util.helpers.serializeString
 import de.kuschku.libquassel.util.irc.HostmaskHelper
+import de.kuschku.libquassel.util.irc.IrcCaseMappers
 import io.reactivex.subjects.BehaviorSubject
 import java.nio.ByteBuffer
 import java.nio.charset.Charset
@@ -47,6 +48,9 @@ class Network constructor(
     else                  -> "#&!+".contains(channelName[0])
   }
 
+  val caseMapper: IrcCaseMappers.IrcCaseMapper
+    get() = IrcCaseMappers[support("CASEMAPPING")]
+
   /**
    * Checks if the target counts as a STATUSMSG
    *
@@ -320,7 +324,7 @@ class Network constructor(
   }
 
   fun newIrcUser(hostMask: String, initData: QVariantMap = emptyMap()): IrcUser {
-    val nick = HostmaskHelper.nick(hostMask).toLowerCase(Locale.US)
+    val nick = caseMapper.toLowerCase(HostmaskHelper.nick(hostMask))
     val user = ircUser(nick)
     return if (user == null) {
       val ircUser = IrcUser(hostMask, this, proxy)
@@ -340,7 +344,7 @@ class Network constructor(
     }
   }
 
-  fun ircUser(nickName: String?) = _ircUsers[nickName?.toLowerCase(Locale.US)]
+  fun ircUser(nickName: String?) = _ircUsers[nickName?.let(caseMapper::toLowerCase)]
   fun liveIrcUser(nickName: String?) = live_ircUsers.map {
     ircUser(
       nickName
@@ -359,7 +363,7 @@ class Network constructor(
         ircChannel.initialized = true
       }
       proxy.synchronize(ircChannel)
-      _ircChannels[channelName.toLowerCase(Locale.US)] = ircChannel
+      _ircChannels[caseMapper.toLowerCase(channelName)] = ircChannel
       live_ircChannels.onNext(_ircChannels)
       super.addIrcChannel(channelName)
       return ircChannel
@@ -368,7 +372,7 @@ class Network constructor(
     }
   }
 
-  fun ircChannel(channelName: String?) = _ircChannels[channelName?.toLowerCase(Locale.US)]
+  fun ircChannel(channelName: String?) = _ircChannels[channelName?.let(caseMapper::toLowerCase)]
   fun liveIrcChannel(channelName: String?) = live_ircChannels.map {
     ircChannel(
       channelName
@@ -839,7 +843,7 @@ class Network constructor(
   }
 
   fun updateNickFromMask(mask: String): IrcUser {
-    val nick = HostmaskHelper.nick(mask).toLowerCase(Locale.US)
+    val nick = caseMapper.toLowerCase(HostmaskHelper.nick(mask))
     val user = _ircUsers[nick]
     return if (user != null) {
       user.updateHostmask(mask)
@@ -850,9 +854,9 @@ class Network constructor(
   }
 
   override fun ircUserNickChanged(old: String, new: String) {
-    val value = _ircUsers.remove(old.toLowerCase(Locale.US))
+    val value = _ircUsers.remove(caseMapper.toLowerCase(old))
     if (value != null) {
-      _ircUsers[new.toLowerCase(Locale.US)] = value
+      _ircUsers[caseMapper.toLowerCase(new)] = value
     }
   }
 
@@ -867,12 +871,12 @@ class Network constructor(
   }
 
   fun removeIrcUser(user: IrcUser) {
-    _ircUsers.remove(user.nick())
+    _ircUsers.remove(caseMapper.toLowerCase(user.nick()))
     live_ircUsers.onNext(_ircUsers)
   }
 
   fun removeIrcChannel(channel: IrcChannel) {
-    _ircChannels.remove(channel.name())
+    _ircChannels.remove(caseMapper.toLowerCase(channel.name()))
     live_ircChannels.onNext(_ircChannels)
   }