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 700da5e8a6b0e9a939285b50482001645fadcbda..94aabd421fa37c795aa84423470c2135ee24e225 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
@@ -82,6 +82,8 @@ class MessageListFragment : ServiceBoundFragment() {
     messageList.layoutManager = linearLayoutManager
     messageList.itemAnimator = null
     messageList.setItemViewCacheSize(20)
+
+    var isScrolling = false
     messageList.addOnScrollListener(
       object : RecyclerView.OnScrollListener() {
         override fun onScrolled(recyclerView: RecyclerView, dx: Int, dy: Int) {
@@ -91,6 +93,14 @@ class MessageListFragment : ServiceBoundFragment() {
           scrollDown.visibility = View.VISIBLE
           scrollDown.toggle(canScrollDown && isScrollingDown)
         }
+
+        override fun onScrollStateChanged(recyclerView: RecyclerView?, newState: Int) {
+          isScrolling = when (newState) {
+            RecyclerView.SCROLL_STATE_DRAGGING -> true
+            RecyclerView.SCROLL_STATE_SETTLING -> true
+            else                               -> false
+          }
+        }
       })
 
     val data = viewModel.buffer_liveData.switchMapNotNull { buffer ->
@@ -113,6 +123,7 @@ class MessageListFragment : ServiceBoundFragment() {
 
     viewModel.sessionManager_liveData.zip(lastMessageId).observe(
       this, Observer {
+      val firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition()
       runInBackground {
         val session = it?.first?.orNull()
         val message = it?.second
@@ -120,6 +131,15 @@ class MessageListFragment : ServiceBoundFragment() {
         if (message != null && bufferSyncer != null && previousMessageId != message.messageId) {
           markAsRead(bufferSyncer, message.bufferId, message.messageId)
           previousMessageId = message.messageId
+
+          if (firstVisibleItemPosition < 2 && !isScrolling) {
+            activity?.runOnUiThread { messageList.scrollToPosition(0) }
+            runInBackgroundDelayed(16) {
+              activity?.runOnUiThread {
+                messageList.scrollToPosition(0)
+              }
+            }
+          }
         }
       }
     })
@@ -140,15 +160,6 @@ class MessageListFragment : ServiceBoundFragment() {
           list?.let(adapter::submitList)
         }
 
-        if (firstVisibleItemPosition < 2) {
-          activity?.runOnUiThread { messageList.scrollToPosition(0) }
-          runInBackgroundDelayed(16) {
-            activity?.runOnUiThread {
-              messageList.scrollToPosition(0)
-            }
-          }
-        }
-
         val buffer = viewModel.buffer.value ?: -1
         if (buffer != lastBuffer) {
           adapter.clearCache()