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 09fdfcc61701708278b833f0a0be8799b2df8511..8223f982528d530405ab9e1d23e599d37bb785fd 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
@@ -585,7 +585,7 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
     })
 
     // Only show nick list when we’re in a channel buffer
-    viewModel.bufferData.distinctUntilChanged().toLiveData().observe(this, Observer {
+    viewModel.bufferData.toLiveData().observe(this, Observer {
       bufferData = it
       if (bufferData?.info?.type?.hasFlag(Buffer_Type.ChannelBuffer) == true) {
         drawerLayout.setDrawerLockMode(DrawerLayout.LOCK_MODE_UNLOCKED, Gravity.END)
@@ -700,12 +700,9 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
        bufferData?.info?.type?.hasFlag(Buffer_Type.QueryBuffer) ?: false) &&
       Build.VERSION.SDK_INT >= Build.VERSION_CODES.O
     menu?.retint(toolbar.context)
-    viewModel.nickData.toLiveData().observe(this, Observer {
-      val count = it?.count() ?: 0
-      menu?.findItem(R.id.action_nicklist)?.icon = NickCountDrawable(count,
-                                                                     nickCountDrawableSize,
-                                                                     nickCountDrawableColor)
-    })
+    menu?.findItem(R.id.action_nicklist)?.icon = NickCountDrawable(bufferData?.userCount ?: 0,
+                                                                   nickCountDrawableSize,
+                                                                   nickCountDrawableColor)
     return super.onCreateOptionsMenu(menu)
   }
 
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt
index 418e7f5054e1b9445da6b90c172961be8be05039..543925d72fd576e5c5e2d05b36eaa5b1e4f0030d 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt
@@ -140,6 +140,8 @@ class IrcChannel(
     _userModes.getOr(ircUser, "")
   }
 
+  fun userCount() = _userCount
+
   fun userModes(): Map<IrcUser, String> = _userModes
   fun userModes(nick: String) = network().ircUser(nick)?.let { userModes(it) } ?: ""
   fun liveUserModes(nick: String) = network().ircUser(nick)?.let { userModes(it) } ?: ""
@@ -256,7 +258,7 @@ class IrcChannel(
       _userModes[user] = modes
       user.joinChannel(this, true)
     }
-    live_userModes.onNext(_userModes)
+    updateUsers()
   }
 
   override fun joinIrcUser(ircuser: IrcUser) {
@@ -278,7 +280,7 @@ class IrcChannel(
       network().removeIrcChannel(this)
       proxy.stopSynchronize(this)
     }
-    live_userModes.onNext(_userModes)
+    updateUsers()
   }
 
   override fun part(nick: String) {
@@ -289,7 +291,7 @@ class IrcChannel(
     if (ircuser == null || !isKnownUser(ircuser))
       return
     _userModes[ircuser] = modes
-    live_userModes.onNext(_userModes)
+    updateUsers()
   }
 
   override fun setUserModes(nick: String, modes: String) {
@@ -306,7 +308,7 @@ class IrcChannel(
     if (_userModes.getOr(ircuser, "").contains(mode, ignoreCase = true))
       return
     _userModes[ircuser] = _userModes.getOr(ircuser, "") + mode
-    live_userModes.onNext(_userModes)
+    updateUsers()
   }
 
   override fun addUserMode(nick: String, mode: String) {
@@ -320,7 +322,7 @@ class IrcChannel(
       return
     _userModes[ircuser] = _userModes.getOr(ircuser, "")
       .replace(mode, "", ignoreCase = true)
-    live_userModes.onNext(_userModes)
+    updateUsers()
   }
 
   override fun removeUserMode(nick: String, mode: String) {
@@ -368,6 +370,12 @@ class IrcChannel(
       live_updates.onNext(Unit)
     }
 
+  private var _userCount: Int = 0
+    set(value) {
+      field = value
+      live_updates.onNext(Unit)
+    }
+
   private var _topic: String = ""
     set(value) {
       field = value
@@ -386,10 +394,17 @@ class IrcChannel(
       live_updates.onNext(Unit)
     }
 
+  private fun updateUsers() {
+    _userCount = _userModes.size
+    live_userModes.onNext(_userModes)
+  }
+
   private val live_userModes = BehaviorSubject.createDefault(mutableMapOf<IrcUser, String>())
   private var _userModes: MutableMap<IrcUser, String>
     get() = live_userModes.value
-    set(value) = live_userModes.onNext(value)
+    set(value) {
+      updateUsers()
+    }
 
   private var _network: Network = network
 
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 2c12beb4a5c884a5fd43c6d2c897922499b3d24e..17e9e0e0a17275744757374756765edace3287b9 100644
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
+++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
@@ -176,7 +176,8 @@ class QuasselViewModel : ViewModel() {
                     BufferData(
                       info = info,
                       network = network,
-                      description = it.topic()
+                      description = it.topic(),
+                      userCount = it.userCount()
                     )
                   }
                 }
@@ -201,7 +202,7 @@ class QuasselViewModel : ViewModel() {
     } else {
       Observable.just(BufferData())
     }
-  }
+  }.distinctUntilChanged().throttleLast(100, TimeUnit.MILLISECONDS)
 
   val nickData: Observable<List<IrcUserItem>> = combineLatest(session, buffer)
     .switchMap { (sessionOptional, buffer) ->
@@ -242,7 +243,7 @@ class QuasselViewModel : ViewModel() {
       } else {
         Observable.just(emptyList())
       }
-    }
+    }.distinctUntilChanged().throttleLast(100, TimeUnit.MILLISECONDS)
 
   val bufferViewConfigs = bufferViewManager.mapSwitchMap { manager ->
     manager.liveBufferViewConfigs().map { ids ->
@@ -331,7 +332,6 @@ class QuasselViewModel : ViewModel() {
         if (bufferSyncer != null && config != null) {
           session.liveNetworks().switchMap { networks ->
             config.liveUpdates()
-              .debounce(16, TimeUnit.MILLISECONDS)
               .switchMap { currentConfig ->
                 combineLatest<Collection<BufferId>>(
                   listOf(
@@ -517,5 +517,5 @@ class QuasselViewModel : ViewModel() {
         } else {
           Observable.just(Pair<BufferViewConfig?, List<BufferProps>>(null, emptyList()))
         }
-      }
+      }.distinctUntilChanged().throttleLast(100, TimeUnit.MILLISECONDS)
 }
diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/BufferData.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/BufferData.kt
index f3a175577ef3059e7211816a11ea32f1b37756c0..700c453f1407c5a37397a5b92c5295db0178d033 100644
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/BufferData.kt
+++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/data/BufferData.kt
@@ -25,5 +25,6 @@ import de.kuschku.libquassel.quassel.syncables.Network
 data class BufferData(
   val info: BufferInfo? = null,
   val network: Network? = null,
-  val description: String? = null
+  val description: String? = null,
+  val userCount: Int = 0
 )