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 9a7e2e17836172b8cf546b912f6d182c3babce3a..0895d8c0eda6254d45a533fc2c336784f7f6bc39 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
@@ -167,8 +167,8 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
       drawerToggle.syncState()
     }
 
-    viewModel.errors_liveData.observe(this, Observer { optional ->
-      optional?.orNull().let {
+    viewModel.errors.observe(this, Observer { error ->
+      error?.let {
         when (it) {
           is HandshakeMessage.ClientInitReject  ->
             MaterialDialog.Builder(this)
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferViewConfigFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferViewConfigFragment.kt
index 6e4aaf7351ec4ecde8cb5287c6bfb0b706cfc5fa..048cd05ff528ed8250a99071ddc6a8f6fc5a0386 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferViewConfigFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/buffers/BufferViewConfigFragment.kt
@@ -300,9 +300,21 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
     }
     chatList.itemAnimator = DefaultItemAnimator()
     chatList.setItemViewCacheSize(10)
+
+    savedInstanceState?.run {
+      chatList.layoutManager.onRestoreInstanceState(getParcelable(KEY_STATE_LIST))
+      chatListSpinner.onRestoreInstanceState(getParcelable(KEY_STATE_SPINNER))
+    }
+
     return view
   }
 
+  override fun onSaveInstanceState(outState: Bundle) {
+    super.onSaveInstanceState(outState)
+    outState.putParcelable(KEY_STATE_LIST, chatList.layoutManager.onSaveInstanceState())
+    outState.putParcelable(KEY_STATE_SPINNER, chatListSpinner.onSaveInstanceState())
+  }
+
   private val clickListener: ((BufferId) -> Unit)? = {
     if (actionMode != null) {
       longClickListener?.invoke(it)
@@ -319,4 +331,9 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
       actionMode?.finish()
     }
   }
+
+  companion object {
+    private const val KEY_STATE_LIST = "KEY_STATE_LIST"
+    private const val KEY_STATE_SPINNER = "KEY_STATE_SPINNER"
+  }
 }
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 0764b79844719e2ae12ddce99b9de2c3a67a2eae..60e006d67d6f5869394254aa31c383977564d8ce 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
@@ -225,6 +225,10 @@ class MessageListFragment : ServiceBoundFragment() {
       database.message().lastMsgId(it)
     }
 
+    viewModel.buffer.toLiveData().observe(this, Observer { bufferId ->
+      swipeRefreshLayout.isEnabled = (bufferId != null || bufferId != -1)
+    })
+
     var previousVisible = -1
     viewModel.buffer.toFlowable(BackpressureStrategy.LATEST).switchMap { buffer ->
       database.filtered().listenRx(accountId, buffer).switchMap { filtered ->
@@ -296,9 +300,19 @@ class MessageListFragment : ServiceBoundFragment() {
     })
     scrollDown.hide()
     scrollDown.setOnClickListener { messageList.scrollToPosition(0) }
+
+    savedInstanceState?.run {
+      messageList.layoutManager.onRestoreInstanceState(getParcelable(KEY_STATE_LIST))
+    }
+
     return view
   }
 
+  override fun onSaveInstanceState(outState: Bundle) {
+    super.onSaveInstanceState(outState)
+    outState.putParcelable(KEY_STATE_LIST, messageList.layoutManager.onSaveInstanceState())
+  }
+
   private fun markAsRead(bufferSyncer: BufferSyncer, buffer: BufferId, lastMessageId: MsgId?) {
     bufferSyncer.requestMarkBufferAsRead(buffer)
     if (lastMessageId != null)
@@ -346,4 +360,7 @@ class MessageListFragment : ServiceBoundFragment() {
     }
   }
 
+  companion object {
+    private const val KEY_STATE_LIST = "KEY_STATE_LIST"
+  }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListFragment.kt
index 03d7c06efac3a60386bd82b026d26ff8aedb3714..fd7b6b274bce6fc087f924ed06a6241e6b30879f 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/nicks/NickListFragment.kt
@@ -65,9 +65,18 @@ class NickListFragment : ServiceBoundFragment() {
       }
     }.toLiveData().observe(this, Observer(nickListAdapter::submitList))
 
+    savedInstanceState?.run {
+      nickList.layoutManager.onRestoreInstanceState(getParcelable(KEY_STATE_LIST))
+    }
+
     return view
   }
 
+  override fun onSaveInstanceState(outState: Bundle) {
+    super.onSaveInstanceState(outState)
+    outState.putParcelable(KEY_STATE_LIST, nickList.layoutManager.onSaveInstanceState())
+  }
+
   private val clickListener: ((String) -> Unit)? = { nick ->
     viewModel.bufferData.value?.info?.let(BufferInfo::networkId)?.let { networkId ->
       val intent = Intent(requireContext(), InfoActivity::class.java)
@@ -79,4 +88,8 @@ class NickListFragment : ServiceBoundFragment() {
       startActivity(intent)
     }
   }
+
+  companion object {
+    private const val KEY_STATE_LIST = "KEY_STATE_LIST"
+  }
 }
\ No newline at end of file
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/ISession.kt b/lib/src/main/java/de/kuschku/libquassel/session/ISession.kt
index a729f609fda40e1641452cb7c2773147411cbe78..42338ad78746c9ecdc11a4f4b5d0155e9e0934ca 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/ISession.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/ISession.kt
@@ -5,6 +5,8 @@ import de.kuschku.libquassel.protocol.NetworkId
 import de.kuschku.libquassel.protocol.message.HandshakeMessage
 import de.kuschku.libquassel.quassel.QuasselFeatures
 import de.kuschku.libquassel.quassel.syncables.*
+import io.reactivex.BackpressureStrategy
+import io.reactivex.Flowable
 import io.reactivex.Observable
 import io.reactivex.subjects.BehaviorSubject
 import java.io.Closeable
@@ -30,7 +32,7 @@ interface ISession : Closeable {
   val rpcHandler: RpcHandler?
   val initStatus: Observable<Pair<Int, Int>>
 
-  val error: Observable<HandshakeMessage>
+  val error: Flowable<HandshakeMessage>
 
   val lag: Observable<Long>
 
@@ -39,6 +41,7 @@ interface ISession : Closeable {
   companion object {
     val NULL = object : ISession {
       override val error = BehaviorSubject.create<HandshakeMessage>()
+        .toFlowable(BackpressureStrategy.BUFFER)
       override val state = BehaviorSubject.createDefault(ConnectionState.DISCONNECTED)
       override val features: Features = Features(QuasselFeatures.empty(), QuasselFeatures.empty())
       override val sslSession: SSLSession? = null
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 07a3af97ad3f3485beb7f55156468d0d2994a4ab..991ff35a591f3a64e80e7f3453519c96b186485a 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
@@ -7,7 +7,9 @@ import de.kuschku.libquassel.quassel.ExtendedFeature
 import de.kuschku.libquassel.quassel.QuasselFeatures
 import de.kuschku.libquassel.quassel.syncables.*
 import de.kuschku.libquassel.util.compatibility.HandlerService
+import io.reactivex.BackpressureStrategy
 import io.reactivex.subjects.BehaviorSubject
+import io.reactivex.subjects.PublishSubject
 import org.threeten.bp.Instant
 import javax.net.ssl.X509TrustManager
 
@@ -31,7 +33,8 @@ class Session(
   )
   override val state = coreConnection.state
 
-  override val error = BehaviorSubject.create<HandshakeMessage>()
+  private val _error = PublishSubject.create<HandshakeMessage>()
+  override val error = _error.toFlowable(BackpressureStrategy.BUFFER)
 
   override val aliasManager = AliasManager(this)
   override val backlogManager = BacklogManager(this, backlogStorage)
@@ -62,7 +65,7 @@ class Session(
     if (f.coreConfigured == true) {
       login()
     } else {
-      error.onNext(f)
+      _error.onNext(f)
     }
     return true
   }
@@ -87,17 +90,17 @@ class Session(
   }
 
   override fun handle(f: HandshakeMessage.ClientInitReject): Boolean {
-    error.onNext(f)
+    _error.onNext(f)
     return true
   }
 
   override fun handle(f: HandshakeMessage.CoreSetupReject): Boolean {
-    error.onNext(f)
+    _error.onNext(f)
     return true
   }
 
   override fun handle(f: HandshakeMessage.ClientLoginReject): Boolean {
-    error.onNext(f)
+    _error.onNext(f)
     return true
   }
 
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt b/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt
index 02e993639095ef12b26cdcc8d3b713df5f8c2a0c..84cf52dadaea34bdf0379c9ef4ec0199f50227d9 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt
@@ -10,6 +10,8 @@ import de.kuschku.libquassel.util.compatibility.HandlerService
 import de.kuschku.libquassel.util.compatibility.LoggingHandler
 import de.kuschku.libquassel.util.compatibility.LoggingHandler.Companion.log
 import de.kuschku.libquassel.util.helpers.or
+import io.reactivex.BackpressureStrategy
+import io.reactivex.Flowable
 import io.reactivex.Observable
 import io.reactivex.functions.BiFunction
 import io.reactivex.subjects.BehaviorSubject
@@ -75,8 +77,8 @@ class SessionManager(
     else
       lastSession
   }
-  override val error: Observable<HandshakeMessage>
-    get() = inProgressSession.switchMap(ISession::error)
+  override val error: Flowable<HandshakeMessage>
+    get() = inProgressSession.toFlowable(BackpressureStrategy.LATEST).switchMap(ISession::error)
 
   val connectionProgress: Observable<Triple<ConnectionState, Int, Int>> = Observable.combineLatest(
     state, initStatus,
diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
index f3647a90f47b435dfd87f1058e7da92eba5fdb92..22c94253c4ec2e57e4c209dff3160f0d04e224f5 100644
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
+++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
@@ -19,6 +19,7 @@ import de.kuschku.libquassel.util.and
 import de.kuschku.libquassel.util.hasFlag
 import de.kuschku.libquassel.util.helpers.*
 import de.kuschku.quasseldroid.util.helper.combineLatest
+import de.kuschku.quasseldroid.util.helper.switchMapNotNull
 import de.kuschku.quasseldroid.util.helper.toLiveData
 import de.kuschku.quasseldroid.viewmodel.data.*
 import io.reactivex.Observable
@@ -71,8 +72,9 @@ class QuasselViewModel : ViewModel() {
     }
   }
 
-  val errors = sessionManager.mapSwitchMap(SessionManager::error)
-  val errors_liveData = errors.toLiveData()
+  val errors = sessionManager.toLiveData().switchMapNotNull {
+    it.orNull()?.error?.toLiveData()
+  }
 
   /**
    * An observable of the changes of the markerline, as pairs of `(old, new)`