diff --git a/.idea/gradle.xml b/.idea/gradle.xml
index 5cd135a064522bbb757161b1eee5a7d65de1989e..a2d7c21338e98a66cd8af9e352f293e52324608b 100644
--- a/.idea/gradle.xml
+++ b/.idea/gradle.xml
@@ -4,7 +4,7 @@
   <component name="GradleSettings">
     <option name="linkedExternalProjectsSettings">
       <GradleProjectSettings>
-        <option name="testRunner" value="PLATFORM" />
+        <option name="testRunner" value="GRADLE" />
         <option name="distributionType" value="DEFAULT_WRAPPED" />
         <option name="externalProjectPath" value="$PROJECT_DIR$" />
         <option name="modules">
@@ -13,7 +13,6 @@
             <option value="$PROJECT_DIR$/app" />
           </set>
         </option>
-        <option name="resolveModulePerSourceSet" value="false" />
       </GradleProjectSettings>
     </option>
   </component>
diff --git a/.idea/misc.xml b/.idea/misc.xml
index 9ffcaa9b16e8ad73799e5488164ed1c21c2c1d3d..30d867339ba984f1d138abee9579f3efe9e76def 100644
--- a/.idea/misc.xml
+++ b/.idea/misc.xml
@@ -43,7 +43,7 @@
       </value>
     </option>
   </component>
-  <component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="1.8" project-jdk-type="JavaSDK">
+  <component name="ProjectRootManager" version="2" languageLevel="JDK_11" default="true" project-jdk-name="Embedded JDK" project-jdk-type="JavaSDK">
     <output url="file://$PROJECT_DIR$/build/classes" />
   </component>
   <component name="ProjectType">
diff --git a/.idea/runConfigurations.xml b/.idea/runConfigurations.xml
deleted file mode 100644
index e497da999824b5c5629039f2e74794dd96b6c419..0000000000000000000000000000000000000000
--- a/.idea/runConfigurations.xml
+++ /dev/null
@@ -1,13 +0,0 @@
-<?xml version="1.0" encoding="UTF-8"?>
-<project version="4">
-  <component name="RunConfigurationProducerService">
-    <option name="ignoredProducers">
-      <set>
-        <option value="com.android.tools.idea.compose.preview.runconfiguration.ComposePreviewRunConfigurationProducer" />
-        <option value="org.jetbrains.plugins.gradle.execution.test.runner.AllInPackageGradleConfigurationProducer" />
-        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestClassGradleConfigurationProducer" />
-        <option value="org.jetbrains.plugins.gradle.execution.test.runner.TestMethodGradleConfigurationProducer" />
-      </set>
-    </option>
-  </component>
-</project>
\ No newline at end of file
diff --git a/app/build.gradle b/app/build.gradle
index cdc7d7bc228505f82ca7c4cf4e93c92a0739cafa..f5e7b3bc117f2787b548feedaaed69595bd838ae 100644
--- a/app/build.gradle
+++ b/app/build.gradle
@@ -20,6 +20,7 @@ android {
             proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
         }
     }
+    namespace 'app.jonas.adventofcode2020'
 }
 
 dependencies {
diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml
index 9020969027fd768d6544cfaa4439ef65d699780e..3d876666e098698881b4ae8a4bed0405cebb1aa4 100644
--- a/app/src/main/AndroidManifest.xml
+++ b/app/src/main/AndroidManifest.xml
@@ -1,5 +1,4 @@
-<manifest xmlns:android="http://schemas.android.com/apk/res/android"
-          package="app.jonas.adventofcode2020">
+<manifest xmlns:android="http://schemas.android.com/apk/res/android">
     <application android:allowBackup="true"
                  android:label="@string/app_name"
                  android:icon="@mipmap/ic_launcher"
diff --git a/app/src/main/java/app/jonas/adventofcode2018/d04/ReposeRecord.kt b/app/src/main/java/app/jonas/adventofcode2018/d04/ReposeRecord.kt
index a8b2ec439c32949b65d7db9b97da734b65abcee4..f7957597a4650ac70f8660e76ca7dd963d1054b7 100644
--- a/app/src/main/java/app/jonas/adventofcode2018/d04/ReposeRecord.kt
+++ b/app/src/main/java/app/jonas/adventofcode2018/d04/ReposeRecord.kt
@@ -45,13 +45,13 @@ fun extractSleepRanges(entries: List<Entry>): MutableMap<Int, MutableList<IntRan
 
 fun sleepiestMinute(ranges: List<IntRange>) =
     (0..59).map { it to ranges.fold(0) { acc, range -> if (it in range) acc + 1 else acc } }
-        .maxBy { (_, count) -> count }
+        .maxByOrNull { (_, count) -> count }
         ?: throw IllegalArgumentException("Sleepiest min not parsable")
 
 fun part1(file: File): Int {
     val sortedInput = parseInput(file).sorted()
     val sleepRanges = extractSleepRanges(sortedInput)
-    val (id, ranges) = sleepRanges.maxBy { (_, ranges) -> ranges.fold(0) { acc, r -> acc + r.count() } }
+    val (id, ranges) = sleepRanges.maxByOrNull { (_, ranges) -> ranges.fold(0) { acc, r -> acc + r.count() } }
         ?: throw IllegalArgumentException("Sleep ranges not parsable")
     return id * sleepiestMinute(ranges).first
 }
@@ -62,6 +62,6 @@ fun part2(file: File): Int {
     val (id, min) = sleepRanges.map { (id, ranges) ->
         val (minute, count) = sleepiestMinute(ranges)
         Triple(id, minute, count)
-    }.maxBy { (_, _, count) -> count } ?: throw IllegalArgumentException("Sleep ranges not parsable")
+    }.maxByOrNull { (_, _, count) -> count } ?: throw IllegalArgumentException("Sleep ranges not parsable")
     return id * min
 }
