diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index a7d493ae88abf6fafc9a2288e4699721435b43c2..6d7c43fb62fb5e8522769a706aa5e8cfa8c2497b 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -101,7 +101,7 @@ dependencies {
   kapt(appArch("persistence.room", "compiler"))
 
   implementation(appArch("paging", "runtime", version = "1.0.0-alpha1")) {
-    exclude(group = "junit", module = "junit")
+    exclude(group = "com.android.support", module = "support-media-compat")
   }
 
   implementation("org.threeten:threetenbp:1.3.6") {
@@ -117,28 +117,16 @@ dependencies {
     exclude(group = "com.android.support", module = "support-media-compat")
   }
 
+  implementation(project(":lib"))
+
   implementation(project(":invokerannotations"))
   kapt(project(":invokergenerator"))
 
-  testImplementation("android.arch.persistence.room:testing:1.0.0-alpha9") {
-    exclude(group = "com.android.support", module = "support-media-compat")
-  }
-  testImplementation("junit:junit:4.12") {
-    exclude(group = "com.android.support", module = "support-media-compat")
-  }
-
-  androidTestImplementation("com.android.support.test:runner:0.5") {
-    exclude(group = "com.android.support", module = "support-media-compat")
-  }
-  androidTestImplementation("com.android.support.test:rules:0.5") {
-    exclude(group = "com.android.support", module = "support-media-compat")
-  }
-}
+  testImplementation("android.arch.persistence.room:testing:1.0.0-alpha9")
+  testImplementation("junit:junit:4.12")
 
-kapt {
-  arguments(delegateClosureOf<KaptAnnotationProcessorOptions> {
-    arg("eventBusIndex", "de.kuschku.quasseldroid_ng.EventBusIndex")
-  })
+  androidTestImplementation("com.android.support.test:runner:0.5")
+  androidTestImplementation("com.android.support.test:rules:0.5")
 }
 
 fun cmd(vararg command: String) = try {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/Exceptions.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/Exceptions.kt
deleted file mode 100644
index 21ec532cc85eb399436b5b2f5f42a8c01d9b7812..0000000000000000000000000000000000000000
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/Exceptions.kt
+++ /dev/null
@@ -1,9 +0,0 @@
-package de.kuschku.quasseldroid_ng
-
-abstract class QuasselException : Exception()
-data class ObjectNotFoundException(val className: String, val objectName: String) :
-  QuasselException()
-
-data class WrongObjectTypeException(val obj: Any?, val type: String) : QuasselException()
-data class UnknownMethodException(val className: String, val methodName: String) :
-  QuasselException()
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/QuasseldroidNG.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/QuasseldroidNG.kt
index 6832c0ee1a7eec48421f99aea03a683be836b8a7..9ff456e538cabffe217696060b4d955557f6ac5c 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/QuasseldroidNG.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/QuasseldroidNG.kt
@@ -8,7 +8,9 @@ import android.content.pm.ShortcutManager
 import android.graphics.drawable.Icon
 import android.os.Build
 import de.kuschku.quasseldroid_ng.service.QuasselService
-import de.kuschku.quasseldroid_ng.util.helpers.systemService
+import de.kuschku.quasseldroid_ng.util.AndroidCompatibilityUtils
+import de.kuschku.quasseldroid_ng.util.AndroidLoggingHandler
+import de.kuschku.quasseldroid_ng.util.helper.systemService
 import org.acra.ACRA
 import org.acra.ReportingInteractionMode
 import org.acra.config.ConfigurationBuilder
@@ -30,6 +32,10 @@ class QuasseldroidNG : Application() {
     super.onCreate()
 
     if (!ACRA.isACRASenderServiceProcess()) {
+      // Init compatibility utils
+      AndroidCompatibilityUtils.init()
+      AndroidLoggingHandler.init()
+
       startService(Intent(this, QuasselService::class.java))
       if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
         systemService<ShortcutManager>().dynamicShortcuts = listOf(
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/QuasselDatabase.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/QuasselDatabase.kt
index 7affde4d4b71bbef86e214e2c8622b42aa9b6c1e..dc1da0ae0121a0d598b4e390d23f3db3740ddf98 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/QuasselDatabase.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/persistence/QuasselDatabase.kt
@@ -3,19 +3,14 @@ package de.kuschku.quasseldroid_ng.persistence
 import android.arch.persistence.room.*
 import android.content.Context
 import android.support.annotation.IntRange
-import de.kuschku.quasseldroid_ng.protocol.Message_Flag
-import de.kuschku.quasseldroid_ng.protocol.Message_Flags
-import de.kuschku.quasseldroid_ng.protocol.Message_Type
-import de.kuschku.quasseldroid_ng.protocol.Message_Types
-import de.kuschku.quasseldroid_ng.quassel.BufferInfo
-import de.kuschku.quasseldroid_ng.util.Flag
-import de.kuschku.quasseldroid_ng.util.Flags
+import de.kuschku.libquassel.protocol.Message_Flag
+import de.kuschku.libquassel.protocol.Message_Type
 import org.threeten.bp.Instant
 
 @Database(entities = arrayOf(QuasselDatabase.Buffer::class, QuasselDatabase.Network::class,
-                             QuasselDatabase.Message::class),
+                             QuasselDatabase.DatabaseMessage::class),
           version = 2)
-@TypeConverters(QuasselDatabase.Message.MessageTypeConverters::class)
+@TypeConverters(QuasselDatabase.DatabaseMessage.MessageTypeConverters::class)
 abstract class QuasselDatabase : RoomDatabase() {
   abstract fun networks(): NetworkDao
   abstract fun buffers(): BufferDao
@@ -30,20 +25,8 @@ abstract class QuasselDatabase : RoomDatabase() {
     var bufferName: String
   )
 
-  class RawMessage(
-    messageId: Int,
-    time: Instant,
-    type: Message_Types,
-    flag: Message_Flags,
-    var bufferInfo: BufferInfo,
-    sender: String,
-    senderPrefixes: String,
-    content: String
-  ) : Message(messageId, time, type.toInt(), flag.toInt(), bufferInfo.bufferId, sender,
-              senderPrefixes, content)
-
-  @Entity
-  open class Message(
+  @Entity(tableName = "message")
+  open class DatabaseMessage(
     @PrimaryKey var messageId: Int,
     var time: Instant,
     var type: Int,
@@ -53,48 +36,6 @@ abstract class QuasselDatabase : RoomDatabase() {
     var senderPrefixes: String,
     var content: String
   ) {
-    enum class MessageType(override val bit: Int) : Flag<MessageType> {
-      Plain(0x00001),
-      Notice(0x00002),
-      Action(0x00004),
-      Nick(0x00008),
-      Mode(0x00010),
-      Join(0x00020),
-      Part(0x00040),
-      Quit(0x00080),
-      Kick(0x00100),
-      Kill(0x00200),
-      Server(0x00400),
-      Info(0x00800),
-      Error(0x01000),
-      DayChange(0x02000),
-      Topic(0x04000),
-      NetsplitJoin(0x08000),
-      NetsplitQuit(0x10000),
-      Invite(0x20000),
-      Markerline(0x40000);
-
-      companion object : Flags.Factory<MessageType> {
-        override val NONE = MessageType.of()
-        override fun of(bit: Int) = Flags.of<MessageType>(bit)
-        override fun of(vararg flags: MessageType) = Flags.of(*flags)
-      }
-    }
-
-    enum class MessageFlag(override val bit: Int) : Flag<MessageFlag> {
-      Self(0x01),
-      Highlight(0x02),
-      Redirected(0x04),
-      ServerMsg(0x08),
-      Backlog(0x80);
-
-      companion object : Flags.Factory<MessageFlag> {
-        override val NONE = MessageFlag.of()
-        override fun of(bit: Int) = Flags.of<MessageFlag>(bit)
-        override fun of(vararg flags: MessageFlag) = Flags.of(*flags)
-      }
-    }
-
     class MessageTypeConverters {
       @TypeConverter
       fun convertInstant(value: Long) = Instant.ofEpochMilli(value)
@@ -161,16 +102,16 @@ abstract class QuasselDatabase : RoomDatabase() {
   @Dao
   interface MessageDao {
     @Query("SELECT * FROM message WHERE messageId = :messageId")
-    fun find(messageId: Int): Message
+    fun find(messageId: Int): DatabaseMessage
 
     @Query("SELECT * FROM message WHERE bufferId = :bufferId")
-    fun findByBufferId(bufferId: Int): List<Message>
+    fun findByBufferId(bufferId: Int): List<DatabaseMessage>
 
     @Query("SELECT * FROM message WHERE bufferId = :bufferId ORDER BY messageId DESC LIMIT 1")
-    fun findLastByBufferId(bufferId: Int): Message
+    fun findLastByBufferId(bufferId: Int): DatabaseMessage
 
     @Update(onConflict = OnConflictStrategy.REPLACE)
-    fun save(entity: Message)
+    fun save(entity: DatabaseMessage)
 
     @Query("UPDATE message SET bufferId = :bufferId1 WHERE bufferId = :bufferId2")
     fun merge(@IntRange(from = 0) bufferId1: Int, @IntRange(from = 0) bufferId2: Int)
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/NetworkInfo.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/NetworkInfo.kt
deleted file mode 100644
index 4c6c257eb007ff1a816329da3d7ac499439fd376..0000000000000000000000000000000000000000
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/NetworkInfo.kt
+++ /dev/null
@@ -1,2 +0,0 @@
-package de.kuschku.quasseldroid_ng.quassel
-
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/ProtocolMeta.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/ProtocolMeta.kt
deleted file mode 100644
index ca65033f3227950ed8eecb4197150f79cfc7f199..0000000000000000000000000000000000000000
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/ProtocolMeta.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package de.kuschku.quasseldroid_ng.quassel
-
-import de.kuschku.quasseldroid_ng.protocol.Protocol_Features
-
-data class Protocol(val flags: Protocol_Features, val data: Short, val version: Byte)
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/invokers/Invoker.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/invokers/Invoker.kt
deleted file mode 100644
index 0af930f184f34806006a858b28c1019279ae5a82..0000000000000000000000000000000000000000
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/invokers/Invoker.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.invokers
-
-import de.kuschku.quasseldroid_ng.UnknownMethodException
-import de.kuschku.quasseldroid_ng.WrongObjectTypeException
-import de.kuschku.quasseldroid_ng.protocol.QVariantList
-
-interface Invoker<out T> {
-  val className: String
-  @Throws(WrongObjectTypeException::class, UnknownMethodException::class)
-  fun invoke(on: Any?, method: String, params: QVariantList)
-}
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 8f976fb894e23be5003d04ee9932ed49604a9ca3..2389a25e90950139447bda99b0bcf0bdb3ff4584 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
@@ -8,8 +8,9 @@ import android.os.Binder
 import de.kuschku.quasseldroid_ng.BuildConfig
 import de.kuschku.quasseldroid_ng.R
 import de.kuschku.quasseldroid_ng.persistence.QuasselDatabase
-import de.kuschku.quasseldroid_ng.protocol.*
-import de.kuschku.quasseldroid_ng.session.*
+import de.kuschku.libquassel.protocol.*
+import de.kuschku.libquassel.session.*
+import de.kuschku.quasseldroid_ng.util.AndroidHandlerService
 import org.threeten.bp.Instant
 import java.security.cert.X509Certificate
 import javax.net.ssl.X509TrustManager
@@ -22,15 +23,15 @@ class QuasselService : LifecycleService() {
 
     override fun connect(address: SocketAddress, user: String, pass: String) {
       disconnect()
-      session.coreConnection = CoreConnection(session, address)
+      val handlerService = AndroidHandlerService()
+      session.coreConnection = CoreConnection(session, address, handlerService)
       session.coreConnection?.start()
       session.userData = user to pass
       connection.postValue(session.coreConnection)
     }
 
     override fun disconnect() {
-      session.coreConnection?.close()
-      session.coreConnection = null
+      session.cleanUp()
       connection.postValue(null)
       ABSENT.postValue(ConnectionState.DISCONNECTED)
     }
@@ -38,9 +39,6 @@ class QuasselService : LifecycleService() {
     private val connection = MutableLiveData<CoreConnection>()
 
     val ABSENT = MutableLiveData<ConnectionState>()
-    override val status = Transformations.switchMap(connection) { input: CoreConnection? ->
-      input?.liveState ?: ABSENT
-    }
   }
 
   private lateinit var database: QuasselDatabase
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/MainActivity.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/MainActivity.kt
index be288c70fb178398974e950d464a5ba87852e52b..6fc50d69f9e266b3b51ce40c81848a3f1215eafb 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/MainActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/MainActivity.kt
@@ -1,10 +1,8 @@
 package de.kuschku.quasseldroid_ng.ui
 
 import android.arch.lifecycle.LiveData
-import android.arch.lifecycle.Observer
 import android.os.Bundle
 import android.support.design.widget.Snackbar
-import android.util.Log
 import android.view.Menu
 import android.view.MenuItem
 import android.widget.Button
@@ -12,17 +10,17 @@ import android.widget.EditText
 import android.widget.TextView
 import butterknife.BindView
 import butterknife.ButterKnife
+import de.kuschku.libquassel.session.Backend
+import de.kuschku.libquassel.session.Session
+import de.kuschku.libquassel.session.SocketAddress
 import de.kuschku.quasseldroid_ng.R
-import de.kuschku.quasseldroid_ng.session.Backend
-import de.kuschku.quasseldroid_ng.session.ConnectionState
-import de.kuschku.quasseldroid_ng.session.Session
-import de.kuschku.quasseldroid_ng.session.SocketAddress
-import de.kuschku.quasseldroid_ng.util.helpers.Logger
-import de.kuschku.quasseldroid_ng.util.helpers.stickyMapNotNull
-import de.kuschku.quasseldroid_ng.util.helpers.stickySwitchMapNotNull
+import de.kuschku.quasseldroid_ng.util.helper.stickyMapNotNull
+import org.threeten.bp.Instant
 import org.threeten.bp.ZoneOffset
-import org.threeten.bp.ZonedDateTime
 import org.threeten.bp.format.DateTimeFormatter
+import java.util.logging.Handler
+import java.util.logging.LogManager
+import java.util.logging.LogRecord
 
 class MainActivity : ServiceBoundActivity() {
   @BindView(R.id.host)
@@ -49,26 +47,37 @@ class MainActivity : ServiceBoundActivity() {
   @BindView(R.id.errorList)
   lateinit var errorList: TextView
 
+  /*
   private val status: LiveData<ConnectionState>
-    = stickySwitchMapNotNull(backend, Backend::status, ConnectionState.DISCONNECTED)
+    = stickySwitchMapNotNull(backend, Backend::status,
+                                                                    ConnectionState.DISCONNECTED)
+                                                                    */
   private val session: LiveData<Session?>
     = stickyMapNotNull(backend, Backend::session, null)
 
   private var snackbar: Snackbar? = null
 
-  private val handler = { tag: String, message: String?, throwable: Throwable? ->
-    runOnUiThread {
-      errorList.append(DateTimeFormatter.ISO_TIME.format(ZonedDateTime.now(ZoneOffset.UTC)))
-      errorList.append(" ")
-      errorList.append(tag)
-      errorList.append(": ")
-      errorList.append(message)
-      errorList.append("\n")
-      if (throwable != null) {
-        errorList.append(Log.getStackTraceString(throwable))
-        errorList.append("\n")
+  private val dateTimeFormatter: DateTimeFormatter = DateTimeFormatter.ISO_TIME
+  private val handler = object : Handler() {
+    override fun publish(p0: LogRecord?) {
+      if (p0 != null) {
+        runOnUiThread {
+          errorList.append(
+            dateTimeFormatter.format(Instant.ofEpochMilli(p0.millis).atZone(ZoneOffset.UTC)))
+          errorList.append(" ")
+          errorList.append(p0.loggerName)
+          errorList.append(": ")
+          errorList.append(p0.message)
+          errorList.append("\n")
+        }
       }
     }
+
+    override fun flush() {
+    }
+
+    override fun close() {
+    }
   }
 
   override fun onCreate(savedInstanceState: Bundle?) {
@@ -93,6 +102,7 @@ class MainActivity : ServiceBoundActivity() {
       errorList.text = ""
     }
 
+    /*
     status.observe(this, Observer {
       val disconnected = it == ConnectionState.DISCONNECTED
       disconnect.isEnabled = !disconnected
@@ -102,6 +112,7 @@ class MainActivity : ServiceBoundActivity() {
       snackbar = Snackbar.make(errorList, it!!.name, Snackbar.LENGTH_SHORT)
       snackbar?.show()
     })
+    */
   }
 
   override fun onCreateOptionsMenu(menu: Menu?): Boolean {
@@ -115,11 +126,11 @@ class MainActivity : ServiceBoundActivity() {
 
   override fun onStart() {
     super.onStart()
-    Logger.handler = handler
+    LogManager.getLogManager().getLogger("").addHandler(handler)
   }
 
   override fun onStop() {
-    Logger.handler = null
+    LogManager.getLogManager().getLogger("").removeHandler(handler)
     super.onStop()
   }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/ServiceBoundActivity.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/ServiceBoundActivity.kt
index 0a78026f8b967b1740d8c582ecfc4845a97d939c..6df4c86ad493f992398ce21a2c030fca46d848fe 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/ui/ServiceBoundActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/ui/ServiceBoundActivity.kt
@@ -7,7 +7,7 @@ import android.content.ServiceConnection
 import android.os.IBinder
 import android.support.v7.app.AppCompatActivity
 import de.kuschku.quasseldroid_ng.service.QuasselService
-import de.kuschku.quasseldroid_ng.session.Backend
+import de.kuschku.libquassel.session.Backend
 
 abstract class ServiceBoundActivity : AppCompatActivity() {
   protected val backend = MutableLiveData<Backend?>()
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/AndroidCompatibilityUtils.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/AndroidCompatibilityUtils.kt
new file mode 100644
index 0000000000000000000000000000000000000000..f3057a9720f05f088e74cd55d862c3839ca7a925
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/util/AndroidCompatibilityUtils.kt
@@ -0,0 +1,30 @@
+package de.kuschku.quasseldroid_ng.util
+
+import android.os.Build
+import de.kuschku.libquassel.util.CompatibilityUtils
+import java.util.*
+
+object AndroidCompatibilityUtils {
+  fun init() {
+    /**
+     * This is used to check if the current device supports Sockets with the KeepAlive flag.
+     * As that feature is only missing on Chromium devices, we just check for that
+     *
+     * @return Does the current device support KeepAlive sockets?
+     */
+    CompatibilityUtils.supportsKeepAlive = !isChromeBook()
+
+    /**
+     * This is used to check if the device supports SyncFlush
+     * As that feature was only added in KitKat, we just check for the device version.
+     */
+    CompatibilityUtils.supportsCompression = Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT
+  }
+
+  private fun isChromeBook(): Boolean {
+    return Build.MANUFACTURER.toLowerCase(Locale.ENGLISH).contains("chromium") ||
+      Build.MANUFACTURER.toLowerCase(Locale.ENGLISH).contains("chrome") ||
+      Build.BRAND.toLowerCase(Locale.ENGLISH).contains("chromium") ||
+      Build.BRAND.toLowerCase(Locale.ENGLISH).contains("chrome")
+  }
+}
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/AndroidHandlerService.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/AndroidHandlerService.kt
new file mode 100644
index 0000000000000000000000000000000000000000..096cd41ae1cbe565b505cb874c15880e270a0e4a
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/util/AndroidHandlerService.kt
@@ -0,0 +1,54 @@
+package de.kuschku.quasseldroid_ng.util
+
+import android.os.Handler
+import android.os.HandlerThread
+import android.os.Process
+import de.kuschku.libquassel.util.HandlerService
+
+class AndroidHandlerService : HandlerService {
+  override fun parse(f: () -> Unit) {
+    parseHandler.post(f)
+  }
+
+  override fun write(f: () -> Unit) {
+    writeHandler.post(f)
+  }
+
+  override fun handle(f: () -> Unit) {
+    backendHandler.post(f)
+  }
+
+  private val parseThread = HandlerThread("parse", Process.THREAD_PRIORITY_BACKGROUND)
+  private val writeThread = HandlerThread("write", Process.THREAD_PRIORITY_BACKGROUND)
+  private val backendThread = HandlerThread("backend", Process.THREAD_PRIORITY_BACKGROUND)
+
+  private val parseHandler: Handler
+  private val writeHandler: Handler
+  private val backendHandler: Handler
+
+  private val internalExceptionHandler = Thread.UncaughtExceptionHandler { thread: Thread, throwable: Throwable ->
+    exceptionHandler?.uncaughtException(thread, throwable)
+  }
+
+  init {
+    parseThread.uncaughtExceptionHandler = internalExceptionHandler
+    writeThread.uncaughtExceptionHandler = internalExceptionHandler
+    backendThread.uncaughtExceptionHandler = internalExceptionHandler
+
+    parseThread.start()
+    writeThread.start()
+    backendThread.start()
+
+    parseHandler = Handler(parseThread.looper)
+    writeHandler = Handler(writeThread.looper)
+    backendHandler = Handler(backendThread.looper)
+  }
+
+  override var exceptionHandler: Thread.UncaughtExceptionHandler? = null
+
+  override fun quit() {
+    parseThread.quit()
+    writeThread.quit()
+    backendThread.quit()
+  }
+}
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/AndroidLoggingHandler.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/AndroidLoggingHandler.kt
new file mode 100644
index 0000000000000000000000000000000000000000..ecc340439cf0d79a49daadb5ae5ff890215a5f52
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/util/AndroidLoggingHandler.kt
@@ -0,0 +1,59 @@
+package de.kuschku.quasseldroid_ng.util
+
+import android.util.Log
+import java.util.logging.Handler
+import java.util.logging.Level
+import java.util.logging.LogManager
+import java.util.logging.LogRecord
+
+/**
+ * Make JUL work on Android.
+ */
+class AndroidLoggingHandler : Handler() {
+  override fun close() {}
+  override fun flush() {}
+  override fun publish(record: LogRecord) {
+    if (!super.isLoggable(record))
+      return
+
+    val name = record.loggerName
+    val maxLength = 30
+    val tag = if (name.length > maxLength) name.substring(name.length - maxLength) else name
+
+    try {
+      val level = getAndroidLevel(record.level)
+      Log.println(level, tag, record.message)
+      if (record.thrown != null) {
+        Log.println(level, tag, Log.getStackTraceString(record.thrown))
+      }
+    } catch (e: RuntimeException) {
+      Log.e("AndroidLoggingHandler", "Error logging message.", e)
+    }
+
+  }
+
+  companion object {
+    fun reset(rootHandler: Handler) {
+      val rootLogger = LogManager.getLogManager().getLogger("")
+      val handlers = rootLogger.handlers
+      for (handler in handlers) {
+        rootLogger.removeHandler(handler)
+      }
+      rootLogger.addHandler(rootHandler)
+    }
+
+    fun init() {
+      reset(AndroidLoggingHandler())
+    }
+
+    private fun getAndroidLevel(level: Level): Int {
+      val value = level.intValue()
+      return when {
+        value >= 1000 -> Log.ERROR
+        value >= 900  -> Log.WARN
+        value >= 800  -> Log.INFO
+        else          -> Log.DEBUG
+      }
+    }
+  }
+}
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/CompatibilityUtils.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/CompatibilityUtils.kt
deleted file mode 100644
index 9447b3f5f5f6c90f6dd65c8f7b601195b02a12c1..0000000000000000000000000000000000000000
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/CompatibilityUtils.kt
+++ /dev/null
@@ -1,157 +0,0 @@
-package de.kuschku.quasseldroid_ng.util
-
-import android.annotation.TargetApi
-import android.app.Activity
-import android.app.ActivityManager
-import android.content.Context
-import android.content.res.Resources
-import android.graphics.Bitmap
-import android.graphics.BitmapFactory
-import android.os.Build
-import android.support.annotation.ColorInt
-import android.support.annotation.ColorRes
-import android.support.annotation.DrawableRes
-import android.support.annotation.StringRes
-import java.io.OutputStream
-import java.util.*
-import java.util.zip.Deflater
-import java.util.zip.DeflaterOutputStream
-
-object CompatibilityUtils {
-  /**
-   * This method is used to check if the current device supports Sockets with the KeepAlive flag.
-   *
-   *
-   * As that feature is only missing on Chromium devices, we just check for that
-   *
-   * @return Does the current device support KeepAlive sockets?
-   */
-  fun deviceSupportsKeepAlive(): Boolean {
-    return !isChromeBook()
-  }
-
-  fun isChromeBook(): Boolean {
-    return Build.MANUFACTURER.toLowerCase(Locale.ENGLISH).contains("chromium") ||
-      Build.MANUFACTURER.toLowerCase(Locale.ENGLISH).contains("chrome") ||
-      Build.BRAND.toLowerCase(Locale.ENGLISH).contains("chromium") ||
-      Build.BRAND.toLowerCase(Locale.ENGLISH).contains("chrome")
-  }
-
-  /**
-   * This method is used to check if the device supports SyncFlush
-   * As that feature was only added in KitKat, we just check for the device version.
-   *
-   * @return Does the current device support SyncFlush natively?
-   */
-  fun deviceSupportsCompression(): Boolean {
-    return Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT
-  }
-
-  /**
-   * Creates a SyncFlush output stream, even if the current device does not support doing so
-   * natively.
-   *
-   * @param rawOut the raw output stream to be wrapped
-   * @return The wrapping output stream
-   */
-  fun createDeflaterOutputStream(rawOut: OutputStream?): DeflaterOutputStream {
-    return if (deviceSupportsCompression())
-      DeflaterOutputStream(rawOut, true)
-    else
-      DeflaterOutputStream(rawOut, createSyncFlushDeflater())
-  }
-
-  /**
-   * Creates a SyncFlush Deflater for use on pre-KitKat Android
-   *
-   * @return The modified Deflater, or null if the creation failed
-   */
-  private fun createSyncFlushDeflater(): Deflater? {
-    val def = Deflater()
-    try {
-      val f = def.javaClass.getDeclaredField("flushParm")
-      f.isAccessible = true
-      f.setInt(def, 2) // Z_SYNC_FLUSH
-    } catch (e: Exception) {
-      return null
-    }
-
-    return def
-  }
-}
-
-fun Context.getStatusBarHeight(): Int {
-  var result = 0
-  val resourceId = resources.getIdentifier("status_bar_height", "dimen", "android")
-  if (resourceId > 0) {
-    result = resources.getDimensionPixelSize(resourceId)
-  }
-  return result
-}
-
-/**
- * Because Android’s String::split is broken
- *
- * @return A list with all substrings of length 1, in order
- */
-fun String.split(): Array<String> {
-  val chars = arrayOfNulls<String>(length)
-  val charArray = toCharArray()
-  return chars.indices.map { String(charArray, it, 1) }.toTypedArray()
-}
-
-/**
- * Modifies the display of an {@see Activity} in the Android Recents menu if the current version
- * of Android supports doing so.
- *
- * @param label The text shown as label - passed as Android String Resource
- * @param icon The icon displayed in recents - passed as Android Drawable Resource
- * @param colorPrimary The color used as background for the header of the recents card - passed as Android
- * Color Resource
- */
-fun Activity.updateRecentsHeaderIfExisting(@StringRes label: Int, @DrawableRes icon: Int, @ColorRes colorPrimary: Int) {
-  val labelRaw = resources.getString(label)
-  val iconRaw = BitmapFactory.decodeResource(resources, icon)
-  val colorPrimaryRaw = getColor(colorPrimary, theme, resources)
-  updateRecentsHeaderIfExisting(labelRaw, iconRaw, colorPrimaryRaw)
-}
-
-@ColorInt
-private fun getColor(@ColorRes color: Int, theme: Resources.Theme, resources: Resources): Int {
-  return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
-    resources.getColor(color, theme)
-  } else {
-    // We have to use this method on older systems that don’t yet support the new method
-    // which is used above
-    resources.getColor(color)
-  }
-}
-
-/**
- * Modifies the display of an {@see Activity} in the Android Recents menu if the current version
- * of Android supports doing so.
- *
- * @param label The text shown in recents as label
- * @param icon The icon displayed in recents
- * @param colorPrimary The color used as background for the header of the recents card
- */
-fun Activity.updateRecentsHeaderIfExisting(label: String, icon: Bitmap, colorPrimary: Int) {
-  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
-    updateRecentsHeader(label, icon, colorPrimary)
-  }
-}
-
-/**
- * Forcibly updated the recents card of an {@see Activity} in the Android Recents menu.
- *
- * @param label The text shown in recents as label
- * @param icon The icon displayed in recents
- * @param colorPrimary The color used as background for the header of the recents card
- * @since Lollipop
- */
-@TargetApi(Build.VERSION_CODES.LOLLIPOP)
-private fun Activity.updateRecentsHeader(label: String, icon: Bitmap,
-                                         colorPrimary: Int) {
-  setTaskDescription(ActivityManager.TaskDescription(label,
-                                                     icon, colorPrimary))
-}
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/helper/ActivityHelper.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/helper/ActivityHelper.kt
new file mode 100644
index 0000000000000000000000000000000000000000..5df45db664ca0d00be4026a976f6322347557744
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/util/helper/ActivityHelper.kt
@@ -0,0 +1,56 @@
+package de.kuschku.quasseldroid_ng.util.helper
+
+import android.annotation.TargetApi
+import android.app.Activity
+import android.app.ActivityManager
+import android.graphics.Bitmap
+import android.graphics.BitmapFactory
+import android.os.Build
+import android.support.annotation.ColorRes
+import android.support.annotation.DrawableRes
+import android.support.annotation.StringRes
+
+/**
+ * Modifies the display of an {@see Activity} in the Android Recents menu if the current version
+ * of Android supports doing so.
+ *
+ * @param label The text shown as label - passed as Android String Resource
+ * @param icon The icon displayed in recents - passed as Android Drawable Resource
+ * @param colorPrimary The color used as background for the header of the recents card - passed as Android
+ * Color Resource
+ */
+fun Activity.updateRecentsHeaderIfExisting(@StringRes label: Int, @DrawableRes icon: Int, @ColorRes colorPrimary: Int) {
+  val labelRaw = resources.getString(label)
+  val iconRaw = BitmapFactory.decodeResource(resources, icon)
+  val colorPrimaryRaw = resources.getColorBackport(colorPrimary, theme)
+  updateRecentsHeaderIfExisting(labelRaw, iconRaw, colorPrimaryRaw)
+}
+
+/**
+ * Modifies the display of an {@see Activity} in the Android Recents menu if the current version
+ * of Android supports doing so.
+ *
+ * @param label The text shown in recents as label
+ * @param icon The icon displayed in recents
+ * @param colorPrimary The color used as background for the header of the recents card
+ */
+fun Activity.updateRecentsHeaderIfExisting(label: String, icon: Bitmap, colorPrimary: Int) {
+  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
+    updateRecentsHeader(label, icon, colorPrimary)
+  }
+}
+
+/**
+ * Forcibly updated the recents card of an {@see Activity} in the Android Recents menu.
+ *
+ * @param label The text shown in recents as label
+ * @param icon The icon displayed in recents
+ * @param colorPrimary The color used as background for the header of the recents card
+ * @since Lollipop
+ */
+@TargetApi(Build.VERSION_CODES.LOLLIPOP)
+private fun Activity.updateRecentsHeader(label: String, icon: Bitmap,
+                                         colorPrimary: Int) {
+  setTaskDescription(ActivityManager.TaskDescription(label,
+                                                     icon, colorPrimary))
+}
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/helper/ContextHelper.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/helper/ContextHelper.kt
new file mode 100644
index 0000000000000000000000000000000000000000..70dab97048bf67dbb9ca4447c1ea083b12601fa8
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/util/helper/ContextHelper.kt
@@ -0,0 +1,19 @@
+package de.kuschku.quasseldroid_ng.util.helper
+
+import android.content.Context
+import android.os.Build
+
+fun Context.getStatusBarHeight(): Int {
+  var result = 0
+  val resourceId = resources.getIdentifier("status_bar_height", "dimen", "android")
+  if (resourceId > 0) {
+    result = resources.getDimensionPixelSize(resourceId)
+  }
+  return result
+}
+
+inline fun <reified T> Context.systemService(): T = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+  getSystemService(T::class.java)
+} else {
+  getSystemService(T::class.java.simpleName) as T
+}
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/helper/ResourcesHelper.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/helper/ResourcesHelper.kt
new file mode 100644
index 0000000000000000000000000000000000000000..3785690c28d13ce278153a577ba09f4de38e3059
--- /dev/null
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/util/helper/ResourcesHelper.kt
@@ -0,0 +1,17 @@
+package de.kuschku.quasseldroid_ng.util.helper
+
+import android.content.res.Resources
+import android.os.Build
+import android.support.annotation.ColorInt
+import android.support.annotation.ColorRes
+
+@ColorInt
+fun Resources.getColorBackport(@ColorRes color: Int, theme: Resources.Theme): Int {
+  return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
+    getColor(color, theme)
+  } else {
+    // We have to use this method on older systems that don’t yet support the new method
+    // which is used above
+    getColor(color)
+  }
+}
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/TransformationsHelper.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/helper/TransformationsHelper.kt
similarity index 97%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/TransformationsHelper.kt
rename to app/src/main/java/de/kuschku/quasseldroid_ng/util/helper/TransformationsHelper.kt
index 85d9fc0bb8d4e4d588544a8373450dda393e3843..9c7f06099b7cd9d11bdff08a25334ea7e87e9fa4 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/TransformationsHelper.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid_ng/util/helper/TransformationsHelper.kt
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid_ng.util.helpers
+package de.kuschku.quasseldroid_ng.util.helper
 
 import android.arch.lifecycle.LifecycleOwner
 import android.arch.lifecycle.LiveData
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/ContextHelper.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/ContextHelper.kt
deleted file mode 100644
index 9d3d49ce821c80bdd45ce6db8867bc76bf6b5095..0000000000000000000000000000000000000000
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/ContextHelper.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-package de.kuschku.quasseldroid_ng.util.helpers
-
-import android.content.Context
-import android.os.Build
-
-inline fun <reified T> Context.systemService(): T = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
-  getSystemService(T::class.java)
-} else {
-  getSystemService(T::class.java.simpleName) as T
-}
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/LogHelper.kt b/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/LogHelper.kt
deleted file mode 100644
index 47ba0abbf6057826323f4d09713296c4c93fd1c6..0000000000000000000000000000000000000000
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/LogHelper.kt
+++ /dev/null
@@ -1,233 +0,0 @@
-package de.kuschku.quasseldroid_ng.util.helpers
-
-import android.util.Log
-import de.kuschku.quasseldroid_ng.BuildConfig
-
-class Logger {
-  companion object {
-    var handler: ((String, String?, Throwable?) -> Unit)? = null
-  }
-}
-
-inline fun Logger.Companion.loggable(tag: String, level: Int, f: Logger.Companion.() -> Unit) {
-  if (BuildConfig.DEBUG || Log.isLoggable(tag, level) || true) {
-    Logger.Companion.f()
-  }
-}
-
-/* VERBOSE */
-
-inline fun Logger.Companion.verbose(tag: String, msg: String)
-  = loggable(tag, Log.VERBOSE) {
-  Log.v(tag, msg)
-  handler?.invoke(tag, msg, null)
-}
-
-inline fun Logger.Companion.verbose(tag: String, msg: () -> String)
-  = loggable(tag, Log.VERBOSE) {
-  val msg1 = msg()
-  Log.v(tag, msg1)
-  handler?.invoke(tag, msg1, null)
-}
-
-inline fun Logger.Companion.verbose(tag: String, msg: String, tr: Throwable)
-  = loggable(tag, Log.VERBOSE) {
-  Log.v(tag, msg, tr)
-  handler?.invoke(tag, msg, tr)
-}
-
-inline fun Logger.Companion.verbose(tag: String, msg: () -> String, tr: Throwable)
-  = loggable(tag, Log.VERBOSE) {
-  val msg1 = msg()
-  Log.v(tag, msg1, tr)
-  handler?.invoke(tag, msg1, tr)
-}
-
-inline fun Logger.Companion.verbose(tag: String, msg: String, tr: () -> Throwable)
-  = loggable(tag, Log.VERBOSE) {
-  val tr1 = tr()
-  Log.v(tag, msg, tr1)
-  handler?.invoke(tag, msg, tr1)
-}
-
-inline fun Logger.Companion.verbose(tag: String, msg: () -> String, tr: () -> Throwable)
-  = loggable(tag, Log.VERBOSE) {
-  val tr1 = tr()
-  val msg1 = msg()
-  Log.v(tag, msg1, tr1)
-  handler?.invoke(tag, msg1, tr1)
-}
-
-
-/* DEBUG */
-
-inline fun Logger.Companion.debug(tag: String, msg: String)
-  = loggable(tag, Log.DEBUG) {
-  Log.d(tag, msg)
-  handler?.invoke(tag, msg, null)
-}
-
-inline fun Logger.Companion.debug(tag: String, msg: () -> String)
-  = loggable(tag, Log.DEBUG) {
-  val msg1 = msg()
-  Log.d(tag, msg1)
-  handler?.invoke(tag, msg1, null)
-}
-
-inline fun Logger.Companion.debug(tag: String, msg: String, tr: Throwable)
-  = loggable(tag, Log.DEBUG) {
-  Log.d(tag, msg, tr)
-  handler?.invoke(tag, msg, tr)
-}
-
-inline fun Logger.Companion.debug(tag: String, msg: () -> String, tr: Throwable)
-  = loggable(tag, Log.DEBUG) {
-  val msg1 = msg()
-  Log.d(tag, msg1, tr)
-  handler?.invoke(tag, msg1, tr)
-}
-
-inline fun Logger.Companion.debug(tag: String, msg: String, tr: () -> Throwable)
-  = loggable(tag, Log.DEBUG) {
-  val tr1 = tr()
-  Log.d(tag, msg, tr1)
-  handler?.invoke(tag, msg, tr1)
-}
-
-inline fun Logger.Companion.debug(tag: String, msg: () -> String, tr: () -> Throwable)
-  = loggable(tag, Log.DEBUG) {
-  val tr1 = tr()
-  val msg1 = msg()
-  Log.d(tag, msg1, tr1)
-  handler?.invoke(tag, msg1, tr1)
-}
-
-
-/* INFO */
-
-inline fun Logger.Companion.info(tag: String, msg: String)
-  = loggable(tag, Log.INFO) {
-  Log.i(tag, msg)
-  handler?.invoke(tag, msg, null)
-}
-
-inline fun Logger.Companion.info(tag: String, msg: () -> String)
-  = loggable(tag, Log.INFO) {
-  val msg1 = msg()
-  Log.i(tag, msg1)
-  handler?.invoke(tag, msg1, null)
-}
-
-inline fun Logger.Companion.info(tag: String, msg: String, tr: Throwable)
-  = loggable(tag, Log.INFO) {
-  Log.i(tag, msg, tr)
-  handler?.invoke(tag, msg, tr)
-}
-
-inline fun Logger.Companion.info(tag: String, msg: () -> String, tr: Throwable)
-  = loggable(tag, Log.INFO) {
-  val msg1 = msg()
-  Log.i(tag, msg1, tr)
-  handler?.invoke(tag, msg1, tr)
-}
-
-inline fun Logger.Companion.info(tag: String, msg: String, tr: () -> Throwable)
-  = loggable(tag, Log.INFO) {
-  val tr1 = tr()
-  Log.i(tag, msg, tr1)
-  handler?.invoke(tag, msg, tr1)
-}
-
-inline fun Logger.Companion.info(tag: String, msg: () -> String, tr: () -> Throwable)
-  = loggable(tag, Log.INFO) {
-  val tr1 = tr()
-  val msg1 = msg()
-  Log.i(tag, msg1, tr1)
-  handler?.invoke(tag, msg1, tr1)
-}
-
-/* WARN */
-
-inline fun Logger.Companion.warn(tag: String, msg: String)
-  = loggable(tag, Log.WARN) {
-  Log.w(tag, msg)
-  handler?.invoke(tag, msg, null)
-}
-
-inline fun Logger.Companion.warn(tag: String, msg: () -> String)
-  = loggable(tag, Log.WARN) {
-  val msg1 = msg()
-  Log.w(tag, msg1)
-  handler?.invoke(tag, msg1, null)
-}
-
-inline fun Logger.Companion.warn(tag: String, msg: String, tr: Throwable)
-  = loggable(tag, Log.WARN) {
-  Log.w(tag, msg, tr)
-  handler?.invoke(tag, msg, tr)
-}
-
-inline fun Logger.Companion.warn(tag: String, msg: () -> String, tr: Throwable)
-  = loggable(tag, Log.WARN) {
-  val msg1 = msg()
-  Log.w(tag, msg1, tr)
-  handler?.invoke(tag, msg1, tr)
-}
-
-inline fun Logger.Companion.warn(tag: String, msg: String, tr: () -> Throwable)
-  = loggable(tag, Log.WARN) {
-  val tr1 = tr()
-  Log.w(tag, msg, tr1)
-  handler?.invoke(tag, msg, tr1)
-}
-
-inline fun Logger.Companion.warn(tag: String, msg: () -> String, tr: () -> Throwable)
-  = loggable(tag, Log.WARN) {
-  val tr1 = tr()
-  val msg1 = msg()
-  Log.w(tag, msg1, tr1)
-  handler?.invoke(tag, msg1, tr1)
-}
-
-/* ERROR */
-
-inline fun Logger.Companion.error(tag: String, msg: String)
-  = loggable(tag, Log.ERROR) {
-  Log.e(tag, msg)
-  handler?.invoke(tag, msg, null)
-}
-
-inline fun Logger.Companion.error(tag: String, msg: () -> String)
-  = loggable(tag, Log.ERROR) {
-  val msg1 = msg()
-  Log.e(tag, msg1)
-  handler?.invoke(tag, msg1, null)
-}
-
-inline fun Logger.Companion.error(tag: String, msg: String, tr: Throwable)
-  = loggable(tag, Log.ERROR) {
-  Log.e(tag, msg, tr)
-  handler?.invoke(tag, msg, tr)
-}
-
-inline fun Logger.Companion.error(tag: String, msg: () -> String, tr: Throwable)
-  = loggable(tag, Log.ERROR) {
-  val msg1 = msg()
-  Log.e(tag, msg1, tr)
-  handler?.invoke(tag, msg1, tr)
-}
-
-inline fun Logger.Companion.error(tag: String, msg: String, tr: () -> Throwable)
-  = loggable(tag, Log.ERROR) {
-  val tr1 = tr()
-  Log.e(tag, msg, tr1)
-  handler?.invoke(tag, msg, tr1)
-}
-
-inline fun Logger.Companion.error(tag: String, msg: () -> String, tr: () -> Throwable)
-  = loggable(tag, Log.ERROR) {
-  val tr1 = tr()
-  val msg1 = msg()
-  Log.e(tag, msg1, tr1)
-  handler?.invoke(tag, msg1, tr1)
-}
diff --git a/app/src/test/java/de/kuschku/quasseldroid_ng/SerializerUnitTest.kt b/app/src/test/java/de/kuschku/quasseldroid_ng/SerializerUnitTest.kt
index d43ca3edbbf349f0ee7ebc3e14ec2c3aa642a8ef..9a66853d244e4d0e7de4a02771de6ed5e6141a8d 100644
--- a/app/src/test/java/de/kuschku/quasseldroid_ng/SerializerUnitTest.kt
+++ b/app/src/test/java/de/kuschku/quasseldroid_ng/SerializerUnitTest.kt
@@ -1,9 +1,9 @@
 package de.kuschku.quasseldroid_ng
 
-import de.kuschku.quasseldroid_ng.protocol.Quassel_Feature
-import de.kuschku.quasseldroid_ng.protocol.Quassel_Features
-import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.*
-import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer
+import de.kuschku.libquassel.protocol.Quassel_Feature
+import de.kuschku.libquassel.protocol.Quassel_Features
+import de.kuschku.libquassel.protocol.primitive.serializer.*
+import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import org.junit.Assert.assertArrayEquals
 import org.junit.Assert.assertEquals
 import org.junit.Test
diff --git a/invokergenerator/src/main/java/de/kuschku/libquassel/annotations/InvokerProcessor.java b/invokergenerator/src/main/java/de/kuschku/libquassel/annotations/InvokerProcessor.java
index bbde9f7b352e85653b8ef58d1cbabeaae43c1122..24fe7fbb10dee7e8c2a4dd30d7473c2df144a88b 100644
--- a/invokergenerator/src/main/java/de/kuschku/libquassel/annotations/InvokerProcessor.java
+++ b/invokergenerator/src/main/java/de/kuschku/libquassel/annotations/InvokerProcessor.java
@@ -121,8 +121,8 @@ public class InvokerProcessor extends AbstractProcessor {
         String invokerName = element.annotation.name() + "Invoker";
 
         ClassName type = ClassName.get(packageName, invokerName);
-        ClassName wrongObjectTypeException = ClassName.get("de.kuschku.quasseldroid_ng", "WrongObjectTypeException");
-        ClassName unknownMethodException = ClassName.get("de.kuschku.quasseldroid_ng", "UnknownMethodException");
+        ClassName wrongObjectTypeException = ClassName.get("de.kuschku.libquassel.quassel.exceptions", "WrongObjectTypeException");
+        ClassName unknownMethodException = ClassName.get("de.kuschku.libquassel.quassel.exceptions", "UnknownMethodException");
         ClassName nonNullAnnotation = ClassName.get("android.support.annotation", "NonNull");
 
         MethodSpec methodSpecConstructor = MethodSpec
@@ -164,7 +164,7 @@ public class InvokerProcessor extends AbstractProcessor {
                         ParameterizedTypeName.get(
                                 ClassName.get(List.class),
                                 ParameterizedTypeName.get(
-                                        ClassName.get("de.kuschku.quasseldroid_ng.protocol", "QVariant"),
+                                        ClassName.get("de.kuschku.libquassel.protocol", "QVariant"),
                                         TypeName.get(Object.class)
                                 )
                         ),
diff --git a/lib/build.gradle.kts b/lib/build.gradle.kts
new file mode 100644
index 0000000000000000000000000000000000000000..26af4e8383670249cdcf9b585a6c61c101ca4b91
--- /dev/null
+++ b/lib/build.gradle.kts
@@ -0,0 +1,211 @@
+
+import org.gradle.api.Project
+import org.gradle.api.artifacts.ExternalModuleDependency
+import org.gradle.kotlin.dsl.*
+import org.jetbrains.kotlin.gradle.plugin.KaptExtension
+
+apply {
+  plugin("kotlin")
+  plugin("kotlin-kapt")
+}
+
+val appCompatVersion = "26.1.0"
+dependencies {
+  implementation(kotlin("stdlib"))
+
+  implementation(appCompat("support-annotations"))
+  implementation("org.threeten:threetenbp:1.3.6")
+  implementation("io.reactivex.rxjava2:rxjava:2.1.3")
+
+  implementation(project(":invokerannotations"))
+  kapt(project(":invokergenerator"))
+
+  testImplementation("junit:junit:4.12")
+}
+
+/**
+ * Builds the dependency notation for the named AppCompat [module] at the given [version].
+ *
+ * @param module simple name of the AppCompat module, for example "cardview-v7".
+ * @param version optional desired version, null implies [appCompatVersion].
+ */
+fun appCompat(module: String, version: String? = null)
+  = "com.android.support:$module:${version ?: appCompatVersion}"
+
+fun Project.kapt(f: KaptExtension.() -> Unit)
+  = configure(f)
+
+fun DependencyHandlerScope.archives(dependencyNotation: Any)
+  = "archives"(dependencyNotation)
+
+fun DependencyHandlerScope.archives(dependencyNotation: String,
+                                    dependencyConfiguration: ExternalModuleDependency.() -> Unit)
+  = "archives"(dependencyNotation, dependencyConfiguration)
+
+fun DependencyHandlerScope.implementation(dependencyNotation: Any)
+  = "implementation"(dependencyNotation)
+
+fun DependencyHandlerScope.implementation(dependencyNotation: String,
+                                          dependencyConfiguration: ExternalModuleDependency.() -> Unit)
+  = "implementation"(dependencyNotation, dependencyConfiguration)
+
+fun DependencyHandlerScope.debugAnnotationProcessor(dependencyNotation: Any)
+  = "debugAnnotationProcessor"(dependencyNotation)
+
+fun DependencyHandlerScope.debugAnnotationProcessor(dependencyNotation: String,
+                                                    dependencyConfiguration: ExternalModuleDependency.() -> Unit)
+  = "debugAnnotationProcessor"(dependencyNotation, dependencyConfiguration)
+
+fun DependencyHandlerScope.debugImplementation(dependencyNotation: Any)
+  = "debugImplementation"(dependencyNotation)
+
+fun DependencyHandlerScope.debugImplementation(dependencyNotation: String,
+                                               dependencyConfiguration: ExternalModuleDependency.() -> Unit)
+  = "debugImplementation"(dependencyNotation, dependencyConfiguration)
+
+fun DependencyHandlerScope.debugProvided(dependencyNotation: Any)
+  = "debugProvided"(dependencyNotation)
+
+fun DependencyHandlerScope.debugProvided(dependencyNotation: String,
+                                         dependencyConfiguration: ExternalModuleDependency.() -> Unit)
+  = "debugProvided"(dependencyNotation, dependencyConfiguration)
+
+fun DependencyHandlerScope.default(dependencyNotation: Any)
+  = "default"(dependencyNotation)
+
+fun DependencyHandlerScope.default(dependencyNotation: String,
+                                   dependencyConfiguration: ExternalModuleDependency.() -> Unit)
+  = "default"(dependencyNotation, dependencyConfiguration)
+
+fun DependencyHandlerScope.kapt(dependencyNotation: Any)
+  = "kapt"(dependencyNotation)
+
+fun DependencyHandlerScope.kapt(dependencyNotation: String,
+                                dependencyConfiguration: ExternalModuleDependency.() -> Unit)
+  = "kapt"(dependencyNotation, dependencyConfiguration)
+
+fun DependencyHandlerScope.kaptDebug(dependencyNotation: Any)
+  = "kaptDebug"(dependencyNotation)
+
+fun DependencyHandlerScope.kaptDebug(dependencyNotation: String,
+                                     dependencyConfiguration: ExternalModuleDependency.() -> Unit)
+  = "kaptDebug"(dependencyNotation, dependencyConfiguration)
+
+fun DependencyHandlerScope.kaptRelease(dependencyNotation: Any)
+  = "kaptRelease"(dependencyNotation)
+
+fun DependencyHandlerScope.kaptRelease(dependencyNotation: String,
+                                       dependencyConfiguration: ExternalModuleDependency.() -> Unit)
+  = "kaptRelease"(dependencyNotation, dependencyConfiguration)
+
+fun DependencyHandlerScope.kaptTest(dependencyNotation: Any)
+  = "kaptTest"(dependencyNotation)
+
+fun DependencyHandlerScope.kaptTest(dependencyNotation: String,
+                                    dependencyConfiguration: ExternalModuleDependency.() -> Unit)
+  = "kaptTest"(dependencyNotation, dependencyConfiguration)
+
+fun DependencyHandlerScope.kaptTestDebug(dependencyNotation: Any)
+  = "kaptTestDebug"(dependencyNotation)
+
+fun DependencyHandlerScope.kaptTestDebug(dependencyNotation: String,
+                                         dependencyConfiguration: ExternalModuleDependency.() -> Unit)
+  = "kaptTestDebug"(dependencyNotation, dependencyConfiguration)
+
+fun DependencyHandlerScope.kaptTestRelease(dependencyNotation: Any)
+  = "kaptTestRelease"(dependencyNotation)
+
+fun DependencyHandlerScope.kaptTestRelease(dependencyNotation: String,
+                                           dependencyConfiguration: ExternalModuleDependency.() -> Unit)
+  = "kaptTestRelease"(dependencyNotation, dependencyConfiguration)
+
+fun DependencyHandlerScope.provided(dependencyNotation: Any)
+  = "provided"(dependencyNotation)
+
+fun DependencyHandlerScope.provided(dependencyNotation: String,
+                                    dependencyConfiguration: ExternalModuleDependency.() -> Unit)
+  = "provided"(dependencyNotation, dependencyConfiguration)
+
+fun DependencyHandlerScope.releaseAnnotationProcessor(dependencyNotation: Any)
+  = "releaseAnnotationProcessor"(dependencyNotation)
+
+fun DependencyHandlerScope.releaseAnnotationProcessor(dependencyNotation: String,
+                                                      dependencyConfiguration: ExternalModuleDependency.() -> Unit)
+  = "releaseAnnotationProcessor"(dependencyNotation, dependencyConfiguration)
+
+fun DependencyHandlerScope.releaseImplementation(dependencyNotation: Any)
+  = "releaseImplementation"(dependencyNotation)
+
+fun DependencyHandlerScope.releaseImplementation(dependencyNotation: String,
+                                                 dependencyConfiguration: ExternalModuleDependency.() -> Unit)
+  = "releaseImplementation"(dependencyNotation, dependencyConfiguration)
+
+fun DependencyHandlerScope.releaseProvided(dependencyNotation: Any)
+  = "releaseProvided"(dependencyNotation)
+
+fun DependencyHandlerScope.releaseProvided(dependencyNotation: String,
+                                           dependencyConfiguration: ExternalModuleDependency.() -> Unit)
+  = "releaseProvided"(dependencyNotation, dependencyConfiguration)
+
+fun DependencyHandlerScope.testAnnotationProcessor(dependencyNotation: Any)
+  = "testAnnotationProcessor"(dependencyNotation)
+
+fun DependencyHandlerScope.testAnnotationProcessor(dependencyNotation: String,
+                                                   dependencyConfiguration: ExternalModuleDependency.() -> Unit)
+  = "testAnnotationProcessor"(dependencyNotation, dependencyConfiguration)
+
+fun DependencyHandlerScope.testImplementation(dependencyNotation: Any)
+  = "testImplementation"(dependencyNotation)
+
+fun DependencyHandlerScope.testImplementation(dependencyNotation: String,
+                                              dependencyConfiguration: ExternalModuleDependency.() -> Unit)
+  = "testImplementation"(dependencyNotation, dependencyConfiguration)
+
+fun DependencyHandlerScope.testDebugAnnotationProcessor(dependencyNotation: Any)
+  = "testDebugAnnotationProcessor"(dependencyNotation)
+
+fun DependencyHandlerScope.testDebugAnnotationProcessor(dependencyNotation: String,
+                                                        dependencyConfiguration: ExternalModuleDependency.() -> Unit)
+  = "testDebugAnnotationProcessor"(dependencyNotation, dependencyConfiguration)
+
+fun DependencyHandlerScope.testDebugImplementation(dependencyNotation: Any)
+  = "testDebugImplementation"(dependencyNotation)
+
+fun DependencyHandlerScope.testDebugImplementation(dependencyNotation: String,
+                                                   dependencyConfiguration: ExternalModuleDependency.() -> Unit)
+  = "testDebugImplementation"(dependencyNotation, dependencyConfiguration)
+
+fun DependencyHandlerScope.testDebugProvided(dependencyNotation: Any)
+  = "testDebugProvided"(dependencyNotation)
+
+fun DependencyHandlerScope.testDebugProvided(dependencyNotation: String,
+                                             dependencyConfiguration: ExternalModuleDependency.() -> Unit)
+  = "testDebugProvided"(dependencyNotation, dependencyConfiguration)
+
+fun DependencyHandlerScope.testProvided(dependencyNotation: Any)
+  = "testProvided"(dependencyNotation)
+
+fun DependencyHandlerScope.testProvided(dependencyNotation: String,
+                                        dependencyConfiguration: ExternalModuleDependency.() -> Unit)
+  = "testProvided"(dependencyNotation, dependencyConfiguration)
+
+fun DependencyHandlerScope.testReleaseAnnotationProcessor(dependencyNotation: Any)
+  = "testReleaseAnnotationProcessor"(dependencyNotation)
+
+fun DependencyHandlerScope.testReleaseAnnotationProcessor(dependencyNotation: String,
+                                                          dependencyConfiguration: ExternalModuleDependency.() -> Unit)
+  = "testReleaseAnnotationProcessor"(dependencyNotation, dependencyConfiguration)
+
+fun DependencyHandlerScope.testReleaseImplementation(dependencyNotation: Any)
+  = "testReleaseImplementation"(dependencyNotation)
+
+fun DependencyHandlerScope.testReleaseImplementation(dependencyNotation: String,
+                                                     dependencyConfiguration: ExternalModuleDependency.() -> Unit)
+  = "testReleaseImplementation"(dependencyNotation, dependencyConfiguration)
+
+fun DependencyHandlerScope.testReleaseProvided(dependencyNotation: Any)
+  = "testReleaseProvided"(dependencyNotation)
+
+fun DependencyHandlerScope.testReleaseProvided(dependencyNotation: String,
+                                               dependencyConfiguration: ExternalModuleDependency.() -> Unit)
+  = "testReleaseProvided"(dependencyNotation, dependencyConfiguration)
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/ClientData.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/ClientData.kt
similarity index 83%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/ClientData.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/ClientData.kt
index 1b92ec6ac31f0052696b76e9012f4ae45b1f8323..4242b9cf0576397f6676e1c4e64f854f53d65b01 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/ClientData.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/ClientData.kt
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid_ng.protocol
+package de.kuschku.libquassel.protocol
 
 import org.threeten.bp.Instant
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/HandshakeMessage.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/HandshakeMessage.kt
similarity index 99%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/HandshakeMessage.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/HandshakeMessage.kt
index 34064d826f04641b91d29ff57b38feab864e0093..aafc0b12e82ec44b085d42f88a0eb7bacb7d3b51 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/HandshakeMessage.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/HandshakeMessage.kt
@@ -1,6 +1,6 @@
-package de.kuschku.quasseldroid_ng.protocol
+package de.kuschku.libquassel.protocol
 
-import de.kuschku.quasseldroid_ng.util.Flags
+import de.kuschku.libquassel.util.Flags
 
 
 sealed class HandshakeMessage {
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/Message.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/Message.kt
new file mode 100644
index 0000000000000000000000000000000000000000..5ef4a08bf62a82805759eaa89007613c239ad0ff
--- /dev/null
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/Message.kt
@@ -0,0 +1,59 @@
+package de.kuschku.libquassel.protocol
+
+import de.kuschku.libquassel.quassel.BufferInfo
+import de.kuschku.libquassel.util.Flag
+import de.kuschku.libquassel.util.Flags
+import org.threeten.bp.Instant
+
+class Message(
+  val messageId: Int,
+  val time: Instant,
+  val type: Message_Types,
+  val flag: Message_Flags,
+  val bufferInfo: BufferInfo,
+  val sender: String,
+  val senderPrefixes: String,
+  val content: String
+) {
+  enum class MessageType(override val bit: Int) : Flag<MessageType> {
+    Plain(0x00001),
+    Notice(0x00002),
+    Action(0x00004),
+    Nick(0x00008),
+    Mode(0x00010),
+    Join(0x00020),
+    Part(0x00040),
+    Quit(0x00080),
+    Kick(0x00100),
+    Kill(0x00200),
+    Server(0x00400),
+    Info(0x00800),
+    Error(0x01000),
+    DayChange(0x02000),
+    Topic(0x04000),
+    NetsplitJoin(0x08000),
+    NetsplitQuit(0x10000),
+    Invite(0x20000),
+    Markerline(0x40000);
+
+    companion object : Flags.Factory<MessageType> {
+      override val NONE = MessageType.of()
+      override fun of(bit: Int) = Flags.of<MessageType>(bit)
+      override fun of(vararg flags: MessageType) = Flags.of(*flags)
+    }
+  }
+
+  enum class MessageFlag(override val bit: Int) : Flag<MessageFlag> {
+    Self(0x01),
+    Highlight(0x02),
+    Redirected(0x04),
+    ServerMsg(0x08),
+    Backlog(0x80);
+
+    companion object : Flags.Factory<MessageFlag> {
+      override val NONE = MessageFlag.of()
+      override fun of(bit: Int) = Flags.of<MessageFlag>(bit)
+      override fun of(vararg flags: MessageFlag) = Flags.of(*flags)
+    }
+  }
+}
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/MetaType.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/MetaType.kt
similarity index 97%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/MetaType.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/MetaType.kt
index b5ca4e9f379ec62201a3d5ea001866b56daa7880..79cd1d31cd549e0e69461d2d67d4ac81f39dcae4 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/MetaType.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/MetaType.kt
@@ -1,6 +1,6 @@
-package de.kuschku.quasseldroid_ng.protocol
+package de.kuschku.libquassel.protocol
 
-import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.*
+import de.kuschku.libquassel.protocol.primitive.serializer.*
 import org.threeten.bp.LocalTime
 import org.threeten.bp.OffsetDateTime
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/NetworkLayerProtocol.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/NetworkLayerProtocol.kt
similarity index 89%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/NetworkLayerProtocol.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/NetworkLayerProtocol.kt
index 606a5d26a5443bb0e7016121a83ec66e2a872c1f..5f6514485a6d293dc8eb370ed5a51889f5fdfe74 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/NetworkLayerProtocol.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/NetworkLayerProtocol.kt
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid_ng.protocol
+package de.kuschku.libquassel.protocol
 
 enum class NetworkLayerProtocol(val value: Byte) {
   IPv4Protocol(0),
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/QType.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/QType.kt
similarity index 92%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/QType.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/QType.kt
index ce1138a162cc83c621546d395121da77ee87ee52..21529ef3f7e84246c8a11ccb1ddc1fc1caf91d76 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/QType.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/QType.kt
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid_ng.protocol
+package de.kuschku.libquassel.protocol
 
 enum class QType(val typeName: String) {
   BufferId("BufferId"),
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/QTypes.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/QTypes.kt
similarity index 76%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/QTypes.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/QTypes.kt
index 970d9a74b63920cd0220e194435980bc04b3316c..8170d22fbf93ed59ea5e80de3bc7dcd676d050b4 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/QTypes.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/QTypes.kt
@@ -1,15 +1,14 @@
-package de.kuschku.quasseldroid_ng.protocol
-
-import de.kuschku.quasseldroid_ng.persistence.QuasselDatabase
-import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.StringSerializer
-import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.deserializeString
-import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.serializeString
-import de.kuschku.quasseldroid_ng.quassel.BufferInfo
-import de.kuschku.quasseldroid_ng.quassel.ProtocolFeature
-import de.kuschku.quasseldroid_ng.quassel.QuasselFeature
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.INetwork
-import de.kuschku.quasseldroid_ng.util.Flags
-import de.kuschku.quasseldroid_ng.util.ShortFlags
+package de.kuschku.libquassel.protocol
+
+import de.kuschku.libquassel.protocol.primitive.serializer.StringSerializer
+import de.kuschku.libquassel.protocol.primitive.serializer.deserializeString
+import de.kuschku.libquassel.protocol.primitive.serializer.serializeString
+import de.kuschku.libquassel.quassel.BufferInfo
+import de.kuschku.libquassel.quassel.ProtocolFeature
+import de.kuschku.libquassel.quassel.QuasselFeature
+import de.kuschku.libquassel.quassel.syncables.interfaces.INetwork
+import de.kuschku.libquassel.util.Flags
+import de.kuschku.libquassel.util.ShortFlags
 import java.nio.ByteBuffer
 
 typealias QStringList = List<String?>
@@ -23,10 +22,10 @@ typealias BufferId = Int
 typealias MsgId = Int
 typealias NetworkId = Int
 
-typealias Message_Type = QuasselDatabase.Message.MessageType
+typealias Message_Type = Message.MessageType
 typealias Message_Types = Flags<Message_Type>
 
-typealias Message_Flag = QuasselDatabase.Message.MessageFlag
+typealias Message_Flag = Message.MessageFlag
 typealias Message_Flags = Flags<Message_Flag>
 
 typealias Quassel_Feature = QuasselFeature
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/QVariant.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/QVariant.kt
similarity index 96%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/QVariant.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/QVariant.kt
index da5ffb3957574f2f74ae8a5012333de348e7d2c1..4294fff6fa39acc69bc2337a40ae30b4b2aff5cd 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/QVariant.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/QVariant.kt
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid_ng.protocol
+package de.kuschku.libquassel.protocol
 
 class QVariant<T>(val data: T?, val type: MetaType<T>) {
   constructor(data: T?, type: Type) : this(data, MetaType.Companion.get(type))
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/SignalProxyMessage.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/SignalProxyMessage.kt
similarity index 95%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/SignalProxyMessage.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/SignalProxyMessage.kt
index b733c1464d3cd829986522868c3da579212e48aa..33a2bd516f47b20be122e91fc2eb53dacb37f86a 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/SignalProxyMessage.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/SignalProxyMessage.kt
@@ -1,8 +1,8 @@
-package de.kuschku.quasseldroid_ng.protocol
+package de.kuschku.libquassel.protocol
 
-import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.StringSerializer.UTF8
-import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.deserializeString
-import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.serializeString
+import de.kuschku.libquassel.protocol.primitive.serializer.StringSerializer.UTF8
+import de.kuschku.libquassel.protocol.primitive.serializer.deserializeString
+import de.kuschku.libquassel.protocol.primitive.serializer.serializeString
 import org.threeten.bp.Instant
 import java.nio.ByteBuffer
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/Type.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/Type.kt
similarity index 96%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/Type.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/Type.kt
index dfe2dedee6f78b10d33fd70f2587d05b7e0b8910..f644d14a9197fbbc3f273f9fd20c5436e8ed7494 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/Type.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/Type.kt
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid_ng.protocol
+package de.kuschku.libquassel.protocol
 
 import java.util.*
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/BoolSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/BoolSerializer.kt
similarity index 66%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/BoolSerializer.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/BoolSerializer.kt
index 67c8b33a8e34787a42d6a74b066e3595e66c3468..582234af744c6f193a3ab84fcb8a25aff7d85162 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/BoolSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/BoolSerializer.kt
@@ -1,7 +1,7 @@
-package de.kuschku.quasseldroid_ng.protocol.primitive.serializer
+package de.kuschku.libquassel.protocol.primitive.serializer
 
-import de.kuschku.quasseldroid_ng.protocol.Quassel_Features
-import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer
+import de.kuschku.libquassel.protocol.Quassel_Features
+import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import java.nio.ByteBuffer
 
 object BoolSerializer : Serializer<Boolean> {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/BufferInfoSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/BufferInfoSerializer.kt
similarity index 78%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/BufferInfoSerializer.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/BufferInfoSerializer.kt
index 15398ee17759944910832208681a659b8f9a3a11..0c879213381e51265ea995c320ff84d59350cf91 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/BufferInfoSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/BufferInfoSerializer.kt
@@ -1,9 +1,9 @@
-package de.kuschku.quasseldroid_ng.protocol.primitive.serializer
+package de.kuschku.libquassel.protocol.primitive.serializer
 
-import de.kuschku.quasseldroid_ng.protocol.Buffer_Type
-import de.kuschku.quasseldroid_ng.protocol.Quassel_Features
-import de.kuschku.quasseldroid_ng.quassel.BufferInfo
-import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer
+import de.kuschku.libquassel.protocol.Buffer_Type
+import de.kuschku.libquassel.protocol.Quassel_Features
+import de.kuschku.libquassel.quassel.BufferInfo
+import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import java.nio.ByteBuffer
 
 object BufferInfoSerializer : Serializer<BufferInfo> {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/ByteArraySerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/ByteArraySerializer.kt
similarity index 79%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/ByteArraySerializer.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/ByteArraySerializer.kt
index 7a6bd9039236db081d61a1653c71a22e215c9e17..b28d38e107b5af08a5f30d97b3db018a4488d43a 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/ByteArraySerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/ByteArraySerializer.kt
@@ -1,7 +1,7 @@
-package de.kuschku.quasseldroid_ng.protocol.primitive.serializer
+package de.kuschku.libquassel.protocol.primitive.serializer
 
-import de.kuschku.quasseldroid_ng.protocol.Quassel_Features
-import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer
+import de.kuschku.libquassel.protocol.Quassel_Features
+import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import java.nio.ByteBuffer
 
 object ByteArraySerializer : Serializer<ByteBuffer?> {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/ByteSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/ByteSerializer.kt
similarity index 62%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/ByteSerializer.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/ByteSerializer.kt
index 47e0f47ea57184e1f8dd23359bb9b0b790f8cc38..2772d82c90c656bfefc1f999567c1c2b71691f08 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/ByteSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/ByteSerializer.kt
@@ -1,7 +1,7 @@
-package de.kuschku.quasseldroid_ng.protocol.primitive.serializer
+package de.kuschku.libquassel.protocol.primitive.serializer
 
-import de.kuschku.quasseldroid_ng.protocol.Quassel_Features
-import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer
+import de.kuschku.libquassel.protocol.Quassel_Features
+import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import java.nio.ByteBuffer
 
 object ByteSerializer : Serializer<Byte> {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/CharSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/CharSerializer.kt
similarity index 86%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/CharSerializer.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/CharSerializer.kt
index 2d031300a0329e2efed02a0df3bda59b629c1043..b17c8a4bd5b0da35582e299e5b1c65b91bafe6cf 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/CharSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/CharSerializer.kt
@@ -1,7 +1,7 @@
-package de.kuschku.quasseldroid_ng.protocol.primitive.serializer
+package de.kuschku.libquassel.protocol.primitive.serializer
 
-import de.kuschku.quasseldroid_ng.protocol.Quassel_Features
-import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer
+import de.kuschku.libquassel.protocol.Quassel_Features
+import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import java.nio.ByteBuffer
 import java.nio.CharBuffer
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/DateTimeSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/DateTimeSerializer.kt
similarity index 93%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/DateTimeSerializer.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/DateTimeSerializer.kt
index b70ad22b1f217d30a5db8d0249a463d2855f4a7a..9fc981523f494e416efa653af5c5ed450fc95020 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/DateTimeSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/DateTimeSerializer.kt
@@ -1,7 +1,7 @@
-package de.kuschku.quasseldroid_ng.protocol.primitive.serializer
+package de.kuschku.libquassel.protocol.primitive.serializer
 
-import de.kuschku.quasseldroid_ng.protocol.Quassel_Features
-import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer
+import de.kuschku.libquassel.protocol.Quassel_Features
+import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import org.threeten.bp.Instant
 import org.threeten.bp.LocalDateTime
 import org.threeten.bp.OffsetDateTime
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/DccConfig_IpDetectionModeSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/DccConfig_IpDetectionModeSerializer.kt
similarity index 64%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/DccConfig_IpDetectionModeSerializer.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/DccConfig_IpDetectionModeSerializer.kt
index 0df0a80011539a2198d6e1062611d1d4ccf334da..88b5a8a28c359d6fafd45b1a3419b400d9a20e2e 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/DccConfig_IpDetectionModeSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/DccConfig_IpDetectionModeSerializer.kt
@@ -1,8 +1,8 @@
-package de.kuschku.quasseldroid_ng.protocol.primitive.serializer
+package de.kuschku.libquassel.protocol.primitive.serializer
 
-import de.kuschku.quasseldroid_ng.protocol.Quassel_Features
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IDccConfig
-import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer
+import de.kuschku.libquassel.protocol.Quassel_Features
+import de.kuschku.libquassel.quassel.syncables.interfaces.IDccConfig
+import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import java.nio.ByteBuffer
 
 object DccConfig_IpDetectionModeSerializer : Serializer<IDccConfig.IpDetectionMode> {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/DccConfig_PortSelectionModeSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/DccConfig_PortSelectionModeSerializer.kt
similarity index 65%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/DccConfig_PortSelectionModeSerializer.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/DccConfig_PortSelectionModeSerializer.kt
index f97b8308c7940b2c46936d2a85662c245818aa3e..f6b8ec28c8961d136d0d2a72edf9a65f77a7769b 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/DccConfig_PortSelectionModeSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/DccConfig_PortSelectionModeSerializer.kt
@@ -1,8 +1,8 @@
-package de.kuschku.quasseldroid_ng.protocol.primitive.serializer
+package de.kuschku.libquassel.protocol.primitive.serializer
 
-import de.kuschku.quasseldroid_ng.protocol.Quassel_Features
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IDccConfig
-import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer
+import de.kuschku.libquassel.protocol.Quassel_Features
+import de.kuschku.libquassel.quassel.syncables.interfaces.IDccConfig
+import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import java.nio.ByteBuffer
 
 object DccConfig_PortSelectionModeSerializer : Serializer<IDccConfig.PortSelectionMode> {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/HandshakeVariantMapSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/HandshakeVariantMapSerializer.kt
similarity index 85%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/HandshakeVariantMapSerializer.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/HandshakeVariantMapSerializer.kt
index e928abb827a1fc3f2ef5cef1dd865f4da3a23e30..c9bc28cef9a62cef95f7824d36a2f1b082594a98 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/HandshakeVariantMapSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/HandshakeVariantMapSerializer.kt
@@ -1,7 +1,7 @@
-package de.kuschku.quasseldroid_ng.protocol.primitive.serializer
+package de.kuschku.libquassel.protocol.primitive.serializer
 
-import de.kuschku.quasseldroid_ng.protocol.*
-import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer
+import de.kuschku.libquassel.protocol.*
+import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import java.nio.ByteBuffer
 
 object HandshakeVariantMapSerializer : Serializer<QVariantMap> {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/HostAddressSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/HostAddressSerializer.kt
similarity index 85%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/HostAddressSerializer.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/HostAddressSerializer.kt
index 74c0c61684602fe1975628d3969952d4ed9177f9..d2a8cce1d24d729fd5d06b645e26a452cfe4102d 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/HostAddressSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/HostAddressSerializer.kt
@@ -1,8 +1,8 @@
-package de.kuschku.quasseldroid_ng.protocol.primitive.serializer
+package de.kuschku.libquassel.protocol.primitive.serializer
 
-import de.kuschku.quasseldroid_ng.protocol.NetworkLayerProtocol
-import de.kuschku.quasseldroid_ng.protocol.Quassel_Features
-import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer
+import de.kuschku.libquassel.protocol.NetworkLayerProtocol
+import de.kuschku.libquassel.protocol.Quassel_Features
+import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import java.net.Inet4Address
 import java.net.Inet6Address
 import java.net.InetAddress
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/IntSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/IntSerializer.kt
similarity index 61%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/IntSerializer.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/IntSerializer.kt
index f3c680e22f6b8e070f244fac15a57378054513e8..cf99f23987555fd49ab30f1917fca3a555138869 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/IntSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/IntSerializer.kt
@@ -1,7 +1,7 @@
-package de.kuschku.quasseldroid_ng.protocol.primitive.serializer
+package de.kuschku.libquassel.protocol.primitive.serializer
 
-import de.kuschku.quasseldroid_ng.protocol.Quassel_Features
-import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer
+import de.kuschku.libquassel.protocol.Quassel_Features
+import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import java.nio.ByteBuffer
 
 object IntSerializer : Serializer<Int> {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/LongSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/LongSerializer.kt
similarity index 62%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/LongSerializer.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/LongSerializer.kt
index 2e92c7b1f9c40044d7aa18774bc16a8839bb8239..0cb80b3b2a493f05c10de524bda2209914fac6cb 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/LongSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/LongSerializer.kt
@@ -1,7 +1,7 @@
-package de.kuschku.quasseldroid_ng.protocol.primitive.serializer
+package de.kuschku.libquassel.protocol.primitive.serializer
 
-import de.kuschku.quasseldroid_ng.protocol.Quassel_Features
-import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer
+import de.kuschku.libquassel.protocol.Quassel_Features
+import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import java.nio.ByteBuffer
 
 object LongSerializer : Serializer<Long> {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/MessageSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/MessageSerializer.kt
similarity index 61%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/MessageSerializer.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/MessageSerializer.kt
index 96fe47730cac766385ccda6b9949bb0025c88d10..a8fc39d9b96390bba4a6ad4ba1054235ba865e7a 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/MessageSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/MessageSerializer.kt
@@ -1,19 +1,19 @@
-package de.kuschku.quasseldroid_ng.protocol.primitive.serializer
+package de.kuschku.libquassel.protocol.primitive.serializer
 
-import de.kuschku.quasseldroid_ng.persistence.QuasselDatabase
-import de.kuschku.quasseldroid_ng.protocol.Quassel_Features
-import de.kuschku.quasseldroid_ng.quassel.QuasselFeature
-import de.kuschku.quasseldroid_ng.util.hasFlag
-import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer
+import de.kuschku.libquassel.protocol.Message
+import de.kuschku.libquassel.protocol.Quassel_Features
+import de.kuschku.libquassel.quassel.QuasselFeature
+import de.kuschku.libquassel.util.hasFlag
+import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import org.threeten.bp.Instant
 import java.nio.ByteBuffer
 
-object MessageSerializer : Serializer<QuasselDatabase.RawMessage> {
-  override fun serialize(buffer: ChainedByteBuffer, data: QuasselDatabase.RawMessage,
+object MessageSerializer : Serializer<Message> {
+  override fun serialize(buffer: ChainedByteBuffer, data: Message,
                          features: Quassel_Features) {
     IntSerializer.serialize(buffer, data.messageId, features)
     IntSerializer.serialize(buffer, data.time.epochSecond.toInt(), features)
-    IntSerializer.serialize(buffer, data.type, features)
+    IntSerializer.serialize(buffer, data.type.toInt(), features)
     ByteSerializer.serialize(buffer, data.flag.toByte(), features)
     BufferInfoSerializer.serialize(buffer, data.bufferInfo, features)
     StringSerializer.UTF8.serialize(buffer, data.sender, features)
@@ -23,12 +23,12 @@ object MessageSerializer : Serializer<QuasselDatabase.RawMessage> {
   }
 
   override fun deserialize(buffer: ByteBuffer,
-                           features: Quassel_Features): QuasselDatabase.RawMessage {
-    return QuasselDatabase.RawMessage(
+                           features: Quassel_Features): Message {
+    return Message(
       messageId = IntSerializer.deserialize(buffer, features),
       time = Instant.ofEpochSecond(IntSerializer.deserialize(buffer, features).toLong()),
-      type = QuasselDatabase.Message.MessageType.of(IntSerializer.deserialize(buffer, features)),
-      flag = QuasselDatabase.Message.MessageFlag.of(
+      type = Message.MessageType.of(IntSerializer.deserialize(buffer, features)),
+      flag = Message.MessageFlag.of(
         ByteSerializer.deserialize(buffer, features).toInt()),
       bufferInfo = BufferInfoSerializer.deserialize(buffer, features),
       sender = StringSerializer.UTF8.deserialize(buffer, features) ?: "",
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/ProtocolSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/ProtocolSerializer.kt
similarity index 69%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/ProtocolSerializer.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/ProtocolSerializer.kt
index 69d9aafceb0066e99737cb15580b23e824baea21..90f56d0fbd050d0ff207cd58ca77be6a8da837e0 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/ProtocolSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/ProtocolSerializer.kt
@@ -1,9 +1,9 @@
-package de.kuschku.quasseldroid_ng.protocol.primitive.serializer
+package de.kuschku.libquassel.protocol.primitive.serializer
 
-import de.kuschku.quasseldroid_ng.protocol.Protocol_Features
-import de.kuschku.quasseldroid_ng.protocol.Quassel_Features
-import de.kuschku.quasseldroid_ng.quassel.Protocol
-import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer
+import de.kuschku.libquassel.protocol.Protocol_Features
+import de.kuschku.libquassel.protocol.Quassel_Features
+import de.kuschku.libquassel.quassel.Protocol
+import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import java.nio.ByteBuffer
 
 object ProtocolSerializer : Serializer<Protocol> {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/Serializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/Serializer.kt
similarity index 83%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/Serializer.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/Serializer.kt
index aa3f555667d5687f796372a5a7ea72a509a452e4..9181579fdd436a22928be9ef957e0f8540119383 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/Serializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/Serializer.kt
@@ -15,10 +15,10 @@
  *  with this program.  If not, see <http://www.gnu.org/licenses/>.
  */
 
-package de.kuschku.quasseldroid_ng.protocol.primitive.serializer
+package de.kuschku.libquassel.protocol.primitive.serializer
 
-import de.kuschku.quasseldroid_ng.protocol.Quassel_Features
-import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer
+import de.kuschku.libquassel.protocol.Quassel_Features
+import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import java.nio.ByteBuffer
 
 interface Serializer<T> {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/ShortSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/ShortSerializer.kt
similarity index 62%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/ShortSerializer.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/ShortSerializer.kt
index f9f733e9eced43319b7288af3e6d3b9af20e5ec3..f149673230bdc97bf57f2c4fb300eb87831a20eb 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/ShortSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/ShortSerializer.kt
@@ -1,7 +1,7 @@
-package de.kuschku.quasseldroid_ng.protocol.primitive.serializer
+package de.kuschku.libquassel.protocol.primitive.serializer
 
-import de.kuschku.quasseldroid_ng.protocol.Quassel_Features
-import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer
+import de.kuschku.libquassel.protocol.Quassel_Features
+import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import java.nio.ByteBuffer
 
 object ShortSerializer : Serializer<Short> {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/StringListSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringListSerializer.kt
similarity index 71%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/StringListSerializer.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringListSerializer.kt
index 335094b86e4ba4a112ce7f869343dccd703d137d..680638163b03afce415e6c479a042209b2619455 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/StringListSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringListSerializer.kt
@@ -1,8 +1,8 @@
-package de.kuschku.quasseldroid_ng.protocol.primitive.serializer
+package de.kuschku.libquassel.protocol.primitive.serializer
 
-import de.kuschku.quasseldroid_ng.protocol.QStringList
-import de.kuschku.quasseldroid_ng.protocol.Quassel_Features
-import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer
+import de.kuschku.libquassel.protocol.QStringList
+import de.kuschku.libquassel.protocol.Quassel_Features
+import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import java.nio.ByteBuffer
 
 object StringListSerializer : Serializer<QStringList?> {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/StringSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt
similarity index 90%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/StringSerializer.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt
index ab220637a2bd4b622e6e3d425cd592624002a187..96aa39ac88907554dcf23f4b357d884012f7394d 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/StringSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/StringSerializer.kt
@@ -1,9 +1,9 @@
-package de.kuschku.quasseldroid_ng.protocol.primitive.serializer
+package de.kuschku.libquassel.protocol.primitive.serializer
 
-import de.kuschku.quasseldroid_ng.protocol.QVariant
-import de.kuschku.quasseldroid_ng.protocol.Quassel_Features
-import de.kuschku.quasseldroid_ng.util.helpers.copyTo
-import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer
+import de.kuschku.libquassel.protocol.QVariant
+import de.kuschku.libquassel.protocol.Quassel_Features
+import de.kuschku.libquassel.util.helpers.copyTo
+import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import java.nio.ByteBuffer
 import java.nio.CharBuffer
 import java.nio.charset.Charset
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/TimeSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/TimeSerializer.kt
similarity index 72%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/TimeSerializer.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/TimeSerializer.kt
index 3cbd7d66d557c9331a8dca2011dd520643953a88..8de215d8609e69bacc50309bb6e7dc292f02eb20 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/TimeSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/TimeSerializer.kt
@@ -1,7 +1,7 @@
-package de.kuschku.quasseldroid_ng.protocol.primitive.serializer
+package de.kuschku.libquassel.protocol.primitive.serializer
 
-import de.kuschku.quasseldroid_ng.protocol.Quassel_Features
-import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer
+import de.kuschku.libquassel.protocol.Quassel_Features
+import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import org.threeten.bp.LocalTime
 import java.nio.ByteBuffer
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/VariantListSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantListSerializer.kt
similarity index 69%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/VariantListSerializer.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantListSerializer.kt
index 699e94a00663e3a73712dcb2eccd0b98ce20babb..f4c776ca60aab28f63e622dc157ac99687e284fa 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/VariantListSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantListSerializer.kt
@@ -1,9 +1,9 @@
-package de.kuschku.quasseldroid_ng.protocol.primitive.serializer
+package de.kuschku.libquassel.protocol.primitive.serializer
 
-import de.kuschku.quasseldroid_ng.protocol.QVariantList
-import de.kuschku.quasseldroid_ng.protocol.QVariant_
-import de.kuschku.quasseldroid_ng.protocol.Quassel_Features
-import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer
+import de.kuschku.libquassel.protocol.QVariantList
+import de.kuschku.libquassel.protocol.QVariant_
+import de.kuschku.libquassel.protocol.Quassel_Features
+import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import java.nio.ByteBuffer
 
 object VariantListSerializer : Serializer<QVariantList> {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/VariantMapSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantMapSerializer.kt
similarity index 76%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/VariantMapSerializer.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantMapSerializer.kt
index 732c090703d77f5416ca312a10826b64bcbd8758..21e9f5b965c436a438888f8565a26ff031c8554d 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/VariantMapSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantMapSerializer.kt
@@ -1,8 +1,8 @@
-package de.kuschku.quasseldroid_ng.protocol.primitive.serializer
+package de.kuschku.libquassel.protocol.primitive.serializer
 
-import de.kuschku.quasseldroid_ng.protocol.QVariantMap
-import de.kuschku.quasseldroid_ng.protocol.Quassel_Features
-import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer
+import de.kuschku.libquassel.protocol.QVariantMap
+import de.kuschku.libquassel.protocol.Quassel_Features
+import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import java.nio.ByteBuffer
 
 object VariantMapSerializer : Serializer<QVariantMap> {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/VariantSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantSerializer.kt
similarity index 88%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/VariantSerializer.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantSerializer.kt
index 29fcb18c9f65fa92bcb8052af8d4b7fcb48ac1c2..e54f803522f8d534086204eaf7f61b749061b0b0 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/VariantSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VariantSerializer.kt
@@ -1,7 +1,7 @@
-package de.kuschku.quasseldroid_ng.protocol.primitive.serializer
+package de.kuschku.libquassel.protocol.primitive.serializer
 
-import de.kuschku.quasseldroid_ng.protocol.*
-import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer
+import de.kuschku.libquassel.protocol.*
+import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import java.nio.ByteBuffer
 
 object VariantSerializer : Serializer<QVariant_> {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/VoidSerializer.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VoidSerializer.kt
similarity index 59%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/VoidSerializer.kt
rename to lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VoidSerializer.kt
index e7b172a77def95a812898a252476c28641cef3d3..ff787e21f2255115466dae63648e3a13cc3de24e 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/protocol/primitive/serializer/VoidSerializer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/primitive/serializer/VoidSerializer.kt
@@ -1,7 +1,7 @@
-package de.kuschku.quasseldroid_ng.protocol.primitive.serializer
+package de.kuschku.libquassel.protocol.primitive.serializer
 
-import de.kuschku.quasseldroid_ng.protocol.Quassel_Features
-import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer
+import de.kuschku.libquassel.protocol.Quassel_Features
+import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import java.nio.ByteBuffer
 
 object VoidSerializer : Serializer<Any?> {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/BufferInfo.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/BufferInfo.kt
similarity index 77%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/BufferInfo.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/BufferInfo.kt
index 19c9bb27634b4d4136ac7a9c3db72f349695a303..c4bd1f5d6672c2d21c5f5a5b43c282a099716269 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/BufferInfo.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/BufferInfo.kt
@@ -1,10 +1,10 @@
-package de.kuschku.quasseldroid_ng.quassel
+package de.kuschku.libquassel.quassel
 
-import de.kuschku.quasseldroid_ng.protocol.Buffer_Types
-import de.kuschku.quasseldroid_ng.util.Flag
-import de.kuschku.quasseldroid_ng.util.Flags
-import de.kuschku.quasseldroid_ng.util.ShortFlag
-import de.kuschku.quasseldroid_ng.util.ShortFlags
+import de.kuschku.libquassel.protocol.Buffer_Types
+import de.kuschku.libquassel.util.Flag
+import de.kuschku.libquassel.util.Flags
+import de.kuschku.libquassel.util.ShortFlag
+import de.kuschku.libquassel.util.ShortFlags
 
 data class BufferInfo(var bufferId: Int, var networkId: Int, var type: Buffer_Types,
                       var groupId: Int,
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/NetworkInfo.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/NetworkInfo.kt
new file mode 100644
index 0000000000000000000000000000000000000000..054800e4bde63885f23264c4964e9edc4c329e34
--- /dev/null
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/NetworkInfo.kt
@@ -0,0 +1,2 @@
+package de.kuschku.libquassel.quassel
+
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/ProtocolFeature.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/ProtocolFeature.kt
similarity index 73%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/ProtocolFeature.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/ProtocolFeature.kt
index 034daba495744c1b72f980e44b798236d9258bad..50bc4e18dfcc842b3599fcde44a87cc66526a2c0 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/ProtocolFeature.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/ProtocolFeature.kt
@@ -1,7 +1,7 @@
-package de.kuschku.quasseldroid_ng.quassel
+package de.kuschku.libquassel.quassel
 
-import de.kuschku.quasseldroid_ng.util.Flag
-import de.kuschku.quasseldroid_ng.util.Flags
+import de.kuschku.libquassel.util.Flag
+import de.kuschku.libquassel.util.Flags
 
 enum class ProtocolFeature(override val bit: Int) : Flag<ProtocolFeature> {
   None(0x00),
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/ProtocolMeta.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/ProtocolMeta.kt
new file mode 100644
index 0000000000000000000000000000000000000000..69edb4e989435e7a8a56692fc1aa5aba35938c79
--- /dev/null
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/ProtocolMeta.kt
@@ -0,0 +1,5 @@
+package de.kuschku.libquassel.quassel
+
+import de.kuschku.libquassel.protocol.Protocol_Features
+
+data class Protocol(val flags: Protocol_Features, val data: Short, val version: Byte)
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/QuasselFeature.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/QuasselFeature.kt
similarity index 92%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/QuasselFeature.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/QuasselFeature.kt
index ccfe70cfa180d8bc5f0dee7e19cb31662b678ded..d5c3dec9653df5c62dd441c2f2cb29ba4e32d2bc 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/QuasselFeature.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/QuasselFeature.kt
@@ -1,7 +1,7 @@
-package de.kuschku.quasseldroid_ng.quassel
+package de.kuschku.libquassel.quassel
 
-import de.kuschku.quasseldroid_ng.util.Flag
-import de.kuschku.quasseldroid_ng.util.Flags
+import de.kuschku.libquassel.util.Flag
+import de.kuschku.libquassel.util.Flags
 
 /**
  * A list of features that are optional in core and/or client, but need runtime checking
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/exceptions/ObjectNotFoundException.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/exceptions/ObjectNotFoundException.kt
new file mode 100644
index 0000000000000000000000000000000000000000..34af11446b6a6b07713ea6f841cfe68f85913185
--- /dev/null
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/exceptions/ObjectNotFoundException.kt
@@ -0,0 +1,4 @@
+package de.kuschku.libquassel.quassel.exceptions
+
+data class ObjectNotFoundException(val className: String, val objectName: String) :
+  QuasselException()
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/exceptions/QuasselException.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/exceptions/QuasselException.kt
new file mode 100644
index 0000000000000000000000000000000000000000..26bef0fe7b142f2f589f65ae5b448351463a44eb
--- /dev/null
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/exceptions/QuasselException.kt
@@ -0,0 +1,3 @@
+package de.kuschku.libquassel.quassel.exceptions
+
+abstract class QuasselException : Exception()
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/exceptions/UnknownMethodException.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/exceptions/UnknownMethodException.kt
new file mode 100644
index 0000000000000000000000000000000000000000..dff3ab331dfc050277c200874030a8818f310a92
--- /dev/null
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/exceptions/UnknownMethodException.kt
@@ -0,0 +1,4 @@
+package de.kuschku.libquassel.quassel.exceptions
+
+data class UnknownMethodException(val className: String, val methodName: String) :
+  QuasselException()
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/exceptions/WrongObjectTypeException.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/exceptions/WrongObjectTypeException.kt
new file mode 100644
index 0000000000000000000000000000000000000000..8b303ed49d16aa1f4645310dacb1b6be50a1f458
--- /dev/null
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/exceptions/WrongObjectTypeException.kt
@@ -0,0 +1,3 @@
+package de.kuschku.libquassel.quassel.exceptions
+
+data class WrongObjectTypeException(val obj: Any?, val type: String) : QuasselException()
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/AliasManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/AliasManager.kt
similarity index 90%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/AliasManager.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/AliasManager.kt
index a86219cd4a036390e685a7ba6a83e46d7ba0024c..ab0b657ef432ce8a0ca76aabc9282fcd1e297e64 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/AliasManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/AliasManager.kt
@@ -1,14 +1,14 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables
-
-import de.kuschku.quasseldroid_ng.protocol.QVariantMap
-import de.kuschku.quasseldroid_ng.protocol.QVariant_
-import de.kuschku.quasseldroid_ng.protocol.Type
-import de.kuschku.quasseldroid_ng.protocol.valueOr
-import de.kuschku.quasseldroid_ng.quassel.BufferInfo
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IAliasManager
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IAliasManager.Alias
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.ISyncableObject
-import de.kuschku.quasseldroid_ng.session.SignalProxy
+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.valueOr
+import de.kuschku.libquassel.quassel.BufferInfo
+import de.kuschku.libquassel.quassel.syncables.interfaces.IAliasManager
+import de.kuschku.libquassel.quassel.syncables.interfaces.IAliasManager.Alias
+import de.kuschku.libquassel.quassel.syncables.interfaces.ISyncableObject
+import de.kuschku.libquassel.session.SignalProxy
 import java.util.*
 import java.util.regex.Pattern
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/BacklogManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BacklogManager.kt
similarity index 56%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/BacklogManager.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BacklogManager.kt
index 7c58a3a33c26c4fed2fd5504dd8d111f7850b579..e970e085642917f449cc44d8b284b7d942210498 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/BacklogManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BacklogManager.kt
@@ -1,10 +1,10 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables
+package de.kuschku.libquassel.quassel.syncables
 
-import de.kuschku.quasseldroid_ng.protocol.BufferId
-import de.kuschku.quasseldroid_ng.protocol.MsgId
-import de.kuschku.quasseldroid_ng.protocol.QVariantList
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IBacklogManager
-import de.kuschku.quasseldroid_ng.session.SignalProxy
+import de.kuschku.libquassel.protocol.BufferId
+import de.kuschku.libquassel.protocol.MsgId
+import de.kuschku.libquassel.protocol.QVariantList
+import de.kuschku.libquassel.quassel.syncables.interfaces.IBacklogManager
+import de.kuschku.libquassel.session.SignalProxy
 
 class BacklogManager constructor(
   proxy: SignalProxy
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/BufferSyncer.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt
similarity index 87%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/BufferSyncer.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt
index 91c6ebc7039ff83313caeb1d19773500ef0da9c5..83cca0a1a085cc7a5ffa6b8e029fa0e8d53a58a4 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/BufferSyncer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferSyncer.kt
@@ -1,11 +1,9 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables
+package de.kuschku.libquassel.quassel.syncables
 
-import de.kuschku.quasseldroid_ng.persistence.QuasselDatabase
-import de.kuschku.quasseldroid_ng.protocol.*
-import de.kuschku.quasseldroid_ng.protocol.Type
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IBufferSyncer
-import de.kuschku.quasseldroid_ng.session.SignalProxy
-import de.kuschku.quasseldroid_ng.util.Flags
+import de.kuschku.libquassel.protocol.*
+import de.kuschku.libquassel.protocol.Type
+import de.kuschku.libquassel.quassel.syncables.interfaces.IBufferSyncer
+import de.kuschku.libquassel.session.SignalProxy
 
 class BufferSyncer constructor(
   proxy: SignalProxy
@@ -119,5 +117,5 @@ class BufferSyncer constructor(
 
   private val _lastSeenMsg: MutableMap<BufferId, MsgId> = mutableMapOf()
   private val _markerLines: MutableMap<BufferId, MsgId> = mutableMapOf()
-  private val _bufferActivities: MutableMap<BufferId, Flags<QuasselDatabase.Message.MessageType>> = mutableMapOf()
+  private val _bufferActivities: MutableMap<BufferId, Message_Types> = mutableMapOf()
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/BufferViewConfig.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewConfig.kt
similarity index 96%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/BufferViewConfig.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewConfig.kt
index 29c48f7102e33a87bfba5a7d036fb36dd5877f39..461dfd289c7e63ed2acecfba96d5f59f35d8ec6a 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/BufferViewConfig.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewConfig.kt
@@ -1,10 +1,10 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables
+package de.kuschku.libquassel.quassel.syncables
 
 import clamp
-import de.kuschku.quasseldroid_ng.protocol.*
-import de.kuschku.quasseldroid_ng.protocol.Type
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IBufferViewConfig
-import de.kuschku.quasseldroid_ng.session.SignalProxy
+import de.kuschku.libquassel.protocol.*
+import de.kuschku.libquassel.protocol.Type
+import de.kuschku.libquassel.quassel.syncables.interfaces.IBufferViewConfig
+import de.kuschku.libquassel.session.SignalProxy
 
 class BufferViewConfig constructor(
   bufferViewId: Int,
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/BufferViewManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewManager.kt
similarity index 86%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/BufferViewManager.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewManager.kt
index 7ea65b6f712b1af9c6bd74ecde9dcf8d792685c9..bd8db82d4a4402ff0b88af04608ffcca9f3d227b 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/BufferViewManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/BufferViewManager.kt
@@ -1,8 +1,8 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables
+package de.kuschku.libquassel.quassel.syncables
 
-import de.kuschku.quasseldroid_ng.protocol.*
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IBufferViewManager
-import de.kuschku.quasseldroid_ng.session.SignalProxy
+import de.kuschku.libquassel.protocol.*
+import de.kuschku.libquassel.quassel.syncables.interfaces.IBufferViewManager
+import de.kuschku.libquassel.session.SignalProxy
 
 class BufferViewManager constructor(
   proxy: SignalProxy
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/CertManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/CertManager.kt
similarity index 82%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/CertManager.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/CertManager.kt
index a02fe71772eed9449a94bcb8c1e2afa451488ba4..749d5a59490f7f07e8d1a1aff977ca0bd01c9a7b 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/CertManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/CertManager.kt
@@ -1,8 +1,8 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables
+package de.kuschku.libquassel.quassel.syncables
 
-import de.kuschku.quasseldroid_ng.protocol.*
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.ICertManager
-import de.kuschku.quasseldroid_ng.session.SignalProxy
+import de.kuschku.libquassel.protocol.*
+import de.kuschku.libquassel.quassel.syncables.interfaces.ICertManager
+import de.kuschku.libquassel.session.SignalProxy
 import java.nio.ByteBuffer
 
 class CertManager constructor(
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/CoreInfo.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/CoreInfo.kt
similarity index 63%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/CoreInfo.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/CoreInfo.kt
index 6e29d5c401fd72a4f5936f5c55f20f52bb1582d1..528178b7ce022329157cad1b9702f81ce8e855f0 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/CoreInfo.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/CoreInfo.kt
@@ -1,11 +1,11 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables
-
-import de.kuschku.quasseldroid_ng.protocol.QVariantMap
-import de.kuschku.quasseldroid_ng.protocol.QVariant_
-import de.kuschku.quasseldroid_ng.protocol.Type
-import de.kuschku.quasseldroid_ng.protocol.value
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.ICoreInfo
-import de.kuschku.quasseldroid_ng.session.SignalProxy
+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.quassel.syncables.interfaces.ICoreInfo
+import de.kuschku.libquassel.session.SignalProxy
 
 class CoreInfo constructor(
   proxy: SignalProxy
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/DccConfig.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/DccConfig.kt
similarity index 95%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/DccConfig.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/DccConfig.kt
index 364689678cf6bd16de4064caa328c56117e27058..369d0cc8130eb49a26831052060555f179a9f44c 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/DccConfig.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/DccConfig.kt
@@ -1,8 +1,8 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables
+package de.kuschku.libquassel.quassel.syncables
 
-import de.kuschku.quasseldroid_ng.protocol.*
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IDccConfig
-import de.kuschku.quasseldroid_ng.session.SignalProxy
+import de.kuschku.libquassel.protocol.*
+import de.kuschku.libquassel.quassel.syncables.interfaces.IDccConfig
+import de.kuschku.libquassel.session.SignalProxy
 import java.net.Inet4Address
 import java.net.InetAddress
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/Identity.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Identity.kt
similarity index 96%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/Identity.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Identity.kt
index 1b66db9662eb61297f920ec3ca328831ffde5b9c..fe0f08215cf0bc77d3ccb4ef4293d031ea2ea80a 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/Identity.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Identity.kt
@@ -1,8 +1,8 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables
+package de.kuschku.libquassel.quassel.syncables
 
-import de.kuschku.quasseldroid_ng.protocol.*
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IIdentity
-import de.kuschku.quasseldroid_ng.session.SignalProxy
+import de.kuschku.libquassel.protocol.*
+import de.kuschku.libquassel.quassel.syncables.interfaces.IIdentity
+import de.kuschku.libquassel.session.SignalProxy
 
 class Identity constructor(
   proxy: SignalProxy
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/IgnoreListManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IgnoreListManager.kt
similarity index 67%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/IgnoreListManager.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IgnoreListManager.kt
index c447a2de0b2b376a69ae132fc048c79df23953f5..43b3b8e7cf6cde1e5aba2a489b736d87a740f7f3 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/IgnoreListManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IgnoreListManager.kt
@@ -1,11 +1,11 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables
-
-import de.kuschku.quasseldroid_ng.protocol.QVariantMap
-import de.kuschku.quasseldroid_ng.protocol.QVariant_
-import de.kuschku.quasseldroid_ng.protocol.Type
-import de.kuschku.quasseldroid_ng.protocol.valueOr
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IIgnoreListManager
-import de.kuschku.quasseldroid_ng.session.SignalProxy
+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.valueOr
+import de.kuschku.libquassel.quassel.syncables.interfaces.IIgnoreListManager
+import de.kuschku.libquassel.session.SignalProxy
 
 class IgnoreListManager constructor(
   proxy: SignalProxy
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/IrcChannel.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt
similarity index 96%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/IrcChannel.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt
index 1fb8e0878184dbd0d35db0c625a08e87b7c1382a..9e714c7bff233625f0c7e5788f79f7b5ad066977 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/IrcChannel.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcChannel.kt
@@ -1,11 +1,11 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables
-
-import de.kuschku.quasseldroid_ng.protocol.*
-import de.kuschku.quasseldroid_ng.protocol.Type
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IIrcChannel
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.INetwork
-import de.kuschku.quasseldroid_ng.session.SignalProxy
-import de.kuschku.quasseldroid_ng.util.helpers.getOr
+package de.kuschku.libquassel.quassel.syncables
+
+import de.kuschku.libquassel.protocol.*
+import de.kuschku.libquassel.protocol.Type
+import de.kuschku.libquassel.quassel.syncables.interfaces.IIrcChannel
+import de.kuschku.libquassel.quassel.syncables.interfaces.INetwork
+import de.kuschku.libquassel.session.SignalProxy
+import de.kuschku.libquassel.util.helpers.getOr
 import java.nio.charset.Charset
 
 class IrcChannel(
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/IrcListHelper.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcListHelper.kt
similarity index 51%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/IrcListHelper.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcListHelper.kt
index f61b65bcac1a4e1f1f13e9a397598f6b9cfb5473..ba152be4d891e8d43119d7ea18f785eed07bdce0 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/IrcListHelper.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcListHelper.kt
@@ -1,10 +1,10 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables
+package de.kuschku.libquassel.quassel.syncables
 
-import de.kuschku.quasseldroid_ng.protocol.NetworkId
-import de.kuschku.quasseldroid_ng.protocol.QStringList
-import de.kuschku.quasseldroid_ng.protocol.QVariantList
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IIrcListHelper
-import de.kuschku.quasseldroid_ng.session.SignalProxy
+import de.kuschku.libquassel.protocol.NetworkId
+import de.kuschku.libquassel.protocol.QStringList
+import de.kuschku.libquassel.protocol.QVariantList
+import de.kuschku.libquassel.quassel.syncables.interfaces.IIrcListHelper
+import de.kuschku.libquassel.session.SignalProxy
 
 class IrcListHelper constructor(
   proxy: SignalProxy
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/IrcUser.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcUser.kt
similarity index 97%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/IrcUser.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcUser.kt
index e01b208e05cf7e8c98573dededbe695d62f1e02b..2362c0730f7dbb1431e5b71f5f96fa06748a47bc 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/IrcUser.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/IrcUser.kt
@@ -1,8 +1,8 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables
+package de.kuschku.libquassel.quassel.syncables
 
-import de.kuschku.quasseldroid_ng.protocol.*
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IIrcUser
-import de.kuschku.quasseldroid_ng.session.SignalProxy
+import de.kuschku.libquassel.protocol.*
+import de.kuschku.libquassel.quassel.syncables.interfaces.IIrcUser
+import de.kuschku.libquassel.session.SignalProxy
 import org.threeten.bp.Instant
 import java.nio.charset.Charset
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/Network.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt
similarity index 98%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/Network.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt
index 9cf27b50eb7f39be5c98f972a61e9099d16f87f7..035d12abd44f75785e9eef5163e1b1fcafd8c1c1 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/Network.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/Network.kt
@@ -1,13 +1,13 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables
-
-import de.kuschku.quasseldroid_ng.protocol.*
-import de.kuschku.quasseldroid_ng.protocol.Type
-import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.StringSerializer
-import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.serializeString
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.INetwork
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.INetwork.*
-import de.kuschku.quasseldroid_ng.session.SignalProxy
-import de.kuschku.quasseldroid_ng.util.helpers.getOr
+package de.kuschku.libquassel.quassel.syncables
+
+import de.kuschku.libquassel.protocol.*
+import de.kuschku.libquassel.protocol.Type
+import de.kuschku.libquassel.protocol.primitive.serializer.StringSerializer
+import de.kuschku.libquassel.protocol.primitive.serializer.serializeString
+import de.kuschku.libquassel.quassel.syncables.interfaces.INetwork
+import de.kuschku.libquassel.quassel.syncables.interfaces.INetwork.*
+import de.kuschku.libquassel.session.SignalProxy
+import de.kuschku.libquassel.util.helpers.getOr
 import java.nio.ByteBuffer
 import java.nio.charset.Charset
 import java.util.*
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/NetworkConfig.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/NetworkConfig.kt
similarity index 89%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/NetworkConfig.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/NetworkConfig.kt
index bf719e5ec8fc36d72dcc2ad37059c72141615ca8..3edb35b57ac941600b5058f39e6860b61ee820af 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/NetworkConfig.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/NetworkConfig.kt
@@ -1,11 +1,11 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables
-
-import de.kuschku.quasseldroid_ng.protocol.QVariantMap
-import de.kuschku.quasseldroid_ng.protocol.QVariant_
-import de.kuschku.quasseldroid_ng.protocol.Type
-import de.kuschku.quasseldroid_ng.protocol.value
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.INetworkConfig
-import de.kuschku.quasseldroid_ng.session.SignalProxy
+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.quassel.syncables.interfaces.INetworkConfig
+import de.kuschku.libquassel.session.SignalProxy
 
 class NetworkConfig constructor(
   proxy: SignalProxy
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/RpcHandler.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/RpcHandler.kt
similarity index 65%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/RpcHandler.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/RpcHandler.kt
index c1a63717b2f04b2d1007de145b8a99faf28de80e..4a721f9a632f0c89d1208dfafe51a71c65e7b59c 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/RpcHandler.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/RpcHandler.kt
@@ -1,13 +1,12 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables
-
-import android.net.NetworkInfo
-import de.kuschku.quasseldroid_ng.persistence.QuasselDatabase
-import de.kuschku.quasseldroid_ng.protocol.*
-import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.StringSerializer
-import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.deserializeString
-import de.kuschku.quasseldroid_ng.quassel.BufferInfo
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.IRpcHandler
-import de.kuschku.quasseldroid_ng.session.SignalProxy
+package de.kuschku.libquassel.quassel.syncables
+
+import de.kuschku.libquassel.protocol.*
+import de.kuschku.libquassel.protocol.primitive.serializer.StringSerializer
+import de.kuschku.libquassel.protocol.primitive.serializer.deserializeString
+import de.kuschku.libquassel.quassel.BufferInfo
+import de.kuschku.libquassel.quassel.syncables.interfaces.INetwork
+import de.kuschku.libquassel.quassel.syncables.interfaces.IRpcHandler
+import de.kuschku.libquassel.session.SignalProxy
 import java.nio.ByteBuffer
 
 class RpcHandler(override val proxy: SignalProxy) : IRpcHandler {
@@ -39,7 +38,7 @@ class RpcHandler(override val proxy: SignalProxy) : IRpcHandler {
     proxy.renameObject(classname.deserializeString(StringSerializer.UTF8) ?: "", newname, oldname)
   }
 
-  override fun displayMsg(message: QuasselDatabase.RawMessage) {
+  override fun displayMsg(message: Message) {
     println(message)
   }
 
@@ -49,7 +48,7 @@ class RpcHandler(override val proxy: SignalProxy) : IRpcHandler {
   override fun requestRemoveIdentity(identityId: IdentityId) {
   }
 
-  override fun requestCreateNetwork(networkInfo: NetworkInfo, channels: List<String>) {
+  override fun requestCreateNetwork(networkInfo: INetwork.NetworkInfo, channels: List<String>) {
   }
 
   override fun requestRemoveNetwork(networkId: NetworkId) {
@@ -63,6 +62,7 @@ class RpcHandler(override val proxy: SignalProxy) : IRpcHandler {
   }
 
   override fun sendInput(bufferInfo: BufferInfo, message: String) {
-    RPC("2sendInput(BufferInfo,QString)", ARG(bufferInfo, QType.BufferInfo), ARG(message, Type.QString))
+    RPC("2sendInput(BufferInfo,QString)", ARG(bufferInfo, QType.BufferInfo),
+        ARG(message, Type.QString))
   }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/SyncableObject.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/SyncableObject.kt
similarity index 80%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/SyncableObject.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/SyncableObject.kt
index 5f31fa821f643b46d63af1a5443e1c06f93949d0..03e0cfa823bc7d343490a573c0c6aa8825414964 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/SyncableObject.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/SyncableObject.kt
@@ -1,8 +1,8 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables
+package de.kuschku.libquassel.quassel.syncables
 
-import de.kuschku.quasseldroid_ng.protocol.QVariant_
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.ISyncableObject
-import de.kuschku.quasseldroid_ng.session.SignalProxy
+import de.kuschku.libquassel.protocol.QVariant_
+import de.kuschku.libquassel.quassel.syncables.interfaces.ISyncableObject
+import de.kuschku.libquassel.session.SignalProxy
 
 abstract class SyncableObject(
   protected val proxy: SignalProxy,
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IAliasManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IAliasManager.kt
similarity index 66%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IAliasManager.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IAliasManager.kt
index dd716ec95abed26ae8c48c3219f031cb98f24718..6ca110d250e58c937efdc74a309a6ecd425bfe52 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IAliasManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IAliasManager.kt
@@ -1,12 +1,12 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces
+package de.kuschku.libquassel.quassel.syncables.interfaces
 
 import de.kuschku.libquassel.annotations.Slot
 import de.kuschku.libquassel.annotations.Syncable
-import de.kuschku.quasseldroid_ng.protocol.ARG
-import de.kuschku.quasseldroid_ng.protocol.QVariantMap
-import de.kuschku.quasseldroid_ng.protocol.SLOT
-import de.kuschku.quasseldroid_ng.protocol.Type
-import de.kuschku.quasseldroid_ng.quassel.BufferInfo
+import de.kuschku.libquassel.protocol.ARG
+import de.kuschku.libquassel.protocol.QVariantMap
+import de.kuschku.libquassel.protocol.SLOT
+import de.kuschku.libquassel.protocol.Type
+import de.kuschku.libquassel.quassel.BufferInfo
 
 @Syncable(name = "AliasManager")
 interface IAliasManager : ISyncableObject {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IBacklogManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBacklogManager.kt
similarity index 87%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IBacklogManager.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBacklogManager.kt
index 5f5b80276c9803480180f1b7bf177d72f02e1c17..60d27bbffae6cd001172ba58212e399a97f10752 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IBacklogManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBacklogManager.kt
@@ -1,9 +1,9 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces
+package de.kuschku.libquassel.quassel.syncables.interfaces
 
 import de.kuschku.libquassel.annotations.Slot
 import de.kuschku.libquassel.annotations.Syncable
-import de.kuschku.quasseldroid_ng.protocol.*
-import de.kuschku.quasseldroid_ng.protocol.Type
+import de.kuschku.libquassel.protocol.*
+import de.kuschku.libquassel.protocol.Type
 
 @Syncable(name = "BacklogManager")
 interface IBacklogManager : ISyncableObject {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IBufferSyncer.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBufferSyncer.kt
similarity index 93%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IBufferSyncer.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBufferSyncer.kt
index 6eb035281395d38eac3527215e159106a56afe18..d6bf1e5420d267f6478882047fc05a32e5f40bb4 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IBufferSyncer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBufferSyncer.kt
@@ -1,9 +1,9 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces
+package de.kuschku.libquassel.quassel.syncables.interfaces
 
 import de.kuschku.libquassel.annotations.Slot
 import de.kuschku.libquassel.annotations.Syncable
-import de.kuschku.quasseldroid_ng.protocol.*
-import de.kuschku.quasseldroid_ng.protocol.Type
+import de.kuschku.libquassel.protocol.*
+import de.kuschku.libquassel.protocol.Type
 
 @Syncable(name = "BufferSyncer")
 interface IBufferSyncer : ISyncableObject {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IBufferViewConfig.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBufferViewConfig.kt
similarity index 94%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IBufferViewConfig.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBufferViewConfig.kt
index aad8d651cca3a081ec4b8bcf906fe7d207f9f46a..18ecfce41fd12ad03c89f1f2b2c633d5e08cbd08 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IBufferViewConfig.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBufferViewConfig.kt
@@ -1,9 +1,9 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces
+package de.kuschku.libquassel.quassel.syncables.interfaces
 
 import de.kuschku.libquassel.annotations.Slot
 import de.kuschku.libquassel.annotations.Syncable
-import de.kuschku.quasseldroid_ng.protocol.*
-import de.kuschku.quasseldroid_ng.protocol.Type
+import de.kuschku.libquassel.protocol.*
+import de.kuschku.libquassel.protocol.Type
 
 @Syncable(name = "BufferViewConfig")
 interface IBufferViewConfig : ISyncableObject {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IBufferViewManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBufferViewManager.kt
similarity index 86%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IBufferViewManager.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBufferViewManager.kt
index d3070e86b914014b86166f6ea8f5e661443556e2..53859d2ea68feb0678a5f9fb7857c497b6599d46 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IBufferViewManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IBufferViewManager.kt
@@ -1,9 +1,9 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces
+package de.kuschku.libquassel.quassel.syncables.interfaces
 
 import de.kuschku.libquassel.annotations.Slot
 import de.kuschku.libquassel.annotations.Syncable
-import de.kuschku.quasseldroid_ng.protocol.*
-import de.kuschku.quasseldroid_ng.quassel.syncables.BufferViewConfig
+import de.kuschku.libquassel.protocol.*
+import de.kuschku.libquassel.quassel.syncables.BufferViewConfig
 
 @Syncable(name = "BufferViewManager")
 interface IBufferViewManager : ISyncableObject {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ICertManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/ICertManager.kt
similarity index 68%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ICertManager.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/ICertManager.kt
index aeb559ec414553d82445b158042772a10115725c..62ea085cb48308a1dbe7deeef2dc0e5f952d1a70 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ICertManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/ICertManager.kt
@@ -1,11 +1,11 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces
+package de.kuschku.libquassel.quassel.syncables.interfaces
 
 import de.kuschku.libquassel.annotations.Slot
 import de.kuschku.libquassel.annotations.Syncable
-import de.kuschku.quasseldroid_ng.protocol.ARG
-import de.kuschku.quasseldroid_ng.protocol.QVariantMap
-import de.kuschku.quasseldroid_ng.protocol.SLOT
-import de.kuschku.quasseldroid_ng.protocol.Type
+import de.kuschku.libquassel.protocol.ARG
+import de.kuschku.libquassel.protocol.QVariantMap
+import de.kuschku.libquassel.protocol.SLOT
+import de.kuschku.libquassel.protocol.Type
 import java.nio.ByteBuffer
 
 @Syncable(name = "CertManager")
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ICoreInfo.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/ICoreInfo.kt
similarity index 62%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ICoreInfo.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/ICoreInfo.kt
index ed4b36d42986bb24419264176d03915d4784f36f..d330d24761958299a454a948aa3d6828d9927cd9 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ICoreInfo.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/ICoreInfo.kt
@@ -1,11 +1,11 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces
+package de.kuschku.libquassel.quassel.syncables.interfaces
 
 import de.kuschku.libquassel.annotations.Slot
 import de.kuschku.libquassel.annotations.Syncable
-import de.kuschku.quasseldroid_ng.protocol.ARG
-import de.kuschku.quasseldroid_ng.protocol.QVariantMap
-import de.kuschku.quasseldroid_ng.protocol.SLOT
-import de.kuschku.quasseldroid_ng.protocol.Type
+import de.kuschku.libquassel.protocol.ARG
+import de.kuschku.libquassel.protocol.QVariantMap
+import de.kuschku.libquassel.protocol.SLOT
+import de.kuschku.libquassel.protocol.Type
 
 @Syncable(name = "CoreInfo")
 interface ICoreInfo : ISyncableObject {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IDccConfig.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IDccConfig.kt
similarity index 88%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IDccConfig.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IDccConfig.kt
index d2b9ffda86881e3a5464c0e2d07027ad8bd7ce67..f0168dfd5196b71825f125d75b0de0db09354820 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IDccConfig.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IDccConfig.kt
@@ -1,10 +1,10 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces
+package de.kuschku.libquassel.quassel.syncables.interfaces
 
 import de.kuschku.libquassel.annotations.Slot
 import de.kuschku.libquassel.annotations.Syncable
-import de.kuschku.quasseldroid_ng.protocol.QVariantMap
-import de.kuschku.quasseldroid_ng.protocol.UByte
-import de.kuschku.quasseldroid_ng.protocol.UShort
+import de.kuschku.libquassel.protocol.QVariantMap
+import de.kuschku.libquassel.protocol.UByte
+import de.kuschku.libquassel.protocol.UShort
 import java.net.InetAddress
 
 @Syncable(name = "DccConfig")
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIdentity.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIdentity.kt
similarity index 93%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIdentity.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIdentity.kt
index 53f908d72deb760fce8751bcc8337e1f53ef6dc0..408584ce5a5df1edeec4f8e5ee1f1226f90d7ee2 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIdentity.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIdentity.kt
@@ -1,9 +1,9 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces
+package de.kuschku.libquassel.quassel.syncables.interfaces
 
 import de.kuschku.libquassel.annotations.Slot
 import de.kuschku.libquassel.annotations.Syncable
-import de.kuschku.quasseldroid_ng.protocol.*
-import de.kuschku.quasseldroid_ng.protocol.Type
+import de.kuschku.libquassel.protocol.*
+import de.kuschku.libquassel.protocol.Type
 
 @Syncable(name = "Identity")
 interface IIdentity : ISyncableObject {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIgnoreListManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIgnoreListManager.kt
similarity index 83%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIgnoreListManager.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIgnoreListManager.kt
index ce3debcf2a4abe7c122509dfa5fb4a7dbb887938..96339a9c7ca535daccc715c9ece754a2b4182621 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIgnoreListManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIgnoreListManager.kt
@@ -1,11 +1,11 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces
+package de.kuschku.libquassel.quassel.syncables.interfaces
 
 import de.kuschku.libquassel.annotations.Slot
 import de.kuschku.libquassel.annotations.Syncable
-import de.kuschku.quasseldroid_ng.protocol.ARG
-import de.kuschku.quasseldroid_ng.protocol.QVariantMap
-import de.kuschku.quasseldroid_ng.protocol.SLOT
-import de.kuschku.quasseldroid_ng.protocol.Type
+import de.kuschku.libquassel.protocol.ARG
+import de.kuschku.libquassel.protocol.QVariantMap
+import de.kuschku.libquassel.protocol.SLOT
+import de.kuschku.libquassel.protocol.Type
 
 @Syncable(name = "IgnoreListManager")
 interface IIgnoreListManager : ISyncableObject {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIrcChannel.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcChannel.kt
similarity index 92%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIrcChannel.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcChannel.kt
index be399ae137de619b3253e0c8c69514105825096b..a1c7a79fe43c4e4b185bdaba0e5898faf187554a 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIrcChannel.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcChannel.kt
@@ -1,9 +1,9 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces
+package de.kuschku.libquassel.quassel.syncables.interfaces
 
 import de.kuschku.libquassel.annotations.Slot
 import de.kuschku.libquassel.annotations.Syncable
-import de.kuschku.quasseldroid_ng.protocol.*
-import de.kuschku.quasseldroid_ng.quassel.syncables.IrcUser
+import de.kuschku.libquassel.protocol.*
+import de.kuschku.libquassel.quassel.syncables.IrcUser
 
 @Syncable(name = "IrcChannel")
 interface IIrcChannel : ISyncableObject {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIrcListHelper.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcListHelper.kt
similarity index 83%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIrcListHelper.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcListHelper.kt
index 19e96224a4d0708088d75eeacf68158028b2f60e..b54abede3c7b763eea9c7914789e1e79189585c9 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIrcListHelper.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcListHelper.kt
@@ -1,9 +1,9 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces
+package de.kuschku.libquassel.quassel.syncables.interfaces
 
 import de.kuschku.libquassel.annotations.Slot
 import de.kuschku.libquassel.annotations.Syncable
-import de.kuschku.quasseldroid_ng.protocol.*
-import de.kuschku.quasseldroid_ng.protocol.Type
+import de.kuschku.libquassel.protocol.*
+import de.kuschku.libquassel.protocol.Type
 
 @Syncable(name = "IrcListHelper")
 interface IIrcListHelper : ISyncableObject {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIrcUser.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcUser.kt
similarity index 88%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIrcUser.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcUser.kt
index 894a7c2e3982c4565aee0c8a935a3a539f461784..92ee8d466d35a2c8537b9f0c69bd3c54db8cbdd8 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IIrcUser.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IIrcUser.kt
@@ -1,12 +1,12 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces
+package de.kuschku.libquassel.quassel.syncables.interfaces
 
 import de.kuschku.libquassel.annotations.Slot
 import de.kuschku.libquassel.annotations.Syncable
-import de.kuschku.quasseldroid_ng.protocol.ARG
-import de.kuschku.quasseldroid_ng.protocol.QVariantMap
-import de.kuschku.quasseldroid_ng.protocol.SLOT
-import de.kuschku.quasseldroid_ng.protocol.Type
-import de.kuschku.quasseldroid_ng.quassel.syncables.IrcChannel
+import de.kuschku.libquassel.protocol.ARG
+import de.kuschku.libquassel.protocol.QVariantMap
+import de.kuschku.libquassel.protocol.SLOT
+import de.kuschku.libquassel.protocol.Type
+import de.kuschku.libquassel.quassel.syncables.IrcChannel
 import org.threeten.bp.Instant
 
 @Syncable(name = "IrcUser")
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/INetwork.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/INetwork.kt
similarity index 98%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/INetwork.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/INetwork.kt
index 35901ff72842df60634e9d40927e8175d3beb88b..4e7079cd5537deb82029a384b9ccbb960f5091a1 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/INetwork.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/INetwork.kt
@@ -1,10 +1,10 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces
+package de.kuschku.libquassel.quassel.syncables.interfaces
 
 import de.kuschku.libquassel.annotations.Slot
 import de.kuschku.libquassel.annotations.Syncable
-import de.kuschku.quasseldroid_ng.protocol.*
-import de.kuschku.quasseldroid_ng.util.Flag
-import de.kuschku.quasseldroid_ng.util.Flags
+import de.kuschku.libquassel.protocol.*
+import de.kuschku.libquassel.util.Flag
+import de.kuschku.libquassel.util.Flags
 import java.nio.ByteBuffer
 
 @Syncable(name = "Network")
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/INetworkConfig.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/INetworkConfig.kt
similarity index 87%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/INetworkConfig.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/INetworkConfig.kt
index a831ef7c1ee38c87ff5c88eb9a0c49d6455f46e1..e8a54254cb07014a382cc5026d7a9517fc464f55 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/INetworkConfig.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/INetworkConfig.kt
@@ -1,11 +1,11 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces
+package de.kuschku.libquassel.quassel.syncables.interfaces
 
 import de.kuschku.libquassel.annotations.Slot
 import de.kuschku.libquassel.annotations.Syncable
-import de.kuschku.quasseldroid_ng.protocol.ARG
-import de.kuschku.quasseldroid_ng.protocol.QVariantMap
-import de.kuschku.quasseldroid_ng.protocol.SLOT
-import de.kuschku.quasseldroid_ng.protocol.Type
+import de.kuschku.libquassel.protocol.ARG
+import de.kuschku.libquassel.protocol.QVariantMap
+import de.kuschku.libquassel.protocol.SLOT
+import de.kuschku.libquassel.protocol.Type
 
 @Syncable(name = "NetworkConfig")
 interface INetworkConfig : ISyncableObject {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IRpcHandler.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IRpcHandler.kt
similarity index 70%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IRpcHandler.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IRpcHandler.kt
index 3b748bbce6e1890ecc3f9f8921a9d591f62424a0..a6425be5d1bd2cb9709fd564907fdbf01fe65ecd 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/IRpcHandler.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/IRpcHandler.kt
@@ -1,15 +1,10 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces
+package de.kuschku.libquassel.quassel.syncables.interfaces
 
-import android.net.NetworkInfo
 import de.kuschku.libquassel.annotations.Slot
 import de.kuschku.libquassel.annotations.Syncable
-import de.kuschku.quasseldroid_ng.persistence.QuasselDatabase
-import de.kuschku.quasseldroid_ng.protocol.IdentityId
-import de.kuschku.quasseldroid_ng.protocol.NetworkId
-import de.kuschku.quasseldroid_ng.protocol.QVariantMap
-import de.kuschku.quasseldroid_ng.protocol.QVariant_
-import de.kuschku.quasseldroid_ng.quassel.BufferInfo
-import de.kuschku.quasseldroid_ng.session.SignalProxy
+import de.kuschku.libquassel.protocol.*
+import de.kuschku.libquassel.quassel.BufferInfo
+import de.kuschku.libquassel.session.SignalProxy
 import java.nio.ByteBuffer
 
 @Syncable(name = "RpcHandler")
@@ -21,7 +16,7 @@ interface IRpcHandler {
   fun objectRenamed(classname: ByteBuffer, newname: String, oldname: String)
 
   @Slot("2displayMsg(Message)")
-  fun displayMsg(message: QuasselDatabase.RawMessage)
+  fun displayMsg(message: Message)
 
   @Slot("2displayStatusMsg(QString,QString)")
   fun displayStatusMsg(net: String, msg: String)
@@ -49,7 +44,7 @@ interface IRpcHandler {
 
   fun requestCreateIdentity(identity: QVariantMap, additional: QVariantMap)
   fun requestRemoveIdentity(identityId: IdentityId)
-  fun requestCreateNetwork(networkInfo: NetworkInfo, channels: List<String>)
+  fun requestCreateNetwork(networkInfo: INetwork.NetworkInfo, channels: List<String>)
   fun requestRemoveNetwork(networkId: NetworkId)
   fun requestPasswordChange(peerPtr: Long, user: String, old: String, new: String)
   fun requestKickClient(id: Int)
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ISyncableObject.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/ISyncableObject.kt
similarity index 84%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ISyncableObject.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/ISyncableObject.kt
index 4a31961c86ddc7ed42193b753981da7f3ecf8de4..b5dc4f4e0d3665f1b95b7f115ff838cd9fea696f 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ISyncableObject.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/ISyncableObject.kt
@@ -1,6 +1,6 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces
+package de.kuschku.libquassel.quassel.syncables.interfaces
 
-import de.kuschku.quasseldroid_ng.protocol.*
+import de.kuschku.libquassel.protocol.*
 
 interface ISyncableObject {
   val objectName: String
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ITransfer.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/ITransfer.kt
similarity index 86%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ITransfer.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/ITransfer.kt
index 17377d42e105c9216ff11e671a3d1152780a6f38..0573f212c5fd676d21ad633c563d2995460436fa 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ITransfer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/ITransfer.kt
@@ -1,8 +1,8 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces
+package de.kuschku.libquassel.quassel.syncables.interfaces
 
 import de.kuschku.libquassel.annotations.Slot
 import de.kuschku.libquassel.annotations.Syncable
-import de.kuschku.quasseldroid_ng.protocol.QVariantMap
+import de.kuschku.libquassel.protocol.QVariantMap
 import java.nio.ByteBuffer
 
 @Syncable(name = "Transfer")
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ITransferManager.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/ITransferManager.kt
similarity index 77%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ITransferManager.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/ITransferManager.kt
index 7ea2862c779653392741f70d4254e343a1af6e47..22f494742793f83339dd34e1b7373c8f61c6d185 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/ITransferManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/ITransferManager.kt
@@ -1,8 +1,8 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces
+package de.kuschku.libquassel.quassel.syncables.interfaces
 
 import de.kuschku.libquassel.annotations.Slot
 import de.kuschku.libquassel.annotations.Syncable
-import de.kuschku.quasseldroid_ng.protocol.QVariantMap
+import de.kuschku.libquassel.protocol.QVariantMap
 import java.util.*
 
 @Syncable(name = "TransferManager")
diff --git a/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/invokers/Invoker.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/invokers/Invoker.kt
new file mode 100644
index 0000000000000000000000000000000000000000..6fa97e09be99952dec40539c55635a4f84c6796e
--- /dev/null
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/invokers/Invoker.kt
@@ -0,0 +1,11 @@
+package de.kuschku.libquassel.quassel.syncables.interfaces.invokers
+
+import de.kuschku.libquassel.protocol.QVariantList
+import de.kuschku.libquassel.quassel.exceptions.UnknownMethodException
+import de.kuschku.libquassel.quassel.exceptions.WrongObjectTypeException
+
+interface Invoker<out T> {
+  val className: String
+  @Throws(WrongObjectTypeException::class, UnknownMethodException::class)
+  fun invoke(on: Any?, method: String, params: QVariantList)
+}
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/invokers/Invokers.kt b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/invokers/Invokers.kt
similarity index 73%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/invokers/Invokers.kt
rename to lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/invokers/Invokers.kt
index dec0c0a616ae0c7303bd22eb32dea5929383b567..8e6f17e168b150956362a4bc532e72ac989a0a6a 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/quassel/syncables/interfaces/invokers/Invokers.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/quassel/syncables/interfaces/invokers/Invokers.kt
@@ -1,12 +1,13 @@
-package de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.invokers
+package de.kuschku.libquassel.quassel.syncables.interfaces.invokers
 
 import de.kuschku.libquassel.annotations.Syncable
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.*
-import de.kuschku.quasseldroid_ng.util.helpers.Logger
-import de.kuschku.quasseldroid_ng.util.helpers.debug
-import de.kuschku.quasseldroid_ng.util.helpers.warn
+import de.kuschku.libquassel.quassel.syncables.interfaces.*
+import java.util.logging.Level
+import java.util.logging.Logger
 
 object Invokers {
+  private val logger = Logger.getLogger("Invokers")
+
   private val registry = mutableMapOf<String, Invoker<*>>()
   fun get(name: String) = registry[name]
 
@@ -36,7 +37,7 @@ object Invokers {
 
     RPC = invoker()
 
-    Logger.debug("Invokers::init", "$size invokers registered")
+    logger.log(Level.FINEST, "$size invokers registered")
   }
 
   private inline fun <reified T> invoker(): Invoker<T>? = getInvoker(T::class.java)
@@ -44,7 +45,7 @@ object Invokers {
   private fun <T> getInvoker(type: Class<T>): Invoker<T>? {
     val syncable: Syncable? = type.getAnnotation(Syncable::class.java)
     if (syncable == null) {
-      Logger.warn("Invokers::register", "Invoker not annotated: ${type.canonicalName}")
+      logger.log(Level.WARNING, "Invoker not annotated: ${type.canonicalName}")
       return null
     }
 
@@ -53,8 +54,8 @@ object Invokers {
     val klass = Class.forName("$packageName.$className")
     val invoker = klass.getDeclaredField("INSTANCE").get(null)
     if (invoker !is Invoker<*>) {
-      Logger.warn("Invokers::register",
-                  "Invoker not of proper type: ${type.canonicalName} != ${invoker.javaClass.canonicalName}")
+      logger.log(Level.WARNING,
+                 "Invoker not of proper type: ${type.canonicalName} != ${invoker.javaClass.canonicalName}")
       return null
     }
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/session/AuthHandler.kt b/lib/src/main/java/de/kuschku/libquassel/session/AuthHandler.kt
similarity index 92%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/session/AuthHandler.kt
rename to lib/src/main/java/de/kuschku/libquassel/session/AuthHandler.kt
index ea244129b5b9cebcb325f3ec2ba8c5897e98f854..57f76686b124691348cb6f5c21bf1ac5c0f0e043 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/session/AuthHandler.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/AuthHandler.kt
@@ -1,6 +1,6 @@
-package de.kuschku.quasseldroid_ng.session
+package de.kuschku.libquassel.session
 
-import de.kuschku.quasseldroid_ng.protocol.HandshakeMessage
+import de.kuschku.libquassel.protocol.HandshakeMessage
 
 interface AuthHandler {
   fun handle(function: HandshakeMessage.ClientInit) {}
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/session/Backend.kt b/lib/src/main/java/de/kuschku/libquassel/session/Backend.kt
similarity index 51%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/session/Backend.kt
rename to lib/src/main/java/de/kuschku/libquassel/session/Backend.kt
index b63b7458c709b2fdf9af1a5bc8a649ec1ba8d5dc..904e78e92f563000bf14de62478fffea885586a7 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/session/Backend.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/Backend.kt
@@ -1,10 +1,7 @@
-package de.kuschku.quasseldroid_ng.session
-
-import android.arch.lifecycle.LiveData
+package de.kuschku.libquassel.session
 
 interface Backend {
   fun connect(address: SocketAddress, user: String, pass: String)
   fun disconnect()
   fun session(): Session
-  val status: LiveData<ConnectionState>
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/session/ConnectionState.kt b/lib/src/main/java/de/kuschku/libquassel/session/ConnectionState.kt
similarity index 69%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/session/ConnectionState.kt
rename to lib/src/main/java/de/kuschku/libquassel/session/ConnectionState.kt
index 4da076241e9a29b206dea524f76bf30ddf18921c..1647d13cb33f093297bd6ff9a01895b0d846f345 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/session/ConnectionState.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/ConnectionState.kt
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid_ng.session
+package de.kuschku.libquassel.session
 
 enum class ConnectionState {
   DISCONNECTED,
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/session/CoreConnection.kt b/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt
similarity index 62%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/session/CoreConnection.kt
rename to lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt
index f5e2c5a43adc0d1638aafb4d14e38135a7ec20ab..f780f094139ef5b7e901eb3f99be9f702ade2e58 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/session/CoreConnection.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/CoreConnection.kt
@@ -1,58 +1,47 @@
-package de.kuschku.quasseldroid_ng.session
-
-import android.arch.lifecycle.MutableLiveData
-import android.os.Handler
-import android.os.HandlerThread
-import android.os.Process
-import de.kuschku.quasseldroid_ng.protocol.HandshakeMessage
-import de.kuschku.quasseldroid_ng.protocol.Quassel_Feature
-import de.kuschku.quasseldroid_ng.protocol.Quassel_Features
-import de.kuschku.quasseldroid_ng.protocol.SignalProxyMessage
-import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.HandshakeVariantMapSerializer
-import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.IntSerializer
-import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.ProtocolSerializer
-import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.VariantListSerializer
-import de.kuschku.quasseldroid_ng.quassel.ProtocolFeature
-import de.kuschku.quasseldroid_ng.util.CompatibilityUtils
-import de.kuschku.quasseldroid_ng.util.hasFlag
-import de.kuschku.quasseldroid_ng.util.helpers.*
-import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer
-import de.kuschku.quasseldroid_ng.util.nio.WrappedChannel
+package de.kuschku.libquassel.session
+
+import de.kuschku.libquassel.protocol.HandshakeMessage
+import de.kuschku.libquassel.protocol.Quassel_Feature
+import de.kuschku.libquassel.protocol.Quassel_Features
+import de.kuschku.libquassel.protocol.SignalProxyMessage
+import de.kuschku.libquassel.protocol.primitive.serializer.HandshakeVariantMapSerializer
+import de.kuschku.libquassel.protocol.primitive.serializer.IntSerializer
+import de.kuschku.libquassel.protocol.primitive.serializer.ProtocolSerializer
+import de.kuschku.libquassel.protocol.primitive.serializer.VariantListSerializer
+import de.kuschku.libquassel.quassel.ProtocolFeature
+import de.kuschku.libquassel.util.CompatibilityUtils
+import de.kuschku.libquassel.util.HandlerService
+import de.kuschku.libquassel.util.hasFlag
+import de.kuschku.libquassel.util.helpers.write
+import de.kuschku.libquassel.util.nio.ChainedByteBuffer
+import de.kuschku.libquassel.util.nio.WrappedChannel
 import org.threeten.bp.ZoneOffset
 import org.threeten.bp.format.DateTimeFormatter
 import java.lang.Thread.UncaughtExceptionHandler
 import java.net.Socket
 import java.net.SocketException
 import java.nio.ByteBuffer
+import java.util.logging.Level
+import java.util.logging.Logger
 
 class CoreConnection(
   private val session: Session,
-  private val address: SocketAddress
+  private val address: SocketAddress,
+  private val handlerService: HandlerService
 ) : Thread() {
-  private val parseThread = HandlerThread("parse", Process.THREAD_PRIORITY_BACKGROUND)
-  private val writeThread = HandlerThread("write", Process.THREAD_PRIORITY_BACKGROUND)
-  private val backendThread = HandlerThread("backend", Process.THREAD_PRIORITY_BACKGROUND)
-  private lateinit var parseHandler: Handler
-  private lateinit var writeHandler: Handler
-  private lateinit var backendHandler: Handler
+  private val logger = Logger.getLogger("CoreConnection")
 
   private val exceptionHandler = UncaughtExceptionHandler { thread, throwable ->
-    Logger.error(thread.name, "", throwable)
+    logger.log(Level.WARNING, thread.name, throwable)
   }
 
   private val sizeBuffer = ByteBuffer.allocateDirect(4)
   private val chainedBuffer = ChainedByteBuffer(direct = true)
-  val liveState = MutableLiveData<ConnectionState>()
-
-  init {
-    liveState.value = ConnectionState.DISCONNECTED
-  }
 
   var state = ConnectionState.DISCONNECTED
     set(value) {
       field = value
-      Logger.debug("CoreConnection", "Connection state changed to $state")
-      liveState.postValue(value)
+      logger.log(Level.FINEST, "Connection state changed to $state")
     }
 
   private var channel: WrappedChannel? = null
@@ -60,19 +49,11 @@ class CoreConnection(
   private fun connect() {
     state = ConnectionState.CONNECTING
     val socket = Socket()
-    if (CompatibilityUtils.deviceSupportsKeepAlive())
+    if (CompatibilityUtils.supportsKeepAlive)
       socket.keepAlive = true
     socket.connect(address.data(), 10_000)
+    handlerService.exceptionHandler = exceptionHandler
     channel = WrappedChannel.ofSocket(socket)
-    parseThread.uncaughtExceptionHandler = exceptionHandler
-    writeThread.uncaughtExceptionHandler = exceptionHandler
-    backendThread.uncaughtExceptionHandler = exceptionHandler
-    parseThread.start()
-    writeThread.start()
-    backendThread.start()
-    parseHandler = Handler(parseThread.looper)
-    writeHandler = Handler(writeThread.looper)
-    backendHandler = Handler(backendThread.looper)
   }
 
   private fun sendHandshake() {
@@ -125,14 +106,12 @@ class CoreConnection(
 
   fun close() {
     interrupt()
-    parseThread.quit()
-    writeThread.quit()
-    backendThread.quit()
+    handlerService.quit()
     val thread = Thread {
       try {
         channel?.close()
       } catch (e: Throwable) {
-        Logger.warn("ConnectionClosing", "", e)
+        logger.log(Level.WARNING, "Error encountered while closing connection", e)
       }
     }
     thread.start()
@@ -140,28 +119,28 @@ class CoreConnection(
   }
 
   fun dispatch(message: HandshakeMessage) {
-    parseHandler.post {
+    handlerService.parse {
       try {
         val data = HandshakeMessage.serialize(message)
-        writeHandler.post(
+        handlerService.write(
           MessageRunnable(data, HandshakeVariantMapSerializer, chainedBuffer, channel,
                           session.coreFeatures)
         )
       } catch (e: Throwable) {
-        Logger.warn("HandshakeSerializing", "", e)
+        logger.log(Level.WARNING, "Error encountered while serializing handshake message", e)
       }
     }
   }
 
   fun dispatch(message: SignalProxyMessage) {
-    parseHandler.post {
+    handlerService.parse {
       try {
         val data = SignalProxyMessage.serialize(message)
-        writeHandler.post(
+        handlerService.write(
           MessageRunnable(data, VariantListSerializer, chainedBuffer, channel, session.coreFeatures)
         )
       } catch (e: Throwable) {
-        Logger.warn("MessageSerializing", "", e)
+        logger.log(Level.WARNING, "Error encountered while serializing sigproxy message", e)
       }
     }
   }
@@ -183,7 +162,7 @@ class CoreConnection(
         while (dataBuffer.position() < dataBuffer.limit() && channel?.read(dataBuffer) ?: -1 > 0) {
         }
         dataBuffer.flip()
-        parseHandler.post {
+        handlerService.parse {
           when (state) {
             ConnectionState.HANDSHAKE -> {
               try {
@@ -193,10 +172,10 @@ class CoreConnection(
                 try {
                   session.handle(msg)
                 } catch (e: Throwable) {
-                  Logger.warn("HandshakeHandling", "", e)
+                  logger.log(Level.WARNING, "Error encountered while handling handshake message", e)
                 }
               } catch (e: Throwable) {
-                Logger.warn("HandshakeParsing", "", e)
+                logger.log(Level.WARNING, "Error encountered while parsing handshake message", e)
               }
             }
             else                      ->
@@ -204,21 +183,22 @@ class CoreConnection(
                 val msg = SignalProxyMessage.deserialize(
                   VariantListSerializer.deserialize(dataBuffer, session.coreFeatures)
                 )
-                backendHandler.post {
+                handlerService.handle {
                   try {
                     session.handle(msg)
                   } catch (e: Throwable) {
-                    Logger.warn("MessageHandling", "", e)
+                    logger.log(Level.WARNING, "Error encountered while handling sigproxy message",
+                               e)
                   }
                 }
               } catch (e: Throwable) {
-                Logger.warn("MessageParsing", "", e)
+                logger.log(Level.WARNING, "Error encountered while parsing sigproxy message", e)
               }
           }
         }
       }
     } catch (e: Throwable) {
-      Logger.warn("CoreConnection", "", e)
+      logger.log(Level.WARNING, "Error encountered in connection", e)
       state = ConnectionState.DISCONNECTED
     }
   }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/session/MessageRunnable.kt b/lib/src/main/java/de/kuschku/libquassel/session/MessageRunnable.kt
similarity index 54%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/session/MessageRunnable.kt
rename to lib/src/main/java/de/kuschku/libquassel/session/MessageRunnable.kt
index f2449d847297662b0e788f8e6161e8e5ca5e6926..e525db9f785a8a69d52528e7763a540cbafa8cbb 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/session/MessageRunnable.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/MessageRunnable.kt
@@ -1,13 +1,13 @@
-package de.kuschku.quasseldroid_ng.session
+package de.kuschku.libquassel.session
 
-import de.kuschku.quasseldroid_ng.protocol.Quassel_Features
-import de.kuschku.quasseldroid_ng.protocol.primitive.serializer.Serializer
-import de.kuschku.quasseldroid_ng.util.helpers.Logger
-import de.kuschku.quasseldroid_ng.util.helpers.warn
-import de.kuschku.quasseldroid_ng.util.helpers.write
-import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer
-import de.kuschku.quasseldroid_ng.util.nio.WrappedChannel
+import de.kuschku.libquassel.protocol.Quassel_Features
+import de.kuschku.libquassel.protocol.primitive.serializer.Serializer
+import de.kuschku.libquassel.util.helpers.write
+import de.kuschku.libquassel.util.nio.ChainedByteBuffer
+import de.kuschku.libquassel.util.nio.WrappedChannel
 import java.nio.ByteBuffer
+import java.util.logging.Level
+import java.util.logging.Logger
 
 class MessageRunnable<T>(
   private val data: T,
@@ -26,7 +26,7 @@ class MessageRunnable<T>(
       channel?.write(chainedBuffer)
       channel?.flush()
     } catch (e: Throwable) {
-      Logger.warn("MessageDispatching", "", e)
+      Logger.getLogger("MessageDispatching").log(Level.WARNING, "", e)
     }
   }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/session/ObjectStorage.kt b/lib/src/main/java/de/kuschku/libquassel/session/ObjectStorage.kt
similarity index 70%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/session/ObjectStorage.kt
rename to lib/src/main/java/de/kuschku/libquassel/session/ObjectStorage.kt
index 23b88d55cc06b7c84ecace82565b519209a3071c..6ded8aeba3ae34aa2a0f28d5b6ca90c56c816111 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/session/ObjectStorage.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/ObjectStorage.kt
@@ -1,11 +1,11 @@
-package de.kuschku.quasseldroid_ng.session
+package de.kuschku.libquassel.session
 
-import de.kuschku.quasseldroid_ng.ObjectNotFoundException
-import de.kuschku.quasseldroid_ng.protocol.QType
-import de.kuschku.quasseldroid_ng.protocol.QVariant_
-import de.kuschku.quasseldroid_ng.protocol.SignalProxyMessage
-import de.kuschku.quasseldroid_ng.protocol.Type
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.ISyncableObject
+import de.kuschku.libquassel.protocol.QType
+import de.kuschku.libquassel.protocol.QVariant_
+import de.kuschku.libquassel.protocol.SignalProxyMessage
+import de.kuschku.libquassel.protocol.Type
+import de.kuschku.libquassel.quassel.exceptions.ObjectNotFoundException
+import de.kuschku.libquassel.quassel.syncables.interfaces.ISyncableObject
 
 class ObjectStorage(private val proxy: SignalProxy) {
   private val objectTree: MutableMap<String, ISyncableObject> = HashMap()
@@ -30,4 +30,6 @@ class ObjectStorage(private val proxy: SignalProxy) {
 
   fun get(className: QType, objectName: String) = get(className.typeName, objectName)
   fun get(className: String, objectName: String) = objectTree["$className:$objectName"]
+
+  fun clear() = objectTree.clear()
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/session/ProtocolHandler.kt b/lib/src/main/java/de/kuschku/libquassel/session/ProtocolHandler.kt
similarity index 80%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/session/ProtocolHandler.kt
rename to lib/src/main/java/de/kuschku/libquassel/session/ProtocolHandler.kt
index 2f85c8f217077eb186719160cacd8d8916638a82..1fb303584d3a8ffae0e31faccf65d63e318e976a 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/session/ProtocolHandler.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/ProtocolHandler.kt
@@ -1,18 +1,21 @@
-package de.kuschku.quasseldroid_ng.session
-
-import de.kuschku.quasseldroid_ng.ObjectNotFoundException
-import de.kuschku.quasseldroid_ng.protocol.HandshakeMessage
-import de.kuschku.quasseldroid_ng.protocol.QVariant_
-import de.kuschku.quasseldroid_ng.protocol.SignalProxyMessage
-import de.kuschku.quasseldroid_ng.quassel.syncables.RpcHandler
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.ISyncableObject
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.invokers.Invokers
-import de.kuschku.quasseldroid_ng.util.helpers.Logger
-import de.kuschku.quasseldroid_ng.util.helpers.debug
-import de.kuschku.quasseldroid_ng.util.helpers.warn
+package de.kuschku.libquassel.session
+
+import de.kuschku.libquassel.protocol.HandshakeMessage
+import de.kuschku.libquassel.protocol.QVariant_
+import de.kuschku.libquassel.protocol.SignalProxyMessage
+import de.kuschku.libquassel.quassel.exceptions.ObjectNotFoundException
+import de.kuschku.libquassel.quassel.syncables.RpcHandler
+import de.kuschku.libquassel.quassel.syncables.interfaces.ISyncableObject
+import de.kuschku.libquassel.quassel.syncables.interfaces.invokers.Invokers
 import org.threeten.bp.Instant
+import java.util.logging.Level
+import java.util.logging.Logger
 
 abstract class ProtocolHandler : SignalProxy, AuthHandler {
+  companion object {
+    private val logger = Logger.getLogger("ProtocolHandler")
+  }
+
   private val objectStorage: ObjectStorage = ObjectStorage(this)
   protected val rpcHandler: RpcHandler = RpcHandler(this)
 
@@ -31,7 +34,7 @@ abstract class ProtocolHandler : SignalProxy, AuthHandler {
     try {
       super<SignalProxy>.handle(f)
     } catch (e: Throwable) {
-      Logger.warn("ProtocolHandler", "", e)
+      logger.log(Level.SEVERE, "Error Handling SignalProxyMessage", e)
     }
   }
 
@@ -39,12 +42,12 @@ abstract class ProtocolHandler : SignalProxy, AuthHandler {
     try {
       super<AuthHandler>.handle(function)
     } catch (e: Throwable) {
-      Logger.warn("ProtocolHandler", "", e)
+      logger.log(Level.SEVERE, "Error Handling HandshakeMessage", e)
     }
   }
 
   override fun handle(f: SignalProxyMessage.InitData) {
-    Logger.debug("<", f.toString())
+    logger.log(Level.FINEST, "< $f")
     val obj: ISyncableObject = objectStorage.get(f.className, f.objectName)
       ?: throw ObjectNotFoundException(f.className, f.objectName)
 
@@ -70,7 +73,7 @@ abstract class ProtocolHandler : SignalProxy, AuthHandler {
         syncQueue.add(f)
         return
       } else {
-        Logger.debug("<", f.toString())
+        logger.log(Level.FINEST, "< $f")
         throw ObjectNotFoundException(f.className, f.objectName)
       }
     }
@@ -81,7 +84,7 @@ abstract class ProtocolHandler : SignalProxy, AuthHandler {
       return
     }
 
-    Logger.debug("<", f.toString())
+    logger.log(Level.FINEST, f.toString())
 
     val invoker = Invokers.get(f.className) ?: throw IllegalArgumentException(
       "Invalid classname: ${f.className}")
@@ -95,7 +98,7 @@ abstract class ProtocolHandler : SignalProxy, AuthHandler {
   }
 
   override fun handle(f: SignalProxyMessage.RpcCall) {
-    Logger.debug("<", f.toString())
+    logger.log(Level.FINEST, "< $f")
 
     currentCallSlot = f.slotName
     Invokers.RPC?.invoke(rpcHandler, f.slotName, f.params)
@@ -147,4 +150,8 @@ abstract class ProtocolHandler : SignalProxy, AuthHandler {
     objectStorage.remove(syncableObject)
     toInit.remove(syncableObject)
   }
+
+  open fun cleanUp() {
+    objectStorage.clear()
+  }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/session/Session.kt b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
similarity index 79%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/session/Session.kt
rename to lib/src/main/java/de/kuschku/libquassel/session/Session.kt
index f2d6943341aab064271d04aa191d9946f4691365..783bf71e2ac7e550c79b4ea442780e63733171a5 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/session/Session.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/Session.kt
@@ -1,13 +1,13 @@
-package de.kuschku.quasseldroid_ng.session
-
-import de.kuschku.quasseldroid_ng.protocol.*
-import de.kuschku.quasseldroid_ng.quassel.QuasselFeature
-import de.kuschku.quasseldroid_ng.quassel.syncables.*
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.invokers.Invokers
-import de.kuschku.quasseldroid_ng.util.hasFlag
-import de.kuschku.quasseldroid_ng.util.helpers.Logger
-import de.kuschku.quasseldroid_ng.util.helpers.debug
+package de.kuschku.libquassel.session
+
+import de.kuschku.libquassel.protocol.*
+import de.kuschku.libquassel.quassel.QuasselFeature
+import de.kuschku.libquassel.quassel.syncables.*
+import de.kuschku.libquassel.quassel.syncables.interfaces.invokers.Invokers
+import de.kuschku.libquassel.util.hasFlag
 import org.threeten.bp.Instant
+import java.util.logging.Level
+import java.util.logging.Logger
 import javax.net.ssl.X509TrustManager
 
 class Session(
@@ -15,6 +15,9 @@ class Session(
   val trustManager: X509TrustManager,
   var coreConnection: CoreConnection? = null
 ) : ProtocolHandler() {
+  companion object {
+    private val logger = Logger.getLogger("Session")
+  }
   var coreFeatures: Quassel_Features = Quassel_Feature.NONE
 
   var userData: Pair<String, String>? = null
@@ -33,7 +36,7 @@ class Session(
   private val networkConfig = NetworkConfig(this)
 
   init {
-    Logger.debug("Session", "Session created")
+    logger.log(Level.FINEST, "Session created")
 
     // This should preload them
     Invokers
@@ -85,25 +88,31 @@ class Session(
 
   override fun onInitDone() {
     coreConnection?.state = ConnectionState.CONNECTED
-    Logger.debug("Session", "Initialization finished")
+    logger.log(Level.FINEST, "Initialization finished")
   }
 
   override fun handle(f: SignalProxyMessage.HeartBeatReply) {
     val now = Instant.now()
     val latency = now.toEpochMilli() - f.timestamp.toEpochMilli()
-    Logger.debug("Session", "Latency of $latency ms")
+    logger.log(Level.FINEST, "Latency of $latency ms")
   }
 
   override fun dispatch(message: SignalProxyMessage) {
-    Logger.debug(">", message.toString())
+    logger.log(Level.FINEST, "< $message")
     coreConnection?.dispatch(message)
   }
 
   override fun dispatch(message: HandshakeMessage) {
-    Logger.debug(">", message.toString())
+    logger.log(Level.FINEST, "< $message")
     coreConnection?.dispatch(message)
   }
 
   override fun network(id: NetworkId): Network? = networks[id]
   override fun identity(id: IdentityId): Identity? = identities[id]
+
+  override fun cleanUp() {
+    coreConnection?.close()
+    coreConnection = null
+    super.cleanUp()
+  }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/session/SignalProxy.kt b/lib/src/main/java/de/kuschku/libquassel/session/SignalProxy.kt
similarity index 82%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/session/SignalProxy.kt
rename to lib/src/main/java/de/kuschku/libquassel/session/SignalProxy.kt
index 6639593fb37b0097e1176d77b4d7829ad9c372b0..74bce2ee37e012e54623da5b99908467406bbc0d 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/session/SignalProxy.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/SignalProxy.kt
@@ -1,9 +1,9 @@
-package de.kuschku.quasseldroid_ng.session
+package de.kuschku.libquassel.session
 
-import de.kuschku.quasseldroid_ng.protocol.*
-import de.kuschku.quasseldroid_ng.quassel.syncables.Identity
-import de.kuschku.quasseldroid_ng.quassel.syncables.Network
-import de.kuschku.quasseldroid_ng.quassel.syncables.interfaces.ISyncableObject
+import de.kuschku.libquassel.protocol.*
+import de.kuschku.libquassel.quassel.syncables.Identity
+import de.kuschku.libquassel.quassel.syncables.Network
+import de.kuschku.libquassel.quassel.syncables.interfaces.ISyncableObject
 
 interface SignalProxy {
   fun handle(f: SignalProxyMessage.SyncMessage) {}
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/session/SocketAddress.kt b/lib/src/main/java/de/kuschku/libquassel/session/SocketAddress.kt
similarity index 78%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/session/SocketAddress.kt
rename to lib/src/main/java/de/kuschku/libquassel/session/SocketAddress.kt
index ee0edcc190c439709dc83cbb28555a54b03afccc..5b7685c76ebaccd74b30bdd963d37c273b263446 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/session/SocketAddress.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/SocketAddress.kt
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid_ng.session
+package de.kuschku.libquassel.session
 
 import java.net.InetSocketAddress
 
diff --git a/lib/src/main/java/de/kuschku/libquassel/util/CompatibilityUtils.kt b/lib/src/main/java/de/kuschku/libquassel/util/CompatibilityUtils.kt
new file mode 100644
index 0000000000000000000000000000000000000000..7b6c9cda2d8fb51ec17455fe334b535ec6301094
--- /dev/null
+++ b/lib/src/main/java/de/kuschku/libquassel/util/CompatibilityUtils.kt
@@ -0,0 +1,43 @@
+package de.kuschku.libquassel.util
+
+import java.io.OutputStream
+import java.util.zip.Deflater
+import java.util.zip.DeflaterOutputStream
+
+object CompatibilityUtils {
+  var supportsKeepAlive = false
+  var supportsCompression = false
+
+  /**
+   * Creates a SyncFlush output stream, even if the current device does not support doing so
+   * natively.
+   *
+   * @param rawOut the raw output stream to be wrapped
+   * @return The wrapping output stream
+   */
+  fun createDeflaterOutputStream(rawOut: OutputStream?): DeflaterOutputStream {
+    return if (supportsCompression) {
+      DeflaterOutputStream(rawOut, true)
+    } else {
+      DeflaterOutputStream(rawOut, createSyncFlushDeflater())
+    }
+  }
+
+  /**
+   * Creates a SyncFlush Deflater for use on pre-KitKat Android
+   *
+   * @return The modified Deflater, or null if the creation failed
+   */
+  private fun createSyncFlushDeflater(): Deflater? {
+    val def = Deflater()
+    try {
+      val f = def.javaClass.getDeclaredField("flushParm")
+      f.isAccessible = true
+      f.setInt(def, 2) // Z_SYNC_FLUSH
+    } catch (e: Exception) {
+      return null
+    }
+
+    return def
+  }
+}
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/Flag.kt b/lib/src/main/java/de/kuschku/libquassel/util/Flag.kt
similarity index 98%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/util/Flag.kt
rename to lib/src/main/java/de/kuschku/libquassel/util/Flag.kt
index e7c22a09c02f0c59843c6bc4f04341e53ad846e1..b0863fb295101362c648366011dfbfac30e24c7b 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/Flag.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/util/Flag.kt
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid_ng.util
+package de.kuschku.libquassel.util
 
 interface Flag<T> where T : Enum<T>, T : Flag<T> {
   val bit: Int
diff --git a/lib/src/main/java/de/kuschku/libquassel/util/HandlerService.kt b/lib/src/main/java/de/kuschku/libquassel/util/HandlerService.kt
new file mode 100644
index 0000000000000000000000000000000000000000..7b1334453148b580f3d3266bfc3953be6db371be
--- /dev/null
+++ b/lib/src/main/java/de/kuschku/libquassel/util/HandlerService.kt
@@ -0,0 +1,11 @@
+package de.kuschku.libquassel.util
+
+interface HandlerService {
+  fun parse(f: () -> Unit)
+  fun write(f: () -> Unit)
+  fun handle(f: () -> Unit)
+
+  fun quit()
+
+  var exceptionHandler: Thread.UncaughtExceptionHandler?
+}
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/LongFlag.kt b/lib/src/main/java/de/kuschku/libquassel/util/LongFlag.kt
similarity index 98%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/util/LongFlag.kt
rename to lib/src/main/java/de/kuschku/libquassel/util/LongFlag.kt
index fb31a835cb66fc6b5a20d87421bcbab463c7ce2c..48ca720b8bdfd3d23aec556e8dd199057e7e7dde 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/LongFlag.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/util/LongFlag.kt
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid_ng.util
+package de.kuschku.libquassel.util
 
 interface LongFlag<T> where T : Enum<T>, T : LongFlag<T> {
   val bit: Long
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/ShortFlag.kt b/lib/src/main/java/de/kuschku/libquassel/util/ShortFlag.kt
similarity index 98%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/util/ShortFlag.kt
rename to lib/src/main/java/de/kuschku/libquassel/util/ShortFlag.kt
index 075ce9a179d3fff98259db7587876301bea21fa5..5107f60ea2d1278ddd2d9bc5829f88330d77addd 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/ShortFlag.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/util/ShortFlag.kt
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid_ng.util
+package de.kuschku.libquassel.util
 
 import kotlin.experimental.and
 import kotlin.experimental.or
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/ByteBufferHelper.kt b/lib/src/main/java/de/kuschku/libquassel/util/helpers/ByteBufferHelper.kt
similarity index 80%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/ByteBufferHelper.kt
rename to lib/src/main/java/de/kuschku/libquassel/util/helpers/ByteBufferHelper.kt
index f1cbe533680da82a8734ea8a17febf3830c89698..9ac71cbcb4a5e6c0496e8aa71ce8646ec79d5dee 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/ByteBufferHelper.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/util/helpers/ByteBufferHelper.kt
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid_ng.util.helpers
+package de.kuschku.libquassel.util.helpers
 
 import java.nio.ByteBuffer
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/MapHelper.kt b/lib/src/main/java/de/kuschku/libquassel/util/helpers/MapHelper.kt
similarity index 60%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/MapHelper.kt
rename to lib/src/main/java/de/kuschku/libquassel/util/helpers/MapHelper.kt
index ea31a4dc814cd094635c85dd247774be5dede732..78b1e1ab22f9f4090458fa8ff3d941fda00872f1 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/MapHelper.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/util/helpers/MapHelper.kt
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid_ng.util.helpers
+package de.kuschku.libquassel.util.helpers
 
 fun <K, V> Map<K, V>.getOr(key: K, defValue: V)
   = this[key] ?: defValue
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/MathHelper.kt b/lib/src/main/java/de/kuschku/libquassel/util/helpers/MathHelper.kt
similarity index 100%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/MathHelper.kt
rename to lib/src/main/java/de/kuschku/libquassel/util/helpers/MathHelper.kt
diff --git a/lib/src/main/java/de/kuschku/libquassel/util/helpers/StringHelper.kt b/lib/src/main/java/de/kuschku/libquassel/util/helpers/StringHelper.kt
new file mode 100644
index 0000000000000000000000000000000000000000..59f2985a71fd47d88afc6bf191eb27aee0e6a43b
--- /dev/null
+++ b/lib/src/main/java/de/kuschku/libquassel/util/helpers/StringHelper.kt
@@ -0,0 +1,12 @@
+package de.kuschku.libquassel.util.helpers
+
+/**
+ * Because Android’s String::split is broken
+ *
+ * @return A list with all substrings of length 1, in order
+ */
+fun String.split(): Array<String> {
+  val chars = arrayOfNulls<String>(length)
+  val charArray = toCharArray()
+  return chars.indices.map { String(charArray, it, 1) }.toTypedArray()
+}
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/WritableByteChannelHelper.kt b/lib/src/main/java/de/kuschku/libquassel/util/helpers/WritableByteChannelHelper.kt
similarity index 57%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/WritableByteChannelHelper.kt
rename to lib/src/main/java/de/kuschku/libquassel/util/helpers/WritableByteChannelHelper.kt
index 32ad45b7a80d18749ff13c2f97e32dca1a7fd0dd..aeaf20eefbc728295d00d46aea17811f0b4f6278 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/helpers/WritableByteChannelHelper.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/util/helpers/WritableByteChannelHelper.kt
@@ -1,6 +1,6 @@
-package de.kuschku.quasseldroid_ng.util.helpers
+package de.kuschku.libquassel.util.helpers
 
-import de.kuschku.quasseldroid_ng.util.nio.ChainedByteBuffer
+import de.kuschku.libquassel.util.nio.ChainedByteBuffer
 import java.nio.channels.WritableByteChannel
 
 fun WritableByteChannel.write(buffer: ChainedByteBuffer) {
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/nio/ChainedByteBuffer.kt b/lib/src/main/java/de/kuschku/libquassel/util/nio/ChainedByteBuffer.kt
similarity index 97%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/util/nio/ChainedByteBuffer.kt
rename to lib/src/main/java/de/kuschku/libquassel/util/nio/ChainedByteBuffer.kt
index 348ecf329e5f98389946e8acfee3055094d929f1..26fe1d2d93cfc310f58efbcb0a145aca83f5876d 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/nio/ChainedByteBuffer.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/util/nio/ChainedByteBuffer.kt
@@ -1,4 +1,4 @@
-package de.kuschku.quasseldroid_ng.util.nio
+package de.kuschku.libquassel.util.nio
 
 import java.nio.ByteBuffer
 import java.nio.channels.WritableByteChannel
diff --git a/app/src/main/java/de/kuschku/quasseldroid_ng/util/nio/WrappedChannel.kt b/lib/src/main/java/de/kuschku/libquassel/util/nio/WrappedChannel.kt
similarity index 97%
rename from app/src/main/java/de/kuschku/quasseldroid_ng/util/nio/WrappedChannel.kt
rename to lib/src/main/java/de/kuschku/libquassel/util/nio/WrappedChannel.kt
index 70156f3824332121f0c91ce1137f29501399a593..4c98f3db2f5e4d3219b22f138fbb3e1291ce2163 100644
--- a/app/src/main/java/de/kuschku/quasseldroid_ng/util/nio/WrappedChannel.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/util/nio/WrappedChannel.kt
@@ -1,7 +1,7 @@
-package de.kuschku.quasseldroid_ng.util.nio
+package de.kuschku.libquassel.util.nio
 
-import de.kuschku.quasseldroid_ng.session.SocketAddress
-import de.kuschku.quasseldroid_ng.util.CompatibilityUtils
+import de.kuschku.libquassel.session.SocketAddress
+import de.kuschku.libquassel.util.CompatibilityUtils
 import java.io.Flushable
 import java.io.IOException
 import java.io.InputStream
diff --git a/settings.gradle b/settings.gradle
index fa3c2ef0f9a99e3af20f88747b61358dcfcb3276..6c91f3880ce83728908a3f6eb98b92410e3a9237 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -1 +1 @@
-include ':invokerannotations', ':invokergenerator', ':app'
+include ':invokerannotations', ':invokergenerator', ':lib', ':app'