diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferListAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferListAdapter.kt
index 388691cea9255c689c428d7d1641a172f439f0d3..066856f2c6eb5f7432b49e5a00015ba2cbd8fc80 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferListAdapter.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferListAdapter.kt
@@ -11,25 +11,25 @@ import android.view.ViewGroup
 import android.widget.TextView
 import butterknife.BindView
 import butterknife.ButterKnife
-import de.kuschku.libquassel.protocol.BufferId
+import de.kuschku.libquassel.quassel.BufferInfo
 
 class BufferListAdapter(
   lifecycleOwner: LifecycleOwner,
-  liveData: LiveData<List<BufferId>?>,
+  liveData: LiveData<List<BufferInfo>?>,
   runInBackground: (() -> Unit) -> Any,
   runOnUiThread: (Runnable) -> Any
 ) : RecyclerView.Adapter<BufferListAdapter.BufferViewHolder>() {
-  var data = mutableListOf<BufferId>()
+  var data = mutableListOf<BufferInfo>()
 
   init {
-    liveData.observe(lifecycleOwner, Observer { list: List<BufferId>? ->
+    liveData.observe(lifecycleOwner, Observer { list: List<BufferInfo>? ->
       runInBackground {
         val old = data
         val new = list ?: emptyList()
         val result = DiffUtil.calculateDiff(
           object : DiffUtil.Callback() {
             override fun areItemsTheSame(oldItemPosition: Int, newItemPosition: Int)
-              = old[oldItemPosition] == new[newItemPosition]
+              = old[oldItemPosition].bufferId == new[newItemPosition].bufferId
 
             override fun getOldListSize() = old.size
             override fun getNewListSize() = new.size
@@ -64,8 +64,8 @@ class BufferListAdapter(
       ButterKnife.bind(this, itemView)
     }
 
-    fun bind(bufferId: BufferId) {
-      text.text = "$bufferId"
+    fun bind(info: BufferInfo) {
+      text.text = "${info.networkId}/${info.bufferName}"
     }
   }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigFragment.kt
similarity index 83%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatListFragment.kt
rename to app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigFragment.kt
index d128a9486337a97815466df9e729b5587d99f6a5..379f24890e6a7e3a687bea6a828135324a125b71 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatListFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigFragment.kt
@@ -10,8 +10,10 @@ import android.view.ViewGroup
 import android.widget.AdapterView
 import butterknife.BindView
 import butterknife.ButterKnife
+import de.kuschku.libquassel.protocol.NetworkId
 import de.kuschku.libquassel.quassel.syncables.BufferViewConfig
 import de.kuschku.libquassel.quassel.syncables.BufferViewManager
+import de.kuschku.libquassel.quassel.syncables.Network
 import de.kuschku.libquassel.session.Backend
 import de.kuschku.libquassel.session.ISession
 import de.kuschku.libquassel.session.SessionManager
@@ -19,10 +21,11 @@ import de.kuschku.quasseldroid_ng.R
 import de.kuschku.quasseldroid_ng.util.AndroidHandlerThread
 import de.kuschku.quasseldroid_ng.util.helper.map
 import de.kuschku.quasseldroid_ng.util.helper.or
+import de.kuschku.quasseldroid_ng.util.helper.switchMap
 import de.kuschku.quasseldroid_ng.util.helper.switchMapRx
 import de.kuschku.quasseldroid_ng.util.service.ServiceBoundFragment
 
-class ChatListFragment : ServiceBoundFragment() {
+class BufferViewConfigFragment : ServiceBoundFragment() {
   private val handlerThread = AndroidHandlerThread("ChatList")
 
   @BindView(R.id.chatListToolbar)
@@ -38,6 +41,8 @@ class ChatListFragment : ServiceBoundFragment() {
     = backend.map(Backend::sessionManager)
   private val bufferViewManager: LiveData<BufferViewManager?>
     = sessionManager.switchMapRx(SessionManager::session).map(ISession::bufferViewManager)
+  private val networks: LiveData<Map<NetworkId, Network>?>
+    = sessionManager.switchMapRx(SessionManager::session).map(ISession::networks)
   private val bufferViewConfigs = bufferViewManager.switchMapRx { manager ->
     manager.live_bufferViewConfigs.map { ids ->
       ids.mapNotNull { id ->
@@ -62,7 +67,15 @@ class ChatListFragment : ServiceBoundFragment() {
 
   private val adapter = BufferViewConfigAdapter(this, bufferViewConfigs)
 
-  private val bufferList = selectedBufferViewConfig.switchMapRx(BufferViewConfig::live_buffers)
+  private val bufferIdList = selectedBufferViewConfig.switchMapRx(BufferViewConfig::live_buffers)
+
+  private val bufferList = sessionManager.switchMap { manager ->
+    bufferIdList.map { ids ->
+      ids.mapNotNull {
+        manager.bufferSyncer?.bufferInfo(it)
+      }
+    }
+  }
 
   override fun onCreate(savedInstanceState: Bundle?) {
     handlerThread.onCreate()
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatDelegate.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatDelegate.kt
deleted file mode 100644
index 9bd77701a8d8e8703de860fd2bede8b2e3da2b52..0000000000000000000000000000000000000000
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/ChatDelegate.kt
+++ /dev/null
@@ -1,3 +0,0 @@
-package de.kuschku.quasseldroid_ng.ui.chat
-
-class ChatDelegate
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/accounts/AccountAdapter.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/accounts/AccountAdapter.kt
index 1d68c90a2b4e233318ee45eb64145bd84897b4d2..8e48236f1e79d00dec7bcc7790205bc4f85223bc 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/accounts/AccountAdapter.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/setup/accounts/AccountAdapter.kt
@@ -28,10 +28,6 @@ class AccountAdapter :
     }
   }
 
-  init {
-    setHasStableIds(true)
-  }
-
   private val actionListener = object : ItemListener {
     override fun onAction(id: Long, pos: Int) {
       for (actionListener in actionListeners) {
diff --git a/app/src/main/res/layout/activity_main.xml b/app/src/main/res/layout/activity_main.xml
index 0c505022b8b5aca928d6c2617ec12b1fac38a367..98d830b5d6c2f36d196f9b667617a022379a5441 100644
--- a/app/src/main/res/layout/activity_main.xml
+++ b/app/src/main/res/layout/activity_main.xml
@@ -100,7 +100,7 @@
 
     <fragment
       android:id="@+id/chatListFragment"
-      android:name="de.kuschku.quasseldroid_ng.ui.chat.ChatListFragment"
+      android:name="de.kuschku.quasseldroid_ng.ui.chat.BufferViewConfigFragment"
       android:layout_width="match_parent"
       android:layout_height="match_parent" />
   </de.kuschku.quasseldroid_ng.util.ui.NavigationDrawerLayout>
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt
index 83cca0a1a085cc7a5ffa6b8e029fa0e8d53a58a4..dea8e0f27094b10689f0a26e9517c90babe243bf 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt
@@ -2,6 +2,7 @@ package de.kuschku.libquassel.quassel.syncables
 
 import de.kuschku.libquassel.protocol.*
 import de.kuschku.libquassel.protocol.Type
+import de.kuschku.libquassel.quassel.BufferInfo
 import de.kuschku.libquassel.quassel.syncables.interfaces.IBufferSyncer
 import de.kuschku.libquassel.session.SignalProxy
 
@@ -75,6 +76,11 @@ class BufferSyncer constructor(
     }
   }
 
+  fun initSetBufferInfos(infos: QVariantList?) {
+    _bufferInfos.clear()
+    infos?.mapNotNull { it.value<BufferInfo>() }?.forEach { _bufferInfos[it.bufferId] = it }
+  }
+
   override fun mergeBuffersPermanently(buffer1: BufferId, buffer2: BufferId) {
     _lastSeenMsg.remove(buffer2)
     _markerLines.remove(buffer2)
@@ -85,11 +91,17 @@ class BufferSyncer constructor(
     _lastSeenMsg.remove(buffer)
     _markerLines.remove(buffer)
     _bufferActivities.remove(buffer)
+    _bufferInfos.remove(buffer)
   }
 
   override fun renameBuffer(buffer: BufferId, newName: String) {
   }
 
+  fun bufferInfo(bufferId: BufferId) = _bufferInfos[bufferId]
+  fun bufferInfoUpdated(info: BufferInfo) {
+    _bufferInfos[info.bufferId] = info
+  }
+
   override fun setLastSeenMsg(buffer: BufferId, msgId: MsgId) {
     if (msgId < 0)
       return
@@ -118,4 +130,5 @@ class BufferSyncer constructor(
   private val _lastSeenMsg: MutableMap<BufferId, MsgId> = mutableMapOf()
   private val _markerLines: MutableMap<BufferId, MsgId> = mutableMapOf()
   private val _bufferActivities: MutableMap<BufferId, Message_Types> = mutableMapOf()
+  private val _bufferInfos = mutableMapOf<BufferId, BufferInfo>()
 }
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/RpcHandler.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/RpcHandler.kt
index 7214a40ff6717f88c24cad9a5d65266b7b7e19b3..fa9001ca0411a4f132e2f25b535ea31dbccc14f1 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/RpcHandler.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/RpcHandler.kt
@@ -5,15 +5,17 @@ import de.kuschku.libquassel.protocol.primitive.serializer.StringSerializer
 import de.kuschku.libquassel.quassel.BufferInfo
 import de.kuschku.libquassel.quassel.syncables.interfaces.INetwork
 import de.kuschku.libquassel.quassel.syncables.interfaces.IRpcHandler
+import de.kuschku.libquassel.session.Session
 import de.kuschku.libquassel.session.SignalProxy
 import de.kuschku.libquassel.util.helpers.deserializeString
 import java.nio.ByteBuffer
 
-class RpcHandler(override val proxy: SignalProxy) : IRpcHandler {
+class RpcHandler(override val session: Session) : IRpcHandler {
   override fun displayStatusMsg(net: String, msg: String) {
   }
 
   override fun bufferInfoUpdated(bufferInfo: BufferInfo) {
+    session.bufferSyncer.bufferInfoUpdated(bufferInfo)
   }
 
   override fun identityCreated(identity: QVariantMap) {
@@ -23,6 +25,7 @@ class RpcHandler(override val proxy: SignalProxy) : IRpcHandler {
   }
 
   override fun networkCreated(networkId: NetworkId) {
+
   }
 
   override fun networkRemoved(networkId: NetworkId) {
@@ -35,7 +38,7 @@ class RpcHandler(override val proxy: SignalProxy) : IRpcHandler {
   }
 
   override fun objectRenamed(classname: ByteBuffer, newname: String, oldname: String) {
-    proxy.renameObject(classname.deserializeString(StringSerializer.UTF8) ?: "", newname, oldname)
+    session.renameObject(classname.deserializeString(StringSerializer.UTF8) ?: "", newname, oldname)
   }
 
   override fun displayMsg(message: Message) {
@@ -68,7 +71,7 @@ class RpcHandler(override val proxy: SignalProxy) : IRpcHandler {
 
   inline fun RPC(function: String, vararg arg: QVariant_) {
     // Don’t transmit calls back that we just got from the network
-    if (proxy.shouldRpc(function))
-      proxy.callRpc(function, arg.toList())
+    if (session.shouldRpc(function))
+      session.callRpc(function, arg.toList())
   }
 }
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IRpcHandler.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IRpcHandler.kt
index 7c9db97568090e7cd3b73bbc3efa4d77fb51bb30..59538665759585f4b4f482c950931223c53d9286 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IRpcHandler.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IRpcHandler.kt
@@ -7,12 +7,14 @@ import de.kuschku.libquassel.protocol.Message
 import de.kuschku.libquassel.protocol.NetworkId
 import de.kuschku.libquassel.protocol.QVariantMap
 import de.kuschku.libquassel.quassel.BufferInfo
+import de.kuschku.libquassel.session.ISession
+import de.kuschku.libquassel.session.Session
 import de.kuschku.libquassel.session.SignalProxy
 import java.nio.ByteBuffer
 
 @Syncable(name = "RpcHandler")
 interface IRpcHandler {
-  val proxy: SignalProxy
+  val session: Session
 
   @Slot("__objectRenamed__")
   fun objectRenamed(classname: ByteBuffer, newname: String, oldname: String)
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/ProtocolHandler.kt b/lib/src/main/java/de/kuschku/libquassel/session/ProtocolHandler.kt
index c3fe644c6061e749493072a6b7fa69ae4a51ff15..3edbb50b579f218a265068d6a6a4c2102ef53c98 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/ProtocolHandler.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/ProtocolHandler.kt
@@ -16,7 +16,8 @@ import java.io.Closeable
 @Suppress("LeakingThis")
 abstract class ProtocolHandler : SignalProxy, AuthHandler, Closeable {
   private val objectStorage: ObjectStorage = ObjectStorage(this)
-  private val rpcHandler: RpcHandler = RpcHandler(this)
+
+  protected open var rpcHandler: RpcHandler? = null
 
   private val toInit = mutableMapOf<ISyncableObject, MutableList<SignalProxyMessage.SyncMessage>>()
   private val syncQueue = mutableListOf<SignalProxyMessage.SyncMessage>()
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 158a82a439b4c9a29370adc308f020ff3d3e983a..3546516f75c12447e42b50082ba23871708b223e 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
@@ -5,6 +5,7 @@ import de.kuschku.libquassel.protocol.message.HandshakeMessage
 import de.kuschku.libquassel.protocol.message.SignalProxyMessage
 import de.kuschku.libquassel.quassel.QuasselFeature
 import de.kuschku.libquassel.quassel.syncables.*
+import de.kuschku.libquassel.quassel.syncables.interfaces.invokers.Invokers
 import de.kuschku.libquassel.util.compatibility.HandlerService
 import de.kuschku.libquassel.util.compatibility.LoggingHandler.LogLevel.DEBUG
 import de.kuschku.libquassel.util.compatibility.LoggingHandler.LogLevel.INFO
@@ -38,6 +39,8 @@ class Session(
   override val networks = mutableMapOf<NetworkId, Network>()
   override val networkConfig = NetworkConfig(this)
 
+  override var rpcHandler: RpcHandler? = RpcHandler(this)
+
   init {
     coreConnection.start()
   }
@@ -54,6 +57,8 @@ class Session(
   override fun handle(f: HandshakeMessage.SessionInit): Boolean {
     coreConnection.setState(ConnectionState.INIT)
 
+    bufferSyncer.initSetBufferInfos(f.bufferInfos)
+
     f.networkIds?.forEach {
       val network = Network(it.value(-1), this)
       networks.put(network.networkId(), network)
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt b/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt
index 5f56985d3e9f5f2c38e2ac17e34c21bf26a10306..0729334f297cfd496f4c310dd122f91fd2ada442 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt
@@ -8,6 +8,7 @@ import de.kuschku.libquassel.quassel.syncables.interfaces.invokers.Invokers
 import de.kuschku.libquassel.util.compatibility.HandlerService
 import de.kuschku.libquassel.util.compatibility.LoggingHandler
 import de.kuschku.libquassel.util.compatibility.log
+import de.kuschku.libquassel.util.helpers.or
 import io.reactivex.Observable
 import io.reactivex.subjects.BehaviorSubject
 import javax.net.ssl.X509TrustManager
@@ -81,6 +82,3 @@ class SessionManager(
       offlineSession
   }
 }
-
-fun <T> Observable<T>.or(default: T): T
-  = this.blockingLatest().firstOrNull() ?: default
diff --git a/lib/src/main/java/de/kuschku/libquassel/util/helpers/ObservableHelper.kt b/lib/src/main/java/de/kuschku/libquassel/util/helpers/ObservableHelper.kt
new file mode 100644
index 0000000000000000000000000000000000000000..6347af5301b44db4ab24690956194fea8c661edd
--- /dev/null
+++ b/lib/src/main/java/de/kuschku/libquassel/util/helpers/ObservableHelper.kt
@@ -0,0 +1,6 @@
+package de.kuschku.libquassel.util.helpers
+
+import io.reactivex.Observable
+
+fun <T> Observable<T>.or(default: T): T
+  = this.blockingLatest().firstOrNull() ?: default