diff --git a/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java b/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java
index 4ae7d95639ec031e7403ea3774bff41507ad12b0..b86050154b18538cdc391f643d81136bb9dbabc8 100644
--- a/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java
+++ b/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java
@@ -101,8 +101,6 @@ public class ProtocolHandler implements IProtocolHandler {
 
     @Subscribe(threadMode = ThreadMode.MAIN)
     public void onEventMainThread(@NonNull SyncFunction packedFunc) {
-        Log.d("ProtocolHandler", String.format("Sync Call: %s::%s(%s, %s)", packedFunc.className, packedFunc.methodName, packedFunc.objectName, packedFunc.params));
-
         try {
             final Object syncable = client.unsafe_getObjectByIdentifier(packedFunc.className, packedFunc.objectName);
 
diff --git a/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatReplySerializer.java b/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatReplySerializer.java
index e8463303704ed90a3222a62a9de3bd950a69c58e..88b60dc69c0b25ad234dd081cbced011aaba8e57 100644
--- a/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatReplySerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatReplySerializer.java
@@ -30,6 +30,7 @@ import java.util.List;
 
 import de.kuschku.libquassel.functions.FunctionType;
 import de.kuschku.libquassel.functions.types.HeartbeatReply;
+import de.kuschku.libquassel.primitives.QMetaType;
 import de.kuschku.libquassel.primitives.types.QVariant;
 
 import static de.kuschku.util.AndroidAssert.assertTrue;
@@ -50,8 +51,8 @@ public class HeartbeatReplySerializer implements FunctionSerializer<HeartbeatRep
     @Override
     public List serialize(@NonNull HeartbeatReply data) {
         return Arrays.asList(
-                new QVariant<>(FunctionType.HEARTBEATREPLY.id),
-                new QVariant<>(data.dateTime)
+                new QVariant<>(QMetaType.Type.Int, FunctionType.HEARTBEATREPLY.id),
+                new QVariant<>(QMetaType.Type.QDateTime, data.dateTime)
         );
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatSerializer.java b/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatSerializer.java
index d2b153f848bec8e71f95f210ed27fafa754571e4..200daa3db6393213f2362debb7beb27832853d99 100644
--- a/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/functions/serializers/HeartbeatSerializer.java
@@ -30,6 +30,7 @@ import java.util.List;
 
 import de.kuschku.libquassel.functions.FunctionType;
 import de.kuschku.libquassel.functions.types.Heartbeat;
+import de.kuschku.libquassel.primitives.QMetaType;
 import de.kuschku.libquassel.primitives.types.QVariant;
 
 import static de.kuschku.util.AndroidAssert.assertTrue;
@@ -50,8 +51,8 @@ public class HeartbeatSerializer implements FunctionSerializer<Heartbeat> {
     @Override
     public List serialize(@NonNull Heartbeat data) {
         return Arrays.asList(
-                new QVariant<>(FunctionType.HEARTBEAT.id),
-                new QVariant<>(data.dateTime)
+                new QVariant<>(QMetaType.Type.Int, FunctionType.HEARTBEAT.id),
+                new QVariant<>(QMetaType.Type.QDateTime, data.dateTime)
         );
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/functions/serializers/InitRequestFunctionSerializer.java b/app/src/main/java/de/kuschku/libquassel/functions/serializers/InitRequestFunctionSerializer.java
index c105b7dbfcd1dd3412844d6539e767f493721dcb..dd714be927c0fc0f8dac2189cdd4370735df33d1 100644
--- a/app/src/main/java/de/kuschku/libquassel/functions/serializers/InitRequestFunctionSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/functions/serializers/InitRequestFunctionSerializer.java
@@ -31,6 +31,7 @@ import de.kuschku.libquassel.functions.FunctionType;
 import de.kuschku.libquassel.functions.types.InitRequestFunction;
 import de.kuschku.libquassel.primitives.types.QVariant;
 
+import static de.kuschku.libquassel.primitives.QMetaType.Type.Int;
 import static de.kuschku.libquassel.primitives.QMetaType.Type.QByteArray;
 import static de.kuschku.util.AndroidAssert.assertNotNull;
 import static de.kuschku.util.AndroidAssert.assertTrue;
@@ -62,7 +63,7 @@ public class InitRequestFunctionSerializer implements FunctionSerializer<InitReq
     @NonNull
     public List serializePacked(@NonNull final InitRequestFunction data) {
         return Lists.newArrayList(
-                new QVariant<>(FunctionType.INITREQUEST.id),
+                new QVariant<>(Int, FunctionType.INITREQUEST.id),
                 new QVariant<>(QByteArray, data.className),
                 new QVariant<>(QByteArray, data.objectName)
         );
diff --git a/app/src/main/java/de/kuschku/libquassel/functions/serializers/PackedRpcCallFunctionSerializer.java b/app/src/main/java/de/kuschku/libquassel/functions/serializers/PackedRpcCallFunctionSerializer.java
index 3667d51d57cefdda03f8bac54deab887dfc23e20..1cd1c9d2d7e2a3d525859e8fcbfa33b89f67bb7b 100644
--- a/app/src/main/java/de/kuschku/libquassel/functions/serializers/PackedRpcCallFunctionSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/functions/serializers/PackedRpcCallFunctionSerializer.java
@@ -51,7 +51,7 @@ public class PackedRpcCallFunctionSerializer implements FunctionSerializer<RpcCa
     @Override
     public List serialize(@NonNull final RpcCallFunction data) {
         final List func = new ArrayList<>();
-        func.add(new QVariant<>(FunctionType.RPCCALL.id));
+        func.add(new QVariant<>(QMetaType.Type.Int, FunctionType.RPCCALL.id));
         func.add(new QVariant<>(QMetaType.Type.QByteArray, data.functionName));
         func.addAll(data.params);
         return func;
diff --git a/app/src/main/java/de/kuschku/libquassel/functions/serializers/PackedSyncFunctionSerializer.java b/app/src/main/java/de/kuschku/libquassel/functions/serializers/PackedSyncFunctionSerializer.java
index adb1ad038c9bf2b0d31f126fcb034c1735dd593e..b71316ab3e3816e8e505481431db51c1090c6973 100644
--- a/app/src/main/java/de/kuschku/libquassel/functions/serializers/PackedSyncFunctionSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/functions/serializers/PackedSyncFunctionSerializer.java
@@ -51,7 +51,7 @@ public class PackedSyncFunctionSerializer<T> implements FunctionSerializer<SyncF
     @Override
     public List serialize(@NonNull final SyncFunction data) {
         final List func = new ArrayList<>();
-        func.add(new QVariant<>(FunctionType.SYNC.id));
+        func.add(new QVariant<>(QMetaType.Type.Int, FunctionType.SYNC.id));
         func.add(new QVariant<>(QMetaType.Type.QByteArray, data.className));
         func.add(new QVariant<>(QMetaType.Type.QByteArray, data.objectName));
         func.add(new QVariant<>(QMetaType.Type.QByteArray, data.methodName));
diff --git a/app/src/main/java/de/kuschku/libquassel/functions/serializers/UnpackedRpcCallFunctionSerializer.java b/app/src/main/java/de/kuschku/libquassel/functions/serializers/UnpackedRpcCallFunctionSerializer.java
index f062de283ff1d126949cb21f2ee23595cad934ca..e28650f0a9028dd658742f024c993281dca5e2a0 100644
--- a/app/src/main/java/de/kuschku/libquassel/functions/serializers/UnpackedRpcCallFunctionSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/functions/serializers/UnpackedRpcCallFunctionSerializer.java
@@ -50,7 +50,7 @@ public class UnpackedRpcCallFunctionSerializer implements FunctionSerializer<Rpc
     @Override
     public List serialize(@NonNull final RpcCallFunction data) {
         final List func = new ArrayList<>();
-        func.add(new QVariant<>(FunctionType.RPCCALL.id));
+        func.add(new QVariant<>(QMetaType.Type.Int, FunctionType.RPCCALL.id));
         func.add(new QVariant<>(QMetaType.Type.QByteArray, data.functionName));
         func.addAll(data.params);
         return func;
diff --git a/app/src/main/java/de/kuschku/libquassel/functions/serializers/UnpackedSyncFunctionSerializer.java b/app/src/main/java/de/kuschku/libquassel/functions/serializers/UnpackedSyncFunctionSerializer.java
index df175b8c1d33a91644508a3e1b97d8d6ab3beb8c..27e9331042e474ae39920c4325d411ef600a29ce 100644
--- a/app/src/main/java/de/kuschku/libquassel/functions/serializers/UnpackedSyncFunctionSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/functions/serializers/UnpackedSyncFunctionSerializer.java
@@ -50,7 +50,7 @@ public class UnpackedSyncFunctionSerializer<T> implements FunctionSerializer<Syn
     @Override
     public List serialize(@NonNull final SyncFunction data) {
         final List func = new ArrayList<>();
-        func.add(new QVariant<>(FunctionType.SYNC.id));
+        func.add(new QVariant<>(QMetaType.Type.Int, FunctionType.SYNC.id));
         func.add(new QVariant<>(QMetaType.Type.QByteArray, data.className));
         func.add(new QVariant<>(QMetaType.Type.QByteArray, data.objectName));
         func.add(new QVariant<>(QMetaType.Type.QByteArray, data.methodName));
diff --git a/app/src/main/java/de/kuschku/libquassel/objects/MessageTypeRegistry.java b/app/src/main/java/de/kuschku/libquassel/objects/MessageTypeRegistry.java
index 2171ea6e95dd8c5267bb289ddb314d991fd5f4b1..5633e9d3f9e0c53c420f9bcf3f26342637016cd6 100644
--- a/app/src/main/java/de/kuschku/libquassel/objects/MessageTypeRegistry.java
+++ b/app/src/main/java/de/kuschku/libquassel/objects/MessageTypeRegistry.java
@@ -37,6 +37,7 @@ import de.kuschku.libquassel.objects.serializers.CoreSetupDataSerializer;
 import de.kuschku.libquassel.objects.serializers.CoreSetupRejectSerializer;
 import de.kuschku.libquassel.objects.serializers.ObjectSerializer;
 import de.kuschku.libquassel.objects.serializers.SessionInitSerializer;
+import de.kuschku.libquassel.primitives.QMetaType;
 import de.kuschku.libquassel.primitives.types.QVariant;
 
 import static de.kuschku.util.AndroidAssert.assertTrue;
@@ -78,7 +79,7 @@ public class MessageTypeRegistry {
         assertTrue(serializerMap.containsKey(data.getClass().getSimpleName()));
 
         final QVariant<Map<String, QVariant>> map = new QVariant<>(serializerMap.get(data.getClass().getSimpleName()).toVariantMap(data));
-        map.data.put("MsgType", new QVariant(data.getClass().getSimpleName()));
+        map.data.put("MsgType", new QVariant(QMetaType.Type.QString, data.getClass().getSimpleName()));
         return map;
     }
 }
diff --git a/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientInitAckSerializer.java b/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientInitAckSerializer.java
index b381cf547cbd2b046d00027a2112c36ec15210bc..ea3725b3e65e7541543f0ec66e3d7db47267a973 100644
--- a/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientInitAckSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientInitAckSerializer.java
@@ -34,6 +34,7 @@ import de.kuschku.libquassel.functions.types.SerializedFunction;
 import de.kuschku.libquassel.functions.types.UnpackedFunction;
 import de.kuschku.libquassel.objects.types.ClientInitAck;
 import de.kuschku.libquassel.objects.types.StorageBackend;
+import de.kuschku.libquassel.primitives.QMetaType;
 import de.kuschku.libquassel.primitives.types.QVariant;
 
 @SuppressWarnings({"unchecked", "ConstantConditions"})
@@ -60,10 +61,10 @@ public class ClientInitAckSerializer implements ObjectSerializer<ClientInitAck>
             }
 
         final Map<String, QVariant<Object>> map = new HashMap<>();
-        map.put("Configured", new QVariant<>(data.Configured));
-        map.put("LoginEnabled", new QVariant<>(data.LoginEnabled));
-        map.put("StorageBackends", new QVariant<>(storageBackends));
-        map.put("CoreFeatures", new QVariant<>(data.CoreFeatures));
+        map.put("Configured", new QVariant<>(QMetaType.Type.Bool, data.Configured));
+        map.put("LoginEnabled", new QVariant<>(QMetaType.Type.Bool, data.LoginEnabled));
+        map.put("StorageBackends", new QVariant<>(QMetaType.Type.QVariantList, storageBackends));
+        map.put("CoreFeatures", new QVariant<>(QMetaType.Type.Int, data.CoreFeatures));
         return map;
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientInitRejectSerializer.java b/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientInitRejectSerializer.java
index 95c66511254cf207bec274dc787795cf6381b4c1..5b861cf7168ec39c07d2ba574091e632e23986c9 100644
--- a/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientInitRejectSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientInitRejectSerializer.java
@@ -30,6 +30,7 @@ import de.kuschku.libquassel.functions.types.PackedFunction;
 import de.kuschku.libquassel.functions.types.SerializedFunction;
 import de.kuschku.libquassel.functions.types.UnpackedFunction;
 import de.kuschku.libquassel.objects.types.ClientInitReject;
+import de.kuschku.libquassel.primitives.QMetaType;
 import de.kuschku.libquassel.primitives.types.QVariant;
 
 @SuppressWarnings({"unchecked", "ConstantConditions"})
@@ -49,7 +50,7 @@ public class ClientInitRejectSerializer implements ObjectSerializer<ClientInitRe
     @Override
     public Map<String, QVariant<Object>> toVariantMap(@NonNull final ClientInitReject data) {
         final Map<String, QVariant<Object>> map = new HashMap<>();
-        map.put("Error", new QVariant<>(data.Error));
+        map.put("Error", new QVariant<>(QMetaType.Type.QString, data.Error));
         return map;
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientInitSerializer.java b/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientInitSerializer.java
index f8f65b1e721dd8e17eca5354d2b9f5041d3b4483..bb0e5aaf9b182074737349553c7226b9e240fa12 100644
--- a/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientInitSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientInitSerializer.java
@@ -30,6 +30,7 @@ import de.kuschku.libquassel.functions.types.PackedFunction;
 import de.kuschku.libquassel.functions.types.SerializedFunction;
 import de.kuschku.libquassel.functions.types.UnpackedFunction;
 import de.kuschku.libquassel.objects.types.ClientInit;
+import de.kuschku.libquassel.primitives.QMetaType;
 import de.kuschku.libquassel.primitives.types.QVariant;
 
 @SuppressWarnings({"unchecked", "ConstantConditions"})
@@ -49,11 +50,11 @@ public class ClientInitSerializer implements ObjectSerializer<ClientInit> {
     @Override
     public Map<String, QVariant<Object>> toVariantMap(@NonNull final ClientInit data) {
         final Map<String, QVariant<Object>> map = new HashMap<>();
-        map.put("ClientDate", new QVariant<>(data.ClientDate));
-        map.put("UseSsl", new QVariant<>(data.UseSsl));
-        map.put("ClientVersion", new QVariant<>(data.ClientVersion));
-        map.put("UseCompression", new QVariant<>(data.UseCompression));
-        map.put("ProtocolVersion", new QVariant<>(data.ProtocolVersion));
+        map.put("ClientDate", new QVariant<>(QMetaType.Type.QString, data.ClientDate));
+        map.put("UseSsl", new QVariant<>(QMetaType.Type.Bool, data.UseSsl));
+        map.put("ClientVersion", new QVariant<>(QMetaType.Type.QString, data.ClientVersion));
+        map.put("UseCompression", new QVariant<>(QMetaType.Type.Bool, data.UseCompression));
+        map.put("ProtocolVersion", new QVariant<>(QMetaType.Type.Int, data.ProtocolVersion));
         return map;
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientLoginRejectSerializer.java b/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientLoginRejectSerializer.java
index 856bfe7f1ad4f149f4b1fb314eccdfdb2b679bda..2c45e0aa612c6f5d72617ccd4f9f96c137f990a2 100644
--- a/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientLoginRejectSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientLoginRejectSerializer.java
@@ -30,6 +30,7 @@ import de.kuschku.libquassel.functions.types.PackedFunction;
 import de.kuschku.libquassel.functions.types.SerializedFunction;
 import de.kuschku.libquassel.functions.types.UnpackedFunction;
 import de.kuschku.libquassel.objects.types.ClientLoginReject;
+import de.kuschku.libquassel.primitives.QMetaType;
 import de.kuschku.libquassel.primitives.types.QVariant;
 
 import static de.kuschku.util.AndroidAssert.assertNotNull;
@@ -53,7 +54,7 @@ public class ClientLoginRejectSerializer implements ObjectSerializer<ClientLogin
         final Map<String, QVariant<Object>> map = new HashMap<>();
         assertNotNull(map);
 
-        map.put("Error", new QVariant<>(data.Error));
+        map.put("Error", new QVariant<>(QMetaType.Type.QString, data.Error));
         return map;
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientLoginSerializer.java b/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientLoginSerializer.java
index 1e737af40cd55ff132c6f265ec28fde1d4c3e682..f08d8826af2ac3f79dbf795ba989b5a5fe456c1d 100644
--- a/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientLoginSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/objects/serializers/ClientLoginSerializer.java
@@ -30,6 +30,7 @@ import de.kuschku.libquassel.functions.types.PackedFunction;
 import de.kuschku.libquassel.functions.types.SerializedFunction;
 import de.kuschku.libquassel.functions.types.UnpackedFunction;
 import de.kuschku.libquassel.objects.types.ClientLogin;
+import de.kuschku.libquassel.primitives.QMetaType;
 import de.kuschku.libquassel.primitives.types.QVariant;
 
 import static de.kuschku.util.AndroidAssert.assertNotNull;
@@ -52,8 +53,8 @@ public class ClientLoginSerializer implements ObjectSerializer<ClientLogin> {
     public Map<String, QVariant<Object>> toVariantMap(@NonNull final ClientLogin data) {
         final Map<String, QVariant<Object>> map = new HashMap<>();
 
-        map.put("User", new QVariant<>(data.User));
-        map.put("Password", new QVariant<>(data.Password));
+        map.put("User", new QVariant<>(QMetaType.Type.QString, data.User));
+        map.put("Password", new QVariant<>(QMetaType.Type.QString, data.Password));
         return map;
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/objects/serializers/CoreSetupDataSerializer.java b/app/src/main/java/de/kuschku/libquassel/objects/serializers/CoreSetupDataSerializer.java
index 703597f1662b2eb75b821783034844a46266ddd3..f268b17abe5d5e320691a1447dc2efe8f3635fc5 100644
--- a/app/src/main/java/de/kuschku/libquassel/objects/serializers/CoreSetupDataSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/objects/serializers/CoreSetupDataSerializer.java
@@ -30,6 +30,7 @@ import de.kuschku.libquassel.functions.types.PackedFunction;
 import de.kuschku.libquassel.functions.types.SerializedFunction;
 import de.kuschku.libquassel.functions.types.UnpackedFunction;
 import de.kuschku.libquassel.objects.types.CoreSetupData;
+import de.kuschku.libquassel.primitives.QMetaType;
 import de.kuschku.libquassel.primitives.types.QVariant;
 
 import static de.kuschku.util.AndroidAssert.assertNotNull;
@@ -51,7 +52,7 @@ public class CoreSetupDataSerializer implements ObjectSerializer<CoreSetupData>
     @Override
     public Map<String, QVariant<Object>> toVariantMap(@NonNull final CoreSetupData data) {
         final Map<String, QVariant<Object>> map = new HashMap<>();
-        map.put("SetupData", new QVariant<>(SetupDataInitializer.get().toVariantMap(data.SetupData)));
+        map.put("SetupData", new QVariant<>(QMetaType.Type.QVariantMap, SetupDataInitializer.get().toVariantMap(data.SetupData)));
         return map;
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/objects/serializers/CoreSetupRejectSerializer.java b/app/src/main/java/de/kuschku/libquassel/objects/serializers/CoreSetupRejectSerializer.java
index b03a1f82707712b2ce6aa074e104d187ca19e973..adb24bf870c81367540feeb9f1518f661c46a79f 100644
--- a/app/src/main/java/de/kuschku/libquassel/objects/serializers/CoreSetupRejectSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/objects/serializers/CoreSetupRejectSerializer.java
@@ -30,6 +30,7 @@ import de.kuschku.libquassel.functions.types.PackedFunction;
 import de.kuschku.libquassel.functions.types.SerializedFunction;
 import de.kuschku.libquassel.functions.types.UnpackedFunction;
 import de.kuschku.libquassel.objects.types.CoreSetupReject;
+import de.kuschku.libquassel.primitives.QMetaType;
 import de.kuschku.libquassel.primitives.types.QVariant;
 
 import static de.kuschku.util.AndroidAssert.assertNotNull;
@@ -51,7 +52,7 @@ public class CoreSetupRejectSerializer implements ObjectSerializer<CoreSetupReje
     @Override
     public Map<String, QVariant<Object>> toVariantMap(@NonNull final CoreSetupReject data) {
         final Map<String, QVariant<Object>> map = new HashMap<>();
-        map.put("Error", new QVariant<>(data.Error));
+        map.put("Error", new QVariant<>(QMetaType.Type.QString, data.Error));
         return map;
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/objects/serializers/NetworkServerSerializer.java b/app/src/main/java/de/kuschku/libquassel/objects/serializers/NetworkServerSerializer.java
index 66f622dda62f6e132fcd54302c4e8ecc1bd17f1f..0b0d94e7f78531e79a92aa13c8bd8e69a8e1ca22 100644
--- a/app/src/main/java/de/kuschku/libquassel/objects/serializers/NetworkServerSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/objects/serializers/NetworkServerSerializer.java
@@ -30,6 +30,7 @@ import de.kuschku.libquassel.functions.types.PackedFunction;
 import de.kuschku.libquassel.functions.types.SerializedFunction;
 import de.kuschku.libquassel.functions.types.UnpackedFunction;
 import de.kuschku.libquassel.objects.types.NetworkServer;
+import de.kuschku.libquassel.primitives.QMetaType;
 import de.kuschku.libquassel.primitives.types.QVariant;
 
 import static de.kuschku.util.AndroidAssert.assertNotNull;
@@ -52,17 +53,17 @@ public class NetworkServerSerializer implements ObjectSerializer<NetworkServer>
     public Map<String, QVariant<Object>> toVariantMap(@NonNull NetworkServer data) {
         final Map<String, QVariant<Object>> map = new HashMap<>();
 
-        map.put("UseSSL", new QVariant<>(data.UseSSL));
-        map.put("sslVersion", new QVariant<>(data.sslVersion));
-        map.put("Host", new QVariant<>(data.Host));
-        map.put("Port", new QVariant<>(data.Port));
-        map.put("Password", new QVariant<>(data.Password));
-        map.put("UseProxy", new QVariant<>(data.UseProxy));
-        map.put("ProxyType", new QVariant<>(data.ProxyType));
-        map.put("ProxyHost", new QVariant<>(data.ProxyHost));
-        map.put("ProxyPort", new QVariant<>(data.ProxyPort));
-        map.put("ProxyUser", new QVariant<>(data.ProxyUser));
-        map.put("ProxyPass", new QVariant<>(data.ProxyPass));
+        map.put("UseSSL", new QVariant<>(QMetaType.Type.Bool, data.UseSSL));
+        map.put("sslVersion", new QVariant<>(QMetaType.Type.Int, data.sslVersion));
+        map.put("Host", new QVariant<>(QMetaType.Type.QString, data.Host));
+        map.put("Port", new QVariant<>(QMetaType.Type.Int, data.Port));
+        map.put("Password", new QVariant<>(QMetaType.Type.QString, data.Password));
+        map.put("UseProxy", new QVariant<>(QMetaType.Type.Bool, data.UseProxy));
+        map.put("ProxyType", new QVariant<>(QMetaType.Type.Int, data.ProxyType));
+        map.put("ProxyHost", new QVariant<>(QMetaType.Type.QString, data.ProxyHost));
+        map.put("ProxyPort", new QVariant<>(QMetaType.Type.Int, data.ProxyPort));
+        map.put("ProxyUser", new QVariant<>(QMetaType.Type.QString, data.ProxyUser));
+        map.put("ProxyPass", new QVariant<>(QMetaType.Type.QString, data.ProxyPass));
         return map;
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/objects/serializers/SessionInitSerializer.java b/app/src/main/java/de/kuschku/libquassel/objects/serializers/SessionInitSerializer.java
index d6f2a7469f9616f06d81268e68a98092906bc0c4..b0421697bf2e857a0d9077f09ba1c95db387e86d 100644
--- a/app/src/main/java/de/kuschku/libquassel/objects/serializers/SessionInitSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/objects/serializers/SessionInitSerializer.java
@@ -30,6 +30,7 @@ import de.kuschku.libquassel.functions.types.PackedFunction;
 import de.kuschku.libquassel.functions.types.SerializedFunction;
 import de.kuschku.libquassel.functions.types.UnpackedFunction;
 import de.kuschku.libquassel.objects.types.SessionInit;
+import de.kuschku.libquassel.primitives.QMetaType;
 import de.kuschku.libquassel.primitives.types.QVariant;
 
 @SuppressWarnings({"unchecked", "ConstantConditions"})
@@ -49,7 +50,7 @@ public class SessionInitSerializer implements ObjectSerializer<SessionInit> {
     @Override
     public Map<String, QVariant<Object>> toVariantMap(@NonNull final SessionInit data) {
         final Map<String, QVariant<Object>> map = new HashMap<>();
-        map.put("SessionState", new QVariant<>(SessionStateSerializer.get().toVariantMap(data.SessionState)));
+        map.put("SessionState", new QVariant<>(QMetaType.Type.QVariantMap, SessionStateSerializer.get().toVariantMap(data.SessionState)));
         return map;
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/objects/serializers/SetupDataInitializer.java b/app/src/main/java/de/kuschku/libquassel/objects/serializers/SetupDataInitializer.java
index 6b9ab09fe45cb4391cc65c76c46e80b6ac1668f8..a86ae2d90e1d1e3d9bb0f6300985673ea317d034 100644
--- a/app/src/main/java/de/kuschku/libquassel/objects/serializers/SetupDataInitializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/objects/serializers/SetupDataInitializer.java
@@ -30,6 +30,7 @@ import de.kuschku.libquassel.functions.types.PackedFunction;
 import de.kuschku.libquassel.functions.types.SerializedFunction;
 import de.kuschku.libquassel.functions.types.UnpackedFunction;
 import de.kuschku.libquassel.objects.types.SetupData;
+import de.kuschku.libquassel.primitives.QMetaType;
 import de.kuschku.libquassel.primitives.types.QVariant;
 
 import static de.kuschku.util.AndroidAssert.assertNotNull;
@@ -52,10 +53,10 @@ public class SetupDataInitializer implements ObjectSerializer<SetupData> {
     public Map<String, QVariant<Object>> toVariantMap(@NonNull final SetupData data) {
         final Map<String, QVariant<Object>> map = new HashMap<>();
 
-        map.put("AdminPasswd", new QVariant<>(data.AdminPasswd));
-        map.put("AdminUser", new QVariant<>(data.AdminUser));
-        map.put("Backend", new QVariant<>(data.Backend));
-        map.put("ConnectionProperties", new QVariant<>(data.ConnectionProperties));
+        map.put("AdminPasswd", new QVariant<>(QMetaType.Type.QString, data.AdminPasswd));
+        map.put("AdminUser", new QVariant<>(QMetaType.Type.QString, data.AdminUser));
+        map.put("Backend", new QVariant<>(QMetaType.Type.QString, data.Backend));
+        map.put("ConnectionProperties", new QVariant<>(QMetaType.Type.QVariantMap, data.ConnectionProperties));
         return map;
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/objects/serializers/StorageBackendSerializer.java b/app/src/main/java/de/kuschku/libquassel/objects/serializers/StorageBackendSerializer.java
index 5146ef205dcb1efba57218fd7e16c73ac7a79fbb..9150c045a32ae029189809c927a2f324d9f135fa 100644
--- a/app/src/main/java/de/kuschku/libquassel/objects/serializers/StorageBackendSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/objects/serializers/StorageBackendSerializer.java
@@ -31,6 +31,7 @@ import de.kuschku.libquassel.functions.types.PackedFunction;
 import de.kuschku.libquassel.functions.types.SerializedFunction;
 import de.kuschku.libquassel.functions.types.UnpackedFunction;
 import de.kuschku.libquassel.objects.types.StorageBackend;
+import de.kuschku.libquassel.primitives.QMetaType;
 import de.kuschku.libquassel.primitives.types.QVariant;
 
 import static de.kuschku.util.AndroidAssert.assertNotNull;
@@ -53,10 +54,10 @@ public class StorageBackendSerializer implements ObjectSerializer<StorageBackend
     public Map<String, QVariant<Object>> toVariantMap(@NonNull final StorageBackend data) {
         final Map<String, QVariant<Object>> map = new HashMap<>();
 
-        map.put("DisplayName", new QVariant<>(data.DisplayName));
-        map.put("SetupDefaults", new QVariant<>(data.SetupDefaults));
-        map.put("Description", new QVariant<>(data.Description));
-        map.put("SetupKeys", new QVariant<>(data.SetupKeys));
+        map.put("DisplayName", new QVariant<>(QMetaType.Type.QString, data.DisplayName));
+        map.put("SetupDefaults", new QVariant<>(QMetaType.Type.QVariantMap, data.SetupDefaults));
+        map.put("Description", new QVariant<>(QMetaType.Type.QString, data.Description));
+        map.put("SetupKeys", new QVariant<>(QMetaType.Type.QStringList, data.SetupKeys));
         return map;
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/QMetaTypeRegistry.java b/app/src/main/java/de/kuschku/libquassel/primitives/QMetaTypeRegistry.java
index 8d2d88e360cde110596a404e42a8bb23d2e16405..9b92775c0a4f41185c52a0aabbf5052916527330 100644
--- a/app/src/main/java/de/kuschku/libquassel/primitives/QMetaTypeRegistry.java
+++ b/app/src/main/java/de/kuschku/libquassel/primitives/QMetaTypeRegistry.java
@@ -60,6 +60,8 @@ import de.kuschku.libquassel.primitives.serializers.VoidSerializer;
 import de.kuschku.libquassel.primitives.types.BufferInfo;
 import de.kuschku.libquassel.primitives.types.QVariant;
 import de.kuschku.libquassel.syncables.serializers.IdentitySerializer;
+import de.kuschku.libquassel.syncables.serializers.NetworkInfoSerializer;
+import de.kuschku.libquassel.syncables.types.impl.NetworkInfo;
 import de.kuschku.libquassel.syncables.types.interfaces.QIdentity;
 
 import static de.kuschku.util.AndroidAssert.assertNotNull;
@@ -82,8 +84,9 @@ public class QMetaTypeRegistry {
         addType(long.class, QMetaType.Type.UserType, "PeerPtr", LongSerializer.get());
         addType(BufferInfo.class, QMetaType.Type.UserType, "BufferInfo", BufferInfoSerializer.get());
         addType(Message.class, QMetaType.Type.UserType, "Message", MessageSerializer.get());
-        addType(QIdentity.class, QMetaType.Type.UserType, "Identity", new UserTypeSerializer<>(IdentitySerializer.get()));
-        addType(NetworkServer.class, QMetaType.Type.UserType, "Network::Server", new UserTypeSerializer<>(NetworkServerSerializer.get()));
+        addType(QIdentity.class, QMetaType.Type.UserType, "Identity", new UserTypeSerializer<>(IdentitySerializer.get(), "Identity"));
+        addType(NetworkServer.class, QMetaType.Type.UserType, "Network::Server", new UserTypeSerializer<>(NetworkServerSerializer.get(), "Network::Server"));
+        addType(NetworkInfo.class, QMetaType.Type.UserType, "NetworkInfo", new UserTypeSerializer<>(NetworkInfoSerializer.get(), "NetworkInfo"));
         addType(int.class, QMetaType.Type.UInt, IntSerializer.get());
         addType(short.class, QMetaType.Type.UShort, ShortSerializer.get());
 
@@ -285,6 +288,8 @@ public class QMetaTypeRegistry {
             return getMetaTypeByType(QMetaType.Type.QVariant);
         else if (type instanceof Message) return stringSerializerMap.get("Message");
         else if (type instanceof BufferInfo) return stringSerializerMap.get("BufferInfo");
+        else if (type instanceof NetworkInfo) return stringSerializerMap.get("NetworkInfo");
+        else if (type instanceof NetworkServer) return stringSerializerMap.get("Network::Server");
         else
             throw new AssertionError("Unsupported data type: " + type.getClass().getSimpleName());
     }
diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/ByteArraySerializer.java b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/ByteArraySerializer.java
index 77a710270d0c5db999230e37c1acf9a59e709dcf..f4bd4e4de118e0d81ed3f921fba39daa958a7ea6 100644
--- a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/ByteArraySerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/ByteArraySerializer.java
@@ -23,6 +23,7 @@ package de.kuschku.libquassel.primitives.serializers;
 
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.util.Log;
 
 import com.google.common.base.Charsets;
 
@@ -55,7 +56,7 @@ public class ByteArraySerializer implements PrimitiveSerializer<String> {
     @Override
     public void serialize(@NonNull final ByteChannel channel, @Nullable final String data) throws IOException {
         if (data == null) {
-            IntSerializer.get().serialize(channel, 0xffffffff);
+            IntSerializer.get().serialize(channel, -1);
         } else {
             final ByteBuffer contentBuffer = Charsets.ISO_8859_1.encode(data);
             IntSerializer.get().serialize(channel, contentBuffer.limit() + (trimLastByte ? 1 : 0));
@@ -68,7 +69,7 @@ public class ByteArraySerializer implements PrimitiveSerializer<String> {
     @Override
     public String deserialize(@NonNull final ByteBuffer buffer) throws IOException {
         final int len = IntSerializer.get().deserialize(buffer);
-        if (len == 0xffffffff)
+        if (len == -1)
             return null;
         else if (len == 0)
             return "";
diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/UserTypeSerializer.java b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/UserTypeSerializer.java
index bd7e0d6806b3c1d3ddb530f49febd10a6a676dc3..fa637e5ca2b24fed39c9b3ae19e5dc595965c356 100644
--- a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/UserTypeSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/UserTypeSerializer.java
@@ -29,6 +29,7 @@ import java.nio.channels.ByteChannel;
 import java.util.Map;
 
 import de.kuschku.libquassel.objects.serializers.ObjectSerializer;
+import de.kuschku.libquassel.primitives.QMetaType;
 import de.kuschku.libquassel.primitives.types.QVariant;
 
 import static de.kuschku.util.AndroidAssert.assertNotNull;
@@ -37,17 +38,18 @@ import static de.kuschku.util.AndroidAssert.assertNotNull;
 public class UserTypeSerializer<T> implements PrimitiveSerializer<T> {
     @NonNull
     private final ObjectSerializer<T> objectSerializer;
+    private final String type;
 
-    public UserTypeSerializer(@NonNull ObjectSerializer<T> objectSerializer) {
+    public UserTypeSerializer(@NonNull ObjectSerializer<T> objectSerializer, String type) {
         this.objectSerializer = objectSerializer;
+        this.type = type;
     }
 
     @Override
     public void serialize(@NonNull ByteChannel channel, @NonNull T data) throws IOException {
-        QVariant<Map<String, QVariant<Object>>> variantMap = new QVariant<>(objectSerializer.toVariantMap(data));
+        Map<String, QVariant<Object>> variantMap = objectSerializer.toVariantMap(data);
         assertNotNull(variantMap);
-
-        VariantSerializer.<Map<String, QVariant<Object>>>get().serialize(channel, variantMap);
+        VariantMapSerializer.get().serialize(channel, variantMap);
     }
 
     @SuppressWarnings("RedundantCast")
diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/VariantMapSerializer.java b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/VariantMapSerializer.java
index 8c0a745aaa62b1404eab11c972185cd6da9a5fd0..202e69a8b3a837a95ba256365e51c6d8b92a1556 100644
--- a/app/src/main/java/de/kuschku/libquassel/primitives/serializers/VariantMapSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/primitives/serializers/VariantMapSerializer.java
@@ -22,6 +22,7 @@
 package de.kuschku.libquassel.primitives.serializers;
 
 import android.support.annotation.NonNull;
+import android.util.Log;
 
 import java.io.IOException;
 import java.nio.ByteBuffer;
diff --git a/app/src/main/java/de/kuschku/libquassel/protocols/LegacyPeer.java b/app/src/main/java/de/kuschku/libquassel/protocols/LegacyPeer.java
index 29264c056c517a665f2f1f596ff3184dbf7165c1..002610dc44a70d9b322aea9157a80a5abc75f9ba 100644
--- a/app/src/main/java/de/kuschku/libquassel/protocols/LegacyPeer.java
+++ b/app/src/main/java/de/kuschku/libquassel/protocols/LegacyPeer.java
@@ -103,35 +103,35 @@ public class LegacyPeer implements RemotePeer {
     public void onEventBackgroundThread(@NonNull RpcCallFunction func) {
         assertNotNull(connection.getOutputExecutor());
         connection.getOutputExecutor().submit(new OutputRunnable<>(VariantSerializer.get(),
-                new QVariant<>(UnpackedRpcCallFunctionSerializer.get().serialize(func))));
+                new QVariant<>(QVariantList, UnpackedRpcCallFunctionSerializer.get().serialize(func))));
     }
 
     @Subscribe(threadMode = ThreadMode.BACKGROUND)
     public void onEventBackgroundThread(@NonNull InitRequestFunction func) {
         assertNotNull(connection.getOutputExecutor());
         connection.getOutputExecutor().submit(new OutputRunnable<>(VariantSerializer.get(),
-                new QVariant<>(InitRequestFunctionSerializer.get().serialize(func))));
+                new QVariant<>(QVariantList, InitRequestFunctionSerializer.get().serialize(func))));
     }
 
     @Subscribe(threadMode = ThreadMode.BACKGROUND)
     public void onEventBackgroundThread(@NonNull InitDataFunction func) {
         assertNotNull(connection.getOutputExecutor());
         connection.getOutputExecutor().submit(new OutputRunnable<>(VariantSerializer.get(),
-                new QVariant<>(InitDataFunctionSerializer.get().serialize(func))));
+                new QVariant<>(QVariantList, InitDataFunctionSerializer.get().serialize(func))));
     }
 
     @Subscribe(threadMode = ThreadMode.BACKGROUND)
     public void onEventBackgroundThread(@NonNull Heartbeat func) {
         assertNotNull(connection.getOutputExecutor());
         connection.getOutputExecutor().submit(new OutputRunnable<>(VariantSerializer.get(),
-                new QVariant<>(HeartbeatSerializer.get().serialize(func))));
+                new QVariant<>(QVariantList, HeartbeatSerializer.get().serialize(func))));
     }
 
     @Subscribe(threadMode = ThreadMode.BACKGROUND)
     public void onEventBackgroundThread(@NonNull HeartbeatReply func) {
         assertNotNull(connection.getOutputExecutor());
         connection.getOutputExecutor().submit(new OutputRunnable<>(VariantSerializer.get(),
-                new QVariant<>(HeartbeatReplySerializer.get().serialize(func))));
+                new QVariant<>(QVariantList, HeartbeatReplySerializer.get().serialize(func))));
     }
 
     @Subscribe(threadMode = ThreadMode.BACKGROUND)
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/AliasManagerSerializer.java b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/AliasManagerSerializer.java
index 79ebc3f45f2cdb7ff44842ab7b0de276f1beb83c..9d0b8ca5326064152a9e572b2afb0b3040922ac8 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/AliasManagerSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/AliasManagerSerializer.java
@@ -33,6 +33,7 @@ import de.kuschku.libquassel.functions.types.PackedFunction;
 import de.kuschku.libquassel.functions.types.SerializedFunction;
 import de.kuschku.libquassel.functions.types.UnpackedFunction;
 import de.kuschku.libquassel.objects.serializers.ObjectSerializer;
+import de.kuschku.libquassel.primitives.QMetaType;
 import de.kuschku.libquassel.primitives.types.QVariant;
 import de.kuschku.libquassel.syncables.types.impl.AliasManager;
 import de.kuschku.libquassel.syncables.types.interfaces.QAliasManager;
@@ -63,11 +64,11 @@ public class AliasManagerSerializer implements ObjectSerializer<AliasManager> {
             names.add(alias.name);
             expansions.add(alias.expansion);
         }
-        aliases.put("names", new QVariant(names));
-        aliases.put("expansions", new QVariant(expansions));
+        aliases.put("names", new QVariant(QMetaType.Type.QStringList, names));
+        aliases.put("expansions", new QVariant(QMetaType.Type.QStringList, expansions));
 
         HashMap<String, QVariant<Object>> map = new HashMap<>();
-        map.put("Aliases", new QVariant(aliases));
+        map.put("Aliases", new QVariant(QMetaType.Type.QVariantMap, aliases));
         return map;
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkInfoSerializer.java b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkInfoSerializer.java
index 8b17901a6016454c07bb0aef36eda54a0e6eab13..0a216321e0d6dc06c4104cfd4c14a46b39e18789 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkInfoSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkInfoSerializer.java
@@ -23,6 +23,7 @@ package de.kuschku.libquassel.syncables.serializers;
 
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.util.Log;
 
 import java.util.HashMap;
 import java.util.List;
@@ -33,6 +34,7 @@ import de.kuschku.libquassel.functions.types.SerializedFunction;
 import de.kuschku.libquassel.functions.types.UnpackedFunction;
 import de.kuschku.libquassel.objects.serializers.ObjectSerializer;
 import de.kuschku.libquassel.objects.types.NetworkServer;
+import de.kuschku.libquassel.primitives.QMetaType;
 import de.kuschku.libquassel.primitives.types.QVariant;
 import de.kuschku.libquassel.syncables.types.impl.NetworkInfo;
 
@@ -54,31 +56,32 @@ public class NetworkInfoSerializer implements ObjectSerializer<NetworkInfo> {
     @Override
     public Map<String, QVariant<Object>> toVariantMap(@NonNull NetworkInfo data) {
         Map<String, QVariant<Object>> map = new HashMap<>();
-        map.put("networkName", new QVariant<>(data.networkName()));
-        map.put("identity", new QVariant<>(data.identity()));
+        map.put("NetworkId", new QVariant<>("NetworkId", data.networkId()));
+        map.put("NetworkName", new QVariant<>(QMetaType.Type.QString, data.networkName()));
+        map.put("Identity", new QVariant<>("IdentityId", data.identity()));
 
-        map.put("codecForServer", new QVariant<>(data.codecForServer()));
-        map.put("codecForEncoding", new QVariant<>(data.codecForEncoding()));
-        map.put("codecForDecoding", new QVariant<>(data.codecForDecoding()));
+        map.put("CodecForServer", new QVariant<>(QMetaType.Type.QByteArray, data.codecForServer()));
+        map.put("CodecForEncoding", new QVariant<>(QMetaType.Type.QByteArray, data.codecForEncoding()));
+        map.put("CodecForDecoding", new QVariant<>(QMetaType.Type.QByteArray, data.codecForDecoding()));
 
-        map.put("ServerList", new QVariant<>(data.serverList()));
-        map.put("useRandomServer", new QVariant<>(data.useRandomServer()));
+        map.put("ServerList", new QVariant<>(QMetaType.Type.QVariantList, data.serverList()));
+        map.put("UseRandomServer", new QVariant<>(QMetaType.Type.Bool, data.useRandomServer()));
 
-        map.put("perform", new QVariant<>(data.perform()));
+        map.put("Perform", new QVariant<>(QMetaType.Type.QStringList, data.perform()));
 
-        map.put("useAutoIdentify", new QVariant<>(data.useAutoIdentify()));
-        map.put("autoIdentifyService", new QVariant<>(data.autoIdentifyService()));
-        map.put("autoIdentifyPassword", new QVariant<>(data.autoIdentifyPassword()));
+        map.put("UseAutoIdentify", new QVariant<>(QMetaType.Type.Bool, data.useAutoIdentify()));
+        map.put("AutoIdentifyService", new QVariant<>(QMetaType.Type.QString, data.autoIdentifyService()));
+        map.put("AutoIdentifyPassword", new QVariant<>(QMetaType.Type.QString, data.autoIdentifyPassword()));
 
-        map.put("useSasl", new QVariant<>(data.useSasl()));
-        map.put("saslAccount", new QVariant<>(data.saslAccount()));
-        map.put("saslPassword", new QVariant<>(data.saslPassword()));
+        map.put("UseSasl", new QVariant<>(QMetaType.Type.Bool, data.useSasl()));
+        map.put("SaslAccount", new QVariant<>(QMetaType.Type.QString, data.saslAccount()));
+        map.put("SaslPassword", new QVariant<>(QMetaType.Type.QString, data.saslPassword()));
 
-        map.put("useAutoReconnect", new QVariant<>(data.useAutoReconnect()));
-        map.put("autoReconnectInterval", new QVariant<>(data.autoReconnectInterval()));
-        map.put("autoReconnectRetries", new QVariant<>(data.autoReconnectRetries()));
-        map.put("unlimitedReconnectRetries", new QVariant<>(data.unlimitedReconnectRetries()));
-        map.put("rejoinChannels", new QVariant<>(data.rejoinChannels()));
+        map.put("UseAutoReconnect", new QVariant<>(QMetaType.Type.Bool, data.useAutoReconnect()));
+        map.put("AutoReconnectInterval", new QVariant<>(QMetaType.Type.UInt, data.autoReconnectInterval()));
+        map.put("AutoReconnectRetries", new QVariant<>(QMetaType.Type.UShort, data.autoReconnectRetries()));
+        map.put("UnlimitedReconnectRetries", new QVariant<>(QMetaType.Type.Bool, data.unlimitedReconnectRetries()));
+        map.put("RejoinChannels", new QVariant<>(QMetaType.Type.Bool, data.rejoinChannels()));
         return map;
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ANetwork.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ANetwork.java
index 30ed2838212eb0c1779a0a08df8a310c47e65688..67e1edfb239ac3baf51efc28c541c6d5a06f7e5b 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ANetwork.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/abstracts/ANetwork.java
@@ -22,6 +22,7 @@
 package de.kuschku.libquassel.syncables.types.abstracts;
 
 import android.support.annotation.NonNull;
+import android.util.Log;
 
 import java.util.List;
 
@@ -227,8 +228,7 @@ public abstract class ANetwork extends SyncableObject<QNetwork> implements QNetw
 
     @Override
     public void setNetworkInfo(NetworkInfo info) {
-        _setNetworkInfo(info);
-        syncVar("setNetworkInfo", info);
+        syncVar("requestSetNetworkInfo", info);
     }
 
     @Override
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewConfig.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewConfig.java
index 649403a7ff469f84835231be3dce6e0bca701683..bef5cf3544c26094421c42011eb2db3332387aaf 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewConfig.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/BufferViewConfig.java
@@ -162,7 +162,7 @@ public class BufferViewConfig extends ABufferViewConfig {
                     for (int bufferId : bufferList()) {
                         Buffer buffer = client.bufferManager().buffer(bufferId);
                         if (buffer == null)
-                            Log.e("DEBUG", "Buffer is null: " + bufferId + " while adding buffer " + info);
+                            Log.w("libquassel", "Buffer is null: " + bufferId + " while adding buffer " + info);
                         BufferInfo info1 = buffer.getInfo();
                         if (info1.networkId == info.networkId)
                             infos.add(info1.name);
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java
index a0039aba8cd42763b6046a82afcbcddc969e4c56..65173f84d82980a77e2c6bb7cdc7e248bf2a9796 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/Network.java
@@ -781,6 +781,8 @@ public class Network extends ANetwork implements Observer {
     @Override
     public void _update() {
         super._update();
+        if (client != null)
+            client.networkManager().networks().notifyItemChanged(client.networkManager().networks().indexOf(this));
     }
 
     private void updateDisplay() {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/service/ClientBackgroundThread.java b/app/src/main/java/de/kuschku/quasseldroid_ng/service/ClientBackgroundThread.java
index 32c8fa3cf0c84ce4980d82b523a26e977e6e5ca0..b66c9f5cbd54d901af12b33246825360d2f3250f 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/service/ClientBackgroundThread.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/service/ClientBackgroundThread.java
@@ -108,5 +108,7 @@ public class ClientBackgroundThread implements Runnable {
     public void onEvent(GeneralErrorEvent event) {
         if (!(event.exception instanceof ConnectException))
             ACRA.getErrorReporter().handleSilentException(event.exception);
+
+        event.exception.printStackTrace();
     }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigSpinnerAdapter.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigSpinnerAdapter.java
index f1a9ebe51dc1aba4804f0da7752a52050599149c..2bea8319140add7050e9d252d4c29b471305488c 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigSpinnerAdapter.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigSpinnerAdapter.java
@@ -118,9 +118,6 @@ public class BufferViewConfigSpinnerAdapter implements ThemedSpinnerAdapter, Gen
         TextView view = (TextView) inflater.inflate(R.layout.widget_md_spinner_item, parent, false);
         QBufferViewConfig viewConfig = (QBufferViewConfig) getItem(position);
         view.setText(viewConfig == null ? "" : viewConfig.bufferViewName());
-        if (viewConfig == null) {
-            Log.d("DEBUG", String.valueOf(bufferViewManager.bufferViewConfigs()));
-        }
         return view;
     }
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MainActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MainActivity.java
index 3cfbc335e18d2a1a0083388b53fb80b3a710c83f..203ce96adb31699d140cfa149e38bdaac5257c1d 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MainActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MainActivity.java
@@ -76,6 +76,7 @@ import de.kuschku.libquassel.localtypes.buffers.QueryBuffer;
 import de.kuschku.libquassel.message.Message;
 import de.kuschku.libquassel.objects.types.CoreSetupData;
 import de.kuschku.libquassel.objects.types.SetupData;
+import de.kuschku.libquassel.primitives.QMetaType;
 import de.kuschku.libquassel.primitives.types.QVariant;
 import de.kuschku.libquassel.syncables.types.interfaces.QBacklogManager;
 import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel;
@@ -493,8 +494,6 @@ public class MainActivity extends BoundActivity {
                 if (resultCode == RESULT_OK) {
                     context.provider().event.removeStickyEvent(CoreSetupRequiredEvent.class);
 
-                    Log.d("DEBUG", "Received result: " + data.getExtras());
-
                     Account account = manager.account(context.settings().preferenceLastAccount.get());
                     Bundle config = data.getParcelableExtra("config");
                     Map<String, QVariant> configData = new HashMap<>();
@@ -532,8 +531,6 @@ public class MainActivity extends BoundActivity {
 
     @Subscribe(threadMode = ThreadMode.MAIN, sticky = true)
     public void onEventMainThread(CoreSetupRequiredEvent event) {
-        Log.d("DEBUG", String.valueOf(context.client().core().StorageBackends));
-
         Intent intent = new Intent(getApplicationContext(), CoreSetupActivity.class);
         intent.putExtra("storageBackends", context.client().core().getStorageBackendsAsBundle());
         startActivityForResult(intent, REQUEST_CODE_CORESETUP);
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigAdapter.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigAdapter.java
index 64f5259a3b04e4015c4a710c151a7a8bc94c7257..d127c291d0714474d6ac57d51645b618ec73431e 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigAdapter.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigAdapter.java
@@ -70,7 +70,8 @@ public class BufferViewConfigAdapter extends ExpandableRecyclerAdapter<NetworkVi
 
         @Override
         public void notifyItemChanged(QNetwork network) {
-            items.notifyItemChanged(items.indexOf(itemMap.get(network)));
+            if (items.contains(itemMap.get(network)))
+                items.notifyItemChanged(items.indexOf(itemMap.get(network)));
         }
     };
 
@@ -137,7 +138,7 @@ public class BufferViewConfigAdapter extends ExpandableRecyclerAdapter<NetworkVi
         final ObservableSortedList<NetworkItem> networkItems = new ObservableSortedList<>(NetworkItem.class, new ObservableSortedList.ItemComparator<NetworkItem>() {
             @Override
             public int compare(NetworkItem o1, NetworkItem o2) {
-                return o1.getNetwork().networkName().compareTo(o2.getNetwork().networkName());
+                return o1 == null && o2 == null ? 0 : o1 == null ? 1 : o2 == null ? -1 : o1.getNetwork().networkName().compareTo(o2.getNetwork().networkName());
             }
 
             @Override
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/ChatListCreateActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/ChatListCreateActivity.java
index 437e0a40d9f8c3af42d0795cb9b4285c64448f2d..7a8bd37ce8b6994829b300cbd250004bcb8f04f8 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/ChatListCreateActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/chatlist/ChatListCreateActivity.java
@@ -100,7 +100,6 @@ public class ChatListCreateActivity extends BoundActivity {
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
             case R.id.action_confirm: {
-                Log.d("DEBUG", "Manager: " + bufferViewManager);
                 if (bufferViewManager != null) {
                     QBufferViewConfig config = new BufferViewConfig(
                             "",
@@ -125,8 +124,6 @@ public class ChatListCreateActivity extends BoundActivity {
                     config._setAddNewBuffersAutomatically(this.addAutomatically.isChecked());
                     config._setSortAlphabetically(this.sortAlphabetically.isChecked());
 
-                    Log.d("DEBUG", "Config: " + config);
-
                     bufferViewManager.createBufferView(config);
                 }
                 finish();
@@ -138,13 +135,11 @@ public class ChatListCreateActivity extends BoundActivity {
 
     @Override
     protected void onConnected() {
-        Log.d("ChatListCreateActivity", "Connected: " + context.client().bufferViewManager());
         bufferViewManager = context.client().bufferViewManager();
     }
 
     @Override
     protected void onDisconnected() {
-        Log.d("ChatListCreateActivity", "Disconnected");
         bufferViewManager = null;
     }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkCreateActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkCreateActivity.java
index 680eae60a4d04c67748dda23560b746684f23471..0c4f3e27ae9f692f42bc6464ff3fd679b8cefdf0 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkCreateActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkCreateActivity.java
@@ -302,8 +302,8 @@ public class NetworkCreateActivity extends BoundActivity {
                             unlimitedAutoReconnectRetries.isChecked(),
                             rejoinChannels.isChecked()
                     );
-
-                    Log.d("DEBUG", "After: " + after);
+                    if (context.client() != null)
+                        context.client().createNetwork(after);
 
                     finish();
                 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkEditActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkEditActivity.java
index b1846571cb2eb58ee67ce526f190ddfcc1aa27d4..167d65d1624639cd8110f90db2f73ea21bd3bd00 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkEditActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkEditActivity.java
@@ -41,7 +41,9 @@ import android.widget.Spinner;
 import butterknife.Bind;
 import butterknife.ButterKnife;
 import de.kuschku.libquassel.syncables.types.impl.NetworkInfo;
+import de.kuschku.libquassel.syncables.types.interfaces.QNetwork;
 import de.kuschku.quasseldroid_ng.R;
+import de.kuschku.util.backports.Objects;
 import de.kuschku.util.servicebound.BoundActivity;
 
 public class NetworkEditActivity extends BoundActivity {
@@ -100,7 +102,7 @@ public class NetworkEditActivity extends BoundActivity {
         CheckBox unlimitedAutoReconnectRetries;
 
     int id;
-    private NetworkInfo networkInfo;
+    private QNetwork network;
 
     public static void expand(final ViewGroup v) {
         v.measure(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.WRAP_CONTENT);
@@ -236,6 +238,7 @@ public class NetworkEditActivity extends BoundActivity {
     public boolean onOptionsItemSelected(MenuItem item) {
         switch (item.getItemId()) {
             case R.id.action_confirm: {
+                NetworkInfo networkInfo = this.network.networkInfo();
                 if (networkInfo != null) {
                     NetworkInfo after = new NetworkInfo(
                             networkInfo.networkId(),
@@ -263,9 +266,8 @@ public class NetworkEditActivity extends BoundActivity {
                             rejoinChannels.isChecked()
                     );
 
-                    Log.d("DEBUG", "Before: " + networkInfo);
-                    Log.d("DEBUG", "After: " + after);
-                    Log.d("DEBUG", "Eq: " + networkInfo.equals(after));
+                    if (!Objects.equals(networkInfo, after))
+                        network.setNetworkInfo(after);
 
                     finish();
                 }
@@ -277,13 +279,14 @@ public class NetworkEditActivity extends BoundActivity {
 
     @Override
     protected void onConnected() {
-        setNetwork(context.client().networkManager().network(id).networkInfo());
+        setNetwork(context.client().networkManager().network(id));
     }
 
-    private void setNetwork(NetworkInfo networkInfo) {
-        this.networkInfo = networkInfo;
+    private void setNetwork(QNetwork network) {
+        this.network = network;
 
-        if (this.networkInfo != null) {
+        NetworkInfo networkInfo = this.network.networkInfo();
+        if (networkInfo != null) {
             networkName.setText(networkInfo.networkName());
             useCustomCodecs.setChecked(networkInfo.codecForServer() != null || networkInfo.codecForEncoding() != null || networkInfo.codecForDecoding() != null);
             codecForServer.setText(networkInfo.codecForServer());
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkListActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkListActivity.java
index 2ae9ec975df2796ac456d357ab69bdb8a41a6f7b..fd93e5901fc9ebf0c4576b8c2b3939f997194b98 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkListActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/coresettings/network/NetworkListActivity.java
@@ -42,6 +42,7 @@ import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig;
 import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewManager;
 import de.kuschku.libquassel.syncables.types.interfaces.QNetwork;
 import de.kuschku.quasseldroid_ng.R;
+import de.kuschku.util.observables.callbacks.UICallback;
 import de.kuschku.util.observables.callbacks.wrappers.AdapterUICallbackWrapper;
 import de.kuschku.util.servicebound.BoundActivity;
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/CoreBackendSetupSlide.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/CoreBackendSetupSlide.java
index fd175ece93ff6f8ab4d355c758cbe03836f98a07..2fcfbf6a1fb0f5c67e7f1800bffb59f073289d97 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/CoreBackendSetupSlide.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/slides/CoreBackendSetupSlide.java
@@ -98,8 +98,6 @@ public class CoreBackendSetupSlide extends SlideFragment {
     }
 
     private void updateContent() {
-        Log.d("DEBUG", "Backend is: " + storageBackend);
-
         container.removeAllViews();
 
         for (InputItemWrapper wrapper : items.values()) {
@@ -122,7 +120,6 @@ public class CoreBackendSetupSlide extends SlideFragment {
             InputItemWrapper wrapper = getInputItemWrapper(key, type, defValue);
             items.put(key, wrapper);
             container.addView(wrapper.getView(container.getContext(), container));
-            Log.d("DEBUG", "Adding config: " + type + " " + key + " = " + defValue + ";");
         }
     }