diff --git a/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java b/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java
index 8d8e10b31bc839965651deb76edc72399cb6f568..3b2c11994c5be4ffe13571023a79449e1224048f 100644
--- a/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java
@@ -25,20 +25,12 @@ import android.support.annotation.IntRange;
 import android.support.annotation.NonNull;
 
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 import de.kuschku.libquassel.localtypes.buffers.Buffer;
 import de.kuschku.libquassel.localtypes.buffers.Buffers;
-import de.kuschku.libquassel.localtypes.buffers.ChannelBuffer;
-import de.kuschku.libquassel.localtypes.buffers.QueryBuffer;
-import de.kuschku.libquassel.localtypes.buffers.StatusBuffer;
 import de.kuschku.libquassel.primitives.types.BufferInfo;
-import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel;
-import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser;
-import de.kuschku.libquassel.syncables.types.interfaces.QNetwork;
 
 import static de.kuschku.util.AndroidAssert.assertNotNull;
 
@@ -47,10 +39,6 @@ public class BufferManager {
     private final Map<Integer, Buffer> buffers = new HashMap<>();
     private final Client client;
 
-    // We cache those, because the networks might not be initialized at begin
-    @NonNull
-    private Map<String, Set<BufferInfo>> bufferInfos = new HashMap<>();
-
     public BufferManager(Client client) {
         this.client = client;
     }
@@ -75,56 +63,17 @@ public class BufferManager {
 
     public void init(List<BufferInfo> bufferInfos) {
         for (BufferInfo info : bufferInfos) {
-            if (this.bufferInfos.get(objectName(info)) == null)
-                this.bufferInfos.put(objectName(info), new HashSet<>());
-
-            this.bufferInfos.get(objectName(info)).add(info);
+            createBuffer(info);
         }
     }
 
-    private String objectName(BufferInfo info) {
-        if (info.type() == BufferInfo.Type.STATUS)
-            return String.valueOf(info.networkId());
-        else
-            return info.networkId() + "/" + info.name();
-    }
-
-    public void postInit(String objectName, QIrcUser ircUser) {
-        if (bufferInfos.get(objectName) != null)
-            for (BufferInfo info : bufferInfos.get(objectName)) {
-                QNetwork network = client.networkManager().network(info.networkId());
-                assertNotNull(network);
-                createBuffer(new QueryBuffer(info, ircUser));
-            }
-    }
-
-    public void postInit(String objectName, QNetwork ircUser) {
-        if (bufferInfos.get(objectName) != null)
-            for (BufferInfo info : bufferInfos.get(objectName)) {
-                QNetwork network = client.networkManager().network(info.networkId());
-                assertNotNull(network);
-                createBuffer(new StatusBuffer(info, ircUser));
-            }
-    }
-
     public Map<Integer, Buffer> buffers() {
         return buffers;
     }
 
-    public void postInit(String objectName, QIrcChannel ircChannel) {
-        if (bufferInfos.get(objectName) != null)
-            for (BufferInfo info : bufferInfos.get(objectName)) {
-                QNetwork network = client.networkManager().network(info.networkId());
-                assertNotNull(network);
-                createBuffer(new ChannelBuffer(info, ircChannel));
-            }
-    }
-
     public void createBuffer(BufferInfo info) {
-        QNetwork network = client.networkManager().network(info.networkId());
-        if (network == null) return;
-        Buffer buffer = Buffers.fromType(info, network);
-        if (buffer == null) return;
+        Buffer buffer = Buffers.fromType(info, client);
+        assertNotNull(buffer);
         createBuffer(buffer);
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/client/Client.java b/app/src/main/java/de/kuschku/libquassel/client/Client.java
index 6401bd5f62eb2882a77746bdfe76df5fa90b7c59..6ce6497cb8a018918f9eb1749ff7bbb9ffdda344 100644
--- a/app/src/main/java/de/kuschku/libquassel/client/Client.java
+++ b/app/src/main/java/de/kuschku/libquassel/client/Client.java
@@ -193,6 +193,9 @@ public class Client extends AClient {
 
         this.connectionStatus = connectionStatus;
         if (connectionStatus == ConnectionChangeEvent.Status.LOADING_BACKLOG) {
+            for (QNetwork network : networkManager().networks()) {
+                Log.d("libquassel", String.valueOf(network.channels()));
+            }
             setConnectionStatus(ConnectionChangeEvent.Status.CONNECTED);
         }
         provider.sendEvent(new ConnectionChangeEvent(connectionStatus));
@@ -457,7 +460,7 @@ public class Client extends AClient {
             Log.d("libquassel", "Creating buffer from message info: " + info.id());
         }
         if (bufferedBuffers.containsKey(info.id())) {
-            Pair<QBufferViewConfig, Integer> pair = bufferedBuffers.remove(info.id());
+            Pair<QBufferViewConfig, Integer> pair = bufferedBuffers.get(info.id());
             pair.first._addBuffer(info.id(), pair.second);
             Log.d("libquassel", "Un-Queueing buffer: " + info.id());
         }
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/Buffers.java b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/Buffers.java
index 10627998eb8dad7a91de5db614e63d443d4190f6..a1ab5b5b7f779b3195f7112055cbb3d7a8d60f83 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/Buffers.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/Buffers.java
@@ -24,46 +24,25 @@ package de.kuschku.libquassel.localtypes.buffers;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 
+import de.kuschku.libquassel.client.Client;
 import de.kuschku.libquassel.primitives.types.BufferInfo;
-import de.kuschku.libquassel.syncables.types.interfaces.QNetwork;
-
-import static de.kuschku.util.AndroidAssert.assertNotNull;
 
 public class Buffers {
     private Buffers() {
 
     }
 
-    public static boolean exists(@NonNull BufferInfo info, @NonNull QNetwork network) {
-        switch (info.type()) {
-            case QUERY:
-                return info.name() != null && network.ircUser(info.name()) != null;
-            case CHANNEL:
-                return info.name() != null && network.ircChannel(info.name()) != null;
-            case STATUS:
-                return true;
-            default:
-                return false;
-        }
-    }
-
     @Nullable
-    public static Buffer fromType(@NonNull BufferInfo info, @NonNull QNetwork network) {
-        Buffer result;
+    public static Buffer fromType(@NonNull BufferInfo info, @NonNull Client client) {
         switch (info.type()) {
             case QUERY:
-                assertNotNull(info.name());
-                result = new QueryBuffer(info, network.ircUser(info.name()));
-                break;
+                return new QueryBuffer(info, client);
             case CHANNEL:
-                result = new ChannelBuffer(info, network.ircChannel(info.name()));
-                break;
+                return new ChannelBuffer(info, client);
             case STATUS:
-                result = new StatusBuffer(info, network);
-                break;
+                return new StatusBuffer(info, client);
             default:
                 return null;
         }
-        return result;
     }
 }
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/ChannelBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/ChannelBuffer.java
index ea3d4db269a99a9c219e5b32579a3b4dee096d8e..3a0451742c332843eab15458431df5d48775d42a 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/ChannelBuffer.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/ChannelBuffer.java
@@ -24,21 +24,19 @@ package de.kuschku.libquassel.localtypes.buffers;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 
+import de.kuschku.libquassel.client.Client;
 import de.kuschku.libquassel.primitives.types.BufferInfo;
 import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel;
 
-import static de.kuschku.util.AndroidAssert.assertNotNull;
-
 public class ChannelBuffer implements Buffer {
+    @NonNull
+    private final Client client;
     @NonNull
     private BufferInfo info;
-    @Nullable
-    private QIrcChannel channel;
 
-    public ChannelBuffer(@NonNull BufferInfo info, @Nullable QIrcChannel channel) {
-        assertNotNull(channel);
+    public ChannelBuffer(@NonNull BufferInfo info, @NonNull Client client) {
         this.info = info;
-        this.channel = channel;
+        this.client = client;
     }
 
     @NonNull
@@ -61,21 +59,17 @@ public class ChannelBuffer implements Buffer {
     @NonNull
     @Override
     public BufferInfo.BufferStatus getStatus() {
-        return channel == null ? BufferInfo.BufferStatus.OFFLINE : BufferInfo.BufferStatus.ONLINE;
+        return getChannel() == null ? BufferInfo.BufferStatus.OFFLINE : BufferInfo.BufferStatus.ONLINE;
     }
 
     @Override
     public void renameBuffer(@NonNull String newName) {
-
+        info.setName(newName);
     }
 
     @Nullable
     public QIrcChannel getChannel() {
-        return channel;
-    }
-
-    public void setChannel(@Nullable QIrcChannel channel) {
-        this.channel = channel;
+        return client.networkManager().network(info.networkId()).ircChannel(info.name());
     }
 
     @NonNull
@@ -83,7 +77,6 @@ public class ChannelBuffer implements Buffer {
     public String toString() {
         return "ChannelBuffer{" +
                 "info=" + info +
-                ", channel=" + channel +
                 '}';
     }
 }
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/QueryBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/QueryBuffer.java
index 48cee59997ff698426063bb4aecc075ed3ce77d8..0b862ab5c80d0bec18e3c74a698f7f6044403ba3 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/QueryBuffer.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/QueryBuffer.java
@@ -24,21 +24,19 @@ package de.kuschku.libquassel.localtypes.buffers;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 
+import de.kuschku.libquassel.client.Client;
 import de.kuschku.libquassel.primitives.types.BufferInfo;
 import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser;
 
-import static de.kuschku.util.AndroidAssert.assertNotNull;
-
 public class QueryBuffer implements Buffer {
-    @Nullable
-    private final QIrcUser user;
+    @NonNull
+    private final Client client;
     @NonNull
     private BufferInfo info;
 
-    public QueryBuffer(@NonNull BufferInfo info, @Nullable QIrcUser user) {
-        assertNotNull(user);
+    public QueryBuffer(@NonNull BufferInfo info, @NonNull Client client) {
         this.info = info;
-        this.user = user;
+        this.client = client;
     }
 
     @NonNull
@@ -61,19 +59,19 @@ public class QueryBuffer implements Buffer {
     @NonNull
     @Override
     public BufferInfo.BufferStatus getStatus() {
-        return (user == null) ? BufferInfo.BufferStatus.OFFLINE :
-                (user.isAway()) ? BufferInfo.BufferStatus.AWAY :
+        return (getUser() == null) ? BufferInfo.BufferStatus.OFFLINE :
+                (getUser().isAway()) ? BufferInfo.BufferStatus.AWAY :
                         BufferInfo.BufferStatus.ONLINE;
     }
 
     @Override
     public void renameBuffer(@NonNull String newName) {
-
+        info.setName(newName);
     }
 
     @Nullable
     public QIrcUser getUser() {
-        return user;
+        return client.networkManager().network(info.networkId()).ircUser(info.name());
     }
 
     @NonNull
@@ -81,7 +79,6 @@ public class QueryBuffer implements Buffer {
     public String toString() {
         return "QueryBuffer{" +
                 "info=" + info +
-                ", user=" + user +
                 '}';
     }
 }
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/StatusBuffer.java b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/StatusBuffer.java
index 36041b9fba83283cc4f9d786ab7946326f77aae9..cd172cf586b151c08f7b052a8ed6e09855d505e5 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/StatusBuffer.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/buffers/StatusBuffer.java
@@ -24,18 +24,19 @@ package de.kuschku.libquassel.localtypes.buffers;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
 
+import de.kuschku.libquassel.client.Client;
 import de.kuschku.libquassel.primitives.types.BufferInfo;
 import de.kuschku.libquassel.syncables.types.interfaces.QNetwork;
 
 public class StatusBuffer implements Buffer {
     @NonNull
-    private final QNetwork network;
+    private final Client client;
     @NonNull
     private BufferInfo info;
 
-    public StatusBuffer(@NonNull BufferInfo info, @NonNull QNetwork network) {
+    public StatusBuffer(@NonNull BufferInfo info, @NonNull Client client) {
         this.info = info;
-        this.network = network;
+        this.client = client;
     }
 
     @NonNull
@@ -49,16 +50,20 @@ public class StatusBuffer implements Buffer {
         this.info = info;
     }
 
+    public QNetwork getNetwork() {
+        return client.networkManager().network(info.networkId());
+    }
+
     @Nullable
     @Override
     public String getName() {
-        return network.networkName();
+        return getNetwork().networkName();
     }
 
     @NonNull
     @Override
     public BufferInfo.BufferStatus getStatus() {
-        return network.isConnected() ? BufferInfo.BufferStatus.ONLINE : BufferInfo.BufferStatus.OFFLINE;
+        return getNetwork().isConnected() ? BufferInfo.BufferStatus.ONLINE : BufferInfo.BufferStatus.OFFLINE;
     }
 
     @Override
@@ -71,7 +76,6 @@ public class StatusBuffer implements Buffer {
     public String toString() {
         return "StatusBuffer{" +
                 "info=" + info +
-                ", network=" + network +
                 '}';
     }
 }
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 2cfd900a0f1080ca1fc6de2b0447c94f02ee0b1d..da883087954edb5f3ed784341170418eddab5af3 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
@@ -22,7 +22,6 @@
 package de.kuschku.libquassel.syncables.types.impl;
 
 import android.support.annotation.NonNull;
-import android.util.Log;
 
 import java.util.Collections;
 import java.util.List;
@@ -275,8 +274,6 @@ public class BufferViewConfig extends ABufferViewConfig<BufferViewConfig> {
 
     @Override
     public void _removeBuffer(int bufferId) {
-        Log.d("after", String.valueOf(buffers));
-
         int index;
         if ((index = buffers.indexOf(bufferId)) != -1) {
             buffers.remove(index);
@@ -286,8 +283,6 @@ public class BufferViewConfig extends ABufferViewConfig<BufferViewConfig> {
             removedBuffers.remove(bufferId);
 
         temporarilyRemovedBuffers.add(bufferId);
-
-        Log.d("after", String.valueOf(buffers));
         _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 520837eb3b5a169fdaefeb0983ea2ae6180c3db1..bf9e3eb95f147a48b777a79ecf8833b058be997c 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
@@ -444,8 +444,6 @@ public class IrcChannel extends AIrcChannel<IrcChannel> {
         cachedChanModes = null;
 
         this.network._addIrcChannel(this);
-
-        client.bufferManager().postInit(network.networkId() + "/" + name(), this);
         _update();
     }
 
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 063c4344cff2ca45f3e1f4c9c8b6f127f3e57740..3b36b2ab01407d6904fba047c56dad7777b4011c 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
@@ -440,7 +440,6 @@ public class IrcUser extends AIrcUser<IrcUser> {
         for (String channelName : cachedChannels) {
             channels.add(network().newIrcChannel(channelName));
         }
-        client.bufferManager().postInit(network.networkId() + "/" + nick(), this);
         _update();
     }
 
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 2878e8420aaae8b22c9cfd8ea28c7013c2865e89..0d74ab0d6d9109833c92d9dc0b55becc760cfaa4 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
@@ -405,9 +405,12 @@ public class Network extends ANetwork<Network> implements Observer {
 
     @Override
     public QIrcChannel newIrcChannel(@NonNull String channelname) {
-        QIrcChannel channel = IrcChannel.create(channelname);
-        channels.put(IrcCaseMapper.toLowerCase(channelname), channel);
-        return channel;
+        if (!channels.containsKey(IrcCaseMapper.toLowerCase(channelname))) {
+            QIrcChannel channel = IrcChannel.create(channelname);
+            channels.put(IrcCaseMapper.toLowerCase(channelname), channel);
+            channel.init(this, client);
+        }
+        return channels.get(IrcCaseMapper.toLowerCase(channelname));
     }
 
     @Nullable
@@ -757,7 +760,6 @@ public class Network extends ANetwork<Network> implements Observer {
         for (QIrcUser name : ircUsers()) {
             client.requestInitObject("IrcUser", networkId() + "/" + name.nick());
         }
-        client.bufferManager().postInit(String.valueOf(networkId()), this);
     }
 
     @Override