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 85eab327ccdaaef0f4b881415ef406f3ddcb5095..9cf69497b68ffd752831893b0d16d6b5017624e3 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
@@ -285,9 +285,9 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
       }
     }
 
-    viewModel.features.toLiveData().observe(this, Observer {
+    viewModel.negotiatedFeatures.toLiveData().observe(this, Observer { (connected, features) ->
       featureContextBufferActivitySync.setMode(
-        if (it.hasFeature(ExtendedFeature.BufferActivitySync)) WarningBarView.MODE_NONE
+        if (!connected || features.hasFeature(ExtendedFeature.BufferActivitySync)) WarningBarView.MODE_NONE
         else WarningBarView.MODE_ICON
       )
     })
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/core/CoreInfoFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/core/CoreInfoFragment.kt
index cf8f38aac45f317dbae616ccbd2a6cb4029c606e..5508883a28edcb903f3d7777ab409381ec421524 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/core/CoreInfoFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/info/core/CoreInfoFragment.kt
@@ -102,12 +102,12 @@ class CoreInfoFragment : ServiceBoundFragment() {
           data?.quasselBuildDate?.let(Html::fromHtml)
         versionDate.text = formattedVersionTime
 
-        val features = viewModel.session.value?.orNull()?.features?.core
-                       ?: QuasselFeatures.empty()
+        val (connected, features) = viewModel.coreFeatures.value ?: Pair(false,
+                                                                         QuasselFeatures.empty())
         missingFeatureList = RequiredFeatures.features.filter {
           it.feature !in features.enabledFeatures
         }
-        missingFeatures.visibleIf(missingFeatureList.isNotEmpty())
+        missingFeatures.visibleIf(connected && missingFeatureList.isNotEmpty())
 
         val startTime = data?.startTime?.atZone(ZoneId.systemDefault())?.let(dateTimeFormatter::format)
         uptime.text = requireContext().getString(R.string.label_core_online_since,
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsFragment.kt
index 612aa5b9d3906f087bdeb673a2ad58ebfcaaf631..d6950b889660d09fb9e0441710e40fb3aa55908f 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/CoreSettingsFragment.kt
@@ -170,11 +170,11 @@ class CoreSettingsFragment : ServiceBoundFragment() {
     })
 
     var missingFeatureList: List<MissingFeature> = emptyList()
-    viewModel.features.toLiveData().observe(this, Observer { features ->
+    viewModel.negotiatedFeatures.toLiveData().observe(this, Observer { (connected, features) ->
       missingFeatureList = RequiredFeatures.features.filter {
         it.feature !in features.enabledFeatures
       }
-      featureContextMissing.visibleIf(missingFeatureList.isNotEmpty())
+      featureContextMissing.visibleIf(connected && missingFeatureList.isNotEmpty())
     })
 
     featureContextMissing.setOnClickListener {
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightlist/HighlightListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightlist/HighlightListFragment.kt
index 65e4b00e48b2a66762d57a9c84750cf3979e3e03..a804785d7cd1f82f0234f3d06ce0734eda6f4ac7 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightlist/HighlightListFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightlist/HighlightListFragment.kt
@@ -145,9 +145,9 @@ class HighlightListFragment : SettingsFragment(), SettingsFragment.Savable,
         }
       })
 
-    viewModel.features.toLiveData().observe(this, Observer {
+    viewModel.negotiatedFeatures.toLiveData().observe(this, Observer { (connected, features) ->
       featureContextCoreSideHighlights.setMode(
-        if (it.hasFeature(ExtendedFeature.CoreSideHighlights)) WarningBarView.MODE_NONE
+        if (!connected || features.hasFeature(ExtendedFeature.CoreSideHighlights)) WarningBarView.MODE_NONE
         else WarningBarView.MODE_ICON
       )
     })
diff --git a/lib/src/main/java/de/kuschku/libquassel/connection/Features.kt b/lib/src/main/java/de/kuschku/libquassel/connection/Features.kt
index 9745742c33158c9f2baa62809a311f464d9fad30..a8304f5231c86c478b09f382ab7bac210922f528 100644
--- a/lib/src/main/java/de/kuschku/libquassel/connection/Features.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/connection/Features.kt
@@ -30,4 +30,9 @@ data class Features(
       core.enabledFeatures intersect client.enabledFeatures,
       core.unknownFeatures union client.unknownFeatures
     )
+
+  companion object {
+    fun empty() = Features(QuasselFeatures.empty(), QuasselFeatures.empty())
+    fun all() = Features(QuasselFeatures.all(), QuasselFeatures.all())
+  }
 }
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 d64c71158c6b0f21d9deeede1bcf94ce69be3d2f..c531de60452824d232ba67cf45409ca9b19d838d 100644
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
+++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
@@ -24,7 +24,6 @@ import de.kuschku.libquassel.connection.ConnectionState
 import de.kuschku.libquassel.connection.Features
 import de.kuschku.libquassel.protocol.*
 import de.kuschku.libquassel.quassel.BufferInfo
-import de.kuschku.libquassel.quassel.QuasselFeatures
 import de.kuschku.libquassel.quassel.syncables.*
 import de.kuschku.libquassel.quassel.syncables.interfaces.INetwork
 import de.kuschku.libquassel.session.Backend
@@ -85,9 +84,26 @@ class QuasselViewModel : ViewModel() {
   val sessionManager = backend.mapMap(Backend::sessionManager)
   val session = sessionManager.mapSwitchMap(SessionManager::session)
   val rpcHandler = session.mapMapNullable(ISession::rpcHandler)
-  val features = session.mapMap(ISession::features)
-    .mapMap(Features::negotiated)
-    .mapOrElse(QuasselFeatures.empty())
+  val features = sessionManager.mapSwitchMap { manager ->
+    manager.state.switchMap { state ->
+      if (state != ConnectionState.CONNECTED) {
+        Observable.just(Pair(false, Features.empty()))
+      } else {
+        manager.session.map {
+          Pair(true, it.features)
+        }
+      }
+    }
+  }.mapOrElse(Pair(false, Features.empty()))
+  val clientFeatures = features.map { (connected, features) ->
+    Pair(connected, features.client)
+  }
+  val negotiatedFeatures = features.map { (connected, features) ->
+    Pair(connected, features.negotiated)
+  }
+  val coreFeatures = features.map { (connected, features) ->
+    Pair(connected, features.core)
+  }
 
   val connectionProgress = sessionManager.mapSwitchMap(SessionManager::connectionProgress)
     .mapOrElse(Triple(ConnectionState.DISCONNECTED, 0, 0))