diff --git a/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java b/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java
index 3da4609ceb5a2cc4121aa37044c4d837f9f5a870..685c074ba23d514b77437973a016cd70a3b125b6 100644
--- a/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java
+++ b/app/src/main/java/de/kuschku/libquassel/ProtocolHandler.java
@@ -96,7 +96,7 @@ public class ProtocolHandler implements IProtocolHandler {
             final Object syncable = client.unsafe_getObjectByIdentifier(packedFunc.className, packedFunc.objectName);
 
             if (syncable == null) {
-                Log.d("ProtocolHandler", String.format("Sync Failed: %s::%s(%s, %s)", packedFunc.className, packedFunc.methodName, packedFunc.objectName, packedFunc.params));
+                Log.w("ProtocolHandler", String.format("Sync Failed: %s::%s(%s, %s)", packedFunc.className, packedFunc.methodName, packedFunc.objectName, packedFunc.params));
                 if (client.connectionStatus() == ConnectionChangeEvent.Status.INITIALIZING_DATA)
                     client.bufferSync(packedFunc);
             } else {
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 832b84ff6183dcf3288a1b9fa88a4d635c1f3073..749bc98ef395e8fa8f871fc1021fb6ea574c3712 100644
--- a/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/client/BufferManager.java
@@ -24,6 +24,7 @@ package de.kuschku.libquassel.client;
 import android.support.annotation.IntRange;
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.util.Log;
 
 import java.util.HashMap;
 import java.util.HashSet;
@@ -38,7 +39,9 @@ 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.impl.Network;
 import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig;
 import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel;
 import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser;
@@ -53,6 +56,7 @@ public class BufferManager {
 
     private final Map<String, Integer> buffersByNick = new HashMap<>();
     private final Map<String, Integer> buffersByChannel = new HashMap<>();
+    private final Map<Integer, Integer> statusBuffers = new HashMap<>();
     private final Map<Integer, ObservableSet<Integer>> buffersByNetwork = new HashMap<>();
     private final ObservableSet<Integer> bufferIds = new ObservableSet<>();
     private final Set<Integer> laterRequests = new HashSet<>();
@@ -120,12 +124,15 @@ public class BufferManager {
     }
 
     private void updateBufferMapEntries(@NonNull Buffer buffer, String name) {
-        buffersByNick.remove(buffer.objectName());
-        buffersByChannel.remove(buffer.objectName());
         if (buffer instanceof ChannelBuffer) {
+            buffersByChannel.remove(buffer.objectName());
             buffersByChannel.put(buffer.objectName(name), buffer.getInfo().id);
         } else if (buffer instanceof QueryBuffer) {
+            buffersByNick.remove(buffer.objectName());
             buffersByNick.put(buffer.objectName(name), buffer.getInfo().id);
+        } else if (buffer instanceof StatusBuffer) {
+            statusBuffers.remove(buffer.getInfo().networkId);
+            statusBuffers.put(buffer.getInfo().networkId, buffer.getInfo().id);
         }
     }
 
@@ -187,4 +194,8 @@ public class BufferManager {
             client.setConnectionStatus(ConnectionChangeEvent.Status.CONNECTED);
         }
     }
+
+    public StatusBuffer network(int networkId) {
+        return (StatusBuffer) buffers.get(statusBuffers.get(networkId));
+    }
 }
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java b/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java
index 0281af62ebb68ec7e7c03ac51185af8d692b830c..b12ba76f2ab7dc0c5a3f2497d6b3e1f4360a770f 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/BacklogFilter.java
@@ -204,7 +204,6 @@ public class BacklogFilter implements UICallback {
         setFiltersInternal(filters);
         client.metaDataManager().setHiddendata(client.coreId(), bufferId, filters);
         int after = client.metaDataManager().hiddendata(client.coreId(), bufferId);
-        Log.e("DEBUG", filters + ":" + after);
     }
 
     private void setFiltersInternal(int filters) {
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/BacklogStorage.java b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/BacklogStorage.java
index 1df4329f9112162158fc82540a702cacc7029c61..32418578b5a3ea813bdf69f5a8cae5a1c770e2f2 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/BacklogStorage.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/BacklogStorage.java
@@ -25,6 +25,7 @@ import android.support.annotation.IntRange;
 import android.support.annotation.NonNull;
 
 import java.util.List;
+import java.util.Set;
 
 import de.kuschku.libquassel.client.Client;
 import de.kuschku.libquassel.localtypes.BacklogFilter;
@@ -56,4 +57,6 @@ public interface BacklogStorage {
     void markBufferUnused(@IntRange(from = 0) int bufferid);
 
     void clear(@IntRange(from = 0) int bufferid);
+
+    Set<BacklogFilter> getFilters();
 }
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/HybridBacklogStorage.java b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/HybridBacklogStorage.java
index 7a53276ec8647f2745a76d893fb82c6995727f10..c85e01f8c331930a8b64fcc0d8bb5496fb7dfb02 100644
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/HybridBacklogStorage.java
+++ b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/HybridBacklogStorage.java
@@ -31,7 +31,9 @@ import com.raizlabs.android.dbflow.sql.language.SQLite;
 import com.raizlabs.android.dbflow.structure.database.DatabaseWrapper;
 import com.raizlabs.android.dbflow.structure.database.transaction.ITransaction;
 
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
 
 import de.kuschku.libquassel.client.Client;
 import de.kuschku.libquassel.localtypes.BacklogFilter;
@@ -51,6 +53,8 @@ public class HybridBacklogStorage implements BacklogStorage {
     private final SparseArray<BacklogFilter> filters = new SparseArray<>();
     @NonNull
     private final SparseArray<Integer> latestMessage = new SparseArray<>();
+    @NonNull
+    private final Set<BacklogFilter> filterSet = new HashSet<>();
 
     private Client client;
 
@@ -175,7 +179,10 @@ public class HybridBacklogStorage implements BacklogStorage {
                 backlogs.get(bufferid).removeCallback(filters.get(bufferid));
             backlogs.remove(bufferid);
             filteredBacklogs.remove(bufferid);
-            filters.remove(bufferid);
+            synchronized (filterSet) {
+                filterSet.remove(filters.get(bufferid));
+                filters.remove(bufferid);
+            }
         }
     }
 
@@ -187,6 +194,12 @@ public class HybridBacklogStorage implements BacklogStorage {
         }
     }
 
+    @NonNull
+    @Override
+    public Set<BacklogFilter> getFilters() {
+        return filterSet;
+    }
+
     private void ensureExisting(@IntRange(from = -1) int bufferId) {
         assertNotNull(client);
         if (backlogs.get(bufferId) == null) {
@@ -200,7 +213,10 @@ public class HybridBacklogStorage implements BacklogStorage {
                 backlogs.put(bufferId, messages);
             }
             filteredBacklogs.put(bufferId, filteredMessages);
-            filters.put(bufferId, backlogFilter);
+            synchronized (filterSet) {
+                filters.put(bufferId, backlogFilter);
+                filterSet.add(backlogFilter);
+            }
         }
     }
 }
