diff --git a/app/src/test/java/de/kuschku/quasseldroid/ExampleUnitTest.kt b/app/src/test/java/de/kuschku/quasseldroid/ExampleUnitTest.kt
index 6a9c5578cea3d55572cc32743ceff96868b921a6..990e5521979bb227f8f611b31699d6a4768ca349 100644
--- a/app/src/test/java/de/kuschku/quasseldroid/ExampleUnitTest.kt
+++ b/app/src/test/java/de/kuschku/quasseldroid/ExampleUnitTest.kt
@@ -69,7 +69,6 @@ class ExampleUnitTest {
           channel.write(sizeBuffer)
           sizeBuffer.clear()
         }
-        println(sendBuffer.toBuffer().contentToString())
         channel.write(sendBuffer)
         channel.flush()
         sendBuffer.clear()
diff --git a/bitflags/src/main/kotlin/de/kuschku/bitflags/Flags.kt b/bitflags/src/main/kotlin/de/kuschku/bitflags/Flags.kt
index cc6a8daa3bd7f9e9e584d8e863668cfe3fda28b0..716d905a59171de3bcff2a8da260b4f2aa57fa96 100644
--- a/bitflags/src/main/kotlin/de/kuschku/bitflags/Flags.kt
+++ b/bitflags/src/main/kotlin/de/kuschku/bitflags/Flags.kt
@@ -20,6 +20,5 @@
 package de.kuschku.bitflags
 
 interface Flags<T, U> where U : Flag<T>, U : Enum<U> {
-  operator fun get(value: T): U?
   val all: Set<U>
 }
diff --git a/coverage-annotations/src/main/kotlin/de/kuschku/codecoverage/Generated.kt b/coverage-annotations/src/main/kotlin/de/kuschku/codecoverage/Generated.kt
index 7b3674fb8e11d169b3b571247e289f7161e67f40..a0492bb5b35ea6fab62855bbcc1287d163d634b6 100644
--- a/coverage-annotations/src/main/kotlin/de/kuschku/codecoverage/Generated.kt
+++ b/coverage-annotations/src/main/kotlin/de/kuschku/codecoverage/Generated.kt
@@ -22,5 +22,5 @@ package de.kuschku.codecoverage
 /**
  * Used to mark inline functions as generated for jacoco
  */
-@Retention(AnnotationRetention.SOURCE)
+@Retention(AnnotationRetention.RUNTIME)
 annotation class Generated
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/features/LegacyFeature.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/features/LegacyFeature.kt
index f069ccc4717e994949c122d042627d4b3d09d897..fece096395bde848a5ec4259323c067dde19a49e 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/features/LegacyFeature.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/features/LegacyFeature.kt
@@ -78,7 +78,6 @@ enum class LegacyFeature(
     fun get(feature: QuasselFeature) = features[feature]
 
     private val values = values().associateBy(LegacyFeature::value)
-    override fun get(value: UInt) = values[value]
     override val all: LegacyFeatures = values.values.toEnumSet()
   }
 }
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/features/QuasselFeature.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/features/QuasselFeature.kt
index 3466e053d834b1cffb41d48c7a26fdab2b456809..09ee52b712e7d459b5d23b0eb159563f30bc54dc 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/features/QuasselFeature.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/features/QuasselFeature.kt
@@ -19,6 +19,9 @@
 
 package de.kuschku.libquassel.protocol.features
 
+import de.kuschku.codecoverage.Generated
+
+@Generated
 inline class QuasselFeatureName(
   val name: String,
 )
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/io/ByteBufferUtil.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/io/ByteBufferUtil.kt
index d4f7e07970991bb161295e2daa4baef35846c08a..15bf1c7820e43c514de0f2eac90fb9eeecdeaea4 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/io/ByteBufferUtil.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/io/ByteBufferUtil.kt
@@ -21,12 +21,10 @@ package de.kuschku.libquassel.protocol.io
 
 import java.nio.ByteBuffer
 
