diff --git a/app/src/main/java/de/kuschku/libquassel/client/QBufferManager.java b/app/src/main/java/de/kuschku/libquassel/client/QBufferManager.java
index fd75b5b2b65d189f1c699c2cbf8927d1374e0b13..dffa62054eef3f3c46fd225e7b1f2375f8dad0f1 100644
--- a/app/src/main/java/de/kuschku/libquassel/client/QBufferManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/client/QBufferManager.java
@@ -34,6 +34,8 @@ import de.kuschku.libquassel.localtypes.buffers.Buffers;
 import de.kuschku.libquassel.primitives.types.BufferInfo;
 import de.kuschku.libquassel.syncables.types.interfaces.QNetwork;
 
+import static de.kuschku.util.AndroidAssert.assertNotNull;
+
 public class QBufferManager {
     @NonNull
     private final Map<Integer, Buffer> buffers = new HashMap<>();
@@ -70,12 +72,14 @@ public class QBufferManager {
     }
 
     public void postInit() {
-        for (BufferInfo info : bufferInfos) {
-            QNetwork network = client.networkManager().network(info.networkId());
-            if (network == null) continue;
-            Buffer buffer = Buffers.fromType(info, network);
-            if (buffer == null) continue;
-            createBuffer(buffer);
+        if (bufferInfos != null) {
+            for (BufferInfo info : bufferInfos) {
+                QNetwork network = client.networkManager().network(info.networkId());
+                assertNotNull(network);
+                Buffer buffer = Buffers.fromType(info, network);
+                assertNotNull(buffer);
+                createBuffer(buffer);
+            }
         }
         bufferInfos = null;
     }
diff --git a/app/src/main/java/de/kuschku/libquassel/client/QClient.java b/app/src/main/java/de/kuschku/libquassel/client/QClient.java
index ddf73d341fd6b4d8aa718ccd16de6fed533b6ac0..b4e5ff7084f2fa1933caa03222497c1693046d24 100644
--- a/app/src/main/java/de/kuschku/libquassel/client/QClient.java
+++ b/app/src/main/java/de/kuschku/libquassel/client/QClient.java
@@ -135,6 +135,8 @@ public class QClient extends AClient {
 
     @Override
     public void _displayStatusMsg(String network, String message) {
+        assertNotNull(provider);
+
         provider.sendEvent(new StatusMessageEvent(network, message));
     }
 
@@ -165,6 +167,8 @@ public class QClient extends AClient {
 
     @Override
     public void _passwordChanged(long peerPtr, boolean success) {
+        assertNotNull(provider);
+
         if (peerPtr != 0x0000000000000000L)
             provider.sendEvent(new CriticalErrorEvent("Your core has a critical vulnerability. Please update it."));
         provider.sendEvent(new PasswordChangeEvent(success));
@@ -183,13 +187,10 @@ public class QClient extends AClient {
         assertNotNull(provider);
 
         this.connectionStatus = connectionStatus;
-        switch (connectionStatus) {
-            case LOADING_BACKLOG: {
-                bufferManager.postInit();
-                networkManager.postInit();
-                setConnectionStatus(ConnectionChangeEvent.Status.CONNECTED);
-            }
-            break;
+        if (connectionStatus == ConnectionChangeEvent.Status.LOADING_BACKLOG) {
+            networkManager.postInit();
+            bufferManager.postInit();
+            setConnectionStatus(ConnectionChangeEvent.Status.CONNECTED);
         }
         provider.sendEvent(new ConnectionChangeEvent(connectionStatus));
     }
@@ -262,7 +263,11 @@ public class QClient extends AClient {
                 return globalNetworkConfig;
             }
             case "NetworkInfo": {
-                return getObjectByIdentifier(QNetwork.class, "Network", objectName).networkInfo();
+                QNetwork network = networkManager().network(Integer.parseInt(objectName));
+                if (network == null)
+                    return null;
+                else
+                    return network.networkInfo();
             }
             default: {
                 Log.w("libquassel", "Unknown type: " + className + " : " + objectName);
diff --git a/app/src/main/java/de/kuschku/libquassel/client/QNetworkManager.java b/app/src/main/java/de/kuschku/libquassel/client/QNetworkManager.java
index 747991a072f27c7d5400f0c227ebf90a45e4aeee..7684b66946be6545c8339956d74ec9b50ef0ffda 100644
--- a/app/src/main/java/de/kuschku/libquassel/client/QNetworkManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/client/QNetworkManager.java
@@ -24,14 +24,16 @@ package de.kuschku.libquassel.client;
 import android.support.annotation.IntRange;
 import android.support.annotation.NonNull;
 
+import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Observable;
 
 import de.kuschku.libquassel.syncables.types.impl.Network;
 import de.kuschku.libquassel.syncables.types.interfaces.QNetwork;
 
-public class QNetworkManager {
+public class QNetworkManager extends Observable {
     @NonNull
     private final Map<Integer, QNetwork> networks = new HashMap<>();
     private final QClient client;
@@ -46,6 +48,7 @@ public class QNetworkManager {
 
     public void createNetwork(@NonNull QNetwork network) {
         networks.put(network.networkId(), network);
+        _update();
     }
 
     public QNetwork network(@IntRange(from = 0) int networkId) {
@@ -54,6 +57,7 @@ public class QNetworkManager {
 
     public void removeNetwork(@IntRange(from = 0) int network) {
         networks.remove(network);
+        _update();
     }
 
 
@@ -62,6 +66,12 @@ public class QNetworkManager {
             createNetwork(networkId);
             client.requestInitObject("Network", String.valueOf(networkId));
         }
+        _update();
+    }
+
+    private void _update() {
+        setChanged();
+        notifyObservers();
     }
 
     public void onDone(Runnable runnable) {
@@ -72,5 +82,10 @@ public class QNetworkManager {
         for (QNetwork network : networks.values()) {
             network.postInit();
         }
+        _update();
+    }
+
+    public List<QNetwork> networks() {
+        return new ArrayList<>(networks.values());
     }
 }
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 60b11ed04eed6eebb40cfb2c22709e0e3a24e54d..7461e3388f01083a69ef511517cb758ac985bd33 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
@@ -78,6 +78,9 @@ public class NetworkSerializer implements ObjectSerializer<Network> {
         }
 
         final Map<String, QIrcUser> userMap = new HashMap<>(users.size());
+        for (QIrcUser user : users) {
+            userMap.put(user.nick(), user);
+        }
 
         return new Network(
                 channelMap,
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 370a29635e23c7206f4dc4d6d44119267f503676..fe7bb20c29b0a5cff05b66f96edb6b8cfe29d830 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
@@ -24,6 +24,7 @@ package de.kuschku.libquassel.syncables.types;
 import android.support.annotation.CallSuper;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.util.Log;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -115,6 +116,8 @@ public abstract class SyncableObject<T extends SyncableObject<T>> extends Observ
         this.objectName = objectName;
         this.client = client;
         this.initialized = true;
+
+        Log.d("libquassel", "init: " + objectName);
     }
 
     public void _update() {
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 b34f6bfc3e1a02ae1bce545553455ab3e9e0bfa2..38a4789f240dd269092800f65b7d765762fcd8dc 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
@@ -305,6 +305,7 @@ public class BufferViewConfig extends ABufferViewConfig<BufferViewConfig> {
     public void init(@NonNull String objectName, @NonNull BusProvider provider, @NonNull QClient client) {
         bufferViewId = Integer.parseInt(objectName);
         super.init(objectName, provider, client);
+        client.bufferViewManager()._addBufferViewConfig(this);
         _update();
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java
index 6da870050ed85ea384857bd9ee39298c54d9d244..1a9fc0372ec4a1abb5f422dd1e6f09eb566bb664 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcChannel.java
@@ -35,6 +35,8 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
+import de.kuschku.libquassel.BusProvider;
+import de.kuschku.libquassel.client.QClient;
 import de.kuschku.libquassel.primitives.types.QVariant;
 import de.kuschku.libquassel.syncables.serializers.IrcChannelSerializer;
 import de.kuschku.libquassel.syncables.types.abstracts.AIrcChannel;
@@ -424,9 +426,16 @@ public class IrcChannel extends AIrcChannel<IrcChannel> {
             }
         }
         if (cachedChanModes != null) {
+            if (cachedChanModes.get("A") != null)
             A_channelModes = (Map<Character, List<String>>) cachedChanModes.get("A");
+
+            if (cachedChanModes.get("B") != null)
             B_channelModes = (Map<Character, String>) cachedChanModes.get("B");
+
+            if (cachedChanModes.get("C") != null)
             C_channelModes = (Map<Character, String>) cachedChanModes.get("C");
+
+            if (cachedChanModes.get("D") != null)
             D_channelModes = ModeUtils.toModes((String) cachedChanModes.get("D"));
         }
 
@@ -464,4 +473,12 @@ public class IrcChannel extends AIrcChannel<IrcChannel> {
         return result;
     }
 
+    @Override
+    public void init(@NonNull String objectName, @NonNull BusProvider provider, @NonNull QClient client) {
+        super.init(objectName, provider, client);
+
+        String[] split = objectName.split("/");
+        assertEquals(split.length, 2);
+        init(client.networkManager().network(Integer.parseInt(split[0])));
+    }
 }
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java
index 8766ad21df0324a5304a89fd2d74fb31359234da..0118e0598fd5fb05c9c1b4c122b87519800b2921 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IrcUser.java
@@ -34,6 +34,8 @@ import java.util.Locale;
 import java.util.Map;
 import java.util.Set;
 
+import de.kuschku.libquassel.BusProvider;
+import de.kuschku.libquassel.client.QClient;
 import de.kuschku.libquassel.primitives.types.QVariant;
 import de.kuschku.libquassel.syncables.types.abstracts.AIrcUser;
 import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel;
@@ -42,6 +44,8 @@ import de.kuschku.util.backports.Objects;
 import de.kuschku.util.irc.IrcUserUtils;
 import de.kuschku.util.irc.ModeUtils;
 
+import static de.kuschku.util.AndroidAssert.assertEquals;
+
 public class IrcUser extends AIrcUser<IrcUser> {
     @NonNull
     private final SparseArray<DateTime> lastActivity = new SparseArray<>();
@@ -87,6 +91,21 @@ public class IrcUser extends AIrcUser<IrcUser> {
 
     @NonNull
     public static IrcUser create(@NonNull String mask) {
+        String nick;
+        String host;
+        String user;
+
+        // Sometimes this is invoked with a nick instead, so we check
+        if (mask.contains("@")) {
+            nick = IrcUserUtils.getNick(mask);
+            host = IrcUserUtils.getHost(mask);
+            user = IrcUserUtils.getUser(mask);
+        } else {
+            nick = mask;
+            host = null;
+            user = null;
+        }
+
         return new IrcUser(
                 null,
                 null,
@@ -95,15 +114,15 @@ public class IrcUser extends AIrcUser<IrcUser> {
                 null,
                 null,
                 null,
-                IrcUserUtils.getNick(mask),
+                nick,
                 null,
                 null,
                 null,
                 false,
                 null,
-                IrcUserUtils.getHost(mask),
+                host,
                 null,
-                IrcUserUtils.getUser(mask)
+                user
         );
     }
 
@@ -416,12 +435,21 @@ public class IrcUser extends AIrcUser<IrcUser> {
     public void init(QNetwork network) {
         this.network = network;
         channels = new HashSet<>();
+        if (cachedChannels != null)
         for (String channelName : cachedChannels) {
             channels.add(network().newIrcChannel(channelName));
         }
         _update();
     }
 
+    @Override
+    public void init(@NonNull String objectName, @NonNull BusProvider provider, @NonNull QClient client) {
+        super.init(objectName, provider, client);
+        String[] split = objectName.split("/");
+        assertEquals(split.length, 2);
+        init(client.networkManager().network(Integer.parseInt(split[0])));
+    }
+
     @Override
     public void update(Map<String, QVariant> from) {
     }
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 afb9a2e34fb1663a49096218d20290f477b9e79b..eb8ac90fd02a33df92c5dcbae8f7a736ba785983 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
@@ -754,6 +754,7 @@ public class Network extends ANetwork<Network> implements Observer {
     public void init(@NonNull String objectName, @NonNull BusProvider provider, @NonNull QClient client) {
         super.init(objectName, provider, client);
         networkInfo._setNetworkId(Integer.parseInt(objectName));
+        client.networkManager().createNetwork(this);
     }
 
     @Override
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigWrapper.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigWrapper.java
index be5e66f1b047d4af30b9ae27082f1826c2f6198d..0b8bd3510c384b5ee27ea307e5306e3f076d19ea 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigWrapper.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/BufferViewConfigWrapper.java
@@ -29,6 +29,7 @@ import com.mikepenz.materialdrawer.model.interfaces.IDrawerItem;
 import java.util.ArrayList;
 
 import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig;
+import de.kuschku.libquassel.syncables.types.interfaces.QNetwork;
 import de.kuschku.quasseldroid_ng.ui.theme.AppContext;
 import de.kuschku.util.observables.lists.ObservableSortedList;
 
@@ -50,11 +51,26 @@ public class BufferViewConfigWrapper {
             return item1.getNetwork().networkId() == item2.getNetwork().networkId();
         }
     });
+    @NonNull
+    private final AppContext context;
+    @NonNull
+    private final QBufferViewConfig config;
     private Drawer drawer;
 
     public BufferViewConfigWrapper(@NonNull AppContext context, @NonNull QBufferViewConfig config, Drawer drawer) {
+        this.context = context;
+        this.config = config;
         this.drawer = drawer;
+        updateNetworks();
+    }
+
+    public void updateNetworks() {
         networks.clear();
+        if (config.networkId() != 0)
+            networks.add(new NetworkItem(context, context.client().networkManager().network(config.networkId()), config));
+        else
+            for (QNetwork network : context.client().networkManager().networks())
+                networks.add(new NetworkItem(context, network, config));
     }
 
     public void updateDrawerItems() {
diff --git a/app/src/main/java/de/kuschku/util/irc/IrcUserUtils.java b/app/src/main/java/de/kuschku/util/irc/IrcUserUtils.java
index 3f9a04945ebe9e0fdd2a725bc942535b80388190..47f5ba912f2f243e7df196b1054df5f14d9cae2a 100644
--- a/app/src/main/java/de/kuschku/util/irc/IrcUserUtils.java
+++ b/app/src/main/java/de/kuschku/util/irc/IrcUserUtils.java
@@ -49,22 +49,22 @@ public class IrcUserUtils {
 
     @NonNull
     public static String getNick(@NonNull String hostmask) {
-        return hostmask.split("!")[0];
+        return hostmask.split("!", -1)[0];
     }
 
     @NonNull
     public static String getUser(@NonNull String hostmask) {
-        return getMask(hostmask).split("@")[0];
+        return getMask(hostmask).split("@", -1)[0];
     }
 
     @NonNull
     public static String getHost(@NonNull String hostmask) {
-        return getMask(hostmask).split("@")[1];
+        return getMask(hostmask).split("@", -1)[1];
     }
 
     @NonNull
     public static String getMask(@NonNull String hostmask) {
-        return hostmask.split("!")[1];
+        return hostmask.split("!", -1)[1];
     }
 
     public static class CRCUtils {