diff --git a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt
index 73d59ca90a42bb9b33a1fd3d0f2451c9189e01d0..a85ad2860e0a0a53609a1d2f545b70b2661a2d1a 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt
@@ -11,6 +11,7 @@ import de.kuschku.libquassel.protocol.Protocol_Feature
 import de.kuschku.libquassel.protocol.Protocol_Features
 import de.kuschku.libquassel.quassel.QuasselFeatures
 import de.kuschku.libquassel.session.*
+import de.kuschku.malheur.CrashHandler
 import de.kuschku.quasseldroid.BuildConfig
 import de.kuschku.quasseldroid.Keys
 import de.kuschku.quasseldroid.R
@@ -270,7 +271,8 @@ class QuasselService : DaggerLifecycleService(),
       ISession.NULL,
       QuasselBacklogStorage(database),
       handlerService,
-      ::disconnectFromCore
+      ::disconnectFromCore,
+      CrashHandler::handle
     )
 
     clientData = ClientData(
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/compatibility/AndroidHandlerService.kt b/app/src/main/java/de/kuschku/quasseldroid/util/compatibility/AndroidHandlerService.kt
index 7044fd6975ec32418074eb43cff8e53bd272eed8..b61c3b793ca4fb4a1d0af66a2ce69cd0e9983f02 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/util/compatibility/AndroidHandlerService.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/compatibility/AndroidHandlerService.kt
@@ -11,7 +11,7 @@ class AndroidHandlerService : HandlerService {
   }
 
   override fun deserialize(f: () -> Unit) {
-    serializeHandler.post(f)
+    deserializeHandler.post(f)
   }
 
   override fun write(f: () -> Unit) {
diff --git a/invokergenerator/src/main/java/de/kuschku/libquassel/annotations/InvokerProcessor.java b/invokergenerator/src/main/java/de/kuschku/libquassel/annotations/InvokerProcessor.java
index 0a3a15456f6f3e0bfe45a2c0717a6bdd22c85cd4..a53a6b016d632607ea0ac7ed94239efe428a2e45 100644
--- a/invokergenerator/src/main/java/de/kuschku/libquassel/annotations/InvokerProcessor.java
+++ b/invokergenerator/src/main/java/de/kuschku/libquassel/annotations/InvokerProcessor.java
@@ -9,6 +9,7 @@ import com.squareup.javapoet.ParameterSpec;
 import com.squareup.javapoet.ParameterizedTypeName;
 import com.squareup.javapoet.TypeName;
 import com.squareup.javapoet.TypeSpec;
+import com.squareup.javapoet.WildcardTypeName;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -129,9 +130,11 @@ public class InvokerProcessor extends AbstractProcessor {
       .builder(
         ParameterizedTypeName.get(
           ClassName.get(List.class),
-          ParameterizedTypeName.get(
-            ClassName.get("de.kuschku.libquassel.protocol", "QVariant"),
-            TypeName.get(Object.class)
+          WildcardTypeName.subtypeOf(
+            ParameterizedTypeName.get(
+              ClassName.get("de.kuschku.libquassel.protocol", "QVariant"),
+              WildcardTypeName.subtypeOf(Object.class)
+            )
           )
         ),
         "params"
@@ -159,7 +162,7 @@ public class InvokerProcessor extends AbstractProcessor {
         TypeMirror parameterType = slot.type.getParameterTypes().get(i);
         boolean isLast = i + 1 == slot.type.getParameterTypes().size();
 
-        invokeSpec = invokeSpec.addCode("($T) $N.get($L).getData()", parameterType, parameterSpecParams, i);
+        invokeSpec = invokeSpec.addCode("($T) ($T) $N.get($L).getData()", parameterType, Object.class, parameterSpecParams, i);
         if (!isLast)
           invokeSpec = invokeSpec.addCode(",");
         invokeSpec = invokeSpec.addCode("\n");
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/MetaType.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/MetaType.kt
deleted file mode 100644
index fee50680bdf28f8f3615163c9eb3115799d80441..0000000000000000000000000000000000000000
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/MetaType.kt
+++ /dev/null
@@ -1,103 +0,0 @@
-package de.kuschku.libquassel.protocol
-
-import de.kuschku.libquassel.protocol.primitive.serializer.*
-import org.threeten.bp.LocalTime
-import org.threeten.bp.OffsetDateTime
-
-data class MetaType<T>(val klass: Class<T>, val type: Type, val serializer: Serializer<T>? = null,
-                       val name: String = type.serializableName) {
-  companion object {
-    private val byName = HashMap<String, MetaType<*>>()
-    private val byType = HashMap<Type, MetaType<*>>()
-
-    private inline fun <reified T : Any?> addType(type: Type,
-                                                  serializer: Serializer<T>? = null) {
-      val metaType = MetaType(T::class.java, type, serializer, type.serializableName)
-      byName[metaType.name] = metaType
-      byType[metaType.type] = metaType
-    }
-
-    private inline fun <reified T : Any?> addType(type: Type, name: String,
-                                                  serializer: Serializer<T>? = null) {
-      val metaType = MetaType(T::class.java, type, serializer, name)
-      byName[metaType.name] = metaType
-    }
-
-    private inline fun <reified T : Any?> addType(type: Type, name: QType,
-                                                  serializer: Serializer<T>? = null) {
-      addType(type, name.typeName, serializer)
-    }
-
-    init {
-      addType(Type.Void, VoidSerializer)
-      addType(Type.Bool, BoolSerializer)
-      addType(Type.Char, ByteSerializer)
-      addType(Type.UChar, ByteSerializer)
-      addType(Type.Short, ShortSerializer)
-      addType(Type.UShort, ShortSerializer)
-      addType(Type.Int, IntSerializer)
-      addType(Type.UInt, IntSerializer)
-      addType(Type.Long, LongSerializer)
-      addType(Type.ULong, LongSerializer)
-
-      addType(Type.QTime, TimeSerializer)
-      addType(Type.QDateTime, DateTimeSerializer)
-      addType(Type.QChar, CharSerializer)
-      addType(Type.QString, StringSerializer.UTF16)
-      addType(Type.QByteArray, ByteArraySerializer)
-      addType(Type.QStringList, StringListSerializer)
-      addType(Type.QVariantList, VariantListSerializer)
-      addType(Type.QVariantMap, VariantMapSerializer)
-      addType(Type.QVariant, VariantSerializer)
-
-      addType(Type.UserType, QType.BufferId, IntSerializer)
-      addType(Type.UserType, QType.BufferInfo, BufferInfoSerializer)
-      addType(Type.UserType, QType.DccConfig_IpDetectionMode, DccConfig_IpDetectionModeSerializer)
-      addType(
-        Type.UserType, QType.DccConfig_PortSelectionMode,
-        DccConfig_PortSelectionModeSerializer
-      )
-      addType(Type.UserType, QType.IrcUser, VariantMapSerializer)
-      addType(Type.UserType, QType.IrcChannel, VariantMapSerializer)
-      addType(Type.UserType, QType.Identity, VariantMapSerializer)
-      addType(Type.UserType, QType.IdentityId, IntSerializer)
-      addType(Type.UserType, QType.MsgId, IntSerializer)
-      addType(Type.UserType, QType.Message, MessageSerializer)
-      addType(Type.UserType, QType.NetworkId, IntSerializer)
-      addType(Type.UserType, QType.NetworkInfo, VariantMapSerializer)
-      addType(Type.UserType, QType.Network_Server, VariantMapSerializer)
-      addType(Type.UserType, QType.QHostAddress, HostAddressSerializer)
-
-      addType(Type.QByteArray, "UTF8String", StringSerializer.UTF8)
-      addType(Type.QByteArray, "CString", StringSerializer.C)
-
-      addType(Type.Long, "PeerPtr", LongSerializer)
-    }
-
-    fun <T : Any?> get(key: String?): MetaType<T> =
-      byName[key] as MetaType<T>? ?: throw(IllegalArgumentException("Type does not exist: $key"))
-
-
-    fun <T : Any?> get(key: Type?): MetaType<T> =
-      byType[key] as MetaType<T>? ?: throw(IllegalArgumentException("Type does not exist: $key"))
-
-    fun <T : Any?> get(data: T): MetaType<T>? = when (data) {
-      equals(null)      -> get(Type.Void)
-      is Boolean        -> get<Boolean>(Type.Bool)
-      is Byte           -> get<Byte>(Type.Char)
-      is Short          -> get<Short>(Type.Short)
-      is Int            -> get<Int>(Type.Int)
-      is Long           -> get<Long>(Type.Long)
-      is LocalTime      -> get<LocalTime>(Type.QTime)
-      is OffsetDateTime -> get<OffsetDateTime>(Type.QDateTime)
-      is String         -> get<String?>(Type.QString)
-      is QVariant<*>    -> get<QVariant<*>>(Type.QVariant)
-      is List<*>        -> if (data.isEmpty() || data[0] !is String) {
-        get<List<*>>(Type.QVariantList)
-      } else {
-        get<QStringList>(Type.QStringList)
-      }
-      else              -> throw IllegalArgumentException("Unsupported type: $data")
-    } as MetaType<T>
-  }
-}
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/QType.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/QType.kt
index 21529ef3f7e84246c8a11ccb1ddc1fc1caf91d76..8da3dff44dc6155d8ec44c58c652b700c2681494 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/QType.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/QType.kt
@@ -1,19 +1,30 @@
 package de.kuschku.libquassel.protocol
 
-enum class QType(val typeName: String) {
-  BufferId("BufferId"),
-  BufferInfo("BufferInfo"),
-  DccConfig_IpDetectionMode("DccConfig::IpDetectionMode"),
-  DccConfig_PortSelectionMode("DccConfig::PortSelectionMode"),
-  IrcUser("IrcUser"),
-  IrcChannel("IrcChannel"),
-  Identity("Identity"),
-  IdentityId("IdentityId"),
-  Message("Message"),
-  MsgId("MsgId"),
-  Network("Network"),
-  NetworkId("NetworkId"),
-  NetworkInfo("NetworkInfo"),
-  Network_Server("Network::Server"),
-  QHostAddress("QHostAddress")
+import de.kuschku.libquassel.protocol.primitive.serializer.*
+
+enum class QType(val typeName: String, val serializer: Serializer<*>,
+                 val type: Type = Type.UserType) {
+  BufferId("BufferId", IntSerializer),
+  BufferInfo("BufferInfo", BufferInfoSerializer),
+  DccConfig_IpDetectionMode("DccConfig::IpDetectionMode", DccConfig_IpDetectionModeSerializer),
+  DccConfig_PortSelectionMode("DccConfig::PortSelectionMode",
+                              DccConfig_PortSelectionModeSerializer),
+  IrcUser("IrcUser", VariantMapSerializer),
+  IrcChannel("IrcChannel", VariantMapSerializer),
+  Identity("Identity", VariantMapSerializer),
+  IdentityId("IdentityId", IntSerializer),
+  Message("Message", MessageSerializer),
+  MsgId("MsgId", IntSerializer),
+  NetworkId("NetworkId", IntSerializer),
+  NetworkInfo("NetworkInfo", VariantMapSerializer),
+  Network_Server("Network::Server", VariantMapSerializer),
+  QHostAddress("QHostAddress", HostAddressSerializer),
+  PeerPtr("PeerPtr", LongSerializer, type = Type.Long);
+
+  override fun toString() = "QType($typeName, $type)"
+
+  companion object {
+    private val map = values().associateBy(QType::typeName)
+    fun of(name: String) = map[name]
+  }
 }
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/QTypes.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/QTypes.kt
index 5b931a4657eedc37019599402e0f45e6d450b852..dd3ec4116f1d21d627df3b501e32fcb0fdff17cd 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/QTypes.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/QTypes.kt
@@ -12,7 +12,7 @@ import java.nio.ByteBuffer
 
 typealias QStringList = List<String?>
 typealias All_ = Any?
-typealias QVariant_ = QVariant<All_>
+typealias QVariant_ = QVariant<*>
 typealias QVariantMap = Map<String, QVariant_>
 typealias QVariantList = List<QVariant_>
 
@@ -47,7 +47,8 @@ typealias UShort = Short
 typealias UInt = Int
 typealias ULong = Long
 
-typealias ARG = QVariant_
+inline fun <T> ARG(data: T?, type: Type) = QVariant.of(data, type)
+inline fun <T> ARG(data: T?, type: QType) = QVariant.of(data, type)
 
 fun QVariantList.toVariantMap(): QVariantMap {
   val map = HashMap<String, QVariant_>()
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/QVariant.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/QVariant.kt
index 22cd81d6da973409f7f24559b2f07a02323f5e0f..e70c2ab8d17e655c8d98dd9d1f7927a26091c63b 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/QVariant.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/QVariant.kt
@@ -1,19 +1,41 @@
 package de.kuschku.libquassel.protocol
 
-class QVariant<T>(val data: T?, val type: MetaType<T>) {
-  constructor(data: T?, type: Type) : this(data, MetaType.Companion.get(type))
-  constructor(data: T?, type: QType) : this(data, type.typeName)
-  constructor(data: T?, type: String) : this(data, MetaType.Companion.get(type))
+import de.kuschku.libquassel.protocol.primitive.serializer.Serializer
+import java.nio.ByteBuffer
+import java.nio.CharBuffer
+
+sealed class QVariant<T> constructor(val data: T?, val type: Type, val serializer: Serializer<T>) {
+  class Typed<T> internal constructor(data: T?, type: Type, serializer: Serializer<T>) :
+    QVariant<T>(data, type, serializer) {
+    override fun toString() = "QVariant.Typed(${type.serializableName}, ${toString(data)})"
+  }
+
+  class Custom<T> internal constructor(data: T?, val qtype: QType, serializer: Serializer<T>) :
+    QVariant<T>(data, qtype.type, serializer) {
+    override fun toString() = "QVariant.Custom($qtype, ${toString(data)})"
+  }
 
   fun or(defValue: T): T {
     return data ?: defValue
   }
 
-  override fun toString(): String {
-    return "QVariant(${type.name}, $data)"
+  companion object {
+    fun <T> of(data: T?, type: Type): QVariant<T> {
+      return QVariant.Typed(data, type, type.serializer as Serializer<T>)
+    }
+
+    fun <T> of(data: T?, type: QType) =
+      QVariant.Custom(data, type, type.serializer as Serializer<T>)
   }
 }
 
+inline fun toString(data: Any?) = when (data) {
+  is ByteBuffer -> data.array()?.contentToString()
+  is CharBuffer -> data.array()?.contentToString()
+  is Array<*>   -> data.contentToString()
+  else          -> data.toString()
+}
+
 inline fun <reified U> QVariant_?.value(): U? = this?.value<U?>(null)
 
 inline fun <reified U> QVariant_?.value(defValue: U): U = this?.data as? U ?: defValue
@@ -24,4 +46,4 @@ inline fun <reified U> QVariant_?.valueOrThrow(e: Throwable = NullPointerExcepti
   this?.data as? U ?: throw e
 
 inline fun <reified U> QVariant_?.valueOrThrow(e: () -> Throwable): U =
-  this?.data as? U ?: throw e()
+  this?.data as? U ?: throw e()
\ No newline at end of file
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/Type.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/Type.kt
index f644d14a9197fbbc3f273f9fd20c5436e8ed7494..44a70bef0cad4550792567facc82154320451dc6 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/Type.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/Type.kt
@@ -1,29 +1,30 @@
 package de.kuschku.libquassel.protocol
 
+import de.kuschku.libquassel.protocol.primitive.serializer.*
 import java.util.*
 
 
-enum class Type(val id: kotlin.Int) {
-  Void(0),
-  Bool(1),
-  Int(2),
-  UInt(3),
+enum class Type(val id: kotlin.Int, val serializer: Serializer<*>? = null) {
+  Void(0, VoidSerializer),
+  Bool(1, BoolSerializer),
+  Int(2, IntSerializer),
+  UInt(3, IntSerializer),
   LongLong(4),
   ULongLong(5),
 
   Double(6),
-  QChar(7),
-  QVariantMap(8),
-  QVariantList(9),
+  QChar(7, CharSerializer),
+  QVariantMap(8, VariantMapSerializer),
+  QVariantList(9, VariantListSerializer),
 
-  QString(10),
-  QStringList(11),
-  QByteArray(12),
+  QString(10, StringSerializer.UTF16),
+  QStringList(11, StringListSerializer),
+  QByteArray(12, ByteArraySerializer),
 
   QBitArray(13),
   QDate(14),
-  QTime(15),
-  QDateTime(16),
+  QTime(15, TimeSerializer),
+  QDateTime(16, DateTimeSerializer),
   QUrl(17),
 
   QLocale(18),
@@ -73,18 +74,18 @@ enum class Type(val id: kotlin.Int) {
   QQuaternion(86),
 
   VoidStar(128),
-  Long(129),
-  Short(130),
-  Char(131),
-  ULong(132),
+  Long(129, LongSerializer),
+  Short(130, ShortSerializer),
+  Char(131, ByteSerializer),
+  ULong(132, LongSerializer),
 
-  UShort(133),
-  UChar(134),
+  UShort(133, ShortSerializer),
+  UChar(134, ByteSerializer),
   Float(135),
   QObjectStar(136),
   QWidgetStar(137),
 
-  QVariant(138),
+  QVariant(138, VariantSerializer),
 
   User(256),
   UserType(127),
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientInitAckSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientInitAckSerializer.kt
index 5f45467c8b0006ef0b8640282edbcfb28badb039..69aade656d54d8548ac81f5f9fbf2d6f2666ad58 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientInitAckSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientInitAckSerializer.kt
@@ -1,19 +1,16 @@
 package de.kuschku.libquassel.protocol.message
 
-import de.kuschku.libquassel.protocol.QVariantMap
-import de.kuschku.libquassel.protocol.QVariant_
-import de.kuschku.libquassel.protocol.Type
-import de.kuschku.libquassel.protocol.value
+import de.kuschku.libquassel.protocol.*
 import de.kuschku.libquassel.util.Flags
 
 object ClientInitAckSerializer : HandshakeMessageSerializer<HandshakeMessage.ClientInitAck> {
   override fun serialize(data: HandshakeMessage.ClientInitAck) = mapOf(
-    "MsgType" to QVariant_("ClientInitAck", Type.QString),
-    "CoreFeatures" to QVariant_(data.coreFeatures?.toInt(), Type.UInt),
-    "StorageBackends" to QVariant_(data.backendInfo, Type.QVariantList),
-    "Authenticator" to QVariant_(data.authenticatorInfo, Type.QVariantList),
-    "Configured" to QVariant_(data.coreConfigured, Type.Bool),
-    "FeatureList" to QVariant_(data.featureList, Type.QStringList)
+    "MsgType" to QVariant.of<All_>("ClientInitAck", Type.QString),
+    "CoreFeatures" to QVariant.of<All_>(data.coreFeatures?.toInt(), Type.UInt),
+    "StorageBackends" to QVariant.of<All_>(data.backendInfo, Type.QVariantList),
+    "Authenticator" to QVariant.of<All_>(data.authenticatorInfo, Type.QVariantList),
+    "Configured" to QVariant.of<All_>(data.coreConfigured, Type.Bool),
+    "FeatureList" to QVariant.of<All_>(data.featureList, Type.QStringList)
   )
 
   override fun deserialize(data: QVariantMap) = HandshakeMessage.ClientInitAck(
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientInitRejectSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientInitRejectSerializer.kt
index 41da7bf3fcb2091c390615e10c6f33cf92a4610e..12655873b090215fe60505821b61065e775ab908 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientInitRejectSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientInitRejectSerializer.kt
@@ -1,14 +1,14 @@
 package de.kuschku.libquassel.protocol.message
 
+import de.kuschku.libquassel.protocol.QVariant
 import de.kuschku.libquassel.protocol.QVariantMap
-import de.kuschku.libquassel.protocol.QVariant_
 import de.kuschku.libquassel.protocol.Type
 import de.kuschku.libquassel.protocol.value
 
 object ClientInitRejectSerializer : HandshakeMessageSerializer<HandshakeMessage.ClientInitReject> {
   override fun serialize(data: HandshakeMessage.ClientInitReject) = mapOf(
-    "MsgType" to QVariant_("ClientInitReject", Type.QString),
-    "Error" to QVariant_(data.errorString, Type.QString)
+    "MsgType" to QVariant.of("ClientInitReject", Type.QString),
+    "Error" to QVariant.of(data.errorString, Type.QString)
   )
 
   override fun deserialize(data: QVariantMap) = HandshakeMessage.ClientInitReject(
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientInitSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientInitSerializer.kt
index 9d7c44c0e6c3b255c86515f57c2e4dd7bba66fc8..9050cc75055c14ab9492b5c30b274569f6a97e2c 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientInitSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientInitSerializer.kt
@@ -1,18 +1,18 @@
 package de.kuschku.libquassel.protocol.message
 
+import de.kuschku.libquassel.protocol.QVariant
 import de.kuschku.libquassel.protocol.QVariantMap
-import de.kuschku.libquassel.protocol.QVariant_
 import de.kuschku.libquassel.protocol.Type
 import de.kuschku.libquassel.protocol.value
 import de.kuschku.libquassel.util.Flags
 
 object ClientInitSerializer : HandshakeMessageSerializer<HandshakeMessage.ClientInit> {
   override fun serialize(data: HandshakeMessage.ClientInit) = mapOf(
-    "MsgType" to QVariant_("ClientInit", Type.QString),
-    "ClientVersion" to QVariant_(data.clientVersion, Type.QString),
-    "ClientDate" to QVariant_(data.buildDate, Type.QString),
-    "Features" to QVariant_(data.clientFeatures?.toInt(), Type.UInt),
-    "FeatureList" to QVariant_(data.featureList, Type.QStringList)
+    "MsgType" to QVariant.of("ClientInit", Type.QString),
+    "ClientVersion" to QVariant.of(data.clientVersion, Type.QString),
+    "ClientDate" to QVariant.of(data.buildDate, Type.QString),
+    "Features" to QVariant.of(data.clientFeatures?.toInt(), Type.UInt),
+    "FeatureList" to QVariant.of(data.featureList, Type.QStringList)
   )
 
   override fun deserialize(data: QVariantMap) = HandshakeMessage.ClientInit(
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientLoginAckSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientLoginAckSerializer.kt
index ee42806e4a0f46101113c13517b84b10a585ad68..7096331cc4d4a971d2b206801eed5a78ec85bc5c 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientLoginAckSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientLoginAckSerializer.kt
@@ -1,12 +1,12 @@
 package de.kuschku.libquassel.protocol.message
 
+import de.kuschku.libquassel.protocol.QVariant
 import de.kuschku.libquassel.protocol.QVariantMap
-import de.kuschku.libquassel.protocol.QVariant_
 import de.kuschku.libquassel.protocol.Type
 
 object ClientLoginAckSerializer : HandshakeMessageSerializer<HandshakeMessage.ClientLoginAck> {
   override fun serialize(data: HandshakeMessage.ClientLoginAck) = mapOf(
-    "MsgType" to QVariant_("ClientLoginAck", Type.QString)
+    "MsgType" to QVariant.of("ClientLoginAck", Type.QString)
   )
 
   override fun deserialize(data: QVariantMap) = HandshakeMessage.ClientLoginAck()
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientLoginRejectSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientLoginRejectSerializer.kt
index 11dd2b7fb4025be01c88812ca506e29a5e5b9013..c2e53de455778ccda3e73431bd9f91c4968b8e2c 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientLoginRejectSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientLoginRejectSerializer.kt
@@ -1,15 +1,15 @@
 package de.kuschku.libquassel.protocol.message
 
+import de.kuschku.libquassel.protocol.QVariant
 import de.kuschku.libquassel.protocol.QVariantMap
-import de.kuschku.libquassel.protocol.QVariant_
 import de.kuschku.libquassel.protocol.Type
 import de.kuschku.libquassel.protocol.value
 
 object ClientLoginRejectSerializer :
   HandshakeMessageSerializer<HandshakeMessage.ClientLoginReject> {
   override fun serialize(data: HandshakeMessage.ClientLoginReject) = mapOf(
-    "MsgType" to QVariant_("ClientLoginReject", Type.QString),
-    "Error" to QVariant_(data.errorString, Type.QString)
+    "MsgType" to QVariant.of("ClientLoginReject", Type.QString),
+    "Error" to QVariant.of(data.errorString, Type.QString)
   )
 
   override fun deserialize(data: QVariantMap) = HandshakeMessage.ClientLoginReject(
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientLoginSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientLoginSerializer.kt
index 35fdc7c70c9c09f4486106f3bfc710d07d58b061..0a9347706de8b2fa6f4a9a4bdaee947749695ceb 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientLoginSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/ClientLoginSerializer.kt
@@ -1,15 +1,15 @@
 package de.kuschku.libquassel.protocol.message
 
+import de.kuschku.libquassel.protocol.QVariant
 import de.kuschku.libquassel.protocol.QVariantMap
-import de.kuschku.libquassel.protocol.QVariant_
 import de.kuschku.libquassel.protocol.Type
 import de.kuschku.libquassel.protocol.value
 
 object ClientLoginSerializer : HandshakeMessageSerializer<HandshakeMessage.ClientLogin> {
   override fun serialize(data: HandshakeMessage.ClientLogin) = mapOf(
-    "MsgType" to QVariant_("ClientLogin", Type.QString),
-    "User" to QVariant_(data.user, Type.QString),
-    "Password" to QVariant_(data.password, Type.QString)
+    "MsgType" to QVariant.of("ClientLogin", Type.QString),
+    "User" to QVariant.of(data.user, Type.QString),
+    "Password" to QVariant.of(data.password, Type.QString)
   )
 
   override fun deserialize(data: QVariantMap) = HandshakeMessage.ClientLogin(
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/CoreSetupAckSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/CoreSetupAckSerializer.kt
index 8f92d8a5842e5d75a73449fb84a3a458e2722ec6..dbc9548685cb93415033ca68048a7938642ad282 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/CoreSetupAckSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/CoreSetupAckSerializer.kt
@@ -1,12 +1,12 @@
 package de.kuschku.libquassel.protocol.message
 
+import de.kuschku.libquassel.protocol.QVariant
 import de.kuschku.libquassel.protocol.QVariantMap
-import de.kuschku.libquassel.protocol.QVariant_
 import de.kuschku.libquassel.protocol.Type
 
 object CoreSetupAckSerializer : HandshakeMessageSerializer<HandshakeMessage.CoreSetupAck> {
   override fun serialize(data: HandshakeMessage.CoreSetupAck) = mapOf(
-    "MsgType" to QVariant_("CoreSetupAck", Type.QString)
+    "MsgType" to QVariant.of("CoreSetupAck", Type.QString)
   )
 
   override fun deserialize(data: QVariantMap) = HandshakeMessage.CoreSetupAck()
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/CoreSetupDataSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/CoreSetupDataSerializer.kt
index 47462bb78b543ec80c0847e3eadaaa6996133c99..6988b1c18f5d5b4f6fee2bccd0112b0e69d055ba 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/CoreSetupDataSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/CoreSetupDataSerializer.kt
@@ -1,22 +1,21 @@
 package de.kuschku.libquassel.protocol.message
 
+import de.kuschku.libquassel.protocol.QVariant
 import de.kuschku.libquassel.protocol.QVariantMap
-import de.kuschku.libquassel.protocol.QVariant_
 import de.kuschku.libquassel.protocol.Type
 import de.kuschku.libquassel.protocol.value
 
 object CoreSetupDataSerializer : HandshakeMessageSerializer<HandshakeMessage.CoreSetupData> {
   override fun serialize(data: HandshakeMessage.CoreSetupData) = mapOf(
-    "MsgType" to QVariant_("CoreSetupData", Type.QString),
-    "SetupData" to QVariant_(
-      mapOf(
-        "AdminUser" to QVariant_(data.adminUser, Type.QString),
-        "AdminPasswd" to QVariant_(data.adminPassword, Type.QString),
-        "Backend" to QVariant_(data.backend, Type.QString),
-        "ConnectionProperties" to QVariant_(data.setupData, Type.QVariantMap),
-        "Authenticator" to QVariant_(data.authenticator, Type.QString),
-        "AuthProperties" to QVariant_(data.authSetupData, Type.QVariantMap)
-      ), Type.QVariantMap
+    "MsgType" to QVariant.of("CoreSetupData", Type.QString),
+    "SetupData" to QVariant.of(mapOf(
+      "AdminUser" to QVariant.of(data.adminUser, Type.QString),
+      "AdminPasswd" to QVariant.of(data.adminPassword, Type.QString),
+      "Backend" to QVariant.of(data.backend, Type.QString),
+      "ConnectionProperties" to QVariant.of(data.setupData, Type.QVariantMap),
+      "Authenticator" to QVariant.of(data.authenticator, Type.QString),
+      "AuthProperties" to QVariant.of(data.authSetupData, Type.QVariantMap)
+    ), Type.QVariantMap
     )
   )
 
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/CoreSetupRejectSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/CoreSetupRejectSerializer.kt
index e6c732a941bb1c47b656d058b6050e54a8c02f48..981da5b531b0ef6fb67ea33b41134386b6c12aa1 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/CoreSetupRejectSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/CoreSetupRejectSerializer.kt
@@ -1,14 +1,14 @@
 package de.kuschku.libquassel.protocol.message
 
+import de.kuschku.libquassel.protocol.QVariant
 import de.kuschku.libquassel.protocol.QVariantMap
-import de.kuschku.libquassel.protocol.QVariant_
 import de.kuschku.libquassel.protocol.Type
 import de.kuschku.libquassel.protocol.value
 
 object CoreSetupRejectSerializer : HandshakeMessageSerializer<HandshakeMessage.CoreSetupReject> {
   override fun serialize(data: HandshakeMessage.CoreSetupReject) = mapOf(
-    "MsgType" to QVariant_("CoreSetupReject", Type.QString),
-    "Error" to QVariant_(data.errorString, Type.QString)
+    "MsgType" to QVariant.of("CoreSetupReject", Type.QString),
+    "Error" to QVariant.of(data.errorString, Type.QString)
   )
 
   override fun deserialize(data: QVariantMap) = HandshakeMessage.CoreSetupReject(
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/HandshakeMessage.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/HandshakeMessage.kt
index a4f584fa57bd153e8f98bf1058ff146f805c0d6a..be120e3adf26c4c9dc0e42a6bdefec1a7ac7ccba 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/HandshakeMessage.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/HandshakeMessage.kt
@@ -5,7 +5,6 @@ import de.kuschku.libquassel.protocol.QVariantList
 import de.kuschku.libquassel.protocol.QVariantMap
 import de.kuschku.libquassel.protocol.value
 
-
 sealed class HandshakeMessage {
   class ClientInit(
     val clientVersion: String?, val buildDate: String?,
@@ -112,6 +111,5 @@ sealed class HandshakeMessage {
         )
       }
     }
-
   }
 }
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/HeartBeatReplySerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/HeartBeatReplySerializer.kt
index 2340c29f949957d47e2046bf66aea463564aaaaf..debd530833bc6534c3a26e9a1260eb8151b215f0 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/HeartBeatReplySerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/HeartBeatReplySerializer.kt
@@ -1,15 +1,15 @@
 package de.kuschku.libquassel.protocol.message
 
+import de.kuschku.libquassel.protocol.QVariant
 import de.kuschku.libquassel.protocol.QVariantList
-import de.kuschku.libquassel.protocol.QVariant_
 import de.kuschku.libquassel.protocol.Type
 import de.kuschku.libquassel.protocol.value
 import org.threeten.bp.Instant
 
 object HeartBeatReplySerializer : SignalProxyMessageSerializer<SignalProxyMessage.HeartBeatReply> {
   override fun serialize(data: SignalProxyMessage.HeartBeatReply) = listOf(
-    QVariant_(RequestType.HeartBeatReply.value, Type.Int),
-    QVariant_(data.timestamp, Type.QDateTime)
+    QVariant.of(RequestType.HeartBeatReply.value, Type.Int),
+    QVariant.of(data.timestamp, Type.QDateTime)
   )
 
   override fun deserialize(data: QVariantList) = SignalProxyMessage.HeartBeatReply(
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/HeartBeatSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/HeartBeatSerializer.kt
index f17071c7f15b101a1d51da47e9d14344108889fe..471275147e6717f416e28598e79708b80802e0c9 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/HeartBeatSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/HeartBeatSerializer.kt
@@ -1,15 +1,15 @@
 package de.kuschku.libquassel.protocol.message
 
+import de.kuschku.libquassel.protocol.QVariant
 import de.kuschku.libquassel.protocol.QVariantList
-import de.kuschku.libquassel.protocol.QVariant_
 import de.kuschku.libquassel.protocol.Type
 import de.kuschku.libquassel.protocol.value
 import org.threeten.bp.Instant
 
 object HeartBeatSerializer : SignalProxyMessageSerializer<SignalProxyMessage.HeartBeat> {
   override fun serialize(data: SignalProxyMessage.HeartBeat) = listOf(
-    QVariant_(RequestType.HeartBeat.value, Type.Int),
-    QVariant_(data.timestamp, Type.QDateTime)
+    QVariant.of(RequestType.HeartBeat.value, Type.Int),
+    QVariant.of(data.timestamp, Type.QDateTime)
   )
 
   override fun deserialize(data: QVariantList) = SignalProxyMessage.HeartBeat(
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/InitDataSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/InitDataSerializer.kt
index 2f85f5ac72bdaa5e91432f99c5bed5665c005177..574db68dc02aaf307ddea89783c7ffc3ee517d43 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/InitDataSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/InitDataSerializer.kt
@@ -8,10 +8,10 @@ import java.nio.ByteBuffer
 
 object InitDataSerializer : SignalProxyMessageSerializer<SignalProxyMessage.InitData> {
   override fun serialize(data: SignalProxyMessage.InitData) = listOf(
-    QVariant_(RequestType.InitData.value, Type.Int),
-    QVariant_(data.className.serializeString(StringSerializer.UTF8), Type.QByteArray),
-    QVariant_(data.objectName.serializeString(StringSerializer.UTF8), Type.QByteArray),
-    QVariant_(data.initData, Type.QVariantMap)
+    QVariant.of<Any>(RequestType.InitData.value, Type.Int),
+    QVariant.of<Any>(data.className.serializeString(StringSerializer.UTF8), Type.QByteArray),
+    QVariant.of<Any>(data.objectName.serializeString(StringSerializer.UTF8), Type.QByteArray),
+    QVariant.of<Any>(data.initData, Type.QVariantMap)
   )
 
   override fun deserialize(data: QVariantList) = SignalProxyMessage.InitData(
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/InitRequestSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/InitRequestSerializer.kt
index 4a891f52a3c7e09da630433129d7bf673e376f2b..604b813739d81dfaa0f0b776159afeee629472c5 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/InitRequestSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/InitRequestSerializer.kt
@@ -1,7 +1,7 @@
 package de.kuschku.libquassel.protocol.message
 
+import de.kuschku.libquassel.protocol.QVariant
 import de.kuschku.libquassel.protocol.QVariantList
-import de.kuschku.libquassel.protocol.QVariant_
 import de.kuschku.libquassel.protocol.Type
 import de.kuschku.libquassel.protocol.primitive.serializer.StringSerializer
 import de.kuschku.libquassel.protocol.value
@@ -11,9 +11,9 @@ import java.nio.ByteBuffer
 
 object InitRequestSerializer : SignalProxyMessageSerializer<SignalProxyMessage.InitRequest> {
   override fun serialize(data: SignalProxyMessage.InitRequest) = listOf(
-    QVariant_(RequestType.InitRequest.value, Type.Int),
-    QVariant_(data.className.serializeString(StringSerializer.UTF8), Type.QByteArray),
-    QVariant_(data.objectName.serializeString(StringSerializer.UTF8), Type.QByteArray)
+    QVariant.of(RequestType.InitRequest.value, Type.Int),
+    QVariant.of(data.className.serializeString(StringSerializer.UTF8), Type.QByteArray),
+    QVariant.of(data.objectName.serializeString(StringSerializer.UTF8), Type.QByteArray)
   )
 
   override fun deserialize(data: QVariantList) = SignalProxyMessage.InitRequest(
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/RpcCallSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/RpcCallSerializer.kt
index b0acbfe5b93c4ef099896cdf7a9502e77444d651..aaf9d34dd0db7238797547f9e8c516a812533b95 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/RpcCallSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/RpcCallSerializer.kt
@@ -1,7 +1,7 @@
 package de.kuschku.libquassel.protocol.message
 
+import de.kuschku.libquassel.protocol.QVariant
 import de.kuschku.libquassel.protocol.QVariantList
-import de.kuschku.libquassel.protocol.QVariant_
 import de.kuschku.libquassel.protocol.Type
 import de.kuschku.libquassel.protocol.primitive.serializer.StringSerializer
 import de.kuschku.libquassel.protocol.value
@@ -11,8 +11,8 @@ import java.nio.ByteBuffer
 
 object RpcCallSerializer : SignalProxyMessageSerializer<SignalProxyMessage.RpcCall> {
   override fun serialize(data: SignalProxyMessage.RpcCall) = listOf(
-    QVariant_(RequestType.RpcCall.value, Type.Int),
-    QVariant_(data.slotName.serializeString(StringSerializer.UTF8), Type.QByteArray),
+    QVariant.of(RequestType.RpcCall.value, Type.Int),
+    QVariant.of(data.slotName.serializeString(StringSerializer.UTF8), Type.QByteArray),
     *data.params.toTypedArray()
   )
 
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/SessionInitSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/SessionInitSerializer.kt
index fb18d67484020b02d1e29f7874e964d404cdd24d..7526191e7cb920e8e6ee2d1590e09f25dd250861 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/SessionInitSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/SessionInitSerializer.kt
@@ -1,19 +1,18 @@
 package de.kuschku.libquassel.protocol.message
 
+import de.kuschku.libquassel.protocol.QVariant
 import de.kuschku.libquassel.protocol.QVariantMap
-import de.kuschku.libquassel.protocol.QVariant_
 import de.kuschku.libquassel.protocol.Type
 import de.kuschku.libquassel.protocol.value
 
 object SessionInitSerializer : HandshakeMessageSerializer<HandshakeMessage.SessionInit> {
   override fun serialize(data: HandshakeMessage.SessionInit) = mapOf(
-    "MsgType" to QVariant_("SessionInit", Type.QString),
-    "SessionState" to QVariant_(
-      mapOf(
-        "BufferInfos" to QVariant_(data.bufferInfos, Type.QVariantList),
-        "NetworkIds" to QVariant_(data.networkIds, Type.QVariantList),
-        "Identities" to QVariant_(data.identities, Type.QVariantList)
-      ), Type.QVariantMap
+    "MsgType" to QVariant.of("SessionInit", Type.QString),
+    "SessionState" to QVariant.of(mapOf(
+      "BufferInfos" to QVariant.of(data.bufferInfos, Type.QVariantList),
+      "NetworkIds" to QVariant.of(data.networkIds, Type.QVariantList),
+      "Identities" to QVariant.of(data.identities, Type.QVariantList)
+    ), Type.QVariantMap
     )
   )
 
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/SignalProxyMessage.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/SignalProxyMessage.kt
index f9beac7863d065f623afd554ec197b586f18a13c..5f7c4a7f4fce7fc1d106c992222b78b121da4ef4 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/SignalProxyMessage.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/SignalProxyMessage.kt
@@ -67,7 +67,5 @@ sealed class SignalProxyMessage {
         else                       -> throw IllegalArgumentException("Invalid MsgType: $type")
       }
     }
-
   }
 }
-
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/message/SyncMessageSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/message/SyncMessageSerializer.kt
index 27f177c3aa02d0bc47e77b612d65048b8bcf7f36..284fe4908f817edcf0c7e6d9a5be3c10a2f0bf0a 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/message/SyncMessageSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/message/SyncMessageSerializer.kt
@@ -1,7 +1,7 @@
 package de.kuschku.libquassel.protocol.message
 
+import de.kuschku.libquassel.protocol.QVariant
 import de.kuschku.libquassel.protocol.QVariantList
-import de.kuschku.libquassel.protocol.QVariant_
 import de.kuschku.libquassel.protocol.Type
 import de.kuschku.libquassel.protocol.primitive.serializer.StringSerializer
 import de.kuschku.libquassel.protocol.value
@@ -11,10 +11,10 @@ import java.nio.ByteBuffer
 
 object SyncMessageSerializer : SignalProxyMessageSerializer<SignalProxyMessage.SyncMessage> {
   override fun serialize(data: SignalProxyMessage.SyncMessage): QVariantList = listOf(
-    QVariant_(RequestType.Sync.value, Type.Int),
-    QVariant_(data.className.serializeString(StringSerializer.UTF8), Type.QByteArray),
-    QVariant_(data.objectName.serializeString(StringSerializer.UTF8), Type.QByteArray),
-    QVariant_(data.slotName.serializeString(StringSerializer.UTF8), Type.QByteArray),
+    QVariant.of(RequestType.Sync.value, Type.Int),
+    QVariant.of(data.className.serializeString(StringSerializer.UTF8), Type.QByteArray),
+    QVariant.of(data.objectName.serializeString(StringSerializer.UTF8), Type.QByteArray),
+    QVariant.of(data.slotName.serializeString(StringSerializer.UTF8), Type.QByteArray),
     *data.params.toTypedArray()
   )
 
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/CharSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/CharSerializer.kt
index aa45a98d109ea1b603f32bc6f35991752dc82fcd..23f92b87f8f75adaaf7436b145e0abb5c9e8dd48 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/CharSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/CharSerializer.kt
@@ -12,7 +12,6 @@ object CharSerializer : Serializer<Char> {
   private val charBufferOut = CharBuffer.allocate(1)
   private val encoder = Charsets.UTF_16BE.newEncoder()
   private val decoder = Charsets.UTF_16BE.newDecoder()
-
   override fun serialize(buffer: ChainedByteBuffer, data: Char, features: QuasselFeatures) {
     charBufferIn.clear()
     charBufferIn.put(data)
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/HandshakeVariantMapSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/HandshakeVariantMapSerializer.kt
index f4da382ef6c12188d0f223cb601d3a3d46ca134e..39ae048b8c95448d94cd820334712cb6056e5aa7 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/HandshakeVariantMapSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/HandshakeVariantMapSerializer.kt
@@ -1,7 +1,7 @@
 package de.kuschku.libquassel.protocol.primitive.serializer
 
+import de.kuschku.libquassel.protocol.QVariant
 import de.kuschku.libquassel.protocol.QVariantMap
-import de.kuschku.libquassel.protocol.QVariant_
 import de.kuschku.libquassel.protocol.Type
 import de.kuschku.libquassel.protocol.value
 import de.kuschku.libquassel.quassel.QuasselFeatures
@@ -12,7 +12,7 @@ object HandshakeVariantMapSerializer : Serializer<QVariantMap> {
   override fun serialize(buffer: ChainedByteBuffer, data: QVariantMap, features: QuasselFeatures) {
     IntSerializer.serialize(buffer, data.size * 2, features)
     data.entries.forEach { (key, value) ->
-      VariantSerializer.serialize(buffer, QVariant_(key, Type.QString), features)
+      VariantSerializer.serialize(buffer, QVariant.of(key, Type.QString), features)
       VariantSerializer.serialize(buffer, value, features)
     }
   }
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/Serializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/Serializer.kt
index b83a10733ecbeac73df45ed26e8a3ddcbb3084e5..a041312055ff5f8fc109f507af8fa5e3fdc36582 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/Serializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/Serializer.kt
@@ -14,7 +14,6 @@
  *  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.primitive.serializer
 
 import de.kuschku.libquassel.quassel.QuasselFeatures
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt
index a9b2ef1d99a779e1384dd33c1d4771ea427966a4..c882f38f8bdf6ef515f4cf906596d9c91992b348 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt
@@ -15,8 +15,7 @@ abstract class StringSerializer(
   private val decoder: CharsetDecoder,
   private val trailingNullBytes: Int
 ) : Serializer<String?> {
-  constructor(charset: Charset,
-              trailingNullByte: Boolean = false) : this(
+  constructor(charset: Charset, trailingNullByte: Boolean = false) : this(
     charset.newEncoder(),
     charset.newDecoder(),
     if (trailingNullByte) {
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantListSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantListSerializer.kt
index c121938b3887f9c565aba27bbd137b2d6647f493..8e6159a44ae9070ae414ef6c47e7b094d8fe88ab 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantListSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantListSerializer.kt
@@ -22,5 +22,4 @@ object VariantListSerializer : Serializer<QVariantList> {
     }
     return result
   }
-
 }
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantMapSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantMapSerializer.kt
index f8d1676f02b18774594d9387876bdba78fde6af2..3a5a68ca93f1a239fefab777be56067869c68abc 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantMapSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantMapSerializer.kt
@@ -24,5 +24,4 @@ object VariantMapSerializer : Serializer<QVariantMap> {
       }.toTypedArray()
     )
   }
-
 }
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantSerializer.kt
index b57221a27ae20571e4163a367b82a708ef46d45a..c55df4dac28839f8bf691a5bfb08045cc3cfe06c 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantSerializer.kt
@@ -7,34 +7,29 @@ import java.nio.ByteBuffer
 
 object VariantSerializer : Serializer<QVariant_> {
   override fun serialize(buffer: ChainedByteBuffer, data: QVariant_, features: QuasselFeatures) {
-    IntSerializer.serialize(buffer, data.type.type.id, features)
+    IntSerializer.serialize(buffer, data.type.id, features)
     BoolSerializer.serialize(buffer, false, features)
-    if (data.type.type == Type.UserType) {
-      StringSerializer.C.serialize(buffer, data.type.name, features)
+    if (data is QVariant.Custom && data.type == Type.UserType) {
+      StringSerializer.C.serialize(buffer, data.qtype.name, features)
     }
-    if (data.type.serializer == null) {
-      throw IllegalArgumentException("Unknown type: ${data.type.name}")
-    }
-    data.type.serializer.serialize(buffer, data.data, features)
+    (data.serializer as Serializer<Any?>).serialize(buffer, data.data, features)
   }
 
   override fun deserialize(buffer: ByteBuffer, features: QuasselFeatures): QVariant_ {
     val rawType = IntSerializer.deserialize(buffer, features)
     val type = Type.of(rawType)
-
     val isNull = BoolSerializer.deserialize(buffer, features)
 
-    val metaType: MetaType<All_> = if (type == Type.UserType) {
-      val deserialize = StringSerializer.C.deserialize(buffer, features)
-      MetaType.get(deserialize)
+    return if (type == Type.UserType) {
+      val name = StringSerializer.C.deserialize(buffer, features)
+      val qType = name?.let(QType.Companion::of)
+                  ?: throw IllegalArgumentException("No such type: $name")
+      val value = qType.serializer.deserialize(buffer, features)
+      QVariant.of<All_>(value, qType)
     } else {
-      MetaType.get(type)
+      val serializer = type?.serializer ?: throw IllegalArgumentException("No such type: $type")
+      val value = serializer.deserialize(buffer, features)
+      QVariant.of<All_>(value, type)
     }
-    if (metaType.serializer == null) {
-      throw IllegalArgumentException("Unknown type: ${metaType.name}")
-    }
-
-    val result = metaType.serializer.deserialize(buffer, features)
-    return QVariant(result, metaType)
   }
 }
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/QuasselFeatures.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/QuasselFeatures.kt
index 6b61e4b66fb5fec39ba513650214a3207ee1f554..6bce7edbe5761f273cd2ddbe6327cce49ea6a1a3 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/QuasselFeatures.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/QuasselFeatures.kt
@@ -5,7 +5,7 @@ import de.kuschku.libquassel.protocol.Legacy_Features
 
 class QuasselFeatures(
   val enabledFeatures: Set<ExtendedFeature>,
-  val unknownFeatures: Set<String>
+  val unknownFeatures: Set<String> = emptySet()
 ) {
   constructor(legacyFeatures: Legacy_Features?, extendedFeatures: Collection<String>) : this(
     legacyFeatures?.enabledValues()?.map(Legacy_Feature::toExtended).orEmpty() union
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/exceptions/DeserializationException.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/exceptions/DeserializationException.kt
new file mode 100644
index 0000000000000000000000000000000000000000..e4fd7384fbc3ef6492e0f717c90028963c0497d2
--- /dev/null
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/exceptions/DeserializationException.kt
@@ -0,0 +1,9 @@
+package de.kuschku.libquassel.quassel.exceptions
+
+class DeserializationException : Exception {
+  constructor() : super()
+  constructor(p0: String?) : super(p0)
+  constructor(p0: String?, p1: Throwable?) : super(p0, p1)
+  constructor(p0: Throwable?) : super(p0)
+  constructor(p0: String?, p1: Throwable?, p2: Boolean, p3: Boolean) : super(p0, p1, p2, p3)
+}
\ No newline at end of file
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/exceptions/MessageHandlingException.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/exceptions/MessageHandlingException.kt
new file mode 100644
index 0000000000000000000000000000000000000000..93f36ceee12c19ba4dca07973389e68626ab83c8
--- /dev/null
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/exceptions/MessageHandlingException.kt
@@ -0,0 +1,16 @@
+package de.kuschku.libquassel.quassel.exceptions
+
+import de.kuschku.libquassel.protocol.message.HandshakeMessage
+import de.kuschku.libquassel.protocol.message.SignalProxyMessage
+
+sealed class MessageHandlingException(cause: Throwable?) : Exception(cause) {
+  class SignalProxy(
+    val source: SignalProxyMessage,
+    cause: Throwable?
+  ) : MessageHandlingException(cause)
+
+  class Handshake(
+    val source: HandshakeMessage,
+    cause: Throwable?
+  ) : MessageHandlingException(cause)
+}
\ No newline at end of file
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/AliasManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/AliasManager.kt
index 6774b96f1454b6861a84305fb591daed51ead52f..146a837f7b05a217d3322a9a76f4e58d9db23209 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/AliasManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/AliasManager.kt
@@ -1,7 +1,7 @@
 package de.kuschku.libquassel.quassel.syncables
 
+import de.kuschku.libquassel.protocol.QVariant
 import de.kuschku.libquassel.protocol.QVariantMap
-import de.kuschku.libquassel.protocol.QVariant_
 import de.kuschku.libquassel.protocol.Type
 import de.kuschku.libquassel.protocol.valueOr
 import de.kuschku.libquassel.quassel.BufferInfo
@@ -16,7 +16,7 @@ class AliasManager constructor(
   proxy: SignalProxy
 ) : SyncableObject(proxy, "AliasManager"), IAliasManager, ISyncableObject {
   override fun toVariantMap(): QVariantMap = mapOf(
-    "Aliases" to QVariant_(initAliases(), Type.QVariantMap)
+    "Aliases" to QVariant.of(initAliases(), Type.QVariantMap)
   )
 
   override fun fromVariantMap(properties: QVariantMap) {
@@ -24,8 +24,8 @@ class AliasManager constructor(
   }
 
   override fun initAliases(): QVariantMap = mapOf(
-    "names" to QVariant_(_aliases.map(Alias::name), Type.QStringList),
-    "expansions" to QVariant_(_aliases.map(Alias::expansion), Type.QStringList)
+    "names" to QVariant.of(_aliases.map(Alias::name), Type.QStringList),
+    "expansions" to QVariant.of(_aliases.map(Alias::expansion), Type.QStringList)
   )
 
   override fun initSetAliases(aliases: QVariantMap) {
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt
index a6497e25dc8fce11f70c391b759e6a1398780e4d..54f9ab51e3df93a55a7bb1b782b45568376d7493 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt
@@ -46,10 +46,10 @@ class BufferSyncer constructor(
   fun liveBufferInfos(): Observable<Map<BufferId, BufferInfo>> = live_bufferInfos
 
   override fun toVariantMap(): QVariantMap = mapOf(
-    "Activities" to QVariant_(initActivities(), Type.QVariantList),
-    "HighlightCounts" to QVariant_(initHighlightCounts(), Type.QVariantList),
-    "LastSeenMsg" to QVariant_(initLastSeenMsg(), Type.QVariantList),
-    "MarkerLines" to QVariant_(initMarkerLines(), Type.QVariantList)
+    "Activities" to QVariant.of(initActivities(), Type.QVariantList),
+    "HighlightCounts" to QVariant.of(initHighlightCounts(), Type.QVariantList),
+    "LastSeenMsg" to QVariant.of(initLastSeenMsg(), Type.QVariantList),
+    "MarkerLines" to QVariant.of(initMarkerLines(), Type.QVariantList)
   )
 
   override fun fromVariantMap(properties: QVariantMap) {
@@ -62,8 +62,8 @@ class BufferSyncer constructor(
   override fun initActivities(): QVariantList {
     val list: MutableList<QVariant_> = mutableListOf()
     for ((key, value) in _bufferActivities) {
-      list.add(QVariant_(key, QType.BufferId))
-      list.add(QVariant_(value, Type.Int))
+      list.add(QVariant.of(key, QType.BufferId))
+      list.add(QVariant.of(value, Type.Int))
     }
     return list
   }
@@ -71,8 +71,8 @@ class BufferSyncer constructor(
   override fun initHighlightCounts(): QVariantList {
     val list: MutableList<QVariant_> = mutableListOf()
     for ((key, value) in _highlightCounts) {
-      list.add(QVariant_(key, QType.BufferId))
-      list.add(QVariant_(value, Type.Int))
+      list.add(QVariant.of(key, QType.BufferId))
+      list.add(QVariant.of(value, Type.Int))
     }
     return list
   }
@@ -80,8 +80,8 @@ class BufferSyncer constructor(
   override fun initLastSeenMsg(): QVariantList {
     val list: MutableList<QVariant_> = mutableListOf()
     for ((key, value) in _bufferActivities) {
-      list.add(QVariant_(key, QType.BufferId))
-      list.add(QVariant_(value, QType.MsgId))
+      list.add(QVariant.of(key, QType.BufferId))
+      list.add(QVariant.of(value, QType.MsgId))
     }
     return list
   }
@@ -89,8 +89,8 @@ class BufferSyncer constructor(
   override fun initMarkerLines(): QVariantList {
     val list: MutableList<QVariant_> = mutableListOf()
     for ((key, value) in _bufferActivities) {
-      list.add(QVariant_(key, QType.BufferId))
-      list.add(QVariant_(value, QType.MsgId))
+      list.add(QVariant.of(key, QType.BufferId))
+      list.add(QVariant.of(value, QType.MsgId))
     }
     return list
   }
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewConfig.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewConfig.kt
index f3f69c2a650d75ae79c69b3537c79905e5649d87..cafcc17dfd4a2137e329a0db8edf61a8f97faddf 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewConfig.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewConfig.kt
@@ -19,9 +19,9 @@ class BufferViewConfig constructor(
   }
 
   override fun toVariantMap(): QVariantMap = mapOf(
-    "BufferList" to QVariant_(initBufferList(), Type.QVariantList),
-    "RemovedBuffers" to QVariant_(initBufferList(), Type.QVariantList),
-    "TemporarilyRemovedBuffers" to QVariant_(initBufferList(), Type.QVariantList)
+    "BufferList" to QVariant.of(initBufferList(), Type.QVariantList),
+    "RemovedBuffers" to QVariant.of(initBufferList(), Type.QVariantList),
+    "TemporarilyRemovedBuffers" to QVariant.of(initBufferList(), Type.QVariantList)
   ) + initProperties()
 
   override fun fromVariantMap(properties: QVariantMap) {
@@ -39,28 +39,28 @@ class BufferViewConfig constructor(
   }
 
   override fun initBufferList(): QVariantList = _buffers.map {
-    QVariant_(it, QType.BufferId)
+    QVariant.of(it, QType.BufferId)
   }
 
   override fun initRemovedBuffers(): QVariantList = _removedBuffers.map {
-    QVariant_(it, QType.BufferId)
+    QVariant.of(it, QType.BufferId)
   }
 
   override fun initTemporarilyRemovedBuffers(): QVariantList = _temporarilyRemovedBuffers.map {
-    QVariant_(it, QType.BufferId)
+    QVariant.of(it, QType.BufferId)
   }
 
   override fun initProperties(): QVariantMap = mapOf(
-    "bufferViewName" to QVariant_(bufferViewName(), Type.QString),
-    "networkId" to QVariant_(networkId(), QType.NetworkId),
-    "addNewBuffersAutomatically" to QVariant_(addNewBuffersAutomatically(), Type.Bool),
-    "sortAlphabetically" to QVariant_(sortAlphabetically(), Type.Bool),
-    "hideInactiveBuffers" to QVariant_(hideInactiveBuffers(), Type.Bool),
-    "hideInactiveNetworks" to QVariant_(hideInactiveNetworks(), Type.Bool),
-    "disableDecoration" to QVariant_(disableDecoration(), Type.Bool),
-    "allowedBufferTypes" to QVariant_(allowedBufferTypes(), Type.Int),
-    "minimumActivity" to QVariant_(minimumActivity(), Type.Int),
-    "showSearch" to QVariant_(showSearch(), Type.Bool)
+    "bufferViewName" to QVariant.of(bufferViewName(), Type.QString),
+    "networkId" to QVariant.of(networkId(), QType.NetworkId),
+    "addNewBuffersAutomatically" to QVariant.of(addNewBuffersAutomatically(), Type.Bool),
+    "sortAlphabetically" to QVariant.of(sortAlphabetically(), Type.Bool),
+    "hideInactiveBuffers" to QVariant.of(hideInactiveBuffers(), Type.Bool),
+    "hideInactiveNetworks" to QVariant.of(hideInactiveNetworks(), Type.Bool),
+    "disableDecoration" to QVariant.of(disableDecoration(), Type.Bool),
+    "allowedBufferTypes" to QVariant.of(allowedBufferTypes(), Type.Int),
+    "minimumActivity" to QVariant.of(minimumActivity(), Type.Int),
+    "showSearch" to QVariant.of(showSearch(), Type.Bool)
   )
 
   override fun initSetBufferList(buffers: QVariantList) {
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewManager.kt
index bf56136b46c27632a0afa8eb89237e88f110a28f..3d479dc2242a112c7b39d5fbb799b744e3021997 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewManager.kt
@@ -13,7 +13,7 @@ class BufferViewManager constructor(
   private val session: ISession
 ) : SyncableObject(proxy, "BufferViewManager"), IBufferViewManager {
   override fun toVariantMap(): QVariantMap = mapOf(
-    "BufferViewIds" to QVariant_(initBufferViewIds(), Type.QVariantList)
+    "BufferViewIds" to QVariant.of(initBufferViewIds(), Type.QVariantList)
   )
 
   override fun fromVariantMap(properties: QVariantMap) {
@@ -21,7 +21,7 @@ class BufferViewManager constructor(
   }
 
   override fun initBufferViewIds(): QVariantList = _bufferViewConfigs.keys.map {
-    QVariant_(it, Type.Int)
+    QVariant.of(it, Type.Int)
   }
 
   fun bufferViewConfig(bufferViewId: Int) = _bufferViewConfigs[bufferViewId]
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/CertManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/CertManager.kt
index 749d5a59490f7f07e8d1a1aff977ca0bd01c9a7b..a35d0cbfa8f62d133b391ce30376dc233c03200f 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/CertManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/CertManager.kt
@@ -20,8 +20,8 @@ class CertManager constructor(
   }
 
   override fun initProperties(): QVariantMap = mapOf(
-    "sslKey" to QVariant_(sslKeyPem(), Type.QByteArray),
-    "sslCert" to QVariant_(sslCertPem(), Type.QByteArray)
+    "sslKey" to QVariant.of(sslKeyPem(), Type.QByteArray),
+    "sslCert" to QVariant.of(sslCertPem(), Type.QByteArray)
   )
 
   override fun initSetProperties(properties: QVariantMap) {
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/CoreInfo.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/CoreInfo.kt
index 528178b7ce022329157cad1b9702f81ce8e855f0..ad2561581d23343fadbfe47f12a13d7513bf5760 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/CoreInfo.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/CoreInfo.kt
@@ -1,7 +1,7 @@
 package de.kuschku.libquassel.quassel.syncables
 
+import de.kuschku.libquassel.protocol.QVariant
 import de.kuschku.libquassel.protocol.QVariantMap
-import de.kuschku.libquassel.protocol.QVariant_
 import de.kuschku.libquassel.protocol.Type
 import de.kuschku.libquassel.protocol.value
 import de.kuschku.libquassel.quassel.syncables.interfaces.ICoreInfo
@@ -17,7 +17,7 @@ class CoreInfo constructor(
   }
 
   override fun initProperties(): QVariantMap = mapOf(
-    "coreData" to QVariant_(coreData(), Type.QVariantMap)
+    "coreData" to QVariant.of(coreData(), Type.QVariantMap)
   )
 
   override fun initSetProperties(properties: QVariantMap) {
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/DccConfig.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/DccConfig.kt
index 9663599c22ce896337650a9f315a75abb7fd2cd2..d682ef607ea8e3f5aac2cf76dc2ad55a621e10d6 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/DccConfig.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/DccConfig.kt
@@ -21,25 +21,25 @@ class DccConfig constructor(
 
   override fun initProperties(): QVariantMap = mapOf(
     /// Whether DCC is enabled
-    "dccEnabled" to QVariant_(isDccEnabled(), Type.Bool),
+    "dccEnabled" to QVariant.of(isDccEnabled(), Type.Bool),
     /// The IP to use for outgoing traffic
-    "outgoingIp" to QVariant_(outgoingIp(), QType.QHostAddress),
+    "outgoingIp" to QVariant.of(outgoingIp(), QType.QHostAddress),
     /// The IP detection mode
-    "ipDetectionMode" to QVariant_(ipDetectionMode(), QType.DccConfig_IpDetectionMode),
+    "ipDetectionMode" to QVariant.of(ipDetectionMode(), QType.DccConfig_IpDetectionMode),
     /// The port range selection mode
-    "portSelectionMode" to QVariant_(portSelectionMode(), QType.DccConfig_PortSelectionMode),
+    "portSelectionMode" to QVariant.of(portSelectionMode(), QType.DccConfig_PortSelectionMode),
     /// Minimum port to use for incoming connections
-    "minPort" to QVariant_(minPort(), Type.UShort),
+    "minPort" to QVariant.of(minPort(), Type.UShort),
     /// Maximum port to use for incoming connections
-    "maxPort" to QVariant_(maxPort(), Type.UShort),
+    "maxPort" to QVariant.of(maxPort(), Type.UShort),
     /// The chunk size to be used
-    "chunkSize" to QVariant_(chunkSize(), Type.Int),
+    "chunkSize" to QVariant.of(chunkSize(), Type.Int),
     /// The timeout for DCC transfers
-    "sendTimeout" to QVariant_(sendTimeout(), Type.Int),
+    "sendTimeout" to QVariant.of(sendTimeout(), Type.Int),
     /// Whether passive (reverse) DCC should be used
-    "usePassiveDcc" to QVariant_(usePassiveDcc(), Type.Bool),
+    "usePassiveDcc" to QVariant.of(usePassiveDcc(), Type.Bool),
     /// Whether fast sending should be used
-    "useFastSend" to QVariant_(useFastSend(), Type.Bool)
+    "useFastSend" to QVariant.of(useFastSend(), Type.Bool)
   )
 
   override fun initSetProperties(properties: QVariantMap) {
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Identity.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Identity.kt
index 3f0152e6e161c2686a11f84ed83c0faf1f0f5db4..953ee32dc5f12760372dbf910c8a7fde7b91c6f9 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Identity.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Identity.kt
@@ -17,25 +17,25 @@ class Identity constructor(
   }
 
   override fun initProperties(): QVariantMap = mapOf(
-    "identityId" to QVariant_(id(), QType.IdentityId),
-    "identityName" to QVariant_(identityName(), Type.QString),
-    "realName" to QVariant_(realName(), Type.QString),
-    "nicks" to QVariant_(nicks(), Type.QStringList),
-    "awayNick" to QVariant_(awayNick(), Type.QString),
-    "awayNickEnabled" to QVariant_(awayNickEnabled(), Type.Bool),
-    "awayReason" to QVariant_(awayReason(), Type.QString),
-    "awayReasonEnabled" to QVariant_(awayReasonEnabled(), Type.Bool),
-    "autoAwayEnabled" to QVariant_(autoAwayEnabled(), Type.Bool),
-    "autoAwayTime" to QVariant_(autoAwayTime(), Type.Int),
-    "autoAwayReason" to QVariant_(autoAwayReason(), Type.QString),
-    "autoAwayReasonEnabled" to QVariant_(autoAwayReasonEnabled(), Type.Bool),
-    "detachAwayEnabled" to QVariant_(detachAwayEnabled(), Type.Bool),
-    "detachAwayReason" to QVariant_(detachAwayReason(), Type.QString),
-    "detachAwayReasonEnabled" to QVariant_(detachAwayReasonEnabled(), Type.Bool),
-    "ident" to QVariant_(ident(), Type.QString),
-    "kickReason" to QVariant_(kickReason(), Type.QString),
-    "partReason" to QVariant_(partReason(), Type.QString),
-    "quitReason" to QVariant_(quitReason(), Type.QString)
+    "identityId" to QVariant.of(id(), QType.IdentityId),
+    "identityName" to QVariant.of(identityName(), Type.QString),
+    "realName" to QVariant.of(realName(), Type.QString),
+    "nicks" to QVariant.of(nicks(), Type.QStringList),
+    "awayNick" to QVariant.of(awayNick(), Type.QString),
+    "awayNickEnabled" to QVariant.of(awayNickEnabled(), Type.Bool),
+    "awayReason" to QVariant.of(awayReason(), Type.QString),
+    "awayReasonEnabled" to QVariant.of(awayReasonEnabled(), Type.Bool),
+    "autoAwayEnabled" to QVariant.of(autoAwayEnabled(), Type.Bool),
+    "autoAwayTime" to QVariant.of(autoAwayTime(), Type.Int),
+    "autoAwayReason" to QVariant.of(autoAwayReason(), Type.QString),
+    "autoAwayReasonEnabled" to QVariant.of(autoAwayReasonEnabled(), Type.Bool),
+    "detachAwayEnabled" to QVariant.of(detachAwayEnabled(), Type.Bool),
+    "detachAwayReason" to QVariant.of(detachAwayReason(), Type.QString),
+    "detachAwayReasonEnabled" to QVariant.of(detachAwayReasonEnabled(), Type.Bool),
+    "ident" to QVariant.of(ident(), Type.QString),
+    "kickReason" to QVariant.of(kickReason(), Type.QString),
+    "partReason" to QVariant.of(partReason(), Type.QString),
+    "quitReason" to QVariant.of(quitReason(), Type.QString)
   )
 
   override fun initSetProperties(properties: QVariantMap) {
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IgnoreListManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IgnoreListManager.kt
index 43b3b8e7cf6cde1e5aba2a489b736d87a740f7f3..8d262696e63fd56e8ed7f5db0fbc8d5ca2920816 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IgnoreListManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IgnoreListManager.kt
@@ -1,7 +1,7 @@
 package de.kuschku.libquassel.quassel.syncables
 
+import de.kuschku.libquassel.protocol.QVariant
 import de.kuschku.libquassel.protocol.QVariantMap
-import de.kuschku.libquassel.protocol.QVariant_
 import de.kuschku.libquassel.protocol.Type
 import de.kuschku.libquassel.protocol.valueOr
 import de.kuschku.libquassel.quassel.syncables.interfaces.IIgnoreListManager
@@ -11,7 +11,7 @@ class IgnoreListManager constructor(
   proxy: SignalProxy
 ) : SyncableObject(proxy, "IgnoreListManager"), IIgnoreListManager {
   override fun toVariantMap(): QVariantMap = mapOf(
-    "IgnoreList" to QVariant_(initIgnoreList(), Type.QVariantMap)
+    "IgnoreList" to QVariant.of(initIgnoreList(), Type.QVariantMap)
   )
 
   override fun fromVariantMap(properties: QVariantMap) {
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt
index 4b9718b1b983ed01e53e94ba6811fa6f62448a9d..d0ad84789721b88c56931717dd4f270a045e3c44 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt
@@ -23,8 +23,8 @@ class IrcChannel(
   }
 
   override fun toVariantMap(): QVariantMap = mapOf(
-    "ChanModes" to QVariant_(initChanModes(), Type.QVariantMap),
-    "UserModes" to QVariant_(initUserModes(), Type.QVariantMap)
+    "ChanModes" to QVariant.of(initChanModes(), Type.QVariantMap),
+    "UserModes" to QVariant.of(initUserModes(), Type.QVariantMap)
   ) + initProperties()
 
   override fun fromVariantMap(properties: QVariantMap) {
@@ -34,33 +34,30 @@ class IrcChannel(
   }
 
   override fun initChanModes(): QVariantMap = mapOf(
-    "A" to QVariant_(
-      _A_channelModes.entries.map { (key, value) ->
-        key to QVariant_(value.toList(), Type.QStringList)
-      }, Type.QVariantMap
+    "A" to QVariant.of(_A_channelModes.entries.map { (key, value) ->
+      key to QVariant.of(value.toList(), Type.QStringList)
+    }, Type.QVariantMap
     ),
-    "B" to QVariant_(
-      _B_channelModes.entries.map { (key, value) ->
-        key to QVariant_(value, Type.QString)
-      }, Type.QVariantMap
+    "B" to QVariant.of(_B_channelModes.entries.map { (key, value) ->
+      key to QVariant.of(value, Type.QString)
+    }, Type.QVariantMap
     ),
-    "C" to QVariant_(
-      _C_channelModes.entries.map { (key, value) ->
-        key to QVariant_(value, Type.QString)
-      }, Type.QVariantMap
+    "C" to QVariant.of(_C_channelModes.entries.map { (key, value) ->
+      key to QVariant.of(value, Type.QString)
+    }, Type.QVariantMap
     ),
-    "D" to QVariant_(_D_channelModes.joinToString(), Type.QString)
+    "D" to QVariant.of(_D_channelModes.joinToString(), Type.QString)
   )
 
   override fun initUserModes(): QVariantMap = _userModes.entries.map { (key, value) ->
-    key.nick() to QVariant_(value, Type.QString)
+    key.nick() to QVariant.of(value, Type.QString)
   }.toMap()
 
   override fun initProperties(): QVariantMap = mapOf(
-    "name" to QVariant_(name(), Type.QString),
-    "topic" to QVariant_(topic(), Type.QString),
-    "password" to QVariant_(password(), Type.QString),
-    "encrypted" to QVariant_(encrypted(), Type.Bool)
+    "name" to QVariant.of(name(), Type.QString),
+    "topic" to QVariant.of(topic(), Type.QString),
+    "password" to QVariant.of(password(), Type.QString),
+    "encrypted" to QVariant.of(encrypted(), Type.Bool)
   )
 
   override fun initSetChanModes(chanModes: QVariantMap) {
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcUser.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcUser.kt
index de37e29f9066557b8dcc238acc75f586ab14ded2..ebda98119e7e4b0aff25a92023b6f9ee05cd83b8 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcUser.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcUser.kt
@@ -1,7 +1,7 @@
 package de.kuschku.libquassel.quassel.syncables
 
+import de.kuschku.libquassel.protocol.QVariant
 import de.kuschku.libquassel.protocol.QVariantMap
-import de.kuschku.libquassel.protocol.QVariant_
 import de.kuschku.libquassel.protocol.Type
 import de.kuschku.libquassel.protocol.valueOr
 import de.kuschku.libquassel.quassel.syncables.interfaces.IIrcUser
@@ -28,24 +28,24 @@ class IrcUser(
   }
 
   override fun initProperties(): QVariantMap = mapOf(
-    "user" to QVariant_(user(), Type.QString),
-    "host" to QVariant_(host(), Type.QString),
-    "nick" to QVariant_(nick(), Type.QString),
-    "realName" to QVariant_(realName(), Type.QString),
-    "account" to QVariant_(account(), Type.QString),
-    "away" to QVariant_(isAway(), Type.Bool),
-    "awayMessage" to QVariant_(awayMessage(), Type.QString),
-    "idleTime" to QVariant_(idleTime(), Type.QDateTime),
-    "loginTime" to QVariant_(loginTime(), Type.QDateTime),
-    "server" to QVariant_(server(), Type.QString),
-    "ircOperator" to QVariant_(ircOperator(), Type.QString),
-    "lastAwayMessage" to QVariant_(lastAwayMessage(), Type.Int),
-    "whoisServiceReply" to QVariant_(whoisServiceReply(), Type.QString),
-    "suserHost" to QVariant_(suserHost(), Type.QString),
-    "encrypted" to QVariant_(encrypted(), Type.Bool),
-
-    "channels" to QVariant_(channels(), Type.QStringList),
-    "userModes" to QVariant_(userModes(), Type.QString)
+    "user" to QVariant.of(user(), Type.QString),
+    "host" to QVariant.of(host(), Type.QString),
+    "nick" to QVariant.of(nick(), Type.QString),
+    "realName" to QVariant.of(realName(), Type.QString),
+    "account" to QVariant.of(account(), Type.QString),
+    "away" to QVariant.of(isAway(), Type.Bool),
+    "awayMessage" to QVariant.of(awayMessage(), Type.QString),
+    "idleTime" to QVariant.of(idleTime(), Type.QDateTime),
+    "loginTime" to QVariant.of(loginTime(), Type.QDateTime),
+    "server" to QVariant.of(server(), Type.QString),
+    "ircOperator" to QVariant.of(ircOperator(), Type.QString),
+    "lastAwayMessage" to QVariant.of(lastAwayMessage(), Type.Int),
+    "whoisServiceReply" to QVariant.of(whoisServiceReply(), Type.QString),
+    "suserHost" to QVariant.of(suserHost(), Type.QString),
+    "encrypted" to QVariant.of(encrypted(), Type.Bool),
+
+    "channels" to QVariant.of(channels(), Type.QStringList),
+    "userModes" to QVariant.of(userModes(), Type.QString)
   )
 
   override fun initSetProperties(properties: QVariantMap) {
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt
index 5bb660f6a79a175b6b52694692b5033a5badef9b..5f6ac0b5b0c09f060758094cee13138d64e5ed06 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt
@@ -33,11 +33,11 @@ class Network constructor(
   }
 
   override fun toVariantMap(): QVariantMap = mapOf(
-    "Caps" to QVariant_(initCaps(), Type.QVariantMap),
-    "CapsEnabled" to QVariant_(initCapsEnabled(), Type.QVariantList),
-    "IrcUsersAndChannels" to QVariant_(initIrcUsersAndChannels(), Type.QVariantMap),
-    "ServerList" to QVariant_(initServerList(), Type.QVariantList),
-    "Supports" to QVariant_(initSupports(), Type.QVariantMap)
+    "Caps" to QVariant.of(initCaps(), Type.QVariantMap),
+    "CapsEnabled" to QVariant.of(initCapsEnabled(), Type.QVariantList),
+    "IrcUsersAndChannels" to QVariant.of(initIrcUsersAndChannels(), Type.QVariantMap),
+    "ServerList" to QVariant.of(initServerList(), Type.QVariantList),
+    "Supports" to QVariant.of(initSupports(), Type.QVariantMap)
   ) + initProperties()
 
   fun isMyNick(nick: String) = myNick().equals(nick, true)
@@ -174,7 +174,7 @@ class Network constructor(
       setCodecForDecoding(Charset.forName(info.codecForDecoding))
     // FIXME compare components
     if (info.serverList.isNotEmpty())
-      setServerList(info.serverList.map { QVariant_(it, QType.Network_Server) })
+      setServerList(info.serverList.map { QVariant.of(it, QType.Network_Server) })
     if (info.useRandomServer != useRandomServer())
       setUseRandomServer(info.useRandomServer)
     if (info.perform != perform())
@@ -682,73 +682,68 @@ class Network constructor(
   }
 
   override fun initSupports(): QVariantMap = _supports.entries.map { (key, value) ->
-    key to QVariant_(value, Type.QString)
+    key to QVariant.of(value, Type.QString)
   }.toMap()
 
   override fun initCaps(): QVariantMap = _caps.entries.map { (key, value) ->
-    key to QVariant_(value, Type.QString)
+    key to QVariant.of(value, Type.QString)
   }.toMap()
 
   override fun initCapsEnabled(): QVariantList = _capsEnabled.map {
-    QVariant_(it, Type.QString)
+    QVariant.of(it, Type.QString)
   }.toList()
 
   override fun initServerList(): QVariantList = _serverList.map {
-    QVariant_(it, QType.Network_Server)
+    QVariant.of(it, QType.Network_Server)
   }.toList()
 
   override fun initIrcUsersAndChannels(): QVariantMap {
     return mapOf(
-      "Users" to QVariant_(
-        _ircUsers.values.map { it.toVariantMap() }.transpose().map {
-          QVariant_(it, Type.QVariantList)
-        }, Type.QVariantMap
+      "Users" to QVariant.of(_ircUsers.values.map { it.toVariantMap() }.transpose().map {
+        QVariant.of(it, Type.QVariantList)
+      }, Type.QVariantMap
       ),
-      "Channels" to QVariant_(
-        _ircChannels.values.map { it.toVariantMap() }.transpose().map {
-          QVariant_(it, Type.QVariantList)
-        }, Type.QVariantMap
+      "Channels" to QVariant.of(_ircChannels.values.map { it.toVariantMap() }.transpose().map {
+        QVariant.of(it, Type.QVariantList)
+      }, Type.QVariantMap
       )
     )
   }
 
   override fun initProperties(): QVariantMap = mapOf(
-    "networkName" to QVariant_(networkName(), Type.QString),
-    "currentServer" to QVariant_(currentServer(), Type.QString),
-    "myNick" to QVariant_(myNick(), Type.QString),
-    "latency" to QVariant_(latency(), Type.Int),
-    "codecForServer" to QVariant_(
-      codecForServer().serializeString(StringSerializer.UTF8),
-      Type.QByteArray
+    "networkName" to QVariant.of(networkName(), Type.QString),
+    "currentServer" to QVariant.of(currentServer(), Type.QString),
+    "myNick" to QVariant.of(myNick(), Type.QString),
+    "latency" to QVariant.of(latency(), Type.Int),
+    "codecForServer" to QVariant.of(codecForServer().serializeString(StringSerializer.UTF8),
+                                    Type.QByteArray
     ),
-    "codecForEncoding" to QVariant_(
-      codecForEncoding().serializeString(StringSerializer.UTF8),
-      Type.QByteArray
+    "codecForEncoding" to QVariant.of(codecForEncoding().serializeString(StringSerializer.UTF8),
+                                      Type.QByteArray
     ),
-    "codecForDecoding" to QVariant_(
-      codecForDecoding().serializeString(StringSerializer.UTF8),
-      Type.QByteArray
+    "codecForDecoding" to QVariant.of(codecForDecoding().serializeString(StringSerializer.UTF8),
+                                      Type.QByteArray
     ),
-    "identityId" to QVariant_(identity(), QType.IdentityId),
-    "isConnected" to QVariant_(isConnected(), Type.Bool),
-    "connectionState" to QVariant_(connectionState(), Type.Int),
-    "useRandomServer" to QVariant_(useRandomServer(), Type.Bool),
-    "perform" to QVariant_(perform(), Type.QStringList),
-    "useAutoIdentify" to QVariant_(useAutoIdentify(), Type.Bool),
-    "autoIdentifyService" to QVariant_(autoIdentifyService(), Type.QString),
-    "autoIdentifyPassword" to QVariant_(autoIdentifyPassword(), Type.QString),
-    "useSasl" to QVariant_(useSasl(), Type.Bool),
-    "saslAccount" to QVariant_(saslAccount(), Type.QString),
-    "saslPassword" to QVariant_(saslPassword(), Type.QString),
-    "useAutoReconnect" to QVariant_(useAutoReconnect(), Type.Bool),
-    "autoReconnectInterval" to QVariant_(autoReconnectInterval(), Type.UInt),
-    "autoReconnectRetries" to QVariant_(autoReconnectRetries(), Type.UShort),
-    "unlimitedReconnectRetries" to QVariant_(unlimitedReconnectRetries(), Type.Bool),
-    "rejoinChannels" to QVariant_(rejoinChannels(), Type.Bool),
-    "useCustomMessageRate" to QVariant_(useCustomMessageRate(), Type.Bool),
-    "msgRateBurstSize" to QVariant_(messageRateBurstSize(), Type.UInt),
-    "msgRateMessageDelay" to QVariant_(messageRateDelay(), Type.UInt),
-    "unlimitedMessageRate" to QVariant_(unlimitedMessageRate(), Type.Bool)
+    "identityId" to QVariant.of(identity(), QType.IdentityId),
+    "isConnected" to QVariant.of(isConnected(), Type.Bool),
+    "connectionState" to QVariant.of(connectionState(), Type.Int),
+    "useRandomServer" to QVariant.of(useRandomServer(), Type.Bool),
+    "perform" to QVariant.of(perform(), Type.QStringList),
+    "useAutoIdentify" to QVariant.of(useAutoIdentify(), Type.Bool),
+    "autoIdentifyService" to QVariant.of(autoIdentifyService(), Type.QString),
+    "autoIdentifyPassword" to QVariant.of(autoIdentifyPassword(), Type.QString),
+    "useSasl" to QVariant.of(useSasl(), Type.Bool),
+    "saslAccount" to QVariant.of(saslAccount(), Type.QString),
+    "saslPassword" to QVariant.of(saslPassword(), Type.QString),
+    "useAutoReconnect" to QVariant.of(useAutoReconnect(), Type.Bool),
+    "autoReconnectInterval" to QVariant.of(autoReconnectInterval(), Type.UInt),
+    "autoReconnectRetries" to QVariant.of(autoReconnectRetries(), Type.UShort),
+    "unlimitedReconnectRetries" to QVariant.of(unlimitedReconnectRetries(), Type.Bool),
+    "rejoinChannels" to QVariant.of(rejoinChannels(), Type.Bool),
+    "useCustomMessageRate" to QVariant.of(useCustomMessageRate(), Type.Bool),
+    "msgRateBurstSize" to QVariant.of(messageRateBurstSize(), Type.UInt),
+    "msgRateMessageDelay" to QVariant.of(messageRateDelay(), Type.UInt),
+    "unlimitedMessageRate" to QVariant.of(unlimitedMessageRate(), Type.Bool)
   )
 
   override fun initSetSupports(supports: QVariantMap) {
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/NetworkConfig.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/NetworkConfig.kt
index eda892ee557dab142d55f75b9b4dde31a2d97a0b..bccb74c55aa8b4f49ed547c7458f9d653ebbcd65 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/NetworkConfig.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/NetworkConfig.kt
@@ -1,7 +1,7 @@
 package de.kuschku.libquassel.quassel.syncables
 
+import de.kuschku.libquassel.protocol.QVariant
 import de.kuschku.libquassel.protocol.QVariantMap
-import de.kuschku.libquassel.protocol.QVariant_
 import de.kuschku.libquassel.protocol.Type
 import de.kuschku.libquassel.protocol.valueOr
 import de.kuschku.libquassel.quassel.syncables.interfaces.INetworkConfig
@@ -21,14 +21,14 @@ class NetworkConfig constructor(
   }
 
   override fun initProperties(): QVariantMap = mapOf(
-    "pingTimeoutEnabled" to QVariant_(pingTimeoutEnabled(), Type.Bool),
-    "pingInterval" to QVariant_(pingInterval(), Type.Int),
-    "maxPingCount" to QVariant_(maxPingCount(), Type.Int),
-    "autoWhoEnabled" to QVariant_(autoWhoEnabled(), Type.Bool),
-    "autoWhoInterval" to QVariant_(autoWhoInterval(), Type.Int),
-    "autoWhoNickLimit" to QVariant_(autoWhoNickLimit(), Type.Int),
-    "autoWhoDelay" to QVariant_(autoWhoDelay(), Type.Int),
-    "standardCtcp" to QVariant_(standardCtcp(), Type.Bool)
+    "pingTimeoutEnabled" to QVariant.of(pingTimeoutEnabled(), Type.Bool),
+    "pingInterval" to QVariant.of(pingInterval(), Type.Int),
+    "maxPingCount" to QVariant.of(maxPingCount(), Type.Int),
+    "autoWhoEnabled" to QVariant.of(autoWhoEnabled(), Type.Bool),
+    "autoWhoInterval" to QVariant.of(autoWhoInterval(), Type.Int),
+    "autoWhoNickLimit" to QVariant.of(autoWhoNickLimit(), Type.Int),
+    "autoWhoDelay" to QVariant.of(autoWhoDelay(), Type.Int),
+    "standardCtcp" to QVariant.of(standardCtcp(), Type.Bool)
   )
 
   override fun initSetProperties(properties: QVariantMap) {
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/INetwork.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/INetwork.kt
index e21882d7f1ee5a8e9ed618bfc8252e7f722f2c64..df3410e34457cc6db1ca899975e958de498136fb 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/INetwork.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/INetwork.kt
@@ -298,18 +298,18 @@ interface INetwork : ISyncableObject {
     val proxyPass: String = ""
   ) {
     fun toVariantMap(): QVariantMap = mapOf(
-      "Host" to QVariant_(host, Type.QString),
-      "Port" to QVariant_(port, Type.UInt),
-      "Password" to QVariant_(password, Type.QString),
-      "UseSSL" to QVariant_(useSsl, Type.Bool),
-      "sslVerify" to QVariant_(sslVerify, Type.Bool),
-      "sslVersion" to QVariant_(sslVersion, Type.Int),
-      "UseProxy" to QVariant_(useProxy, Type.Bool),
-      "ProxyType" to QVariant_(proxyType, Type.Bool),
-      "ProxyHost" to QVariant_(proxyHost, Type.QString),
-      "ProxyPort" to QVariant_(proxyPort, Type.UInt),
-      "ProxyUser" to QVariant_(proxyUser, Type.QString),
-      "ProxyPass" to QVariant_(proxyPass, Type.QString)
+      "Host" to QVariant.of(host, Type.QString),
+      "Port" to QVariant.of(port, Type.UInt),
+      "Password" to QVariant.of(password, Type.QString),
+      "UseSSL" to QVariant.of(useSsl, Type.Bool),
+      "sslVerify" to QVariant.of(sslVerify, Type.Bool),
+      "sslVersion" to QVariant.of(sslVersion, Type.Int),
+      "UseProxy" to QVariant.of(useProxy, Type.Bool),
+      "ProxyType" to QVariant.of(proxyType, Type.Bool),
+      "ProxyHost" to QVariant.of(proxyHost, Type.QString),
+      "ProxyPort" to QVariant.of(proxyPort, Type.UInt),
+      "ProxyUser" to QVariant.of(proxyUser, Type.QString),
+      "ProxyPass" to QVariant.of(proxyPass, Type.QString)
     )
 
     companion object {
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt b/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt
index 90c2f34035c2a8e325e5894e7cd7a3b1c54db0ba..9a0de43cf0d3451e69c3c816367db3e18f7dfdfd 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt
@@ -180,7 +180,7 @@ class CoreConnection(
         }
         dataBuffer.flip()
 
-        handlerService.serialize {
+        handlerService.deserialize {
           when (state.value) {
             ConnectionState.CLOSED    ->
               // Connection closed, do nothing
@@ -195,6 +195,7 @@ class CoreConnection(
       }
     } catch (e: Throwable) {
       log(WARN, TAG, "Error encountered in connection", e)
+      log(WARN, TAG, "Last sent message: ${MessageRunnable.lastSent.get()}")
       close()
     }
   }
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/MessageRunnable.kt b/lib/src/main/java/de/kuschku/libquassel/session/MessageRunnable.kt
index 7f8cf765a1ce03fd6cfd137f7a2cef4818185639..5ac489f341cb4077af93c68043b865cb541919db 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/MessageRunnable.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/MessageRunnable.kt
@@ -8,6 +8,7 @@ import de.kuschku.libquassel.util.helpers.write
 import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import de.kuschku.libquassel.util.nio.WrappedChannel
 import java.nio.ByteBuffer
+import java.util.concurrent.atomic.AtomicReference
 
 class MessageRunnable<T>(
   private val data: T,
@@ -25,8 +26,13 @@ class MessageRunnable<T>(
       channel?.write(sizeBuffer)
       channel?.write(chainedBuffer)
       channel?.flush()
+      lastSent.set(data)
     } catch (e: Throwable) {
       log(WARN, "MessageDispatching", e)
     }
   }
+
+  companion object {
+    val lastSent = AtomicReference<Any>()
+  }
 }
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/ObjectStorage.kt b/lib/src/main/java/de/kuschku/libquassel/session/ObjectStorage.kt
index 5bb8962dfbd1dd0e047eeedf115d68b9607a2777..5cee6a28efcaca47eb8b803e4dd2459483c57a9b 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/ObjectStorage.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/ObjectStorage.kt
@@ -1,7 +1,7 @@
 package de.kuschku.libquassel.session
 
 import de.kuschku.libquassel.protocol.QType
-import de.kuschku.libquassel.protocol.QVariant_
+import de.kuschku.libquassel.protocol.QVariant
 import de.kuschku.libquassel.protocol.Type
 import de.kuschku.libquassel.protocol.message.SignalProxyMessage
 import de.kuschku.libquassel.quassel.exceptions.ObjectNotFoundException
@@ -47,8 +47,8 @@ class ObjectStorage(private val proxy: SignalProxy) {
         SignalProxyMessage.RpcCall(
           "__objectRenamed__",
           listOf(
-            QVariant_(obj.className, Type.QString), QVariant_(new, Type.QString),
-            QVariant_(old, Type.QString)
+            QVariant.of(obj.className, Type.QString), QVariant.of(new, Type.QString),
+            QVariant.of(old, Type.QString)
           )
         )
       )
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/ProtocolHandler.kt b/lib/src/main/java/de/kuschku/libquassel/session/ProtocolHandler.kt
index b04a2ae3a4b696ef8ab2392fd914c2c4946e0161..292dc67be08a23505a79f7a42b7faadaa78274b3 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/ProtocolHandler.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/ProtocolHandler.kt
@@ -1,20 +1,22 @@
 package de.kuschku.libquassel.session
 
-import de.kuschku.libquassel.protocol.QVariant_
+import de.kuschku.libquassel.protocol.QVariantList
 import de.kuschku.libquassel.protocol.message.HandshakeMessage
 import de.kuschku.libquassel.protocol.message.SignalProxyMessage
+import de.kuschku.libquassel.quassel.exceptions.MessageHandlingException
 import de.kuschku.libquassel.quassel.exceptions.ObjectNotFoundException
 import de.kuschku.libquassel.quassel.syncables.RpcHandler
 import de.kuschku.libquassel.quassel.syncables.interfaces.ISyncableObject
 import de.kuschku.libquassel.quassel.syncables.interfaces.invokers.Invokers
 import de.kuschku.libquassel.util.compatibility.LoggingHandler.Companion.log
 import de.kuschku.libquassel.util.compatibility.LoggingHandler.LogLevel.DEBUG
-import de.kuschku.libquassel.util.compatibility.LoggingHandler.LogLevel.WARN
 import org.threeten.bp.Instant
 import java.io.Closeable
 
 @Suppress("LeakingThis")
-abstract class ProtocolHandler : SignalProxy, AuthHandler, Closeable {
+abstract class ProtocolHandler(
+  protected val exceptionHandler: (Throwable) -> Unit
+) : SignalProxy, AuthHandler, Closeable {
   protected var closed = false
 
   private val objectStorage: ObjectStorage = ObjectStorage(this)
@@ -42,7 +44,7 @@ abstract class ProtocolHandler : SignalProxy, AuthHandler, Closeable {
         log(DEBUG, "ProtocolHandler", "No receiver registered for $f")
       }
     } catch (e: Throwable) {
-      log(WARN, "ProtocolHandler", "Error Handling SignalProxyMessage", e)
+      exceptionHandler.invoke(MessageHandlingException.SignalProxy(f, e))
     }
     return true
   }
@@ -55,13 +57,12 @@ abstract class ProtocolHandler : SignalProxy, AuthHandler, Closeable {
         log(DEBUG, "ProtocolHandler", "No receiver registered for $f")
       }
     } catch (e: Throwable) {
-      log(WARN, "ProtocolHandler", "Error Handling HandshakeMessage", e)
+      exceptionHandler.invoke(MessageHandlingException.Handshake(f, e))
     }
     return true
   }
 
   override fun handle(f: SignalProxyMessage.InitData): Boolean {
-    log(DEBUG, "ProtocolHandler", "< $f")
     val obj: ISyncableObject = objectStorage.get(f.className, f.objectName)
                                ?: throw ObjectNotFoundException(f.className, f.objectName)
 
@@ -83,7 +84,7 @@ abstract class ProtocolHandler : SignalProxy, AuthHandler, Closeable {
         try {
           this.handle(it)
         } catch (e: Throwable) {
-          log(WARN, "ProtocolHandler", e)
+          exceptionHandler.invoke(e)
         }
       }
     }
@@ -92,36 +93,32 @@ abstract class ProtocolHandler : SignalProxy, AuthHandler, Closeable {
   open fun onInitStatusChanged(progress: Int, total: Int) {}
 
   override fun handle(f: SignalProxyMessage.SyncMessage): Boolean {
-    log(DEBUG, "ProtocolHandler", "< $f")
-
     val obj = objectStorage.get(f.className, f.objectName) ?: if (isInitializing) {
       syncQueue.add(f)
       return true
-    } else {
-      throw ObjectNotFoundException(f.className, f.objectName)
-    }
+    } else null
 
-    val initQueue = toInit[obj]
-    if (initQueue != null) {
-      initQueue.add(f)
-      return true
-    }
+    obj?.let {
+      val initQueue = toInit[it]
+      if (initQueue != null) {
+        initQueue.add(f)
+        return true
+      }
 
-    val invoker = Invokers.get(f.className)
-                  ?: throw IllegalArgumentException("Invalid classname: ${f.className}")
-    currentCallClass = f.className
-    currentCallInstance = f.objectName
-    currentCallSlot = f.slotName
-    invoker.invoke(obj, f.slotName, f.params)
-    currentCallClass = ""
-    currentCallInstance = ""
-    currentCallSlot = ""
+      val invoker = Invokers.get(f.className)
+                    ?: throw IllegalArgumentException("Invalid classname: ${f.className}")
+      currentCallClass = f.className
+      currentCallInstance = f.objectName
+      currentCallSlot = f.slotName
+      invoker.invoke(it, f.slotName, f.params)
+      currentCallClass = ""
+      currentCallInstance = ""
+      currentCallSlot = ""
+    }
     return true
   }
 
   override fun handle(f: SignalProxyMessage.RpcCall): Boolean {
-    log(DEBUG, "ProtocolHandler", "< $f")
-
     currentCallSlot = f.slotName
     Invokers.RPC?.invoke(rpcHandler, f.slotName, f.params)
     currentCallSlot = ""
@@ -137,13 +134,13 @@ abstract class ProtocolHandler : SignalProxy, AuthHandler, Closeable {
   override fun shouldSync(type: String, instance: String,
                           slot: String): Boolean = type != currentCallClass || slot != currentCallSlot || instance != currentCallInstance
 
-  override fun callSync(type: String, instance: String, slot: String, params: List<QVariant_>) {
+  override fun callSync(type: String, instance: String, slot: String, params: QVariantList) {
     dispatch(SignalProxyMessage.SyncMessage(type, instance, slot, params))
   }
 
   override fun shouldRpc(slot: String): Boolean = slot != currentCallSlot
 
-  override fun callRpc(slot: String, params: List<QVariant_>) {
+  override fun callRpc(slot: String, params: QVariantList) {
     dispatch(SignalProxyMessage.RpcCall(slot, params))
   }
 
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/Session.kt b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
index 04f10cb538277b7e00200d38a28026bfbd1c18cb..07a3af97ad3f3485beb7f55156468d0d2994a4ab 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
@@ -7,9 +7,6 @@ import de.kuschku.libquassel.quassel.ExtendedFeature
 import de.kuschku.libquassel.quassel.QuasselFeatures
 import de.kuschku.libquassel.quassel.syncables.*
 import de.kuschku.libquassel.util.compatibility.HandlerService
-import de.kuschku.libquassel.util.compatibility.LoggingHandler.Companion.log
-import de.kuschku.libquassel.util.compatibility.LoggingHandler.LogLevel.DEBUG
-import de.kuschku.libquassel.util.compatibility.LoggingHandler.LogLevel.INFO
 import io.reactivex.subjects.BehaviorSubject
 import org.threeten.bp.Instant
 import javax.net.ssl.X509TrustManager
@@ -21,8 +18,9 @@ class Session(
   private val handlerService: HandlerService,
   backlogStorage: BacklogStorage,
   private var userData: Pair<String, String>,
-  val disconnectFromCore: () -> Unit
-) : ProtocolHandler(), ISession {
+  val disconnectFromCore: () -> Unit,
+  exceptionHandler: (Throwable) -> Unit
+) : ProtocolHandler(exceptionHandler), ISession {
   override val features = Features(clientData.clientFeatures, QuasselFeatures.empty())
 
   override val sslSession
@@ -152,8 +150,6 @@ class Session(
 
   override fun onInitDone() {
     coreConnection.setState(ConnectionState.CONNECTED)
-    log(INFO, "Session", "Initialization finished")
-
     dispatch(SignalProxyMessage.HeartBeat(Instant.now()))
   }
 
@@ -167,14 +163,11 @@ class Session(
   override fun dispatch(message: SignalProxyMessage) {
     if (closed) return
 
-    log(DEBUG, "Session", "> $message")
     coreConnection.dispatch(message)
   }
 
   override fun dispatch(message: HandshakeMessage) {
     if (closed) return
-
-    log(DEBUG, "Session", "> $message")
     coreConnection.dispatch(message)
   }
 
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt b/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt
index b252dc121d5f1ac1fcaccef5dc11b00865f15c8a..02e993639095ef12b26cdcc8d3b713df5f8c2a0c 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt
@@ -20,7 +20,8 @@ class SessionManager(
   offlineSession: ISession,
   val backlogStorage: BacklogStorage,
   val handlerService: HandlerService,
-  private val disconnectFromCore: () -> Unit
+  private val disconnectFromCore: () -> Unit,
+  private val exceptionHandler: (Throwable) -> Unit
 ) : ISession {
   override val features: Features
     get() = session.or(lastSession).features
@@ -125,7 +126,8 @@ class SessionManager(
         handlerService,
         backlogStorage,
         userData,
-        disconnectFromCore
+        disconnectFromCore,
+        exceptionHandler
       )
     )
   }
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/SignalProxy.kt b/lib/src/main/java/de/kuschku/libquassel/session/SignalProxy.kt
index 474d326d96d7a68ad58dd4f325e922f3af833aa7..b37a93c522af4220ea3291d9ed2ed758d6dac8cd 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/SignalProxy.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/SignalProxy.kt
@@ -2,7 +2,7 @@ package de.kuschku.libquassel.session
 
 import de.kuschku.libquassel.protocol.IdentityId
 import de.kuschku.libquassel.protocol.NetworkId
-import de.kuschku.libquassel.protocol.QVariant_
+import de.kuschku.libquassel.protocol.QVariantList
 import de.kuschku.libquassel.protocol.message.HandshakeMessage
 import de.kuschku.libquassel.protocol.message.SignalProxyMessage
 import de.kuschku.libquassel.quassel.syncables.Identity
@@ -29,8 +29,8 @@ interface SignalProxy {
   fun dispatch(message: SignalProxyMessage)
   fun dispatch(message: HandshakeMessage)
 
-  fun callSync(type: String, instance: String, slot: String, params: List<QVariant_>)
-  fun callRpc(slot: String, params: List<QVariant_>)
+  fun callSync(type: String, instance: String, slot: String, params: QVariantList)
+  fun callRpc(slot: String, params: QVariantList)
 
   fun shouldSync(type: String, instance: String, slot: String): Boolean
   fun shouldRpc(slot: String): Boolean
@@ -49,9 +49,9 @@ interface SignalProxy {
       override fun dispatch(message: SignalProxyMessage) = Unit
       override fun dispatch(message: HandshakeMessage) = Unit
       override fun callSync(type: String, instance: String, slot: String,
-                            params: List<QVariant_>) = Unit
+                            params: QVariantList) = Unit
 
-      override fun callRpc(slot: String, params: List<QVariant_>) = Unit
+      override fun callRpc(slot: String, params: QVariantList) = Unit
       override fun shouldSync(type: String, instance: String, slot: String) = false
       override fun shouldRpc(slot: String) = false
       override fun network(id: NetworkId): Network? = null
diff --git a/lib/src/main/java/de/kuschku/libquassel/util/compatibility/LoggingHandler.kt b/lib/src/main/java/de/kuschku/libquassel/util/compatibility/LoggingHandler.kt
index efc5ab6e3f1986cafc136477c6e5df4378ab7f5f..bcd7977da3be54bc5c0884956b3e428fdc6f68e6 100644
--- a/lib/src/main/java/de/kuschku/libquassel/util/compatibility/LoggingHandler.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/util/compatibility/LoggingHandler.kt
@@ -33,14 +33,17 @@ abstract class LoggingHandler {
   companion object {
     val loggingHandlers: MutableSet<LoggingHandler> = mutableSetOf(JavaLoggingHandler)
 
-    inline fun log(logLevel: LoggingHandler.LogLevel, tag: String, message: String? = null,
-                   throwable: Throwable? = null) {
+    inline fun log(logLevel: LoggingHandler.LogLevel, tag: String, message: String?,
+                   throwable: Throwable?) {
       LoggingHandler.loggingHandlers
         .filter { it.isLoggable(logLevel, tag) }
         .forEach { it.log(logLevel, tag, message, throwable) }
     }
 
-    inline fun log(logLevel: LoggingHandler.LogLevel, tag: String, throwable: Throwable? = null) =
+    inline fun log(logLevel: LoggingHandler.LogLevel, tag: String, throwable: Throwable) =
       log(logLevel, tag, null, throwable)
+
+    inline fun log(logLevel: LoggingHandler.LogLevel, tag: String, message: String) =
+      log(logLevel, tag, message, null)
   }
 }
diff --git a/lib/src/test/java/de/kuschku/libquassel/ConnectionUnitTest.kt b/lib/src/test/java/de/kuschku/libquassel/ConnectionUnitTest.kt
index bf959c7852d03930561fa2a3c1ecc94ec07ef2cc..f2b187560d3262b62963f5131341b843fc507d82 100644
--- a/lib/src/test/java/de/kuschku/libquassel/ConnectionUnitTest.kt
+++ b/lib/src/test/java/de/kuschku/libquassel/ConnectionUnitTest.kt
@@ -1,20 +1,7 @@
 package de.kuschku.libquassel
 
-import de.kuschku.libquassel.protocol.*
-import de.kuschku.libquassel.quassel.LegacyFeature
-import de.kuschku.libquassel.quassel.ProtocolFeature
-import de.kuschku.libquassel.session.BacklogStorage
-import de.kuschku.libquassel.session.Session
-import de.kuschku.libquassel.session.SocketAddress
-import de.kuschku.libquassel.util.compatibility.reference.JavaHandlerService
-import org.junit.BeforeClass
-import org.junit.Test
-import org.threeten.bp.Instant
-import java.security.cert.X509Certificate
-import java.util.logging.LogManager
-import javax.net.ssl.X509TrustManager
-
 class ConnectionUnitTest {
+/*
   companion object {
     @JvmStatic
     @BeforeClass
@@ -55,4 +42,5 @@ class ConnectionUnitTest {
       ) {}
     session.join()
   }
-}
+*/
+}
\ No newline at end of file
diff --git a/lib/src/test/java/de/kuschku/libquassel/SerializerUnitTest.kt b/lib/src/test/java/de/kuschku/libquassel/SerializerUnitTest.kt
index d097fa660e970959d76c03a1f4a1172beaa74830..71ab8fe9251bdc87983f95ba6134718966e64d94 100644
--- a/lib/src/test/java/de/kuschku/libquassel/SerializerUnitTest.kt
+++ b/lib/src/test/java/de/kuschku/libquassel/SerializerUnitTest.kt
@@ -1,8 +1,10 @@
 package de.kuschku.libquassel
 
-import de.kuschku.libquassel.protocol.Quassel_Feature
-import de.kuschku.libquassel.protocol.Quassel_Features
+import de.kuschku.libquassel.protocol.QType
+import de.kuschku.libquassel.protocol.QVariant
+import de.kuschku.libquassel.protocol.Type
 import de.kuschku.libquassel.protocol.primitive.serializer.*
+import de.kuschku.libquassel.quassel.QuasselFeatures
 import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import org.junit.Assert.assertArrayEquals
 import org.junit.Assert.assertEquals
@@ -97,9 +99,89 @@ class SerializerUnitTest {
     assertEquals(0L.inv(), roundTrip(LongSerializer, 0L.inv()))
   }
 
+  @Test
+  fun stringSerializer() {
+    assertEquals("Test", roundTrip(StringSerializer.UTF16, "Test"))
+    assertEquals("Test", roundTrip(StringSerializer.UTF8, "Test"))
+    assertEquals("Test", roundTrip(StringSerializer.C, "Test"))
+  }
+
+  @Test
+  fun variantListSerializer() {
+    val value = listOf(
+      QVariant.of(1, Type.Int),
+      QVariant.of(ByteBuffer.wrap(byteArrayOf(
+        66,
+        97,
+        99,
+        107,
+        108,
+        111,
+        103,
+        77,
+        97,
+        110,
+        97,
+        103,
+        101,
+        114,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0
+      )), Type.QByteArray),
+      QVariant.of(ByteBuffer.wrap(byteArrayOf(
+        114,
+        101,
+        113,
+        117,
+        101,
+        115,
+        116,
+        66,
+        97,
+        99,
+        107,
+        108,
+        111,
+        103,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0,
+        0
+      )), Type.QByteArray),
+      QVariant.of(1873, QType.BufferId),
+      QVariant.of(-1, QType.MsgId),
+      QVariant.of(-1, QType.MsgId),
+      QVariant.of(20, Type.Int),
+      QVariant.of(0, Type.Int)
+    )
+    assert(value == roundTrip(VariantListSerializer, value))
+  }
+
   companion object {
     fun <T> roundTrip(serializer: Serializer<T>, value: T,
-                      features: Quassel_Features = Quassel_Feature.NONE): T {
+                      features: QuasselFeatures = QuasselFeatures.all()): T {
       val chainedBuffer = ChainedByteBuffer(
         direct = false
       )
diff --git a/malheur/src/main/java/de/kuschku/malheur/CrashHandler.kt b/malheur/src/main/java/de/kuschku/malheur/CrashHandler.kt
index ed48026a2890c16057c28c961c9ac4e17712fe58..487462636305f69e50e5f854bee9d4440aa2197c 100644
--- a/malheur/src/main/java/de/kuschku/malheur/CrashHandler.kt
+++ b/malheur/src/main/java/de/kuschku/malheur/CrashHandler.kt
@@ -58,7 +58,7 @@ object CrashHandler {
           val crashFile = File(crashDirectory, "${System.currentTimeMillis()}.json")
           crashFile.createNewFile()
           crashFile.writeText(json)
-          Log.e("Malheur", "Crash report saved: $crashFile")
+          Log.e("Malheur", "Crash report saved: $crashFile", throwable)
           handler.post {
             Toast.makeText(application,
                            "Crash report saved: ${crashFile.name}",