diff --git a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/MemoryBacklogStorage.java b/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/MemoryBacklogStorage.java
deleted file mode 100644
index fe0c2e4bab1786399fde3885bd51c6c3f60fb858..0000000000000000000000000000000000000000
--- a/app/src/main/java/de/kuschku/libquassel/localtypes/backlogstorage/MemoryBacklogStorage.java
+++ /dev/null
@@ -1,148 +0,0 @@
-/*
- * QuasselDroid - Quassel client for Android
- * Copyright (C) 2016 Janne Koschinski
- * Copyright (C) 2016 Ken Børge Viktil
- * Copyright (C) 2016 Magnus Fjell
- * Copyright (C) 2016 Martin Sandsmark <martin.sandsmark@kde.org>
- *
- * This program is free software: you can redistribute it and/or modify it
- * under the terms of the GNU General Public License as published by the Free
- * Software Foundation, either version 3 of the License, or (at your option)
- * any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program.  If not, see <http://www.gnu.org/licenses/>.
- */
-
-package de.kuschku.libquassel.localtypes.backlogstorage;
-
-import android.support.annotation.IntRange;
-import android.support.annotation.NonNull;
-import android.util.SparseArray;
-
-import java.util.List;
-
-import de.kuschku.libquassel.client.Client;
-import de.kuschku.libquassel.localtypes.BacklogFilter;
-import de.kuschku.libquassel.message.Message;
-import de.kuschku.util.observables.lists.ObservableComparableSortedList;
-
-import static de.kuschku.util.AndroidAssert.assertNotNull;
-
-public class MemoryBacklogStorage implements BacklogStorage {
-    @NonNull
-    private final SparseArray<ObservableComparableSortedList<Message>> backlogs = new SparseArray<>();
-    @NonNull
-    private final SparseArray<ObservableComparableSortedList<Message>> filteredBacklogs = new SparseArray<>();
-    @NonNull
-    private final SparseArray<BacklogFilter> filters = new SparseArray<>();
-    @NonNull
-    private final SparseArray<Integer> latestMessage = new SparseArray<>();
-
-    private Client client;
-
-    @NonNull
-    @Override
-    public ObservableComparableSortedList<Message> getUnfiltered(@IntRange(from = -1) int bufferid) {
-        ensureExisting(bufferid);
-        return backlogs.get(bufferid);
-    }
-
-    @NonNull
-    @Override
-    public ObservableComparableSortedList<Message> getFiltered(@IntRange(from = -1) int bufferid) {
-        ensureExisting(bufferid);
-        return filteredBacklogs.get(bufferid);
-    }
-
-    @NonNull
-    @Override
-    public BacklogFilter getFilter(int bufferid) {
-        ensureExisting(bufferid);
-        return filters.get(bufferid);
-    }
-
-    @Override
-    public int getLatest(@IntRange(from = 0) int bufferid) {
-        return latestMessage.get(bufferid, -1);
-    }
-
-    @Override
-    public void insertMessages(@IntRange(from = 0) int bufferId, @NonNull Message... messages) {
-        ensureExisting(bufferId);
-        for (Message message : messages) {
-            client.unbufferBuffer(message.bufferInfo);
-            backlogs.get(bufferId).add(message);
-            updateLatest(message);
-        }
-    }
-
-    @Override
-    public void insertMessages(@IntRange(from = 0) int bufferId, List<Message> messages) {
-        ensureExisting(bufferId);
-        for (Message message : messages) {
-            client.unbufferBuffer(message.bufferInfo);
-            backlogs.get(bufferId).add(message);
-            updateLatest(message);
-        }
-    }
-
-    public void updateLatest(@NonNull Message message) {
-        if (message.id > getLatest(message.bufferInfo.id)) {
-            latestMessage.put(message.bufferInfo.id, message.id);
-        }
-    }
-
-    @Override
-    public void insertMessages(@NonNull Message... messages) {
-        for (Message message : messages) {
-            ensureExisting(message.bufferInfo.id);
-            client.unbufferBuffer(message.bufferInfo);
-            backlogs.get(message.bufferInfo.id).add(message);
-            updateLatest(message);
-        }
-    }
-
-    @Override
-    public void insertMessages(List<Message> messages) {
-        for (Message message : messages) {
-            ensureExisting(message.bufferInfo.id);
-            client.unbufferBuffer(message.bufferInfo);
-            backlogs.get(message.bufferInfo.id).add(message);
-            updateLatest(message);
-        }
-    }
-
-    public void setClient(Client client) {
-        this.client = client;
-    }
-
-    @Override
-    public void markBufferUnused(@IntRange(from = 0) int bufferid) {
-        // Does nothing in memory backlog storage
-    }
-
-    @Override
-    public void clear(@IntRange(from = 0) int bufferid) {
-        ensureExisting(bufferid);
-        backlogs.get(bufferid).clear();
-    }
-
-    private void ensureExisting(@IntRange(from = -1) int bufferId) {
-        assertNotNull(client);
-        if (backlogs.get(bufferId) == null) {
-            ObservableComparableSortedList<Message> messages = new ObservableComparableSortedList<>(Message.class, true);
-            ObservableComparableSortedList<Message> filteredMessages = new ObservableComparableSortedList<>(Message.class, true);
-            BacklogFilter backlogFilter = new BacklogFilter(client, bufferId, messages, filteredMessages);
-            messages.addCallback(backlogFilter);
-            backlogs.put(bufferId, messages);
-            filteredBacklogs.put(bufferId, filteredMessages);
-            filters.put(bufferId, backlogFilter);
-        }
-    }
-}
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 72ae63042aed01ba73e04f16dd56200c7659effa..bf87ac64d87295523a96cb2e25a1deb2abb8ce0f 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
@@ -41,6 +41,10 @@ public class StatusBuffer implements Buffer {
         this.client = client;
     }
 