-fun copyData(from: ByteBuffer, to: ByteBuffer, desiredAmount: Int = -1) {
+fun copyData(from: ByteBuffer, to: ByteBuffer, desiredAmount: Int) {
   val limit = from.limit()
   val availableAmount = minOf(from.remaining(), to.remaining())
-  val amount =
-    if (desiredAmount < 0) availableAmount
-    else minOf(availableAmount, desiredAmount)
+  val amount = minOf(availableAmount, desiredAmount)
   from.limit(from.position() + amount)
   to.put(from)
   from.limit(limit)
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/io/ChainedByteBuffer.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/io/ChainedByteBuffer.kt
index ba8aeade66b8daa8bf8de45a1e5594c717a13420..20c977eada078fe4f4311ab3b34c0abef8946afc 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/io/ChainedByteBuffer.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/io/ChainedByteBuffer.kt
@@ -90,8 +90,11 @@ class ChainedByteBuffer(
       val requested = minOf(value.remaining(), chunkSize)
       if (bufferList.lastOrNull()?.hasRemaining() != true) {
         ensureSpace(requested)
+      } else {
+        ensureSpace(minOf(bufferList.last().remaining(), requested))
       }
-      copyData(value, bufferList.last())
+
+      copyData(value, bufferList.last(), requested)
     }
   }
 
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/io/StringEncoder.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/io/StringEncoder.kt
index 08ebb2a33885cc681f83917b77d8643759dc0d08..782c8946d308b0321a783ce828f2fb100c054d18 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/io/StringEncoder.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/io/StringEncoder.kt
@@ -52,13 +52,21 @@ class StringEncoder(charset: Charset) {
     return encodeInternal(charBuffer)
   }
 
-  fun encodeChar(data: Char?): ByteBuffer {
-    if (!encoder.canEncode(data ?: '\u0000')) {
-      return ByteBuffer.allocateDirect(2)
+  private fun replacementChar(data: Char?): Char {
+    return if (data == null || !encoder.canEncode(data)) {
+      if (encoder.canEncode('\uFFFD')) {
+        '\uFFFD'
+      } else {
+        '\u0000'
+      }
+    } else {
+      data
     }
+  }
 
-    val charBuffer = charBuffer(2)
-    charBuffer.put(data ?: '\u0000')
+  fun encodeChar(data: Char?): ByteBuffer {
+    val charBuffer = charBuffer(1)
+    charBuffer.put(replacementChar(data))
     charBuffer.flip()
     return encodeInternal(charBuffer)
   }
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/BoolSerializer.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/BoolSerializer.kt
index 0e0b73a6a2733210c97398126268faed1c44d858..1e51bd5373906099e6e967165d80110f4959398e 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/BoolSerializer.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/BoolSerializer.kt
@@ -26,7 +26,7 @@ import java.nio.ByteBuffer
 
 object BoolSerializer : QtSerializer<Boolean> {
   override val qtType: QtType = QtType.Bool
-  override val javaType: Class<Boolean> = Boolean::class.java
+  override val javaType: Class<Boolean> = Boolean::class.javaObjectType
 
   override fun serialize(buffer: ChainedByteBuffer, data: Boolean, featureSet: FeatureSet) {
     buffer.put(
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/ByteSerializer.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/ByteSerializer.kt
index e996faf6e43370032f993b83a47e117c85a87915..2d3d7083c8af6d899dbf4244740f3c7efa09e7b4 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/ByteSerializer.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/ByteSerializer.kt
@@ -26,7 +26,7 @@ import java.nio.ByteBuffer
 
 object ByteSerializer : QtSerializer<Byte> {
   override val qtType: QtType = QtType.Char
-  override val javaType: Class<Byte> = Byte::class.java
+  override val javaType: Class<Byte> = Byte::class.javaObjectType
 
   override fun serialize(buffer: ChainedByteBuffer, data: Byte, featureSet: FeatureSet) {
     buffer.put(data)
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/DoubleSerializer.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/DoubleSerializer.kt
index 6217ea633f9de7f58ba1349a7d4766a41ec452a5..1e81a519d2b2ca664188715bf6be580d243a6edd 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/DoubleSerializer.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/DoubleSerializer.kt
@@ -26,7 +26,7 @@ import java.nio.ByteBuffer
 
 object DoubleSerializer : QtSerializer<Double> {
   override val qtType: QtType = QtType.Double
-  override val javaType: Class<Double> = Double::class.java
+  override val javaType: Class<Double> = Double::class.javaObjectType
 
   override fun serialize(buffer: ChainedByteBuffer, data: Double, featureSet: FeatureSet) {
     buffer.putDouble(data)
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/FloatSerializer.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/FloatSerializer.kt
index 9cfaf16be64ad844982da5b41827769b8c063939..636262b56edd0c918ecc44688e735e7236985af0 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/FloatSerializer.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/FloatSerializer.kt
@@ -26,7 +26,7 @@ import java.nio.ByteBuffer
 
 object FloatSerializer : QtSerializer<Float> {
   override val qtType: QtType = QtType.Float
-  override val javaType: Class<Float> = Float::class.java
+  override val javaType: Class<Float> = Float::class.javaObjectType
 
   override fun serialize(buffer: ChainedByteBuffer, data: Float, featureSet: FeatureSet) {
     buffer.putFloat(data)
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/IntSerializer.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/IntSerializer.kt
index 98a38bea7cf7b03af192980564a909e43c914cea..54db403556c156642baae1ada9141a6d2ca1b2fa 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/IntSerializer.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/IntSerializer.kt
@@ -26,7 +26,7 @@ import java.nio.ByteBuffer
 
 object IntSerializer : QtSerializer<Int> {
   override val qtType: QtType = QtType.Int
-  override val javaType: Class<Int> = Int::class.java
+  override val javaType: Class<Int> = Int::class.javaObjectType
 
   override fun serialize(buffer: ChainedByteBuffer, data: Int, featureSet: FeatureSet) {
     buffer.putInt(data)
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/LongSerializer.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/LongSerializer.kt
index 82bfdcff41d6b1d1efcaf08c27fd59bb880aeb3b..d592f55efc82e4e2f3fb30a0a9bd033c85678ff3 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/LongSerializer.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/LongSerializer.kt
@@ -26,7 +26,7 @@ import java.nio.ByteBuffer
 
 object LongSerializer : QtSerializer<Long> {
   override val qtType: QtType = QtType.Long
-  override val javaType: Class<Long> = Long::class.java
+  override val javaType: Class<Long> = Long::class.javaObjectType
 
   override fun serialize(buffer: ChainedByteBuffer, data: Long, featureSet: FeatureSet) {
     buffer.putLong(data)
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/QCharSerializer.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/QCharSerializer.kt
index bf78fc8c5049db200d0c60658726834ba7b46746..77045149b60b1f377b1d4d5af3820c4957e599b7 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/QCharSerializer.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/QCharSerializer.kt
@@ -28,7 +28,7 @@ import kotlin.concurrent.getOrSet
 
 object QCharSerializer : QtSerializer<Char> {
   override val qtType: QtType = QtType.QChar
-  override val javaType: Class<out Char> = Char::class.java
+  override val javaType: Class<out Char> = Char::class.javaObjectType
 
   private val encoderLocal = ThreadLocal<StringEncoder>()
   private fun encoder() = encoderLocal.getOrSet { StringEncoder(Charsets.UTF_16BE) }
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/ShortSerializer.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/ShortSerializer.kt
index 409beba5f5d83466cedae5ce845f678e286a5ef7..d3ea4dd89834dd29c3acd78642037ced60a65505 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/ShortSerializer.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/serializers/primitive/ShortSerializer.kt
@@ -26,7 +26,7 @@ import java.nio.ByteBuffer
 
 object ShortSerializer : QtSerializer<Short> {
   override val qtType: QtType = QtType.Short
-  override val javaType: Class<Short> = Short::class.java
+  override val javaType: Class<Short> = Short::class.javaObjectType
 
   override fun serialize(buffer: ChainedByteBuffer, data: Short, featureSet: FeatureSet) {
     buffer.putShort(data)
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/types/BufferActivity.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/types/BufferActivity.kt
index 557155d5629c9584caba3545d620a117c99b86de..5aa12c8ae94baa72219e4ce7ca505f897aa852a6 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/types/BufferActivity.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/types/BufferActivity.kt
@@ -33,7 +33,6 @@ enum class BufferActivity(
 
   companion object : Flags<UInt, BufferActivity> {
     private val values = values().associateBy(BufferActivity::value)
-    override fun get(value: UInt) = values[value]
     override val all: BufferActivities = values.values.toEnumSet()
   }
 }
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/types/BufferType.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/types/BufferType.kt
index 356d0bbf196e189e273adef04a9cd8ecabd62a36..cc71f3465a744d2c800f236e5ab54f690aa61e32 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/types/BufferType.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/types/BufferType.kt
@@ -34,7 +34,6 @@ enum class BufferType(
 
   companion object : Flags<UShort, BufferType> {
     private val values = values().associateBy(BufferType::value)
-    override fun get(value: UShort) = values[value]
     override val all: BufferTypes = values.values.toEnumSet()
   }
 }
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/types/MessageFlag.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/types/MessageFlag.kt
index 8d45bfed5b7166d1f0f96233bf45cbd6024504f0..86008c5a4522ac4825eff36c493b0d6d1c95575f 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/types/MessageFlag.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/types/MessageFlag.kt
@@ -34,7 +34,6 @@ enum class MessageFlag(
 
   companion object : Flags<UInt, MessageFlag> {
     private val values = values().associateBy(MessageFlag::value)
-    override fun get(value: UInt) = values[value]
     override val all: MessageFlags = values.values.toEnumSet()
   }
 }
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/types/MessageType.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/types/MessageType.kt
index e0882d5957e13039dcbdc2c8490692b229605827..4badbe176d3a33288ce995a9752de7d79a4c44a0 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/types/MessageType.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/types/MessageType.kt
@@ -48,7 +48,6 @@ enum class MessageType(
 
   companion object : Flags<UInt, MessageType> {
     private val values = values().associateBy(MessageType::value)
-    override fun get(value: UInt) = values[value]
     override val all: MessageTypes = values.values.toEnumSet()
   }
 }
diff --git a/protocol/src/main/java/de/kuschku/libquassel/protocol/variant/QVariant.kt b/protocol/src/main/java/de/kuschku/libquassel/protocol/variant/QVariant.kt
index a006ff4c7d8fe133157e9cb771ec2784c6bb64ae..ae6ac6ab171abaf409842133bab6c58dff8ee448 100644
--- a/protocol/src/main/java/de/kuschku/libquassel/protocol/variant/QVariant.kt
+++ b/protocol/src/main/java/de/kuschku/libquassel/protocol/variant/QVariant.kt
@@ -27,22 +27,29 @@ import de.kuschku.libquassel.protocol.serializers.QuasselSerializers
 import de.kuschku.libquassel.protocol.serializers.primitive.QtSerializer
 import de.kuschku.libquassel.protocol.serializers.primitive.QuasselSerializer
 import java.nio.ByteBuffer
-import java.util.*
 
 typealias QVariant_ = QVariant<*>
 typealias QVariantList = List<QVariant_>
 typealias QVariantMap = Map<String, QVariant_>
 typealias QStringList = List<String?>
 
-sealed class QVariant<T> constructor(
-  private val data: T,
-  open val serializer: QtSerializer<T>,
-) {
-  class Typed<T> internal constructor(data: T, serializer: QtSerializer<T>) :
-    QVariant<T>(data, serializer)
+sealed class QVariant<T> {
+  abstract val data: T
+  abstract val serializer: QtSerializer<T>
 
-  class Custom<T> internal constructor(data: T, override val serializer: QuasselSerializer<T>) :
-    QVariant<T>(data, serializer)
+  data class Typed<T> internal constructor(
+    override val data: T,
+    override val serializer: QtSerializer<T>
+  ) : QVariant<T>() {
+    override fun toString() = super.toString()
+  }
+
+  data class Custom<T> internal constructor(
+    override val data: T,
+    override val serializer: QuasselSerializer<T>
+  ) : QVariant<T>() {
+    override fun toString() = super.toString()
+  }
 
   fun value(): T = data
 
@@ -51,11 +58,13 @@ sealed class QVariant<T> constructor(
     serializer.serialize(buffer, data, featureSet)
   }
 
-  override fun toString() = when (data) {
-    is ByteBuffer ->
-      "QVariant(${serializer::class.java.simpleName}, ${data.contentToString()})"
-    else ->
-      "QVariant(${serializer::class.java.simpleName}, $data)"
+  override fun toString() = data.let {
+    when (it) {
+      is ByteBuffer ->
+        "QVariant(${serializer::class.java.simpleName}, ${it.contentToString()})"
+      else ->
+        "QVariant(${serializer::class.java.simpleName}, $it)"
+    }
   }
 
   @Suppress("UNCHECKED_CAST")
@@ -63,25 +72,6 @@ sealed class QVariant<T> constructor(
     if (serializer.javaType == T::class.java && this.value() is T) this as QVariant<T>
     else null
 
-  override fun equals(other: Any?): Boolean {
-    if (this === other) return true
-    if (javaClass != other?.javaClass) return false
-
-    other as QVariant<*>
-
-    if (data != other.data) return false
-    if (serializer != other.serializer) return false
-
-    return true
-  }
-
-  override fun hashCode(): Int {
-    var result = data?.hashCode() ?: 0
-    result = 31 * result + serializer.hashCode()
-    return result
-  }
-
-
   companion object {
     fun <T> of(data: T, serializer: QtSerializer<T>) = Typed(data, serializer)
     fun <T> of(data: T, serializer: QuasselSerializer<T>) = Custom(data, serializer)
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/io/StringEncoderTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/io/StringEncoderTest.kt
index 2b356d8bd8677bc3ebeaea1e651fa10ce8bba9f4..cb1db12abdb08920535ad112e3aeca8c0bd6892f 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/io/StringEncoderTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/io/StringEncoderTest.kt
@@ -47,6 +47,18 @@ class StringEncoderTest {
     )
   }
 
+  @Test
+  fun testUnencodableString() {
+    assertEquals(
+      0,
+      ascii.encode("\uFFFF").remaining()
+    )
+    assertThat(
+      ascii.encode("\uFFFF"),
+      ByteBufferMatcher(byteBufferOf())
+    )
+  }
+
   @Test
   fun testNullChar() {
     assertEquals(
@@ -58,13 +70,9 @@ class StringEncoderTest {
       ByteBufferMatcher(byteBufferOf(0))
     )
 
-    assertEquals(
-      1,
-      utf8.encodeChar(null).remaining()
-    )
     assertThat(
       utf8.encodeChar(null),
-      ByteBufferMatcher(byteBufferOf(0))
+      ByteBufferMatcher(byteBufferOf(0xEFu, 0xBFu, 0xBDu))
     )
 
     assertEquals(
@@ -73,19 +81,19 @@ class StringEncoderTest {
     )
     assertThat(
       utf16.encodeChar(null),
-      ByteBufferMatcher(byteBufferOf(0, 0)),
+      ByteBufferMatcher(byteBufferOf(0xFFu, 0xFDu)),
     )
   }
 
   @Test
   fun testUnencodableChar() {
     assertEquals(
-      2,
+      1,
       ascii.encodeChar('\uFFFF').remaining()
     )
     assertThat(
       ascii.encodeChar('\uFFFF'),
-      ByteBufferMatcher(byteBufferOf(0, 0))
+      ByteBufferMatcher(byteBufferOf(0))
     )
   }
 }
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/handshake/ClientInitSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/handshake/ClientInitSerializerTest.kt
index fca778612b04823adefb953971b46d76d7992b22..a48194552e6f933678835e7c5ed1b5818b6ffcb8 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/handshake/ClientInitSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/handshake/ClientInitSerializerTest.kt
@@ -22,11 +22,25 @@ import de.kuschku.bitflags.none
 import de.kuschku.libquassel.protocol.features.FeatureSet
 import de.kuschku.libquassel.protocol.features.LegacyFeature
 import de.kuschku.libquassel.protocol.messages.handshake.ClientInit
+import de.kuschku.libquassel.protocol.serializers.HandshakeSerializers
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
+import de.kuschku.libquassel.protocol.serializers.primitive.BoolSerializer
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.handshakeSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
 import org.junit.jupiter.api.Test
+import org.junit.jupiter.api.Assertions.assertEquals as assertEquals
 
 class ClientInitSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      ClientInitSerializer,
+      HandshakeSerializers.find<ClientInit>("ClientInit"),
+    )
+  }
+
   @Test
   fun testSimple() = handshakeSerializerTest(
     ClientInitSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/BoolSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/BoolSerializerTest.kt
index c6dfa9a3cabeefbbb630b45542ab0034ff995a0f..4e38c0ba9fa5587172ac3645e71138308751b0ca 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/BoolSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/BoolSerializerTest.kt
@@ -18,11 +18,23 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
 class BoolSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      BoolSerializer,
+      QtSerializers.find<Boolean>(QtType.Bool),
+    )
+  }
+
   @Test
   fun testTrue() = qtSerializerTest(
     BoolSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/BufferIdSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/BufferIdSerializerTest.kt
new file mode 100644
index 0000000000000000000000000000000000000000..21f9d2cbd431cc64a2432e1215dc7b4450fa73de
--- /dev/null
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/BufferIdSerializerTest.kt
@@ -0,0 +1,66 @@
+/*
+ * Quasseldroid - Quassel client for Android
+ *
+ * Copyright (c) 2020 Janne Mareike Koschinski
+ * Copyright (c) 2020 The Quassel Project
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3 as published
+ * by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package de.kuschku.libquassel.protocol.serializers.primitive
+
+import de.kuschku.libquassel.protocol.serializers.QuasselSerializers
+import de.kuschku.libquassel.protocol.testutil.byteBufferOf
+import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.testutil.quasselSerializerTest
+import de.kuschku.libquassel.protocol.types.BufferId
+import de.kuschku.libquassel.protocol.variant.QuasselType
+import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.api.Test
+
+class BufferIdSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      BufferIdSerializer,
+      QuasselSerializers.find<BufferId>(QuasselType.BufferId),
+    )
+  }
+
+  @Test
+  fun testZero() = quasselSerializerTest(
+    BufferIdSerializer,
+    BufferId(0),
+    byteBufferOf(0, 0, 0, 0)
+  )
+
+  @Test
+  fun testMinimal() = quasselSerializerTest(
+    BufferIdSerializer,
+    BufferId.MIN_VALUE,
+    byteBufferOf(-128, 0, 0, 0)
+  )
+
+  @Test
+  fun testMaximal() = quasselSerializerTest(
+    BufferIdSerializer,
+    BufferId.MAX_VALUE,
+    byteBufferOf(127, -1, -1, -1)
+  )
+
+  @Test
+  fun testAllOnes() = quasselSerializerTest(
+    BufferIdSerializer,
+    BufferId(0.inv()),
+    byteBufferOf(-1, -1, -1, -1)
+  )
+}
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/BufferInfoSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/BufferInfoSerializerTest.kt
index f32ae8ae16b6cc5ca103be719b988c66234bed59..934aef98c95703981b070db872d7fe1ec511190a 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/BufferInfoSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/BufferInfoSerializerTest.kt
@@ -20,15 +20,29 @@ package de.kuschku.libquassel.protocol.serializers.primitive
 
 import de.kuschku.bitflags.none
 import de.kuschku.bitflags.validValues
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
+import de.kuschku.libquassel.protocol.serializers.QuasselSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.quasselSerializerTest
 import de.kuschku.libquassel.protocol.types.BufferId
 import de.kuschku.libquassel.protocol.types.BufferInfo
 import de.kuschku.libquassel.protocol.types.BufferType
 import de.kuschku.libquassel.protocol.types.NetworkId
+import de.kuschku.libquassel.protocol.variant.QtType
+import de.kuschku.libquassel.protocol.variant.QuasselType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
 class BufferInfoSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      BufferInfoSerializer,
+      QuasselSerializers.find<BufferInfo>(QuasselType.BufferInfo),
+    )
+  }
+
   @Test
   fun testBaseCase() = quasselSerializerTest(
     BufferInfoSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ByteBufferSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ByteBufferSerializerTest.kt
index dfaa87f44cc60349392a51038b4b6ac361ce66d5..b0671da59481f056ce6582803fe8494fa956eb6a 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ByteBufferSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ByteBufferSerializerTest.kt
@@ -18,13 +18,25 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.matchers.ByteBufferMatcher
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 import java.nio.ByteBuffer
 
 class ByteBufferSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      ByteBufferSerializer,
+      QtSerializers.find<ByteBuffer>(QtType.QByteArray),
+    )
+  }
+
   @Test
   fun testBaseCase() = qtSerializerTest(
     ByteBufferSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ByteSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ByteSerializerTest.kt
index acb9c99600fb482d198067428508aa68ac8dcec3..0a8557f30326992394677a9ceac4ec667a30b093 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ByteSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ByteSerializerTest.kt
@@ -18,12 +18,25 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
+import java.nio.ByteBuffer
 import kotlin.experimental.inv
 
 class ByteSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      ByteSerializer,
+      QtSerializers.find<Byte>(QtType.Char),
+    )
+  }
+
   @Test
   fun testZero() = qtSerializerTest(
     ByteSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/DateTimeSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/DateTimeSerializerTest.kt
index f2291dbf5013fed9ec70c0e3ef3aec91004a67d1..a93efda966d052672f1e4ed2e5521dddaa89e68b 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/DateTimeSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/DateTimeSerializerTest.kt
@@ -18,16 +18,27 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.matchers.TemporalMatcher
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 import org.junit.jupiter.api.assertThrows
 import org.threeten.bp.*
 import org.threeten.bp.chrono.JapaneseDate
+import org.threeten.bp.temporal.Temporal
 
 class DateTimeSerializerTest {
-  private val serializer = DateTimeSerializer
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      DateTimeSerializer,
+      QtSerializers.find<Temporal>(QtType.QDateTime),
+    )
+  }
 
   @Test
   fun testEpoch() = qtSerializerTest(
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/DoubleSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/DoubleSerializerTest.kt
index 5b6c41938cca43669cda034af09884b69ad1a25f..0242bcb3578b6f82da370014b0a81a374a88df3a 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/DoubleSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/DoubleSerializerTest.kt
@@ -18,11 +18,24 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
+import org.threeten.bp.temporal.Temporal
 
 class DoubleSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      DoubleSerializer,
+      QtSerializers.find<Double>(QtType.Double),
+    )
+  }
+
   @Test
   fun testZero() = qtSerializerTest(
     DoubleSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/FloatSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/FloatSerializerTest.kt
index ea12027a0640f92713fc34db20e026063c384fdf..b491e312cb0910f66eb32339a7a46951643b5371 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/FloatSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/FloatSerializerTest.kt
@@ -18,11 +18,23 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
 class FloatSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      FloatSerializer,
+      QtSerializers.find<Float>(QtType.Float),
+    )
+  }
+
   @Test
   fun testZero() = qtSerializerTest(
     FloatSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/IdentityIdSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/IdentityIdSerializerTest.kt
new file mode 100644
index 0000000000000000000000000000000000000000..34e0fc5b5d3b33f1a40e8e1fd3ee0e519cb07c8b
--- /dev/null
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/IdentityIdSerializerTest.kt
@@ -0,0 +1,66 @@
+/*
+ * Quasseldroid - Quassel client for Android
+ *
+ * Copyright (c) 2020 Janne Mareike Koschinski
+ * Copyright (c) 2020 The Quassel Project
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3 as published
+ * by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package de.kuschku.libquassel.protocol.serializers.primitive
+
+import de.kuschku.libquassel.protocol.serializers.QuasselSerializers
+import de.kuschku.libquassel.protocol.testutil.byteBufferOf
+import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.testutil.quasselSerializerTest
+import de.kuschku.libquassel.protocol.types.IdentityId
+import de.kuschku.libquassel.protocol.variant.QuasselType
+import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.api.Test
+
+class IdentityIdSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      IdentityIdSerializer,
+      QuasselSerializers.find<IdentityId>(QuasselType.IdentityId),
+    )
+  }
+
+  @Test
+  fun testZero() = quasselSerializerTest(
+    IdentityIdSerializer,
+    IdentityId(0),
+    byteBufferOf(0, 0, 0, 0)
+  )
+
+  @Test
+  fun testMinimal() = quasselSerializerTest(
+    IdentityIdSerializer,
+    IdentityId.MIN_VALUE,
+    byteBufferOf(-128, 0, 0, 0)
+  )
+
+  @Test
+  fun testMaximal() = quasselSerializerTest(
+    IdentityIdSerializer,
+    IdentityId.MAX_VALUE,
+    byteBufferOf(127, -1, -1, -1)
+  )
+
+  @Test
+  fun testAllOnes() = quasselSerializerTest(
+    IdentityIdSerializer,
+    IdentityId(0.inv()),
+    byteBufferOf(-1, -1, -1, -1)
+  )
+}
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/IntSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/IntSerializerTest.kt
index 019f3245ec3ea247997abd6aa5c5e36843e60411..21bd1bb8d4afe820227abb399c6c17b94aeb211d 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/IntSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/IntSerializerTest.kt
@@ -18,11 +18,23 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
 class IntSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      IntSerializer,
+      QtSerializers.find<Int>(QtType.Int),
+    )
+  }
+
   @Test
   fun testZero() = qtSerializerTest(
     IntSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/LongSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/LongSerializerTest.kt
index f6cc0729cd4dcda3587342c99725fcd718e4077d..0c9fec88cd80008ddd8a2a4d13c7f137615e1e85 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/LongSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/LongSerializerTest.kt
@@ -18,11 +18,23 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
 class LongSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      LongSerializer,
+      QtSerializers.find<Long>(QtType.Long),
+    )
+  }
+
   @Test
   fun testZero() = qtSerializerTest(
     LongSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/MessageSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/MessageSerializerTest.kt
index 0c532867041c590405db3aa5e6f28acc6f3e7d1c..e07503e168fe06ba5910cf7c1843b454137e22d0 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/MessageSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/MessageSerializerTest.kt
@@ -22,13 +22,28 @@ package de.kuschku.libquassel.protocol.serializers.primitive
 import de.kuschku.bitflags.none
 import de.kuschku.bitflags.validValues
 import de.kuschku.libquassel.protocol.features.FeatureSet
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
+import de.kuschku.libquassel.protocol.serializers.QuasselSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.quasselSerializerTest
 import de.kuschku.libquassel.protocol.types.*
+import de.kuschku.libquassel.protocol.variant.QtType
+import de.kuschku.libquassel.protocol.variant.QuasselType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 import org.threeten.bp.Instant
+import java.nio.ByteBuffer
 
 class MessageSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      MessageSerializer,
+      QuasselSerializers.find<Message>(QuasselType.Message),
+    )
+  }
+
   @Test
   fun testEmpty() = quasselSerializerTest(
     MessageSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/MsgIdSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/MsgIdSerializerTest.kt
new file mode 100644
index 0000000000000000000000000000000000000000..ce2107d82a1b1ee99abab783903bb076170a4dd2
--- /dev/null
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/MsgIdSerializerTest.kt
@@ -0,0 +1,70 @@
+/*
+ * Quasseldroid - Quassel client for Android
+ *
+ * Copyright (c) 2020 Janne Mareike Koschinski
+ * Copyright (c) 2020 The Quassel Project
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3 as published
+ * by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package de.kuschku.libquassel.protocol.serializers.primitive
+
+import de.kuschku.libquassel.protocol.features.FeatureSet
+import de.kuschku.libquassel.protocol.serializers.QuasselSerializers
+import de.kuschku.libquassel.protocol.testutil.byteBufferOf
+import de.kuschku.libquassel.protocol.testutil.quasselSerializerTest
+import de.kuschku.libquassel.protocol.types.MsgId
+import de.kuschku.libquassel.protocol.variant.QuasselType
+import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.api.Test
+
+class MsgIdSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      MsgIdSerializer,
+      QuasselSerializers.find<MsgId>(QuasselType.MsgId),
+    )
+  }
+
+  @Test
+  fun testZero() = quasselSerializerTest(
+    MsgIdSerializer,
+    MsgId(0),
+    byteBufferOf(0, 0, 0, 0, 0, 0, 0, 0),
+    featureSets = listOf(FeatureSet.all())
+  )
+
+  @Test
+  fun testMinimal() = quasselSerializerTest(
+    MsgIdSerializer,
+    MsgId.MIN_VALUE,
+    byteBufferOf(-128, 0, 0, 0, 0, 0, 0, 0),
+    featureSets = listOf(FeatureSet.all())
+  )
+
+  @Test
+  fun testMaximal() = quasselSerializerTest(
+    MsgIdSerializer,
+    MsgId.MAX_VALUE,
+    byteBufferOf(127, -1, -1, -1, -1, -1, -1, -1),
+    featureSets = listOf(FeatureSet.all())
+  )
+
+  @Test
+  fun testAllOnes() = quasselSerializerTest(
+    MsgIdSerializer,
+    MsgId(0.inv()),
+    byteBufferOf(-1, -1, -1, -1, -1, -1, -1, -1),
+    featureSets = listOf(FeatureSet.all())
+  )
+}
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/NetworkIdSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/NetworkIdSerializerTest.kt
new file mode 100644
index 0000000000000000000000000000000000000000..996bc8975fcffcced785c307517e9739f553cbe6
--- /dev/null
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/NetworkIdSerializerTest.kt
@@ -0,0 +1,66 @@
+/*
+ * Quasseldroid - Quassel client for Android
+ *
+ * Copyright (c) 2020 Janne Mareike Koschinski
+ * Copyright (c) 2020 The Quassel Project
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3 as published
+ * by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package de.kuschku.libquassel.protocol.serializers.primitive
+
+import de.kuschku.libquassel.protocol.serializers.QuasselSerializers
+import de.kuschku.libquassel.protocol.testutil.byteBufferOf
+import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.testutil.quasselSerializerTest
+import de.kuschku.libquassel.protocol.types.NetworkId
+import de.kuschku.libquassel.protocol.variant.QuasselType
+import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.api.Test
+
+class NetworkIdSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      NetworkIdSerializer,
+      QuasselSerializers.find<NetworkId>(QuasselType.NetworkId),
+    )
+  }
+
+  @Test
+  fun testZero() = quasselSerializerTest(
+    NetworkIdSerializer,
+    NetworkId(0),
+    byteBufferOf(0, 0, 0, 0)
+  )
+
+  @Test
+  fun testMinimal() = quasselSerializerTest(
+    NetworkIdSerializer,
+    NetworkId.MIN_VALUE,
+    byteBufferOf(-128, 0, 0, 0)
+  )
+
+  @Test
+  fun testMaximal() = quasselSerializerTest(
+    NetworkIdSerializer,
+    NetworkId.MAX_VALUE,
+    byteBufferOf(127, -1, -1, -1)
+  )
+
+  @Test
+  fun testAllOnes() = quasselSerializerTest(
+    NetworkIdSerializer,
+    NetworkId(0.inv()),
+    byteBufferOf(-1, -1, -1, -1)
+  )
+}
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/PeerPtrSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/PeerPtrSerializerTest.kt
new file mode 100644
index 0000000000000000000000000000000000000000..0018e5a642e01dd52a893f433a9a7380540555b1
--- /dev/null
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/PeerPtrSerializerTest.kt
@@ -0,0 +1,70 @@
+/*
+ * Quasseldroid - Quassel client for Android
+ *
+ * Copyright (c) 2020 Janne Mareike Koschinski
+ * Copyright (c) 2020 The Quassel Project
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3 as published
+ * by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package de.kuschku.libquassel.protocol.serializers.primitive
+
+import de.kuschku.libquassel.protocol.features.FeatureSet
+import de.kuschku.libquassel.protocol.serializers.QuasselSerializers
+import de.kuschku.libquassel.protocol.testutil.byteBufferOf
+import de.kuschku.libquassel.protocol.testutil.quasselSerializerTest
+import de.kuschku.libquassel.protocol.types.MsgId
+import de.kuschku.libquassel.protocol.variant.QuasselType
+import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.api.Test
+
+class PeerPtrSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      PeerPtrSerializer,
+      QuasselSerializers.find<ULong>(QuasselType.PeerPtr),
+    )
+  }
+
+  @Test
+  fun testZero() = quasselSerializerTest(
+    PeerPtrSerializer,
+    0uL,
+    byteBufferOf(0, 0, 0, 0, 0, 0, 0, 0),
+    featureSets = listOf(FeatureSet.all())
+  )
+
+  @Test
+  fun testMinimal() = quasselSerializerTest(
+    PeerPtrSerializer,
+    ULong.MIN_VALUE,
+    byteBufferOf(0, 0, 0, 0, 0, 0, 0, 0),
+    featureSets = listOf(FeatureSet.all())
+  )
+
+  @Test
+  fun testMaximal() = quasselSerializerTest(
+    PeerPtrSerializer,
+    ULong.MAX_VALUE,
+    byteBufferOf(-1, -1, -1, -1, -1, -1, -1, -1),
+    featureSets = listOf(FeatureSet.all())
+  )
+
+  @Test
+  fun testAllOnes() = quasselSerializerTest(
+    PeerPtrSerializer,
+    0uL.inv(),
+    byteBufferOf(-1, -1, -1, -1, -1, -1, -1, -1),
+    featureSets = listOf(FeatureSet.all())
+  )
+}
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QCharSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QCharSerializerTest.kt
index 411635ccf83061acd6447f7125add8fb0eabe05f..b152f1f408084bd928b4175496dcb7afcf5a770c 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QCharSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QCharSerializerTest.kt
@@ -18,12 +18,24 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.matchers.BomMatcherChar
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
 class QCharSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      QCharSerializer,
+      QtSerializers.find<Char>(QtType.QChar),
+    )
+  }
+
   @Test
   fun testNull() = qtSerializerTest(
     QCharSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QVariantListSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QVariantListSerializerTest.kt
new file mode 100644
index 0000000000000000000000000000000000000000..4bbff85229e2034ab7a42803f44081387af3ac3f
--- /dev/null
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QVariantListSerializerTest.kt
@@ -0,0 +1,59 @@
+/*
+ * Quasseldroid - Quassel client for Android
+ *
+ * Copyright (c) 2020 Janne Mareike Koschinski
+ * Copyright (c) 2020 The Quassel Project
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3 as published
+ * by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package de.kuschku.libquassel.protocol.serializers.primitive
+
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
+import de.kuschku.libquassel.protocol.testutil.byteBufferOf
+import de.kuschku.libquassel.protocol.testutil.matchers.MapMatcher
+import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QVariantList
+import de.kuschku.libquassel.protocol.variant.QVariantMap
+import de.kuschku.libquassel.protocol.variant.QtType
+import de.kuschku.libquassel.protocol.variant.qVariant
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.api.Test
+
+class QVariantListSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      QVariantListSerializer,
+      QtSerializers.find<QVariantList>(QtType.QVariantList),
+    )
+  }
+
+  @Test
+  fun testEmpty() = qtSerializerTest(
+    QVariantListSerializer,
+    listOf(),
+    byteBufferOf(0, 0, 0, 0)
+  )
+
+  @Test
+  fun testNormal() = qtSerializerTest(
+    QVariantListSerializer,
+    listOf(
+      qVariant("AzureDiamond", QtType.QString),
+      qVariant("hunter2", QtType.QString)
+    ),
+    byteBufferOf( 0x00u, 0x00u, 0x00u, 0x02u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x18u, 0x00u, 0x41u, 0x00u, 0x7Au, 0x00u, 0x75u, 0x00u, 0x72u, 0x00u, 0x65u, 0x00u, 0x44u, 0x00u, 0x69u, 0x00u, 0x61u, 0x00u, 0x6Du, 0x00u, 0x6Fu, 0x00u, 0x6Eu, 0x00u, 0x64u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Eu, 0x00u, 0x68u, 0x00u, 0x75u, 0x00u, 0x6Eu, 0x00u, 0x74u, 0x00u, 0x65u, 0x00u, 0x72u, 0x00u, 0x32u)
+  )
+}
+
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QVariantMapSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QVariantMapSerializerTest.kt
index bc38705c621977b3da39e44dfed42249db16fe96..04d60612ce7d65639caa3694052438db111dcfe9 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QVariantMapSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QVariantMapSerializerTest.kt
@@ -18,14 +18,26 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.matchers.MapMatcher
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QVariantMap
 import de.kuschku.libquassel.protocol.variant.QtType
 import de.kuschku.libquassel.protocol.variant.qVariant
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
 class QVariantMapSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      QVariantMapSerializer,
+      QtSerializers.find<QVariantMap>(QtType.QVariantMap),
+    )
+  }
+
   @Test
   fun testEmpty() = qtSerializerTest(
     QVariantMapSerializer,
@@ -50,8 +62,20 @@ class QVariantMapSerializerTest {
     mapOf(
       "" to qVariant<String?>(null, QtType.QString)
     ),
-    byteBufferOf(0x00u, 0x00u, 0x00u, 0x01u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x00u, 0x0Au, 0x00u, 0xFFu, 0xFFu, 0xFFu, 0xFFu),
-    ::MapMatcher
+    byteBufferOf(
+      // length
+      0x00u, 0x00u, 0x00u, 0x01u,
+      // length of key
+      0xFFu, 0xFFu, 0xFFu, 0xFFu,
+      // type of value
+      0x00u, 0x00u, 0x00u, 0x0Au,
+      // isNull of value
+      0x00u,
+      // length of value
+      0xFFu, 0xFFu, 0xFFu, 0xFFu
+    ),
+    ::MapMatcher,
+    serializeFeatureSet = null
   )
 }
 
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QVariantSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QVariantSerializerTest.kt
index 06e4907bbf994062414802bf8c321c25d6b04606..483a8782eb2d135c481957a9de349c899e8faa61 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QVariantSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/QVariantSerializerTest.kt
@@ -19,12 +19,24 @@
 package de.kuschku.libquassel.protocol.serializers.primitive
 
 import de.kuschku.libquassel.protocol.serializers.NoSerializerForTypeException
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.deserialize
+import de.kuschku.libquassel.protocol.variant.QVariant_
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 import org.junit.jupiter.api.assertThrows
 
 class QVariantSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      QVariantSerializer,
+      QtSerializers.find<QVariant_>(QtType.QVariant),
+    )
+  }
+
   @Test
   fun testUnregisteredQtType() {
     assertThrows<NoSerializerForTypeException> {
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ShortSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ShortSerializerTest.kt
index 644a03b47310fb208b03a2c74bc1d9a00089c0b0..cd08320030b58b49c6a73ac29d155c731bdfbf7c 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ShortSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ShortSerializerTest.kt
@@ -18,12 +18,24 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 import kotlin.experimental.inv
 
 class ShortSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      ShortSerializer,
+      QtSerializers.find<Short>(QtType.Short),
+    )
+  }
+
   @Test
   fun testZero() = qtSerializerTest(
     ShortSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/StringSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/StringSerializerTest.kt
index 01c8ace78b8858bc6b572ca42f58ae70cc865e83..98484c46409b1b216c5c3b050fbafe5cbf2104b8 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/StringSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/StringSerializerTest.kt
@@ -18,17 +18,27 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.deserialize
 import de.kuschku.libquassel.protocol.testutil.matchers.BomMatcherString
 import de.kuschku.libquassel.protocol.testutil.matchers.ByteBufferMatcher
 import de.kuschku.libquassel.protocol.testutil.testQtSerializerDirect
 import de.kuschku.libquassel.protocol.testutil.testQtSerializerVariant
+import de.kuschku.libquassel.protocol.variant.QtType
 import org.hamcrest.MatcherAssert.assertThat
 import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
 class StringSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      StringSerializerUtf16,
+      QtSerializers.find<String>(QtType.QString),
+    )
+  }
+
   @Test
   fun testBigListOfNaughtyStrings() {
     this::class.java.getResourceAsStream("/blns.txt")!!.bufferedReader(Charsets.UTF_8).forEachLine {
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/UByteSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/UByteSerializerTest.kt
index 79766902bf9964ce148f887c0074cf45828aa19a..df63eeca93f79f2f015ec7a39eae1d1ae6015005 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/UByteSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/UByteSerializerTest.kt
@@ -18,11 +18,23 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
 class UByteSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      UByteSerializer,
+      QtSerializers.find<UByte>(QtType.UChar),
+    )
+  }
+
   @Test
   fun testZero() = qtSerializerTest(
     UByteSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/UIntSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/UIntSerializerTest.kt
index 8b4d498581591e8aef78eaec5af0e9006e01accc..5cdd0b78e09759ede9e875153ec3e7a019d3bebf 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/UIntSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/UIntSerializerTest.kt
@@ -18,11 +18,23 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
 class UIntSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      UIntSerializer,
+      QtSerializers.find<UInt>(QtType.UInt),
+    )
+  }
+
   @Test
   fun testZero() = qtSerializerTest(
     UIntSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ULongSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ULongSerializerTest.kt
index 3a68c7c63b74cbf90a0821f6486d49e3a14297cc..53db1a21d0cd159c751fe2605fe218b22566bde0 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ULongSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/ULongSerializerTest.kt
@@ -18,11 +18,23 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
 class ULongSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      ULongSerializer,
+      QtSerializers.find<ULong>(QtType.ULong),
+    )
+  }
+
   @Test
   fun testZero() = qtSerializerTest(
     ULongSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/UShortSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/UShortSerializerTest.kt
index 57192fb645b903663be3585aa7914ab5a9ee2425..9d7cfeb2794b9d2b9c734991650c090e29ffdadb 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/UShortSerializerTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/UShortSerializerTest.kt
@@ -18,11 +18,23 @@
  */
 package de.kuschku.libquassel.protocol.serializers.primitive
 
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
 import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions
+import org.junit.jupiter.api.Assertions.assertEquals
 import org.junit.jupiter.api.Test
 
 class UShortSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      UShortSerializer,
+      QtSerializers.find<UShort>(QtType.UShort),
+    )
+  }
+
   @Test
   fun testZero() = qtSerializerTest(
     UShortSerializer,
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/VoidSerializerTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/VoidSerializerTest.kt
new file mode 100644
index 0000000000000000000000000000000000000000..76db87989adba72d2f2ca9c628dabe2941ec1d5a
--- /dev/null
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/serializers/primitive/VoidSerializerTest.kt
@@ -0,0 +1,43 @@
+/*
+ * Quasseldroid - Quassel client for Android
+ *
+ * Copyright (c) 2020 Janne Mareike Koschinski
+ * Copyright (c) 2020 The Quassel Project
+ *
+ * This program is free software: you can redistribute it and/or modify it
+ * under the terms of the GNU General Public License version 3 as published
+ * by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License along
+ * with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+package de.kuschku.libquassel.protocol.serializers.primitive
+
+import de.kuschku.libquassel.protocol.serializers.QtSerializers
+import de.kuschku.libquassel.protocol.testutil.byteBufferOf
+import de.kuschku.libquassel.protocol.testutil.qtSerializerTest
+import de.kuschku.libquassel.protocol.variant.QtType
+import org.junit.jupiter.api.Assertions.assertEquals
+import org.junit.jupiter.api.Test
+
+class VoidSerializerTest {
+  @Test
+  fun testIsRegistered() {
+    assertEquals(
+      VoidSerializer,
+      QtSerializers.find<Unit>(QtType.Void),
+    )
+  }
+
+  @Test
+  fun test() = qtSerializerTest(
+    VoidSerializer,
+    Unit,
+    byteBufferOf()
+  )
+}
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/testutil/byteBufferOf.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/testutil/byteBufferOf.kt
index 65f2eb75cefd3b7d9faabdc0ea11587fd737343e..61e196dd7740ac223392755d892b1c6e14493777 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/testutil/byteBufferOf.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/testutil/byteBufferOf.kt
@@ -20,5 +20,16 @@ package de.kuschku.libquassel.protocol.testutil
 
 import java.nio.ByteBuffer
 
-inline fun byteBufferOf(vararg elements: Byte) = ByteBuffer.wrap(byteArrayOf(*elements))
-inline fun byteBufferOf(vararg elements: UByte) = ByteBuffer.wrap(ubyteArrayOf(*elements).toByteArray())
+@Suppress("NOTHING_TO_INLINE")
+inline fun byteBufferOf(
+  vararg elements: Byte
+): ByteBuffer = ByteBuffer.wrap(byteArrayOf(*elements))
+
+@Suppress("NOTHING_TO_INLINE")
+inline fun byteBufferOf(
+  vararg elements: UByte
+): ByteBuffer = ByteBuffer.wrap(ubyteArrayOf(*elements).toByteArray())
+
+@Suppress("NOTHING_TO_INLINE")
+inline fun byteBufferOf(): ByteBuffer =
+  ByteBuffer.allocateDirect(0)
diff --git a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/variant/QVariantTest.kt b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/variant/QVariantTest.kt
index df0d34f826e364171fa0e76c06ecf378e9322b57..b55e43f4b4b677e0ea09188e604628d552595f34 100644
--- a/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/variant/QVariantTest.kt
+++ b/protocol/src/test/kotlin/de/kuschku/libquassel/protocol/variant/QVariantTest.kt
@@ -20,6 +20,7 @@
 package de.kuschku.libquassel.protocol.variant
 
 import de.kuschku.libquassel.protocol.testutil.byteBufferOf
+import de.kuschku.libquassel.protocol.types.BufferId
 import de.kuschku.libquassel.protocol.variant.QtType
 import de.kuschku.libquassel.protocol.variant.qVariant
 import org.junit.jupiter.api.Assertions.*
@@ -42,5 +43,12 @@ class QVariantTest {
         QtType.QString
       ).toString()
     )
+    assertEquals(
+      "QVariant(BufferIdSerializer, BufferId(-1))",
+      qVariant(
+        BufferId(-1),
+        QuasselType.BufferId
+      ).toString()
+    )
   }
 }