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 cd2fa70c0e6355bd05287fd123d5bb5c037ea29f..690d52e79966f11400129e6d62e76319a1469852 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
@@ -65,15 +65,15 @@ class IrcChannel(
   }
 
   override fun initChanModes(): QVariantMap = mapOf(
-    "A" to QVariant.of(_A_channelModes.mapValues { (_, value) ->
-      QVariant.of(value.toList(), Type.QStringList)
-    }, Type.QVariantMap),
-    "B" to QVariant.of(_B_channelModes.mapValues { (_, value) ->
-      QVariant.of(value, Type.QString)
-    }, Type.QVariantMap),
-    "C" to QVariant.of(_C_channelModes.mapValues { (_, value) ->
-      QVariant.of(value, Type.QString)
-    }, Type.QVariantMap),
+    "A" to QVariant.of(_A_channelModes.map { (key, value) ->
+      key.toString() to QVariant.of(value.toList(), Type.QStringList)
+    }.toMap(), Type.QVariantMap),
+    "B" to QVariant.of(_B_channelModes.map { (key, value) ->
+      key.toString() to QVariant.of(value, Type.QString)
+    }.toMap(), Type.QVariantMap),
+    "C" to QVariant.of(_C_channelModes.map { (key, value) ->
+      key.toString() to QVariant.of(value, Type.QString)
+    }.toMap(), Type.QVariantMap),
     "D" to QVariant.of(_D_channelModes.joinToString(), Type.QString)
   )
 
