diff --git a/.gitignore b/.gitignore
index 87bd51c7ec71093d73c6d1aaa026dcf6960ea3dc..621fa5e5fb9c7c8bf39cb9a471349de94b900c26 100644
--- a/.gitignore
+++ b/.gitignore
@@ -5,8 +5,6 @@
 /.idea/
 .DS_Store
 /captures
-.externalNativeBuild
 build/
 /reports/
 /persistence/schemas/
-/deploy.sh
diff --git a/app/src/main/java/de/kuschku/quasseldroid/Quasseldroid.kt b/app/src/main/java/de/kuschku/quasseldroid/Quasseldroid.kt
index 74382421db0e1246de39ca8a1b5d56f43c045488..baa4c0bd399bc08b3519cd252f6e490b74ba3ad8 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/Quasseldroid.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/Quasseldroid.kt
@@ -29,7 +29,6 @@ import de.kuschku.malheur.CrashHandler
 import de.kuschku.quasseldroid.dagger.DaggerAppComponent
 import de.kuschku.quasseldroid.persistence.AccountDatabase
 import de.kuschku.quasseldroid.persistence.LegacyAccountDatabase
-import de.kuschku.quasseldroid.persistence.QuasselDatabase
 import de.kuschku.quasseldroid.settings.AppearanceSettings
 import de.kuschku.quasseldroid.settings.SettingsMigration
 import de.kuschku.quasseldroid.settings.SettingsMigrationManager
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
index 5af5c7b4a864988e018b20e9b78166639e2a539d..b8582825865bf84c9be291d4500ad886f0bad963 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/ChatActivity.kt
@@ -616,7 +616,7 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
     onNewIntent(intent)
   }
 
-  var bufferData: BufferData? = null
+  private var bufferData: BufferData? = null
   var actionMode: ActionMode? = null
   private var statusBarColor: Int? = null
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/client/ClientSettingsFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/client/ClientSettingsFragment.kt
index 8f9c8bb6cc49c9e3bd1c458130a81f9bda7ea657..0dceab577971907515b684c32f0e4b7ab0e77564 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/client/ClientSettingsFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/client/ClientSettingsFragment.kt
@@ -79,13 +79,13 @@ class ClientSettingsFragment : DaggerPreferenceFragmentCompat(),
     }
   }
 