\ No newline at end of file
diff --git a/app/src/main/java/app/jonas/adventofcode2018/d05/AlchemicalReduction.kt b/app/src/main/java/app/jonas/adventofcode2018/d05/AlchemicalReduction.kt
index 3b9b0715a10f7d8a03832f957145c806080676a4..d2ca9870b5abfb76673023b2ded3a0edac305784 100644
--- a/app/src/main/java/app/jonas/adventofcode2018/d05/AlchemicalReduction.kt
+++ b/app/src/main/java/app/jonas/adventofcode2018/d05/AlchemicalReduction.kt
@@ -42,5 +42,5 @@ fun part2(file: File): Int? {
     val input = file.readLines().single()
     return input.toList().distinctBy { it.toLowerCase() }
         .map { react(input.replace(it.toString(), "", true)).length }
-        .min()
+        .minOrNull()
 }
diff --git a/app/src/main/java/app/jonas/adventofcode2018/d06/ChronalCoordinates.kt b/app/src/main/java/app/jonas/adventofcode2018/d06/ChronalCoordinates.kt
index 25a48efa00870c9658c150b560ff6dff5c261530..ec3812fee075ea28d6b169cfba5fd133963dbfc9 100644
--- a/app/src/main/java/app/jonas/adventofcode2018/d06/ChronalCoordinates.kt
+++ b/app/src/main/java/app/jonas/adventofcode2018/d06/ChronalCoordinates.kt
@@ -46,7 +46,7 @@ fun part1(file: File): Int {
         }
     }
     infinite.forEach { counts.remove(it) }
-    return counts.values.max() ?: throw IllegalArgumentException("Max not found")
+    return counts.values.maxOrNull() ?: throw IllegalArgumentException("Max not found")
 }
 
 fun part2(file: File, maxDistance: Int): Int {
diff --git a/app/src/main/java/app/jonas/adventofcode2018/d07/TheSumOfItsParts.kt b/app/src/main/java/app/jonas/adventofcode2018/d07/TheSumOfItsParts.kt
index 636352fc140eaf62f62d69ef7dd402a7dd93bb54..d38810c4dafaf96a5b39870cfcf935e15ce22524 100644
--- a/app/src/main/java/app/jonas/adventofcode2018/d07/TheSumOfItsParts.kt
+++ b/app/src/main/java/app/jonas/adventofcode2018/d07/TheSumOfItsParts.kt
@@ -87,7 +87,7 @@ fun part2(file: File, workerCount: Int, additionalStepDuration: Int): Int {
         second += if (someoneFinished) {
             1
         } else {
-            val minWorkingTime = workers.mapNotNull { it.timeLeft(second) }.min()
+            val minWorkingTime = workers.mapNotNull { it.timeLeft(second) }.minOrNull()
             minWorkingTime ?: throw Error("Nobody is working: shouldn't happen!")
         }
     }
diff --git a/app/src/main/java/app/jonas/adventofcode2018/d09/MarbleMania.kt b/app/src/main/java/app/jonas/adventofcode2018/d09/MarbleMania.kt
index dac080a4ec7a1747de53b04791c13bceb309d878..ecbf8595195af550884b2e3a20bc40106d3fdab9 100644
--- a/app/src/main/java/app/jonas/adventofcode2018/d09/MarbleMania.kt
+++ b/app/src/main/java/app/jonas/adventofcode2018/d09/MarbleMania.kt
@@ -48,7 +48,7 @@ private fun getHighscore(file: File, lastMarbleValueMultiplier: Int = 1): Long {
             next.previous = currentMarble
         }
     }
-    return scores.max() ?: throw Error("No highscore!")
+    return scores.maxOrNull() ?: throw Error("No highscore!")
 }
 
 fun part1(file: File)= getHighscore(file)
