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 093e6fa0013879f5db891146d8fc1fc6425d5ee2..adb777f4f59100b8112df0a48b09c011e829d736 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
@@ -3,6 +3,8 @@ package de.kuschku.quasseldroid_ng.service
 import android.arch.lifecycle.LifecycleService
 import android.content.Intent
 import android.os.Binder
+import android.os.Handler
+import android.os.HandlerThread
 import de.kuschku.libquassel.protocol.*
 import de.kuschku.libquassel.session.Backend
 import de.kuschku.libquassel.session.Session
@@ -18,7 +20,7 @@ import javax.net.ssl.X509TrustManager
 class QuasselService : LifecycleService() {
   private lateinit var session: Session
 
-  private val backend = object : Backend {
+  private val backendImplementation = object : Backend {
     override fun session() = session
 
     override fun connect(address: SocketAddress, user: String, pass: String) {
@@ -33,6 +35,30 @@ class QuasselService : LifecycleService() {
     }
   }
 
+  private val asyncBackend = object : Backend {
+    private val thread = HandlerThread("BackendHandler")
+    private val handler: Handler
+
+    init {
+      thread.start()
+      handler = Handler(thread.looper)
+    }
+
+    override fun connect(address: SocketAddress, user: String, pass: String) {
+      handler.post {
+        backendImplementation.connect(address, user, pass)
+      }
+    }
+
+    override fun disconnect() {
+      handler.post {
+        backendImplementation.disconnect()
+      }
+    }
+
+    override fun session() = backendImplementation.session()
+  }
+
   private lateinit var database: QuasselDatabase
 
   override fun onCreate() {
@@ -63,7 +89,7 @@ class QuasselService : LifecycleService() {
 
   override fun onBind(intent: Intent?): QuasselBinder {
     super.onBind(intent)
-    return QuasselBinder(backend)
+    return QuasselBinder(asyncBackend)
   }
 
   class QuasselBinder(val backend: Backend) : Binder()
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 81f4b8e69c79dd7c23fd9b4d3493a33bdf81621f..af42d2d4c76a471b4d47937b1f60b12215343f9a 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt
@@ -112,17 +112,13 @@ class CoreConnection(
   }
 
   override fun close() {
-    interrupt()
-    handlerService.quit()
-    val thread = Thread {
-      try {
-        channel?.close()
-      } catch (e: Throwable) {
-        log(WARN, TAG, "Error encountered while closing connection", e)
-      }
+    try {
+      channel?.close()
+      interrupt()
+      handlerService.quit()
+    } catch (e: Throwable) {
+      log(WARN, TAG, "Error encountered while closing connection", e)
     }
-    thread.start()
-    thread.join()
   }
 
   override fun dispatch(message: HandshakeMessage) {
@@ -166,15 +162,17 @@ class CoreConnection(
         if (size > 64 * 1024 * 1024)
           throw SocketException("Too large frame received: $size")
         val dataBuffer = ByteBuffer.allocateDirect(size)
-        while (dataBuffer.position() < dataBuffer.limit() && channel?.read(dataBuffer) ?: -1 > 0) {
+        while (!isInterrupted && dataBuffer.position() < dataBuffer.limit() && channel?.read(
+          dataBuffer) ?: -1 > 0) {
         }
         dataBuffer.flip()
-        handlerService.parse {
-          when (internalState.value) {
-            ConnectionState.HANDSHAKE -> processHandshake(dataBuffer)
-            else                      -> processSigProxy(dataBuffer)
+        if (!isInterrupted)
+          handlerService.parse {
+            when (internalState.value) {
+              ConnectionState.HANDSHAKE -> processHandshake(dataBuffer)
+              else                      -> processSigProxy(dataBuffer)
+            }
           }
-        }
       }
     } catch (e: Throwable) {
       log(WARN, TAG, "Error encountered in connection", e)
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 389e90769a41a056f96f513c896873d775079366..56dc9efdd5cf5516ae95256b296bd08a8758f3c3 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
@@ -149,15 +149,16 @@ class Session(
     backlogManager = null
     bufferSyncer = null
     bufferViewManager = null
-    certManagers.clear()
     coreInfo = null
     dccConfig = null
-    identities.clear()
     ignoreListManager = null
     ircListHelper = null
-    networks.clear()
     networkConfig = null
 
+    certManagers.clear()
+    identities.clear()
+    networks.clear()
+
     super.cleanUp()
   }
 }
diff --git a/lib/src/main/java/de/kuschku/libquassel/util/nio/WrappedChannel.kt b/lib/src/main/java/de/kuschku/libquassel/util/nio/WrappedChannel.kt
index 4c98f3db2f5e4d3219b22f138fbb3e1291ce2163..1896f5f90da3dbe9657394e5dcd92155a8109376 100644
--- a/lib/src/main/java/de/kuschku/libquassel/util/nio/WrappedChannel.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/util/nio/WrappedChannel.kt
@@ -176,17 +176,3 @@ class WrappedChannel(
     flusher?.invoke()
   }
 }
-
-fun ByteArray.toHexDump(): String {
-  val buf = StringBuffer()
-  var i = 0
-  buf.append("HexDump ========================================================================\n")
-  while (i < this.size) {
-    buf.append(String.format("%02x ", this[i]))
-    if (i > 0 && (i + 1) % 32 == 0) {
-      buf.append("\n")
-    }
-    i++
-  }
-  return buf.toString()
-}