diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/QuasselDatabase.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/QuasselDatabase.kt
index 5d7d0746a3a59aa7df5bc461e3ebb45c5c82dfc2..8d7daca1d983c26728fc99662b396d28ce8e60b3 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/QuasselDatabase.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/QuasselDatabase.kt
@@ -72,6 +72,9 @@ abstract class QuasselDatabase : RoomDatabase() {
     @Query("SELECT * FROM message WHERE bufferId = :bufferId ORDER BY messageId DESC LIMIT 1")
     fun findLastByBufferId(bufferId: Int): DatabaseMessage?
 
+    @Query("SELECT * FROM message WHERE bufferId = :bufferId ORDER BY messageId DESC LIMIT 1")
+    fun lastMsgId(bufferId: Int): LiveData<DatabaseMessage>
+
     @Query("SELECT * FROM message WHERE bufferId = :bufferId ORDER BY messageId ASC LIMIT 1")
     fun findFirstByBufferId(bufferId: Int): DatabaseMessage?
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/messages/MessageListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/messages/MessageListFragment.kt
index b08403f7eac1ea5fdedc64c3e791cb94a296bd97..50d269aa41807331741ef65c8c63ef0eb1ddff11 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/messages/MessageListFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/messages/MessageListFragment.kt
@@ -102,21 +102,27 @@ class MessageListFragment : ServiceBoundFragment() {
     }
 
     handler.post {
-      viewModel.sessionManager.zip(viewModel.getBuffer(), data).observe(
+      val lastMessageId = viewModel.getBuffer().switchMapNotNull {
+        database.message().lastMsgId(it)
+      }
+
+      var previousMessageId = -1
+      viewModel.sessionManager.zip(lastMessageId).observe(
         this, Observer {
         val previous = lastBuffer ?: -1
         val firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition()
-        val messageId = adapter[firstVisibleItemPosition]?.messageId
+        val firstVisibleMessageId = adapter[firstVisibleItemPosition]?.messageId
         handler.post {
           val session = it?.first
-          val buffer = it?.second
+          val message = it?.second
           val bufferSyncer = session?.bufferSyncer
-          if (buffer != null && bufferSyncer != null) {
-            markAsRead(bufferSyncer, buffer, messageId)
-            if (buffer != previous) {
-              onBufferChange(previous, buffer, messageId, bufferSyncer)
+          if (message != null && bufferSyncer != null && previousMessageId != message.messageId) {
+            markAsRead(bufferSyncer, message.bufferId, message.messageId)
+            if (message.bufferId != previous) {
+              onBufferChange(previous, message.bufferId, firstVisibleMessageId, bufferSyncer)
             }
-            lastBuffer = buffer
+            lastBuffer = message.bufferId
+            previousMessageId = message.messageId
           }
         }
       }