diff --git a/app/src/main/java/app/jonas/adventofcode2018/d11/ChronalCharge.kt b/app/src/main/java/app/jonas/adventofcode2018/d11/ChronalCharge.kt
index 3a3c5fd924da1d364d93cfafec35e1fe7c8cf181..41d96c59ffdb0405622f0310d974b5b557914fa9 100644
--- a/app/src/main/java/app/jonas/adventofcode2018/d11/ChronalCharge.kt
+++ b/app/src/main/java/app/jonas/adventofcode2018/d11/ChronalCharge.kt
@@ -66,7 +66,7 @@ fun part1(serialNumber: Int): String {
 fun part2(serialNumber: Int): String {
     val plane = getPowerLevelPlane(serialNumber)
     val largestTotalPowers = (1..300).map { size -> size to plane.sumWindowed(size).getLargestTotalPower() }
-    val (size, largestTotalPower) = largestTotalPowers.maxBy { (_, largestTotalPower) -> largestTotalPower.second }
+    val (size, largestTotalPower) = largestTotalPowers.maxByOrNull { (_, largestTotalPower) -> largestTotalPower.second }
         ?: throw Error("No maximum found!")
     val (coordinates) = largestTotalPower
     return "$coordinates,$size"
diff --git a/app/src/main/java/app/jonas/adventofcode2020/d05/BinaryBoarding.kt b/app/src/main/java/app/jonas/adventofcode2020/d05/BinaryBoarding.kt
index 99602fbfdfd973c7774c677872a0d15d2e593bfb..9c4a61117ad79f4a70361989c120b965c03d8018 100644
--- a/app/src/main/java/app/jonas/adventofcode2020/d05/BinaryBoarding.kt
+++ b/app/src/main/java/app/jonas/adventofcode2020/d05/BinaryBoarding.kt
@@ -16,7 +16,7 @@ fun boardingPassToSeatID(boardingPass: String): Int {// BFFFBBFRRR
     return row * 8 + column
 }
 
-fun part1(file: File) = file.readLines().map(::boardingPassToSeatID).max()
+fun part1(file: File) = file.readLines().maxOfOrNull(::boardingPassToSeatID)
 
 fun part2(file: File): Int {
     val seatIDs = file.readLines().map(::boardingPassToSeatID)
diff --git a/app/src/main/java/app/jonas/adventofcode2020/d09/EncodingError.kt b/app/src/main/java/app/jonas/adventofcode2020/d09/EncodingError.kt
index e64fffac5063673601262aa11f5c9089b8857e74..bc689ca7dad0b3c9553fb9da6ee014fab50a1093 100644
--- a/app/src/main/java/app/jonas/adventofcode2020/d09/EncodingError.kt
+++ b/app/src/main/java/app/jonas/adventofcode2020/d09/EncodingError.kt
@@ -42,5 +42,5 @@ fun part2(file: File, preamble: Int): Long {
         }
     }
     val contiguousSummands = numbers.subList(startIndex, endIndex)
-    return contiguousSummands.max()!! + contiguousSummands.min()!!
+    return contiguousSummands.maxOrNull()!! + contiguousSummands.minOrNull()!!
 }
diff --git a/app/src/test/java/app/jonas/adventofcode2020/d13/ShuttleSearchTest.kt b/app/src/test/java/app/jonas/adventofcode2020/d13/ShuttleSearchTest.kt
index 1accc6faa3aec7bf653b5a442e96d089a996bfbf..5974db69eab4267e856081154e118d58cb43c149 100644
--- a/app/src/test/java/app/jonas/adventofcode2020/d13/ShuttleSearchTest.kt
+++ b/app/src/test/java/app/jonas/adventofcode2020/d13/ShuttleSearchTest.kt
@@ -12,7 +12,7 @@ class ShuttleSearchTest {
     fun testPart1Input() = assertEquals(4782, part1(load("input.txt")))
 
     @Test
-    fun testPart2Example() = assertEquals(1068781, part2(load("example.txt")))
+    fun testPart2Example() = assertEquals(1068781.toBigInteger(), part2(load("example.txt")))
 
     @Test
     fun testPart2Input() = assertEquals(1118684865113056.toBigInteger(), part2(load("input.txt")))
diff --git a/build.gradle b/build.gradle
index a3176b9e3af9db9672ed928c9534d383d3860dc9..0d113b317af5ba7c84c95171f6195b1594ae2f28 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,13 +1,13 @@
 // Top-level build file where you can add configuration options common to all sub-projects/modules.
 
 buildscript {
-    ext.kotlin_version = '1.2.71'
+    ext.kotlin_version = '1.6.21'
     repositories {
         google()
         jcenter()
     }
     dependencies {
-        classpath 'com.android.tools.build:gradle:3.2.1'
+        classpath 'com.android.tools.build:gradle:7.3.1'
         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
 
         // NOTE: Do not place your application dependencies here; they belong
diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties
index 2d80b69a76653b7165cce96f7e5d326035d61043..41dfb87909a877d96c3af4adccce4c7a301b55a2 100644
--- a/gradle/wrapper/gradle-wrapper.properties
+++ b/gradle/wrapper/gradle-wrapper.properties
@@ -1,5 +1,5 @@
 distributionBase=GRADLE_USER_HOME
 distributionPath=wrapper/dists
-distributionUrl=https\://services.gradle.org/distributions/gradle-4.8.1-bin.zip
+distributionUrl=https\://services.gradle.org/distributions/gradle-7.4-bin.zip
 zipStoreBase=GRADLE_USER_HOME
 zipStorePath=wrapper/dists