diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 369e64e73a432bfebd27f4e553b573fba54f0f8a..7b23fbd97afd9f1c5e62b0e90e034246c5935911 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -81,6 +81,12 @@
       android:label="@string/settings_identity_title"
       android:parentActivityName=".ui.coresettings.CoreSettingsActivity"
       android:windowSoftInputMode="adjustResize" />
+    <activity
+      android:name=".ui.coresettings.chatlist.ChatListActivity"
+      android:exported="false"
+      android:label="@string/settings_chatlist_title"
+      android:parentActivityName=".ui.coresettings.CoreSettingsActivity"
+      android:windowSoftInputMode="adjustResize" />
     <activity
       android:name=".ui.coresettings.networkconfig.NetworkConfigActivity"
       android:exported="false"
diff --git a/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt b/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt
index 16d9f31a2d82efde869c413b51c976968a2d87a7..5fa67e3b46e06574d85e6320508433d48fd00e80 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/dagger/ActivityModule.kt
@@ -18,6 +18,8 @@ import de.kuschku.quasseldroid.ui.clientsettings.license.LicenseSettingsActivity
 import de.kuschku.quasseldroid.ui.clientsettings.license.LicenseSettingsFragmentProvider
 import de.kuschku.quasseldroid.ui.coresettings.CoreSettingsActivity
 import de.kuschku.quasseldroid.ui.coresettings.CoreSettingsFragmentProvider
+import de.kuschku.quasseldroid.ui.coresettings.chatlist.ChatListActivity
+import de.kuschku.quasseldroid.ui.coresettings.chatlist.ChatListFragmentProvider
 import de.kuschku.quasseldroid.ui.coresettings.identity.IdentityActivity
 import de.kuschku.quasseldroid.ui.coresettings.identity.IdentityFragmentProvider
 import de.kuschku.quasseldroid.ui.coresettings.networkconfig.NetworkConfigActivity
@@ -54,6 +56,9 @@ abstract class ActivityModule {
   @ContributesAndroidInjector(modules = [IdentityFragmentProvider::class])
   abstract fun bindIdentityActivity(): IdentityActivity
 
+  @ContributesAndroidInjector(modules = [ChatListFragmentProvider::class])
+  abstract fun bindChatListActivity(): ChatListActivity
+
   @ContributesAndroidInjector(modules = [NetworkConfigFragmentProvider::class])
   abstract fun bindNetworkConfigActivity(): NetworkConfigActivity
 
@@ -68,4 +73,4 @@ abstract class ActivityModule {
 
   @ContributesAndroidInjector
   abstract fun bindQuasselService(): QuasselService
-}
\ No newline at end of file
+}
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 5fa61ef00eb1f8d5f0ccccf9523803b3b378ac47..47a3e50e4f666d0f16b20d066b279f21b5d395ae 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
@@ -16,6 +16,7 @@ import de.kuschku.libquassel.quassel.syncables.BufferViewConfig
 import de.kuschku.libquassel.quassel.syncables.Identity
 import de.kuschku.libquassel.quassel.syncables.Network
 import de.kuschku.quasseldroid.R
+import de.kuschku.quasseldroid.ui.coresettings.chatlist.ChatListActivity
 import de.kuschku.quasseldroid.ui.coresettings.identity.IdentityActivity
 import de.kuschku.quasseldroid.ui.coresettings.networkconfig.NetworkConfigActivity
 import de.kuschku.quasseldroid.util.helper.combineLatest
@@ -55,11 +56,9 @@ class CoreSettingsFragment : ServiceBoundFragment() {
     }
 
     val chatListAdapter = SettingsItemAdapter {
-      /*
-      val intent = Intent(requireContext(), BufferViewConfigActivity::class.java)
-      intent.putExtra("bufferviewconfig", it)
+      val intent = Intent(requireContext(), ChatListActivity::class.java)
+      intent.putExtra("chatlist", it)
       startActivity(intent)
-      */
     }
 
     val itemDecoration = DividerItemDecoration(requireContext(), DividerItemDecoration.VERTICAL)