-  fun updateSummary(preference: Preference) {
+  private fun updateSummary(preference: Preference) {
     if (preference is ListPreference) {
       preference.summary = preference.entry
     }
   }
 
-  fun initSummary(preference: Preference) {
+  private fun initSummary(preference: Preference) {
     if (preference is PreferenceGroup) {
       (0 until preference.preferenceCount).asSequence().map(preference::getPreference).forEach(::initSummary)
     } else {
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/AndroidHandlerThread.kt b/app/src/main/java/de/kuschku/quasseldroid/util/AndroidHandlerThread.kt
index 542ecf4ccfa830d2f0753a5638647231f6c573b9..9ef6511b59d2dd1f44c732643f8f47587c559eba 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/util/AndroidHandlerThread.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/AndroidHandlerThread.kt
@@ -30,7 +30,7 @@ class AndroidHandlerThread(name: String) : HandlerThread(name) {
   private var handler: Handler? =
     null
 
-  fun started(): AndroidHandlerThread {
+  private fun started(): AndroidHandlerThread {
     onCreate()
     return this
   }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/ColorContext.kt b/app/src/main/java/de/kuschku/quasseldroid/util/ColorContext.kt
index 37aedae6e47814efe8b532b37fb8a6c50de77b60..fd78460ef5be025391bd49cb6025fbd0fcc57f9d 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/util/ColorContext.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/ColorContext.kt
@@ -11,7 +11,7 @@ import de.kuschku.quasseldroid.util.ui.TextDrawable
 import de.kuschku.quasseldroid.viewmodel.EditorViewModel
 
 class ColorContext(context: Context, private val messageSettings: MessageSettings) {
-  val senderColors = context.theme.styledAttributes(
+  private val senderColors = context.theme.styledAttributes(
     R.attr.senderColor0, R.attr.senderColor1, R.attr.senderColor2, R.attr.senderColor3,
     R.attr.senderColor4, R.attr.senderColor5, R.attr.senderColor6, R.attr.senderColor7,
     R.attr.senderColor8, R.attr.senderColor9, R.attr.senderColorA, R.attr.senderColorB,
@@ -22,15 +22,15 @@ class ColorContext(context: Context, private val messageSettings: MessageSetting
     }
   }
 
-  val selfColor = context.theme.styledAttributes(R.attr.colorForegroundSecondary) {
+  private val selfColor = context.theme.styledAttributes(R.attr.colorForegroundSecondary) {
     getColor(0, 0)
   }
 
-  val textColor = context.theme.styledAttributes(R.attr.colorBackground) {
+  private val textColor = context.theme.styledAttributes(R.attr.colorBackground) {
     getColor(0, 0)
   }
 
-  val radius = context.resources.getDimensionPixelSize(R.dimen.avatar_radius)
+  private val radius = context.resources.getDimensionPixelSize(R.dimen.avatar_radius)
 
 
   fun prepareTextDrawable(@ColorInt textColor: Int = this.textColor) =
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/avatars/MatrixModelLoader.kt b/app/src/main/java/de/kuschku/quasseldroid/util/avatars/MatrixModelLoader.kt
index 8e05c6436c888fc99514040d2af6a664d9e2686b..f7c86c20f8245a08f61a0d8302304f65f329043f 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/util/avatars/MatrixModelLoader.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/avatars/MatrixModelLoader.kt
@@ -25,7 +25,8 @@ import com.bumptech.glide.signature.ObjectKey
 import de.kuschku.quasseldroid.viewmodel.data.Avatar
 import java.io.InputStream
 
-class MatrixModelLoader(val api: MatrixApi) : ModelLoader<Avatar.MatrixAvatar, InputStream> {
+class MatrixModelLoader(private val api: MatrixApi) :
+  ModelLoader<Avatar.MatrixAvatar, InputStream> {
   override fun buildLoadData(model: Avatar.MatrixAvatar, width: Int, height: Int,
                              options: Options): ModelLoader.LoadData<InputStream>? {
     return ModelLoader.LoadData(ObjectKey(model), MatrixDataFetcher(model, api))
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/irc/format/ContentFormatter.kt b/app/src/main/java/de/kuschku/quasseldroid/util/irc/format/ContentFormatter.kt
index 9437ecc90f6fba92483d22d509c22eef6707b5fa..e835ec7afd0a4cab5fbea013d28a28dd75a9caa8 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/util/irc/format/ContentFormatter.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/irc/format/ContentFormatter.kt
@@ -42,7 +42,7 @@ import org.intellij.lang.annotations.Language
 import javax.inject.Inject
 
 class ContentFormatter @Inject constructor(
-  private val context: Context,
+  context: Context,
   private val ircFormatDeserializer: IrcFormatDeserializer,
   private val messageSettings: MessageSettings
 ) {
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/irc/format/IrcFormatDeserializer.kt b/app/src/main/java/de/kuschku/quasseldroid/util/irc/format/IrcFormatDeserializer.kt
index 5a2fbd7fd30f6d2bdff6789ca687600cb77b45ce..223e7430887a5e9028f08dc5139572adb5408447 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/util/irc/format/IrcFormatDeserializer.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/irc/format/IrcFormatDeserializer.kt
@@ -33,7 +33,7 @@ import javax.inject.Inject
  * color and format codes
  */
 class IrcFormatDeserializer @Inject constructor(context: Context) {
-  val mircColors = listOf(
+  private val mircColors = listOf(
     R.color.mircColor00, R.color.mircColor01, R.color.mircColor02, R.color.mircColor03,
     R.color.mircColor04, R.color.mircColor05, R.color.mircColor06, R.color.mircColor07,
     R.color.mircColor08, R.color.mircColor09, R.color.mircColor10, R.color.mircColor11,
@@ -64,7 +64,7 @@ class IrcFormatDeserializer @Inject constructor(context: Context) {
   /**
    * Function to handle mIRC formatted strings
    *
-   * @param str mIRC formatted String
+   * @param content mIRC formatted String
    * @return a CharSequence with Android’s span format representing the input string
    */
   fun formatString(content: String?, colorize: Boolean): CharSequence {
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/irc/format/IrcFormatSerializer.kt b/app/src/main/java/de/kuschku/quasseldroid/util/irc/format/IrcFormatSerializer.kt
index eb3ff188ab978e858d0f2d4f119e4fca2cfba304..dcf56c508fd8051cb029d63f99a3b83accb4a9f3 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/util/irc/format/IrcFormatSerializer.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/irc/format/IrcFormatSerializer.kt
@@ -30,7 +30,7 @@ import java.util.*
 import javax.inject.Inject
 
 class IrcFormatSerializer @Inject constructor(context: Context) {
-  val mircColors = listOf(
+  private val mircColors = listOf(
     R.color.mircColor00, R.color.mircColor01, R.color.mircColor02, R.color.mircColor03,
     R.color.mircColor04, R.color.mircColor05, R.color.mircColor06, R.color.mircColor07,
     R.color.mircColor08, R.color.mircColor09, R.color.mircColor10, R.color.mircColor11,
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/ui/BetterLinkMovementMethod.java b/app/src/main/java/de/kuschku/quasseldroid/util/ui/BetterLinkMovementMethod.java
index c567b48c1d9e86919c4e06bf3252b619882caefb..cf61c319bdbea647443e816de6b43fd03f910ffd 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/util/ui/BetterLinkMovementMethod.java
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/ui/BetterLinkMovementMethod.java
@@ -440,8 +440,8 @@ public class BetterLinkMovementMethod extends LinkMovementMethod {
    * A wrapper to support all {@link ClickableSpan}s that may or may not provide URLs.
    */
   protected static class ClickableSpanWithText {
-    private ClickableSpan span;
-    private String text;
+    private final ClickableSpan span;
+    private final String text;
 
     private ClickableSpanWithText(ClickableSpan span, String text) {
       this.span = span;
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/ui/settings/PreferenceDialogFragmentCompat.java b/app/src/main/java/de/kuschku/quasseldroid/util/ui/settings/PreferenceDialogFragmentCompat.java
index e816b3e55d3e030de8e0821fb67b70675d9a73fe..4c86df671d435eefb78f4d3da9f13228506d22f4 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/util/ui/settings/PreferenceDialogFragmentCompat.java
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/ui/settings/PreferenceDialogFragmentCompat.java
@@ -26,7 +26,6 @@ import android.graphics.drawable.Drawable;
 import android.os.Bundle;
 import android.support.annotation.LayoutRes;
 import android.support.annotation.NonNull;
-import android.support.annotation.RestrictTo;
 import android.support.v4.app.DialogFragment;
 import android.support.v4.app.Fragment;
 import android.support.v7.app.AlertDialog;
@@ -44,8 +43,6 @@ import com.afollestad.materialdialogs.MaterialDialog;
 
 import de.kuschku.quasseldroid.R;
 
-import static android.support.annotation.RestrictTo.Scope.LIBRARY_GROUP;
-
 /**
  * Abstract base class which presents a dialog associated with a
  * {@link android.support.v7.preference.DialogPreference}. Since the preference object may
@@ -208,10 +205,7 @@ public abstract class PreferenceDialogFragmentCompat extends DialogFragment impl
    * Returns whether the preference needs to display a soft input method when the dialog
    * is displayed. Default is false. Subclasses should override this method if they need
    * the soft input method brought up automatically.
-   *
-   * @hide
    */
-  @RestrictTo(LIBRARY_GROUP)
   protected boolean needInputMethod() {
     return false;
   }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/ui/settings/RingtonePreference.kt b/app/src/main/java/de/kuschku/quasseldroid/util/ui/settings/RingtonePreference.kt
index e87f33555ff0cbfbc00b3a208f7a22a5714da03f..cc01413b7676a6d9e56321300c575a7eaa55fc16 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/util/ui/settings/RingtonePreference.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/ui/settings/RingtonePreference.kt
@@ -29,9 +29,9 @@ import android.text.TextUtils
 import android.util.AttributeSet
 import de.kuschku.quasseldroid.R
 
-class RingtonePreference : DialogPreference,
-                           RequiresActivityLauncher,
-                           OnActivityResultListener {
+open class RingtonePreference : DialogPreference,
+                                RequiresActivityLauncher,
+                                OnActivityResultListener {
   private val TAG = "RingtonePreference"
 
   private var mRingtoneType: Int = 0
diff --git a/lib/src/main/java/de/kuschku/libquassel/protocol/Message.kt b/lib/src/main/java/de/kuschku/libquassel/protocol/Message.kt
index f7e53537816482218c64402cbe6506f3a9e77d92..140b625ec0351b8c27f12bf70ee419cda82694da 100644
--- a/lib/src/main/java/de/kuschku/libquassel/protocol/Message.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/protocol/Message.kt
@@ -24,7 +24,7 @@ import de.kuschku.libquassel.util.flag.Flag
 import de.kuschku.libquassel.util.flag.Flags
 import org.threeten.bp.Instant
 
-class Message(
+data class Message(
   val messageId: MsgId,
   val time: Instant,
   val type: Message_Types,
@@ -86,24 +86,4 @@ class Message(
   override fun toString(): String {
     return "Message(messageId=$messageId, time=$time, type=$type, flag=$flag, bufferInfo=$bufferInfo, sender='$sender', senderPrefixes='$senderPrefixes', content='$content')"
   }
-
-  override fun equals(other: Any?): Boolean {
-    if (this === other) return true
-    if (javaClass != other?.javaClass) return false
-
-    other as Message
-
-    if (messageId != other.messageId) return false
-    if (time != other.time) return false
-    if (type != other.type) return false
-    if (flag != other.flag) return false
-    if (bufferInfo != other.bufferInfo) return false
-    if (sender != other.sender) return false
-    if (senderPrefixes != other.senderPrefixes) return false
-    if (realName != other.realName) return false
-    if (avatarUrl != other.avatarUrl) return false
-    if (content != other.content) return false
-
-    return true
-  }
 }
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/ISession.kt b/lib/src/main/java/de/kuschku/libquassel/session/ISession.kt
index 7bacb7c22a3e69c54a15230fa3c4493539aec4f0..11e5244d577c5cb04f8c4b45ac1d417bf4b00195 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/ISession.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/ISession.kt
@@ -56,7 +56,8 @@ interface ISession : Closeable {
   val rpcHandler: RpcHandler?
   val initStatus: Observable<Pair<Int, Int>>
 
-  fun network(networkId: NetworkId): Network?
+  fun network(id: NetworkId): Network?
+  fun identity(id: IdentityId): Identity?
 
   val proxy: SignalProxy
   val error: Flowable<Error>
@@ -93,7 +94,8 @@ interface ISession : Closeable {
       override val initStatus: Observable<Pair<Int, Int>> = Observable.just(0 to 0)
       override val lag: Observable<Long> = Observable.just(0L)
 
-      override fun network(networkId: NetworkId) = null
+      override fun network(id: NetworkId): Network? = null
+      override fun identity(id: IdentityId): Identity? = null
 
       override fun login(user: String, pass: String) = Unit
       override fun close() = Unit
diff --git a/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt b/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt
index 24ea3d1e2cbcd1762a8fd50510c5295fdb59f227..a0b87ceaf92620cb6df1195664ef168e861bc02d 100644
--- a/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt
+++ b/lib/src/main/java/de/kuschku/libquassel/session/SessionManager.kt
@@ -38,8 +38,8 @@ import javax.net.ssl.X509TrustManager
 
 class SessionManager(
   offlineSession: ISession,
-  val backlogStorage: BacklogStorage,
-  val notificationManager: NotificationManager?,
+  private val backlogStorage: BacklogStorage,
+  private val notificationManager: NotificationManager?,
   val handlerService: HandlerService,
   private val disconnectFromCore: () -> Unit,
   private val initCallback: (Session) -> Unit,
@@ -58,7 +58,7 @@ class SessionManager(
   private var lastSession: ISession = offlineSession
   val state: Observable<ConnectionState> = inProgressSession.switchMap(ISession::state)
 
-  val initStatus: Observable<Pair<Int, Int>> = inProgressSession.switchMap(ISession::initStatus)
+  private val initStatus: Observable<Pair<Int, Int>> = inProgressSession.switchMap(ISession::initStatus)
   val session: Observable<ISession> = state.map { connectionState ->
     if (connectionState == ConnectionState.CONNECTED)
       inProgressSession.value
@@ -66,8 +66,7 @@ class SessionManager(
       lastSession
   }
 
-  var hasErrored: Boolean = false
-    private set
+  private var hasErrored: Boolean = false
 
   val error: Flowable<Error>
     get() = inProgressSession
diff --git a/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt b/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt
index d7d9e905655101bc686a367b177768f34c827702..94c20f52a712d5300f8f7c56cb7d22b12c77f71b 100644
--- a/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt
+++ b/persistence/src/main/java/de/kuschku/quasseldroid/persistence/QuasselDatabase.kt
@@ -125,11 +125,11 @@ abstract class QuasselDatabase : RoomDatabase() {
     @Query("UPDATE filtered SET filtered = :filtered WHERE accountId = :accountId AND bufferId = :bufferId")
     fun setFiltered(accountId: Long, bufferId: Int, filtered: Int)
 
-    @Query("SELECT filtered FROM filtered WHERE bufferId = :bufferId AND accountId = :accountId UNION SELECT :default as filtered ORDER BY filtered DESC LIMIT 1")
-    fun get(accountId: Long, bufferId: Int, default: Int): Int
+    @Query("SELECT filtered FROM filtered WHERE bufferId = :bufferId AND accountId = :accountId UNION SELECT :defaultValue as filtered ORDER BY filtered DESC LIMIT 1")
+    fun get(accountId: Long, bufferId: Int, defaultValue: Int): Int
 
-    @Query("SELECT filtered FROM filtered WHERE bufferId = :bufferId AND accountId = :accountId UNION SELECT :default as filtered ORDER BY filtered DESC LIMIT 1")
-    fun listen(accountId: Long, bufferId: Int, default: Int): LiveData<Int>
+    @Query("SELECT filtered FROM filtered WHERE bufferId = :bufferId AND accountId = :accountId UNION SELECT :defaultValue as filtered ORDER BY filtered DESC LIMIT 1")
+    fun listen(accountId: Long, bufferId: Int, defaultValue: Int): LiveData<Int>
 
     @Query("SELECT * FROM filtered WHERE accountId = :accountId")
     fun listen(accountId: Long): LiveData<List<Filtered>>
diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
index 0a0d88a5830c690a2d89dced1c572abb42e6f7b6..d147b446684742e0b4716f372819ae546d7b8020 100644
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
+++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
@@ -71,7 +71,6 @@ class QuasselViewModel : ViewModel() {
 
   val bufferViewConfigId = BehaviorSubject.createDefault(-1)
 
-  val MAX_RECENT_MESSAGES = 20
   val recentlySentMessages = BehaviorSubject.createDefault(emptyList<CharSequence>())
   fun addRecentlySentMessage(message: CharSequence) {
     recentlySentMessages.onNext(
@@ -523,4 +522,8 @@ class QuasselViewModel : ViewModel() {
       }
   val bufferListThrottled = bufferList.distinctUntilChanged().throttleLast(100,
                                                                            TimeUnit.MILLISECONDS)
+
+  companion object {
+    const val MAX_RECENT_MESSAGES = 20
+  }
 }