diff --git a/app/build.gradle.kts b/app/build.gradle.kts
index a0c31cf7891ae8476b862d8163a67cd18aecb682..cafb21e22a93d4b0c23623d7a4443fed1dd71d4a 100644
--- a/app/build.gradle.kts
+++ b/app/build.gradle.kts
@@ -58,9 +58,7 @@ android {
     setProperty("archivesBaseName", "Quasseldroid-$versionName")
 
     // Disable test runner analytics
-    testInstrumentationRunnerArguments = mapOf(
-      "disableAnalytics" to "true"
-    )
+    testInstrumentationRunnerArguments["disableAnalytics"] = "true"
     testInstrumentationRunner = "de.kuschku.quasseldroid.util.TestRunner"
   }
 
@@ -96,16 +94,16 @@ android {
 
   lintOptions {
     isWarningsAsErrors = true
-    setLintConfig(file("../lint.xml"))
+    lintConfig = file("../lint.xml")
   }
 
-  viewBinding {
-    isEnabled = true
+  buildFeatures {
+    viewBinding = true
   }
 }
 
 dependencies {
-  implementation(kotlin("stdlib", "1.3.72"))
+  implementation(kotlin("stdlib", "1.5.0"))
 
   // App Compat
   implementation("com.google.android.material", "material", "1.1.0-alpha10")
diff --git a/app/src/main/java/de/kuschku/quasseldroid/service/BacklogRequester.kt b/app/src/main/java/de/kuschku/quasseldroid/service/BacklogRequester.kt
index 38215a15d45b7ce83e0a6f1ec96325e14199387e..05d432727b58db0d0be0b4d14d9acfa801548e3b 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/service/BacklogRequester.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/service/BacklogRequester.kt
@@ -71,7 +71,7 @@ class BacklogRequester(
             val hasLoadedAll = missing == 0
             val hasLoadedAny = missing < amount
             if (untilAllVisible && !hasLoadedAll || !untilAllVisible && !hasLoadedAny) {
-              val messageId = it.map(Message::messageId).min()
+              val messageId = it.map(Message::messageId).minOrNull()
               loadMore(accountId,
                        buffer,
                        missing,
diff --git a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselNotificationBackend.kt b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselNotificationBackend.kt
index efd1e427a2d9edbedef7983444542b626f10e284..c032aa5dec9471a3e2313303f599343b0ede5b7d 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/service/QuasselNotificationBackend.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/service/QuasselNotificationBackend.kt
@@ -283,7 +283,7 @@ class QuasselNotificationBackend @Inject constructor(
     val data = database.notifications().all(buffer)
     data.lastOrNull()?.let {
       // Only send a loud notification if it has any new messages
-      val max = data.maxBy { it.creationTime }
+      val max = data.maxByOrNull { it.creationTime }
       val isLoud = max?.creationTime?.isAfter(initTime) == true
 
       val buffer = NotificationBuffer(
diff --git a/app/src/main/java/de/kuschku/quasseldroid/settings/SettingsMigrationManager.kt b/app/src/main/java/de/kuschku/quasseldroid/settings/SettingsMigrationManager.kt
index 591e0d819ea93deff8d846729aa973435eda9310..db8048256044e0315cfc710ccebeadec7cf0f15b 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/settings/SettingsMigrationManager.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/settings/SettingsMigrationManager.kt
@@ -29,7 +29,7 @@ class SettingsMigrationManager(
   migrations: List<SettingsMigration>
 ) {
   private val migrationMap = migrations.associateBy(SettingsMigration::from)
-  private val currentVersion = migrations.map(SettingsMigration::to).max()
+  private val currentVersion = migrations.map(SettingsMigration::to).maxOrNull()
 
   // This runs during initial start and has to run synchronously
   @SuppressLint("ApplySharedPref")
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 ad058aedc427d1f6acada18e3829b90cccbbfa82..5f8b613bc547160f93f95358d3679c9599190a61 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
@@ -336,12 +336,12 @@ class ChatActivity : ServiceBoundActivity(), SharedPreferences.OnSharedPreferenc
 
     val maxBufferActivity = modelHelper.processBufferList(modelHelper.bufferViewConfig,
                                                           filtered).map { (config, bufferList) ->
-      val minimumActivity: Buffer_Activity = config?.minimumActivity()?.enabledValues()?.max()
+      val minimumActivity: Buffer_Activity = config?.minimumActivity()?.enabledValues()?.maxOrNull()
                                              ?: Buffer_Activity.NoActivity
 
       val maxActivity: Buffer_Activity = bufferList.mapNotNull {
-        it.bufferActivity.enabledValues().max()
-      }.max() ?: Buffer_Activity.NoActivity
+        it.bufferActivity.enabledValues().maxOrNull()
+      }.maxOrNull() ?: Buffer_Activity.NoActivity
 
       val hasNotifications = bufferList.any { props ->
         when {
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/AutoCompleteHelper.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/AutoCompleteHelper.kt
index 1b54b776273de3f952dcb2b4f2570c347c06bdd6..af6568a098e59b104f9953b193edd4fda91c7bfe 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/AutoCompleteHelper.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/chat/input/AutoCompleteHelper.kt
@@ -231,7 +231,7 @@ class AutoCompleteHelper(
         val userModes = ircChannel.userModes(user)
         val prefixModes = network.prefixModes()
 
-        val lowestMode = userModes.mapNotNull(prefixModes::indexOf).min()
+        val lowestMode = userModes.mapNotNull(prefixModes::indexOf).minOrNull()
                          ?: prefixModes.size
 
         AutoCompleteItem.UserItem(
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 574b03fb86764e4be3b5d182d783eda1924b21e1..b8976f7459aea3d00f53e7eb08d883151a44c9e1 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
@@ -209,7 +209,7 @@ class AboutFragment : DaggerFragment() {
       ),
       Library(
         name = "Kotlin Standard Library",
-        version = "1.3.72",
+        version = "1.5.0",
         license = apache2,
         url = "https://kotlinlang.org/"
       ),
diff --git a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightlist/HighlightListFragment.kt b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightlist/HighlightListFragment.kt
index 4458a826f930bb4d86c0514424aa8c39ce740184..cd939ee036488459862452f3e6943bb9986b8cb7 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightlist/HighlightListFragment.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/ui/coresettings/highlightlist/HighlightListFragment.kt
@@ -184,8 +184,8 @@ class HighlightListFragment : ServiceBoundSettingsFragment(), Savable, Changeabl
     ignoreRulesHelper.startDrag(holder)
 
   private fun nextId(): Int {
-    val maxRuleId = rulesAdapter.list.maxBy { it.id }?.id
-    val maxIgnoreRuleId = ignoreRulesAdapter.list.maxBy { it.id }?.id
+    val maxRuleId = rulesAdapter.list.maxByOrNull { it.id }?.id
+    val maxIgnoreRuleId = ignoreRulesAdapter.list.maxByOrNull { it.id }?.id
 
     return when {
       maxRuleId != null && maxIgnoreRuleId != null -> maxOf(maxRuleId, maxIgnoreRuleId) + 1
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/helper/CharSequenceHelper.kt b/app/src/main/java/de/kuschku/quasseldroid/util/helper/CharSequenceHelper.kt
index d38d2585023dddd156cdd1fb93c852ef377f76f0..fa0c80ddc4362650b87abf7f79454c30641e4b35 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/util/helper/CharSequenceHelper.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/helper/CharSequenceHelper.kt
@@ -161,14 +161,14 @@ fun CharSequence.lastWordIndices(cursor: Int = this.length,
     lastIndexOf('\r', cursorPosition - 1),
     lastIndexOf('\n', cursorPosition - 1),
     lastIndexOf('\t', cursorPosition - 1)
-  ).max() ?: -1
+  ).maxOrNull() ?: -1
 
   val endOfWord = sequenceOf(
     indexOf(' ', cursorPosition),
     indexOf('\r', cursorPosition),
     indexOf('\n', cursorPosition),
     indexOf('\t', cursorPosition)
-  ).min() ?: -1
+  ).minOrNull() ?: -1
 
   val start = beginningOfWord + 1
   val end = when {
diff --git a/app/src/main/java/de/kuschku/quasseldroid/util/missingfeatures/MissingFeaturesDialog.kt b/app/src/main/java/de/kuschku/quasseldroid/util/missingfeatures/MissingFeaturesDialog.kt
index 40a2b53fda211f0a2e20c9dd41e2d83c8dd1c0d7..4bd302c9b856ac97f8d75a8025bba37a05c4cbf6 100644
--- a/app/src/main/java/de/kuschku/quasseldroid/util/missingfeatures/MissingFeaturesDialog.kt
+++ b/app/src/main/java/de/kuschku/quasseldroid/util/missingfeatures/MissingFeaturesDialog.kt
@@ -57,7 +57,7 @@ class MissingFeaturesDialog : DialogFragment() {
       }
       .build()
     ButterKnife.bind(this, dialog.customView!!)
-    val version = builder?.missingFeatures?.maxBy(MissingFeature::minimumVersion)?.minimumVersion
+    val version = builder?.missingFeatures?.maxByOrNull(MissingFeature::minimumVersion)?.minimumVersion
                   ?: QuasselVersion.VERSION_0_13
     message.text = Html.fromHtml(getString(R.string.info_missing_features, version.humanName))
     message.movementMethod = BetterLinkMovementMethod.newInstance()
diff --git a/build.gradle.kts b/build.gradle.kts
index b43dc1edf38ce3e00a16d7c7ae40a6ab4aa3c409..74b20205ca7b27d7d50bb3f89c3742945323556c 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -25,8 +25,8 @@ buildscript {
     jcenter()
   }
   dependencies {
-    classpath("com.android.tools.build:gradle:3.6.1")
-    classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.3.72")
+    classpath("com.android.tools.build:gradle:4.1.2")
+    classpath("org.jetbrains.kotlin:kotlin-gradle-plugin:1.5.0")
   }
 }
 
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index c5052237fa3ea762db4ef9fb2e2f84f8732dd6e0..7eaa725b752dd575fefe05a43a76f5177ba6150e 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -18,4 +18,4 @@ distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists
-distributionUrl=https://services.gradle.org/distributions/gradle-5.6.4-all.zip
+distributionUrl=https://services.gradle.org/distributions/gradle-7.0.1-all.zip
diff --git a/invokergenerator/build.gradle.kts b/invokergenerator/build.gradle.kts
index 917fc331cc0bfcce4cea9992e506271e36d152ba..d4c228f8cf220799364985e0d341f6cb444868bc 100644
--- a/invokergenerator/build.gradle.kts
+++ b/invokergenerator/build.gradle.kts
@@ -29,10 +29,10 @@ tasks.withType<KotlinCompile> {
 }
 
 dependencies {
-  implementation(kotlin("stdlib", "1.3.72"))
+  implementation(kotlin("stdlib", "1.5.0"))
   implementation(project(":invokerannotations"))
-  implementation("org.jetbrains.kotlin", "kotlin-compiler-embeddable", "1.3.72")
-  implementation("com.squareup", "kotlinpoet", "1.3.0")
-  compileOnly("com.google.auto.service:auto-service:1.0-rc6")
-  kapt("com.google.auto.service:auto-service:1.0-rc6")
+  implementation("org.jetbrains.kotlin", "kotlin-compiler-embeddable", "1.5.0")
+  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")
 }
diff --git a/lib/build.gradle.kts b/lib/build.gradle.kts
index bebf93e87459b934fe7c99d8e326d56bfb79c84a..91134539d2a427e1d04d67d25f4f2b017952dec4 100644
--- a/lib/build.gradle.kts
+++ b/lib/build.gradle.kts
@@ -23,7 +23,7 @@ plugins {
 }
 
 dependencies {
-  implementation(kotlin("stdlib", "1.3.72"))
+  implementation(kotlin("stdlib", "1.5.0"))
 
   implementation("androidx.annotation", "annotation", "1.1.0")
 
diff --git a/lifecycle-ktx/build.gradle.kts b/lifecycle-ktx/build.gradle.kts
index 1c350468f36834e0a2b066011ad8319519b212d3..295cd99f1c779060fa6cab572d68bb41cba5a9c9 100644
--- a/lifecycle-ktx/build.gradle.kts
+++ b/lifecycle-ktx/build.gradle.kts
@@ -22,7 +22,7 @@ plugins {
 }
 
 dependencies {
-  implementation(kotlin("stdlib", "1.3.72"))
+  implementation(kotlin("stdlib", "1.5.0"))
 
   implementation("androidx.annotation", "annotation", "1.1.0")
 
diff --git a/malheur/build.gradle.kts b/malheur/build.gradle.kts
index 9516e3b2ef6f4ed2598fa637389b81690c27fd1e..43b2a188aad2f5d543520498b480ad88ef411cc3 100644
--- a/malheur/build.gradle.kts
+++ b/malheur/build.gradle.kts
@@ -32,19 +32,17 @@ android {
     consumerProguardFiles("proguard-rules.pro")
 
     // Disable test runner analytics
-    testInstrumentationRunnerArguments = mapOf(
-      "disableAnalytics" to "true"
-    )
+    testInstrumentationRunnerArguments["disableAnalytics"] = "true"
   }
 
   lintOptions {
     isWarningsAsErrors = true
-    setLintConfig(file("../lint.xml"))
+    lintConfig = file("../lint.xml")
   }
 }
 
 dependencies {
-  implementation(kotlin("stdlib", "1.3.72"))
+  implementation(kotlin("stdlib", "1.5.0"))
 
   implementation("com.google.code.gson", "gson", "2.8.5")
   implementation("androidx.annotation", "annotation", "1.1.0")
diff --git a/persistence/build.gradle.kts b/persistence/build.gradle.kts
index 1a91c005edbc0643b997f5a780581d0af6581959..0e4f1a71042a2c605eefed389990d3c9fe443834 100644
--- a/persistence/build.gradle.kts
+++ b/persistence/build.gradle.kts
@@ -34,24 +34,22 @@ android {
 
     javaCompileOptions {
       annotationProcessorOptions {
-        arguments = mapOf("room.schemaLocation" to "$projectDir/schemas")
+        arguments["room.schemaLocation"] = "$projectDir/schemas"
       }
     }
 
     // Disable test runner analytics
-    testInstrumentationRunnerArguments = mapOf(
-      "disableAnalytics" to "true"
-    )
+    testInstrumentationRunnerArguments["disableAnalytics"] = "true"
   }
 
   lintOptions {
     isWarningsAsErrors = true
-    setLintConfig(file("../lint.xml"))
+    lintConfig = file("../lint.xml")
   }
 }
 
 dependencies {
-  implementation(kotlin("stdlib", "1.3.72"))
+  implementation(kotlin("stdlib", "1.5.0"))
 
   implementation("androidx.appcompat", "appcompat", "1.1.0")
 
diff --git a/ui_spinner/build.gradle.kts b/ui_spinner/build.gradle.kts
index b2b102c80a72067382ffbbdbcc9f3900fe6b8d6f..77101b242ef5d3dd062e1181611f755337858382 100644
--- a/ui_spinner/build.gradle.kts
+++ b/ui_spinner/build.gradle.kts
@@ -32,18 +32,16 @@ android {
     consumerProguardFiles("proguard-rules.pro")
 
     // Disable test runner analytics
-    testInstrumentationRunnerArguments = mapOf(
-      "disableAnalytics" to "true"
-    )
+    testInstrumentationRunnerArguments["disableAnalytics"] = "true"
   }
 
   lintOptions {
     isWarningsAsErrors = true
-    setLintConfig(file("../lint.xml"))
+    lintConfig = file("../lint.xml")
   }
 }
 
 dependencies {
-  implementation(kotlin("stdlib", "1.3.72"))
+  implementation(kotlin("stdlib", "1.5.0"))
   implementation("androidx.appcompat", "appcompat", "1.1.0")
 }
diff --git a/viewmodel/build.gradle.kts b/viewmodel/build.gradle.kts
index 1fe56917c37e2e2b091bc8d4fc50a425cb2d33e5..5aa9f48c48a68d87c7bc1f086566d9add60bcd50 100644
--- a/viewmodel/build.gradle.kts
+++ b/viewmodel/build.gradle.kts
@@ -32,19 +32,17 @@ android {
     consumerProguardFiles("proguard-rules.pro")
 
     // Disable test runner analytics
-    testInstrumentationRunnerArguments = mapOf(
-      "disableAnalytics" to "true"
-    )
+    testInstrumentationRunnerArguments["disableAnalytics"] = "true"
   }
 
   lintOptions {
     isWarningsAsErrors = true
-    setLintConfig(file("../lint.xml"))
+    lintConfig = file("../lint.xml")
   }
 }
 
 dependencies {
-  implementation(kotlin("stdlib", "1.3.72"))
+  implementation(kotlin("stdlib", "1.5.0"))
 
   implementation("androidx.appcompat", "appcompat", "1.1.0")
   withVersion("2.2.0") {
diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/helper/ChatViewModelHelper.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/helper/ChatViewModelHelper.kt
index d9120a21af6081deddacb7d87e30c2fd6733c387..f5548b631fd15555bcaaa4bbd341c9a2f8d63ccd 100644
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/helper/ChatViewModelHelper.kt
+++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/helper/ChatViewModelHelper.kt
@@ -147,7 +147,7 @@ open class ChatViewModelHelper @Inject constructor(
 
                     val lowestMode = userModes.asSequence().mapNotNull {
                       prefixModes.indexOf(it)
-                    }.min() ?: prefixModes.size
+                    }.minOrNull() ?: prefixModes.size
 
                     IrcUserItem(
                       bufferInfo.networkId,
diff --git a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/helper/EditorViewModelHelper.kt b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/helper/EditorViewModelHelper.kt
index cdc936775dad0a0d8dd882126da213334dc11be2..fa1ddf148e5eea1d4ee764acb0306c7af2aa7bec 100644
--- a/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/helper/EditorViewModelHelper.kt
+++ b/viewmodel/src/main/java/de/kuschku/quasseldroid/viewmodel/helper/EditorViewModelHelper.kt
@@ -148,7 +148,7 @@ open class EditorViewModelHelper @Inject constructor(
                     val userModes = ircChannel.userModes(user)
                     val prefixModes = network.prefixModes()
 
-                    val lowestMode = userModes.mapNotNull(prefixModes::indexOf).min()
+                    val lowestMode = userModes.mapNotNull(prefixModes::indexOf).minOrNull()
                                      ?: prefixModes.size
 
                     AutoCompleteItem.UserItem(