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 140cc61567e4516a6db52ccd4d28a2862dc2c53e..43dd1caeafaf01f42a75b1cea7eb6a337561fb8f 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
@@ -84,6 +84,7 @@ import de.kuschku.quasseldroid.util.missingfeatures.RequiredFeatures
 import de.kuschku.quasseldroid.util.service.ServiceBoundActivity
 import de.kuschku.quasseldroid.util.ui.DragInterceptBottomSheetBehavior
 import de.kuschku.quasseldroid.util.ui.MaterialContentLoadingProgressBar
+import de.kuschku.quasseldroid.util.ui.NickCountDrawable
 import de.kuschku.quasseldroid.viewmodel.EditorViewModel
 import de.kuschku.quasseldroid.viewmodel.data.BufferData
 import org.threeten.bp.Instant
@@ -681,6 +682,11 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
   }
 
   override fun onCreateOptionsMenu(menu: Menu?): Boolean {
+    val nickCountDrawableSize = resources.getDimensionPixelSize(R.dimen.size_nick_count)
+    val nickCountDrawableColor = toolbar.context.theme.styledAttributes(R.attr.colorControlNormal) {
+      getColor(0, 0)
+    }
+
     menuInflater.inflate(R.menu.activity_main, menu)
     menu?.findItem(R.id.action_nicklist)?.isVisible = bufferData?.info?.type?.hasFlag(Buffer_Type.ChannelBuffer) ?: false
     menu?.findItem(R.id.action_filter_messages)?.isVisible =
@@ -691,6 +697,12 @@ 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)
+    })
     return super.onCreateOptionsMenu(menu)
   }
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/ui/NickCountDrawable.kt b/app/src/main/java/de/kuschku/quasseldroid/util/ui/NickCountDrawable.kt
new file mode 100644
index 0000000000000000000000000000000000000000..71dbe7a10d10093c3cf56da2181d2c3a4bc61779
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/ui/NickCountDrawable.kt
@@ -0,0 +1,87 @@
+package de.kuschku.quasseldroid.util.ui
+
+import android.graphics.*
+import android.graphics.drawable.Drawable
+import android.support.annotation.ColorInt
+import android.support.annotation.Dimension
+
+class NickCountDrawable(
+  count: Int,
+  @Dimension private val size: Int,
+  @ColorInt textColor: Int
+) : Drawable() {
+  private val paint = Paint().apply {
+    color = textColor
+    isAntiAlias = true
+    style = Paint.Style.FILL
+    typeface = Typeface.DEFAULT_BOLD
+    textAlign = Paint.Align.CENTER
+  }
+
+  private val formattedText: String = formatCount(count)
+
+  private fun formatCount(count: Int) = when {
+    count >= 10_000 -> String.format("%.00fK", count / 1_000f)
+    count >= 1_000  -> String.format("%.01fK", count / 1_000f)
+    else            -> "$count"
+  }
+
+  private val showText: Boolean = count > 0
+
+  private val icon = Path().apply {
+    moveTo(16f, 13f)
+    cubicTo(15.71f, 13f, 15.38f, 13f, 15.03f, 13.05f)
+    cubicTo(16.19f, 13.89f, 17f, 15f, 17f, 16.5f)
+    lineTo(17f, 19f)
+    lineTo(23f, 19f)
+    lineTo(23f, 16.5f)
+    cubicTo(23f, 14.17f, 18.33f, 13f, 16f, 13f)
+    moveTo(8f, 13f)
+    cubicTo(5.67f, 13f, 1f, 14.17f, 1f, 16.5f)
+    lineTo(1f, 19f)
+    lineTo(15f, 19f)
+    lineTo(15f, 16.5f)
+    cubicTo(15f, 14.17f, 10.33f, 13f, 8f, 13f)
+    addCircle(8f, 8f, 3f, Path.Direction.CCW)
+    addCircle(16f, 8f, 3f, Path.Direction.CCW)
+    close()
+  }
+
+  override fun getIntrinsicHeight() = size
+  override fun getIntrinsicWidth() = size
+
+  private val tmpPath = Path()
+
+  override fun setAlpha(alpha: Int) {
+    paint.alpha = alpha
+  }
+
+  override fun getOpacity(): Int = PixelFormat.TRANSLUCENT
+
+  override fun setColorFilter(colorFilter: ColorFilter?) {
+    paint.colorFilter = colorFilter
+  }
+
+  override fun draw(canvas: Canvas) {
+    if (bounds.width() <= 0 || bounds.height() <= 0) {
+      // Nothing to draw
+      return
+    }
+
+    val smallestDimension = Math.min(bounds.width(), bounds.height())
+    icon.transform(Matrix().apply {
+      preScale(smallestDimension / 24f, smallestDimension / 24f, 0f, 0f)
+      if (showText) {
+        preTranslate(0f, -8f)
+      }
+    }, tmpPath)
+
+    paint.textSize = smallestDimension * 0.6f
+
+    canvas.drawPath(tmpPath, paint)
+    if (showText) {
+      canvas.drawText(formattedText, bounds.width() / 2f,
+                      bounds.height() * 0.85f - ((paint.descent() + paint.ascent()) / 2f), paint)
+    }
+  }
+}
diff --git a/app/src/main/res/values/dimens.xml b/app/src/main/res/values/dimens.xml
index e861f1d65528ea9bb82e2c61b5e26b4dcf052127..2966181b6a02309603673b1aa7e457b92444cab6 100644
--- a/app/src/main/res/values/dimens.xml
+++ b/app/src/main/res/values/dimens.xml
@@ -43,4 +43,5 @@
 
   <dimen name="notification_avatar_width">64dp</dimen>
   <dimen name="notification_avatar_height">64dp</dimen>
+  <dimen name="size_nick_count">24dp</dimen>
 </resources>