From 3271a3135fcc29a3d206a7c3e619e846bfdb1ef8 Mon Sep 17 00:00:00 2001
From: Janne Koschinski <janne@kuschku.de>
Date: Fri, 22 Sep 2017 01:06:07 +0200
Subject: [PATCH] Further performance improvements

---
 .../quassel/syncables/BufferViewConfig.kt     | 20 +++---
 .../libquassel/quassel/syncables/DccConfig.kt | 20 +++---
 .../libquassel/quassel/syncables/Identity.kt  | 34 +++++-----
 .../quassel/syncables/IrcChannel.kt           |  6 +-
 .../libquassel/quassel/syncables/IrcUser.kt   | 36 +++++-----
 .../libquassel/quassel/syncables/Network.kt   | 65 ++++++++++---------
 .../quassel/syncables/NetworkConfig.kt        | 18 ++---
 .../libquassel/session/ProtocolHandler.kt     | 13 ++--
 .../de/kuschku/libquassel/session/Session.kt  | 58 +++++++++++++----
 .../kuschku/libquassel/session/SignalProxy.kt |  6 +-
 10 files changed, 160 insertions(+), 116 deletions(-)

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 461dfd289..efd3ffea1 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
@@ -65,17 +65,17 @@ class BufferViewConfig constructor(
   }
 
   override fun initSetProperties(properties: QVariantMap) {
-    setBufferViewName(properties["bufferViewName"].value(bufferViewName()))
-    setNetworkId(properties["networkId"].value(networkId()))
+    setBufferViewName(properties["bufferViewName"].valueOr(this::bufferViewName))
+    setNetworkId(properties["networkId"].valueOr(this::networkId))
     setAddNewBuffersAutomatically(
-      properties["addNewBuffersAutomatically"].value(addNewBuffersAutomatically()))
-    setSortAlphabetically(properties["sortAlphabetically"].value(sortAlphabetically()))
-    setHideInactiveBuffers(properties["hideInactiveBuffers"].value(hideInactiveBuffers()))
-    setHideInactiveNetworks(properties["hideInactiveNetworks"].value(hideInactiveNetworks()))
-    setDisableDecoration(properties["disableDecoration"].value(disableDecoration()))
-    setAllowedBufferTypes(properties["allowedBufferTypes"].value(allowedBufferTypes().toInt()))
-    setMinimumActivity(properties["minimumActivity"].value(minimumActivity().toInt()))
-    setShowSearch(properties["showSearch"].value(showSearch()))
+      properties["addNewBuffersAutomatically"].valueOr(this::addNewBuffersAutomatically))
+    setSortAlphabetically(properties["sortAlphabetically"].valueOr(this::sortAlphabetically))
+    setHideInactiveBuffers(properties["hideInactiveBuffers"].valueOr(this::hideInactiveBuffers))
+    setHideInactiveNetworks(properties["hideInactiveNetworks"].valueOr(this::hideInactiveNetworks))
+    setDisableDecoration(properties["disableDecoration"].valueOr(this::disableDecoration))
+    setAllowedBufferTypes(properties["allowedBufferTypes"].valueOr { allowedBufferTypes().toInt() })
+    setMinimumActivity(properties["minimumActivity"].valueOr { minimumActivity().toInt() })
+    setShowSearch(properties["showSearch"].valueOr(this::showSearch))
   }
 
   override fun addBuffer(bufferId: BufferId, pos: Int) {
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/DccConfig.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/DccConfig.kt
index 369d0cc81..9663599c2 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/DccConfig.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/DccConfig.kt
@@ -44,25 +44,25 @@ class DccConfig constructor(
 
   override fun initSetProperties(properties: QVariantMap) {
     /// Whether DCC is enabled
-    setDccEnabled(properties["dccEnabled"].value(isDccEnabled()))
+    setDccEnabled(properties["dccEnabled"].valueOr(this::isDccEnabled))
     /// The IP to use for outgoing traffic
-    setOutgoingIp(properties["outgoingIp"].value(outgoingIp()))
+    setOutgoingIp(properties["outgoingIp"].valueOr(this::outgoingIp))
     /// The IP detection mode
-    setIpDetectionMode(properties["ipDetectionMode"].value(ipDetectionMode()))
+    setIpDetectionMode(properties["ipDetectionMode"].valueOr(this::ipDetectionMode))
     /// The port range selection mode
-    setPortSelectionMode(properties["portSelectionMode"].value(portSelectionMode()))
+    setPortSelectionMode(properties["portSelectionMode"].valueOr(this::portSelectionMode))
     /// Minimum port to use for incoming connections
-    setMinPort(properties["minPort"].value(minPort()))
+    setMinPort(properties["minPort"].valueOr(this::minPort))
     /// Maximum port to use for incoming connections
-    setMaxPort(properties["maxPort"].value(maxPort()))
+    setMaxPort(properties["maxPort"].valueOr(this::maxPort))
     /// The chunk size to be used
-    setChunkSize(properties["chunkSize"].value(chunkSize()))
+    setChunkSize(properties["chunkSize"].valueOr(this::chunkSize))
     /// The timeout for DCC transfers
-    setSendTimeout(properties["sendTimeout"].value(sendTimeout()))
+    setSendTimeout(properties["sendTimeout"].valueOr(this::sendTimeout))
     /// Whether passive (reverse) DCC should be used
-    setUsePassiveDcc(properties["usePassiveDcc"].value(usePassiveDcc()))
+    setUsePassiveDcc(properties["usePassiveDcc"].valueOr(this::usePassiveDcc))
     /// Whether fast sending should be used
-    setUseFastSend(properties["useFastSend"].value(useFastSend()))
+    setUseFastSend(properties["useFastSend"].valueOr(this::useFastSend))
   }
 
   override fun setDccEnabled(enabled: Boolean) {
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 fe0f08215..0275c6bb5 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
@@ -41,24 +41,24 @@ class Identity constructor(
   override fun initSetProperties(properties: QVariantMap) {
     setId(properties["identityId"].value(id()))
     setIdentityName(properties["identityName"].value(identityName()))
-    setRealName(properties["realName"].value(realName()))
-    setNicks(properties["nicks"].value(nicks()))
-    setAwayNick(properties["awayNick"].value(awayNick()))
-    setAwayNickEnabled(properties["awayNickEnabled"].value(awayNickEnabled()))
-    setAwayReason(properties["awayReason"].value(awayReason()))
-    setAwayReasonEnabled(properties["awayReasonEnabled"].value(awayReasonEnabled()))
-    setAutoAwayEnabled(properties["autoAwayEnabled"].value(autoAwayEnabled()))
-    setAutoAwayTime(properties["autoAwayTime"].value(autoAwayTime()))
-    setAutoAwayReason(properties["autoAwayReason"].value(autoAwayReason()))
-    setAutoAwayReasonEnabled(properties["autoAwayReasonEnabled"].value(autoAwayReasonEnabled()))
-    setDetachAwayEnabled(properties["detachAwayEnabled"].value(detachAwayEnabled()))
-    setDetachAwayReason(properties["detachAwayReason"].value(detachAwayReason()))
+    setRealName(properties["realName"].valueOr(this::realName))
+    setNicks(properties["nicks"].valueOr(this::nicks))
+    setAwayNick(properties["awayNick"].valueOr(this::awayNick))
+    setAwayNickEnabled(properties["awayNickEnabled"].valueOr(this::awayNickEnabled))
+    setAwayReason(properties["awayReason"].valueOr(this::awayReason))
+    setAwayReasonEnabled(properties["awayReasonEnabled"].valueOr(this::awayReasonEnabled))
+    setAutoAwayEnabled(properties["autoAwayEnabled"].valueOr(this::autoAwayEnabled))
+    setAutoAwayTime(properties["autoAwayTime"].valueOr(this::autoAwayTime))
+    setAutoAwayReason(properties["autoAwayReason"].valueOr(this::autoAwayReason))
+    setAutoAwayReasonEnabled(properties["autoAwayReasonEnabled"].valueOr(this::autoAwayReasonEnabled))
+    setDetachAwayEnabled(properties["detachAwayEnabled"].valueOr(this::detachAwayEnabled))
+    setDetachAwayReason(properties["detachAwayReason"].valueOr(this::detachAwayReason))
     setDetachAwayReasonEnabled(
-      properties["detachAwayReasonEnabled"].value(detachAwayReasonEnabled()))
-    setIdent(properties["ident"].value(ident()))
-    setKickReason(properties["kickReason"].value(kickReason()))
-    setPartReason(properties["partReason"].value(partReason()))
-    setQuitReason(properties["quitReason"].value(quitReason()))
+      properties["detachAwayReasonEnabled"].valueOr(this::detachAwayReasonEnabled))
+    setIdent(properties["ident"].valueOr(this::ident))
+    setKickReason(properties["kickReason"].valueOr(this::kickReason))
+    setPartReason(properties["partReason"].valueOr(this::partReason))
+    setQuitReason(properties["quitReason"].valueOr(this::quitReason))
   }
 
   fun id() = _identityId
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 9e714c7bf..6db909a98 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
@@ -73,9 +73,9 @@ class IrcChannel(
   }
 
   override fun initSetProperties(properties: QVariantMap) {
-    setTopic(properties["topic"].value(topic()))
-    setPassword(properties["password"].value(password()))
-    setEncrypted(properties["encrypted"].value(encrypted()))
+    setTopic(properties["topic"].valueOr(this::topic))
+    setPassword(properties["password"].valueOr(this::password))
+    setEncrypted(properties["encrypted"].valueOr(this::encrypted))
   }
 
   fun isKnownUser(ircUser: IrcUser): Boolean {
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 2362c0730..68b3fc139 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
@@ -43,23 +43,23 @@ class IrcUser(
   )
 
   override fun initSetProperties(properties: QVariantMap) {
-    setUser(properties["user"].value(user()))
-    setHost(properties["host"].value(host()))
-    setNick(properties["nick"].value(nick()))
-    setRealName(properties["realName"].value(realName()))
-    setAccount(properties["account"].value(account()))
-    setAway(properties["away"].value(isAway()))
-    setAwayMessage(properties["awayMessage"].value(awayMessage()))
-    setIdleTime(properties["idleTime"].value(idleTime()))
-    setLoginTime(properties["loginTime"].value(loginTime()))
-    setServer(properties["server"].value(server()))
-    setIrcOperator(properties["ircOperator"].value(ircOperator()))
-    setLastAwayMessage(properties["lastAwayMessage"].value(lastAwayMessage()))
-    setWhoisServiceReply(properties["whoisServiceReply"].value(whoisServiceReply()))
-    setSuserHost(properties["suserHost"].value(suserHost()))
-    setEncrypted(properties["encrypted"].value(encrypted()))
-
-    setUserModes(properties["userModes"].value(userModes()))
+    setUser(properties["user"].valueOr(this::user))
+    setHost(properties["host"].valueOr(this::host))
+    setNick(properties["nick"].valueOr(this::nick))
+    setRealName(properties["realName"].valueOr(this::realName))
+    setAccount(properties["account"].valueOr(this::account))
+    setAway(properties["away"].valueOr(this::isAway))
+    setAwayMessage(properties["awayMessage"].valueOr(this::awayMessage))
+    setIdleTime(properties["idleTime"].valueOr(this::idleTime))
+    setLoginTime(properties["loginTime"].valueOr(this::loginTime))
+    setServer(properties["server"].valueOr(this::server))
+    setIrcOperator(properties["ircOperator"].valueOr(this::ircOperator))
+    setLastAwayMessage(properties["lastAwayMessage"].valueOr(this::lastAwayMessage))
+    setWhoisServiceReply(properties["whoisServiceReply"].valueOr(this::whoisServiceReply))
+    setSuserHost(properties["suserHost"].valueOr(this::suserHost))
+    setEncrypted(properties["encrypted"].valueOr(this::encrypted))
+
+    setUserModes(properties["userModes"].valueOr(this::userModes))
   }
 
   fun user() = _user
@@ -113,7 +113,7 @@ class IrcUser(
   }
 
   override fun setNick(nick: String) {
-    if (nick.isNotBlank() && _nick != nick) {
+    if (nick.isNotEmpty() && _nick != nick) {
       _nick = nick
       updateObjectName()
       super.setNick(nick)
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 f428b5d46..c8c731fbf 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
@@ -688,9 +688,12 @@ class Network constructor(
     "currentServer" to QVariant_(currentServer(), Type.QString),
     "myNick" to QVariant_(myNick(), Type.QString),
     "latency" to QVariant_(latency(), Type.Int),
-    "codecForServer" to QVariant_(codecForServer().serializeString(StringSerializer.UTF8), Type.QByteArray),
-    "codecForEncoding" to QVariant_(codecForEncoding().serializeString(StringSerializer.UTF8), Type.QByteArray),
-    "codecForDecoding" to QVariant_(codecForDecoding().serializeString(StringSerializer.UTF8), Type.QByteArray),
+    "codecForServer" to QVariant_(codecForServer().serializeString(StringSerializer.UTF8),
+                                  Type.QByteArray),
+    "codecForEncoding" to QVariant_(codecForEncoding().serializeString(StringSerializer.UTF8),
+                                    Type.QByteArray),
+    "codecForDecoding" to QVariant_(codecForDecoding().serializeString(StringSerializer.UTF8),
+                                    Type.QByteArray),
     "identityId" to QVariant_(identity(), QType.IdentityId),
     "isConnected" to QVariant_(isConnected(), Type.Bool),
     "connectionState" to QVariant_(connectionState(), Type.Int),
@@ -759,34 +762,38 @@ class Network constructor(
   }
 
   override fun initSetProperties(properties: QVariantMap) {
-    setNetworkName(properties["networkName"].value(networkName()))
-    setCurrentServer(properties["currentServer"].value(currentServer()))
-    setMyNick(properties["myNick"].value(myNick()))
-    setLatency(properties["latency"].value(latency()))
-    setCodecForServer(properties["codecForServer"].value(codecForServer().serializeString(StringSerializer.UTF8)))
-    setCodecForEncoding(properties["codecForEncoding"].value(codecForEncoding().serializeString(StringSerializer.UTF8)))
-    setCodecForDecoding(properties["codecForDecoding"].value(codecForDecoding().serializeString(StringSerializer.UTF8)))
-    setIdentity(properties["identityId"].value(identity()))
-    setConnected(properties["isConnected"].value(isConnected()))
+    setNetworkName(properties["networkName"].valueOr(this::networkName))
+    setCurrentServer(properties["currentServer"].valueOr(this::currentServer))
+    setMyNick(properties["myNick"].valueOr(this::myNick))
+    setLatency(properties["latency"].valueOr(this::latency))
+    setCodecForServer(
+      properties["codecForServer"].value(codecForServer().serializeString(StringSerializer.UTF8)))
+    setCodecForEncoding(properties["codecForEncoding"].value(
+      codecForEncoding().serializeString(StringSerializer.UTF8)))
+    setCodecForDecoding(properties["codecForDecoding"].value(
+      codecForDecoding().serializeString(StringSerializer.UTF8)))
+    setIdentity(properties["identityId"].valueOr(this::identity))
+    setConnected(properties["isConnected"].valueOr(this::isConnected))
     setConnectionState(properties["connectionState"].value(connectionState().value))
-    setUseRandomServer(properties["useRandomServer"].value(useRandomServer()))
-    setPerform(properties["perform"].value(perform()))
-    setUseAutoIdentify(properties["useAutoIdentify"].value(useAutoIdentify()))
-    setAutoIdentifyService(properties["autoIdentifyService"].value(autoIdentifyService()))
-    setAutoIdentifyPassword(properties["autoIdentifyPassword"].value(autoIdentifyPassword()))
-    setUseSasl(properties["useSasl"].value(useSasl()))
-    setSaslAccount(properties["saslAccount"].value(saslAccount()))
-    setSaslPassword(properties["saslPassword"].value(saslPassword()))
-    setUseAutoReconnect(properties["useAutoReconnect"].value(useAutoReconnect()))
-    setAutoReconnectInterval(properties["autoReconnectInterval"].value(autoReconnectInterval()))
-    setAutoReconnectRetries(properties["autoReconnectRetries"].value(autoReconnectRetries()))
+    setUseRandomServer(properties["useRandomServer"].valueOr(this::useRandomServer))
+    setPerform(properties["perform"].valueOr(this::perform))
+    setUseAutoIdentify(properties["useAutoIdentify"].valueOr(this::useAutoIdentify))
+    setAutoIdentifyService(properties["autoIdentifyService"].valueOr(this::autoIdentifyService))
+    setAutoIdentifyPassword(properties["autoIdentifyPassword"].valueOr(this::autoIdentifyPassword))
+    setUseSasl(properties["useSasl"].valueOr(this::useSasl))
+    setSaslAccount(properties["saslAccount"].valueOr(this::saslAccount))
+    setSaslPassword(properties["saslPassword"].valueOr(this::saslPassword))
+    setUseAutoReconnect(properties["useAutoReconnect"].valueOr(this::useAutoReconnect))
+    setAutoReconnectInterval(
+      properties["autoReconnectInterval"].valueOr(this::autoReconnectInterval))
+    setAutoReconnectRetries(properties["autoReconnectRetries"].valueOr(this::autoReconnectRetries))
     setUnlimitedReconnectRetries(
-      properties["unlimitedReconnectRetries"].value(unlimitedReconnectRetries()))
-    setRejoinChannels(properties["rejoinChannels"].value(rejoinChannels()))
-    setUseCustomMessageRate(properties["useCustomMessageRate"].value(useCustomMessageRate()))
-    setMessageRateBurstSize(properties["msgRateBurstSize"].value(messageRateBurstSize()))
-    setMessageRateDelay(properties["msgRateMessageDelay"].value(messageRateDelay()))
-    setUnlimitedMessageRate(properties["unlimitedMessageRate"].value(unlimitedMessageRate()))
+      properties["unlimitedReconnectRetries"].valueOr(this::unlimitedReconnectRetries))
+    setRejoinChannels(properties["rejoinChannels"].valueOr(this::rejoinChannels))
+    setUseCustomMessageRate(properties["useCustomMessageRate"].valueOr(this::useCustomMessageRate))
+    setMessageRateBurstSize(properties["msgRateBurstSize"].valueOr(this::messageRateBurstSize))
+    setMessageRateDelay(properties["msgRateMessageDelay"].valueOr(this::messageRateDelay))
+    setUnlimitedMessageRate(properties["unlimitedMessageRate"].valueOr(this::unlimitedMessageRate))
   }
 
   fun updateNickFromMask(mask: String): IrcUser {
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/NetworkConfig.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/NetworkConfig.kt
index 3edb35b57..eda892ee5 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/NetworkConfig.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/NetworkConfig.kt
@@ -3,7 +3,7 @@ package de.kuschku.libquassel.quassel.syncables
 import de.kuschku.libquassel.protocol.QVariantMap
 import de.kuschku.libquassel.protocol.QVariant_
 import de.kuschku.libquassel.protocol.Type
-import de.kuschku.libquassel.protocol.value
+import de.kuschku.libquassel.protocol.valueOr
 import de.kuschku.libquassel.quassel.syncables.interfaces.INetworkConfig
 import de.kuschku.libquassel.session.SignalProxy
 
@@ -32,14 +32,14 @@ class NetworkConfig constructor(
   )
 
   override fun initSetProperties(properties: QVariantMap) {
-    setPingTimeoutEnabled(properties["pingTimeoutEnabled"].value(pingTimeoutEnabled()))
-    setPingInterval(properties["pingInterval"].value(pingInterval()))
-    setMaxPingCount(properties["maxPingCount"].value(maxPingCount()))
-    setAutoWhoEnabled(properties["autoWhoEnabled"].value(autoWhoEnabled()))
-    setAutoWhoInterval(properties["autoWhoInterval"].value(autoWhoInterval()))
-    setAutoWhoNickLimit(properties["autoWhoNickLimit"].value(autoWhoNickLimit()))
-    setAutoWhoDelay(properties["autoWhoDelay"].value(autoWhoDelay()))
-    setStandardCtcp(properties["standardCtcp"].value(standardCtcp()))
+    setPingTimeoutEnabled(properties["pingTimeoutEnabled"].valueOr(this::pingTimeoutEnabled))
+    setPingInterval(properties["pingInterval"].valueOr(this::pingInterval))
+    setMaxPingCount(properties["maxPingCount"].valueOr(this::maxPingCount))
+    setAutoWhoEnabled(properties["autoWhoEnabled"].valueOr(this::autoWhoEnabled))
+    setAutoWhoInterval(properties["autoWhoInterval"].valueOr(this::autoWhoInterval))
+    setAutoWhoNickLimit(properties["autoWhoNickLimit"].valueOr(this::autoWhoNickLimit))
+    setAutoWhoDelay(properties["autoWhoDelay"].valueOr(this::autoWhoDelay))
+    setStandardCtcp(properties["standardCtcp"].valueOr(this::standardCtcp))
   }
 
   fun pingTimeoutEnabled() = _pingTimeoutEnabled
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 0c331bf1e..e6badb492 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/ProtocolHandler.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/ProtocolHandler.kt
@@ -142,7 +142,10 @@ abstract class ProtocolHandler : SignalProxy, AuthHandler {
     objectStorage.rename(className, newName, oldName)
   }
 
-  override fun synchronize(syncableObject: ISyncableObject, baseInit: Boolean) {
+  override fun synchronize(syncableObject: ISyncableObject?, baseInit: Boolean) {
+    if (syncableObject == null)
+      return
+
     if (!syncableObject.initialized)
       syncableObject.init()
 
@@ -152,12 +155,14 @@ abstract class ProtocolHandler : SignalProxy, AuthHandler {
       if (baseInit) {
         toInit.put(syncableObject, mutableListOf())
       }
-      dispatch(
-        SignalProxyMessage.InitRequest(syncableObject.className, syncableObject.objectName))
+      dispatch(SignalProxyMessage.InitRequest(syncableObject.className, syncableObject.objectName))
     }
   }
 
-  override fun stopSynchronize(syncableObject: ISyncableObject) {
+  override fun stopSynchronize(syncableObject: ISyncableObject?) {
+    if (syncableObject == null)
+      return
+
     objectStorage.remove(syncableObject)
     toInit.remove(syncableObject)
   }
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 96822c05f..605430498 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
@@ -22,18 +22,18 @@ class Session(
 
   var userData: Pair<String, String>? = null
 
-  private val aliasManager = AliasManager(this)
-  private val backlogManager = BacklogManager(this)
-  private val bufferSyncer = BufferSyncer(this)
-  private val bufferViewManager = BufferViewManager(this)
-  private val certManagers = mutableMapOf<IdentityId, CertManager>()
-  private val coreInfo = CoreInfo(this)
-  private val dccConfig = DccConfig(this)
-  private val identities = mutableMapOf<IdentityId, Identity>()
-  private val ignoreListManager = IgnoreListManager(this)
-  private val ircListHelper = IrcListHelper(this)
-  private val networks = mutableMapOf<NetworkId, Network>()
-  private val networkConfig = NetworkConfig(this)
+  private var aliasManager: AliasManager? = null
+  private var backlogManager: BacklogManager? = null
+  private var bufferSyncer: BufferSyncer? = null
+  private var bufferViewManager: BufferViewManager? = null
+  private var certManagers = mutableMapOf<IdentityId, CertManager>()
+  private var coreInfo: CoreInfo? = null
+  private var dccConfig: DccConfig? = null
+  private var identities = mutableMapOf<IdentityId, Identity>()
+  private var ignoreListManager: IgnoreListManager? = null
+  private var ircListHelper: IrcListHelper? = null
+  private var networks = mutableMapOf<NetworkId, Network>()
+  private var networkConfig: NetworkConfig? = null
 
   val connection = BehaviorSubject.createDefault(ICoreConnection.NULL)
 
@@ -54,7 +54,7 @@ class Session(
   }
 
   override fun handle(f: HandshakeMessage.SessionInit): Boolean {
-    connection.value.state.onNext(ConnectionState.INIT)
+    connection.value.setState(ConnectionState.INIT)
 
     f.networkIds?.forEach {
       val network = Network(it.value(-1), this)
@@ -74,14 +74,32 @@ class Session(
     isInitializing = true
     networks.values.forEach { syncableObject -> this.synchronize(syncableObject, true) }
     certManagers.values.forEach { syncableObject -> this.synchronize(syncableObject, true) }
+
+    aliasManager = AliasManager(this)
     synchronize(aliasManager, true)
+
+    backlogManager = BacklogManager(this)
+
+    bufferSyncer = BufferSyncer(this)
     synchronize(bufferSyncer, true)
+
+    bufferViewManager = BufferViewManager(this)
     synchronize(bufferViewManager, true)
+
+    coreInfo = CoreInfo(this)
     synchronize(coreInfo, true)
+
+    dccConfig = DccConfig(this)
     if (coreFeatures.hasFlag(QuasselFeature.DccFileTransfer))
       synchronize(dccConfig, true)
+
+    ignoreListManager = IgnoreListManager(this)
     synchronize(ignoreListManager, true)
+
+    ircListHelper = IrcListHelper(this)
     synchronize(ircListHelper, true)
+
+    networkConfig = NetworkConfig(this)
     synchronize(networkConfig, true)
 
     return true
@@ -115,6 +133,20 @@ class Session(
   override fun cleanUp() {
     connection.value.close()
     connection.onNext(ICoreConnection.NULL)
+
+    aliasManager = null
+    backlogManager = null
+    bufferSyncer = null
+    bufferViewManager = null
+    certManagers.clear()
+    coreInfo = null
+    dccConfig = null
+    identities.clear()
+    ignoreListManager = null
+    ircListHelper = null
+    networks.clear()
+    networkConfig = null
+
     super.cleanUp()
   }
 }
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/SignalProxy.kt b/lib/src/main/java/de/kuschku/libquassel/session/SignalProxy.kt
index 47d44a496..de9118c29 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/SignalProxy.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/SignalProxy.kt
@@ -40,7 +40,7 @@ interface SignalProxy {
 
   fun renameObject(syncableObject: ISyncableObject, newName: String, oldName: String)
   fun renameObject(className: String, newName: String, oldName: String)
-  fun synchronize(syncableObject: ISyncableObject, baseInit: Boolean)
-  fun synchronize(syncableObject: ISyncableObject) = synchronize(syncableObject, false)
-  fun stopSynchronize(syncableObject: ISyncableObject)
+  fun synchronize(syncableObject: ISyncableObject?, baseInit: Boolean)
+  fun synchronize(syncableObject: ISyncableObject?) = synchronize(syncableObject, false)
+  fun stopSynchronize(syncableObject: ISyncableObject?)
 }
-- 
GitLab