@@ -99,8 +98,8 @@ class CoreSettingsFragment : ServiceBoundFragment() {
     chatlists.addItemDecoration(itemDecoration)
     ViewCompat.setNestedScrollingEnabled(chatlists, false)
 
-    viewModel.bufferViewConfigs.switchMap {
-      combineLatest(it.map(BufferViewConfig::live_config)).map {
+    viewModel.bufferViewConfigMap.switchMap {
+      combineLatest(it.values.map(BufferViewConfig::liveUpdates)).map {
         it.map {
           SettingsItem(it.bufferViewId(), it.bufferViewName())
         }.sortedBy(SettingsItem::name)
@@ -115,4 +114,4 @@ class CoreSettingsFragment : ServiceBoundFragment() {
 
     return view
   }
-}
\ No newline at end of file
+}
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListActivity.kt
new file mode 100644
index 0000000000000000000000000000000000000000..7ebf8cb2adf9d3a5d3a7087144fad15f1aafcc90
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListActivity.kt
@@ -0,0 +1,5 @@
+package de.kuschku.quasseldroid.ui.coresettings.chatlist
+
+import de.kuschku.quasseldroid.util.ui.SettingsActivity
+
+class ChatListActivity : SettingsActivity(ChatListFragment())
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListFragment.kt
new file mode 100644
index 0000000000000000000000000000000000000000..c38a27a9c0bfb089f427dae2c07bd0246f82e29a
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListFragment.kt
@@ -0,0 +1,90 @@
+package de.kuschku.quasseldroid.ui.coresettings.chatlist
+
+import android.arch.lifecycle.Observer
+import android.os.Bundle
+import android.support.v7.widget.SwitchCompat
+import android.view.LayoutInflater
+import android.view.View
+import android.view.ViewGroup
+import android.widget.TextView
+import butterknife.BindView
+import butterknife.ButterKnife
+import de.kuschku.libquassel.quassel.syncables.BufferViewConfig
+import de.kuschku.quasseldroid.R
+import de.kuschku.quasseldroid.ui.coresettings.SettingsFragment
+import de.kuschku.quasseldroid.util.helper.toLiveData
+import io.reactivex.Observable
+
+class ChatListFragment : SettingsFragment() {
+  private var chatlist: Pair<BufferViewConfig, BufferViewConfig>? = null
+
+  @BindView(R.id.buffer_view_name)
+  lateinit var bufferViewName: TextView
+
+  @BindView(R.id.show_search)
+  lateinit var showSearch: SwitchCompat
+
+  @BindView(R.id.sort_alphabetically)
+  lateinit var sortAlphabetically: SwitchCompat
+
+  @BindView(R.id.add_new_buffers_automatically)
+  lateinit var addNewBuffersAutomatically: SwitchCompat
+
+  @BindView(R.id.disable_decoration)
+  lateinit var disableDecoration: SwitchCompat
+
+  @BindView(R.id.show_channels)
+  lateinit var showChannels: SwitchCompat
+
+  @BindView(R.id.show_queries)
+  lateinit var showQueries: SwitchCompat
+
+  @BindView(R.id.hide_inactive_buffers)
+  lateinit var hideInactiveBuffers: SwitchCompat
+
+  @BindView(R.id.hide_inactive_networks)
+  lateinit var hideInactiveNetworks: SwitchCompat
+
+  override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?,
+                            savedInstanceState: Bundle?): View? {
+    val view = inflater.inflate(R.layout.settings_chatlist, container, false)
+    ButterKnife.bind(this, view)
+
+    val chatlistId = arguments?.getInt("chatlist", -1) ?: -1
+
+    viewModel.bufferViewConfigMap.switchMap {
+      it[chatlistId]?.liveUpdates() ?: Observable.empty()
+    }.firstElement()
+      .toLiveData().observe(this, Observer {
+        if (it != null) {
+          this.chatlist = Pair(it, it.copy())
+          this.chatlist?.let { (_, data) ->
+            bufferViewName.text = data.bufferViewName()
+            showSearch.isChecked = data.showSearch()
+            sortAlphabetically.isChecked = data.sortAlphabetically()
+            addNewBuffersAutomatically.isChecked = data.addNewBuffersAutomatically()
+            disableDecoration.isChecked = data.disableDecoration()
+
+            hideInactiveBuffers.isChecked = data.hideInactiveBuffers()
+            hideInactiveNetworks.isChecked = data.hideInactiveNetworks()
+          }
+        }
+      })
+
+    return view
+  }
+
+  override fun onSave() = chatlist?.let { (it, data) ->
+    data.setBufferViewName(bufferViewName.text.toString())
+    data.setShowSearch(showSearch.isChecked)
+    data.setSortAlphabetically(sortAlphabetically.isChecked)
+    data.setAddNewBuffersAutomatically(addNewBuffersAutomatically.isChecked)
+    data.setDisableDecoration(disableDecoration.isChecked)
+
+    data.setHideInactiveBuffers(hideInactiveBuffers.isChecked)
+    data.setHideInactiveNetworks(hideInactiveNetworks.isChecked)
+
+    it.requestUpdate(data.toVariantMap())
+    true
+  } ?: false
+}
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListFragmentProvider.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListFragmentProvider.kt
new file mode 100644
index 0000000000000000000000000000000000000000..033de4aae7ce9170fa81867ce449c41af0079abc
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/chatlist/ChatListFragmentProvider.kt
@@ -0,0 +1,10 @@
+package de.kuschku.quasseldroid.ui.coresettings.chatlist
+
+import dagger.Module
+import dagger.android.ContributesAndroidInjector
+
+@Module
+abstract class ChatListFragmentProvider {
+  @ContributesAndroidInjector
+  abstract fun bindChatListFragment(): ChatListFragment
+}
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityFragment.kt
index d83068daf3b850846f3c319528b23a50fb1212fb..6d16e5f6b1a8fd5ca299d11516a12545d903bef8 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/identity/IdentityFragment.kt
@@ -17,11 +17,11 @@ import butterknife.BindView
 import butterknife.ButterKnife
 import com.afollestad.materialdialogs.MaterialDialog
 import de.kuschku.libquassel.quassel.syncables.Identity
-import de.kuschku.libquassel.util.Optional
 import de.kuschku.quasseldroid.R
 import de.kuschku.quasseldroid.ui.coresettings.SettingsFragment
 import de.kuschku.quasseldroid.util.helper.setDependent
 import de.kuschku.quasseldroid.util.helper.toLiveData
+import io.reactivex.Observable
 
 
 class IdentityFragment : SettingsFragment() {
@@ -73,11 +73,9 @@ class IdentityFragment : SettingsFragment() {
 
     val identityId = arguments?.getInt("identity", -1) ?: -1
 
-    viewModel.identities.map {
-      Optional.ofNullable(it[identityId])
-    }.filter(Optional<Identity>::isPresent)
-      .map(Optional<Identity>::get)
-      .firstElement()
+    viewModel.identities.switchMap {
+      it[identityId]?.liveUpdates() ?: Observable.empty()
+    }.firstElement()
       .toLiveData().observe(this, Observer {
         if (it != null) {
           this.identity = Pair(it, it.copy())
@@ -180,4 +178,4 @@ class IdentityFragment : SettingsFragment() {
       adapter.removeNick(viewHolder.adapterPosition)
     }
   }
-}
\ No newline at end of file
+}
diff --git a/app/src/main/res/drawable/ic_clock.xml b/app/src/main/res/drawable/ic_clock.xml
new file mode 100644
index 0000000000000000000000000000000000000000..6c1dc6366a7df10940373ff572627c6feba1c090
--- /dev/null
+++ b/app/src/main/res/drawable/ic_clock.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+  android:width="24dp"
+  android:height="24dp"
+  android:viewportHeight="24"
+  android:viewportWidth="24">
+  <path
+    android:fillColor="#000"
+    android:pathData="M12,20A8,8 0 0,0 20,12A8,8 0 0,0 12,4A8,8 0 0,0 4,12A8,8 0 0,0 12,20M12,2A10,10 0 0,1 22,12A10,10 0 0,1 12,22C6.47,22 2,17.5 2,12A10,10 0 0,1 12,2M12.5,7V12.25L17,14.92L16.25,16.15L11,13V7H12.5Z" />
+</vector>
diff --git a/app/src/main/res/drawable/ic_eye.xml b/app/src/main/res/drawable/ic_eye.xml
new file mode 100644
index 0000000000000000000000000000000000000000..9cc8a518dda896491398a6f1d7d483efb0731d7d
--- /dev/null
+++ b/app/src/main/res/drawable/ic_eye.xml
@@ -0,0 +1,9 @@
+<vector xmlns:android="http://schemas.android.com/apk/res/android"
+  android:width="24dp"
+  android:height="24dp"
+  android:viewportHeight="24"
+  android:viewportWidth="24">
+  <path
+    android:fillColor="#000"
+    android:pathData="M12,9A3,3 0 0,0 9,12A3,3 0 0,0 12,15A3,3 0 0,0 15,12A3,3 0 0,0 12,9M12,17A5,5 0 0,1 7,12A5,5 0 0,1 12,7A5,5 0 0,1 17,12A5,5 0 0,1 12,17M12,4.5C7,4.5 2.73,7.61 1,12C2.73,16.39 7,19.5 12,19.5C17,19.5 21.27,16.39 23,12C21.27,7.61 17,4.5 12,4.5Z" />
+</vector>
diff --git a/app/src/main/res/layout/settings_chatlist.xml b/app/src/main/res/layout/settings_chatlist.xml
new file mode 100644
index 0000000000000000000000000000000000000000..d930f8e804ca5bf572e8d63b113a5fe6ebecf53f
--- /dev/null
+++ b/app/src/main/res/layout/settings_chatlist.xml
@@ -0,0 +1,137 @@
+<?xml version="1.0" encoding="utf-8"?>
+<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android"
+  xmlns:app="http://schemas.android.com/apk/res-auto"
+  xmlns:tools="http://schemas.android.com/tools"
+  android:layout_width="match_parent"
+  android:layout_height="match_parent"
+  android:scrollbars="vertical">
+
+  <LinearLayout style="@style/Widget.CoreSettings.Wrapper">
+
+    <LinearLayout
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:minHeight="48dp">
+
+      <android.support.v7.widget.AppCompatImageView
+        style="@style/Widget.CoreSettings.PrimaryItemIcon"
+        app:srcCompat="@drawable/ic_eye" />
+
+      <TextView
+        style="@style/Widget.CoreSettings.PrimaryItemSwitch"
+        android:text="@string/settings_chatlist_ui" />
+    </LinearLayout>
+
+    <LinearLayout
+      style="@style/Widget.CoreSettings.DependentGroup"
+      android:visibility="visible">
+
+      <android.support.design.widget.TextInputLayout
+        style="@style/Widget.CoreSettings.EditTextLayout"
+        android:hint="@string/settings_chatlist_buffer_view_name">
+
+        <android.support.design.widget.TextInputEditText
+          android:id="@+id/buffer_view_name"
+          style="@style/Widget.CoreSettings.EditText"
+          tools:text="All Chats" />
+      </android.support.design.widget.TextInputLayout>
+
+      <android.support.v7.widget.SwitchCompat
+        android:id="@+id/show_search"
+        style="@style/Widget.CoreSettings.PrimaryItemSwitch"
+        android:text="@string/settings_chatlist_show_search" />
+
+      <android.support.v7.widget.SwitchCompat
+        android:id="@+id/sort_alphabetically"
+        style="@style/Widget.CoreSettings.PrimaryItemSwitch"
+        android:text="@string/settings_chatlist_sort_alphabetically" />
+
+      <android.support.v7.widget.SwitchCompat
+        android:id="@+id/add_new_buffers_automatically"
+        style="@style/Widget.CoreSettings.PrimaryItemSwitch"
+        android:text="@string/settings_chatlist_add_new_buffers_automatically" />
+    </LinearLayout>
+
+    <LinearLayout
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:minHeight="48dp">
+
+      <android.support.v7.widget.AppCompatImageView
+        style="@style/Widget.CoreSettings.PrimaryItemIcon"
+        app:srcCompat="@drawable/ic_server_network" />
+
+      <TextView
+        style="@style/Widget.CoreSettings.PrimaryItemSwitch"
+        android:text="@string/settings_chatlist_network" />
+    </LinearLayout>
+
+    <LinearLayout
+      style="@style/Widget.CoreSettings.DependentGroup"
+      android:visibility="visible">
+
+      <android.support.v7.widget.SwitchCompat
+        android:id="@+id/disable_decoration"
+        style="@style/Widget.CoreSettings.PrimaryItemSwitch"
+        android:text="@string/settings_chatlist_disable_decoration" />
+    </LinearLayout>
+
+    <LinearLayout
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:minHeight="48dp">
+
+      <android.support.v7.widget.AppCompatImageView
+        style="@style/Widget.CoreSettings.PrimaryItemIcon"
+        app:srcCompat="@drawable/ic_tag_text" />
+
+      <TextView
+        style="@style/Widget.CoreSettings.PrimaryItemSwitch"
+        android:text="@string/settings_chatlist_types" />
+    </LinearLayout>
+
+    <LinearLayout
+      style="@style/Widget.CoreSettings.DependentGroup"
+      android:visibility="visible">
+
+      <android.support.v7.widget.SwitchCompat
+        android:id="@+id/show_channels"
+        style="@style/Widget.CoreSettings.PrimaryItemSwitch"
+        android:text="@string/settings_chatlist_show_channels" />
+
+      <android.support.v7.widget.SwitchCompat
+        android:id="@+id/show_queries"
+        style="@style/Widget.CoreSettings.PrimaryItemSwitch"
+        android:text="@string/settings_chatlist_show_queries" />
+    </LinearLayout>
+
+    <LinearLayout
+      android:layout_width="match_parent"
+      android:layout_height="wrap_content"
+      android:minHeight="48dp">
+
+      <android.support.v7.widget.AppCompatImageView
+        style="@style/Widget.CoreSettings.PrimaryItemIcon"
+        app:srcCompat="@drawable/ic_clock" />
+
+      <TextView
+        style="@style/Widget.CoreSettings.PrimaryItemSwitch"
+        android:text="@string/settings_chatlist_activity" />
+    </LinearLayout>
+
+    <LinearLayout
+      style="@style/Widget.CoreSettings.DependentGroup"
+      android:visibility="visible">
+
+      <android.support.v7.widget.SwitchCompat
+        android:id="@+id/hide_inactive_buffers"
+        style="@style/Widget.CoreSettings.PrimaryItemSwitch"
+        android:text="@string/settings_chatlist_hide_inactive_buffers" />
+
+      <android.support.v7.widget.SwitchCompat
+        android:id="@+id/hide_inactive_networks"
+        style="@style/Widget.CoreSettings.PrimaryItemSwitch"
+        android:text="@string/settings_chatlist_hide_inactive_networks" />
+    </LinearLayout>
+  </LinearLayout>
+</android.support.v4.widget.NestedScrollView>
diff --git a/app/src/main/res/layout/settings_identity.xml b/app/src/main/res/layout/settings_identity.xml
index 6d490acd67b56bb04e1815e46f10b9eb6632f910..7245098b9e70b75a5b12cc22970e49dbbbd0f502 100644
--- a/app/src/main/res/layout/settings_identity.xml
+++ b/app/src/main/res/layout/settings_identity.xml
@@ -150,7 +150,7 @@
 
       <android.support.v7.widget.AppCompatImageView
         style="@style/Widget.CoreSettings.PrimaryItemIcon"
-        app:srcCompat="@drawable/ic_history" />
+        app:srcCompat="@drawable/ic_clock" />
 
       <TextView
         style="@style/Widget.CoreSettings.PrimaryItemSwitch"
@@ -170,35 +170,27 @@
           style="@style/Widget.CoreSettings.EditText"
           tools:text="Gone Fishing." />
       </android.support.design.widget.TextInputLayout>
-    </LinearLayout>
-
-    <LinearLayout
-      android:layout_width="match_parent"
-      android:layout_height="wrap_content"
-      android:minHeight="48dp">
-
-      <Space style="@style/Widget.CoreSettings.PrimaryItemIcon" />
 
       <android.support.v7.widget.SwitchCompat
         android:id="@+id/detach_away"
         style="@style/Widget.CoreSettings.PrimaryItemSwitch"
         android:text="@string/settings_identity_detach_away" />
-    </LinearLayout>
 
-    <LinearLayout
-      android:id="@+id/detach_away_group"
-      style="@style/Widget.CoreSettings.DependentGroup"
-      tools:visibility="visible">
+      <LinearLayout
+        android:id="@+id/detach_away_group"
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
 
-      <android.support.design.widget.TextInputLayout
-        style="@style/Widget.CoreSettings.EditTextLayout"
-        android:hint="@string/settings_identity_detach_away_reason">
+        <android.support.design.widget.TextInputLayout
+          style="@style/Widget.CoreSettings.EditTextLayout"
+          android:hint="@string/settings_identity_detach_away_reason">
 
-        <android.support.design.widget.TextInputEditText
-          android:id="@+id/detach_away_reason"
-          style="@style/Widget.CoreSettings.EditText"
-          tools:text="Gone Fishing." />
-      </android.support.design.widget.TextInputLayout>
+          <android.support.design.widget.TextInputEditText
+            android:id="@+id/detach_away_reason"
+            style="@style/Widget.CoreSettings.EditText"
+            tools:text="Gone Fishing." />
+        </android.support.design.widget.TextInputLayout>
+      </LinearLayout>
     </LinearLayout>
   </LinearLayout>
-</android.support.v4.widget.NestedScrollView>
\ No newline at end of file
+</android.support.v4.widget.NestedScrollView>
diff --git a/app/src/main/res/values/strings_settings.xml b/app/src/main/res/values/strings_settings.xml
index 7aaab55a8822aadc87b8b619e0ea143a3b56388f..92777c89af789fc448e0f2ac8d2eab4e10343c96 100644
--- a/app/src/main/res/values/strings_settings.xml
+++ b/app/src/main/res/values/strings_settings.xml
@@ -21,6 +21,19 @@
 
   <string name="settings_chatlists_title">Chatlists</string>
   <string name="settings_chatlist_title">Chatlist</string>
+  <string name="settings_chatlist_ui">User Interface</string>
+  <string name="settings_chatlist_buffer_view_name">Name</string>
+  <string name="settings_chatlist_show_search">Show Search</string>
+  <string name="settings_chatlist_sort_alphabetically">Sort Alphabetically</string>
+  <string name="settings_chatlist_add_new_buffers_automatically">Add new chats automatically</string>
+  <string name="settings_chatlist_network">Network</string>
+  <string name="settings_chatlist_disable_decoration">Hide Status Buffer</string>
+  <string name="settings_chatlist_types">Chat Types</string>
+  <string name="settings_chatlist_show_channels">Show Channels</string>
+  <string name="settings_chatlist_show_queries">Show Queries</string>
+  <string name="settings_chatlist_activity">Activity</string>
+  <string name="settings_chatlist_hide_inactive_buffers">Hide Inactive Chats</string>
+  <string name="settings_chatlist_hide_inactive_networks">Hide Inactive Networks</string>
 
   <string name="settings_networkconfig_title">IRC Config</string>
   <string name="settings_networkconfig_ping_timeout">Ping Timeout Detection</string>
@@ -36,4 +49,4 @@
   <string name="settings_networkconfig_auto_who_delay">Minimum delay between requests</string>
   <string name="settings_networkconfig_auto_who_delay_unit">seconds</string>
   <string name="settings_networkconfig_standard_ctcp">Standard-Compliant CTCP behavior</string>
-</resources>
\ No newline at end of file
+</resources>
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewConfig.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewConfig.kt
index cafcc17dfd4a2137e329a0db8edf61a8f97faddf..1e8a3738f948b6a6d5ead32ef14b8c30bead8208 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewConfig.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewConfig.kt
@@ -5,14 +5,13 @@ import de.kuschku.libquassel.protocol.*
 import de.kuschku.libquassel.protocol.Type
 import de.kuschku.libquassel.quassel.BufferInfo
 import de.kuschku.libquassel.quassel.syncables.interfaces.IBufferViewConfig
-import de.kuschku.libquassel.session.ISession
 import de.kuschku.libquassel.session.SignalProxy
+import io.reactivex.Observable
 import io.reactivex.subjects.BehaviorSubject
 
 class BufferViewConfig constructor(
   bufferViewId: Int,
-  proxy: SignalProxy,
-  private val session: ISession
+  proxy: SignalProxy
 ) : SyncableObject(proxy, "BufferViewConfig"), IBufferViewConfig {
   override fun init() {
     renameObject("$_bufferViewId")
@@ -20,8 +19,8 @@ class BufferViewConfig constructor(
 
   override fun toVariantMap(): QVariantMap = mapOf(
     "BufferList" to QVariant.of(initBufferList(), Type.QVariantList),
-    "RemovedBuffers" to QVariant.of(initBufferList(), Type.QVariantList),
-    "TemporarilyRemovedBuffers" to QVariant.of(initBufferList(), Type.QVariantList)
+    "RemovedBuffers" to QVariant.of(initRemovedBuffers(), Type.QVariantList),
+    "TemporarilyRemovedBuffers" to QVariant.of(initTemporarilyRemovedBuffers(), Type.QVariantList)
   ) + initProperties()
 
   override fun fromVariantMap(properties: QVariantMap) {
@@ -29,13 +28,6 @@ class BufferViewConfig constructor(
     initSetRemovedBuffers(properties["RemovedBuffers"].valueOr(::emptyList))
     initSetTemporarilyRemovedBuffers(properties["TemporarilyRemovedBuffers"].valueOr(::emptyList))
     initSetProperties(properties)
-
-    val bufferSyncer = session.bufferSyncer
-    if (bufferSyncer != null) {
-      for (info in bufferSyncer.bufferInfos()) {
-        handleBuffer(info, bufferSyncer)
-      }
-    }
   }
 
   override fun initBufferList(): QVariantList = _buffers.map {
@@ -79,18 +71,16 @@ class BufferViewConfig constructor(
   }
 
   override fun initSetProperties(properties: QVariantMap) {
-    setBufferViewName(properties["bufferViewName"].valueOr(this::bufferViewName))
-    setNetworkId(properties["networkId"].valueOr(this::networkId))
-    setAddNewBuffersAutomatically(
-      properties["addNewBuffersAutomatically"].valueOr(this::addNewBuffersAutomatically)
-    )
-    setSortAlphabetically(properties["sortAlphabetically"].valueOr(this::sortAlphabetically))
-    setHideInactiveBuffers(properties["hideInactiveBuffers"].valueOr(this::hideInactiveBuffers))
-    setHideInactiveNetworks(properties["hideInactiveNetworks"].valueOr(this::hideInactiveNetworks))
-    setDisableDecoration(properties["disableDecoration"].valueOr(this::disableDecoration))
-    setAllowedBufferTypes(properties["allowedBufferTypes"].valueOr { allowedBufferTypes().toInt() })
-    setMinimumActivity(properties["minimumActivity"].valueOr { minimumActivity().toInt() })
-    setShowSearch(properties["showSearch"].valueOr(this::showSearch))
+    _bufferViewName = properties["bufferViewName"].valueOr(this::bufferViewName)
+    _networkId = properties["networkId"].valueOr(this::networkId)
+    _addNewBuffersAutomatically = properties["addNewBuffersAutomatically"].valueOr(this::addNewBuffersAutomatically)
+    _sortAlphabetically = properties["sortAlphabetically"].valueOr(this::sortAlphabetically)
+    _hideInactiveBuffers = properties["hideInactiveBuffers"].valueOr(this::hideInactiveBuffers)
+    _hideInactiveNetworks = properties["hideInactiveNetworks"].valueOr(this::hideInactiveNetworks)
+    _disableDecoration = properties["disableDecoration"].valueOr(this::disableDecoration)
+    _allowedBufferTypes = properties["allowedBufferTypes"].valueOr(this::allowedBufferTypes)
+    _minimumActivity = properties["minimumActivity"].valueOr(this::minimumActivity)
+    _showSearch = properties["showSearch"].valueOr(this::showSearch)
   }
 
   override fun addBuffer(bufferId: BufferId, pos: Int) {
@@ -177,93 +167,125 @@ class BufferViewConfig constructor(
   fun removedBuffers(): Set<BufferId> = _removedBuffers
   fun temporarilyRemovedBuffers(): Set<BufferId> = _temporarilyRemovedBuffers
 
+  fun liveUpdates(): Observable<BufferViewConfig> = live_config
+  fun liveBuffers(): Observable<List<BufferId>> = live_buffers
+  fun liveRemovedBuffers(): Observable<Set<BufferId>> = live_removedBuffers
+  fun liveTemporarilyRemovedBuffers(): Observable<Set<BufferId>> = live_temporarilyRemovedBuffers
+
+  fun copy(): BufferViewConfig {
+    val config = BufferViewConfig(this.bufferViewId(), SignalProxy.NULL)
+    config.fromVariantMap(toVariantMap())
+    return config
+  }
+
   override fun setAddNewBuffersAutomatically(addNewBuffersAutomatically: Boolean) {
     _addNewBuffersAutomatically = addNewBuffersAutomatically
     super.setAddNewBuffersAutomatically(addNewBuffersAutomatically)
-    live_config.onNext(this)
   }
 
   override fun setAllowedBufferTypes(bufferTypes: Int) {
     _allowedBufferTypes = Buffer_Type.of(bufferTypes.toShort())
     super.setAllowedBufferTypes(bufferTypes)
-    live_config.onNext(this)
   }
 
   override fun setBufferViewName(bufferViewName: String) {
     _bufferViewName = bufferViewName
     super.setBufferViewName(bufferViewName)
-    live_config.onNext(this)
   }
 
   override fun setDisableDecoration(disableDecoration: Boolean) {
     _disableDecoration = disableDecoration
     super.setDisableDecoration(disableDecoration)
-    live_config.onNext(this)
   }
 
   override fun setHideInactiveBuffers(hideInactiveBuffers: Boolean) {
     _hideInactiveBuffers = hideInactiveBuffers
     super.setHideInactiveBuffers(hideInactiveBuffers)
-    live_config.onNext(this)
   }
 
   override fun setHideInactiveNetworks(hideInactiveNetworks: Boolean) {
     _hideInactiveNetworks = hideInactiveNetworks
     super.setHideInactiveNetworks(hideInactiveNetworks)
-    live_config.onNext(this)
   }
 
   override fun setMinimumActivity(activity: Int) {
     _minimumActivity = Buffer_Activity.of(activity)
     super.setMinimumActivity(activity)
-    live_config.onNext(this)
   }
 
   override fun setNetworkId(networkId: NetworkId) {
     _networkId = networkId
     super.setNetworkId(networkId)
-    live_config.onNext(this)
   }
 
   override fun setShowSearch(showSearch: Boolean) {
     _showSearch = showSearch
     super.setShowSearch(showSearch)
-    live_config.onNext(this)
   }
 
   override fun setSortAlphabetically(sortAlphabetically: Boolean) {
     _sortAlphabetically = sortAlphabetically
     super.setSortAlphabetically(sortAlphabetically)
-    live_config.onNext(this)
   }
 
   private val _bufferViewId: Int = bufferViewId
   private var _bufferViewName: String = ""
+    set(value) {
+      field = value
+      live_config.onNext(this)
+    }
   private var _networkId: NetworkId = 0
+    set(value) {
+      field = value
+      live_config.onNext(this)
+    }
   private var _addNewBuffersAutomatically: Boolean = true
+    set(value) {
+      field = value
+      live_config.onNext(this)
+    }
   private var _sortAlphabetically: Boolean = true
+    set(value) {
+      field = value
+      live_config.onNext(this)
+    }
   private var _hideInactiveBuffers: Boolean = false
+    set(value) {
+      field = value
+      live_config.onNext(this)
+    }
   private var _hideInactiveNetworks: Boolean = false
+    set(value) {
+      field = value
+      live_config.onNext(this)
+    }
   private var _disableDecoration: Boolean = false
+    set(value) {
+      field = value
+      live_config.onNext(this)
+    }
   private var _allowedBufferTypes: Buffer_Types = Buffer_Type.of(*Buffer_Type.validValues)
+    set(value) {
+      field = value
+      live_config.onNext(this)
+    }
   private var _minimumActivity: Buffer_Activities = Buffer_Activities.of(0)
+    set(value) {
+      field = value
+      live_config.onNext(this)
+    }
   private var _showSearch: Boolean = false
+    set(value) {
+      field = value
+      live_config.onNext(this)
+    }
   private var _buffers: MutableList<BufferId> = mutableListOf()
   private var _removedBuffers: MutableSet<BufferId> = mutableSetOf()
   private var _temporarilyRemovedBuffers: MutableSet<BufferId> = mutableSetOf()
-  val live_config = BehaviorSubject.createDefault(this)
-
-  val live_buffers: BehaviorSubject<List<BufferId>> = BehaviorSubject.createDefault<List<BufferId>>(
-    emptyList()
-  )
-
-  val live_removedBuffers: BehaviorSubject<Set<BufferId>> = BehaviorSubject.createDefault<Set<BufferId>>(
-    emptySet()
-  )
-
-  val live_temporarilyRemovedBuffers: BehaviorSubject<Set<BufferId>> = BehaviorSubject.createDefault<Set<BufferId>>(
-    emptySet()
-  )
+  private val live_config = BehaviorSubject.createDefault(this)
+  private val live_buffers = BehaviorSubject.createDefault<List<BufferId>>(emptyList())
+  private val live_removedBuffers = BehaviorSubject.createDefault<Set<BufferId>>(emptySet())
+  private val live_temporarilyRemovedBuffers = BehaviorSubject.createDefault<Set<BufferId>>(emptySet())
 
   object NameComparator : Comparator<BufferViewConfig> {
     override fun compare(a: BufferViewConfig?, b: BufferViewConfig?) =
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewManager.kt
index 3d479dc2242a112c7b39d5fbb799b744e3021997..158c500cd30b70388c220922d5df8928520b7422 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewManager.kt
@@ -3,14 +3,12 @@ package de.kuschku.libquassel.quassel.syncables
 import de.kuschku.libquassel.protocol.*
 import de.kuschku.libquassel.quassel.BufferInfo
 import de.kuschku.libquassel.quassel.syncables.interfaces.IBufferViewManager
-import de.kuschku.libquassel.session.ISession
 import de.kuschku.libquassel.session.SignalProxy
 import io.reactivex.Observable
 import io.reactivex.subjects.BehaviorSubject
 
 class BufferViewManager constructor(
-  proxy: SignalProxy,
-  private val session: ISession
+  proxy: SignalProxy
 ) : SyncableObject(proxy, "BufferViewManager"), IBufferViewManager {
   override fun toVariantMap(): QVariantMap = mapOf(
     "BufferViewIds" to QVariant.of(initBufferViewIds(), Type.QVariantList)
@@ -49,7 +47,7 @@ class BufferViewManager constructor(
     if (_bufferViewConfigs.contains(bufferViewConfigId))
       return
 
-    addBufferViewConfig(BufferViewConfig(bufferViewConfigId, proxy, session))
+    addBufferViewConfig(BufferViewConfig(bufferViewConfigId, proxy))
   }
 
   override fun deleteBufferViewConfig(bufferViewConfigId: Int) {
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/ISyncableObject.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/ISyncableObject.kt
index 3c557684324a3d5a21bff236b323700cdbc65645..aa7fe24736825fee162689dba2a2c46321d2988c 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/ISyncableObject.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/ISyncableObject.kt
@@ -28,13 +28,13 @@ interface ISyncableObject {
   fun toVariantMap(): QVariantMap = emptyMap()
 }
 
-inline fun ISyncableObject.SYNC(function: String, vararg arg: QVariant_) {
+/*inline*/ fun ISyncableObject.SYNC(function: String, vararg arg: QVariant_) {
   // Don’t transmit calls back that we just got from the network
   if (initialized && proxy.shouldSync(className, objectName, function))
     proxy.callSync(className, objectName, function, arg.toList())
 }
 
-inline fun ISyncableObject.REQUEST(function: String, vararg arg: QVariant_) {
+/*inline*/ fun ISyncableObject.REQUEST(function: String, vararg arg: QVariant_) {
   // Don’t transmit calls back that we just got from the network
   if (initialized && proxy.shouldSync(className, objectName, function))
     proxy.callSync(className, objectName, function, arg.toList())
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 c566fd79b11bbf47257e0da514481c735e587483..fd6a46f21d40a6dc74594e5298813e5531870c84 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
@@ -39,7 +39,7 @@ class Session(
 
   override val aliasManager = AliasManager(this)
   override val backlogManager = BacklogManager(this, backlogStorage)
-  override val bufferViewManager = BufferViewManager(this, this)
+  override val bufferViewManager = BufferViewManager(this)
   override val bufferSyncer = BufferSyncer(this, this)
   override val certManagers = mutableMapOf<IdentityId, CertManager>()
   override val coreInfo = CoreInfo(this)
@@ -191,6 +191,11 @@ class Session(
   }
 
   override fun onInitDone() {
+    for (config in bufferViewManager.bufferViewConfigs()) {
+      for (info in bufferSyncer.bufferInfos()) {
+        config.handleBuffer(info, bufferSyncer)
+      }
+    }
     coreConnection.setState(ConnectionState.CONNECTED)
     dispatch(SignalProxyMessage.HeartBeat(Instant.now()))
   }
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 2e620768182343b0d3becf2c551d3e9494fd4c1d..4d3b89ce7f6625293463b438473e57bebf649fd6 100644
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
+++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
@@ -318,6 +318,14 @@ class QuasselViewModel : ViewModel() {
     }
   }.mapOrElse(emptyList())
 
+  val bufferViewConfigMap = bufferViewManager.switchMap {
+    it.map { manager ->
+      manager.liveBufferViewConfigs().map {
+        it.mapNotNull(manager::bufferViewConfig).associateBy(BufferViewConfig::bufferViewId)
+      }
+    }.orElse(Observable.empty())
+  }
+
   val showHidden = BehaviorSubject.createDefault(false)
   val collapsedNetworks = BehaviorSubject.createDefault(emptySet<NetworkId>())
   val selectedBufferId = BehaviorSubject.createDefault(-1)
@@ -381,14 +389,14 @@ class QuasselViewModel : ViewModel() {
         val config = configOptional.orNull()
         if (bufferSyncer != null && config != null) {
           session.liveNetworks().switchMap { networks ->
-            config.live_config
+            config.liveUpdates()
               .debounce(16, TimeUnit.MILLISECONDS)
               .switchMap { currentConfig ->
                 combineLatest<Collection<BufferId>>(
                   listOf(
-                    config.live_buffers,
-                    config.live_temporarilyRemovedBuffers,
-                    config.live_removedBuffers
+                    config.liveBuffers(),
+                    config.liveTemporarilyRemovedBuffers(),
+                    config.liveRemovedBuffers()
                   )
                 ).switchMap { (ids, temp, perm) ->
                   fun transformIds(ids: Collection<BufferId>, state: BufferHiddenState) =