diff --git a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt
index 9bb2a051ececdf804b0c55bac04e73f399d6f79a..dcb527b2f605bf8e4bb1185b036cd633e7505afa 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt
@@ -497,7 +497,7 @@ class QuasselService : DaggerLifecycleService(),
       session.bufferViewManager.requestCreateBufferView(
         Defaults.bufferViewConfigInitial(translatedLocale).apply {
           for (info in session.bufferSyncer.bufferInfos()) {
-            handleBuffer(info, session.bufferSyncer)
+            handleBuffer(info, session.bufferSyncer, session.networks)
           }
         }.toVariantMap()
       )
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/ui/presenter/BufferContextPresenter.kt b/app/src/main/java/de/kuschku/quasseldroid/util/ui/presenter/BufferContextPresenter.kt
index af99d3ab095c46f2945b463d1ae6e69e7ebc65da..577e70ae578cae42f5bf0aed0f9110eebe919710 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/util/ui/presenter/BufferContextPresenter.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/ui/presenter/BufferContextPresenter.kt
@@ -191,7 +191,7 @@ object BufferContextPresenter {
       true
     }
     R.id.action_unhide      -> {
-      bufferViewConfig?.insertBufferSorted(info, bufferSyncer)
+      bufferViewConfig?.insertBufferSorted(info, bufferSyncer, session.networks)
       actionMode.finish()
       true
     }
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 4d8303d2ceb649017973716fbc5796df5990a005..e06f6ad7460a30a5838fce64c3daae3f9820fe8b 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
@@ -245,7 +245,7 @@ class BufferSyncer constructor(
       live_bufferInfos.onNext(Unit)
 
       if (oldInfo == null) {
-        session.bufferViewManager.handleBuffer(info, this)
+        session.bufferViewManager.handleBuffer(info, this, session.networks)
       }
     }
   }
@@ -282,7 +282,7 @@ class BufferSyncer constructor(
         activity hasFlag Message_Type.Notice ||
         activity hasFlag Message_Type.Action) {
       bufferInfo(buffer)?.let {
-        session.bufferViewManager.handleBuffer(it, this, true)
+        session.bufferViewManager.handleBuffer(it, this, session.networks, true)
       }
     }
     _bufferActivities[buffer] = activity
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 d626de13fb962f361426ca313ebbcf36fa58e6cc..ef55b6465f27272984a090ff9439a079fffd2033 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
@@ -26,7 +26,6 @@ import de.kuschku.libquassel.quassel.syncables.interfaces.IBufferViewConfig
 import de.kuschku.libquassel.session.SignalProxy
 import de.kuschku.libquassel.util.flag.hasFlag
 import de.kuschku.libquassel.util.helper.clampOf
-import de.kuschku.libquassel.util.irc.IrcCaseMappers
 import io.reactivex.Observable
 import io.reactivex.subjects.BehaviorSubject
 
@@ -326,28 +325,33 @@ class BufferViewConfig constructor(
       (a?.bufferViewName() ?: "").compareTo((b?.bufferViewName() ?: ""), true)
   }
 
