diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigFragment.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigFragment.kt
index bd29ef6b7bff3b7e05b1d0f23bd18bbb4ca57eed..88942631b463280ec16b7c9559d8e0cb0a591787 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/BufferViewConfigFragment.kt
@@ -10,15 +10,13 @@ import android.view.ViewGroup
 import android.widget.AdapterView
 import butterknife.BindView
 import butterknife.ButterKnife
-import de.kuschku.libquassel.protocol.BufferId
-import de.kuschku.libquassel.protocol.Buffer_Activity
-import de.kuschku.libquassel.protocol.Message
-import de.kuschku.libquassel.protocol.NetworkId
+import de.kuschku.libquassel.protocol.*
 import de.kuschku.libquassel.quassel.BufferInfo
 import de.kuschku.libquassel.quassel.syncables.*
 import de.kuschku.libquassel.session.Backend
 import de.kuschku.libquassel.session.ISession
 import de.kuschku.libquassel.session.SessionManager
+import de.kuschku.libquassel.util.and
 import de.kuschku.libquassel.util.hasFlag
 import de.kuschku.quasseldroid_ng.R
 import de.kuschku.quasseldroid_ng.util.AndroidHandlerThread
@@ -28,6 +26,7 @@ import de.kuschku.quasseldroid_ng.util.helper.switchMap
 import de.kuschku.quasseldroid_ng.util.helper.switchMapRx
 import de.kuschku.quasseldroid_ng.util.service.ServiceBoundFragment
 import io.reactivex.Observable
