diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml
index aedeec4d413db8a361220286391be1d47180e7c4..576d39ba7bf6b38b89898c8b64348ceeee89a36a 100644
--- a/.idea/codeStyles/Project.xml
+++ b/.idea/codeStyles/Project.xml
@@ -36,9 +36,6 @@
       <option name="ALLOW_TRAILING_COMMA" value="true" />
       <option name="CODE_STYLE_DEFAULTS" value="KOTLIN_OFFICIAL" />
     </JetCodeStyleSettings>
-    <XML>
-      <option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" />
-    </XML>
     <codeStyleSettings language="Groovy">
       <indentOptions>
         <option name="SMART_TABS" value="true" />
diff --git a/build.gradle b/build.gradle
index 6950593039b5b565412059ce848d5f059f58fd4e..536485f0f25ff50270b4a685e6269cdaf92e1240 100644
--- a/build.gradle
+++ b/build.gradle
@@ -1,21 +1,21 @@
 buildscript {
-    ext.kotlin_version = '1.5.31'
-    ext.hilt_version = '2.38.1'
+    ext.kotlin_version = '1.6.10'
+    ext.hilt_version = '2.40'
     ext.tor_version = '0.3.5.15'
     ext.obfs4_version = '0.0.12-dev-40245c4a'
     ext.junit_version = '5.7.2'
     ext.mockk_version = '1.10.4'
-    ext.ktlint_plugin_version = '10.1.0'
+    ext.ktlint_plugin_version = '10.2.1'
 
-    ext.androidx_fragment_version = '1.3.6'
-    ext.androidx_constraintlayout_version = '2.1.1'
-    ext.google_material_version = '1.4.0'
+    ext.androidx_fragment_version = '1.4.1'
+    ext.androidx_constraintlayout_version = '2.1.3'
+    ext.google_material_version = '1.5.0'
     repositories {
         google()
         mavenCentral()
     }
     dependencies {
-        classpath 'com.android.tools.build:gradle:7.0.3'
+        classpath 'com.android.tools.build:gradle:7.0.4'
         classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
         classpath "com.google.dagger:hilt-android-gradle-plugin:$hilt_version"
     }
diff --git a/gradle/ktlint.gradle b/gradle/ktlint.gradle
index 22e03eae400e982e4a69ff8db4ca7cb3899c89c3..60fada8f6389189b1efa5a56e37d30fff0efc477 100644
--- a/gradle/ktlint.gradle
+++ b/gradle/ktlint.gradle
@@ -1,5 +1,5 @@
 ktlint {
-    version = "0.42.1"
+    version = "0.43.2"
     android = true
     enableExperimentalRules = false
     verbose = true
diff --git a/mailbox-android/build.gradle b/mailbox-android/build.gradle
index 5c8c200ed187f4d5d463576f01675d1038a7fc76..f840547001745a91938a01b955924249d5be6bbf 100644
--- a/mailbox-android/build.gradle
+++ b/mailbox-android/build.gradle
@@ -6,7 +6,7 @@ plugins {
     id 'kotlin-kapt'
     id 'dagger.hilt.android.plugin'
     id "org.jlleitschuh.gradle.ktlint" version "$ktlint_plugin_version"
-    id 'checkstyle'
+    id 'checkstyle' // only needed for Java code
 }
 
 android {
@@ -16,7 +16,7 @@ android {
     defaultConfig {
         applicationId "org.briarproject.mailbox"
         minSdkVersion 16
-        targetSdkVersion 30
+        targetSdkVersion 31
         versionCode 1
         versionName "1.0"
         multiDexEnabled true // only needed when minSdkVersion < 21
@@ -55,11 +55,11 @@ dependencies {
     implementation project(path: ':dont-kill-me-lib')
 
     implementation 'com.github.tony19:logback-android:2.0.0'
-    implementation 'androidx.appcompat:appcompat:1.3.1'
-    implementation "androidx.activity:activity-ktx:1.3.1"
+    implementation 'androidx.appcompat:appcompat:1.4.1'
+    implementation "androidx.activity:activity-ktx:1.4.0"
     implementation "androidx.fragment:fragment-ktx:$androidx_fragment_version"
 
-    def lifecycle_version = "2.4.0-rc01"
+    def lifecycle_version = "2.4.0"
     implementation "androidx.lifecycle:lifecycle-viewmodel-ktx:$lifecycle_version"
     implementation "androidx.lifecycle:lifecycle-livedata-ktx:$lifecycle_version"
     implementation "androidx.lifecycle:lifecycle-runtime-ktx:$lifecycle_version"
diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/android/MailboxNotificationManager.kt b/mailbox-android/src/main/java/org/briarproject/mailbox/android/MailboxNotificationManager.kt
index fa67a900c267f9c6c5aca638f52469ed4c759efe..2673e52e8beb121e19d18276954a3d6e29694e47 100644
--- a/mailbox-android/src/main/java/org/briarproject/mailbox/android/MailboxNotificationManager.kt
+++ b/mailbox-android/src/main/java/org/briarproject/mailbox/android/MailboxNotificationManager.kt
@@ -24,9 +24,10 @@ import android.app.NotificationChannel
 import android.app.NotificationManager
 import android.app.NotificationManager.IMPORTANCE_LOW
 import android.app.PendingIntent
+import android.app.PendingIntent.FLAG_IMMUTABLE
 import android.content.Context
 import android.content.Intent
-import android.os.Build
+import android.os.Build.VERSION.SDK_INT
 import androidx.annotation.RequiresApi
 import androidx.core.app.NotificationCompat
 import androidx.core.app.NotificationCompat.PRIORITY_MIN
@@ -50,7 +51,7 @@ class MailboxNotificationManager @Inject constructor(
     private val nm = getSystemService(ctx, NotificationManager::class.java)!!
 
     init {
-        if (Build.VERSION.SDK_INT >= 26) createNotificationChannels()
+        if (SDK_INT >= 26) createNotificationChannels()
     }
 
     @RequiresApi(26)
@@ -68,8 +69,9 @@ class MailboxNotificationManager @Inject constructor(
     val serviceNotification: Notification
         get() {
             val notificationIntent = Intent(ctx, MainActivity::class.java)
+            val flags = if (SDK_INT >= 23) FLAG_IMMUTABLE else 0
             val pendingIntent = PendingIntent.getActivity(
-                ctx, 0, notificationIntent, 0
+                ctx, 0, notificationIntent, flags
             )
             return NotificationCompat.Builder(ctx, CHANNEL_ID)
                 .setContentTitle(ctx.getString(R.string.notification_mailbox_title))
diff --git a/mailbox-android/src/main/java/org/briarproject/mailbox/core/system/AndroidTaskScheduler.java b/mailbox-android/src/main/java/org/briarproject/mailbox/core/system/AndroidTaskScheduler.java
index 7788735c0f21f59d6a29343128c83a996e0cf644..e5d6c29e38dafbb9bddc0195d21577766b5d828b 100644
--- a/mailbox-android/src/main/java/org/briarproject/mailbox/core/system/AndroidTaskScheduler.java
+++ b/mailbox-android/src/main/java/org/briarproject/mailbox/core/system/AndroidTaskScheduler.java
@@ -46,6 +46,7 @@ import javax.annotation.concurrent.ThreadSafe;
 import static android.app.AlarmManager.ELAPSED_REALTIME_WAKEUP;
 import static android.app.AlarmManager.INTERVAL_FIFTEEN_MINUTES;
 import static android.app.PendingIntent.FLAG_CANCEL_CURRENT;
+import static android.app.PendingIntent.FLAG_IMMUTABLE;
 import static android.content.Context.ALARM_SERVICE;
 import static android.os.Build.VERSION.SDK_INT;
 import static java.util.Objects.requireNonNull;
@@ -194,8 +195,9 @@ public class AndroidTaskScheduler implements TaskScheduler, Service {
 	private PendingIntent getAlarmPendingIntent() {
 		Intent i = new Intent(app, AlarmReceiver.class);
 		i.putExtra(EXTRA_PID, Process.myPid());
-		return PendingIntent
-				.getBroadcast(app, REQUEST_ALARM, i, FLAG_CANCEL_CURRENT);
+		int flags = SDK_INT >= 23 ? FLAG_CANCEL_CURRENT | FLAG_IMMUTABLE :
+				FLAG_CANCEL_CURRENT;
+		return PendingIntent.getBroadcast(app, REQUEST_ALARM, i, flags);
 	}
 
 	private class ScheduledTask
diff --git a/mailbox-core/build.gradle b/mailbox-core/build.gradle
index a5e3e30187bf05ce818df90d3702bc8e662864e5..ca33513bcf665ebd8fd9308e1905d5a2f0cf1fc6 100644
--- a/mailbox-core/build.gradle
+++ b/mailbox-core/build.gradle
@@ -14,6 +14,7 @@ dependencies {
     api "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
     api 'com.google.code.findbugs:jsr305:3.0.2'
     api 'javax.inject:javax.inject:1' // required for @Qualifier in @Wakeful
+    implementation "org.jetbrains.kotlin:kotlin-reflect:$kotlin_version" // used by jackson
 
     implementation "com.google.dagger:hilt-core:$hilt_version"
     kapt "com.google.dagger:dagger-compiler:$hilt_version"