-  fun insertBufferSorted(info: BufferInfo, bufferSyncer: BufferSyncer) {
+  fun insertBufferSorted(info: BufferInfo, bufferSyncer: BufferSyncer,
+                         networks: Map<NetworkId, Network>) {
     if (!_buffers.contains(info.bufferId)) {
-      val element = IrcCaseMappers.unicode.toLowerCaseNullable(info.bufferName)
-      val position =
-        if (_sortAlphabetically) -_buffers.mapNotNull {
-          IrcCaseMappers.unicode.toLowerCaseNullable(bufferSyncer.bufferInfo(it)?.bufferName)
-        }.binarySearch(element) - 1
-        else _buffers.size
-      requestAddBuffer(info.bufferId, position)
+      requestAddBuffer(
+        info.bufferId,
+        sortBuffers(
+          _buffers.mapNotNull { bufferSyncer.bufferInfo(it) } + info,
+          sortAlphabetically(),
+          { it.bufferName ?: "" },
+          { networks[it.networkId]?.networkName() ?: "" },
+          { it.type }
+        ).indexOf(info)
+      )
     }
   }
 
-  fun handleBuffer(info: BufferInfo, bufferSyncer: BufferSyncer, unhide: Boolean = false) {
+  fun handleBuffer(info: BufferInfo, bufferSyncer: BufferSyncer, networks: Map<NetworkId, Network>,
+                   unhide: Boolean = false) {
     if (_addNewBuffersAutomatically &&
         !_buffers.contains(info.bufferId) &&
         !_temporarilyRemovedBuffers.contains(info.bufferId) &&
         !_removedBuffers.contains(info.bufferId) &&
         !info.type.hasFlag(Buffer_Type.StatusBuffer)) {
-      insertBufferSorted(info, bufferSyncer)
+      insertBufferSorted(info, bufferSyncer, networks)
     } else if (unhide && !_buffers.contains(info.bufferId) &&
                _temporarilyRemovedBuffers.contains(info.bufferId)) {
-      insertBufferSorted(info, bufferSyncer)
+      insertBufferSorted(info, bufferSyncer, networks)
     }
   }
 
@@ -365,4 +369,18 @@ class BufferViewConfig constructor(
   override fun toString(): String {
     return "BufferViewConfig(_bufferViewId=$_bufferViewId, _bufferViewName='$_bufferViewName', _networkId=$_networkId, _addNewBuffersAutomatically=$_addNewBuffersAutomatically, _sortAlphabetically=$_sortAlphabetically, _hideInactiveBuffers=$_hideInactiveBuffers, _hideInactiveNetworks=$_hideInactiveNetworks, _disableDecoration=$_disableDecoration, _allowedBufferTypes=$_allowedBufferTypes, _minimumActivity=$_minimumActivity, _showSearch=$_showSearch)"
   }
+
+  companion object {
+    inline fun <T> sortBuffers(list: List<T>, sortAlphabetically: Boolean,
+                               crossinline bufferName: (T) -> String,
+                               crossinline networkName: (T) -> String,
+                               crossinline type: (T) -> Buffer_Types) =
+      list.let {
+        if (sortAlphabetically) list.sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER,
+                                                          bufferName))
+        else list
+      }.sortedBy {
+        !type(it).hasFlag(Buffer_Type.StatusBuffer)
+      }.sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER, networkName))
+  }
 }
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 760252fbd1798a372a609c0122eee0e6a4793d03..e961bab8167ff63c23024635211708d70e42ba6b 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
@@ -90,12 +90,13 @@ class BufferViewManager constructor(
 
   private val _bufferViewConfigs: MutableMap<Int, BufferViewConfig> = mutableMapOf()
 
-  private val live_bufferViewConfigs: BehaviorSubject<Set<Int>> = BehaviorSubject.createDefault<Set<Int>>(
+  private val live_bufferViewConfigs: BehaviorSubject<Set<Int>> = BehaviorSubject.createDefault(
     emptySet())
 
-  fun handleBuffer(info: BufferInfo, bufferSyncer: BufferSyncer, unhide: Boolean = false) {
+  fun handleBuffer(info: BufferInfo, bufferSyncer: BufferSyncer, networks: Map<NetworkId, Network>,
+                   unhide: Boolean = false) {
     for (bufferViewConfig in bufferViewConfigs()) {
-      bufferViewConfig.handleBuffer(info, bufferSyncer, unhide)
+      bufferViewConfig.handleBuffer(info, bufferSyncer, networks, unhide)
     }
   }
 
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 007047f1d97b7564d3690e8168ec7a6f7e035439..d820d3c1760314d5a0ab1fe6102cd2fdabc90351 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
@@ -280,7 +280,7 @@ class Session(
     initCallback?.invoke(this)
     for (config in bufferViewManager.bufferViewConfigs()) {
       for (info in bufferSyncer.bufferInfos()) {
-        config.handleBuffer(info, bufferSyncer)
+        config.handleBuffer(info, bufferSyncer, networks)
       }
     }
     notificationManager?.init(this)
diff --git a/lib/src/test/java/de/kuschku/libquassel/integration/BufferViewConfigTest.kt b/lib/src/test/java/de/kuschku/libquassel/integration/BufferViewConfigTest.kt
index c79d32a43ce3b87f5a5fbed6df557364f56e63c0..5ae84b5dcc1f38de9ee0300c5e5e48c6aee2805f 100644
--- a/lib/src/test/java/de/kuschku/libquassel/integration/BufferViewConfigTest.kt
+++ b/lib/src/test/java/de/kuschku/libquassel/integration/BufferViewConfigTest.kt
@@ -43,7 +43,7 @@ class BufferViewConfigTest {
     val bufferViewConfig = bufferViewManager.bufferViewConfig(0)!!
 
     ensure {
-      bufferViewConfig.insertBufferSorted(bufferSyncer.bufferInfo(BufferId(4))!!, bufferSyncer)
+      bufferViewConfig.insertBufferSorted(bufferSyncer.bufferInfo(BufferId(4))!!, bufferSyncer, networks)
     }.does {
       callSync(bufferViewConfig, "requestAddBuffer", listOf(
         QVariant_.of(BufferId(4), QType.BufferId),
diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/helper/ArchiveViewModelHelper.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/helper/ArchiveViewModelHelper.kt
index 5db13db27b068c184d98e4f73ec7f414704a6cbd..e6d4b9b4455591f286a22a14e646545baea1d75d 100644
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/helper/ArchiveViewModelHelper.kt
+++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/helper/ArchiveViewModelHelper.kt
@@ -60,5 +60,5 @@ open class ArchiveViewModelHelper @Inject constructor(
     showHandle
   )
 
-  val selectedBuffer = processSelectedBuffer(archive.selectedBufferId)
+  val selectedBuffer = processSelectedBuffer(bufferViewConfig, archive.selectedBufferId)
 }
diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/helper/ChatViewModelHelper.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/helper/ChatViewModelHelper.kt
index 942d12ef5948a43715310d64411e37e92cb1adab..f00422cebdc20d81e37edfe82f91387a1dcda146 100644
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/helper/ChatViewModelHelper.kt
+++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/helper/ChatViewModelHelper.kt
@@ -170,7 +170,7 @@ open class ChatViewModelHelper @Inject constructor(
   val nickDataThrottled =
     nickData.distinctUntilChanged().throttleLast(100, TimeUnit.MILLISECONDS)
 
-  val selectedBuffer = processSelectedBuffer(chat.selectedBufferId)
+  val selectedBuffer = processSelectedBuffer(bufferViewConfig, chat.selectedBufferId)
 
   fun processChatBufferList(
     filtered: Observable<Pair<Map<BufferId, Int>, Int>>
diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/helper/QuasselViewModelHelper.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/helper/QuasselViewModelHelper.kt
index 24c5df3c763a9754733903d08ed4c72c44181c95..717f4dcfc41c3be4204e766a176e1264d1d20277 100644
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/helper/QuasselViewModelHelper.kt
+++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/helper/QuasselViewModelHelper.kt
@@ -456,50 +456,76 @@ open class QuasselViewModelHelper @Inject constructor(
     }
 
   fun processSelectedBuffer(
+    bufferViewConfigObservable: Observable<Optional<BufferViewConfig>>,
     selectedBufferId: Observable<BufferId>
-  ) = combineLatest(connectedSession, selectedBufferId)
-    .safeSwitchMap { (sessionOptional, buffer) ->
+  ) = combineLatest(connectedSession, selectedBufferId, bufferViewConfigObservable)
+    .safeSwitchMap { (sessionOptional, buffer, bufferViewConfigOptional) ->
       val session = sessionOptional.orNull()
+      val bufferViewConfig = bufferViewConfigOptional.orNull()
       val bufferSyncer = session?.bufferSyncer
-      if (bufferSyncer != null) {
-        session.liveNetworks().safeSwitchMap { networks ->
-          val info = if (!buffer.isValidId()) networks[NetworkId(-buffer.id)]?.let {
-            BufferInfo(
-              bufferId = buffer,
-              networkId = it.networkId(),
-              groupId = 0,
-              bufferName = it.networkName(),
-              type = Buffer_Type.of(Buffer_Type.StatusBuffer)
-            )
-          } else bufferSyncer.bufferInfo(buffer)
-          if (info != null) {
-            val network = networks[info.networkId]
-            when (info.type.enabledValues().firstOrNull()) {
-              Buffer_Type.StatusBuffer  -> {
-                network?.liveConnectionState()?.map {
-                  SelectedBufferItem(
+      if (bufferSyncer != null && bufferViewConfig != null) {
+        bufferHiddenState(bufferViewConfig, buffer).safeSwitchMap { bufferHiddenState ->
+          session.liveNetworks().safeSwitchMap { networks ->
+            val info = if (!buffer.isValidId()) networks[NetworkId(-buffer.id)]?.let {
+              BufferInfo(
+                bufferId = buffer,
+                networkId = it.networkId(),
+                groupId = 0,
+                bufferName = it.networkName(),
+                type = Buffer_Type.of(Buffer_Type.StatusBuffer)
+              )
+            } else bufferSyncer.bufferInfo(buffer)
+            if (info != null) {
+              val network = networks[info.networkId]
+              when (info.type.enabledValues().firstOrNull()) {
+                Buffer_Type.StatusBuffer  -> {
+                  network?.liveConnectionState()?.map {
+                    SelectedBufferItem(
+                      info,
+                      connectionState = it,
+                      hiddenState = bufferHiddenState
+                    )
+                  } ?: Observable.just(SelectedBufferItem(info))
+                }
+                Buffer_Type.ChannelBuffer -> {
+                  network?.liveIrcChannel(info.bufferName)?.mapNullable(IrcChannel.NULL) {
+                    SelectedBufferItem(
+                      info,
+                      joined = it != null,
+                      hiddenState = bufferHiddenState
+                    )
+                  } ?: Observable.just(SelectedBufferItem(
                     info,
-                    connectionState = it
-                  )
-                } ?: Observable.just(SelectedBufferItem(info))
-              }
-              Buffer_Type.ChannelBuffer -> {
-                network?.liveIrcChannel(info.bufferName)?.mapNullable(IrcChannel.NULL) {
-                  SelectedBufferItem(
+                    hiddenState = bufferHiddenState
+                  ))
+                }
+                else                      ->
+                  Observable.just(SelectedBufferItem(
                     info,
-                    joined = it != null
-                  )
-                } ?: Observable.just(SelectedBufferItem(info))
+                    hiddenState = bufferHiddenState
+                  ))
               }
-              else                      ->
-                Observable.just(SelectedBufferItem(info))
+            } else {
+              Observable.just(SelectedBufferItem())
             }
-          } else {
-            Observable.just(SelectedBufferItem())
           }
         }
       } else {
         Observable.just(SelectedBufferItem())
       }
     }
+
+  fun bufferHiddenState(bufferViewConfig: BufferViewConfig,
+                        bufferId: BufferId): Observable<BufferHiddenState> =
+    combineLatest(bufferViewConfig.liveBuffers(),
+                  bufferViewConfig.liveTemporarilyRemovedBuffers(),
+                  bufferViewConfig.liveRemovedBuffers())
+      .map { (visible, temp, perm) ->
+        when (bufferId) {
+          in visible -> BufferHiddenState.VISIBLE
+          in temp    -> BufferHiddenState.HIDDEN_TEMPORARY
+          in perm    -> BufferHiddenState.HIDDEN_PERMANENT
+          else       -> BufferHiddenState.HIDDEN_PERMANENT
+        }
+      }
 }