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 1b63fd4250a3346e7b85a69e88ccfeb655202831..fbc7df8cb7c70efe560f465eeccd50475950b143 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
@@ -183,7 +183,7 @@ class BufferSyncer constructor(
     notificationManager?.clear(buffer)
   }
 
-  override fun renameBuffer(buffer: BufferId, newName: String) {
+  override fun renameBuffer(buffer: BufferId, newName: String?) {
     val bufferInfo = _bufferInfos[buffer]
     if (bufferInfo != null) {
       _bufferInfos[buffer] = bufferInfo.copy(bufferName = newName)
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 361b64b911fb259bbf9b6162b670e1b4ffd8bce7..59a3669d726829c5e42899e30e2cd7b9b54f0ab0 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
@@ -220,8 +220,8 @@ class BufferViewConfig constructor(
     super.setAllowedBufferTypes(bufferTypes)
   }
 
-  override fun setBufferViewName(bufferViewName: String) {
-    _bufferViewName = bufferViewName
+  override fun setBufferViewName(bufferViewName: String?) {
+    _bufferViewName = bufferViewName ?: ""
     super.setBufferViewName(bufferViewName)
   }
 
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/HighlightRuleManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/HighlightRuleManager.kt
index cd4b9121bc6acc743f24f4e27e05e561afc0f6bf..5015d0936e5e0fcb07dc5dbd116f5ae06c9c5d93 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/HighlightRuleManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/HighlightRuleManager.kt
@@ -117,13 +117,13 @@ class HighlightRuleManager(
     }
   }
 
-  override fun addHighlightRule(id: Int, name: String, isRegEx: Boolean, isCaseSensitive: Boolean,
-                                isEnabled: Boolean, isInverse: Boolean, sender: String,
-                                chanName: String) {
+  override fun addHighlightRule(id: Int, name: String?, isRegEx: Boolean, isCaseSensitive: Boolean,
+                                isEnabled: Boolean, isInverse: Boolean, sender: String?,
+                                chanName: String?) {
     if (contains(id)) return
 
     _highlightRuleList += HighlightRule(
-      id, name, isRegEx, isCaseSensitive, isEnabled, isInverse, sender, chanName
+      id, name ?: "", isRegEx, isCaseSensitive, isEnabled, isInverse, sender ?: "", chanName ?: ""
     )
   }
 
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IgnoreListManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IgnoreListManager.kt
index 132e6d9b3b5e15fe0d0ce9acc855f2c34ac1d446..66a4c5ec4f83329eca654aac53d738ffd42fae12 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IgnoreListManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IgnoreListManager.kt
@@ -98,23 +98,23 @@ class IgnoreListManager constructor(
     }
   }
 
-  override fun addIgnoreListItem(type: Int, ignoreRule: String, isRegEx: Boolean, strictness: Int,
-                                 scope: Int, scopeRule: String, isActive: Boolean) {
+  override fun addIgnoreListItem(type: Int, ignoreRule: String?, isRegEx: Boolean, strictness: Int,
+                                 scope: Int, scopeRule: String?, isActive: Boolean) {
     if (contains(ignoreRule)) return
 
     _ignoreList += IgnoreListItem(type, ignoreRule, isRegEx, strictness, scope, scopeRule, isActive)
   }
 
-  override fun removeIgnoreListItem(ignoreRule: String) = removeAt(indexOf(ignoreRule))
+  override fun removeIgnoreListItem(ignoreRule: String?) = removeAt(indexOf(ignoreRule))
 
-  override fun toggleIgnoreRule(ignoreRule: String) {
+  override fun toggleIgnoreRule(ignoreRule: String?) {
     _ignoreList = _ignoreList.map {
       if (it.ignoreRule == ignoreRule) it.copy(isActive = !it.isActive) else it
     }
   }
 
-  fun indexOf(ignore: String): Int = _ignoreList.indexOfFirst { it.ignoreRule == ignore }
-  fun contains(ignore: String) = _ignoreList.any { it.ignoreRule == ignore }
+  fun indexOf(ignore: String?): Int = _ignoreList.indexOfFirst { it.ignoreRule == ignore }
+  fun contains(ignore: String?) = _ignoreList.any { it.ignoreRule == ignore }
   fun isEmpty() = _ignoreList.isEmpty()
   fun count() = _ignoreList.count()
   fun removeAt(index: Int) {
@@ -177,23 +177,23 @@ class IgnoreListManager constructor(
     val regEx: ExpressionMatch,
     val scopeRegEx: ExpressionMatch
   ) : Serializable {
-    constructor(type: Int, ignoreRule: String, isRegEx: Boolean, strictness: Int, scope: Int,
-                scopeRule: String, isActive: Boolean) : this(
+    constructor(type: Int, ignoreRule: String?, isRegEx: Boolean, strictness: Int, scope: Int,
+                scopeRule: String?, isActive: Boolean) : this(
       IgnoreType.of(type), ignoreRule, isRegEx, StrictnessType.of(strictness), ScopeType.of(scope),
       scopeRule, isActive
     )
 
-    constructor(type: IgnoreType, ignoreRule: String, isRegEx: Boolean, strictness: StrictnessType,
-                scope: ScopeType, scopeRule: String, isActive: Boolean) : this(
-      type, ignoreRule, isRegEx, strictness, scope, scopeRule, isActive,
+    constructor(type: IgnoreType, ignoreRule: String?, isRegEx: Boolean, strictness: StrictnessType,
+                scope: ScopeType, scopeRule: String?, isActive: Boolean) : this(
+      type, ignoreRule ?: "", isRegEx, strictness, scope, scopeRule ?: "", isActive,
       ExpressionMatch(
-        ignoreRule,
+        ignoreRule ?: "",
         if (isRegEx) ExpressionMatch.MatchMode.MatchRegEx
         else ExpressionMatch.MatchMode.MatchWildcard,
         true
       ),
       ExpressionMatch(
-        scopeRule,
+        scopeRule ?: "",
         ExpressionMatch.MatchMode.MatchMultiWildcard,
         true
       )
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt
index be52ec64e1a2717407826f066bb9a00ef42e5fc6..b97056c4e9a804529c024e12915f907280d0769b 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt
@@ -221,16 +221,16 @@ class IrcChannel(
     _codecForDecoding = codec
   }
 
-  override fun setTopic(topic: String) {
-    if (_topic == topic)
+  override fun setTopic(topic: String?) {
+    if (_topic == topic ?: "")
       return
-    _topic = topic
+    _topic = topic ?: ""
   }
 
-  override fun setPassword(password: String) {
-    if (_password == password)
+  override fun setPassword(password: String?) {
+    if (_password == password ?: "")
       return
-    _password = password
+    _password = password ?: ""
   }
 
   override fun setEncrypted(encrypted: Boolean) {
@@ -285,7 +285,7 @@ class IrcChannel(
     updateUsers()
   }
 
-  override fun part(nick: String) {
+  override fun part(nick: String?) {
     part(network().ircUser(nick))
   }
 
@@ -296,8 +296,8 @@ class IrcChannel(
     updateUsers()
   }
 
-  override fun setUserModes(nick: String, modes: String) {
-    setUserModes(network().ircUser(nick), modes)
+  override fun setUserModes(nick: String?, modes: String?) {
+    setUserModes(network().ircUser(nick), modes ?: "")
   }
 
   fun addUserMode(ircuser: IrcUser, mode: Char) {
@@ -313,8 +313,8 @@ class IrcChannel(
     updateUsers()
   }
 
-  override fun addUserMode(nick: String, mode: String) {
-    addUserMode(network().ircUser(nick), mode)
+  override fun addUserMode(nick: String?, mode: String?) {
+    addUserMode(network().ircUser(nick), mode ?: "")
   }
 
   override fun removeUserMode(ircuser: IrcUser?, mode: String) {
@@ -327,8 +327,8 @@ class IrcChannel(
     updateUsers()
   }
 
-  override fun removeUserMode(nick: String, mode: String) {
-    removeUserMode(network().ircUser(nick), mode)
+  override fun removeUserMode(nick: String?, mode: String?) {
+    removeUserMode(network().ircUser(nick), mode ?: "")
   }
 
   override fun addChannelMode(mode: Char, value: String?) {
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcListHelper.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcListHelper.kt
index 62140abd19e114e18bf30b4d925257535d1615e5..f79e901e2f4546c3fb052a7a4938c4742857b6d3 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcListHelper.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcListHelper.kt
@@ -35,7 +35,7 @@ class IrcListHelper constructor(
 
     data class Finished(val netId: NetworkId) : Event()
 
-    data class Error(val error: String) : Event()
+    data class Error(val error: String?) : Event()
   }
 
   private val subject = ReusableUnicastSubject.create<Event>()
@@ -50,7 +50,7 @@ class IrcListHelper constructor(
     subject.onNext(Event.Finished(netId))
   }
 
-  override fun reportError(error: String) {
+  override fun reportError(error: String?) {
     subject.onNext(Event.Error(error))
   }
 }
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcUser.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcUser.kt
index c5329610206fa686f3e42d3160664248bb6e73aa..2ca56f3ac06e12474f929c84a725f938d0614a47 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcUser.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcUser.kt
@@ -125,43 +125,43 @@ class IrcUser(
   fun userModes() = _userModes
   fun channels() = _channels.map(IrcChannel::name)
 
-  override fun addUserModes(modes: String) {
-    (_userModes.toSet() + modes.toSet()).joinToString()
+  override fun addUserModes(modes: String?) {
+    (_userModes.toSet() + modes?.toSet().orEmpty()).joinToString()
   }
 
-  override fun removeUserModes(modes: String) {
-    (_userModes.toSet() - modes.toSet()).joinToString()
+  override fun removeUserModes(modes: String?) {
+    (_userModes.toSet() - modes?.toSet().orEmpty()).joinToString()
   }
 
-  override fun setUser(user: String) {
-    if (_user != user) {
-      _user = user
+  override fun setUser(user: String?) {
+    if (_user != user ?: "") {
+      _user = user ?: ""
     }
   }
 
-  override fun setHost(host: String) {
-    if (_host != host) {
-      _host = host
+  override fun setHost(host: String?) {
+    if (_host != host ?: "") {
+      _host = host ?: ""
     }
   }
 
-  override fun setNick(nick: String) {
-    if (nick.isNotEmpty() && _nick != nick) {
+  override fun setNick(nick: String?) {
+    if (!nick.isNullOrEmpty() && _nick != nick) {
       network().ircUserNickChanged(_nick, nick)
       _nick = nick
       updateObjectName()
     }
   }
 
-  override fun setRealName(realName: String) {
-    if (_realName != realName) {
-      _realName = realName
+  override fun setRealName(realName: String?) {
+    if (_realName != realName ?: "") {
+      _realName = realName ?: ""
     }
   }
 
-  override fun setAccount(account: String) {
-    if (_account != account) {
-      _account = account
+  override fun setAccount(account: String?) {
+    if (_account != account ?: "") {
+      _account = account ?: ""
     }
   }
 
@@ -171,9 +171,9 @@ class IrcUser(
     }
   }
 
-  override fun setAwayMessage(awayMessage: String) {
-    if (_awayMessage != awayMessage) {
-      _awayMessage = awayMessage
+  override fun setAwayMessage(awayMessage: String?) {
+    if (_awayMessage != awayMessage ?: "") {
+      _awayMessage = awayMessage ?: ""
     }
   }
 
@@ -190,9 +190,9 @@ class IrcUser(
     }
   }
 
-  override fun setIrcOperator(ircOperator: String) {
-    if (_ircOperator != ircOperator) {
-      _ircOperator = ircOperator
+  override fun setIrcOperator(ircOperator: String?) {
+    if (_ircOperator != ircOperator ?: "") {
+      _ircOperator = ircOperator ?: ""
     }
   }
 
@@ -207,15 +207,15 @@ class IrcUser(
     _lastAwayMessageTime = Instant.from(lastAwayMessageTime)
   }
 
-  override fun setWhoisServiceReply(whoisServiceReply: String) {
-    if (_whoisServiceReply != whoisServiceReply) {
-      _whoisServiceReply = whoisServiceReply
+  override fun setWhoisServiceReply(whoisServiceReply: String?) {
+    if (_whoisServiceReply != whoisServiceReply ?: "") {
+      _whoisServiceReply = whoisServiceReply ?: ""
     }
   }
 
-  override fun setSuserHost(suserHost: String) {
-    if (_suserHost != suserHost) {
-      _suserHost = suserHost
+  override fun setSuserHost(suserHost: String?) {
+    if (_suserHost != suserHost ?: "") {
+      _suserHost = suserHost ?: ""
     }
   }
 
@@ -225,23 +225,23 @@ class IrcUser(
     }
   }
 
-  override fun setServer(server: String) {
-    if (_server != server) {
-      _server = server
+  override fun setServer(server: String?) {
+    if (_server != server ?: "") {
+      _server = server ?: ""
     }
   }
 
-  override fun updateHostmask(mask: String) {
-    if (hostMask() != mask) {
-      val (user, host, _) = HostmaskHelper.split(mask)
+  override fun updateHostmask(mask: String?) {
+    if (hostMask() != mask ?: "") {
+      val (user, host, _) = HostmaskHelper.split(mask ?: "")
       setUser(user)
       setHost(host)
     }
   }
 
-  override fun setUserModes(modes: String) {
-    if (_userModes != modes) {
-      _userModes = modes
+  override fun setUserModes(modes: String?) {
+    if (_userModes != modes ?: "") {
+      _userModes = modes ?: ""
     }
   }
 
@@ -253,8 +253,8 @@ class IrcUser(
     }
   }
 
-  override fun joinChannel(channelname: String) {
-    joinChannel(network().newIrcChannel(channelname))
+  override fun joinChannel(channelname: String?) {
+    joinChannel(network().newIrcChannel(channelname ?: ""))
   }
 
   override fun partChannel(channel: IrcChannel) {
@@ -266,7 +266,7 @@ class IrcUser(
     }
   }
 
-  override fun partChannel(channelname: String) {
+  override fun partChannel(channelname: String?) {
     val channel = network().ircChannel(channelname) ?: throw IllegalArgumentException(
       "Received part for unknown channel : $channelname"
     )
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 18f46d1823e0674a76c2121e17d6284328e0ec32..d0ef1788109cf7b6a3254d8ad46132229b689c37 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
@@ -136,7 +136,9 @@ class Network constructor(
   fun nicks() = _ircUsers.values.map(IrcUser::nick)
   fun channels(): Set<String> = _ircChannels.keys
   fun caps(): Set<String> = _caps.keys
+  fun liveCaps() = live_caps.map { caps() }
   fun capsEnabled(): Set<String> = _capsEnabled
+  fun livecapsEnabled() = live_capsEnabled.map { capsEnabled() }
   fun serverList() = _serverList
   fun useRandomServer() = _useRandomServer
   fun perform() = _perform
@@ -186,7 +188,7 @@ class Network constructor(
 
   override fun setNetworkInfo(info: NetworkInfo) {
     // we don't set our ID!
-    if (!info.networkName.isEmpty() && info.networkName != networkName())
+    if (!info.networkName.isNullOrEmpty() && info.networkName != networkName())
       setNetworkName(info.networkName)
     if (info.identity > 0 && info.identity != identity())
       setIdentity(info.identity)
@@ -289,6 +291,7 @@ class Network constructor(
   fun channelModes(): Map<ChannelModeType, Set<Char>>? = _channelModes
 
   fun supports(): Map<String, String?> = _supports
+  fun liveSupports() = live_supports.map { supports() }
   fun supports(param: String) = _supports.contains(param.toUpperCase(Locale.US))
   fun support(param: String) = _supports.getOr(param, "")
   /**
@@ -422,16 +425,16 @@ class Network constructor(
     _autoAwayActive = active
   }
 
-  override fun setNetworkName(networkName: String) {
-    if (_networkName == networkName)
+  override fun setNetworkName(networkName: String?) {
+    if (_networkName == networkName ?: "")
       return
-    _networkName = networkName
+    _networkName = networkName ?: ""
   }
 
   override fun setCurrentServer(currentServer: String?) {
-    if (_currentServer == currentServer)
+    if (_currentServer == currentServer ?: "")
       return
-    _currentServer = currentServer
+    _currentServer = currentServer ?: ""
   }
 
   override fun setConnected(isConnected: Boolean) {
@@ -505,16 +508,16 @@ class Network constructor(
     _useAutoIdentify = autoIdentify
   }
 
-  override fun setAutoIdentifyService(service: String) {
-    if (_autoIdentifyService == service)
+  override fun setAutoIdentifyService(service: String?) {
+    if (_autoIdentifyService == service ?: "")
       return
-    _autoIdentifyService = service
+    _autoIdentifyService = service ?: ""
   }
 
-  override fun setAutoIdentifyPassword(password: String) {
-    if (_autoIdentifyPassword == password)
+  override fun setAutoIdentifyPassword(password: String?) {
+    if (_autoIdentifyPassword == password ?: "")
       return
-    _autoIdentifyPassword = password
+    _autoIdentifyPassword = password ?: ""
   }
 
   override fun setUseSasl(sasl: Boolean) {
@@ -524,15 +527,15 @@ class Network constructor(
   }
 
   override fun setSaslAccount(account: String?) {
-    if (_saslAccount == account)
+    if (_saslAccount == account ?: "")
       return
-    _saslAccount = account
+    _saslAccount = account ?: ""
   }
 
   override fun setSaslPassword(password: String?) {
-    if (_saslPassword == password)
+    if (_saslPassword == password ?: "")
       return
-    _saslPassword = password
+    _saslPassword = password ?: ""
   }
 
   override fun setUseAutoReconnect(autoReconnect: Boolean) {
@@ -615,33 +618,33 @@ class Network constructor(
       setCodecForServer(Charsets.ISO_8859_1.decode(codecName).toString())
   }
 
-  override fun addSupport(param: String, value: String?) {
-    _supports[param] = value
+  override fun addSupport(param: String?, value: String?) {
+    _supports[param ?: ""] = value
   }
 
-  override fun removeSupport(param: String) {
-    if (!_supports.contains(param))
+  override fun removeSupport(param: String?) {
+    if (!_supports.contains(param ?: ""))
       return
-    _supports.remove(param)
+    _supports.remove(param ?: "")
   }
 
   override fun addCap(capability: String, value: String?) {
     _caps[capability.toLowerCase(Locale.US)] = value
   }
 
-  override fun acknowledgeCap(capability: String) {
-    val lowerCase = capability.toLowerCase(Locale.US)
-    if (!_capsEnabled.contains(lowerCase))
+  override fun acknowledgeCap(capability: String?) {
+    val lowerCase = capability?.toLowerCase(Locale.US)
+    if (!_capsEnabled.contains(lowerCase ?: ""))
       return
-    _capsEnabled.add(lowerCase)
+    _capsEnabled.add(lowerCase ?: "")
   }
 
-  override fun removeCap(capability: String) {
-    val lowerCase = capability.toLowerCase(Locale.US)
-    if (!_caps.contains(lowerCase))
+  override fun removeCap(capability: String?) {
+    val lowerCase = capability?.toLowerCase(Locale.US)
+    if (!_caps.contains(lowerCase ?: ""))
       return
-    _caps.remove(lowerCase)
-    _capsEnabled.remove(lowerCase)
+    _caps.remove(lowerCase ?: "")
+    _capsEnabled.remove(lowerCase ?: "")
   }
 
   override fun clearCaps() {
@@ -651,12 +654,12 @@ class Network constructor(
     _capsEnabled.clear()
   }
 
-  override fun addIrcUser(hostmask: String) {
-    newIrcUser(hostmask)
+  override fun addIrcUser(hostmask: String?) {
+    newIrcUser(hostmask ?: "")
   }
 
-  override fun addIrcChannel(channel: String) {
-    newIrcChannel(channel)
+  override fun addIrcChannel(channel: String?) {
+    newIrcChannel(channel ?: "")
   }
 
   override fun initSupports(): QVariantMap = _supports.entries.map { (key, value) ->
@@ -817,14 +820,14 @@ class Network constructor(
     }
   }
 
-  override fun ircUserNickChanged(old: String, new: String) {
-    val value = _ircUsers.remove(caseMapper.toLowerCase(old))
+  override fun ircUserNickChanged(old: String?, new: String?) {
+    val value = _ircUsers.remove(caseMapper.toLowerCase(old ?: ""))
     if (value != null) {
-      _ircUsers[caseMapper.toLowerCase(new)] = value
+      _ircUsers[caseMapper.toLowerCase(new ?: "")] = value
     }
   }
 
-  override fun emitConnectionError(error: String) {
+  override fun emitConnectionError(error: String?) {
   }
 
   fun removeChansAndUsers() {
@@ -862,12 +865,22 @@ class Network constructor(
     }
   private var _myNick: String? = null
   private var _latency: Int = 0
+    set (value) {
+      field = value
+      live_latency.onNext(value)
+    }
+  private val live_latency = BehaviorSubject.createDefault(0)
   private var _networkName: String = "<not initialized>"
     set(value) {
       field = value
       live_networkInfo.onNext(Unit)
     }
-  private var _currentServer: String? = null
+  private var _currentServer: String = ""
+    set (value) {
+      field = value
+      live_currentServer.onNext(value)
+    }
+  private val live_currentServer = BehaviorSubject.createDefault("")
   private var _connected: Boolean = false
   private var _connectionState: ConnectionState = ConnectionState.Disconnected
   private val live_connectionState = BehaviorSubject.createDefault(ConnectionState.Disconnected)
@@ -882,6 +895,11 @@ class Network constructor(
   private val live_ircChannels = BehaviorSubject.createDefault(emptyMap<String, IrcChannel>())
   // stores results from RPL_ISUPPORT
   private var _supports: MutableMap<String, String?> = mutableMapOf()
+    set (value) {
+      field = value
+      live_caps.onNext(Unit)
+    }
+  private val live_supports = BehaviorSubject.createDefault(Unit)
   /**
    * Capabilities supported by the IRC server
    * By synchronizing the supported capabilities, the client could suggest certain behaviors, e.g.
@@ -889,11 +907,21 @@ class Network constructor(
    * SASL EXTERNAL isn't available.
    */
   private var _caps: MutableMap<String, String?> = mutableMapOf()
+    set (value) {
+      field = value
+      live_caps.onNext(Unit)
+    }
+  private val live_caps = BehaviorSubject.createDefault(Unit)
   /**
    * Enabled capabilities that received 'CAP ACK'
    * _capsEnabled uses the same values from the <name>=<value> pairs stored in _caps
    */
   private var _capsEnabled: MutableSet<String> = mutableSetOf()
+    set (value) {
+      field = value
+      live_capsEnabled.onNext(Unit)
+    }
+  private val live_capsEnabled = BehaviorSubject.createDefault(Unit)
   private var _serverList: List<Server> = listOf()
     set(value) {
       field = value
@@ -929,12 +957,12 @@ class Network constructor(
       field = value
       live_networkInfo.onNext(Unit)
     }
-  private var _saslAccount: String? = null
+  private var _saslAccount: String = ""
     set(value) {
       field = value
       live_networkInfo.onNext(Unit)
     }
-  private var _saslPassword: String? = null
+  private var _saslPassword: String = ""
     set(value) {
       field = value
       live_networkInfo.onNext(Unit)
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 45c49f882f8aa4fc15ce928aa536e2bc71feed2e..779d1f7eed906898a7fadb90f6a88915b339c6c2 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
@@ -36,7 +36,7 @@ class RpcHandler(
   private val backlogStorage: BacklogStorage? = null,
   private val notificationManager: NotificationManager? = null
 ) : IRpcHandler {
-  override fun displayStatusMsg(net: String, msg: String) {
+  override fun displayStatusMsg(net: String?, msg: String?) {
   }
 
   override fun bufferInfoUpdated(bufferInfo: BufferInfo) {
@@ -60,8 +60,10 @@ class RpcHandler(
     session.disconnectFromCore?.invoke()
   }
 
-  override fun objectRenamed(classname: ByteBuffer, newname: String, oldname: String) {
-    session.renameObject(classname.deserializeString(StringSerializer.UTF8) ?: "", newname, oldname)
+  override fun objectRenamed(classname: ByteBuffer, newname: String?, oldname: String?) {
+    session.renameObject(classname.deserializeString(StringSerializer.UTF8) ?: "",
+                         newname ?: "",
+                         oldname ?: "")
   }
 
   override fun displayMsg(message: Message) {
@@ -96,7 +98,7 @@ class RpcHandler(
       ARG(networkId, QType.NetworkId)
     )
 
-  override fun changePassword(peerPtr: Long, user: String, old: String, new: String) =
+  override fun changePassword(peerPtr: Long, user: String?, old: String?, new: String?) =
     RPC(
       "2changePassword(PeerPtr,QString,QString,QString)",
       ARG(peerPtr, QType.PeerPtr),
@@ -111,7 +113,7 @@ class RpcHandler(
       ARG(id, Type.Int)
     )
 
-  override fun sendInput(bufferInfo: BufferInfo, message: String) =
+  override fun sendInput(bufferInfo: BufferInfo, message: String?) =
     RPC(
       "2sendInput(BufferInfo,QString)",
       ARG(bufferInfo, QType.BufferInfo),
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBufferSyncer.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBufferSyncer.kt
index 919fb860f743fc7c87469608464b4086250fae10..c96be00ce116787ef3ca8fb66ee127008d1ea2ab 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBufferSyncer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBufferSyncer.kt
@@ -47,7 +47,7 @@ interface IBufferSyncer : ISyncableObject {
   fun removeBuffer(buffer: BufferId)
 
   @Slot
-  fun renameBuffer(buffer: BufferId, newName: String)
+  fun renameBuffer(buffer: BufferId, newName: String?)
 
   @Slot
   fun requestMarkBufferAsRead(buffer: BufferId) {
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBufferViewConfig.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBufferViewConfig.kt
index d779e9c5e0ae1889a01bc72e278a6fbdad485bee..58dcee6ac5c1a125e7f2e1340d77587050a799ee 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBufferViewConfig.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBufferViewConfig.kt
@@ -69,7 +69,7 @@ interface IBufferViewConfig : ISyncableObject {
   }
 
   @Slot
-  fun requestSetBufferViewName(bufferViewName: String) {
+  fun requestSetBufferViewName(bufferViewName: String?) {
     REQUEST("requestSetBufferViewName", ARG(bufferViewName, Type.QString))
   }
 
@@ -84,7 +84,7 @@ interface IBufferViewConfig : ISyncableObject {
   }
 
   @Slot
-  fun setBufferViewName(bufferViewName: String) {
+  fun setBufferViewName(bufferViewName: String?) {
     SYNC("setBufferViewName", ARG(bufferViewName, Type.QString))
   }
 
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IHighlightRuleManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IHighlightRuleManager.kt
index dc05691ee3dddbafcf172542fed13ad04dd3b262..af5c129224860d2fc35c0566381e82e66a80535d 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IHighlightRuleManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IHighlightRuleManager.kt
@@ -79,17 +79,17 @@ interface IHighlightRuleManager : ISyncableObject {
    * @param chanName The channel in which the rule should apply
    */
   @Slot
-  fun requestAddHighlightRule(id: Int, name: String, isRegEx: Boolean, isCaseSensitive: Boolean,
-                              isEnabled: Boolean, isInverse: Boolean, sender: String,
-                              chanName: String) {
+  fun requestAddHighlightRule(id: Int, name: String?, isRegEx: Boolean, isCaseSensitive: Boolean,
+                              isEnabled: Boolean, isInverse: Boolean, sender: String?,
+                              chanName: String?) {
     REQUEST("requestAddHighlightRule", ARG(id, Type.Int), ARG(name, Type.QString),
             ARG(isRegEx, Type.Bool), ARG(isCaseSensitive, Type.Bool), ARG(isEnabled, Type.Bool),
             ARG(isInverse, Type.Bool), ARG(sender, Type.QString), ARG(chanName, Type.QString))
   }
 
   @Slot
-  fun addHighlightRule(id: Int, name: String, isRegEx: Boolean, isCaseSensitive: Boolean,
-                       isEnabled: Boolean, isInverse: Boolean, sender: String, chanName: String)
+  fun addHighlightRule(id: Int, name: String?, isRegEx: Boolean, isCaseSensitive: Boolean,
+                       isEnabled: Boolean, isInverse: Boolean, sender: String?, chanName: String?)
 
   @Slot
   fun requestSetHighlightNick(highlightNick: Int) {
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIgnoreListManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIgnoreListManager.kt
index e829187dda4f2c040818454904848fc27d8255e9..64b44ee2d7116ec6dec63ee86027383550fd7e7e 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIgnoreListManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIgnoreListManager.kt
@@ -31,15 +31,15 @@ interface IIgnoreListManager : ISyncableObject {
   fun initSetIgnoreList(ignoreList: QVariantMap)
 
   @Slot
-  fun addIgnoreListItem(type: Int, ignoreRule: String, isRegEx: Boolean, strictness: Int,
-                        scope: Int, scopeRule: String, isActive: Boolean)
+  fun addIgnoreListItem(type: Int, ignoreRule: String?, isRegEx: Boolean, strictness: Int,
+                        scope: Int, scopeRule: String?, isActive: Boolean)
 
   @Slot
-  fun removeIgnoreListItem(ignoreRule: String)
+  fun removeIgnoreListItem(ignoreRule: String?)
 
   @Slot
-  fun requestAddIgnoreListItem(type: Int, ignoreRule: String, isRegEx: Boolean, strictness: Int,
-                               scope: Int, scopeRule: String, isActive: Boolean) {
+  fun requestAddIgnoreListItem(type: Int, ignoreRule: String?, isRegEx: Boolean, strictness: Int,
+                               scope: Int, scopeRule: String?, isActive: Boolean) {
     REQUEST(
       "requestAddIgnoreListItem", ARG(type, Type.Int), ARG(ignoreRule, Type.QString),
       ARG(isRegEx, Type.Bool),
@@ -49,17 +49,17 @@ interface IIgnoreListManager : ISyncableObject {
   }
 
   @Slot
-  fun requestRemoveIgnoreListItem(ignoreRule: String) {
+  fun requestRemoveIgnoreListItem(ignoreRule: String?) {
     REQUEST("requestRemoveIgnoreListItem", ARG(ignoreRule, Type.QString))
   }
 
   @Slot
-  fun requestToggleIgnoreRule(ignoreRule: String) {
+  fun requestToggleIgnoreRule(ignoreRule: String?) {
     REQUEST("requestToggleIgnoreRule", ARG(ignoreRule, Type.QString))
   }
 
   @Slot
-  fun toggleIgnoreRule(ignoreRule: String)
+  fun toggleIgnoreRule(ignoreRule: String?)
 
   @Slot
   override fun update(properties: QVariantMap) {
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcChannel.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcChannel.kt
index 8f1285cba8a2ef5d2a025625bee5196610c681f3..b2e7510e3c9b2e683b7187422a027a2aa5dce37d 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcChannel.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcChannel.kt
@@ -41,7 +41,7 @@ interface IIrcChannel : ISyncableObject {
   fun addUserMode(ircuser: IrcUser?, mode: String)
 
   @Slot
-  fun addUserMode(nick: String, mode: String)
+  fun addUserMode(nick: String?, mode: String?)
 
   @Slot
   fun joinIrcUser(ircuser: IrcUser)
@@ -52,7 +52,7 @@ interface IIrcChannel : ISyncableObject {
   fun part(ircuser: IrcUser?)
 
   @Slot
-  fun part(nick: String)
+  fun part(nick: String?)
 
   @Slot
   fun removeChannelMode(mode: Char, value: String?)
@@ -60,21 +60,21 @@ interface IIrcChannel : ISyncableObject {
   fun removeUserMode(ircuser: IrcUser?, mode: String)
 
   @Slot
-  fun removeUserMode(nick: String, mode: String)
+  fun removeUserMode(nick: String?, mode: String?)
 
   @Slot
   fun setEncrypted(encrypted: Boolean)
 
   @Slot
-  fun setPassword(password: String)
+  fun setPassword(password: String?)
 
   @Slot
-  fun setTopic(topic: String)
+  fun setTopic(topic: String?)
 
   fun setUserModes(ircuser: IrcUser?, modes: String)
 
   @Slot
-  fun setUserModes(nick: String, modes: String)
+  fun setUserModes(nick: String?, modes: String?)
 
   @Slot
   override fun update(properties: QVariantMap)
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcListHelper.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcListHelper.kt
index 78e407c7122fc14b71c3482b9c90df491973006c..1d4411b91150fa6a512b5abd6cb4d1e68f67064c 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcListHelper.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcListHelper.kt
@@ -39,7 +39,7 @@ interface IIrcListHelper : ISyncableObject {
   fun receiveChannelList(netId: NetworkId, channelFilters: QStringList, data: QVariantList)
 
   @Slot
-  fun reportError(error: String) {
+  fun reportError(error: String?) {
     SYNC("reportError", ARG(error, Type.QString))
   }
 
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcUser.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcUser.kt
index c6ff3143997e0bfd5c6c7f52b67fb3161b122ac2..84cbabf8282dbcd0f70199f92464ee747c1d48ec 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcUser.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcUser.kt
@@ -30,42 +30,42 @@ interface IIrcUser : ISyncableObject {
   fun initProperties(): QVariantMap
   fun initSetProperties(properties: QVariantMap, index: Int? = null)
   @Slot
-  fun addUserModes(modes: String)
+  fun addUserModes(modes: String?)
 
   fun joinChannel(channel: IrcChannel, skip_channel_join: Boolean = false)
   @Slot
-  fun joinChannel(channelname: String)
+  fun joinChannel(channelname: String?)
 
   fun partChannel(channel: IrcChannel)
   @Slot
-  fun partChannel(channelname: String)
+  fun partChannel(channelname: String?)
 
   @Slot
   fun quit()
 
   @Slot
-  fun removeUserModes(modes: String)
+  fun removeUserModes(modes: String?)
 
   @Slot
-  fun setAccount(account: String)
+  fun setAccount(account: String?)
 
   @Slot
   fun setAway(away: Boolean)
 
   @Slot
-  fun setAwayMessage(awayMessage: String)
+  fun setAwayMessage(awayMessage: String?)
 
   @Slot
   fun setEncrypted(encrypted: Boolean)
 
   @Slot
-  fun setHost(host: String)
+  fun setHost(host: String?)
 
   @Slot
   fun setIdleTime(idleTime: Temporal)
 
   @Slot
-  fun setIrcOperator(ircOperator: String)
+  fun setIrcOperator(ircOperator: String?)
 
   @Slot
   fun setLastAwayMessage(lastAwayMessage: Int)
@@ -77,28 +77,28 @@ interface IIrcUser : ISyncableObject {
   fun setLoginTime(loginTime: Temporal)
 
   @Slot
-  fun setNick(nick: String)
+  fun setNick(nick: String?)
 
   @Slot
-  fun setRealName(realName: String)
+  fun setRealName(realName: String?)
 
   @Slot
-  fun setServer(server: String)
+  fun setServer(server: String?)
 
   @Slot
-  fun setSuserHost(suserHost: String)
+  fun setSuserHost(suserHost: String?)
 
   @Slot
-  fun setUser(user: String)
+  fun setUser(user: String?)
 
   @Slot
-  fun setUserModes(modes: String)
+  fun setUserModes(modes: String?)
 
   @Slot
-  fun setWhoisServiceReply(whoisServiceReply: String)
+  fun setWhoisServiceReply(whoisServiceReply: String?)
 
   @Slot
-  fun updateHostmask(mask: String)
+  fun updateHostmask(mask: String?)
 
   @Slot
   override fun update(properties: QVariantMap) {
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/INetwork.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/INetwork.kt
index 59cb8f271b8f1585c6e11f1ef95d1ab1b9a20038..701989b6b36b06321aa15826411ba9e7e90da6e2 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/INetwork.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/INetwork.kt
@@ -46,34 +46,34 @@ interface INetwork : ISyncableObject {
   fun initSetProperties(properties: QVariantMap)
 
   @Slot
-  fun acknowledgeCap(capability: String)
+  fun acknowledgeCap(capability: String?)
 
   @Slot
   fun addCap(capability: String, value: String?)
 
   @Slot
-  fun addIrcChannel(channel: String)
+  fun addIrcChannel(channel: String?)
 
   @Slot
-  fun addIrcUser(hostmask: String)
+  fun addIrcUser(hostmask: String?)
 
   @Slot
-  fun addSupport(param: String, value: String? = null)
+  fun addSupport(param: String?, value: String? = null)
 
   @Slot
   fun clearCaps()
 
   @Slot
-  fun emitConnectionError(error: String)
+  fun emitConnectionError(error: String?)
 
   @Slot
-  fun ircUserNickChanged(old: String, new: String)
+  fun ircUserNickChanged(old: String?, new: String?)
 
   @Slot
-  fun removeCap(capability: String)
+  fun removeCap(capability: String?)
 
   @Slot
-  fun removeSupport(param: String)
+  fun removeSupport(param: String?)
 
   @Slot
   fun requestConnect() {
@@ -91,10 +91,10 @@ interface INetwork : ISyncableObject {
   }
 
   @Slot
-  fun setAutoIdentifyPassword(password: String)
+  fun setAutoIdentifyPassword(password: String?)
 
   @Slot
-  fun setAutoIdentifyService(service: String)
+  fun setAutoIdentifyService(service: String?)
 
   @Slot
   fun setAutoReconnectInterval(interval: UInt)
@@ -136,7 +136,7 @@ interface INetwork : ISyncableObject {
   fun setMyNick(mynick: String?)
 
   @Slot
-  fun setNetworkName(networkName: String)
+  fun setNetworkName(networkName: String?)
 
   @Slot
   fun setNetworkInfo(info: NetworkInfo)
@@ -234,18 +234,18 @@ interface INetwork : ISyncableObject {
   }
 
   data class Server(
-    val host: String = "",
+    val host: String? = "",
     val port: UInt = PortDefaults.PORT_PLAINTEXT.port,
-    val password: String = "",
+    val password: String? = "",
     val useSsl: Boolean = false,
     val sslVerify: Boolean = false,
     val sslVersion: Int = 0,
     val useProxy: Boolean = false,
     val proxyType: Int = ProxyType.Socks5Proxy.value,
-    val proxyHost: String = "localhost",
+    val proxyHost: String? = "localhost",
     val proxyPort: UInt = 8080u,
-    val proxyUser: String = "",
-    val proxyPass: String = ""
+    val proxyUser: String? = "",
+    val proxyPass: String? = ""
   ) : Serializable {
     fun toVariantMap(): QVariantMap = mapOf(
       "Host" to QVariant.of(host, Type.QString),
@@ -310,8 +310,8 @@ interface INetwork : ISyncableObject {
     var autoIdentifyService: String = "",
     var autoIdentifyPassword: String = "",
     var useSasl: Boolean = false,
-    var saslAccount: String? = null,
-    var saslPassword: String? = null,
+    var saslAccount: String = "",
+    var saslPassword: String = "",
     var useAutoReconnect: Boolean = true,
     var autoReconnectInterval: UInt = 0u,
     var autoReconnectRetries: UShort = 0u,
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 dd493d8f8b064a59236cfa2f782622d41ad9656b..7ae0ce7a403b24693ee15cd4cb37362c578b330d 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
@@ -35,13 +35,13 @@ interface IRpcHandler {
   val session: Session
 
   @Slot("__objectRenamed__")
-  fun objectRenamed(classname: ByteBuffer, newname: String, oldname: String)
+  fun objectRenamed(classname: ByteBuffer, newname: String?, oldname: String?)
 
   @Slot("2displayMsg(Message)")
   fun displayMsg(message: Message)
 
   @Slot("2displayStatusMsg(QString,QString)")
-  fun displayStatusMsg(net: String, msg: String)
+  fun displayStatusMsg(net: String?, msg: String?)
 
   @Slot("2bufferInfoUpdated(BufferInfo)")
   fun bufferInfoUpdated(bufferInfo: BufferInfo)
@@ -68,7 +68,7 @@ interface IRpcHandler {
   fun removeIdentity(identityId: IdentityId)
   fun createNetwork(networkInfo: INetwork.NetworkInfo, channels: List<String> = emptyList())
   fun removeNetwork(networkId: NetworkId)
-  fun changePassword(peerPtr: Long, user: String, old: String, new: String)
+  fun changePassword(peerPtr: Long, user: String?, old: String?, new: String?)
   fun requestKickClient(id: Int)
-  fun sendInput(bufferInfo: BufferInfo, message: String)
+  fun sendInput(bufferInfo: BufferInfo, message: String?)
 }
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/ITransfer.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/ITransfer.kt
index bf24b1bd84bb45f187f7d41af8fc6206bb5a0f69..a174093d7635f0db505e2e4948865b3efd1821b6 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/ITransfer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/ITransfer.kt
@@ -29,7 +29,7 @@ import java.nio.ByteBuffer
 @Syncable(name = "Transfer")
 interface ITransfer : ISyncableObject {
   @Slot
-  fun accept(savePath: String) {
+  fun accept(savePath: String?) {
     SYNC("accept", ARG(savePath, Type.QString))
   }
 
@@ -54,7 +54,7 @@ interface ITransfer : ISyncableObject {
   }
 
   @Slot
-  fun setError(errorString: String) {
+  fun setError(errorString: String?) {
     SYNC("setError", ARG(errorString, Type.QString))
   }