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 ac5cb23a65df5d594c2ef713833df7a429e070dc..5713c61404ab16a8031c75c6890c4e92ced6e13a 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
@@ -48,6 +48,7 @@ import de.kuschku.libquassel.quassel.syncables.BufferSyncer
 import de.kuschku.libquassel.session.SessionManager
 import de.kuschku.libquassel.util.flag.hasFlag
 import de.kuschku.libquassel.util.helpers.mapSwitchMap
+import de.kuschku.libquassel.util.helpers.nullIf
 import de.kuschku.libquassel.util.helpers.value
 import de.kuschku.libquassel.util.irc.HostmaskHelper
 import de.kuschku.quasseldroid.GlideApp
@@ -110,6 +111,7 @@ class MessageListFragment : ServiceBoundFragment() {
 
   private var lastBuffer: BufferId? = null
   private var previousMessageId: MsgId? = null
+  private var previousLoadKey: Int? = null
 
   private var actionMode: ActionMode? = null
 
@@ -318,7 +320,6 @@ class MessageListFragment : ServiceBoundFragment() {
       }
     }
 
-    var previousLoadKey: Int? = null
     val data = combineLatest(viewModel.buffer,
                              viewModel.selectedMessages,
                              viewModel.expandedMessages,
@@ -387,9 +388,17 @@ class MessageListFragment : ServiceBoundFragment() {
       }
     })
 
+    var hasLoaded = false
     fun checkScroll() {
-      if (linearLayoutManager.findFirstVisibleItemPosition() < 2 && !isScrolling) {
-        messageList.scrollToPosition(0)
+      if (hasLoaded) {
+        if (linearLayoutManager.findFirstVisibleItemPosition() < 2 && !isScrolling) {
+          messageList.scrollToPosition(0)
+        }
+      } else {
+        savedInstanceState?.apply {
+          messageList.layoutManager.onRestoreInstanceState(getParcelable(KEY_STATE_LIST))
+        }
+        hasLoaded = true
       }
     }
 
@@ -398,27 +407,6 @@ class MessageListFragment : ServiceBoundFragment() {
       override fun onItemRangeInserted(positionStart: Int, itemCount: Int) = checkScroll()
     })
 
-    var lastBuffer = -1
-    data.observe(this, Observer { list ->
-      previousLoadKey = list?.lastKey as? Int
-      val firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition()
-      val firstVisibleMessageId = adapter[firstVisibleItemPosition]?.content?.messageId
-      runInBackground {
-        activity?.runOnUiThread {
-          list?.let(adapter::submitList)
-        }
-
-        val buffer = viewModel.buffer.value ?: -1
-        if (buffer != lastBuffer) {
-          adapter.clearCache()
-          viewModel.session.value?.orNull()?.bufferSyncer?.let { bufferSyncer ->
-            onBufferChange(lastBuffer, buffer, firstVisibleMessageId, bufferSyncer)
-          }
-          lastBuffer = buffer
-        }
-      }
-    })
-
     scrollDown.hide(object : FloatingActionButton.OnVisibilityChangedListener() {
       override fun onHidden(fab: FloatingActionButton) {
         fab.visibility = View.VISIBLE
@@ -426,10 +414,6 @@ class MessageListFragment : ServiceBoundFragment() {
     })
     scrollDown.setOnClickListener { messageList.scrollToPosition(0) }
 
-    savedInstanceState?.run {
-      messageList.layoutManager.onRestoreInstanceState(getParcelable(KEY_STATE_LIST))
-    }
-
     val avatarSize = TypedValue.applyDimension(
       TypedValue.COMPLEX_UNIT_SP,
       messageSettings.textSize * 2.5f,
@@ -454,12 +438,40 @@ class MessageListFragment : ServiceBoundFragment() {
       adapter, requireContext(), R.dimen.markerline_height, R.attr.colorMarkerLine
     ))
 
+    savedInstanceState?.run {
+      messageList.layoutManager.onRestoreInstanceState(getParcelable(KEY_STATE_LIST))
+      previousLoadKey = getInt(KEY_STATE_PAGING).nullIf { it == -1 }
+      lastBuffer = getInt(KEY_STATE_BUFFER).nullIf { it == -1 }
+    }
+
+    data.observe(this, Observer { list ->
+      previousLoadKey = list?.lastKey as? Int
+      val firstVisibleItemPosition = linearLayoutManager.findFirstVisibleItemPosition()
+      val firstVisibleMessageId = adapter[firstVisibleItemPosition]?.content?.messageId
+      runInBackground {
+        activity?.runOnUiThread {
+          list?.let(adapter::submitList)
+        }
+
+        val buffer = viewModel.buffer.value ?: -1
+        if (buffer != lastBuffer) {
+          adapter.clearCache()
+          viewModel.session.value?.orNull()?.bufferSyncer?.let { bufferSyncer ->
+            onBufferChange(lastBuffer, buffer, firstVisibleMessageId, bufferSyncer)
+          }
+          lastBuffer = buffer
+        }
+      }
+    })
+
     return view
   }
 
   override fun onSaveInstanceState(outState: Bundle) {
     super.onSaveInstanceState(outState)
     outState.putParcelable(KEY_STATE_LIST, messageList.layoutManager.onSaveInstanceState())
+    outState.putInt(KEY_STATE_PAGING, previousLoadKey ?: -1)
+    outState.putInt(KEY_STATE_BUFFER, lastBuffer ?: -1)
   }
 
   private fun markAsRead(bufferSyncer: BufferSyncer, buffer: BufferId, lastMessageId: MsgId?) {
@@ -528,5 +540,7 @@ class MessageListFragment : ServiceBoundFragment() {
 
   companion object {
     private const val KEY_STATE_LIST = "KEY_STATE_LIST"
+    private const val KEY_STATE_PAGING = "KEY_STATE_PAGING"
+    private const val KEY_STATE_BUFFER = "KEY_STATE_BUFFER"
   }
 }