@@ -89,14 +89,14 @@ class IrcChannel(
   )
 
   override fun initSetChanModes(chanModes: QVariantMap) {
-    chanModes["A"].valueOr<Map<String, QVariant_>>(::emptyMap).forEach { (key, variant) ->
+    chanModes["A"].valueOr<QVariantMap>(::emptyMap).forEach { (key, variant) ->
       _A_channelModes[key.toCharArray().first()] =
         variant.valueOr<QStringList>(::emptyList).filterNotNull().toMutableSet()
     }
-    chanModes["B"].valueOr<Map<String, QVariant_>>(::emptyMap).forEach { (key, variant) ->
+    chanModes["B"].valueOr<QVariantMap>(::emptyMap).forEach { (key, variant) ->
       _B_channelModes[key.toCharArray().first()] = variant.value("")
     }
-    chanModes["C"].valueOr<Map<String, QVariant_>>(::emptyMap).forEach { (key, variant) ->
+    chanModes["C"].valueOr<QVariantMap>(::emptyMap).forEach { (key, variant) ->
       _C_channelModes[key.toCharArray().first()] = variant.value("")
     }
     _D_channelModes = chanModes["D"].value("").toCharArray().toMutableSet()
diff --git a/lib/src/test/java/de/kuschku/libquassel/quassel/syncables/NetworkTest.kt b/lib/src/test/java/de/kuschku/libquassel/quassel/syncables/NetworkTest.kt
index 8aad33783eb331b7e21be4dd0a5374e248ffdb36..8d276ac5049fec71b02d12c4c71cf9e95fb22cbc 100644
--- a/lib/src/test/java/de/kuschku/libquassel/quassel/syncables/NetworkTest.kt
+++ b/lib/src/test/java/de/kuschku/libquassel/quassel/syncables/NetworkTest.kt
@@ -71,6 +71,79 @@ class NetworkTest {
     original.setCodecForServer(randomCharset().name())
     original.setCodecForEncoding(randomCharset().name())
     original.setCodecForDecoding(randomCharset().name())
+    original.addSupport("AWAYLEN", "200")
+    original.addSupport("CALLERID", "g")
+    original.addSupport("CASEMAPPING", "rfc1459")
+    original.addSupport("CHANMODES", "IXZbegw,k,FHJLUdfjlx,ABCDKMNOPQRSTcimnprstuz")
+    original.addSupport("CHANNELLEN", "64")
+    original.addSupport("CHANTYPES", "#")
+    original.addSupport("CHARSET", "ascii")
+    original.addSupport("ELIST", "MU")
+    original.addSupport("ESILENCE", null)
+    original.addSupport("EXCEPTS", "e")
+    original.addSupport("EXTBAN", ",ABCNOQRSTUcjmprsz")
+    original.addSupport("FNC", null)
+    original.addSupport("INVEX", "I")
+    for (i in 0 until randomUByte()) {
+      original.newIrcUser(randomString() + "!" + randomString() + "@" + randomString()).apply {
+        setUser(randomString())
+        setHost(randomString())
+        setNick(randomString())
+        setRealName(randomString())
+        setAccount(randomString())
+        setAway(randomBoolean())
+        setAwayMessage(randomString())
+        setIdleTime(randomInstant())
+        setLoginTime(randomInstant())
+        setServer(randomString())
+        setIrcOperator(randomString())
+        setLastAwayMessageTime(randomInstant())
+        setWhoisServiceReply(randomString())
+        setSuserHost(randomString())
+        setEncrypted(randomBoolean())
+        setUserModes(listOf(
+          randomOf(*USERMODES),
+          randomOf(*USERMODES),
+          randomOf(*USERMODES)
+        ).toString())
+      }
+    }
+    for (i in 0 until randomUByte()) {
+      original.newIrcChannel(randomString(), mapOf()).apply {
+        setTopic(randomString())
+        setPassword(randomString())
+        setEncrypted(randomBoolean())
+        addChannelMode(randomOf(*CHANMODES_A), randomString())
+        addChannelMode(randomOf(*CHANMODES_A), randomString())
+        addChannelMode(randomOf(*CHANMODES_A), randomString())
+        addChannelMode(randomOf(*CHANMODES_B), randomString())
+        addChannelMode(randomOf(*CHANMODES_C), randomString())
+        addChannelMode(randomOf(*CHANMODES_C), randomString())
+        addChannelMode(randomOf(*CHANMODES_D), null)
+        addChannelMode(randomOf(*CHANMODES_D), null)
+        addChannelMode(randomOf(*CHANMODES_D), null)
+        randomOf(original.ircUsers()).let {
+          joinIrcUser(it)
+          setUserModes(it, randomOf(*CHANMODES_PREFIX).toString())
+        }
+        randomOf(original.ircUsers()).let {
+          joinIrcUser(it)
+          setUserModes(it, randomOf(*CHANMODES_PREFIX).toString())
+        }
+        randomOf(original.ircUsers()).let {
+          joinIrcUser(it)
+          setUserModes(it, randomOf(*CHANMODES_PREFIX).toString())
+        }
+        randomOf(original.ircUsers()).let {
+          joinIrcUser(it)
+          setUserModes(it, randomOf(*CHANMODES_PREFIX).toString())
+        }
+        randomOf(original.ircUsers()).let {
+          joinIrcUser(it)
+          setUserModes(it, randomOf(*CHANMODES_PREFIX).toString())
+        }
+      }
+    }
 
     val copy = original.copy()
     copy.fromVariantMap(roundTrip(VariantMapSerializer, original.toVariantMap()))
@@ -122,10 +195,105 @@ class NetworkTest {
     original.setCodecForServer(randomCharset().name())
     original.setCodecForEncoding(randomCharset().name())
     original.setCodecForDecoding(randomCharset().name())
-    original.setAutoAwayActive(randomBoolean())
+    original.addSupport("AWAYLEN", "200")
+    original.addSupport("CALLERID", "g")
+    original.addSupport("CASEMAPPING", "rfc1459")
+    original.addSupport("CHANMODES", "IXZbegw,k,FHJLUdfjlx,ABCDKMNOPQRSTcimnprstuz")
+    original.addSupport("CHANNELLEN", "64")
+    original.addSupport("CHANTYPES", "#")
+    original.addSupport("CHARSET", "ascii")
+    original.addSupport("ELIST", "MU")
+    original.addSupport("ESILENCE", null)
+    original.addSupport("EXCEPTS", "e")
+    original.addSupport("EXTBAN", ",ABCNOQRSTUcjmprsz")
+    original.addSupport("FNC", null)
+    original.addSupport("INVEX", "I")
+    for (i in 0 until randomUByte()) {
+      original.newIrcUser(randomString() + "!" + randomString() + "@" + randomString()).apply {
+        setUser(randomString())
+        setHost(randomString())
+        setNick(randomString())
+        setRealName(randomString())
+        setAccount(randomString())
+        setAway(randomBoolean())
+        setAwayMessage(randomString())
+        setIdleTime(randomInstant())
+        setLoginTime(randomInstant())
+        setServer(randomString())
+        setIrcOperator(randomString())
+        setLastAwayMessageTime(randomInstant())
+        setWhoisServiceReply(randomString())
+        setSuserHost(randomString())
+        setEncrypted(randomBoolean())
+        setUserModes(listOf(
+          randomOf(*USERMODES),
+          randomOf(*USERMODES),
+          randomOf(*USERMODES)
+        ).toString())
+      }
+    }
+    for (i in 0 until randomUByte()) {
+      original.newIrcChannel(randomString(), mapOf()).apply {
+        setTopic(randomString())
+        setPassword(randomString())
+        setEncrypted(randomBoolean())
+        addChannelMode(randomOf(*CHANMODES_A), randomString())
+        addChannelMode(randomOf(*CHANMODES_A), randomString())
+        addChannelMode(randomOf(*CHANMODES_A), randomString())
+        addChannelMode(randomOf(*CHANMODES_B), randomString())
+        addChannelMode(randomOf(*CHANMODES_C), randomString())
+        addChannelMode(randomOf(*CHANMODES_C), randomString())
+        addChannelMode(randomOf(*CHANMODES_D), null)
+        addChannelMode(randomOf(*CHANMODES_D), null)
+        addChannelMode(randomOf(*CHANMODES_D), null)
+        randomOf(original.ircUsers()).let {
+          joinIrcUser(it)
+          setUserModes(it, randomOf(*CHANMODES_PREFIX).toString())
+        }
+        randomOf(original.ircUsers()).let {
+          joinIrcUser(it)
+          setUserModes(it, randomOf(*CHANMODES_PREFIX).toString())
+        }
+        randomOf(original.ircUsers()).let {
+          joinIrcUser(it)
+          setUserModes(it, randomOf(*CHANMODES_PREFIX).toString())
+        }
+        randomOf(original.ircUsers()).let {
+          joinIrcUser(it)
+          setUserModes(it, randomOf(*CHANMODES_PREFIX).toString())
+        }
+        randomOf(original.ircUsers()).let {
+          joinIrcUser(it)
+          setUserModes(it, randomOf(*CHANMODES_PREFIX).toString())
+        }
+      }
+    }
 
     val copy = original.copy()
     copy.fromVariantMap(original.toVariantMap())
     assert(original.isEqual(copy))
   }
+
+  companion object {
+    private val USERMODES = arrayOf(
+      'B', 'H', 'I', 'L', 'O', 'R', 'S', 'T', 'W', 'c', 'd', 'g', 'h', 'i', 'k', 'o', 'r', 's', 'w',
+      'x'
+    )
+    private val CHANMODES_PREFIX = arrayOf(
+      'Y', 'o', 'h', 'v'
+    )
+    private val CHANMODES_A = arrayOf(
+      'I', 'X', 'Z', 'b', 'e', 'g', 'w'
+    )
+    private val CHANMODES_B = arrayOf(
+      'k'
+    )
+    private val CHANMODES_C = arrayOf(
+      'F', 'H', 'J', 'L', 'U', 'd', 'f', 'j', 'l', 'x'
+    )
+    private val CHANMODES_D = arrayOf(
+      'A', 'B', 'C', 'D', 'K', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'c', 'i', 'm', 'n', 'p', 'r',
+      's', 't', 'u', 'z'
+    )
+  }
 }
diff --git a/lib/src/test/java/de/kuschku/libquassel/util/RandomHelpers.kt b/lib/src/test/java/de/kuschku/libquassel/util/RandomHelpers.kt
index ce793447f60735a13dd3d2fd6fad04e77103caa9..3e56347c8ed159609e05d414d29c615d77cd79fe 100644
--- a/lib/src/test/java/de/kuschku/libquassel/util/RandomHelpers.kt
+++ b/lib/src/test/java/de/kuschku/libquassel/util/RandomHelpers.kt
@@ -22,6 +22,7 @@ package de.kuschku.libquassel.util
 import de.kuschku.libquassel.protocol.UByte
 import de.kuschku.libquassel.protocol.UInt
 import de.kuschku.libquassel.protocol.UShort
+import org.threeten.bp.Instant
 import java.nio.charset.Charset
 import java.util.*
 
@@ -42,6 +43,9 @@ fun Any?.randomLong(): Long = random.nextLong()
 
 fun Any?.randomString(): String = UUID.randomUUID().toString()
 
+fun Any?.randomInstant(): Instant = Instant.ofEpochMilli(randomLong())
+
 fun <T> Any?.randomOf(vararg elements: T): T = elements[random.nextInt(elements.size)]
+fun <T> Any?.randomOf(elements: List<T>): T = elements[random.nextInt(elements.size)]
 
 fun Any?.randomCharset(): Charset = randomOf(*Charset.availableCharsets().values.toTypedArray())