diff --git a/app/src/main/java/de/kuschku/libquassel/BusProvider.java b/app/src/main/java/de/kuschku/libquassel/BusProvider.java
index f1b5c81cf43059eb0c3f604bec92b269dd938b26..f4848ec5a6c515ed35440b9cf6c8fc9786ac03b7 100644
--- a/app/src/main/java/de/kuschku/libquassel/BusProvider.java
+++ b/app/src/main/java/de/kuschku/libquassel/BusProvider.java
@@ -1,7 +1,5 @@
 package de.kuschku.libquassel;
 
-import android.util.Log;
-
 import java.util.UUID;
 
 import de.greenrobot.event.EventBus;
diff --git a/app/src/main/java/de/kuschku/libquassel/Client.java b/app/src/main/java/de/kuschku/libquassel/Client.java
index 7d677b9196a91e68bb5855ca163fb89782c5583c..d556e4a4595edc063e7a0f2b07e32315f26b5e6d 100644
--- a/app/src/main/java/de/kuschku/libquassel/Client.java
+++ b/app/src/main/java/de/kuschku/libquassel/Client.java
@@ -1,7 +1,5 @@
 package de.kuschku.libquassel;
 
-import android.util.Log;
-
 import java.util.ArrayList;
 import java.util.Collection;
 import java.util.HashMap;
@@ -23,7 +21,6 @@ import de.kuschku.libquassel.primitives.types.Message;
 import de.kuschku.libquassel.primitives.types.QVariant;
 import de.kuschku.libquassel.syncables.types.BufferSyncer;
 import de.kuschku.libquassel.syncables.types.BufferViewManager;
-import de.kuschku.libquassel.syncables.types.IrcUser;
 import de.kuschku.libquassel.syncables.types.Network;
 import de.kuschku.libquassel.syncables.types.SyncableObject;
 import de.kuschku.util.Stream;