+import java.util.concurrent.TimeUnit
 
 class BufferViewConfigFragment : ServiceBoundFragment() {
   private val handlerThread = AndroidHandlerThread("ChatList")
@@ -78,97 +77,115 @@ class BufferViewConfigFragment : ServiceBoundFragment() {
   private val bufferIdList = selectedBufferViewConfig.switchMapRx(BufferViewConfig::live_buffers)
 
   private val bufferList: LiveData<List<BufferListAdapter.BufferProps>?> = sessionManager.switchMap { manager ->
-    bufferIdList.switchMapRx { ids ->
-      val bufferSyncer = manager.bufferSyncer
-      if (bufferSyncer != null) {
-        bufferSyncer.live_bufferInfos.switchMap {
-          Observable.combineLatest(
-            ids.mapNotNull { id ->
-              bufferSyncer.bufferInfo(id)
-            }.mapNotNull {
-              val network = manager.networks[it.networkId]
-              if (network == null) {
-                null
-              } else {
-                it to network
-              }
-            }.map { (info, network) ->
-              bufferSyncer.liveActivity(info.bufferId).map { activity ->
-                when {
-                  activity.hasFlag(Message.MessageType.Plain) ||
-                  activity.hasFlag(Message.MessageType.Notice) ||
-                  activity.hasFlag(Message.MessageType.Action) -> Buffer_Activity.NewMessage
-                  activity.nonEmpty()                          -> Buffer_Activity.OtherActivity
-                  else                                         -> Buffer_Activity.NoActivity
-                }
-              }.switchMap { activity ->
-                when (info.type.toInt()) {
-                  BufferInfo.Type.QueryBuffer.toInt()   -> {
-                    network.liveIrcUser(info.bufferName).switchMap { user ->
-                      user.live_away.switchMap { away ->
-                        user.live_realName.map { realName ->
+    selectedBufferViewConfig.switchMapRx { config ->
+      config.live_config.debounce(16, TimeUnit.MILLISECONDS).switchMap { currentConfig ->
+        config.live_buffers.switchMap { ids ->
+          val bufferSyncer = manager.bufferSyncer
+          if (bufferSyncer != null) {
+            bufferSyncer.live_bufferInfos.switchMap {
+              Observable.combineLatest(
+                ids.mapNotNull { id ->
+                  bufferSyncer.bufferInfo(id)
+                }.filter {
+                  currentConfig.networkId() <= 0 || currentConfig.networkId() == it.networkId
+                }.filter {
+                  (currentConfig.allowedBufferTypes() and it.type).isNotEmpty() ||
+                  it.type.hasFlag(Buffer_Type.StatusBuffer)
+                }.mapNotNull {
+                  val network = manager.networks[it.networkId]
+                  if (network == null) {
+                    null
+                  } else {
+                    it to network
+                  }
+                }.map { (info, network) ->
+                  bufferSyncer.liveActivity(info.bufferId).map { activity ->
+                    when {
+                      activity.hasFlag(Message.MessageType.Plain) ||
+                      activity.hasFlag(Message.MessageType.Notice) ||
+                      activity.hasFlag(Message.MessageType.Action) -> Buffer_Activity.NewMessage
+                      activity.isNotEmpty()                        -> Buffer_Activity.OtherActivity
+                      else                                         -> Buffer_Activity.NoActivity
+                    }
+                  }.switchMap { activity ->
+                    when (info.type.toInt()) {
+                      BufferInfo.Type.QueryBuffer.toInt()   -> {
+                        network.liveIrcUser(info.bufferName).switchMap { user ->
+                          user.live_away.switchMap { away ->
+                            user.live_realName.map { realName ->
+                              BufferListAdapter.BufferProps(
+                                info = info,
+                                network = network.networkInfo(),
+                                bufferStatus = when {
+                                  user == IrcUser.NULL -> BufferListAdapter.BufferStatus.OFFLINE
+                                  away                 -> BufferListAdapter.BufferStatus.AWAY
+                                  else                 -> BufferListAdapter.BufferStatus.ONLINE
+                                },
+                                description = realName,
+                                activity = activity
+                              )
+                            }
+                          }
+                        }
+                      }
+                      BufferInfo.Type.ChannelBuffer.toInt() -> {
+                        network.liveIrcChannel(
+                          info.bufferName
+                        ).switchMap { channel ->
+                          channel.live_topic.map { topic ->
+                            BufferListAdapter.BufferProps(
+                              info = info,
+                              network = network.networkInfo(),
+                              bufferStatus = when (channel) {
+                                IrcChannel.NULL -> BufferListAdapter.BufferStatus.OFFLINE
+                                else            -> BufferListAdapter.BufferStatus.ONLINE
+                              },
+                              description = topic,
+                              activity = activity
+                            )
+                          }
+                        }
+                      }
+                      BufferInfo.Type.StatusBuffer.toInt()  -> {
+                        network.liveConnectionState.map {
                           BufferListAdapter.BufferProps(
                             info = info,
                             network = network.networkInfo(),
-                            bufferStatus = when {
-                              user == IrcUser.NULL -> BufferListAdapter.BufferStatus.OFFLINE
-                              away                 -> BufferListAdapter.BufferStatus.AWAY
-                              else                 -> BufferListAdapter.BufferStatus.ONLINE
-                            },
-                            description = realName,
+                            bufferStatus = BufferListAdapter.BufferStatus.OFFLINE,
+                            description = "",
                             activity = activity
                           )
                         }
                       }
-                    }
-                  }
-                  BufferInfo.Type.ChannelBuffer.toInt() -> {
-                    network.liveIrcChannel(
-                      info.bufferName
-                    ).switchMap { channel ->
-                      channel.live_topic.map { topic ->
+                      else                                  -> Observable.just(
                         BufferListAdapter.BufferProps(
                           info = info,
                           network = network.networkInfo(),
-                          bufferStatus = when (channel) {
-                            IrcChannel.NULL -> BufferListAdapter.BufferStatus.OFFLINE
-                            else            -> BufferListAdapter.BufferStatus.ONLINE
-                          },
-                          description = topic,
+                          bufferStatus = BufferListAdapter.BufferStatus.OFFLINE,
+                          description = "",
                           activity = activity
                         )
-                      }
-                    }
-                  }
-                  BufferInfo.Type.StatusBuffer.toInt()  -> {
-                    network.liveConnectionState.map {
-                      BufferListAdapter.BufferProps(
-                        info = info,
-                        network = network.networkInfo(),
-                        bufferStatus = BufferListAdapter.BufferStatus.OFFLINE,
-                        description = "",
-                        activity = activity
                       )
                     }
                   }
-                  else                                  -> Observable.just(
-                    BufferListAdapter.BufferProps(
-                      info = info,
-                      network = network.networkInfo(),
-                      bufferStatus = BufferListAdapter.BufferStatus.OFFLINE,
-                      description = "",
-                      activity = activity
-                    )
-                  )
+                }, { array: Array<Any> ->
+                  array.toList() as List<BufferListAdapter.BufferProps>
+                }
+              ).map { list ->
+                list.filter {
+                  config.minimumActivity().value <= it.activity.bit ||
+                  it.info.type.hasFlag(Buffer_Type.StatusBuffer)
+                }.filter {
+                  (!config.hideInactiveBuffers()) ||
+                  it.bufferStatus != BufferListAdapter.BufferStatus.OFFLINE ||
+                  it.info.type.hasFlag(Buffer_Type.StatusBuffer)
                 }
               }
-            }, { array: Array<Any> ->
-              array.toList() as List<BufferListAdapter.BufferProps>
             }
-          )
+          } else {
+            Observable.empty()
+          }
         }
-      } else {
-        Observable.empty()
       }
     }
   }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MessageListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MessageListFragment.kt
index 1e67bdae3bfd85a309b4cb9c2babfb64ea36cb56..1150ac143e2ce1bca2958b188c3fc3ac2e3574b2 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MessageListFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/chat/MessageListFragment.kt
@@ -76,7 +76,7 @@ class MessageListFragment : ServiceBoundFragment() {
     buffer.observe(
       this, Observer {
       handler.post {
-        // Try loading messages when switching to empty buffer
+        // Try loading messages when switching to isEmpty buffer
         if (it != null && database.message().bufferSize(it) == 0) {
           loadMore()
         }
diff --git a/build.gradle.kts b/build.gradle.kts
index b5ff130acd1899c464feb09dd105c80c449b321a..8b9c2758c291a8137b36ac6fb8bcab30c0364907 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -5,8 +5,8 @@ buildscript {
   }
   dependencies {
     classpath("com.android.tools.build:gradle:3.0.1")
-    classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.0")
-    classpath("org.jetbrains.kotlin:kotlin-android-extensions:1.2.0")
+    classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.2.21")
+    classpath("org.jetbrains.kotlin:kotlin-android-extensions:1.2.21")
   }
 }
 
diff --git a/invokergenerator/build.gradle.kts b/invokergenerator/build.gradle.kts
index fb83f9a7d5ea04d38ce94fe261879be8bc90c0bd..687da46b9cfd35235648ff5f808d1a3128f75371 100644
--- a/invokergenerator/build.gradle.kts
+++ b/invokergenerator/build.gradle.kts
@@ -8,6 +8,6 @@ plugins {
 
 dependencies {
   implementation(project(":invokerannotations"))
-  implementation("com.google.auto.service:auto-service:1.0-rc3")
-  implementation("com.squareup:javapoet:1.9.0")
+  implementation("com.google.auto.service:auto-service:1.0-rc4")
+  implementation("com.squareup:javapoet:1.10.0")
 }
diff --git a/lib/build.gradle.kts b/lib/build.gradle.kts
index 0161971e9748fe1809634f4e8fcea0e19b7466e4..1c33f64ccb3a7def9318b8d5cb77552e442fcbf1 100644
--- a/lib/build.gradle.kts
+++ b/lib/build.gradle.kts
@@ -9,13 +9,13 @@ plugins {
   kotlin("kapt")
 }
 
-val appCompatVersion = "26.1.0"
+val appCompatVersion = "27.0.2"
 dependencies {
-  implementation(kotlin("stdlib", "1.2.0"))
+  implementation(kotlin("stdlib", "1.2.21"))
 
   implementation(appCompat("support-annotations"))
   implementation("org.threeten", "threetenbp", "1.3.6")
-  implementation("io.reactivex.rxjava2:rxjava:2.1.3")
+  implementation("io.reactivex.rxjava2:rxjava:2.1.9")
 
   implementation(project(":invokerannotations"))
   kapt(project(":invokergenerator"))
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt
index 86a270e1cac506ff74f8d8ec80cb18a13c1acdf6..e0328ec12a6fe8ecc9fa4d032d1f9bb11785539c 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt
@@ -49,6 +49,7 @@ abstract class StringSerializer(
       val charBuffer = charBuffer(data.length)
       charBuffer.put(data)
       charBuffer.flip()
+      encoder.reset()
       val byteBuffer = encoder.encode(charBuffer)
       IntSerializer.serialize(buffer, byteBuffer.remaining() + trailingNullBytes, features)
       buffer.put(byteBuffer)
@@ -63,6 +64,7 @@ abstract class StringSerializer(
     val charBuffer = charBuffer(data.length)
     charBuffer.put(data)
     charBuffer.flip()
+    encoder.reset()
     encoder.encode(charBuffer)
   }
 
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 04d4f643702bb5bba6c166512c000869afcbde81..3b578132a11c940a697c0fb9ad709ea10c26dfb1 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
@@ -83,12 +83,14 @@ class BufferSyncer constructor(
   fun initSetBufferInfos(infos: QVariantList?) {
     _bufferInfos.clear()
     infos?.mapNotNull { it.value<BufferInfo>() }?.forEach { _bufferInfos[it.bufferId] = it }
+    live_bufferInfos.onNext(_bufferInfos)
   }
 
   override fun mergeBuffersPermanently(buffer1: BufferId, buffer2: BufferId) {
     _lastSeenMsg.remove(buffer2)
     _markerLines.remove(buffer2)
     _bufferActivities.remove(buffer2)
+    live_bufferInfos.onNext(_bufferInfos)
   }
 
   override fun removeBuffer(buffer: BufferId) {
@@ -96,14 +98,27 @@ class BufferSyncer constructor(
     _markerLines.remove(buffer)
     _bufferActivities.remove(buffer)
     _bufferInfos.remove(buffer)
+    live_bufferInfos.onNext(_bufferInfos)
   }
 
   override fun renameBuffer(buffer: BufferId, newName: String) {
+    val bufferInfo = _bufferInfos[buffer]
+    if (bufferInfo != null) {
+      _bufferInfos[buffer] = bufferInfo.copy(bufferName = newName)
+      live_bufferInfos.onNext(_bufferInfos)
+    }
   }
 
   fun bufferInfo(bufferId: BufferId) = _bufferInfos[bufferId]
+  fun liveBufferInfo(bufferId: BufferId) = live_bufferInfos.distinctUntilChanged().map {
+    bufferInfo(bufferId)
+  }
+
   fun bufferInfoUpdated(info: BufferInfo) {
-    _bufferInfos[info.bufferId] = info
+    if (info != _bufferInfos[info.bufferId]) {
+      _bufferInfos[info.bufferId] = info
+      live_bufferInfos.onNext(_bufferInfos)
+    }
   }
 
   override fun setLastSeenMsg(buffer: BufferId, msgId: MsgId) {
@@ -139,4 +154,5 @@ class BufferSyncer constructor(
     mutableMapOf<BufferId, Message_Types>()
   )
   private val _bufferInfos = mutableMapOf<BufferId, BufferInfo>()
+  val live_bufferInfos = BehaviorSubject.createDefault(mutableMapOf<BufferId, BufferInfo>())
 }
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 949af19cfdd2de4bf09ccca0e839195a09384f29..82abb56e1cb9d5a5e888439536e7c7bb106e12f6 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
@@ -167,51 +167,61 @@ class BufferViewConfig constructor(
   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
@@ -228,6 +238,7 @@ class BufferViewConfig constructor(
   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())
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Identity.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Identity.kt
index a45e245015312c50eef07ef30dd427d39cbee1bb..3f0152e6e161c2686a11f84ed83c0faf1f0f5db4 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Identity.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Identity.kt
@@ -180,7 +180,7 @@ class Identity constructor(
   }
 
   private var _identityId: IdentityId = -1
-  private var _identityName: String = "<empty>"
+  private var _identityName: String = "<isEmpty>"
   private var _realName: String = ""
   private var _nicks: MutableList<String> = mutableListOf("quassel")
   private var _awayNick: String = ""
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt
index 294ef1b7f5cfab6a1e5956881aa7c225475ad2ee..f08a638c7dd91cdb4b093a8337d99ef90c7f577d 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt
@@ -282,7 +282,7 @@ class Network constructor(
    * Gets the value of an available capability, e.g. for SASL, "EXTERNAL,PLAIN".
    *
    * @param capability Name of capability
-   * @return Value of capability if one was specified, otherwise empty string
+   * @return Value of capability if one was specified, otherwise isEmpty string
    */
   fun capValue(capability: String)
     = _caps.getOr(capability.toLowerCase(Locale.ENGLISH), "")
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 e7ad6859a9a73c30c801d1d4ab9102c17ba9b3d5..60ad4a78af1e419dec2e7f89b9fcd5efa200b384 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
@@ -45,6 +45,7 @@ class RpcHandler(
   }
 
   override fun displayMsg(message: Message) {
+    session.bufferSyncer.bufferInfoUpdated(message.bufferInfo)
     backlogStorage.storeMessages(message)
   }
 
diff --git a/lib/src/main/java/de/kuschku/libquassel/util/Flag.kt b/lib/src/main/java/de/kuschku/libquassel/util/Flag.kt
index 3cf89ad0ffb86b88bdeb72188670e908eb387d20..59e57ea45fff6d6646b1ec32e9dfbdde50a2c8ce 100644
--- a/lib/src/main/java/de/kuschku/libquassel/util/Flag.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/util/Flag.kt
@@ -36,8 +36,8 @@ data class Flags<E>(
 
   fun enabledValues() = values?.filter { hasFlag(it) }?.toSet() ?: emptySet()
 
-  fun empty() = value == 0
-  fun nonEmpty() = !empty()
+  fun isEmpty() = value == 0
+  fun isNotEmpty() = !isEmpty()
 
   override fun toString() = if (values != null) {
     enabledValues().joinToString("|", "[", "]")
@@ -71,6 +71,18 @@ infix fun <T> Flags<T>.or(other: Flag<T>): Flags<T> where T : kotlin.Enum<T>, T
   value or other.bit
 )
 
+infix fun <T> Flags<T>.or(other: Flags<T>): Flags<T> where T : kotlin.Enum<T>, T : Flag<T> = Flags(
+  value or other.value
+)
+
+infix fun <T> Flags<T>.and(other: Flag<T>): Flags<T> where T : kotlin.Enum<T>, T : Flag<T> = Flags(
+  value and other.bit
+)
+
+infix fun <T> Flags<T>.and(other: Flags<T>): Flags<T> where T : kotlin.Enum<T>, T : Flag<T> = Flags(
+  value and other.value
+)
+
 operator infix fun <T> Flags<T>.plus(
   other: Flags<T>): Flags<T>  where T : Enum<T>, T : Flag<T> = Flags(value or other.value)
 
diff --git a/lib/src/main/java/de/kuschku/libquassel/util/LongFlag.kt b/lib/src/main/java/de/kuschku/libquassel/util/LongFlag.kt
index 9dd681cb138615f27dd2d41477a15a374891e6bb..266f21eba26319a0e187c3c7534858c51a08c745 100644
--- a/lib/src/main/java/de/kuschku/libquassel/util/LongFlag.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/util/LongFlag.kt
@@ -36,6 +36,9 @@ data class LongFlags<E>(
 
   fun enabledValues() = values?.filter { hasFlag(it) }?.toSet() ?: emptySet()
 
+  fun isEmpty() = value == 0L
+  fun isNotEmpty() = !isEmpty()
+
   override fun toString() = if (values != null) {
     enabledValues().joinToString("|", "[", "]")
   } else {
@@ -69,6 +72,21 @@ infix fun <T> LongFlags<T>.or(
   value or other.bit
 )
 
+infix fun <T> LongFlags<T>.or(
+  other: LongFlags<T>): LongFlags<T> where T : kotlin.Enum<T>, T : LongFlag<T> = LongFlags(
+  value or other.value
+)
+
+infix fun <T> LongFlags<T>.and(
+  other: LongFlag<T>): LongFlags<T> where T : kotlin.Enum<T>, T : LongFlag<T> = LongFlags(
+  value and other.bit
+)
+
+infix fun <T> LongFlags<T>.and(
+  other: LongFlags<T>): LongFlags<T> where T : kotlin.Enum<T>, T : LongFlag<T> = LongFlags(
+  value and other.value
+)
+
 operator infix fun <T> LongFlags<T>.plus(
   other: LongFlags<T>): LongFlags<T>  where T : Enum<T>, T : LongFlag<T> = LongFlags(
   value or other.value
diff --git a/lib/src/main/java/de/kuschku/libquassel/util/ShortFlag.kt b/lib/src/main/java/de/kuschku/libquassel/util/ShortFlag.kt
index 25b668398934b59e5c4278eb8a291d011c432c4d..f5305d4759ba5a4dd423780c940b229fcc72fa2a 100644
--- a/lib/src/main/java/de/kuschku/libquassel/util/ShortFlag.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/util/ShortFlag.kt
@@ -40,6 +40,9 @@ data class ShortFlags<E>(
 
   fun enabledValues() = values?.filter { hasFlag(it) }?.toSet() ?: emptySet()
 
+  fun isEmpty() = value == 0.toShort()
+  fun isNotEmpty() = !isEmpty()
+
   override fun toString() = if (values != null) {
     enabledValues().joinToString("|", "[", "]")
   } else {
@@ -73,6 +76,21 @@ infix fun <T> ShortFlags<T>.or(
   value or other.bit
 )
 
+infix fun <T> ShortFlags<T>.or(
+  other: ShortFlags<T>): ShortFlags<T> where T : kotlin.Enum<T>, T : ShortFlag<T> = ShortFlags(
+  value or other.value
+)
+
+infix fun <T> ShortFlags<T>.and(
+  other: ShortFlag<T>): ShortFlags<T> where T : kotlin.Enum<T>, T : ShortFlag<T> = ShortFlags(
+  value and other.bit
+)
+
+infix fun <T> ShortFlags<T>.and(
+  other: ShortFlags<T>): ShortFlags<T> where T : kotlin.Enum<T>, T : ShortFlag<T> = ShortFlags(
+  value and other.value
+)
+
 operator infix fun <T> ShortFlags<T>.plus(
   other: ShortFlags<T>): ShortFlags<T>  where T : Enum<T>, T : ShortFlag<T> = ShortFlags(
   value or other.value
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
index 6347af5301b44db4ab24690956194fea8c661edd..edc47fcedb6323e9bad8a75fd4204eddbb6fb805 100644
--- a/lib/src/main/java/de/kuschku/libquassel/util/helpers/ObservableHelper.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/util/helpers/ObservableHelper.kt
@@ -2,5 +2,8 @@ package de.kuschku.libquassel.util.helpers
 
 import io.reactivex.Observable
 
-fun <T> Observable<T>.or(default: T): T
-  = this.blockingLatest().firstOrNull() ?: default
+fun <T> Observable<T>.or(default: T): T = try {
+  this.blockingLatest().firstOrNull() ?: default
+} catch (_: Throwable) {
+  default
+}
diff --git a/malheur/build.gradle.kts b/malheur/build.gradle.kts
index 95578183e06c7445e57ebdb4ff33c74103e1f3e7..66662a902f0cfe0378e5ed6f26facbfa70a5ffb2 100644
--- a/malheur/build.gradle.kts
+++ b/malheur/build.gradle.kts
@@ -17,7 +17,7 @@ android {
 }
 
 dependencies {
-  implementation(kotlin("stdlib", "1.2.0"))
+  implementation(kotlin("stdlib", "1.2.21"))
 
-  implementation("com.google.code.gson", "gson", "2.8.0")
+  implementation("com.google.code.gson", "gson", "2.8.2")
 }