diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index 907d1f2e632ea1a1068209dec5eef5b2a624b4fd..944c33031454debca124dcd6e65c16c7f460f29a 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -101,10 +101,10 @@ android {
 }
 
 dependencies {
-  implementation(kotlin("stdlib", "1.3.20"))
+  implementation(kotlin("stdlib", "1.3.21"))
 
   // App Compat
-  implementation("com.google.android.material", "material", "1.0.0-rc01")
+  implementation("com.google.android.material", "material", "1.0.0")
 
   implementation("androidx.appcompat", "appcompat", "1.0.0")
   implementation("androidx.browser", "browser", "1.0.0")
@@ -114,30 +114,32 @@ dependencies {
   implementation("androidx.legacy", "legacy-preference-v14", "1.0.0")
   implementation("androidx.constraintlayout", "constraintlayout", "1.1.2")
 
-  implementation("androidx.lifecycle", "lifecycle-extensions", "2.0.0-rc01")
-  implementation("androidx.lifecycle", "lifecycle-reactivestreams", "2.0.0-rc01")
-  testImplementation("androidx.arch.core", "core-testing", "2.0.0-rc01")
-  implementation(project(":lifecycle-ktx"))
+  withVersion("2.0.0") {
+    implementation("androidx.room", "room-runtime", version)
+    kapt("androidx.room", "room-compiler", version)
+    implementation("androidx.room", "room-rxjava2", version)
+    testImplementation("androidx.room", "room-testing", version)
 
-  implementation("androidx.room", "room-runtime", "2.0.0-rc01")
-  kapt("androidx.room", "room-compiler", "2.0.0-rc01")
-  implementation("androidx.room", "room-rxjava2", "2.0.0-rc01")
-  testImplementation("androidx.room", "room-testing", "2.0.0-rc01")
+    implementation("androidx.lifecycle", "lifecycle-extensions", version)
+    implementation("androidx.lifecycle", "lifecycle-reactivestreams", version)
+    testImplementation("androidx.arch.core", "core-testing", version)
+  }
+  implementation(project(":lifecycle-ktx"))
 
-  implementation("androidx.paging", "paging-runtime", "2.0.0-rc01")
+  implementation("androidx.paging", "paging-runtime", "2.1.0")
 
-  implementation("androidx.multidex", "multidex", "2.0.0")
+  implementation("androidx.multidex", "multidex", "2.0.1")
 
   // Utility
   implementation("io.reactivex.rxjava2", "rxandroid", "2.0.2")
   implementation("io.reactivex.rxjava2", "rxjava", "2.1.9")
   implementation("org.threeten", "threetenbp", "1.3.8", classifier = "no-tzdb")
-  implementation("org.jetbrains", "annotations", "16.0.3")
+  implementation("org.jetbrains", "annotations", "17.0.0")
   implementation("com.google.code.gson", "gson", "2.8.5")
-  implementation("commons-codec", "commons-codec", "1.11")
+  implementation("commons-codec", "commons-codec", "1.12")
   implementation("com.squareup.retrofit2", "retrofit", "2.5.0")
   implementation("com.squareup.retrofit2", "converter-gson", "2.5.0")
-  withVersion("10.0.0") {
+  withVersion("10.1.0") {
     implementation("com.jakewharton", "butterknife", version)
     kapt("com.jakewharton", "butterknife-compiler", version)
   }
@@ -150,12 +152,12 @@ dependencies {
   }
 
   // UI
-  implementation("me.zhanghai.android.materialprogressbar", "library", "1.6.0")
+  implementation("me.zhanghai.android.materialprogressbar", "library", "1.6.1")
   withVersion("0.9.6.0") {
     implementation("com.afollestad.material-dialogs", "core", version)
     implementation("com.afollestad.material-dialogs", "commons", version)
   }
-  withVersion("4.8.0") {
+  withVersion("4.9.0") {
     implementation("com.github.bumptech.glide", "glide", version)
     implementation("com.github.bumptech.glide", "recyclerview-integration", version)
     kapt("com.github.bumptech.glide", "compiler", version)
@@ -163,7 +165,7 @@ dependencies {
 
   // Quality Assurance
   implementation(project(":malheur"))
-  withVersion("1.6.2") {
+  withVersion("1.6.3") {
     debugImplementation("com.squareup.leakcanary", "leakcanary-android", version)
     releaseImplementation("com.squareup.leakcanary", "leakcanary-android-no-op", version)
     testImplementation("com.squareup.leakcanary", "leakcanary-android-no-op", version)
@@ -171,7 +173,7 @@ dependencies {
   }
 
   // Dependency Injection
-  withVersion("2.20") {
+  withVersion("2.21") {
     implementation("com.google.dagger", "dagger", version)
     kapt("com.google.dagger", "dagger-compiler", version)
     kapt("com.google.dagger", "dagger-android-processor", version)
@@ -180,7 +182,7 @@ dependencies {
   }
 
   testImplementation("junit", "junit", "4.12")
-  testImplementation("org.robolectric", "robolectric", "4.1") {
+  testImplementation("org.robolectric", "robolectric", "4.2") {
     exclude(group = "org.threeten", module = "threetenbp")
   }
 }
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/AboutFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/AboutFragment.kt
index 533a9dc211648b19e30a885c63934c936bcbb8f5..8977f4d0be0a28a84866f957653ef9e10600334e 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/AboutFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/clientsettings/about/AboutFragment.kt
@@ -144,13 +144,13 @@ class AboutFragment : DaggerFragment() {
       ),
       Library(
         name = "Butter Knife",
-        version = "8.9.0",
+        version = "10.1.0",
         license = apache2,
         url = "http://jakewharton.github.io/butterknife/"
       ),
       Library(
         name = "Dagger 2",
-        version = "2.15",
+        version = "2.21",
         license = apache2,
         url = "https://google.github.io/dagger/"
       ),
@@ -165,13 +165,13 @@ class AboutFragment : DaggerFragment() {
       ),
       Library(
         name = "Glide",
-        version = "4.8.0",
+        version = "4.9.0",
         license = apache2,
         url = "https://bumptech.github.io/glide/"
       ),
       Library(
         name = "Gson",
-        version = "2.8.2",
+        version = "2.8.5",
         license = apache2,
         url = "https://github.com/google/gson"
       ),
@@ -185,26 +185,26 @@ class AboutFragment : DaggerFragment() {
         url = "https://github.com/morhetz/gruvbox"
       ),
       Library(
-        name = "JavaPoet",
-        version = "1.10.0",
+        name = "KotlinPoet",
+        version = "1.1.0",
         license = apache2,
-        url = "https://github.com/square/javapoet"
+        url = "https://github.com/square/kotlinpoet"
       ),
       Library(
         name = "JetBrains Java Annotations",
-        version = "16.0.1",
+        version = "17.0.0",
         license = apache2,
         url = "https://github.com/JetBrains/java-annotations"
       ),
       Library(
         name = "Kotlin Standard Library",
-        version = "1.3.20",
+        version = "1.3.21",
         license = apache2,
         url = "https://kotlinlang.org/"
       ),
       Library(
         name = "LeakCanary",
-        version = "1.5.4",
+        version = "1.6.3",
         license = apache2,
         url = "https://github.com/square/leakcanary"
       ),
@@ -241,7 +241,7 @@ class AboutFragment : DaggerFragment() {
       ),
       Library(
         name = "Quassel",
-        version = "0.13.0",
+        version = "0.13.1",
         license = License(
           shortName = "GPLv3",
           fullName = "GNU GENERAL PUBLIC LICENSE",
@@ -257,17 +257,17 @@ class AboutFragment : DaggerFragment() {
           fullName = "Creative Commons CC0 1.0 Universal",
           text = R.raw.license_cc_0
         ),
-        url = "https://github.com/ReactiveX/RxJava"
+        url = "http://www.reactive-streams.org/"
       ),
       Library(
         name = "RecyclerView-FastScroll",
-        version = "1.0.18",
+        version = "2.0.",
         license = apache2,
         url = "https://github.com/timusus/RecyclerView-FastScroll"
       ),
       Library(
         name = "Retrofit",
-        version = "2.4.0",
+        version = "2.5.0",
         license = apache2,
         url = "https://square.github.io/retrofit/"
       ),
@@ -288,7 +288,7 @@ class AboutFragment : DaggerFragment() {
       ),
       Library(
         name = "ThreeTen backport project",
-        version = "1.3.6",
+        version = "1.3.8",
         license = License(
           shortName = "BSD 3-clause",
           text = R.raw.license_threetenbp
diff --git a/build.gradle.kts b/build.gradle.kts
index 172e1d2deb461bebe72afbb267bf2c749b84d6b3..7424b6f4d9d6d3b1278a3b7fccc9648175729d0b 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -1,4 +1,3 @@
-import org.jetbrains.kotlin.gradle.dsl.KotlinJvmOptions
 import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 
 /*
@@ -26,8 +25,8 @@ buildscript {
     jcenter()
   }
   dependencies {
-    classpath("com.android.tools.build:gradle:3.3.0")
-    classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.20")
+    classpath("com.android.tools.build:gradle:3.3.2")
+    classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.21")
   }
 }
 
diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts
index b031ac260c4531012d2108a112cb341687e70d6e..cca94c8357d020f47c0927634105042fae3cd840 100644
--- a/buildSrc/build.gradle.kts
+++ b/buildSrc/build.gradle.kts
@@ -17,12 +17,14 @@
  * with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 
-import org.gradle.kotlin.dsl.`kotlin-dsl`
-
 plugins {
   `kotlin-dsl`
 }
 
+kotlinDslPluginOptions {
+  experimentalWarning.set(false)
+}
+
 repositories {
   jcenter()
 }
diff --git a/buildSrc/src/main/kotlin/VersionContext.kt b/buildSrc/src/main/kotlin/VersionContext.kt
index 4d4e18dfd63b031109cd487c4234c3ff4dd6af6e..675f24fe420313e3865131b2ea54b8f1bd6ec9fe 100644
--- a/buildSrc/src/main/kotlin/VersionContext.kt
+++ b/buildSrc/src/main/kotlin/VersionContext.kt
@@ -17,10 +17,10 @@
  * with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 
-data class VersionContext(val version: String)
+data class VersionContext<T>(val version: T)
 
-inline fun withVersion(version: Any?, f: VersionContext.() -> Unit) {
-  (version as? String)?.let {
-    VersionContext(version).f()
+inline fun <T> withVersion(version: T?, f: VersionContext<T>.() -> Unit) {
+  version?.let {
+    f.invoke(VersionContext(version))
   }
 }
diff --git a/desktop/build.gradle.kts b/desktop/build.gradle.kts
index 0e48105c2f7671130e657d8413014b4fed9ac068..6c7d2eda5fad923f271a71c0626e913871304aa5 100644
--- a/desktop/build.gradle.kts
+++ b/desktop/build.gradle.kts
@@ -28,7 +28,7 @@ application {
 }
 
 dependencies {
-  implementation(kotlin("stdlib", "1.3.20"))
+  implementation(kotlin("stdlib", "1.3.21"))
 
   implementation("io.reactivex.rxjava2", "rxjava", "2.1.9")
   implementation("info.picocli", "picocli", "3.9.0")
diff --git a/invokergenerator/build.gradle.kts b/invokergenerator/build.gradle.kts
index 0e4ff262b0d93646d88990fca78e4a2235b32716..3b6813c4a36a0311c7b971dd455e176c120ed070 100644
--- a/invokergenerator/build.gradle.kts
+++ b/invokergenerator/build.gradle.kts
@@ -23,10 +23,10 @@ plugins {
 }
 
 dependencies {
-  implementation(kotlin("stdlib", "1.3.20"))
+  implementation(kotlin("stdlib", "1.3.21"))
   implementation(project(":invokerannotations"))
-  implementation("org.jetbrains.kotlin", "kotlin-compiler-embeddable", "1.3.20")
-  implementation("com.squareup", "kotlinpoet", "1.0.1")
+  implementation("org.jetbrains.kotlin", "kotlin-compiler-embeddable", "1.3.21")
+  implementation("com.squareup", "kotlinpoet", "1.1.0")
   implementation("com.google.auto.service:auto-service:1.0-rc4")
   kapt("com.google.auto.service:auto-service:1.0-rc4")
 }
diff --git a/lib/build.gradle.kts b/lib/build.gradle.kts
index 1e90cc7321f8a9eb7c4cf0032796df61ae82c7c7..698a5e8af367c634c4d3092143214e6b52c76037 100644
--- a/lib/build.gradle.kts
+++ b/lib/build.gradle.kts
@@ -23,7 +23,7 @@ plugins {
 }
 
 dependencies {
-  implementation(kotlin("stdlib", "1.3.20"))
+  implementation(kotlin("stdlib", "1.3.21"))
 
   implementation("androidx.annotation", "annotation", "1.0.0")
 
diff --git a/lifecycle-ktx/build.gradle.kts b/lifecycle-ktx/build.gradle.kts
index cf3c1f41192a33b01d46c3991585ad579fc72585..ddeaa316fc04c91cd080f4e32e0c51888f202fb0 100644
--- a/lifecycle-ktx/build.gradle.kts
+++ b/lifecycle-ktx/build.gradle.kts
@@ -17,19 +17,14 @@
  * with this program. If not, see <http://www.gnu.org/licenses/>.
  */
 
-import org.gradle.api.Project
-import org.gradle.api.artifacts.ExternalModuleDependency
-import org.gradle.kotlin.dsl.*
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
-
 plugins {
   kotlin("jvm")
 }
 
 dependencies {
-  implementation(kotlin("stdlib", "1.3.20"))
+  implementation(kotlin("stdlib", "1.3.21"))
 
   implementation("androidx.annotation", "annotation", "1.0.0")
 
-  implementation("androidx.lifecycle", "lifecycle-common", "2.0.0-rc01")
+  implementation("androidx.lifecycle", "lifecycle-common", "2.0.0")
 }
diff --git a/malheur/build.gradle.kts b/malheur/build.gradle.kts
index c378eaf171a0d1f3a3c3ea890934106a2afa3bc2..ec51428a0e9d3a1df5b434cbd33b048f9da878f2 100644
--- a/malheur/build.gradle.kts
+++ b/malheur/build.gradle.kts
@@ -44,7 +44,7 @@ android {
 }
 
 dependencies {
-  implementation(kotlin("stdlib", "1.3.20"))
+  implementation(kotlin("stdlib", "1.3.21"))
 
   implementation("com.google.code.gson", "gson", "2.8.5")
 }
diff --git a/persistence/build.gradle.kts b/persistence/build.gradle.kts
index d2bb7239d3186d06dc8d6cba18cb091ce23cb697..4baf972bde125087abb2548c26d298c0f4dd26b8 100644
--- a/persistence/build.gradle.kts
+++ b/persistence/build.gradle.kts
@@ -1,5 +1,3 @@
-import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
-
 /*
  * Quasseldroid - Quassel client for Android
  *
@@ -53,20 +51,22 @@ android {
 }
 
 dependencies {
-  implementation(kotlin("stdlib", "1.3.20"))
+  implementation(kotlin("stdlib", "1.3.21"))
 
   implementation("androidx.appcompat", "appcompat", "1.0.0")
 
-  implementation("androidx.room", "room-runtime", "2.0.0-rc01")
-  kapt("androidx.room", "room-compiler", "2.0.0-rc01")
-  implementation("androidx.room", "room-rxjava2", "2.0.0-rc01")
-  testImplementation("androidx.room", "room-testing", "2.0.0-rc01")
+  withVersion("2.0.0") {
+    implementation("androidx.room", "room-runtime", version)
+    kapt("androidx.room", "room-compiler", version)
+    implementation("androidx.room", "room-rxjava2", version)
+    testImplementation("androidx.room", "room-testing", version)
+  }
 
-  implementation("androidx.paging", "paging-runtime", "2.0.0-rc01")
+  implementation("androidx.paging", "paging-runtime", "2.1.0")
 
   // Utility
   implementation("org.threeten", "threetenbp", "1.3.8", classifier = "no-tzdb")
-  implementation("org.jetbrains", "annotations", "16.0.3")
+  implementation("org.jetbrains", "annotations", "17.0.0")
 
   // Quassel
   implementation(project(":lib")) {
diff --git a/viewmodel/build.gradle.kts b/viewmodel/build.gradle.kts
index a4d86f44aa63b8a1af6fe66d607ab64d4ac87639..581299a8c4af7a00b9248534a0dff138bf4dc034 100644
--- a/viewmodel/build.gradle.kts
+++ b/viewmodel/build.gradle.kts
@@ -44,18 +44,19 @@ android {
 }
 
 dependencies {
-  implementation(kotlin("stdlib", "1.3.20"))
+  implementation(kotlin("stdlib", "1.3.21"))
 
   implementation("androidx.appcompat", "appcompat", "1.0.0")
-
-  implementation("androidx.lifecycle", "lifecycle-extensions", "2.0.0-rc01")
-  implementation("androidx.lifecycle", "lifecycle-reactivestreams", "2.0.0-rc01")
+  withVersion("2.0.0") {
+    implementation("androidx.lifecycle", "lifecycle-extensions", version)
+    implementation("androidx.lifecycle", "lifecycle-reactivestreams", version)
+  }
 
   // Utility
   implementation("io.reactivex.rxjava2", "rxandroid", "2.0.2")
   implementation("io.reactivex.rxjava2", "rxjava", "2.1.9")
   implementation("org.threeten", "threetenbp", "1.3.8", classifier = "no-tzdb")
-  implementation("org.jetbrains", "annotations", "16.0.3")
+  implementation("org.jetbrains", "annotations", "17.0.0")
 
   // Quassel
   implementation(project(":persistence"))
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 1c24428510bb1d9ac95c54530720d76435a8c953..da0eac52f81495f3aab4c932bf9920b8d48197f9 100644
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
+++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/QuasselViewModel.kt
@@ -77,6 +77,7 @@ class QuasselViewModel : ViewModel() {
   fun addRecentlySentMessage(message: CharSequence) {
     recentlySentMessages.onNext(
       listOf(message) + recentlySentMessages.value
+        .orEmpty()
         .filter { it != message }
         .take(MAX_RECENT_MESSAGES - 1)
     )