@@ -35,6 +32,7 @@ public class Client {
     private final List<String> initDataQueue = new ArrayList<>();
     private final BacklogManager backlogManager;
     private final BusProvider busProvider;
+    public int lag;
     private ConnectionChangeEvent.Status connectionStatus;
     private ClientInitAck core;
     private SessionState state;
@@ -42,8 +40,6 @@ public class Client {
     private BufferSyncer bufferSyncer;
     private ClientData clientData;
 
-    public int lag;
-
     public Client(final BusProvider busProvider) {
         this(new SimpleBacklogManager(busProvider), busProvider);
     }
@@ -176,11 +172,6 @@ public class Client {
         this.core = core;
     }
 
-    public void setConnectionStatus(final ConnectionChangeEvent.Status connectionStatus) {
-        this.connectionStatus = connectionStatus;
-        busProvider.sendEvent(new ConnectionChangeEvent(connectionStatus));
-    }
-
     public void setClientData(ClientData clientData) {
         this.clientData = clientData;
     }
@@ -196,4 +187,9 @@ public class Client {
     public ConnectionChangeEvent.Status getConnectionStatus() {
         return connectionStatus;
     }
+
+    public void setConnectionStatus(final ConnectionChangeEvent.Status connectionStatus) {
+        this.connectionStatus = connectionStatus;
+        busProvider.sendEvent(new ConnectionChangeEvent(connectionStatus));
+    }
 }
diff --git a/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java b/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java
index f429e682f36340583edddb733232205b05599bf5..c307a19ac1ffcbd0eccd1d25aa8aec01f7599d17 100644
--- a/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java
+++ b/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java
@@ -12,13 +12,13 @@ import de.kuschku.libquassel.functions.types.InitDataFunction;
 import de.kuschku.libquassel.functions.types.InitRequestFunction;
 import de.kuschku.libquassel.functions.types.RpcCallFunction;
 import de.kuschku.libquassel.functions.types.SyncFunction;
-import de.kuschku.libquassel.syncables.SyncableRegistry;
 import de.kuschku.libquassel.objects.types.ClientInitAck;
 import de.kuschku.libquassel.objects.types.ClientInitReject;
 import de.kuschku.libquassel.objects.types.ClientLoginAck;
 import de.kuschku.libquassel.objects.types.ClientLoginReject;
 import de.kuschku.libquassel.objects.types.SessionInit;
 import de.kuschku.libquassel.primitives.types.BufferInfo;
+import de.kuschku.libquassel.syncables.SyncableRegistry;
 import de.kuschku.util.ReflectionUtils;
 
 public class ProtocolHandler implements IProtocolHandler {
diff --git a/app/src/main/java/de/kuschku/libquassel/exceptions/SyncInvocationException.java b/app/src/main/java/de/kuschku/libquassel/exceptions/SyncInvocationException.java
index b9ffcda974c14ac1b5de147ca2502fa341137514..b4f34e7f09e7161d04d9ed3e73dd48334eb176aa 100644
--- a/app/src/main/java/de/kuschku/libquassel/exceptions/SyncInvocationException.java
+++ b/app/src/main/java/de/kuschku/libquassel/exceptions/SyncInvocationException.java
@@ -6,6 +6,10 @@ public class SyncInvocationException extends InvocationTargetException {
     public SyncInvocationException() {
     }
 
+    public SyncInvocationException(String detailMessage) {
+        super(null, detailMessage);
+    }
+
     public SyncInvocationException(Throwable exception) {
         super(exception);
     }
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/ChannelBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/ChannelBuffer.java
index 9c1dc07541bd747120a4e99c215c9a4a5b2f1bde..0f50962d3f233ac4972026293f8a55a62103b2bf 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/ChannelBuffer.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/ChannelBuffer.java
@@ -2,20 +2,20 @@ package de.kuschku.libquassel.localtypes;
 
 import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
 
-import de.kuschku.libquassel.syncables.types.IrcChannel;
 import de.kuschku.libquassel.primitives.types.BufferInfo;
+import de.kuschku.libquassel.syncables.types.IrcChannel;
 import de.kuschku.quasseldroid_ng.BufferDrawerItem;
 
 public class ChannelBuffer implements Buffer {
     private final BufferInfo info;
     private IrcChannel channel;
+    private IDrawerItem drawerElement = new BufferDrawerItem(this);
 
     public ChannelBuffer(BufferInfo info, IrcChannel channel) {
         this.info = info;
         this.channel = channel;
     }
 
-    private IDrawerItem drawerElement = new BufferDrawerItem(this);
     public IDrawerItem getDrawerElement() {
         return drawerElement;
     }
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/QueryBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/QueryBuffer.java
index a2f4b22afdf8b2f5d9d8c135d19445bf34022dd1..df5ad5268de6e0b2c9305900dcfc766d50733759 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/QueryBuffer.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/QueryBuffer.java
@@ -2,20 +2,20 @@ package de.kuschku.libquassel.localtypes;
 
 import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
 
-import de.kuschku.libquassel.syncables.types.IrcUser;
 import de.kuschku.libquassel.primitives.types.BufferInfo;
+import de.kuschku.libquassel.syncables.types.IrcUser;
 import de.kuschku.quasseldroid_ng.BufferDrawerItem;
 
 public class QueryBuffer implements Buffer {
     private final BufferInfo info;
     private IrcUser user;
+    private IDrawerItem drawerElement = new BufferDrawerItem(this);
 
     public QueryBuffer(BufferInfo info, IrcUser user) {
         this.info = info;
         this.user = user;
     }
 
-    private IDrawerItem drawerElement = new BufferDrawerItem(this);
     public IDrawerItem getDrawerElement() {
         return drawerElement;
     }
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/StatusBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/StatusBuffer.java
index c7a69e73f2a10c1f6060791b0a79b7f56f42d881..51a08e1e805e2c0ebf29d5632e829f46a5294372 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/StatusBuffer.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/StatusBuffer.java
@@ -9,13 +9,13 @@ import de.kuschku.quasseldroid_ng.BufferDrawerItem;
 public class StatusBuffer implements Buffer {
     private final BufferInfo info;
     private final Network network;
+    private IDrawerItem drawerElement = new BufferDrawerItem(this);
 
     public StatusBuffer(BufferInfo info, Network network) {
         this.info = info;
         this.network = network;
     }
 
-    private IDrawerItem drawerElement = new BufferDrawerItem(this);
     public IDrawerItem getDrawerElement() {
         return drawerElement;
     }
diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/QMetaType.java b/app/src/main/java/de/kuschku/libquassel/primitives/QMetaType.java
index 7c2f40e7225ac9e7c696cdb24e282d7ccb858a7d..7fe683994758e21aec7af3a4090ba36c5dcedd5c 100644
--- a/app/src/main/java/de/kuschku/libquassel/primitives/QMetaType.java
+++ b/app/src/main/java/de/kuschku/libquassel/primitives/QMetaType.java
@@ -38,21 +38,23 @@ import de.kuschku.libquassel.primitives.serializers.PrimitiveSerializer;
 public class QMetaType<T> {
     public final Type type;
     public final String name;
+    public final Class cl;
     public final PrimitiveSerializer<T> serializer;
 
-    public QMetaType(Type type) {
-        this(type, type.getSerializableName());
+    public QMetaType(Class cl, Type type) {
+        this(cl, type, type.getSerializableName());
     }
 
-    public QMetaType(Type type, String name) {
-        this(type, name, null);
+    public QMetaType(Class cl, Type type, String name) {
+        this(cl, type, name, null);
     }
 
-    public QMetaType(Type type, PrimitiveSerializer<T> serializer) {
-        this(type, type.getSerializableName(), serializer);
+    public QMetaType(Class cl, Type type, PrimitiveSerializer<T> serializer) {
+        this(cl, type, type.getSerializableName(), serializer);
     }
 
-    public QMetaType(Type type, String name, PrimitiveSerializer<T> serializer) {
+    public QMetaType(Class cl, Type type, String name, PrimitiveSerializer<T> serializer) {
+        this.cl = cl;
         this.type = type;
         this.name = name;
         this.serializer = serializer;
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 b8456603641626f8ddb48bfb8809083d42c931de..7219a30b57693a570cb126fdfc78630faed62675 100644
--- a/app/src/main/java/de/kuschku/libquassel/primitives/QMetaTypeRegistry.java
+++ b/app/src/main/java/de/kuschku/libquassel/primitives/QMetaTypeRegistry.java
@@ -3,6 +3,7 @@ package de.kuschku.libquassel.primitives;
 import org.joda.time.DateTime;
 
 import java.io.IOException;
+import java.math.BigDecimal;
 import java.nio.ByteBuffer;
 import java.nio.channels.ByteChannel;
 import java.util.HashMap;
@@ -42,85 +43,85 @@ public class QMetaTypeRegistry {
     private static final Map<String, QMetaType> stringSerializerMap = new HashMap<>();
 
     static {
-        addType(QMetaType.Type.Void, new VoidSerializer());
-        addType(QMetaType.Type.Bool, new BoolSerializer());
-        addType(QMetaType.Type.Int, new IntSerializer());
-        addType(QMetaType.Type.UserType, "BufferId", new IntSerializer());
-        addType(QMetaType.Type.UserType, "NetworkId", new IntSerializer());
-        addType(QMetaType.Type.UserType, "IdentityId", new IntSerializer());
-        addType(QMetaType.Type.UserType, "MsgId", new IntSerializer());
-        addType(QMetaType.Type.UserType, "BufferInfo", new BufferInfoSerializer());
-        addType(QMetaType.Type.UserType, "Message", new MessageSerializer());
-        addType(QMetaType.Type.UserType, "Identity", new UserTypeSerializer<>(new IdentitySerializer()));
-        addType(QMetaType.Type.UserType, "Network::Server", new UserTypeSerializer<>(new NetworkServerSerializer()));
-        addType(QMetaType.Type.UInt, new IntSerializer());
-        addType(QMetaType.Type.UShort, new ShortSerializer());
+        addType(Void.class, QMetaType.Type.Void, new VoidSerializer());
+        addType(boolean.class, QMetaType.Type.Bool, new BoolSerializer());
+        addType(int.class, QMetaType.Type.Int, new IntSerializer());
+        addType(int.class, QMetaType.Type.UserType, "BufferId", new IntSerializer());
+        addType(int.class, QMetaType.Type.UserType, "NetworkId", new IntSerializer());
+        addType(int.class, QMetaType.Type.UserType, "IdentityId", new IntSerializer());
+        addType(int.class, QMetaType.Type.UserType, "MsgId", new IntSerializer());
+        addType(BufferInfo.class, QMetaType.Type.UserType, "BufferInfo", new BufferInfoSerializer());
+        addType(Message.class, QMetaType.Type.UserType, "Message", new MessageSerializer());
+        addType(Identity.class, QMetaType.Type.UserType, "Identity", new UserTypeSerializer<>(new IdentitySerializer()));
+        addType(NetworkServer.class, QMetaType.Type.UserType, "Network::Server", new UserTypeSerializer<>(new NetworkServerSerializer()));
+        addType(int.class, QMetaType.Type.UInt, new IntSerializer());
+        addType(short.class, QMetaType.Type.UShort, new ShortSerializer());
 
         // TODO: Implement more custom quassel types
 
-        addType(QMetaType.Type.QTime, new TimeSerializer());
-        addType(QMetaType.Type.LongLong);
-        addType(QMetaType.Type.ULongLong);
-        addType(QMetaType.Type.Double);
-        addType(QMetaType.Type.QChar, new CharSerializer());
-        addType(QMetaType.Type.QVariantList, new VariantListSerializer<>());
-        addType(QMetaType.Type.QVariantMap, new VariantMapSerializer<>());
-        addType(QMetaType.Type.QStringList, new StringListSerializer());
-        addType(QMetaType.Type.QString, new StringSerializer());
-        addType(QMetaType.Type.QByteArray, new ByteArraySerializer());
-        addType(QMetaType.Type.QBitArray);
-        addType(QMetaType.Type.QDate);
-        addType(QMetaType.Type.QDateTime, new DateTimeSerializer());
-        addType(QMetaType.Type.QUrl);
-        addType(QMetaType.Type.QLocale);
-        addType(QMetaType.Type.QRect);
-        addType(QMetaType.Type.QRectF);
-        addType(QMetaType.Type.QSize);
-        addType(QMetaType.Type.QSizeF);
-        addType(QMetaType.Type.QLine);
-        addType(QMetaType.Type.QLineF);
-        addType(QMetaType.Type.QPoint);
-        addType(QMetaType.Type.QPointF);
+        addType(DateTime.class, QMetaType.Type.QTime, new TimeSerializer());
+        addType(BigDecimal.class, QMetaType.Type.LongLong);
+        addType(BigDecimal.class, QMetaType.Type.ULongLong);
+        addType(double.class, QMetaType.Type.Double);
+        addType(char.class, QMetaType.Type.QChar, new CharSerializer());
+        addType(List.class, QMetaType.Type.QVariantList, new VariantListSerializer());
+        addType(Map.class, QMetaType.Type.QVariantMap, new VariantMapSerializer());
+        addType(List.class, QMetaType.Type.QStringList, new StringListSerializer());
+        addType(String.class, QMetaType.Type.QString, new StringSerializer());
+        addType(String.class, QMetaType.Type.QByteArray, new ByteArraySerializer());
+        addType(void.class, QMetaType.Type.QBitArray);
+        addType(void.class, QMetaType.Type.QDate);
+        addType(DateTime.class, QMetaType.Type.QDateTime, new DateTimeSerializer());
+        addType(void.class, QMetaType.Type.QUrl);
+        addType(void.class, QMetaType.Type.QLocale);
+        addType(void.class, QMetaType.Type.QRect);
+        addType(void.class, QMetaType.Type.QRectF);
+        addType(void.class, QMetaType.Type.QSize);
+        addType(void.class, QMetaType.Type.QSizeF);
+        addType(void.class, QMetaType.Type.QLine);
+        addType(void.class, QMetaType.Type.QLineF);
+        addType(void.class, QMetaType.Type.QPoint);
+        addType(void.class, QMetaType.Type.QPointF);
         // TODO: Handle QRegExp for the IgnoreListManager
-        addType(QMetaType.Type.QRegExp);
-        addType(QMetaType.Type.QVariantHash);
-        addType(QMetaType.Type.QEasingCurve);
+        addType(void.class, QMetaType.Type.QRegExp);
+        addType(void.class, QMetaType.Type.QVariantHash);
+        addType(void.class, QMetaType.Type.QEasingCurve);
 
         // UI Types
-        addType(QMetaType.Type.QFont);
-        addType(QMetaType.Type.QPixmap);
-        addType(QMetaType.Type.QBrush);
-        addType(QMetaType.Type.QColor);
-        addType(QMetaType.Type.QPalette);
-        addType(QMetaType.Type.QIcon);
-        addType(QMetaType.Type.QImage);
-        addType(QMetaType.Type.QPolygon);
-        addType(QMetaType.Type.QRegion);
-        addType(QMetaType.Type.QBitmap);
-        addType(QMetaType.Type.QCursor);
-        addType(QMetaType.Type.QSizePolicy);
-        addType(QMetaType.Type.QKeySequence);
-        addType(QMetaType.Type.QPen);
-        addType(QMetaType.Type.QTextLength);
-        addType(QMetaType.Type.QTextFormat);
-        addType(QMetaType.Type.QMatrix);
-        addType(QMetaType.Type.QTransform);
-        addType(QMetaType.Type.QMatrix4x4);
-        addType(QMetaType.Type.QVector2D);
-        addType(QMetaType.Type.QVector3D);
-        addType(QMetaType.Type.QVector4D);
-        addType(QMetaType.Type.QQuaternion);
-
-        addType(QMetaType.Type.VoidStar, "void*");
-        addType(QMetaType.Type.Long, new LongSerializer());
-        addType(QMetaType.Type.Short, new ShortSerializer());
-        addType(QMetaType.Type.Char, new ByteSerializer());
-        addType(QMetaType.Type.ULong, new LongSerializer());
-        addType(QMetaType.Type.UChar, new ByteSerializer());
-        addType(QMetaType.Type.Float);
-        addType(QMetaType.Type.QObjectStar, "QObject*");
-        addType(QMetaType.Type.QWidgetStar, "QWidget*");
-        addType(QMetaType.Type.QVariant, new VariantSerializer());
+        addType(void.class, QMetaType.Type.QFont);
+        addType(void.class, QMetaType.Type.QPixmap);
+        addType(void.class, QMetaType.Type.QBrush);
+        addType(void.class, QMetaType.Type.QColor);
+        addType(void.class, QMetaType.Type.QPalette);
+        addType(void.class, QMetaType.Type.QIcon);
+        addType(void.class, QMetaType.Type.QImage);
+        addType(void.class, QMetaType.Type.QPolygon);
+        addType(void.class, QMetaType.Type.QRegion);
+        addType(void.class, QMetaType.Type.QBitmap);
+        addType(void.class, QMetaType.Type.QCursor);
+        addType(void.class, QMetaType.Type.QSizePolicy);
+        addType(void.class, QMetaType.Type.QKeySequence);
+        addType(void.class, QMetaType.Type.QPen);
+        addType(void.class, QMetaType.Type.QTextLength);
+        addType(void.class, QMetaType.Type.QTextFormat);
+        addType(void.class, QMetaType.Type.QMatrix);
+        addType(void.class, QMetaType.Type.QTransform);
+        addType(void.class, QMetaType.Type.QMatrix4x4);
+        addType(void.class, QMetaType.Type.QVector2D);
+        addType(void.class, QMetaType.Type.QVector3D);
+        addType(void.class, QMetaType.Type.QVector4D);
+        addType(void.class, QMetaType.Type.QQuaternion);
+
+        addType(void.class, QMetaType.Type.VoidStar, "void*");
+        addType(long.class, QMetaType.Type.Long, new LongSerializer());
+        addType(short.class, QMetaType.Type.Short, new ShortSerializer());
+        addType(byte.class, QMetaType.Type.Char, new ByteSerializer());
+        addType(long.class, QMetaType.Type.ULong, new LongSerializer());
+        addType(byte.class, QMetaType.Type.UChar, new ByteSerializer());
+        addType(void.class, QMetaType.Type.Float);
+        addType(void.class, QMetaType.Type.QObjectStar, "QObject*");
+        addType(void.class, QMetaType.Type.QWidgetStar, "QWidget*");
+        addType(QVariant.class, QMetaType.Type.QVariant, new VariantSerializer());
     }
 
     // Disable Constructor
@@ -128,20 +129,20 @@ public class QMetaTypeRegistry {
 
     }
 
-    private static <T> void addType(final QMetaType.Type type, final String name, final PrimitiveSerializer<T> serializer) {
-        addType(new QMetaType<T>(type, name, serializer));
+    private static <T> void addType(final Class cl, final QMetaType.Type type, final String name, final PrimitiveSerializer<T> serializer) {
+        addType(new QMetaType<T>(cl, type, name, serializer));
     }
 
-    private static <T> void addType(final QMetaType.Type type, final String name) {
-        addType(new QMetaType<T>(type, name));
+    private static <T> void addType(final Class cl, final QMetaType.Type type, final String name) {
+        addType(new QMetaType<T>(cl, type, name));
     }
 
-    private static <T> void addType(final QMetaType.Type type, final PrimitiveSerializer<T> serializer) {
-        addType(new QMetaType<T>(type, serializer));
+    private static <T> void addType(final Class cl, final QMetaType.Type type, final PrimitiveSerializer<T> serializer) {
+        addType(new QMetaType<T>(cl, type, serializer));
     }
 
-    private static <T> void addType(final QMetaType.Type type) {
-        addType(new QMetaType<T>(type));
+    private static <T> void addType(final Class cl, final QMetaType.Type type) {
+        addType(new QMetaType<T>(cl, type));
     }
 
     private static <T> void addType(final QMetaType<T> metaType) {
@@ -213,7 +214,7 @@ public class QMetaTypeRegistry {
             if (((List) type).size() > 0 && ((List) type).get(0) instanceof String)
                 return (QMetaType<T>) typeSerializerMap.get(QMetaType.Type.QStringList);
             else if (((List) type).size() > 0 && ((List) type).get(0) instanceof QVariant)
-                return (QMetaType<T>) new QMetaType<T>(QMetaType.Type.QVariantList, new VariantVariantListSerializer());
+                return new QMetaType<>((Class) type.getClass(), QMetaType.Type.QVariantList, new VariantVariantListSerializer());
             else
                 return (QMetaType<T>) typeSerializerMap.get(QMetaType.Type.QVariantList);
         } else if (type instanceof Map)
diff --git a/app/src/main/java/de/kuschku/libquassel/primitives/types/Message.java b/app/src/main/java/de/kuschku/libquassel/primitives/types/Message.java
index a08aeb9c277c50437b0a6c498746fddfac7bf521..cb68f51a8fc38f1551f77fb3a3967de536df2772 100644
--- a/app/src/main/java/de/kuschku/libquassel/primitives/types/Message.java
+++ b/app/src/main/java/de/kuschku/libquassel/primitives/types/Message.java
@@ -2,8 +2,6 @@ package de.kuschku.libquassel.primitives.types;
 
 import android.support.annotation.NonNull;
 
-import com.mikepenz.fastadapter.IItem;
-
 import org.joda.time.DateTime;
 
 import java.io.Serializable;
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 2e44c7651fc27a8e28a84af8ff48ecf2c0aa1200..0a8d6f8a5880ef61aabcbee225a11fac10c0ac62 100644
--- a/app/src/main/java/de/kuschku/libquassel/protocols/LegacyPeer.java
+++ b/app/src/main/java/de/kuschku/libquassel/protocols/LegacyPeer.java
@@ -56,7 +56,7 @@ public class LegacyPeer implements RemotePeer {
     public final void onEventBackgroundThread(SyncFunction func) {
         final List serialize = new UnpackedSyncFunctionSerializer().serialize(func);
         connection.getOutputExecutor().submit(new OutputRunnable<>(new VariantSerializer<List>(),
-                new QVariant<>(new QMetaType<List>(QMetaType.Type.QVariantList, new VariantVariantListSerializer()),
+                new QVariant<>(new QMetaType<List>(List.class, QMetaType.Type.QVariantList, new VariantVariantListSerializer()),
                         serialize)));
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/SyncableRegistry.java b/app/src/main/java/de/kuschku/libquassel/syncables/SyncableRegistry.java
index 72fe5bc295fb2ba70bc770847a44b8a629b6b5b5..fb17008e7159fe69ec8eadf123913e249316963d 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/SyncableRegistry.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/SyncableRegistry.java
@@ -17,6 +17,7 @@ import de.kuschku.libquassel.syncables.types.SyncableObject;
 
 public class SyncableRegistry {
     private static final Map<String, ObjectSerializer<? extends SyncableObject>> map = new HashMap<>();
+
     static {
         map.put("BufferSyncer", new BufferSyncerSerializer());
         map.put("BufferViewConfig", new BufferViewConfigSerializer());
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IrcChannelSerializer.java b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IrcChannelSerializer.java
index 61ee5876c827af4b953acea684f4355961c2a320..489bcf9bbf8d8d1b64f599270cf73cbcc0d807b3 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IrcChannelSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IrcChannelSerializer.java
@@ -8,8 +8,8 @@ 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.serializers.StringObjectMapSerializer;
-import de.kuschku.libquassel.syncables.types.IrcChannel;
 import de.kuschku.libquassel.primitives.types.QVariant;
+import de.kuschku.libquassel.syncables.types.IrcChannel;
 
 public class IrcChannelSerializer implements ObjectSerializer<IrcChannel> {
     @Override
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IrcUserSerializer.java b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IrcUserSerializer.java
index cfd04fd7939910f11ddab462eff93d137378256f..bd32e1b35fc3a27bef94743e7374851a6424e366 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IrcUserSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/IrcUserSerializer.java
@@ -10,8 +10,8 @@ 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.syncables.types.IrcUser;
 import de.kuschku.libquassel.primitives.types.QVariant;
+import de.kuschku.libquassel.syncables.types.IrcUser;
 
 public class IrcUserSerializer implements ObjectSerializer<IrcUser> {
     @Override
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkSerializer.java b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkSerializer.java
index 288ec45646fe1edb374055e10dd169aed0557eac..22308e1a55625d4ba65b1effd48de3977c58eb57 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkSerializer.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/serializers/NetworkSerializer.java
@@ -12,10 +12,10 @@ 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.serializers.StringObjectMapSerializer;
-import de.kuschku.libquassel.syncables.types.IrcChannel;
-import de.kuschku.libquassel.syncables.types.IrcUser;
 import de.kuschku.libquassel.objects.types.NetworkServer;
 import de.kuschku.libquassel.primitives.types.QVariant;
+import de.kuschku.libquassel.syncables.types.IrcChannel;
+import de.kuschku.libquassel.syncables.types.IrcUser;
 import de.kuschku.libquassel.syncables.types.Network;
 
 public class NetworkSerializer implements ObjectSerializer<Network> {
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcChannel.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcChannel.java
index c275fe771ce98c6d1018e6c6c15288dbe2dd7f2e..13fe475c4acee637684dba3b711ec7a18a92cfa1 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcChannel.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcChannel.java
@@ -59,7 +59,7 @@ public class IrcChannel extends SyncableObject {
         if (UserModes.get(nick) == null)
             UserModes.put(nick, mode);
         else if (!UserModes.get(nick).contains(mode))
-            UserModes.put(nick, UserModes.get(nick)+mode);
+            UserModes.put(nick, UserModes.get(nick) + mode);
     }
 
     public void removeUserMode(String nick, String mode) {
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcUser.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcUser.java
index c43a00ade3d7c21a14ce6b42327ed080781a89b9..37765e277338873771fec027d0344634271703f2 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcUser.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/IrcUser.java
@@ -1,19 +1,12 @@
 package de.kuschku.libquassel.syncables.types;
 
-import android.util.Log;
-
-import com.google.common.collect.Lists;
-
 import org.joda.time.DateTime;
 
-import java.util.Arrays;
 import java.util.List;
 
 import de.kuschku.libquassel.BusProvider;
 import de.kuschku.libquassel.Client;
 import de.kuschku.libquassel.functions.types.InitDataFunction;
-import de.kuschku.libquassel.syncables.types.SyncableObject;
-import de.kuschku.util.Stream;
 
 public class IrcUser extends SyncableObject {
     public String server;
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/Network.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/Network.java
index c62ff1b073eb5f66a925a38dca08a212d953cf75..a08e3d417a1027d789f73dee8f5e4dda2acd3e8d 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/Network.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/Network.java
@@ -124,7 +124,7 @@ public class Network extends SyncableObject {
     }
 
     public void addIrcUser(String sender) {
-        provider.dispatch(new InitRequestFunction("IrcUser", getObjectName()+"/"+sender));
+        provider.dispatch(new InitRequestFunction("IrcUser", getObjectName() + "/" + sender));
     }
 
     public IrcUser getUser(String name) {
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/SyncableObject.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/SyncableObject.java
index 4b5a7ac0d0d4b4b0e70e0987d15d05c9b4e097a8..318a2e2e7732c51da2f3e585d52b6fc74698ae0d 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/SyncableObject.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/SyncableObject.java
@@ -27,13 +27,13 @@ public abstract class SyncableObject {
         return objectName;
     }
 
-    public void renameObject(String objectName) {
-        setObjectName(objectName);
-    }
-
     public void setObjectName(String objectName) {
         this.objectName = objectName;
     }
 
+    public void renameObject(String objectName) {
+        setObjectName(objectName);
+    }
+
     public abstract void init(InitDataFunction function, BusProvider provider, Client client);
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/BufferViewManagerChangedEvent.java b/app/src/main/java/de/kuschku/quasseldroid_ng/BufferViewManagerChangedEvent.java
index 878e8a1c0f391f829993f9c936914d3227b6ecf4..32a2a562fd34556bec3a3a04bab31b0234a8d703 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/BufferViewManagerChangedEvent.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/BufferViewManagerChangedEvent.java
@@ -1,17 +1,16 @@
 package de.kuschku.quasseldroid_ng;
 
 public class BufferViewManagerChangedEvent {
-    public enum Action {
-        ADD,
-        REMOVE,
-        MODIFY
-    }
-
     public final int id;
     public final Action action;
-
     public BufferViewManagerChangedEvent(int id, Action action) {
         this.id = id;
         this.action = action;
     }
+
+    public enum Action {
+        ADD,
+        REMOVE,
+        MODIFY
+    }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/MainActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/MainActivity.java
index 332256159a300cbcada8dbc143f5c021c41c1162..4b4960b60702469b83f6645f3791734b9e47b4d0 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/MainActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/MainActivity.java
@@ -162,7 +162,8 @@ public class MainActivity extends AppCompatActivity {
                                     .setPositiveButton("Connect", (dialog, which) -> {
                                         EditText hostname = ((EditText) coreview.findViewById(R.id.server));
                                         EditText port = ((EditText) coreview.findViewById(R.id.port));
-                                        if (binder.getBackgroundThread() != null) binder.getBackgroundThread().provider.event.unregister(this);
+                                        if (binder.getBackgroundThread() != null)
+                                            binder.getBackgroundThread().provider.event.unregister(this);
                                         binder.stopBackgroundThread();
                                         BusProvider provider = new BusProvider();
                                         provider.event.register(this);
@@ -206,42 +207,6 @@ public class MainActivity extends AppCompatActivity {
         super.onConfigurationChanged(newConfig);
     }
 
-    class MessageAdapter extends RecyclerView.Adapter<MessageViewHolder> {
-        ObservableList<Message> messageList = new ObservableList<>(Message.class);
-
-        public void setMessageList(ObservableList<Message> messageList) {
-            this.messageList.setCallback(null);
-            this.messageList = messageList;
-            this.messageList.setCallback(new ObservableList.RecyclerViewAdapterCallback(this));
-            notifyDataSetChanged();
-        }
-
-        @Override
-        public MessageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
-            return new MessageViewHolder(LayoutInflater.from(MainActivity.this).inflate(android.R.layout.simple_list_item_1, parent, false));
-        }
-
-        @Override
-        public void onBindViewHolder(MessageViewHolder holder, int position) {
-            holder.text1.setText(messageList.list.get(position).toString());
-        }
-
-        @Override
-        public int getItemCount() {
-            return messageList.list.size();
-        }
-    };
-
-    class MessageViewHolder extends RecyclerView.ViewHolder {
-        @Bind(android.R.id.text1)
-        TextView text1;
-
-        public MessageViewHolder(View itemView) {
-            super(itemView);
-            ButterKnife.bind(this, itemView);
-        }
-    }
-
     private void switchBuffer(int bufferId) {
         this.bufferId = bufferId;
 
@@ -257,6 +222,8 @@ public class MainActivity extends AppCompatActivity {
         drawer.closeDrawer();
     }
 
+    ;
+
     @Override
     protected void onDestroy() {
         super.onDestroy();
@@ -314,7 +281,7 @@ public class MainActivity extends AppCompatActivity {
                 );
                 break;
         }
-        Collections.sort(header.getProfiles(), (x,y) -> x.getIdentifier() - y.getIdentifier());
+        Collections.sort(header.getProfiles(), (x, y) -> x.getIdentifier() - y.getIdentifier());
         if (event.action == BufferViewManagerChangedEvent.Action.REMOVE && event.id == selectedProfile) {
             ArrayList<IProfile> profiles = header.getProfiles();
             if (!profiles.isEmpty())
@@ -334,4 +301,40 @@ public class MainActivity extends AppCompatActivity {
             Snackbar.make(messages, event.toString(), Snackbar.LENGTH_LONG).show();
         }
     }
+
+    class MessageAdapter extends RecyclerView.Adapter<MessageViewHolder> {
+        ObservableList<Message> messageList = new ObservableList<>(Message.class);
+
+        public void setMessageList(ObservableList<Message> messageList) {
+            this.messageList.setCallback(null);
+            this.messageList = messageList;
+            this.messageList.setCallback(new ObservableList.RecyclerViewAdapterCallback(this));
+            notifyDataSetChanged();
+        }
+
+        @Override
+        public MessageViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
+            return new MessageViewHolder(LayoutInflater.from(MainActivity.this).inflate(android.R.layout.simple_list_item_1, parent, false));
+        }
+
+        @Override
+        public void onBindViewHolder(MessageViewHolder holder, int position) {
+            holder.text1.setText(messageList.list.get(position).toString());
+        }
+
+        @Override
+        public int getItemCount() {
+            return messageList.list.size();
+        }
+    }
+
+    class MessageViewHolder extends RecyclerView.ViewHolder {
+        @Bind(android.R.id.text1)
+        TextView text1;
+
+        public MessageViewHolder(View itemView) {
+            super(itemView);
+            ButterKnife.bind(this, itemView);
+        }
+    }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/NetworkDrawerItem.java b/app/src/main/java/de/kuschku/quasseldroid_ng/NetworkDrawerItem.java
index c118a79214c953785899150ba12839cdc8362c07..eb97d3f94a88cad026fc960204efd1900b0e18c4 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/NetworkDrawerItem.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/NetworkDrawerItem.java
@@ -32,6 +32,6 @@ public class NetworkDrawerItem extends PrimaryDrawerItem {
 
     @Override
     public int getIdentifier() {
-        return network.getNetworkId()* Short.MAX_VALUE;
+        return network.getNetworkId() * Short.MAX_VALUE;
     }
 }
diff --git a/app/src/main/java/de/kuschku/util/ReflectionUtils.java b/app/src/main/java/de/kuschku/util/ReflectionUtils.java
index 97bdfd1343991b39c8901e41490be4ee7f730d17..979d097db20ef2b1e2bb8f1c99cb593c1a46dafc 100644
--- a/app/src/main/java/de/kuschku/util/ReflectionUtils.java
+++ b/app/src/main/java/de/kuschku/util/ReflectionUtils.java
@@ -1,13 +1,13 @@
 package de.kuschku.util;
 
-import java.lang.reflect.InvocationTargetException;
+import android.support.annotation.NonNull;
+
+import com.google.common.primitives.Primitives;
+
 import java.lang.reflect.Method;
-import java.util.ArrayList;
 import java.util.Arrays;
-import java.util.Collections;
 import java.util.List;
 
-import de.kuschku.libquassel.Client;
 import de.kuschku.libquassel.exceptions.SyncInvocationException;
 
 public class ReflectionUtils {
@@ -16,68 +16,53 @@ public class ReflectionUtils {
     }
 
     public static void invokeMethod(Object o, String name, Object[] argv) throws SyncInvocationException {
-        Method m;
+        name = stripName(name);
+
+        Class<?>[] classes = new Class<?>[argv.length];
+        for (int i = 0; i < argv.length; i++) {
+            classes[i] = argv[i].getClass();
+        }
+        Method m = getMethodFromSignature(name, o.getClass(), classes);
         try {
-            m = getMethodFromSignature(name, argv.length, o.getClass());
-            try {
+
+            if (m != null) {
                 m.invoke(o, argv);
-            } catch (Exception e) {
-                e.printStackTrace();
-                throw new SyncInvocationException(e, String.format("Unknown method: %s::%s with arguments: %s", o.getClass().getSimpleName(), name, Arrays.toString(argv)));
             }
-        } catch (SyncInvocationException e) {
-            throw e;
+
         } catch (Exception e) {
-            e.printStackTrace();
-            throw new SyncInvocationException(e, String.format("Unknown method: %s::%s with arguments: %s", o.getClass().getSimpleName(), name, Arrays.toString(argv)));
+            throw new SyncInvocationException(e, String.format("Error invoking %s::%s with arguments %s", o.getClass().getSimpleName(), name, Arrays.toString(argv)));
         }
+        throw new SyncInvocationException(String.format("Error invoking %s::%s with arguments %s", o.getClass().getSimpleName(), name, Arrays.toString(argv)));
+    }
+
+    @NonNull
+    private static String stripName(String name) {
+        return (name.contains("(")) ? name.substring(0, name.indexOf("(")) : name;
     }
 
     public static void invokeMethod(Object o, String name, List argv) throws SyncInvocationException {
         invokeMethod(o, name, argv.toArray(new Object[argv.size()]));
     }
 
-    private static Method getMethodFromSignature(String methodName, int parameterCount, Class cl) {
-        String[] types = new String[] {};
-        if (methodName.contains("(")) {
-            types = methodName.substring(methodName.indexOf("(")+1, methodName.indexOf(")")).split(",");
-            methodName = methodName.substring(0, methodName.indexOf("("));
-        }
+    private static Method getMethodFromSignature(String methodName, Class cl, Class<?>[] parameterTypes) {
+        Method[] methods = cl.getMethods();
+        looper:
+        for (Method m : methods) {
+            if (m.getName().equals(methodName) && m.getParameterTypes().length == parameterTypes.length) {
+                for (int i = 0; i < parameterTypes.length; i++) {
+                    Class mParam = m.getParameterTypes()[i];
+                    Class vParam = parameterTypes[i];
+                    if (mParam.isPrimitive() && Primitives.isWrapperType(vParam))
+                        vParam = Primitives.unwrap(vParam);
 
-        List<Method> candidates = new ArrayList<>();
-        for (final Method m : cl.getDeclaredMethods()) {
-            if (m.getName().equals(methodName) && m.getParameterTypes().length == parameterCount) {
-                candidates.add(m);
-            }
-        }
-        if (candidates.size() == 1) return candidates.get(0);
-        else if (candidates.size() > 1){
-            for (Method m : candidates) {
-                if (matches(types, m.getParameterTypes()))
-                    return m;
-            }
-        }
-
-        throw new IllegalArgumentException("Could not find a method with proper arguments");
-    }
-
-    private static boolean matches(String[] types, Class[] classes) {
-        paramater_loop: for (int i = 0; i < types.length; i++) {
-            Class cl = classes[i];
-            while (cl != Object.class) {
-                if (cl.getSimpleName().equals(types[i])) {
-                    continue paramater_loop;
-                } else {
-                    for (Class in : cl.getInterfaces()) {
-                        if (in.getSimpleName().equals(types[i])) {
-                            continue paramater_loop;
-                        }
+                    if (mParam != vParam && !mParam.isAssignableFrom(vParam)) {
+                        continue looper;
                     }
                 }
-                cl = cl.getSuperclass();
+                return m;
             }
-            return false;
         }
-        return true;
+
+        return null;
     }
 }