+    public void updateStatus() {
+        status.set(getNetwork() != null && getNetwork().isConnected() ? BufferInfo.BufferStatus.ONLINE : BufferInfo.BufferStatus.OFFLINE);
+    }
+
     @NonNull
     @Override
     public BufferInfo getInfo() {
@@ -65,8 +69,7 @@ public class StatusBuffer implements Buffer {
     @NonNull
     @Override
     public ObservableField<BufferInfo.BufferStatus> getStatus() {
-        // FIXME: Make this dynamic
-        status.set(getNetwork().isConnected() ? BufferInfo.BufferStatus.ONLINE : BufferInfo.BufferStatus.OFFLINE);
+        updateStatus();
         return status;
     }
 
diff --git a/app/src/main/java/de/kuschku/libquassel/protocols/DatastreamPeer.java b/app/src/main/java/de/kuschku/libquassel/protocols/DatastreamPeer.java
index 7b2ed24e00848649d4824e5d322bc187f6205026..716699c6cf5b2bcc57ac826723cd63ef389cef7c 100644
--- a/app/src/main/java/de/kuschku/libquassel/protocols/DatastreamPeer.java
+++ b/app/src/main/java/de/kuschku/libquassel/protocols/DatastreamPeer.java
@@ -94,7 +94,7 @@ public class DatastreamPeer implements RemotePeer {
         this.connection = connection;
         this.busProvider = busProvider;
         this.busProvider.dispatch.register(this);
-        this.parseExecutor = Executors.newCachedThreadPool();
+        this.parseExecutor = Executors.newSingleThreadExecutor();
     }
 
     @NonNull
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IgnoreListManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IgnoreListManager.java
index c2d02098206966572ac0a075d89ea7327ec6fea8..288e7249f3d80d7bfa392317ae88b78d882fd526 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IgnoreListManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/impl/IgnoreListManager.java
@@ -23,14 +23,17 @@ package de.kuschku.libquassel.syncables.types.impl;
 
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.util.Log;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.List;
 import java.util.Map;
 import java.util.regex.Pattern;
 
 import de.kuschku.libquassel.BusProvider;
 import de.kuschku.libquassel.client.Client;
+import de.kuschku.libquassel.localtypes.BacklogFilter;
 import de.kuschku.libquassel.message.Message;
 import de.kuschku.libquassel.primitives.types.QVariant;
 import de.kuschku.libquassel.syncables.serializers.IgnoreListManagerSerializer;
@@ -112,22 +115,21 @@ public class IgnoreListManager extends AIgnoreListManager<IgnoreListManager> {
 
     @Override
     public StrictnessType match(String msgContents, String msgSender, Message.Type msgType, @NonNull String network, @NonNull String bufferName) {
-        if (msgType != Message.Type.Plain && msgType != Message.Type.Notice && msgType != Message.Type.Action)
-            return StrictnessType.UnmatchedStrictness;
-
-        for (IgnoreListItem item : ignoreList) {
-            if (!item.isActive || item.type == IgnoreType.CtcpIgnore)
-                continue;
-
-            if (item.scopeMatch(network, bufferName)) {
-                String str;
-                if (item.type == IgnoreType.MessageIgnore)
-                    str = msgContents;
-                else
-                    str = msgSender;
-
-                if (item.matches(str))
-                    return item.strictness;
+        if (msgType == Message.Type.Plain || msgType == Message.Type.Notice || msgType == Message.Type.Action) {
+            for (IgnoreListItem item : ignoreList) {
+                if (!item.isActive || item.type == IgnoreType.CtcpIgnore)
+                    continue;
+
+                if (item.scopeMatch(network, bufferName)) {
+                    String str;
+                    if (item.type == IgnoreType.MessageIgnore)
+                        str = msgContents;
+                    else
+                        str = msgSender;
+
+                    if (item.matches(str))
+                        return item.strictness;
+                }
             }
         }
         return StrictnessType.UnmatchedStrictness;
@@ -140,7 +142,19 @@ public class IgnoreListManager extends AIgnoreListManager<IgnoreListManager> {
 
     @Override
     public void _update(IgnoreListManager from) {
+        this.ignoreList.clear();
+        this.ignoreList.addAll(from.ignoreList);
+        this._update();
+    }
 
+    @Override
+    public void _update() {
+        super._update();
+        synchronized (client.backlogStorage().getFilters()) {
+            for (BacklogFilter filter : client.backlogStorage().getFilters()) {
+                filter.update();
+            }
+        }
     }
 
     @Override
@@ -207,5 +221,23 @@ public class IgnoreListManager extends AIgnoreListManager<IgnoreListManager> {
             }
             return false;
         }
+
+        @Override
+        public String toString() {
+            return "IgnoreListItem{" +
+                    "type=" + type +
+                    ", ignoreRule=" + ignoreRule +
+                    ", isRegEx=" + isRegEx +
+                    ", strictness=" + strictness +
+                    ", scope=" + scope +
+                    ", scopeRules=" + Arrays.toString(scopeRules) +
+                    ", isActive=" + isActive +
+                    '}';
+        }
+    }
+
+    @Override
+    public String toString() {
+        return String.valueOf(ignoreList);
     }
 }
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 201f33605921e7d7f88e916c64ff7db36b2aa4a3..0bbf2d0f79274614edf16bab3cda57da158c73a2 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
@@ -37,6 +37,7 @@ import java.util.Set;
 
 import de.kuschku.libquassel.BusProvider;
 import de.kuschku.libquassel.client.Client;
+import de.kuschku.libquassel.events.ConnectionChangeEvent;
 import de.kuschku.libquassel.localtypes.buffers.ChannelBuffer;
 import de.kuschku.libquassel.primitives.types.BufferInfo;
 import de.kuschku.libquassel.primitives.types.QVariant;
@@ -532,10 +533,12 @@ public class IrcChannel extends AIrcChannel<IrcChannel> {
     @Override
     public void _update() {
         super._update();
-        ChannelBuffer buffer = client.bufferManager().channel(this);
-        if (buffer != null) {
-            for (QBufferViewConfig qBufferViewConfig : client.bufferViewManager().bufferViewConfigs()) {
-                qBufferViewConfig.bufferIds().notifyItemChanged(buffer.getInfo().id);
+        if (client.connectionStatus() != ConnectionChangeEvent.Status.INITIALIZING_DATA) {
+            ChannelBuffer buffer = client.bufferManager().channel(this);
+            if (buffer != null) {
+                for (QBufferViewConfig qBufferViewConfig : client.bufferViewManager().bufferViewConfigs()) {
+                    qBufferViewConfig.bufferIds().notifyItemChanged(buffer.getInfo().id);
+                }
             }
         }
     }
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 aa7e94d8cfd1322338bdb5e018ab251f0150b2ed..c00da699fa9f44445ba3c181131f841af47b2aec 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
@@ -405,8 +405,10 @@ public class IrcUser extends AIrcUser<IrcUser> {
             channels.remove(channel);
             if (!skip_channel_part)
                 channel._part(this);
+            /*
             if (channels.isEmpty() && !network().isMe(this))
                 _quit();
+            */
         }
         _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 04844b485ae9a18aafc8218e6d1ab3a8e83158d0..41fda6a571a15142830dd4ae9e6ee607f951a121 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
@@ -23,6 +23,7 @@ package de.kuschku.libquassel.syncables.types.impl;
 
 import android.support.annotation.NonNull;
 import android.support.annotation.Nullable;
+import android.util.Log;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -35,9 +36,13 @@ import java.util.Observer;
 
 import de.kuschku.libquassel.BusProvider;
 import de.kuschku.libquassel.client.Client;
+import de.kuschku.libquassel.events.ConnectionChangeEvent;
+import de.kuschku.libquassel.localtypes.buffers.ChannelBuffer;
+import de.kuschku.libquassel.localtypes.buffers.StatusBuffer;
 import de.kuschku.libquassel.objects.types.NetworkServer;
 import de.kuschku.libquassel.primitives.types.QVariant;
 import de.kuschku.libquassel.syncables.types.abstracts.ANetwork;
+import de.kuschku.libquassel.syncables.types.interfaces.QBufferViewConfig;
 import de.kuschku.libquassel.syncables.types.interfaces.QIrcChannel;
 import de.kuschku.libquassel.syncables.types.interfaces.QIrcUser;
 import de.kuschku.libquassel.syncables.types.interfaces.QNetwork;
@@ -772,6 +777,27 @@ public class Network extends ANetwork<Network> implements Observer {
 
     }
 
+
+
+    @Override
+    public void _update() {
+        super._update();
+        if (client != null && client.connectionStatus() != ConnectionChangeEvent.Status.INITIALIZING_DATA) {
+            StatusBuffer buffer = client.bufferManager().network(networkInfo.networkId());
+            if (buffer != null) {
+                buffer.updateStatus();
+                for (QBufferViewConfig qBufferViewConfig : client.bufferViewManager().bufferViewConfigs()) {
+                    qBufferViewConfig.bufferIds().notifyItemChanged(buffer.getInfo().id);
+                    qBufferViewConfig.networkList().notifyItemChanged(this);
+                }
+            } else {
+                for (QBufferViewConfig qBufferViewConfig : client.bufferViewManager().bufferViewConfigs()) {
+                    qBufferViewConfig.networkList().notifyItemChanged(this);
+                }
+            }
+        }
+    }
+
     @Override
     public void init(@NonNull String objectName, @NonNull BusProvider provider, @NonNull Client client) {
         super.init(objectName, provider, client);
diff --git a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIgnoreListManager.java b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIgnoreListManager.java
index a114509bca80a79cff8f2f74a0894a18168b548d..48d2b28ba54911a42f23470c35af03f1d624ea7e 100644
--- a/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIgnoreListManager.java
+++ b/app/src/main/java/de/kuschku/libquassel/syncables/types/interfaces/QIgnoreListManager.java
@@ -106,12 +106,12 @@ public interface QIgnoreListManager extends QObservable {
         @NonNull
         public static StrictnessType of(int id) {
             switch (id) {
-                case 1:
-                    return UnmatchedStrictness;
-                case 2:
-                    return SoftStrictness;
                 default:
                 case 0:
+                    return UnmatchedStrictness;
+                case 1:
+                    return SoftStrictness;
+                case 2:
                     return HardStrictness;
             }
         }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChannelDetailActivity.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChannelDetailActivity.java
index 5e2391e3a405925f1d14deca957e05f51dc40eae..f8bb27f59edbd93519f3bd6b6b13a139ecc0cdfb 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChannelDetailActivity.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChannelDetailActivity.java
@@ -150,6 +150,6 @@ public class ChannelDetailActivity extends BoundActivity {
     }
 
     public void onEventMainThread(GeneralErrorEvent event) {
-        Log.e("DEBUG", String.valueOf(event));
+        Log.e("ChannelDetailActivity", String.valueOf(event));
     }
 }
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 31134ad77d9ef5f0f58f88d9ad0f53a9174b68fc..a6557621f5b7f37f640a564f8d53189011b749bc 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
@@ -159,9 +159,10 @@ public class MainActivity extends BoundActivity {
             public boolean onMenuItemClick(MenuItem item) {
                 switch (item.getItemId()) {
                     case R.id.action_show_all: {
-                        Log.d("QD-NG", "Toggling Show/Hide All");
-                        chatListAdapter.toggleShowAll();
+                        item.setChecked(chatListAdapter.toggleShowAll());
                     } break;
+                    case R.id.action_manage_chat_lists: {
+                    }
                 }
                 return false;
             }
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 90f0c3388da88f58010a614b5e7db6205b62c9e8..a9209676644ee3e6e6db2214309f1f6112c198c3 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
@@ -94,11 +94,19 @@ public class BufferViewConfigAdapter extends ExpandableRecyclerAdapter<NetworkVi
             @Override
             public void notifyItemInserted(int position) {
                 notifyParentItemInserted(position);
+                if (items.get(position).isInitiallyExpanded())
+                    expandParent(position);
+                else
+                    collapseParent(position);
             }
 
             @Override
             public void notifyItemChanged(int position) {
                 notifyParentItemChanged(position);
+                if (items.get(position).isInitiallyExpanded())
+                    expandParent(position);
+                else
+                    collapseParent(position);
             }
 
             @Override
@@ -114,20 +122,22 @@ public class BufferViewConfigAdapter extends ExpandableRecyclerAdapter<NetworkVi
 
             @Override
             public void notifyItemRangeInserted(int position, int count) {
-                notifyParentItemRangeInserted(position, count);
+                for (int i = position; i < position + count; i++) {
+                    this.notifyItemInserted(i);
+                }
             }
 
             @Override
             public void notifyItemRangeChanged(int position, int count) {
                 for (int i = position; i < position + count; i++) {
-                    notifyParentItemChanged(i);
+                    this.notifyItemChanged(i);
                 }
             }
 
             @Override
             public void notifyItemRangeRemoved(int position, int count) {
                 for (int i = position; i < position + count; i++) {
-                    notifyParentItemRemoved(position);
+                    this.notifyItemRemoved(position);
                 }
             }
         });
@@ -259,7 +269,9 @@ public class BufferViewConfigAdapter extends ExpandableRecyclerAdapter<NetworkVi
         return showAll;
     }
 
-    public void toggleShowAll() {
-        showAll.set(!showAll.get());
+    public boolean toggleShowAll() {
+        boolean before = showAll.get();
+        showAll.set(!before);
+        return !before;
     }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/NetworkItem.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/NetworkItem.java
index 27c981ef8da3d29eb4bb88b142f46a169728c22d..848998de725f123bafa2f08ab5b2b40d47731c56 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/NetworkItem.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/drawer/NetworkItem.java
@@ -97,7 +97,7 @@ public class NetworkItem implements ParentListItem {
         @Override
         public void notifyItemChanged(Integer element) {
             Buffer buffer = context.client().bufferManager().buffer(element);
-            if (buffer != null && buffer.getInfo().networkId == network.networkId()) {
+            if (buffer != null && buffer.getInfo().networkId == network.networkId() && buffers.contains(buffer)) {
                 buffers.notifyItemChanged(buffers.indexOf(buffer));
             }
         }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/ChatFragment.java b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/ChatFragment.java
index ba5cfdbee2c524f29b5da9be312a7c4532082a0b..1f4cee76aa107008b3cfdcef117860d02c000c04 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/ChatFragment.java
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/fragment/ChatFragment.java
@@ -68,6 +68,8 @@ public class ChatFragment extends BoundFragment {
     private LinearLayoutManager layoutManager;
     private boolean loading = false;
 
+    private int recyclerViewMeasuredHeight = 0;
+
     @Nullable
     @Override
     public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
@@ -83,7 +85,6 @@ public class ChatFragment extends BoundFragment {
         messageAdapter = new MessageAdapter(getActivity(), context, new AutoScroller(messages));
         messages.setAdapter(messageAdapter);
 
-        final int measuredHeight = messages.getMeasuredHeight();
         messages.addOnScrollListener(new RecyclerView.OnScrollListener() {
             @Override
             public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
@@ -95,10 +96,12 @@ public class ChatFragment extends BoundFragment {
                     backlogManager.requestMoreBacklog(client.backlogManager().open(), 20);
                     loading = true;
                 }
+                if (recyclerViewMeasuredHeight == 0)
+                    recyclerViewMeasuredHeight = recyclerView.getMeasuredHeight();
                 boolean canScrollDown = recyclerView.canScrollVertically(1);
                 boolean isScrollingDown = dy > 0;
-                int scrollOffsetFromBottom = recyclerView.computeVerticalScrollRange() - recyclerView.computeVerticalScrollOffset() - measuredHeight;
-                boolean isMoreThanOneScreenFromBottom = scrollOffsetFromBottom > measuredHeight;
+                int scrollOffsetFromBottom = recyclerView.computeVerticalScrollRange() - recyclerView.computeVerticalScrollOffset() - recyclerViewMeasuredHeight;
+                boolean isMoreThanOneScreenFromBottom = scrollOffsetFromBottom > recyclerViewMeasuredHeight;
                 boolean smartVisibility = scrollDown.getVisibility() == View.VISIBLE || isMoreThanOneScreenFromBottom;
                 scrollDown.setVisibility((canScrollDown && isScrollingDown &&  smartVisibility) ? View.VISIBLE : View.GONE);
             }
diff --git a/app/src/main/java/de/kuschku/util/ReflectionUtils.java b/app/src/main/java/de/kuschku/util/ReflectionUtils.java
index 86a1bf6537f8af09aadec2d77b3cd30f7d341a03..adf1907f7a3a38842d23d60e74f5770fde60f031 100644
--- a/app/src/main/java/de/kuschku/util/ReflectionUtils.java
+++ b/app/src/main/java/de/kuschku/util/ReflectionUtils.java
@@ -65,7 +65,6 @@ public class ReflectionUtils {
         try {
             m.invoke(o, argv);
         } catch (Exception e) {
-            Log.e("DEBUG", m.toString());
             throw new SyncInvocationException(e, String.format("Error invoking %s::%s with arguments %s and classes %s", o.getClass().getSimpleName(), name, Arrays.toString(argv), Arrays.toString(classes)));
         }
     }
diff --git a/app/src/main/java/de/kuschku/util/regex/SmartRegEx.java b/app/src/main/java/de/kuschku/util/regex/SmartRegEx.java
index 7674ab8b0c581eac4340e7d7c337463f65f4fd7c..82b326f5e099a1778f54046155e4b34acb2df966 100644
--- a/app/src/main/java/de/kuschku/util/regex/SmartRegEx.java
+++ b/app/src/main/java/de/kuschku/util/regex/SmartRegEx.java
@@ -70,4 +70,9 @@ public class SmartRegEx {
         WILDCARD,
         REGEX
     }
+
+    @Override
+    public String toString() {
+        return rule;
+    }
 }
diff --git a/app/src/main/res/menu/chatlist.xml b/app/src/main/res/menu/chatlist.xml
index e2b37c7b7d1a7cf475d9b55627dc826f5356168b..b168c6942c37e0c5052ad1141112025bf02350a5 100644
--- a/app/src/main/res/menu/chatlist.xml
+++ b/app/src/main/res/menu/chatlist.xml
@@ -28,8 +28,9 @@
         app:showAsAction="ifRoom" />
     <item
         android:id="@+id/action_show_all"
-        android:title="@string/action_show_hide_hidden"
-        app:showAsAction="never" />
+        android:title="@string/action_show_hidden"
+        app:showAsAction="never"
+        android:checkable="true" />
     <item
         android:id="@+id/action_manage_chat_lists"
         android:title="@string/action_manage_chat_lists"
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 8ee6c11f051c852a9af0bead1122b6f00c8abf92..ea87b3df1a60f4a2cf7269996e7e93751a08176d 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -85,6 +85,6 @@
     <string name="label_search">Find in Buffer</string>
     <string name="label_disconnect">Disconnect</string>
     <string name="action_manage_chat_lists">Manage Chat Lists</string>
-    <string name="action_show_hide_hidden">Show/Hide Hidden</string>
+    <string name="action_show_hidden">Show Hidden</string>
     <string name="action_join_channel">Join Channel</string>
 </resources>