diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 0e98fbf038f71c641a6abad4639b131233a120c0..cb5cb09e545812577800fa31b9e0cefb43a0c8d4 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -24,7 +24,7 @@ plugins {
 }
 
 android {
-  compileSdkVersion(29)
+  compileSdkVersion(30)
 
   signingConfigs {
     SigningData.of(project.rootProject.properties("signing.properties"))?.let {
@@ -39,7 +39,7 @@ android {
 
   defaultConfig {
     minSdkVersion(20)
-    targetSdkVersion(29)
+    targetSdkVersion(30)
 
     applicationId = "com.iskrembilen.quasseldroid"
     versionCode = cmd("git", "rev-list", "--count", "HEAD")?.toIntOrNull() ?: 1
@@ -120,7 +120,7 @@ dependencies {
 
   withVersion("2.2.5") {
     implementation("androidx.room", "room-runtime", version)
-    kapt("androidx.room", "room-compiler", version)
+    annotationProcessor("androidx.room", "room-compiler", version)
     implementation("androidx.room", "room-rxjava2", version)
     testImplementation("androidx.room", "room-testing", version)
   }
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 e8c9bb369f2792c0c6913b3744a96c1cc241eb43..a673a55f2bbafe2d93423bb180fb398642a2a99c 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
@@ -85,6 +85,7 @@ import de.kuschku.quasseldroid.ui.setup.network.LinkNetwork
 import de.kuschku.quasseldroid.ui.setup.network.NetworkSetupActivity
 import de.kuschku.quasseldroid.ui.setup.user.UserSetupActivity
 import de.kuschku.quasseldroid.util.backport.OsConstants
+import de.kuschku.quasseldroid.util.deceptive_networks.DeceptiveNetworkDialog
 import de.kuschku.quasseldroid.util.helper.*
 import de.kuschku.quasseldroid.util.irc.format.IrcFormatDeserializer
 import de.kuschku.quasseldroid.util.missingfeatures.MissingFeaturesDialog
@@ -94,7 +95,6 @@ import de.kuschku.quasseldroid.util.ui.DragInterceptBottomSheetBehavior
 import de.kuschku.quasseldroid.util.ui.drawable.DrawerToggleActivityDrawable
 import de.kuschku.quasseldroid.util.ui.drawable.NickCountDrawable
 import de.kuschku.quasseldroid.util.ui.view.WarningBarView
-import de.kuschku.quasseldroid.util.deceptive_networks.DeceptiveNetworkDialog
 import de.kuschku.quasseldroid.viewmodel.ChatViewModel
 import de.kuschku.quasseldroid.viewmodel.data.BufferData
 import de.kuschku.quasseldroid.viewmodel.helper.ChatViewModelHelper
@@ -185,7 +185,7 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
         }
         intent.hasExtra(KEY_NETWORK_ID) && intent.hasExtra(KEY_CHANNEL)   -> {
           val networkId = NetworkId(intent.getIntExtra(KEY_NETWORK_ID, -1))
-          val channel = intent.getStringExtra(KEY_CHANNEL)
+          val channel = intent.getStringExtra(KEY_CHANNEL) ?: ""
 
           val forceJoin = intent.getBooleanExtra(KEY_FORCE_JOIN, false)
 
@@ -943,25 +943,19 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
     outState.putBoolean(KEY_OPEN_DRAWER_END, binding.drawerLayout.isDrawerOpen(GravityCompat.END))
   }
 
-  override fun onRestoreInstanceState(savedInstanceState: Bundle?) {
+  override fun onRestoreInstanceState(savedInstanceState: Bundle) {
     super.onRestoreInstanceState(savedInstanceState)
-    if (savedInstanceState != null) {
-      chatViewModel.onRestoreInstanceState(savedInstanceState)
-    }
+    chatViewModel.onRestoreInstanceState(savedInstanceState)
 
-    connectedAccount = AccountId(savedInstanceState?.getLong(KEY_CONNECTED_ACCOUNT, -1L) ?: -1L)
+    connectedAccount = AccountId(savedInstanceState.getLong(KEY_CONNECTED_ACCOUNT, -1L))
 
-    if (savedInstanceState?.getBoolean(KEY_OPEN_DRAWER_START) == true &&
-        resources.getBoolean(R.bool.buffer_drawer_exists)) {
+    if (savedInstanceState.getBoolean(KEY_OPEN_DRAWER_START) && resources.getBoolean(R.bool.buffer_drawer_exists)) {
       binding.drawerLayout.openDrawer(GravityCompat.START)
     }
-    if (savedInstanceState?.getBoolean(KEY_OPEN_DRAWER_END) == true) {
+    if (savedInstanceState.getBoolean(KEY_OPEN_DRAWER_END)) {
       binding.drawerLayout.openDrawer(GravityCompat.END)
     }
-    if (savedInstanceState?.getBoolean(KEY_OPEN_DRAWER_START) != null ||
-        savedInstanceState?.getBoolean(KEY_OPEN_DRAWER_END) != null) {
-      restoredDrawerState = true
-    }
+    restoredDrawerState = true
   }
 
   override fun onCreateOptionsMenu(menu: Menu?): Boolean {
@@ -984,7 +978,7 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
     return super.onCreateOptionsMenu(menu)
   }
 
-  override fun onOptionsItemSelected(item: MenuItem?) = when (item?.itemId) {
+  override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {
     android.R.id.home           -> {
       drawerToggle.onOptionsItemSelected(item)
     }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/ServiceBoundSetupActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/ServiceBoundSetupActivity.kt
index 3bf5d1679a69aef81ec916e958ff966e9bfa2a87..420a2c03c3db839f1dbcafe149dd06491ae83f23 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/ServiceBoundSetupActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/ServiceBoundSetupActivity.kt
@@ -235,19 +235,17 @@ abstract class ServiceBoundSetupActivity :
     super.onSaveInstanceState(outState)
   }
 
-  override fun onRestoreInstanceState(savedInstanceState: Bundle?) {
+  override fun onRestoreInstanceState(savedInstanceState: Bundle) {
     super.onRestoreInstanceState(savedInstanceState)
-    if (savedInstanceState != null) {
-      if (savedInstanceState.containsKey(resultKey)) {
-        adapter.result.putAll(savedInstanceState.getBundle(resultKey))
-        adapter.allChanged()
-      }
-      if (savedInstanceState.containsKey(lastValidItemKey))
-        adapter.lastValidItem = savedInstanceState.getInt(lastValidItemKey)
-      if (savedInstanceState.containsKey(currentItemKey))
-        viewPager.currentItem = savedInstanceState.getInt(currentItemKey)
-      currentPage.value = adapter.getItem(viewPager.currentItem)
+    if (savedInstanceState.containsKey(resultKey)) {
+      adapter.result.putAll(savedInstanceState.getBundle(resultKey))
+      adapter.allChanged()
     }
+    if (savedInstanceState.containsKey(lastValidItemKey))
+      adapter.lastValidItem = savedInstanceState.getInt(lastValidItemKey)
+    if (savedInstanceState.containsKey(currentItemKey))
+      viewPager.currentItem = savedInstanceState.getInt(currentItemKey)
+    currentPage.value = adapter.getItem(viewPager.currentItem)
     pageChanged()
   }
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/SetupActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/SetupActivity.kt
index 2b42076952ddad44175a4b976476579b6692acf1..ad12fd7cc0223cd4de55673da8e5db1581f35b98 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/SetupActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/SetupActivity.kt
@@ -195,19 +195,17 @@ abstract class SetupActivity : DaggerAppCompatActivity() {
     super.onSaveInstanceState(outState)
   }
 
-  override fun onRestoreInstanceState(savedInstanceState: Bundle?) {
+  override fun onRestoreInstanceState(savedInstanceState: Bundle) {
     super.onRestoreInstanceState(savedInstanceState)
-    if (savedInstanceState != null) {
-      if (savedInstanceState.containsKey(resultKey)) {
-        adapter.result.putAll(savedInstanceState.getBundle(resultKey))
-        adapter.allChanged()
-      }
-      if (savedInstanceState.containsKey(lastValidItemKey))
-        adapter.lastValidItem = savedInstanceState.getInt(lastValidItemKey)
-      if (savedInstanceState.containsKey(currentItemKey))
-        viewPager.currentItem = savedInstanceState.getInt(currentItemKey)
-      currentPage.value = adapter.getItem(viewPager.currentItem)
+    if (savedInstanceState.containsKey(resultKey)) {
+      adapter.result.putAll(savedInstanceState.getBundle(resultKey))
+      adapter.allChanged()
     }
+    if (savedInstanceState.containsKey(lastValidItemKey))
+      adapter.lastValidItem = savedInstanceState.getInt(lastValidItemKey)
+    if (savedInstanceState.containsKey(currentItemKey))
+      viewPager.currentItem = savedInstanceState.getInt(currentItemKey)
+    currentPage.value = adapter.getItem(viewPager.currentItem)
     pageChanged()
   }
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/network/NetworkSetupActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/network/NetworkSetupActivity.kt
index a8554dbb02146700be750423a02117f0ef7cb588..2992b3fe84593f374e2fd12139e07ba31e7cfa93 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/setup/network/NetworkSetupActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/setup/network/NetworkSetupActivity.kt
@@ -36,12 +36,11 @@ class NetworkSetupActivity : ServiceBoundSetupActivity() {
   @Inject
   lateinit var modelHelper: EditorViewModelHelper
 
-  private lateinit var arguments: Bundle
-  override val initData: Bundle
-    get() = arguments
+  override var initData: Bundle = Bundle.EMPTY
+    private set
 
   override fun onCreate(savedInstanceState: Bundle?) {
-    arguments = intent.getBundleExtra("link")
+    initData = intent.getBundleExtra("link") ?: Bundle.EMPTY
     super.onCreate(savedInstanceState)
   }
 
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/ui/settings/ServiceBoundSettingsActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/util/ui/settings/ServiceBoundSettingsActivity.kt
index 575bcbfa9ea8ec6ca8cbc08d0e9492f55b4d28b4..22a053124ae4a73b1cd364bd136ff09a18c3ba1e 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/util/ui/settings/ServiceBoundSettingsActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/ui/settings/ServiceBoundSettingsActivity.kt
@@ -95,7 +95,7 @@ abstract class ServiceBoundSettingsActivity(private val fragment: Fragment? = nu
     super.onBackPressed()
   }
 
-  override fun onOptionsItemSelected(item: MenuItem?) = when (item?.itemId) {
+  override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {
     android.R.id.home -> {
       shouldNavigateAway {
         if (supportParentActivityIntent != null) {
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/ui/settings/SettingsActivity.kt b/app/src/main/java/de/kuschku/quasseldroid/util/ui/settings/SettingsActivity.kt
index 4b58a727041b3f574ef5e91e1c36b21a5f035e91..8475ba15af7dce746e9787a86724e5ebfc070e39 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/util/ui/settings/SettingsActivity.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/ui/settings/SettingsActivity.kt
@@ -94,7 +94,7 @@ abstract class SettingsActivity(protected val fragment: Fragment? = null) : Them
     super.onBackPressed()
   }
 
-  override fun onOptionsItemSelected(item: MenuItem?) = when (item?.itemId) {
+  override fun onOptionsItemSelected(item: MenuItem) = when (item.itemId) {
     android.R.id.home -> {
       shouldNavigateAway {
         if (supportParentActivityIntent != null) {
diff --git a/app/src/main/res/layout-sw600dp-land/activity_setup.xml b/app/src/main/res/layout-sw600dp-land/activity_setup.xml
index 11b005eea5c82072f6e93c94cbb8c5f77a69b4ff..d90501b4fe5ab031a9256b94031654438d9e0eb4 100644
--- a/app/src/main/res/layout-sw600dp-land/activity_setup.xml
+++ b/app/src/main/res/layout-sw600dp-land/activity_setup.xml
@@ -46,6 +46,7 @@
     app:backgroundTint="#8A000000"
     app:elevation="0dip"
     app:fabSize="normal"
+    android:contentDescription="@string/label_next"
     app:pressedTranslationZ="0dip"
     app:srcCompat="@drawable/ic_forward"
     app:tint="#ffffffff"
diff --git a/app/src/main/res/layout-sw600dp/activity_setup.xml b/app/src/main/res/layout-sw600dp/activity_setup.xml
index 11b005eea5c82072f6e93c94cbb8c5f77a69b4ff..41117aed0e9dce347f6afde008d2dbcf46629a48 100644
--- a/app/src/main/res/layout-sw600dp/activity_setup.xml
+++ b/app/src/main/res/layout-sw600dp/activity_setup.xml
@@ -47,6 +47,7 @@
     app:elevation="0dip"
     app:fabSize="normal"
     app:pressedTranslationZ="0dip"
+    android:contentDescription="@string/label_next"
     app:srcCompat="@drawable/ic_forward"
     app:tint="#ffffffff"
     tools:ignore="RtlHardcoded" />
diff --git a/app/src/main/res/layout/activity_setup.xml b/app/src/main/res/layout/activity_setup.xml
index 6abe56c07eea2136fe9ded8c21185691f18f0492..12f05ba7486254e79088c88cbfa2f3da35b108d4 100644
--- a/app/src/main/res/layout/activity_setup.xml
+++ b/app/src/main/res/layout/activity_setup.xml
@@ -47,6 +47,7 @@
     app:fabSize="normal"
     app:srcCompat="@drawable/ic_forward"
     app:tint="#ffffffff"
+    android:contentDescription="@string/label_next"
     tools:ignore="RtlHardcoded"
     tools:src="@drawable/ic_arrow_right" />
 
diff --git a/app/src/main/res/layout/chat_messages.xml b/app/src/main/res/layout/chat_messages.xml
index 3ee860ba44739065696a7054dc46d008f3aae25f..c34962e4d02bd3aced64196f95b019b47d6f8a29 100644
--- a/app/src/main/res/layout/chat_messages.xml
+++ b/app/src/main/res/layout/chat_messages.xml
@@ -51,6 +51,7 @@
     android:visibility="gone"
     app:backgroundTint="#8A808080"
     app:elevation="0dip"
+    android:contentDescription="@string/label_scroll_to_latest"
     app:fabSize="mini"
     app:pressedTranslationZ="0dip"
     app:srcCompat="@drawable/ic_scroll_down" />
diff --git a/app/src/main/res/layout/settings_aliaslist.xml b/app/src/main/res/layout/settings_aliaslist.xml
index 5325ba9ff8799ee8b92fdb028b9749016b05e09c..c89b0f79c6207d90b37fca806eb6cfd7f0ce61a2 100644
--- a/app/src/main/res/layout/settings_aliaslist.xml
+++ b/app/src/main/res/layout/settings_aliaslist.xml
@@ -35,6 +35,7 @@
     android:layout_height="wrap_content"
     android:layout_gravity="end|bottom"
     android:layout_margin="16dp"
+    android:contentDescription="@string/label_new_alias"
     app:fabSize="normal"
     app:srcCompat="@drawable/ic_add"
     app:tint="?colorTextPrimaryInverse" />
diff --git a/app/src/main/res/values-de/strings.xml b/app/src/main/res/values-de/strings.xml
index f31cfa96af86051b71ec145d4dc83e2c2a57b792..6b5b1e3d9fd23c891f2ebafb31de133e784ec666 100644
--- a/app/src/main/res/values-de/strings.xml
+++ b/app/src/main/res/values-de/strings.xml
@@ -84,6 +84,7 @@
   <string name="label_mention_long">Kopiert den Nutzernamen in die Eingabezeile</string>
   <string name="label_network">Netzwerk</string>
   <string name="label_new_account">Account hinzufügen</string>
+  <string name="label_new_alias">Alias hinzufügen</string>
   <string name="label_new_chatlist">Chatliste hinzufügen</string>
   <string name="label_new_highlight_ignore_rule">Neue Hervorhebungsignorierregel</string>
   <string name="label_new_highlight_rule">Neue Hervorhebungsregel</string>
@@ -122,6 +123,7 @@
   <string name="label_reset">Zurücksetzen</string>
   <string name="label_save">Speichern</string>
   <string name="label_saving">Speichern…</string>
+  <string name="label_scroll_to_latest">Zu neuesten Nachrichten scrollen</string>
   <string name="label_search">Suchen…</string>
   <string name="label_search_buffer">Chats suchen</string>
   <string name="label_search_channels">Kanäle suchen</string>
diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml
index a80544d1175bd36051b3aa34a49c7fea64af60dd..89fcd16ab95f04ebee1ead88e6ba3f9a53175333 100644
--- a/app/src/main/res/values/strings.xml
+++ b/app/src/main/res/values/strings.xml
@@ -84,6 +84,7 @@
   <string name="label_mention_long">Copy username into input line</string>
   <string name="label_network">Network</string>
   <string name="label_new_account">New Account</string>
+  <string name="label_new_alias">New Alias</string>
   <string name="label_new_chatlist">New Chatlist</string>
   <string name="label_new_highlight_ignore_rule">New Highlight Ignore Rule</string>
   <string name="label_new_highlight_rule">New Highlight Rule</string>
@@ -122,6 +123,7 @@
   <string name="label_reset">Reset</string>
   <string name="label_save">Save</string>
   <string name="label_saving">Saving…</string>
+  <string name="label_scroll_to_latest">Scroll to latest messages</string>
   <string name="label_search">Search…</string>
   <string name="label_search_buffer">Search Chats</string>
   <string name="label_search_channels">Search Channels</string>
diff --git a/invokergenerator/build.gradle.kts b/invokergenerator/build.gradle.kts
index 5b2e44471da33c5ee9e37dbfa4cdca7bd8a6a8af..e6d86c69c98a7e1aa650ed89619cac71409562dc 100644
--- a/invokergenerator/build.gradle.kts
+++ b/invokergenerator/build.gradle.kts
@@ -34,5 +34,5 @@ dependencies {
   implementation("org.jetbrains.kotlin", "kotlin-compiler-embeddable", "1.4.31")
   implementation("com.squareup", "kotlinpoet", "1.8.0")
   compileOnly("com.google.auto.service:auto-service:1.0-rc7")
-  kapt("com.google.auto.service:auto-service:1.0-rc7")
+  annotationProcessor("com.google.auto.service:auto-service:1.0-rc7")
 }
diff --git a/malheur/build.gradle.kts b/malheur/build.gradle.kts
index 04f305f3d6922faa4ffeb1ee4d2dd8dbc6d351ea..aece73181ff9f103264fdcb7a56a27cb60146032 100644
--- a/malheur/build.gradle.kts
+++ b/malheur/build.gradle.kts
@@ -23,11 +23,11 @@ plugins {
 }
 
 android {
-  compileSdkVersion(29)
+  compileSdkVersion(30)
 
   defaultConfig {
     minSdkVersion(20)
-    targetSdkVersion(29)
+    targetSdkVersion(30)
 
     consumerProguardFiles("proguard-rules.pro")
 
diff --git a/persistence/build.gradle.kts b/persistence/build.gradle.kts
index c315cadd7df7cdb85e1332a37723b7c4bb1ef3ee..95891a99cc15b278fd2caf1c72b5d3455e8d69f1 100644
--- a/persistence/build.gradle.kts
+++ b/persistence/build.gradle.kts
@@ -24,11 +24,11 @@ plugins {
 }
 
 android {
-  compileSdkVersion(29)
+  compileSdkVersion(30)
 
   defaultConfig {
     minSdkVersion(20)
-    targetSdkVersion(29)
+    targetSdkVersion(30)
 
     consumerProguardFiles("proguard-rules.pro")
 
@@ -55,7 +55,7 @@ dependencies {
 
   withVersion("2.2.5") {
     implementation("androidx.room", "room-runtime", version)
-    kapt("androidx.room", "room-compiler", version)
+    annotationProcessor("androidx.room", "room-compiler", version)
     implementation("androidx.room", "room-rxjava2", version)
     testImplementation("androidx.room", "room-testing", version)
   }
diff --git a/ui_spinner/build.gradle.kts b/ui_spinner/build.gradle.kts
index cb655b16ab3acef638e916fb93adfbf93d56acb7..436c0a0f57f9511789190a2e3575bdb5eaa0c28a 100644
--- a/ui_spinner/build.gradle.kts
+++ b/ui_spinner/build.gradle.kts
@@ -23,11 +23,11 @@ plugins {
 }
 
 android {
-  compileSdkVersion(29)
+  compileSdkVersion(30)
 
   defaultConfig {
     minSdkVersion(20)
-    targetSdkVersion(29)
+    targetSdkVersion(30)
 
     consumerProguardFiles("proguard-rules.pro")
 
diff --git a/viewmodel/build.gradle.kts b/viewmodel/build.gradle.kts
index 60544b7e5d215e92fe6bbcf054b8f39853cec5e0..91df20375ff72c92693d1bd68145214a74c26de8 100644
--- a/viewmodel/build.gradle.kts
+++ b/viewmodel/build.gradle.kts
@@ -23,11 +23,11 @@ plugins {
 }
 
 android {
-  compileSdkVersion(29)
+  compileSdkVersion(30)
 
   defaultConfig {
     minSdkVersion(20)
-    targetSdkVersion(29)
+    targetSdkVersion(30)
 
     consumerProguardFiles("proguard-rules.pro")