diff --git a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt
index 307d996fac052f373030473d7fbd205df14369f8..33a0e723efe24a5203a4c6ea2db9440a9eaff71d 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselService.kt
@@ -19,6 +19,7 @@ import de.kuschku.quasseldroid.util.QuasseldroidNotificationManager
 import de.kuschku.quasseldroid.util.backport.DaggerLifecycleService
 import de.kuschku.quasseldroid.util.compatibility.AndroidHandlerService
 import de.kuschku.quasseldroid.util.helper.editApply
+import de.kuschku.quasseldroid.util.helper.editCommit
 import de.kuschku.quasseldroid.util.helper.sharedPreferences
 import de.kuschku.quasseldroid.util.helper.toLiveData
 import io.reactivex.Observable
@@ -253,9 +254,21 @@ class QuasselService : DaggerLifecycleService(),
   }
   private val connectivity = BehaviorSubject.createDefault(Unit)
 
+  private fun disconnectFromCore() {
+    getSharedPreferences(Keys.Status.NAME, Context.MODE_PRIVATE).editCommit {
+      putBoolean(Keys.Status.reconnect, false)
+    }
+  }
+
   override fun onCreate() {
     super.onCreate()
-    sessionManager = SessionManager(ISession.NULL, QuasselBacklogStorage(database), handlerService)
+    sessionManager = SessionManager(
+      ISession.NULL,
+      QuasselBacklogStorage(database),
+      handlerService,
+      ::disconnectFromCore
+    )
+
     clientData = ClientData(
       identifier = "${resources.getString(R.string.app_name)} ${BuildConfig.VERSION_NAME}",
       buildDate = Instant.ofEpochSecond(BuildConfig.GIT_COMMIT_DATE),
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/QuasselFeature.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/QuasselFeature.kt
index b33835fb9a7ca702bb4d6342e38685e01c34c5f3..fdda7bf83c5cc8a62d19889f5c2dd7821782e301 100644
--- a/lib/src/main/java/de/kuschku/libquassel/quassel/QuasselFeature.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/QuasselFeature.kt
@@ -35,7 +35,9 @@ enum class QuasselFeature(override val bit: Int) : Flag<QuasselFeature> {
   /** Core-Side highlight configuration and matching */
   CoreSideHighlights(0x1000),
   /** Show prefixes for senders in backlog */
-  SenderPrefixes(0x2000);
+  SenderPrefixes(0x2000),
+  /** Supports RPC call disconnectFromCore to remotely disconnect a client */
+  RemoteDisconnect(0x4000);
 
   companion object : Flags.Factory<QuasselFeature> {
     override val NONE: Flags<QuasselFeature> = QuasselFeature.of()
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 60ad4a78af1e419dec2e7f89b9fcd5efa200b384..649dd2da950c376dd0208e1e06045f4efffccac7 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
@@ -37,8 +37,7 @@ class RpcHandler(
   override fun passwordChanged(ignored: Long, success: Boolean) {
   }
 
-  override fun disconnectFromCore() {
-  }
+  override fun disconnectFromCore() = session.disconnectFromCore()
 
   override fun objectRenamed(classname: ByteBuffer, newname: String, oldname: String) {
     session.renameObject(classname.deserializeString(StringSerializer.UTF8) ?: "", newname, oldname)
@@ -64,16 +63,12 @@ class RpcHandler(
   override fun requestPasswordChange(peerPtr: Long, user: String, old: String, new: String) {
   }
 
-  override fun requestKickClient(id: Int) {
-    RPC("2requestKickClient(Int)", ARG(id, Type.Int))
-  }
+  override fun requestKickClient(id: Int) = RPC("2requestKickClient(Int)", ARG(id, Type.Int))
 
-  override fun sendInput(bufferInfo: BufferInfo, message: String) {
-    RPC(
-      "2sendInput(BufferInfo,QString)", ARG(bufferInfo, QType.BufferInfo),
-      ARG(message, Type.QString)
-    )
-  }
+  override fun sendInput(bufferInfo: BufferInfo, message: String) = RPC(
+    "2sendInput(BufferInfo,QString)", ARG(bufferInfo, QType.BufferInfo),
+    ARG(message, Type.QString)
+  )
 
   inline fun RPC(function: String, vararg arg: QVariant_) {
     // Don’t transmit calls back that we just got from the network
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 42707bd164ff13611399e780c0f1613923422cfd..4c924616d18177f00fcc2b454cd554b860f46e36 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
@@ -20,7 +20,8 @@ class Session(
   address: SocketAddress,
   private val handlerService: HandlerService,
   backlogStorage: BacklogStorage,
-  private var userData: Pair<String, String>
+  private var userData: Pair<String, String>,
+  val disconnectFromCore: () -> Unit
 ) : ProtocolHandler(), ISession {
   override val features = Features(clientData.clientFeatures, Quassel_Features.of())
 
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt b/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt
index 48518bd1eacf3e2f306ef0ff8205f5be23ae66b7..b252dc121d5f1ac1fcaccef5dc11b00865f15c8a 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt
@@ -16,9 +16,12 @@ import io.reactivex.subjects.BehaviorSubject
 import javax.net.ssl.SSLSession
 import javax.net.ssl.X509TrustManager
 
-class SessionManager(offlineSession: ISession,
-                     val backlogStorage: BacklogStorage,
-                     val handlerService: HandlerService) : ISession {
+class SessionManager(
+  offlineSession: ISession,
+  val backlogStorage: BacklogStorage,
+  val handlerService: HandlerService,
+  private val disconnectFromCore: () -> Unit
+) : ISession {
   override val features: Features
     get() = session.or(lastSession).features
   override val sslSession: SSLSession?
@@ -121,7 +124,8 @@ class SessionManager(offlineSession: ISession,
         address,
         handlerService,
         backlogStorage,
-        userData
+        userData,
+        disconnectFromCore
       )
     )
   }
diff --git a/lib/src/test/java/de/kuschku/libquassel/ConnectionUnitTest.kt b/lib/src/test/java/de/kuschku/libquassel/ConnectionUnitTest.kt
index 1bdc88b9221e2feb614838bfcf4542076a05cd05..53cbe7359836fd8d1582ab1dae5ded8d770bfb21 100644
--- a/lib/src/test/java/de/kuschku/libquassel/ConnectionUnitTest.kt
+++ b/lib/src/test/java/de/kuschku/libquassel/ConnectionUnitTest.kt
@@ -36,8 +36,8 @@ class ConnectionUnitTest {
         buildDate = Instant.EPOCH,
         clientFeatures = Quassel_Feature.of(*QuasselFeature.validValues),
         protocolFeatures = Protocol_Feature.of(ProtocolFeature.TLS, ProtocolFeature.Compression),
-        supportedProtocols = listOf(Protocol.Datastream)
-      ), object : X509TrustManager {
+        supportedProtocols = listOf(Protocol.Datastream),
+        ), object : X509TrustManager {
       override fun checkClientTrusted(p0: Array<out X509Certificate>?, p1: String?) {
       }
 
@@ -51,8 +51,8 @@ class ConnectionUnitTest {
       override fun clearMessages(bufferId: BufferId, idRange: IntRange) = Unit
       override fun clearMessages(bufferId: BufferId) = Unit
       override fun clearMessages() = Unit
-    }, user to pass
-    )
+    }, user to pass,
+      ) {}
     session.join()
   }
 }