diff --git a/app/src/main/java/de/kuschku/quasseldroid/service/BacklogRequester.kt b/app/src/main/java/de/kuschku/quasseldroid/service/BacklogRequester.kt
index d044c3e88d95adb3abaef15b504d205ae50c38cb..d6bae199432d15f240b669dc7ec8ae80fbee67da 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/service/BacklogRequester.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/service/BacklogRequester.kt
@@ -22,7 +22,11 @@ package de.kuschku.quasseldroid.service
 import de.kuschku.libquassel.protocol.BufferId
 import de.kuschku.libquassel.protocol.Message
 import de.kuschku.libquassel.protocol.MsgId
+import de.kuschku.libquassel.session.ISession
+import de.kuschku.libquassel.util.compatibility.LoggingHandler.Companion.log
+import de.kuschku.libquassel.util.compatibility.LoggingHandler.LogLevel.ERROR
 import de.kuschku.libquassel.util.helpers.value
+import de.kuschku.quasseldroid.persistence.QuasselBacklogStorage
 import de.kuschku.quasseldroid.persistence.QuasselDatabase
 import de.kuschku.quasseldroid.viewmodel.QuasselViewModel
 
@@ -34,36 +38,53 @@ class BacklogRequester(
                lastMessageId: MsgId? = null,
                untilAllVisible: Boolean = false,
                finishCallback: () -> Unit) {
+    log(ERROR,
+        "BacklogRequester",
+        "requested(buffer: $buffer, amount: $amount, pageSize: $pageSize, lastMessageId: $lastMessageId, untilAllVisible: $untilAllVisible)")
     var missing = amount
-    viewModel.session.value?.orNull()?.backlogManager?.let {
-      it.requestBacklog(
-        bufferId = buffer,
-        last = lastMessageId ?: database.message().findFirstByBufferId(
-          buffer
-        )?.messageId ?: -1,
-        limit = amount
-      ) {
-        if (it.isNotEmpty()) {
-          val filtered = database.filtered().get(accountId, buffer) ?: 0
-          missing -= it.count {
-            (it.type.value and filtered.inv()) != 0
-          }
-          val hasLoadedAll = missing == 0
-          val hasLoadedAny = missing < amount
-          if (untilAllVisible && !hasLoadedAll || !untilAllVisible && !hasLoadedAny) {
-            val messageId = it.map(Message::messageId).min()
-            loadMore(accountId,
-                     buffer,
-                     missing,
-                     pageSize,
-                     messageId,
-                     untilAllVisible,
-                     finishCallback)
+    viewModel.session.value?.orNull()?.let { session: ISession ->
+      session.backlogManager?.let {
+        val filtered = database.filtered().get(accountId, buffer) ?: 0
+        it.requestBacklog(
+          bufferId = buffer,
+          last = lastMessageId ?: database.message().findFirstByBufferId(
+            buffer
+          )?.messageId ?: -1,
+          limit = amount
+        ) {
+          log(ERROR,
+              "BacklogRequester",
+              "received(buffer: $buffer, amount: $amount, pageSize: $pageSize, lastMessageId: $lastMessageId, untilAllVisible: $untilAllVisible)")
+          log(ERROR, "BacklogRequester", "message count: ${it.size}")
+          if (it.isNotEmpty()) {
+            val visibleMessages = it.count {
+              (it.type.value and filtered.inv()) != 0 &&
+              !QuasselBacklogStorage.isIgnored(session, it)
+            }
+            log(ERROR, "BacklogRequester", "visibleMessages: $visibleMessages")
+            missing -= visibleMessages
+            val hasLoadedAll = missing == 0
+            val hasLoadedAny = missing < amount
+            if (untilAllVisible && !hasLoadedAll || !untilAllVisible && !hasLoadedAny) {
+              val messageId = it.map(Message::messageId).min()
+              loadMore(accountId,
+                       buffer,
+                       missing,
+                       pageSize,
+                       messageId,
+                       untilAllVisible,
+                       finishCallback)
+              true
+            } else {
+              log(ERROR, "BacklogRequester", "finished")
+              finishCallback()
+              true
+            }
           } else {
+            log(ERROR, "BacklogRequester", "finished")
             finishCallback()
+            true
           }
-        } else {
-          finishCallback()
         }
       }
     }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselNotificationBackend.kt b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselNotificationBackend.kt
index b9a452c90650f1f69fead6fdf74fc82d67d192e3..a05b91fb43ab4e720bde13a48fad731fb564ae7b 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselNotificationBackend.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselNotificationBackend.kt
@@ -109,6 +109,7 @@ class QuasselNotificationBackend @Inject constructor(
                 0
               ) {
                 processMessages(session, *it.toTypedArray())
+                false
               }
           }
           NotificationSettings.Level.HIGHLIGHT -> {
@@ -122,6 +123,7 @@ class QuasselNotificationBackend @Inject constructor(
                 Message_Flag.of(Message_Flag.Highlight).toInt()
               ) {
                 processMessages(session, *it.toTypedArray())
+                false
               }
             }
           }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
index 29aaabcee5e655d8c21be929bfb175620686b015..28082401528b8f8ee31f8bb1bb0dba8689a2e490 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
@@ -632,6 +632,7 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
                 database.filtered().replace(
                   QuasselDatabase.Filtered(accountId, buffer, newlyFiltered.value)
                 )
+                backend.value.orNull()?.sessionManager()?.backlogStorage?.clearMessages(buffer)
               }
             }.negativeColorAttr(R.attr.colorTextPrimary)
             .backgroundColorAttr(R.attr.colorBackgroundCard)
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt
index 35a0dd92deb9c20b66705cddd416ca7d16a0de54..07fbae84786f0af4ed70788c5e5d0d7790a8c26b 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/messages/MessageListFragment.kt
@@ -45,6 +45,8 @@ import de.kuschku.libquassel.protocol.BufferId
 import de.kuschku.libquassel.protocol.MsgId
 import de.kuschku.libquassel.quassel.syncables.BufferSyncer
 import de.kuschku.libquassel.session.SessionManager
+import de.kuschku.libquassel.util.compatibility.LoggingHandler.Companion.log
+import de.kuschku.libquassel.util.compatibility.LoggingHandler.LogLevel.ERROR
 import de.kuschku.libquassel.util.helpers.mapSwitchMap
 import de.kuschku.libquassel.util.helpers.value
 import de.kuschku.libquassel.util.irc.HostmaskHelper
@@ -195,7 +197,10 @@ class MessageListFragment : ServiceBoundFragment() {
   private val boundaryCallback = object :
     PagedList.BoundaryCallback<DisplayMessage>() {
     override fun onItemAtFrontLoaded(itemAtFront: DisplayMessage) = Unit
-    override fun onItemAtEndLoaded(itemAtEnd: DisplayMessage) = loadMore()
+    override fun onItemAtEndLoaded(itemAtEnd: DisplayMessage) {
+      log(ERROR, "MessageListFragment", "onItemAtEndLoaded")
+      loadMore()
+    }
   }
 
   override fun onCreateView(
@@ -249,6 +254,7 @@ class MessageListFragment : ServiceBoundFragment() {
 
     swipeRefreshLayout.setColorSchemeColors(*senderColors)
     swipeRefreshLayout.setOnRefreshListener {
+      log(ERROR, "MessageListFragment", "swipeRefreshed")
       loadMore()
     }
 
@@ -327,7 +333,9 @@ class MessageListFragment : ServiceBoundFragment() {
           viewModel.buffer { bufferId ->
             val filtered = database.filtered().get(accountId, bufferId)
             // Try loading messages when switching to isEmpty buffer
-            if (!database.message().hasVisibleMessages(bufferId, filtered ?: 0)) {
+            val hasVisibleMessages = database.message().hasVisibleMessages(bufferId, filtered ?: 0)
+            log(ERROR, "MessageListFragment", "connected(hasVisibleMessages: $hasVisibleMessages)")
+            if (!hasVisibleMessages) {
               if (bufferId > 0 && bufferId != Int.MAX_VALUE) {
                 loadMore(initial = true)
               }
@@ -363,6 +371,8 @@ class MessageListFragment : ServiceBoundFragment() {
 
     var lastBuffer = -1
     data.observe(this, Observer { list ->
+      log(ERROR, "MessageListFragment", "Messages Changed ${list?.size}")
+
       val firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition()
       val firstVisibleMessageId = adapter[firstVisibleItemPosition]?.content?.messageId
       runInBackground {
@@ -440,7 +450,9 @@ class MessageListFragment : ServiceBoundFragment() {
     }
     // Try loading messages when switching to isEmpty buffer
     val filtered = database.filtered().get(accountId, current)
-    if (!database.message().hasVisibleMessages(current, filtered ?: 0)) {
+    val hasVisibleMessages = database.message().hasVisibleMessages(current, filtered ?: 0)
+    log(ERROR, "MessageListFragment", "bufferChange(hasVisibleMessages: $hasVisibleMessages)")
+    if (!hasVisibleMessages) {
       if (current > 0 && current != Int.MAX_VALUE) {
         loadMore(initial = true)
       }