diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/HandshakeMessage.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/HandshakeMessage.kt
index d7203d82a6418b8f9c4d2bb864f3fb4e4293730d..e903e880200c836e3024b286cee63cafdfcf5513 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/HandshakeMessage.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/HandshakeMessage.kt
@@ -12,6 +12,7 @@ package de.justjanne.libquassel.protocol.models
 
 import de.justjanne.libquassel.protocol.features.FeatureSet
 import de.justjanne.libquassel.protocol.models.ids.NetworkId
+import de.justjanne.libquassel.protocol.models.setup.BackendInfo
 import de.justjanne.libquassel.protocol.variant.QVariantMap
 
 /**
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/Alias.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/alias/Alias.kt
similarity index 87%
rename from libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/Alias.kt
rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/alias/Alias.kt
index 12b18d8ea2826e5450c5084c919eb49083481d77..5e39197d826622b9bd83ee17e37a279c72b8fc2b 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/Alias.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/alias/Alias.kt
@@ -8,7 +8,7 @@
  * obtain one at https://mozilla.org/MPL/2.0/.
  */
 
-package de.justjanne.libquassel.protocol.models
+package de.justjanne.libquassel.protocol.models.alias
 
 data class Alias(
   val name: String?,
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/Command.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/alias/Command.kt
similarity index 77%
rename from libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/Command.kt
rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/alias/Command.kt
index a33196e567088ce075db756bd938f153849642ef..00452361d0d84fac0ffbdfa8de96d9ad42db19f6 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/Command.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/alias/Command.kt
@@ -8,7 +8,9 @@
  * obtain one at https://mozilla.org/MPL/2.0/.
  */
 
-package de.justjanne.libquassel.protocol.models
+package de.justjanne.libquassel.protocol.models.alias
+
+import de.justjanne.libquassel.protocol.models.BufferInfo
 
 data class Command(
   val buffer: BufferInfo,
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/DccIpDetectionMode.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/dcc/DccIpDetectionMode.kt
similarity index 94%
rename from libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/DccIpDetectionMode.kt
rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/dcc/DccIpDetectionMode.kt
index 98da25b8ae1193f653695f342ef1ce2d4b66cc0f..91f86405928b7aab88a317138f96b5adb7941574 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/DccIpDetectionMode.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/dcc/DccIpDetectionMode.kt
@@ -8,7 +8,7 @@
  * obtain one at https://mozilla.org/MPL/2.0/.
  */
 
-package de.justjanne.libquassel.protocol.models
+package de.justjanne.libquassel.protocol.models.dcc
 
 /**
  * Mode for detecting the outgoing IP
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/DccPortSelectionMode.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/dcc/DccPortSelectionMode.kt
similarity index 94%
rename from libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/DccPortSelectionMode.kt
rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/dcc/DccPortSelectionMode.kt
index ac03669892869c8d49148fef7926ddc0a0ae804e..b8de80ce90791ebbbf15a2b37c8c1d99c66df443 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/DccPortSelectionMode.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/dcc/DccPortSelectionMode.kt
@@ -8,7 +8,7 @@
  * obtain one at https://mozilla.org/MPL/2.0/.
  */
 
-package de.justjanne.libquassel.protocol.models
+package de.justjanne.libquassel.protocol.models.dcc
 
 /**
  * Mode for selecting the port range for DCC
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/NetworkLayerProtocol.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/dcc/NetworkLayerProtocol.kt
similarity index 95%
rename from libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/NetworkLayerProtocol.kt
rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/dcc/NetworkLayerProtocol.kt
index b5b973b3962fd787832444a53addc402124bbe47..5c571fe97753a4f0dd5abfa49a31bd0a082af248 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/NetworkLayerProtocol.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/dcc/NetworkLayerProtocol.kt
@@ -8,7 +8,7 @@
  * obtain one at https://mozilla.org/MPL/2.0/.
  */
 
-package de.justjanne.libquassel.protocol.models
+package de.justjanne.libquassel.protocol.models.dcc
 
 /**
  * Network protocol version
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/TransferDirection.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/dcc/TransferDirection.kt
similarity index 92%
rename from libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/TransferDirection.kt
rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/dcc/TransferDirection.kt
index 8f28f6e1c6fe9a2704116d7d865a28b62aedccb4..c81943bb5edc6ee43d06d1a2bc60e7a8406bcbfb 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/TransferDirection.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/dcc/TransferDirection.kt
@@ -8,7 +8,7 @@
  * obtain one at https://mozilla.org/MPL/2.0/.
  */
 
-package de.justjanne.libquassel.protocol.models
+package de.justjanne.libquassel.protocol.models.dcc
 
 enum class TransferDirection(
   val value: Int,
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/TransferIdList.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/dcc/TransferIdList.kt
similarity index 89%
rename from libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/TransferIdList.kt
rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/dcc/TransferIdList.kt
index df0d64c6094a2aea3a514b6273bf6b431c5ac294..0eefbe54f0ee28eb31416a4ca523ee4791bbd9d0 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/TransferIdList.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/dcc/TransferIdList.kt
@@ -8,7 +8,7 @@
  * obtain one at https://mozilla.org/MPL/2.0/.
  */
 
-package de.justjanne.libquassel.protocol.models
+package de.justjanne.libquassel.protocol.models.dcc
 
 import java.util.UUID
 
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/TransferStatus.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/dcc/TransferStatus.kt
similarity index 93%
rename from libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/TransferStatus.kt
rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/dcc/TransferStatus.kt
index 5d90f13a345119f839a5471e78ca6af5fcf59f6c..7ef95f90804407ff60e4bbfca1e47c47e3880ebd 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/TransferStatus.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/dcc/TransferStatus.kt
@@ -8,7 +8,7 @@
  * obtain one at https://mozilla.org/MPL/2.0/.
  */
 
-package de.justjanne.libquassel.protocol.models
+package de.justjanne.libquassel.protocol.models.dcc
 
 enum class TransferStatus(
   val value: Int,
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/ChannelModeType.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/network/ChannelModeType.kt
similarity index 93%
rename from libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/ChannelModeType.kt
rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/network/ChannelModeType.kt
index 6e0f662e2e579209770674fe552cf9ade286cb60..7488fc9c204658618adbb5a27485c7db59421692 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/ChannelModeType.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/network/ChannelModeType.kt
@@ -8,7 +8,7 @@
  * obtain one at https://mozilla.org/MPL/2.0/.
  */
 
-package de.justjanne.libquassel.protocol.models
+package de.justjanne.libquassel.protocol.models.network
 
 enum class ChannelModeType(
   /**
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/ChannelModes.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/network/ChannelModes.kt
similarity index 95%
rename from libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/ChannelModes.kt
rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/network/ChannelModes.kt
index cd07ccf0a824b693559c693697a5a991d303f380..2b2ddab5e859b17f6b465e798ee551d0ed1c476a 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/ChannelModes.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/network/ChannelModes.kt
@@ -8,8 +8,9 @@
  * obtain one at https://mozilla.org/MPL/2.0/.
  */
 
-package de.justjanne.libquassel.protocol.models
+package de.justjanne.libquassel.protocol.models.network
 
+import de.justjanne.libquassel.protocol.models.QStringList
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.variant.QVariantMap
 import de.justjanne.libquassel.protocol.variant.into
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/ConnectionState.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/network/ConnectionState.kt
similarity index 93%
rename from libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/ConnectionState.kt
rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/network/ConnectionState.kt
index a0bfc5801d775b851f8f55a07945dd6a2fa147e3..8176f81751701fd84906baa4b0df0f7f044d6437 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/ConnectionState.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/network/ConnectionState.kt
@@ -8,7 +8,7 @@
  * obtain one at https://mozilla.org/MPL/2.0/.
  */
 
-package de.justjanne.libquassel.protocol.models
+package de.justjanne.libquassel.protocol.models.network
 
 enum class ConnectionState(
   /**
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/NetworkInfo.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/network/NetworkInfo.kt
similarity index 96%
rename from libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/NetworkInfo.kt
rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/network/NetworkInfo.kt
index efdda294f79fda6cef78e78577ec62c114054250..580fa930fbab0b27e1c0643de01a327882c5d8f5 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/NetworkInfo.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/network/NetworkInfo.kt
@@ -8,7 +8,7 @@
  * obtain one at https://mozilla.org/MPL/2.0/.
  */
 
-package de.justjanne.libquassel.protocol.models
+package de.justjanne.libquassel.protocol.models.network
 
 import de.justjanne.libquassel.protocol.models.ids.IdentityId
 import de.justjanne.libquassel.protocol.models.ids.NetworkId
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/NetworkProxy.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/network/NetworkProxy.kt
similarity index 92%
rename from libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/NetworkProxy.kt
rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/network/NetworkProxy.kt
index bafa63fa4d2928d56cdf0345c02a83197b2d273e..92545a6358b0fcd37c6bf909d51ba5be770a8eb2 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/NetworkProxy.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/network/NetworkProxy.kt
@@ -8,7 +8,7 @@
  * obtain one at https://mozilla.org/MPL/2.0/.
  */
 
-package de.justjanne.libquassel.protocol.models
+package de.justjanne.libquassel.protocol.models.network
 
 enum class NetworkProxy(
   val value: Int,
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/NetworkServer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/network/NetworkServer.kt
similarity index 92%
rename from libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/NetworkServer.kt
rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/network/NetworkServer.kt
index 953190b41613cc949427a8c6acf7aa510cf22cae..8d5951f2db338dd77e26c423834e2b983f8deb55 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/NetworkServer.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/network/NetworkServer.kt
@@ -8,7 +8,7 @@
  * obtain one at https://mozilla.org/MPL/2.0/.
  */
 
-package de.justjanne.libquassel.protocol.models
+package de.justjanne.libquassel.protocol.models.network
 
 data class NetworkServer(
   val host: String,
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/PortDefaults.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/network/PortDefaults.kt
similarity index 87%
rename from libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/PortDefaults.kt
rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/network/PortDefaults.kt
index c7279a2523e8ca900206495a4e4f339287bcea0c..bcda8698564f067116aaf4c6d2e55f5503cd7802 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/PortDefaults.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/network/PortDefaults.kt
@@ -8,7 +8,7 @@
  * obtain one at https://mozilla.org/MPL/2.0/.
  */
 
-package de.justjanne.libquassel.protocol.models
+package de.justjanne.libquassel.protocol.models.network
 
 enum class PortDefaults(
   val port: UInt
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/HighlightNickType.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/rules/HighlightNickType.kt
similarity index 92%
rename from libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/HighlightNickType.kt
rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/rules/HighlightNickType.kt
index 8cf451b25fb7c677d09b5a2f0361033894a3ed58..01edde5eee45ee3ea1548e264eadb9dd627bb07c 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/HighlightNickType.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/rules/HighlightNickType.kt
@@ -8,7 +8,7 @@
  * obtain one at https://mozilla.org/MPL/2.0/.
  */
 
-package de.justjanne.libquassel.protocol.models
+package de.justjanne.libquassel.protocol.models.rules
 
 enum class HighlightNickType(
   val value: Int,
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/HighlightRule.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/rules/HighlightRule.kt
similarity index 95%
rename from libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/HighlightRule.kt
rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/rules/HighlightRule.kt
index af45a7162c077b8902bba5f4dfe8710e80cf55df..22acde7e8a7e059ce257d754c3f987f067d8af28 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/HighlightRule.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/rules/HighlightRule.kt
@@ -8,7 +8,7 @@
  * obtain one at https://mozilla.org/MPL/2.0/.
  */
 
-package de.justjanne.libquassel.protocol.models
+package de.justjanne.libquassel.protocol.models.rules
 
 import de.justjanne.libquassel.protocol.util.expression.ExpressionMatch
 
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/BackendInfo.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/setup/BackendInfo.kt
similarity index 94%
rename from libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/BackendInfo.kt
rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/setup/BackendInfo.kt
index 7107355ab96ad866e20f8d719d551b4c1b15b9cf..8b33fe388927d3eb463bba948792006b6be03636 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/BackendInfo.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/setup/BackendInfo.kt
@@ -8,7 +8,7 @@
  * obtain one at https://mozilla.org/MPL/2.0/.
  */
 
-package de.justjanne.libquassel.protocol.models
+package de.justjanne.libquassel.protocol.models.setup
 
 /**
  * Model for storage/authenticator backend configuration
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/BackendInfoSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/setup/BackendInfoSerializer.kt
similarity index 95%
rename from libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/BackendInfoSerializer.kt
rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/setup/BackendInfoSerializer.kt
index 23d30865d4e2622785de56f45140170fb08aa73a..53ab4abc0901b7d66919ddeda3b4f2e1b8fed134 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/BackendInfoSerializer.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/setup/BackendInfoSerializer.kt
@@ -8,8 +8,9 @@
  * obtain one at https://mozilla.org/MPL/2.0/.
  */
 
-package de.justjanne.libquassel.protocol.models
+package de.justjanne.libquassel.protocol.models.setup
 
+import de.justjanne.libquassel.protocol.models.QStringList
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.util.collections.triples
 import de.justjanne.libquassel.protocol.variant.QVariantList
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/SetupEntry.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/setup/SetupEntry.kt
similarity index 92%
rename from libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/SetupEntry.kt
rename to libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/setup/SetupEntry.kt
index e5ce29530009cd5b99d8565f29fa4940ce576271..2b7b1123e14a8f0b5deb4879d92f7f36a059b6eb 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/SetupEntry.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/models/setup/SetupEntry.kt
@@ -8,7 +8,7 @@
  * obtain one at https://mozilla.org/MPL/2.0/.
  */
 
-package de.justjanne.libquassel.protocol.models
+package de.justjanne.libquassel.protocol.models.setup
 
 import de.justjanne.libquassel.protocol.variant.QVariant_
 
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientInitAckSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientInitAckSerializer.kt
index 5366f5cd29a1ed3c1253383e5d54fc2f40d30f81..a9d604801f0e8f97ac5bc43d06c364c8b8cdf83e 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientInitAckSerializer.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientInitAckSerializer.kt
@@ -15,9 +15,9 @@ import de.justjanne.bitflags.toBits
 import de.justjanne.libquassel.protocol.features.FeatureSet
 import de.justjanne.libquassel.protocol.features.LegacyFeature
 import de.justjanne.libquassel.protocol.features.QuasselFeatureName
-import de.justjanne.libquassel.protocol.models.BackendInfoSerializer
 import de.justjanne.libquassel.protocol.models.HandshakeMessage
 import de.justjanne.libquassel.protocol.models.QStringList
+import de.justjanne.libquassel.protocol.models.setup.BackendInfoSerializer
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.serializers.HandshakeSerializer
 import de.justjanne.libquassel.protocol.variant.QVariantList
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccIpDetectionModeSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccIpDetectionModeSerializer.kt
index 90cb4910ef47e34a9a5b5f5f51a5ab5661a4c34e..1c2ca339ef221ba5f40f2c4b75a2d534591076b0 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccIpDetectionModeSerializer.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccIpDetectionModeSerializer.kt
@@ -12,7 +12,7 @@ package de.justjanne.libquassel.protocol.serializers.quassel
 
 import de.justjanne.libquassel.protocol.features.FeatureSet
 import de.justjanne.libquassel.protocol.io.ChainedByteBuffer
-import de.justjanne.libquassel.protocol.models.DccIpDetectionMode
+import de.justjanne.libquassel.protocol.models.dcc.DccIpDetectionMode
 import de.justjanne.libquassel.protocol.serializers.PrimitiveSerializer
 import de.justjanne.libquassel.protocol.serializers.qt.UByteSerializer
 import java.nio.ByteBuffer
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccPortSelectionModeSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccPortSelectionModeSerializer.kt
index 01c9f5c8a320f4187d4db88dd20a44d1be46735f..14a151dbf1c0e72148c437d378f3fc3661d08025 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccPortSelectionModeSerializer.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccPortSelectionModeSerializer.kt
@@ -12,7 +12,7 @@ package de.justjanne.libquassel.protocol.serializers.quassel
 
 import de.justjanne.libquassel.protocol.features.FeatureSet
 import de.justjanne.libquassel.protocol.io.ChainedByteBuffer
-import de.justjanne.libquassel.protocol.models.DccPortSelectionMode
+import de.justjanne.libquassel.protocol.models.dcc.DccPortSelectionMode
 import de.justjanne.libquassel.protocol.serializers.PrimitiveSerializer
 import de.justjanne.libquassel.protocol.serializers.qt.UByteSerializer
 import java.nio.ByteBuffer
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/NetworkInfoSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/NetworkInfoSerializer.kt
index ebcb290811e9ab65e9a2602941e47dda36f0e79c..142fb763b2898978064c9ee91dc9e32bd0210cac 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/NetworkInfoSerializer.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/NetworkInfoSerializer.kt
@@ -12,11 +12,11 @@ package de.justjanne.libquassel.protocol.serializers.quassel
 
 import de.justjanne.libquassel.protocol.features.FeatureSet
 import de.justjanne.libquassel.protocol.io.ChainedByteBuffer
-import de.justjanne.libquassel.protocol.models.NetworkInfo
-import de.justjanne.libquassel.protocol.models.NetworkServer
 import de.justjanne.libquassel.protocol.models.QStringList
 import de.justjanne.libquassel.protocol.models.ids.IdentityId
 import de.justjanne.libquassel.protocol.models.ids.NetworkId
+import de.justjanne.libquassel.protocol.models.network.NetworkInfo
+import de.justjanne.libquassel.protocol.models.network.NetworkServer
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.models.types.QuasselType
 import de.justjanne.libquassel.protocol.serializers.PrimitiveSerializer
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/NetworkServerSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/NetworkServerSerializer.kt
index 4b1beac348b50c5fbbf9ac35908e12b7376bbeb4..70ca5214c13e26945d4022a2a19f40c4b2e2ee4e 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/NetworkServerSerializer.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/NetworkServerSerializer.kt
@@ -12,9 +12,9 @@ package de.justjanne.libquassel.protocol.serializers.quassel
 
 import de.justjanne.libquassel.protocol.features.FeatureSet
 import de.justjanne.libquassel.protocol.io.ChainedByteBuffer
-import de.justjanne.libquassel.protocol.models.NetworkProxy
-import de.justjanne.libquassel.protocol.models.NetworkServer
-import de.justjanne.libquassel.protocol.models.PortDefaults
+import de.justjanne.libquassel.protocol.models.network.NetworkProxy
+import de.justjanne.libquassel.protocol.models.network.NetworkServer
+import de.justjanne.libquassel.protocol.models.network.PortDefaults
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.serializers.PrimitiveSerializer
 import de.justjanne.libquassel.protocol.serializers.qt.QVariantMapSerializer
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/QHostAddressSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/QHostAddressSerializer.kt
index 12970e1f1d4719b173101c1454f9fa7a7f3ee263..f25f255b069dbbf3c3ff541e74106227a6763015 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/QHostAddressSerializer.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/QHostAddressSerializer.kt
@@ -12,7 +12,7 @@ package de.justjanne.libquassel.protocol.serializers.quassel
 
 import de.justjanne.libquassel.protocol.features.FeatureSet
 import de.justjanne.libquassel.protocol.io.ChainedByteBuffer
-import de.justjanne.libquassel.protocol.models.NetworkLayerProtocol
+import de.justjanne.libquassel.protocol.models.dcc.NetworkLayerProtocol
 import de.justjanne.libquassel.protocol.serializers.PrimitiveSerializer
 import de.justjanne.libquassel.protocol.serializers.qt.UByteSerializer
 import java.net.Inet4Address
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/TransferDirectionSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/TransferDirectionSerializer.kt
index 2cb85989e8e1f30d120c19ec09bf8ef4db93d274..aa68d05881fb7c56ba88eb62d30bb5fa890a0325 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/TransferDirectionSerializer.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/TransferDirectionSerializer.kt
@@ -12,7 +12,7 @@ package de.justjanne.libquassel.protocol.serializers.quassel
 
 import de.justjanne.libquassel.protocol.features.FeatureSet
 import de.justjanne.libquassel.protocol.io.ChainedByteBuffer
-import de.justjanne.libquassel.protocol.models.TransferDirection
+import de.justjanne.libquassel.protocol.models.dcc.TransferDirection
 import de.justjanne.libquassel.protocol.serializers.PrimitiveSerializer
 import de.justjanne.libquassel.protocol.serializers.qt.IntSerializer
 import java.nio.ByteBuffer
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/TransferIdListSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/TransferIdListSerializer.kt
index 396109a801e56b378019b904bb9c5410cc3cc9dd..b7a97a08089ba2e401bfb0bb2a93b7f897b40689 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/TransferIdListSerializer.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/TransferIdListSerializer.kt
@@ -12,7 +12,7 @@ package de.justjanne.libquassel.protocol.serializers.quassel
 
 import de.justjanne.libquassel.protocol.features.FeatureSet
 import de.justjanne.libquassel.protocol.io.ChainedByteBuffer
-import de.justjanne.libquassel.protocol.models.TransferIdList
+import de.justjanne.libquassel.protocol.models.dcc.TransferIdList
 import de.justjanne.libquassel.protocol.serializers.PrimitiveSerializer
 import de.justjanne.libquassel.protocol.serializers.qt.IntSerializer
 import de.justjanne.libquassel.protocol.serializers.qt.UuidSerializer
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/TransferStatusSerializer.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/TransferStatusSerializer.kt
index 9d93c21b0163882eb70d925f91d703b32ab399ee..e14adc168e34ebb5ff7cfaad66143aadbb322cf0 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/TransferStatusSerializer.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/TransferStatusSerializer.kt
@@ -12,7 +12,7 @@ package de.justjanne.libquassel.protocol.serializers.quassel
 
 import de.justjanne.libquassel.protocol.features.FeatureSet
 import de.justjanne.libquassel.protocol.io.ChainedByteBuffer
-import de.justjanne.libquassel.protocol.models.TransferStatus
+import de.justjanne.libquassel.protocol.models.dcc.TransferStatus
 import de.justjanne.libquassel.protocol.serializers.PrimitiveSerializer
 import de.justjanne.libquassel.protocol.serializers.qt.IntSerializer
 import java.nio.ByteBuffer
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/AliasManager.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/AliasManager.kt
index 957bb118e1fe3dde37b35e8da9cc45f3960a8ebf..281c34837baa90b9215b2d60951b622ff8a0722e 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/AliasManager.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/AliasManager.kt
@@ -10,10 +10,10 @@
 
 package de.justjanne.libquassel.protocol.syncables
 
-import de.justjanne.libquassel.protocol.models.Alias
 import de.justjanne.libquassel.protocol.models.BufferInfo
-import de.justjanne.libquassel.protocol.models.Command
 import de.justjanne.libquassel.protocol.models.QStringList
+import de.justjanne.libquassel.protocol.models.alias.Alias
+import de.justjanne.libquassel.protocol.models.alias.Command
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.syncables.state.AliasManagerState
 import de.justjanne.libquassel.protocol.syncables.stubs.AliasManagerStub
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/DccConfig.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/DccConfig.kt
index 0127d7c33ac93841189a07f45fbf3527769b52d9..8434fe22e7dfa6447dbc141cfdc5281fbebd8a50 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/DccConfig.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/DccConfig.kt
@@ -10,8 +10,8 @@
 
 package de.justjanne.libquassel.protocol.syncables
 
-import de.justjanne.libquassel.protocol.models.DccIpDetectionMode
-import de.justjanne.libquassel.protocol.models.DccPortSelectionMode
+import de.justjanne.libquassel.protocol.models.dcc.DccIpDetectionMode
+import de.justjanne.libquassel.protocol.models.dcc.DccPortSelectionMode
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.models.types.QuasselType
 import de.justjanne.libquassel.protocol.syncables.state.DccConfigState
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/HighlightRuleManager.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/HighlightRuleManager.kt
index a5fac7985f517ef29ba60deb9f312919e2d1fb3f..17f695affc7f7d5dbf8a90fbf097c2a1caf1031c 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/HighlightRuleManager.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/HighlightRuleManager.kt
@@ -10,9 +10,9 @@
 
 package de.justjanne.libquassel.protocol.syncables
 
-import de.justjanne.libquassel.protocol.models.HighlightNickType
-import de.justjanne.libquassel.protocol.models.HighlightRule
 import de.justjanne.libquassel.protocol.models.QStringList
+import de.justjanne.libquassel.protocol.models.rules.HighlightNickType
+import de.justjanne.libquassel.protocol.models.rules.HighlightRule
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.syncables.state.HighlightRuleManagerState
 import de.justjanne.libquassel.protocol.syncables.stubs.HighlightRuleManagerStub
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/IgnoreListManager.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/IgnoreListManager.kt
index 30254bc6ea1c52a76d06cff7e300ecf560db246b..5a309b6675505f25c2a20ca87b9ab5d6b9e8d20f 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/IgnoreListManager.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/IgnoreListManager.kt
@@ -9,3 +9,188 @@
  */
 
 package de.justjanne.libquassel.protocol.syncables
+
+import de.justjanne.libquassel.protocol.models.QStringList
+import de.justjanne.libquassel.protocol.models.flags.MessageTypes
+import de.justjanne.libquassel.protocol.models.rules.IgnoreRule
+import de.justjanne.libquassel.protocol.models.rules.IgnoreType
+import de.justjanne.libquassel.protocol.models.rules.ScopeType
+import de.justjanne.libquassel.protocol.models.rules.StrictnessType
+import de.justjanne.libquassel.protocol.models.types.QtType
+import de.justjanne.libquassel.protocol.syncables.state.IgnoreListManagerState
+import de.justjanne.libquassel.protocol.syncables.stubs.IgnoreListManagerStub
+import de.justjanne.libquassel.protocol.util.update
+import de.justjanne.libquassel.protocol.variant.QVariantList
+import de.justjanne.libquassel.protocol.variant.QVariantMap
+import de.justjanne.libquassel.protocol.variant.into
+import de.justjanne.libquassel.protocol.variant.qVariant
+
+class IgnoreListManager(
+  session: Session? = null,
+  state: IgnoreListManagerState = IgnoreListManagerState()
+) : StatefulSyncableObject<IgnoreListManagerState>(session, "IgnoreListManager", state),
+  IgnoreListManagerStub {
+  override fun toVariantMap() = mapOf(
+    "IgnoreList" to qVariant(
+      mapOf(
+        "ignoreType" to qVariant(
+          state().rules.map {
+            qVariant(it.type.value, QtType.Int)
+          },
+          QtType.QVariantList
+        ),
+        "ignoreRule" to qVariant(
+          state().rules.map(IgnoreRule::ignoreRule),
+          QtType.QStringList
+        ),
+        "isRegEx" to qVariant(
+          state().rules.map {
+            qVariant(it.isRegEx, QtType.Bool)
+          },
+          QtType.QVariantList
+        ),
+        "strictness" to qVariant(
+          state().rules.map {
+            qVariant(it.strictness.value, QtType.Int)
+          },
+          QtType.QVariantList
+        ),
+        "scope" to qVariant(
+          state().rules.map {
+            qVariant(it.scope.value, QtType.Int)
+          },
+          QtType.QVariantList
+        ),
+        "isActive" to qVariant(
+          state().rules.map {
+            qVariant(it.isEnabled, QtType.Bool)
+          },
+          QtType.QVariantList
+        ),
+        "scopeRule" to qVariant(
+          state().rules.map(IgnoreRule::scopeRule),
+          QtType.QStringList
+        ),
+      ),
+      QtType.QVariantMap
+    )
+  )
+
+  override fun fromVariantMap(properties: QVariantMap) {
+    val ignoreRules = properties["IgnoreList"].into<QVariantMap>().orEmpty()
+
+    val ignoreTypeList = ignoreRules["ignoreType"].into<QVariantList>().orEmpty()
+    val ignoreRuleList = ignoreRules["ignoreRule"].into<QStringList>().orEmpty()
+    val isRegExList = ignoreRules["isRegEx"].into<QVariantList>().orEmpty()
+    val strictnessList = ignoreRules["strictness"].into<QVariantList>().orEmpty()
+    val isEnabledList = ignoreRules["isActive"].into<QVariantList>().orEmpty()
+    val scopeList = ignoreRules["scope"].into<QVariantList>().orEmpty()
+    val scopeRuleList = ignoreRules["scopeRule"].into<QStringList>().orEmpty()
+
+    require(ignoreTypeList.size == ignoreRuleList.size) {
+      "Sizes do not match: ids=${ignoreTypeList.size}, ignoreRule=${ignoreRuleList.size}"
+    }
+    require(ignoreTypeList.size == isRegExList.size) {
+      "Sizes do not match: ids=${ignoreTypeList.size}, isRegExList=${isRegExList.size}"
+    }
+    require(ignoreTypeList.size == strictnessList.size) {
+      "Sizes do not match: ids=${ignoreTypeList.size}, strictnessList=${strictnessList.size}"
+    }
+    require(ignoreTypeList.size == isEnabledList.size) {
+      "Sizes do not match: ids=${ignoreTypeList.size}, isEnabledList=${isEnabledList.size}"
+    }
+    require(ignoreTypeList.size == scopeList.size) {
+      "Sizes do not match: ids=${ignoreTypeList.size}, scopeList=${scopeList.size}"
+    }
+    require(ignoreTypeList.size == scopeRuleList.size) {
+      "Sizes do not match: ids=${ignoreTypeList.size}, scopeRuleList=${scopeRuleList.size}"
+    }
+
+    state.update {
+      copy(
+        rules = List(ignoreTypeList.size) {
+          IgnoreRule(
+            type = ignoreTypeList[it].into<Int>()?.let(IgnoreType::of)
+              ?: IgnoreType.SenderIgnore,
+            ignoreRule = ignoreRuleList[it] ?: "",
+            isRegEx = isRegExList[it].into(false),
+            strictness = strictnessList[it].into<Int>()?.let(StrictnessType::of)
+              ?: StrictnessType.UnmatchedStrictness,
+            isEnabled = isEnabledList[it].into(false),
+            scope = scopeList[it].into<Int>()?.let(ScopeType::of)
+              ?: ScopeType.GlobalScope,
+            scopeRule = scopeRuleList[it] ?: "",
+          )
+        }
+      )
+    }
+  }
+
+  fun indexOf(ignoreRule: String?): Int = state().indexOf(ignoreRule)
+  fun contains(ignoreRule: String?) = state().contains(ignoreRule)
+
+  fun isEmpty() = state().isEmpty()
+  fun count() = state().count()
+  fun removeAt(index: Int) {
+    state.update {
+      copy(rules = rules.drop(index))
+    }
+  }
+
+  override fun addIgnoreListItem(
+    type: Int,
+    ignoreRule: String?,
+    isRegEx: Boolean,
+    strictness: Int,
+    scope: Int,
+    scopeRule: String?,
+    isActive: Boolean
+  ) {
+    if (contains(ignoreRule)) {
+      return
+    }
+
+    state.update {
+      copy(
+        rules = rules + IgnoreRule(
+          type = IgnoreType.of(type) ?: return,
+          ignoreRule = ignoreRule ?: "",
+          isRegEx = isRegEx,
+          strictness = StrictnessType.of(strictness) ?: return,
+          scope = ScopeType.of(scope) ?: return,
+          scopeRule = scopeRule ?: "",
+          isEnabled = isActive
+        )
+      )
+    }
+
+    super.addIgnoreListItem(type, ignoreRule, isRegEx, strictness, scope, scopeRule, isActive)
+  }
+
+  override fun removeIgnoreListItem(ignoreRule: String?) {
+    removeAt(indexOf(ignoreRule))
+
+    super.removeIgnoreListItem(ignoreRule)
+  }
+
+  override fun toggleIgnoreRule(ignoreRule: String?) {
+    state.update {
+      copy(
+        rules = rules.map {
+          if (it.ignoreRule != ignoreRule) it
+          else it.copy(isEnabled = !it.isEnabled)
+        }
+      )
+    }
+
+    super.toggleIgnoreRule(ignoreRule)
+  }
+
+  fun match(
+    msgContents: String,
+    msgSender: String,
+    msgType: MessageTypes,
+    network: String,
+    bufferName: String
+  ) = state().match(msgContents, msgSender, msgType, network, bufferName)
+}
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/IrcChannel.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/IrcChannel.kt
index 22b55ce65a294f33ced23123125bf8f56c5a8a8b..3b6eae00781f7df80524f34856045d53c0fd1b67 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/IrcChannel.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/IrcChannel.kt
@@ -10,9 +10,9 @@
 
 package de.justjanne.libquassel.protocol.syncables
 
-import de.justjanne.libquassel.protocol.models.ChannelModeType
-import de.justjanne.libquassel.protocol.models.ChannelModes
 import de.justjanne.libquassel.protocol.models.QStringList
+import de.justjanne.libquassel.protocol.models.network.ChannelModeType
+import de.justjanne.libquassel.protocol.models.network.ChannelModes
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.syncables.state.IrcChannelState
 import de.justjanne.libquassel.protocol.syncables.stubs.IrcChannelStub
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/Network.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/Network.kt
index cee2ac65dc0831dc00ab6c3e23aee59bd8f56a47..16baabf7a3e1699b590d797b158629152860bd32 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/Network.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/Network.kt
@@ -10,11 +10,11 @@
 
 package de.justjanne.libquassel.protocol.syncables
 
-import de.justjanne.libquassel.protocol.models.ConnectionState
-import de.justjanne.libquassel.protocol.models.NetworkInfo
-import de.justjanne.libquassel.protocol.models.NetworkServer
 import de.justjanne.libquassel.protocol.models.QStringList
 import de.justjanne.libquassel.protocol.models.ids.IdentityId
+import de.justjanne.libquassel.protocol.models.network.ConnectionState
+import de.justjanne.libquassel.protocol.models.network.NetworkInfo
+import de.justjanne.libquassel.protocol.models.network.NetworkServer
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.models.types.QuasselType
 import de.justjanne.libquassel.protocol.serializers.qt.StringSerializerUtf8
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/state/AliasManagerState.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/state/AliasManagerState.kt
index 94054b6a18d0529f4d3a174ef6c81a862ddb954c..9634cae5309d4d97cdfaf21c6d788e8eaba996c3 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/state/AliasManagerState.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/state/AliasManagerState.kt
@@ -10,9 +10,9 @@
 
 package de.justjanne.libquassel.protocol.syncables.state
 
-import de.justjanne.libquassel.protocol.models.Alias
 import de.justjanne.libquassel.protocol.models.BufferInfo
-import de.justjanne.libquassel.protocol.models.Command
+import de.justjanne.libquassel.protocol.models.alias.Alias
+import de.justjanne.libquassel.protocol.models.alias.Command
 import de.justjanne.libquassel.protocol.util.expansion.Expansion
 
 data class AliasManagerState(
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/state/DccConfigState.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/state/DccConfigState.kt
index 09f14fdf64c28a27b69ce2bc518b14952f1fb7cf..8f6646f4e2fa0a554af292c8fe3199c57292f458 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/state/DccConfigState.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/state/DccConfigState.kt
@@ -10,8 +10,8 @@
 
 package de.justjanne.libquassel.protocol.syncables.state
 
-import de.justjanne.libquassel.protocol.models.DccIpDetectionMode
-import de.justjanne.libquassel.protocol.models.DccPortSelectionMode
+import de.justjanne.libquassel.protocol.models.dcc.DccIpDetectionMode
+import de.justjanne.libquassel.protocol.models.dcc.DccPortSelectionMode
 import java.net.InetAddress
 
 data class DccConfigState(
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/state/HighlightRuleManagerState.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/state/HighlightRuleManagerState.kt
index 6401a56f3b4616d5c72bb631dbd8ce312ffc9a9a..6a11d2604331e6368619330590866653423dbbe3 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/state/HighlightRuleManagerState.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/state/HighlightRuleManagerState.kt
@@ -10,12 +10,12 @@
 
 package de.justjanne.libquassel.protocol.syncables.state
 
-import de.justjanne.libquassel.protocol.models.HighlightNickType
-import de.justjanne.libquassel.protocol.models.HighlightRule
 import de.justjanne.libquassel.protocol.models.flags.MessageFlag
 import de.justjanne.libquassel.protocol.models.flags.MessageFlags
 import de.justjanne.libquassel.protocol.models.flags.MessageType
 import de.justjanne.libquassel.protocol.models.flags.MessageTypes
+import de.justjanne.libquassel.protocol.models.rules.HighlightNickType
+import de.justjanne.libquassel.protocol.models.rules.HighlightRule
 import de.justjanne.libquassel.protocol.util.expression.ExpressionMatch
 import de.justjanne.libquassel.protocol.util.irc.IrcFormatDeserializer
 
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/state/IrcChannelState.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/state/IrcChannelState.kt
index 06d6c0377fa1a64ba4687e3fa17b70c3d105e147..f5b749a0fbcce59473a8bd33985bdf1945f08493 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/state/IrcChannelState.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/state/IrcChannelState.kt
@@ -10,9 +10,9 @@
 
 package de.justjanne.libquassel.protocol.syncables.state
 
-import de.justjanne.libquassel.protocol.models.ChannelModeType
-import de.justjanne.libquassel.protocol.models.ChannelModes
 import de.justjanne.libquassel.protocol.models.ids.NetworkId
+import de.justjanne.libquassel.protocol.models.network.ChannelModeType
+import de.justjanne.libquassel.protocol.models.network.ChannelModes
 
 data class IrcChannelState(
   val network: NetworkId,
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/state/NetworkState.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/state/NetworkState.kt
index 6f5a7d84a5f0f845cf59bfdbc9181287f9c5690b..1f765d89a898a9970902749e8cebfba058673ccf 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/state/NetworkState.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/state/NetworkState.kt
@@ -10,11 +10,11 @@
 
 package de.justjanne.libquassel.protocol.syncables.state
 
-import de.justjanne.libquassel.protocol.models.ChannelModeType
-import de.justjanne.libquassel.protocol.models.ConnectionState
-import de.justjanne.libquassel.protocol.models.NetworkServer
 import de.justjanne.libquassel.protocol.models.ids.IdentityId
 import de.justjanne.libquassel.protocol.models.ids.NetworkId
+import de.justjanne.libquassel.protocol.models.network.ChannelModeType
+import de.justjanne.libquassel.protocol.models.network.ConnectionState
+import de.justjanne.libquassel.protocol.models.network.NetworkServer
 import de.justjanne.libquassel.protocol.syncables.IrcChannel
 import de.justjanne.libquassel.protocol.syncables.IrcUser
 import de.justjanne.libquassel.protocol.util.irc.IrcCapability
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/stubs/DccConfigStub.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/stubs/DccConfigStub.kt
index f9bb09040bf5ebcfa45fcaea9bdf837d456b890f..69ec5a8bd8f3b8d95fc9cd3f213493be27a1c2f0 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/stubs/DccConfigStub.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/stubs/DccConfigStub.kt
@@ -13,8 +13,8 @@ package de.justjanne.libquassel.protocol.syncables.stubs
 import de.justjanne.libquassel.annotations.ProtocolSide
 import de.justjanne.libquassel.annotations.SyncedCall
 import de.justjanne.libquassel.annotations.SyncedObject
-import de.justjanne.libquassel.protocol.models.DccIpDetectionMode
-import de.justjanne.libquassel.protocol.models.DccPortSelectionMode
+import de.justjanne.libquassel.protocol.models.dcc.DccIpDetectionMode
+import de.justjanne.libquassel.protocol.models.dcc.DccPortSelectionMode
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.models.types.QuasselType
 import de.justjanne.libquassel.protocol.syncables.SyncableStub
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/stubs/NetworkStub.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/stubs/NetworkStub.kt
index 5b54584e7340edde8e222dbcd355037dd0551e7f..fe10389aa5aab4665b173c312238de62a5d83ec0 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/stubs/NetworkStub.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/stubs/NetworkStub.kt
@@ -13,9 +13,9 @@ package de.justjanne.libquassel.protocol.syncables.stubs
 import de.justjanne.libquassel.annotations.ProtocolSide
 import de.justjanne.libquassel.annotations.SyncedCall
 import de.justjanne.libquassel.annotations.SyncedObject
-import de.justjanne.libquassel.protocol.models.NetworkInfo
 import de.justjanne.libquassel.protocol.models.QStringList
 import de.justjanne.libquassel.protocol.models.ids.IdentityId
+import de.justjanne.libquassel.protocol.models.network.NetworkInfo
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.models.types.QuasselType
 import de.justjanne.libquassel.protocol.syncables.SyncableStub
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/stubs/RpcHandlerStub.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/stubs/RpcHandlerStub.kt
index 4804e3aa852d90688cd10c7ba81e83b6bb417746..eb4e39b829a700d02fe31938d62e0e1761e5a9b1 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/stubs/RpcHandlerStub.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/stubs/RpcHandlerStub.kt
@@ -15,9 +15,9 @@ import de.justjanne.libquassel.annotations.SyncedCall
 import de.justjanne.libquassel.annotations.SyncedObject
 import de.justjanne.libquassel.protocol.models.BufferInfo
 import de.justjanne.libquassel.protocol.models.Message
-import de.justjanne.libquassel.protocol.models.NetworkInfo
 import de.justjanne.libquassel.protocol.models.ids.IdentityId
 import de.justjanne.libquassel.protocol.models.ids.NetworkId
+import de.justjanne.libquassel.protocol.models.network.NetworkInfo
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.models.types.QuasselType
 import de.justjanne.libquassel.protocol.syncables.SyncableStub
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/stubs/TransferManagerStub.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/stubs/TransferManagerStub.kt
index ac903628f8c04c999ad3510ae8127490493647f4..6badb8abe59e88ade0939ee03a4797f8074dc1ab 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/stubs/TransferManagerStub.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/stubs/TransferManagerStub.kt
@@ -13,7 +13,7 @@ package de.justjanne.libquassel.protocol.syncables.stubs
 import de.justjanne.libquassel.annotations.ProtocolSide
 import de.justjanne.libquassel.annotations.SyncedCall
 import de.justjanne.libquassel.annotations.SyncedObject
-import de.justjanne.libquassel.protocol.models.TransferIdList
+import de.justjanne.libquassel.protocol.models.dcc.TransferIdList
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.models.types.QuasselType
 import de.justjanne.libquassel.protocol.syncables.SyncableStub
diff --git a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/stubs/TransferStub.kt b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/stubs/TransferStub.kt
index 4ea18317b972c1fb53ae8a45e3e4ee82fb9ade6a..7b8ee5ebbf04f8ed45901b28e7300fdf33ef7985 100644
--- a/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/stubs/TransferStub.kt
+++ b/libquassel-protocol/src/main/kotlin/de/justjanne/libquassel/protocol/syncables/stubs/TransferStub.kt
@@ -13,8 +13,8 @@ package de.justjanne.libquassel.protocol.syncables.stubs
 import de.justjanne.libquassel.annotations.ProtocolSide
 import de.justjanne.libquassel.annotations.SyncedCall
 import de.justjanne.libquassel.annotations.SyncedObject
-import de.justjanne.libquassel.protocol.models.TransferDirection
-import de.justjanne.libquassel.protocol.models.TransferStatus
+import de.justjanne.libquassel.protocol.models.dcc.TransferDirection
+import de.justjanne.libquassel.protocol.models.dcc.TransferStatus
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.models.types.QuasselType
 import de.justjanne.libquassel.protocol.syncables.SyncableStub
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientInitAckSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientInitAckSerializerTest.kt
index ae5fe8e4dd800a15fc3c4c18d48f377b7475608b..c01a2257794f5cfc88171f9ff931cb87950fc11e 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientInitAckSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/handshake/ClientInitAckSerializerTest.kt
@@ -19,9 +19,9 @@
 package de.justjanne.libquassel.protocol.serializers.handshake
 
 import de.justjanne.libquassel.protocol.features.FeatureSet
-import de.justjanne.libquassel.protocol.models.BackendInfo
 import de.justjanne.libquassel.protocol.models.HandshakeMessage
-import de.justjanne.libquassel.protocol.models.SetupEntry
+import de.justjanne.libquassel.protocol.models.setup.BackendInfo
+import de.justjanne.libquassel.protocol.models.setup.SetupEntry
 import de.justjanne.libquassel.protocol.models.types.QtType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
 import de.justjanne.libquassel.protocol.testutil.handshakeSerializerTest
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccIpDetectionModeSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccIpDetectionModeSerializerTest.kt
index 674caa757dc200bde44b22a5b575c4bff84dd8aa..1176e0b901f371b74ce28793d88d156db8c4f017 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccIpDetectionModeSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccIpDetectionModeSerializerTest.kt
@@ -18,7 +18,7 @@
  */
 package de.justjanne.libquassel.protocol.serializers.quassel
 
-import de.justjanne.libquassel.protocol.models.DccIpDetectionMode
+import de.justjanne.libquassel.protocol.models.dcc.DccIpDetectionMode
 import de.justjanne.libquassel.protocol.models.types.QuasselType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
 import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccPortSelectionModeSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccPortSelectionModeSerializerTest.kt
index f4789306f325d33da406bca2266bdb4108e9bea4..140cc2dbb7bc7738ba6ac4f090d3f7bf7242a9bc 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccPortSelectionModeSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/DccPortSelectionModeSerializerTest.kt
@@ -18,7 +18,7 @@
  */
 package de.justjanne.libquassel.protocol.serializers.quassel
 
-import de.justjanne.libquassel.protocol.models.DccPortSelectionMode
+import de.justjanne.libquassel.protocol.models.dcc.DccPortSelectionMode
 import de.justjanne.libquassel.protocol.models.types.QuasselType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
 import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/NetworkInfoSerializerTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/NetworkInfoSerializerTest.kt
index 9f28cd6e4113e5508964e6dea59860d13141c057..23938d52e009aa0ecd71a08d890cdfd24f34b420 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/NetworkInfoSerializerTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/serializers/quassel/NetworkInfoSerializerTest.kt
@@ -18,8 +18,8 @@
  */
 package de.justjanne.libquassel.protocol.serializers.quassel
 
-import de.justjanne.libquassel.protocol.models.NetworkInfo
 import de.justjanne.libquassel.protocol.models.ids.NetworkId
+import de.justjanne.libquassel.protocol.models.network.NetworkInfo
 import de.justjanne.libquassel.protocol.models.types.QuasselType
 import de.justjanne.libquassel.protocol.testutil.byteBufferOf
 import de.justjanne.libquassel.protocol.testutil.primitiveSerializerTest
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/syncables/NetworkTest.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/syncables/NetworkTest.kt
index acecf4044d71f025079207d71b1e6023f22a7751..88d109433d6cf4d66c1c4a63dd39e4b4ff07db90 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/syncables/NetworkTest.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/syncables/NetworkTest.kt
@@ -10,18 +10,12 @@
 
 package de.justjanne.libquassel.protocol.syncables
 
-import de.justjanne.libquassel.protocol.models.NetworkServer
-import de.justjanne.libquassel.protocol.models.ids.IdentityId
 import de.justjanne.libquassel.protocol.models.ids.NetworkId
 import de.justjanne.libquassel.protocol.syncables.state.NetworkState
-import de.justjanne.libquassel.protocol.testutil.nextEnum
-import de.justjanne.libquassel.protocol.testutil.nextIrcChannel
-import de.justjanne.libquassel.protocol.testutil.nextIrcUser
-import de.justjanne.libquassel.protocol.testutil.nextString
+import de.justjanne.libquassel.protocol.testutil.nextNetwork
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 import kotlin.random.Random
-import kotlin.random.nextUInt
 
 class NetworkTest {
   @Test
@@ -37,68 +31,3 @@ class NetworkTest {
     assertEquals(expected, actual)
   }
 }
-
-fun Random.nextNetwork(networkId: NetworkId) = NetworkState(
-  networkId = networkId,
-  identity = IdentityId(nextInt()),
-  myNick = nextString(),
-  latency = nextInt(),
-  networkName = nextString(),
-  currentServer = nextString(),
-  connected = nextBoolean(),
-  connectionState = nextEnum(),
-  ircUsers = List(nextInt(20)) {
-    nextIrcUser(networkId)
-  }.associateBy(IrcUser::nick),
-  ircChannels = List(nextInt(20)) {
-    nextIrcChannel(networkId)
-  }.associateBy(IrcChannel::name),
-  supports = List(nextInt(20)) {
-    nextString() to nextString()
-  }.toMap(),
-  caps = List(nextInt(20)) {
-    nextString() to nextString()
-  }.toMap(),
-  capsEnabled = List(nextInt(20)) {
-    nextString()
-  }.toSet(),
-  serverList = List(nextInt(20)) {
-    nextNetworkServer()
-  },
-  useRandomServer = nextBoolean(),
-  perform = List(nextInt(20)) {
-    nextString()
-  },
-  useAutoIdentify = nextBoolean(),
-  autoIdentifyService = nextString(),
-  autoIdentifyPassword = nextString(),
-  useSasl = nextBoolean(),
-  saslAccount = nextString(),
-  saslPassword = nextString(),
-  useAutoReconnect = nextBoolean(),
-  autoReconnectInterval = nextUInt(),
-  autoReconnectRetries = nextUInt(UShort.MAX_VALUE.toUInt()).toUShort(),
-  unlimitedReconnectRetries = nextBoolean(),
-  rejoinChannels = nextBoolean(),
-  useCustomMessageRate = nextBoolean(),
-  messageRateBurstSize = nextUInt(),
-  messageRateDelay = nextUInt(),
-  codecForServer = nextString(),
-  codecForEncoding = nextString(),
-  codecForDecoding = nextString()
-)
-
-fun Random.nextNetworkServer() = NetworkServer(
-  host = nextString(),
-  port = nextUInt(),
-  password = nextString(),
-  useSsl = nextBoolean(),
-  sslVerify = nextBoolean(),
-  sslVersion = nextInt(),
-  useProxy = nextBoolean(),
-  proxyType = nextEnum(),
-  proxyHost = nextString(),
-  proxyPort = nextUInt(),
-  proxyUser = nextString(),
-  proxyPass = nextString()
-)
diff --git a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/Random.kt b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/Random.kt
index 5cf9157becae6b5d4c55bca3d17cc4259afd6164..fb4947ffa197a48f276b8f4fa720163aa674d718 100644
--- a/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/Random.kt
+++ b/libquassel-protocol/src/test/kotlin/de/justjanne/libquassel/protocol/testutil/Random.kt
@@ -10,15 +10,19 @@
 
 package de.justjanne.libquassel.protocol.testutil
 
+import de.justjanne.libquassel.protocol.models.ids.IdentityId
 import de.justjanne.libquassel.protocol.models.ids.NetworkId
+import de.justjanne.libquassel.protocol.models.network.NetworkServer
 import de.justjanne.libquassel.protocol.syncables.IrcChannel
 import de.justjanne.libquassel.protocol.syncables.IrcUser
 import de.justjanne.libquassel.protocol.syncables.state.IrcChannelState
 import de.justjanne.libquassel.protocol.syncables.state.IrcUserState
+import de.justjanne.libquassel.protocol.syncables.state.NetworkState
 import org.threeten.bp.Instant
 import java.util.EnumSet
 import java.util.UUID
 import kotlin.random.Random
+import kotlin.random.nextUInt
 
 fun Random.nextString(): String {
   return UUID(nextLong(), nextLong()).toString()
@@ -39,6 +43,71 @@ inline fun <reified T : Enum<T>> Random.nextEnum(): T {
 
 fun Random.nextInstant(): Instant = Instant.ofEpochMilli(nextLong())
 
+fun Random.nextNetwork(networkId: NetworkId) = NetworkState(
+  networkId = networkId,
+  identity = IdentityId(nextInt()),
+  myNick = nextString(),
+  latency = nextInt(),
+  networkName = nextString(),
+  currentServer = nextString(),
+  connected = nextBoolean(),
+  connectionState = nextEnum(),
+  ircUsers = List(nextInt(20)) {
+    nextIrcUser(networkId)
+  }.associateBy(IrcUser::nick),
+  ircChannels = List(nextInt(20)) {
+    nextIrcChannel(networkId)
+  }.associateBy(IrcChannel::name),
+  supports = List(nextInt(20)) {
+    nextString() to nextString()
+  }.toMap(),
+  caps = List(nextInt(20)) {
+    nextString() to nextString()
+  }.toMap(),
+  capsEnabled = List(nextInt(20)) {
+    nextString()
+  }.toSet(),
+  serverList = List(nextInt(20)) {
+    nextNetworkServer()
+  },
+  useRandomServer = nextBoolean(),
+  perform = List(nextInt(20)) {
+    nextString()
+  },
+  useAutoIdentify = nextBoolean(),
+  autoIdentifyService = nextString(),
+  autoIdentifyPassword = nextString(),
+  useSasl = nextBoolean(),
+  saslAccount = nextString(),
+  saslPassword = nextString(),
+  useAutoReconnect = nextBoolean(),
+  autoReconnectInterval = nextUInt(),
+  autoReconnectRetries = nextUInt(UShort.MAX_VALUE.toUInt()).toUShort(),
+  unlimitedReconnectRetries = nextBoolean(),
+  rejoinChannels = nextBoolean(),
+  useCustomMessageRate = nextBoolean(),
+  messageRateBurstSize = nextUInt(),
+  messageRateDelay = nextUInt(),
+  codecForServer = nextString(),
+  codecForEncoding = nextString(),
+  codecForDecoding = nextString()
+)
+
+fun Random.nextNetworkServer() = NetworkServer(
+  host = nextString(),
+  port = nextUInt(),
+  password = nextString(),
+  useSsl = nextBoolean(),
+  sslVerify = nextBoolean(),
+  sslVersion = nextInt(),
+  useProxy = nextBoolean(),
+  proxyType = nextEnum(),
+  proxyHost = nextString(),
+  proxyPort = nextUInt(),
+  proxyUser = nextString(),
+  proxyPass = nextString()
+)
+
 fun Random.nextIrcUser(
   networkId: NetworkId = NetworkId(nextInt())
 ) = IrcUser(