diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.kt
index 8df09d4aa82a428e0adc550419427a4c5f8f4611..54d2547b34e68ba8e833bdf4d9cdfe9fb14c60b3 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/service/QuasselService.kt
@@ -109,7 +109,7 @@ class QuasselService : LifecycleService() {
     clientData = ClientData(
       identifier = "${resources.getString(R.string.app_name)} ${BuildConfig.VERSION_NAME}",
       buildDate = Instant.ofEpochSecond(BuildConfig.GIT_COMMIT_DATE),
-      clientFeatures = Quassel_Features.of(*Quassel_Feature.values()),
+      clientFeatures = Quassel_Features.of(*Quassel_Feature.validValues),
       protocolFeatures = Protocol_Features.of(
         Protocol_Feature.Compression,
         Protocol_Feature.TLS
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt b/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt
index 2c17144a380622f2465b893ebcc9b185b0859607..ccc2c7432f7870c7465e2e28b6f44db48c3c04d6 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt
@@ -1,7 +1,5 @@
 package de.kuschku.libquassel.session
 
-import de.kuschku.libquassel.protocol.Quassel_Feature
-import de.kuschku.libquassel.protocol.Quassel_Features
 import de.kuschku.libquassel.protocol.message.HandshakeMessage
 import de.kuschku.libquassel.protocol.message.SignalProxyMessage
 import de.kuschku.libquassel.protocol.primitive.serializer.HandshakeVariantMapSerializer
@@ -70,12 +68,12 @@ class CoreConnection(
     IntSerializer.serialize(
       chainedBuffer,
       0x42b33f00 or session.clientData.protocolFeatures.toInt(),
-      session.coreFeatures
+      session.negotiatedFeatures
     )
     for (supportedProtocol in session.clientData.supportedProtocols) {
-      IntSerializer.serialize(chainedBuffer, supportedProtocol.toInt(), session.coreFeatures)
+      IntSerializer.serialize(chainedBuffer, supportedProtocol.toInt(), session.negotiatedFeatures)
     }
-    IntSerializer.serialize(chainedBuffer, 1 shl 31, session.coreFeatures)
+    IntSerializer.serialize(chainedBuffer, 1 shl 31, session.negotiatedFeatures)
     channel?.write(chainedBuffer)
     channel?.flush()
   }
@@ -84,7 +82,7 @@ class CoreConnection(
     sizeBuffer.clear()
     channel?.read(sizeBuffer)
     sizeBuffer.flip()
-    val protocol = ProtocolInfoSerializer.deserialize(sizeBuffer, session.coreFeatures)
+    val protocol = ProtocolInfoSerializer.deserialize(sizeBuffer, session.negotiatedFeatures)
 
     log(DEBUG, TAG, "Protocol negotiated $protocol")
 
@@ -107,7 +105,7 @@ class CoreConnection(
             clientVersion = session.clientData.identifier,
             buildDate = DateTimeFormatter.ofPattern("MMM dd yyyy HH:mm:ss")
               .format(session.clientData.buildDate.atOffset(ZoneOffset.UTC)),
-            clientFeatures = Quassel_Features.of(*Quassel_Feature.values())
+            clientFeatures = session.clientData.clientFeatures
           )
         )
       }
@@ -134,7 +132,7 @@ class CoreConnection(
         handlerService.write(
           MessageRunnable(
             data, HandshakeVariantMapSerializer, chainedBuffer, channel,
-            session.coreFeatures
+            session.negotiatedFeatures
           )
         )
       } catch (e: Throwable) {
@@ -148,7 +146,10 @@ class CoreConnection(
       try {
         val data = SignalProxyMessage.serialize(message)
         handlerService.write(
-          MessageRunnable(data, VariantListSerializer, chainedBuffer, channel, session.coreFeatures)
+          MessageRunnable(
+            data, VariantListSerializer, chainedBuffer, channel,
+            session.negotiatedFeatures
+          )
         )
       } catch (e: Throwable) {
         log(WARN, TAG, "Error encountered while serializing sigproxy message", e)
@@ -167,7 +168,7 @@ class CoreConnection(
           break
         sizeBuffer.flip()
 
-        val size = IntSerializer.deserialize(sizeBuffer, session.coreFeatures)
+        val size = IntSerializer.deserialize(sizeBuffer, session.negotiatedFeatures)
         if (size > 64 * 1024 * 1024)
           throw SocketException("Too large frame received: $size")
         val dataBuffer = ByteBuffer.allocateDirect(size)
@@ -190,7 +191,7 @@ class CoreConnection(
   private fun processSigProxy(dataBuffer: ByteBuffer) {
     try {
       val msg = SignalProxyMessage.deserialize(
-        VariantListSerializer.deserialize(dataBuffer, session.coreFeatures)
+        VariantListSerializer.deserialize(dataBuffer, session.negotiatedFeatures)
       )
       handlerService.handle {
         try {
@@ -209,7 +210,7 @@ class CoreConnection(
   private fun processHandshake(dataBuffer: ByteBuffer) {
     try {
       val msg = HandshakeMessage.deserialize(
-        HandshakeVariantMapSerializer.deserialize(dataBuffer, session.coreFeatures)
+        HandshakeVariantMapSerializer.deserialize(dataBuffer, session.negotiatedFeatures)
       )
       try {
         session.handle(msg)
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 89165784d64da725d5f018b2709e8889f2e3abd3..bf67186a9242d5b5ee6f7931125ab61e6e194a7d 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/ProtocolHandler.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/ProtocolHandler.kt
@@ -86,11 +86,12 @@ abstract class ProtocolHandler : SignalProxy, AuthHandler, Closeable {
   open fun onInitStatusChanged(progress: Int, total: Int) {}
 
   override fun handle(f: SignalProxyMessage.SyncMessage): Boolean {
+    log(DEBUG, "ProtocolHandler", "< $f")
+
     val obj = objectStorage.get(f.className, f.objectName) ?: if (isInitializing) {
       syncQueue.add(f)
       return true
     } else {
-      log(DEBUG, "ProtocolHandler", "< $f")
       throw ObjectNotFoundException(f.className, f.objectName)
     }
 
@@ -100,8 +101,6 @@ abstract class ProtocolHandler : SignalProxy, AuthHandler, Closeable {
       return true
     }
 
-    log(DEBUG, "ProtocolHandler", f.toString())
-
     val invoker = Invokers.get(f.className)
                   ?: throw IllegalArgumentException("Invalid classname: ${f.className}")
     currentCallClass = f.className
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 6039586c855ffbc0d1850057026d96b882ac4035..32604d18838fe75dfca7874e84cfb0ce8fb39015 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
@@ -5,6 +5,7 @@ import de.kuschku.libquassel.protocol.message.HandshakeMessage
 import de.kuschku.libquassel.protocol.message.SignalProxyMessage
 import de.kuschku.libquassel.quassel.QuasselFeature
 import de.kuschku.libquassel.quassel.syncables.*
+import de.kuschku.libquassel.util.and
 import de.kuschku.libquassel.util.compatibility.HandlerService
 import de.kuschku.libquassel.util.compatibility.LoggingHandler.LogLevel.DEBUG
 import de.kuschku.libquassel.util.compatibility.LoggingHandler.LogLevel.INFO
@@ -23,6 +24,8 @@ class Session(
   private val userData: Pair<String, String>
 ) : ProtocolHandler(), ISession {
   var coreFeatures: Quassel_Features = Quassel_Feature.NONE
+  val negotiatedFeatures
+    get() = coreFeatures and clientData.clientFeatures
 
   private val coreConnection = CoreConnection(this, address, handlerService)
   override val state = coreConnection.state
@@ -87,7 +90,7 @@ class Session(
     synchronize(bufferSyncer, true)
     synchronize(bufferViewManager, true)
     synchronize(coreInfo, true)
-    if (coreFeatures.hasFlag(QuasselFeature.DccFileTransfer))
+    if (negotiatedFeatures.hasFlag(QuasselFeature.DccFileTransfer))
       synchronize(dccConfig, true)
     synchronize(ignoreListManager, true)
     synchronize(ircListHelper, true)