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 1eea6bbde98ba228e07a74152a2b693218920f94..0294711ae3a2fbac99735a0be617b6f25aa9abd5 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
@@ -46,6 +46,8 @@ import de.kuschku.libquassel.quassel.syncables.BufferViewConfig
 import de.kuschku.libquassel.quassel.syncables.interfaces.INetwork
 import de.kuschku.libquassel.util.flag.hasFlag
 import de.kuschku.libquassel.util.flag.minus
+import de.kuschku.libquassel.util.helpers.mapMap
+import de.kuschku.libquassel.util.helpers.mapOrElse
 import de.kuschku.libquassel.util.helpers.nullIf
 import de.kuschku.libquassel.util.helpers.value
 import de.kuschku.quasseldroid.R
@@ -461,8 +463,14 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
     })
 
     chatListToolbar.inflateMenu(R.menu.context_bufferlist)
+    chatListToolbar.menu.findItem(R.id.action_search).isChecked = viewModel.bufferSearchTemporarilyVisible.value
     chatListToolbar.setOnMenuItemClickListener { item ->
       when (item.itemId) {
+        R.id.action_search      -> {
+          item.isChecked = !item.isChecked
+          viewModel.bufferSearchTemporarilyVisible.onNext(item.isChecked)
+          true
+        }
         R.id.action_show_hidden -> {
           item.isChecked = !item.isChecked
           viewModel.showHidden.onNext(item.isChecked)
@@ -482,11 +490,21 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
       hasSetBufferViewConfigId = false
     })
 
-    viewModel.bufferViewConfig.toLiveData().observe(this, Observer {
-      val visible = it.orNull()?.showSearch() ?: false
-      bufferSearchContainer.visibleIf(visible)
-      if (!visible) bufferSearch.setText("")
-    })
+    val bufferSearchPermanentlyVisible = viewModel.bufferViewConfig
+      .mapMap(BufferViewConfig::showSearch)
+      .mapOrElse(false)
+
+    combineLatest(viewModel.bufferSearchTemporarilyVisible, bufferSearchPermanentlyVisible)
+      .toLiveData().observe(this, Observer { (temporarily, permanently) ->
+        val visible = temporarily || permanently
+
+        val menuItem = chatListToolbar.menu.findItem(R.id.action_search)
+        menuItem.isVisible = !permanently
+        if (permanently) menuItem.isChecked = false
+
+        bufferSearchContainer.visibleIf(visible)
+        if (!visible) bufferSearch.setText("")
+      })
 
     bufferSearch.addTextChangedListener(object : TextWatcher {
       override fun afterTextChanged(s: Editable) {
@@ -515,6 +533,7 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
       longClickListener(bufferId)
     } else {
       context?.let {
+        viewModel.bufferSearchTemporarilyVisible.onNext(false)
         ChatActivity.launch(it, bufferId = bufferId)
       }
     }
diff --git a/app/src/main/res/menu/context_bufferlist.xml b/app/src/main/res/menu/context_bufferlist.xml
index bb1f8dd02d8c353d561ed05d9aa4dcb9df0d9924..cb6f9de17a07a821ae9799aa1e4bc7f42ab79ede 100644
--- a/app/src/main/res/menu/context_bufferlist.xml
+++ b/app/src/main/res/menu/context_bufferlist.xml
@@ -18,6 +18,10 @@
   -->
 
 <menu xmlns:android="http://schemas.android.com/apk/res/android">
+  <item
+    android:id="@+id/action_search"
+    android:checkable="true"
+    android:title="@string/label_search_buffer" />
   <item
     android:id="@+id/action_show_hidden"
     android:checkable="true"
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index 80c47c71229030e59b781d22677ce6b192905e8b..52df2bb65bdff43ce3f8c322be939674ee495c37 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -102,7 +102,8 @@
   <string name="label_rename">Rename</string>
   <string name="label_save">Save</string>
   <string name="label_saving">Saving…</string>
-  <string name="label_search_buffer">Search…</string>
+  <string name="label_search">Search…</string>
+  <string name="label_search_buffer">Search Chats</string>
   <string name="label_select">Select</string>
   <string name="label_send">Send</string>
   <string name="label_set_default">Set Default</string>
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 405e1030f1e94e20a664171a543cfee138324cd3..04e11b532b79641e79f86877aa481a689ebed6de 100644
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
+++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
@@ -116,6 +116,8 @@ class QuasselViewModel : ViewModel() {
     }.mapSwitchMap(BufferViewConfig::liveUpdates)
   }
 
+  val bufferSearchTemporarilyVisible = BehaviorSubject.createDefault(false)
+
   val errors = sessionManager.switchMap {
     it.orNull()?.error ?: Observable.empty()
   }