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 13221cd6a04d9b40300858cd08f04489c202292c..ee640fe445f95d835b35ae120651c2da56faf3ec 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselNotificationBackend.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselNotificationBackend.kt
@@ -60,9 +60,30 @@ class QuasselNotificationBackend @Inject constructor(
   private val selfColor = context.getColorCompat(android.R.color.background_dark)
 
   override fun init(session: Session) {
-    for (buffer in session.bufferSyncer.bufferInfos()) {
+    val buffers = session.bufferSyncer.bufferInfos()
+    for (buffer in buffers) {
       val lastSeenId = session.bufferSyncer.lastSeenMsg(buffer.bufferId)
       database.notifications().markRead(buffer.bufferId, lastSeenId)
+
+      if (buffer.type.hasFlag(Buffer_Type.QueryBuffer)) {
+        val activity = session.bufferSyncer.activity(buffer.bufferId)
+        if (activity.hasFlag(Message_Type.Plain) ||
+            activity.hasFlag(Message_Type.Action) ||
+            activity.hasFlag(Message_Type.Notice))
+          session.backlogManager.requestBacklogFiltered(
+            buffer.bufferId, lastSeenId, -1, 20, 0,
+            Message_Type.of(Message_Type.Plain, Message_Type.Action, Message_Type.Notice).toInt(),
+            0
+          )
+      } else {
+        if (session.bufferSyncer.highlightCount(buffer.bufferId) != 0) {
+          session.backlogManager.requestBacklogFiltered(
+            buffer.bufferId, lastSeenId, -1, 20, 0,
+            Message_Type.of(Message_Type.Plain, Message_Type.Action, Message_Type.Notice).toInt(),
+            Message_Flag.of(Message_Flag.Highlight).toInt()
+          )
+        }
+      }
     }
   }
 
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BacklogManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BacklogManager.kt
index 39fba34698439512996a203aba626e47a0e02326..9fbe72f275b9e1de975f64ba92b06ddfd68fa416 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BacklogManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BacklogManager.kt
@@ -25,12 +25,32 @@ package de.kuschku.libquassel.quassel.syncables
 import de.kuschku.libquassel.protocol.*
 import de.kuschku.libquassel.quassel.syncables.interfaces.IBacklogManager
 import de.kuschku.libquassel.session.BacklogStorage
+import de.kuschku.libquassel.session.NotificationManager
 import de.kuschku.libquassel.session.Session
+import de.kuschku.libquassel.util.compatibility.LoggingHandler
+import de.kuschku.libquassel.util.compatibility.LoggingHandler.Companion.log
 
 class BacklogManager(
   private val session: Session,
+  private val notificationManager: NotificationManager?,
   private val backlogStorage: BacklogStorage
 ) : SyncableObject(session, "BacklogManager"), IBacklogManager {
+  override fun receiveBacklogFiltered(bufferId: BufferId, first: MsgId, last: MsgId, limit: Int,
+                                      additional: Int, type: Int, flags: Int,
+                                      messages: QVariantList) {
+    log(LoggingHandler.LogLevel.ERROR, "DEBUG", "$messages")
+    val actualMessages = messages.mapNotNull { it.value<Message?>(null) }
+    log(LoggingHandler.LogLevel.ERROR, "DEBUG", "$actualMessages")
+    notificationManager?.processMessages(
+      session, *actualMessages.toTypedArray()
+    )
+  }
+
+  override fun receiveBacklogAllFiltered(first: MsgId, last: MsgId, limit: Int, additional: Int,
+                                         type: Int, flags: Int, messages: QVariantList) {
+    // TODO: Not implemented
+  }
+
   init {
     initialized = true
   }
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBacklogManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBacklogManager.kt
index 655f90f558409566ccb3bdae07b139ea4359909b..f01ac037c422c3f0b3462d4aa1b36b33659fb62f 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBacklogManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBacklogManager.kt
@@ -26,6 +26,8 @@ import de.kuschku.libquassel.annotations.Slot
 import de.kuschku.libquassel.annotations.Syncable
 import de.kuschku.libquassel.protocol.*
 import de.kuschku.libquassel.protocol.Type
+import de.kuschku.libquassel.util.compatibility.LoggingHandler
+import de.kuschku.libquassel.util.compatibility.LoggingHandler.Companion.log
 
 @Syncable(name = "BacklogManager")
 interface IBacklogManager : ISyncableObject {
@@ -38,6 +40,20 @@ interface IBacklogManager : ISyncableObject {
     )
   }
 
+  @Slot
+  fun requestBacklogFiltered(bufferId: BufferId, first: MsgId = -1, last: MsgId = -1,
+                             limit: Int = -1, additional: Int = 0, type: Int = -1,
+                             flags: Int = -1) {
+    log(LoggingHandler.LogLevel.ERROR,
+        "DEBUG",
+        "bufferId: $bufferId, first: $first, last: $last, limit: $limit, additional: $additional, type: $type, flags: $flags")
+    REQUEST(
+      "requestBacklogFiltered", ARG(bufferId, QType.BufferId), ARG(first, QType.MsgId),
+      ARG(last, QType.MsgId), ARG(limit, Type.Int), ARG(additional, Type.Int), ARG(type, Type.Int),
+      ARG(flags, Type.Int)
+    )
+  }
+
   @Slot
   fun requestBacklogAll(first: MsgId = -1, last: MsgId = -1, limit: Int = -1,
                         additional: Int = 0) {
@@ -47,14 +63,31 @@ interface IBacklogManager : ISyncableObject {
     )
   }
 
+  @Slot
+  fun requestBacklogAllFiltered(first: MsgId = -1, last: MsgId = -1, limit: Int = -1,
+                                additional: Int = 0, type: Int = -1, flags: Int = -1) {
+    REQUEST(
+      "requestBacklogAllFiltered", ARG(first, QType.MsgId), ARG(last, QType.MsgId),
+      ARG(limit, Type.Int), ARG(additional, Type.Int), ARG(type, Type.Int), ARG(flags, Type.Int)
+    )
+  }
+
   @Slot
   fun receiveBacklog(bufferId: BufferId, first: MsgId, last: MsgId, limit: Int, additional: Int,
                      messages: QVariantList)
 
+  @Slot
+  fun receiveBacklogFiltered(bufferId: BufferId, first: MsgId, last: MsgId, limit: Int,
+                             additional: Int, type: Int, flags: Int, messages: QVariantList)
+
   @Slot
   fun receiveBacklogAll(first: MsgId, last: MsgId, limit: Int, additional: Int,
                         messages: QVariantList)
 
+  @Slot
+  fun receiveBacklogAllFiltered(first: MsgId, last: MsgId, limit: Int, additional: Int,
+                                type: Int, flags: Int, messages: QVariantList)
+
   @Slot
   override fun update(properties: QVariantMap) {
     super.update(properties)
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/Session.kt b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
index 09cfb79cfc6455e9789fd8b9abe56ba542953780..29ce292e2bf5a482463a0c2c1f909b3ef006ea78 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
@@ -65,7 +65,7 @@ class Session(
   override val error = _error.toFlowable(BackpressureStrategy.BUFFER)
 
   override val aliasManager = AliasManager(this)
-  override val backlogManager = BacklogManager(this, backlogStorage)
+  override val backlogManager = BacklogManager(this, notificationManager, backlogStorage)
   override val bufferViewManager = BufferViewManager(this)
   override val bufferSyncer = BufferSyncer(this, notificationManager)
   override val certManagers = mutableMapOf<IdentityId, CertManager>()