diff --git a/gradle/variables.gradle b/gradle/variables.gradle
index 45e91258c591eb14dcb8e399fe591eccb37aec69..c42ef183b2bbdce2b9d06c8e1800d0f7369bb9fd 100644
--- a/gradle/variables.gradle
+++ b/gradle/variables.gradle
@@ -1,5 +1,5 @@
 ext {
-    kotlin_version = '1.8.0'
+    kotlin_version = '1.7.22' // 1.8.x has a jackson issue, test with JacksonProguardTest
     hilt_version = '2.44.2'
     nav_version = '2.5.3'
     tor_version = '0.4.7.13'
diff --git a/mailbox-android/build.gradle b/mailbox-android/build.gradle
index 553a13676be6a2967fe33ca15afa25ed1f6b09ef..a30bcac021efb4aef5001e0c74f1e9d54951a14b 100644
--- a/mailbox-android/build.gradle
+++ b/mailbox-android/build.gradle
@@ -30,6 +30,7 @@ android {
         vectorDrawables.useSupportLibrary = true
 
         testInstrumentationRunner 'androidx.test.runner.AndroidJUnitRunner'
+        testInstrumentationRunnerArguments disableAnalytics: 'true'
     }
 
     buildTypes {
@@ -79,7 +80,7 @@ dependencies {
     implementation 'org.briarproject:dont-kill-me-lib:0.2.5'
 
     implementation 'com.github.tony19:logback-android:2.0.1'
-    implementation 'androidx.appcompat:appcompat:1.6.0'
+    implementation 'androidx.appcompat:appcompat:1.6.1'
     implementation "androidx.activity:activity-ktx:1.6.1"
     implementation "androidx.fragment:fragment-ktx:1.5.5"
     implementation 'androidx.preference:preference-ktx:1.2.0'
@@ -95,7 +96,7 @@ dependencies {
     implementation "androidx.navigation:navigation-ui-ktx:$nav_version"
 
     implementation "androidx.constraintlayout:constraintlayout:2.1.4"
-    implementation "com.google.android.material:material:1.7.0"
+    implementation "com.google.android.material:material:1.8.0"
     implementation "com.google.dagger:hilt-android:$hilt_version"
     kapt "com.google.dagger:hilt-compiler:$hilt_version"
 
diff --git a/mailbox-android/proguard-rules.pro b/mailbox-android/proguard-rules.pro
index 861ec7b69c404e4253d568c82c021441c6dc5d39..3f745c5b4b02c8e35f347029a1a01f8d8c49998a 100644
--- a/mailbox-android/proguard-rules.pro
+++ b/mailbox-android/proguard-rules.pro
@@ -21,6 +21,11 @@
 -keep class io.netty.util.ReferenceCountUtil { *; }
 -keep class io.netty.buffer.WrappedByteBuf { *; }
 
+# Keep classes needed for instrumentation tests (here because testProguardFiles doesn't work)
+-keep class kotlin.LazyKt
+-keep class com.fasterxml.jackson.core.type.TypeReference
+-keep class com.fasterxml.jackson.databind.ObjectMapper { *; }
+
 # Don't warn about unused dependencies of H2 classes
 -dontwarn org.h2.**
 -dontnote org.h2.**
diff --git a/mailbox-android/src/androidTest/java/org/briarproject/mailbox/JacksonProguardTest.kt b/mailbox-android/src/androidTest/java/org/briarproject/mailbox/JacksonProguardTest.kt
new file mode 100644
index 0000000000000000000000000000000000000000..5ab23c81ca9cc39d9e1cf19ccb37663bfe540c66
--- /dev/null
+++ b/mailbox-android/src/androidTest/java/org/briarproject/mailbox/JacksonProguardTest.kt
@@ -0,0 +1,35 @@
+package org.briarproject.mailbox
+
+import androidx.test.ext.junit.runners.AndroidJUnit4
+import com.fasterxml.jackson.databind.ObjectMapper
+import com.fasterxml.jackson.module.kotlin.readValue
+import com.fasterxml.jackson.module.kotlin.registerKotlinModule
+import org.briarproject.mailbox.core.contacts.Contact
+import org.junit.Assert.assertEquals
+import org.junit.Test
+import org.junit.runner.RunWith
+
+@RunWith(AndroidJUnit4::class)
+class JacksonProguardTest {
+
+    private val mapper = ObjectMapper().apply { registerKotlinModule() }
+
+    /**
+     * Tests if we can deserialize our objects with Jackson while using proguard:
+     * [issue](https://github.com/FasterXML/jackson-module-kotlin/issues/522)
+     */
+    @Test
+    fun testDeserializeContact() {
+        val json = """
+            {
+                 "contactId": 1,
+                 "token": "foo",
+                 "inboxId": "bar",
+                 "outboxId": "42"
+            }
+        """.trimIndent()
+        val contact: Contact = mapper.readValue(json)
+        assertEquals(1, contact.contactId)
+    }
+
+}
diff --git a/mailbox-core/build.gradle b/mailbox-core/build.gradle
index 6f1e27cadb1b1318e20f13b0996ae16769ac279e..b8f623108b3924e109870d78c9b530e2cc3304c9 100644
--- a/mailbox-core/build.gradle
+++ b/mailbox-core/build.gradle
@@ -26,7 +26,7 @@ dependencies {
 
     implementation 'org.briarproject:jtorctl:0.5'
 
-    def ktor_version = '2.0.3'
+    def ktor_version = '2.2.3'
     implementation "io.ktor:ktor-server-core:$ktor_version"
     implementation "io.ktor:ktor-server-netty:$ktor_version"
     implementation "io.ktor:ktor-server-auth:$ktor_version"
diff --git a/mailbox-core/src/test/java/org/briarproject/mailbox/core/contacts/ContactsManagerIntegrationTest.kt b/mailbox-core/src/test/java/org/briarproject/mailbox/core/contacts/ContactsManagerIntegrationTest.kt
index 8931c3e14989403893374891a14a30393de7f7bb..86ac8509dff172c4d71708e09d9fe684fbc9b4d8 100644
--- a/mailbox-core/src/test/java/org/briarproject/mailbox/core/contacts/ContactsManagerIntegrationTest.kt
+++ b/mailbox-core/src/test/java/org/briarproject/mailbox/core/contacts/ContactsManagerIntegrationTest.kt
@@ -256,7 +256,7 @@ class ContactsManagerIntegrationTest : IntegrationTest() {
         }
         assertEquals(BadRequest, response.status)
         assertEquals(
-            "\"Bad request: Invalid value for parameter contactId\"",
+            "Bad request: Invalid value for parameter contactId",
             response.bodyAsText(),
         )
     }
diff --git a/mailbox-core/src/test/java/org/briarproject/mailbox/core/files/FileManagerIntegrationTest.kt b/mailbox-core/src/test/java/org/briarproject/mailbox/core/files/FileManagerIntegrationTest.kt
index 92c2bc4f00b0e164c4c4df5a767b270b52478ba4..6011c240abc49b429a15ef28ac468b3bf8b46e3e 100644
--- a/mailbox-core/src/test/java/org/briarproject/mailbox/core/files/FileManagerIntegrationTest.kt
+++ b/mailbox-core/src/test/java/org/briarproject/mailbox/core/files/FileManagerIntegrationTest.kt
@@ -60,7 +60,7 @@ class FileManagerIntegrationTest : IntegrationTest() {
             setBody(bytes)
         }
         assertEquals(HttpStatusCode.BadRequest, response.status)
-        assertEquals("\"Malformed ID: foo\"", response.bodyAsText())
+        assertEquals("Malformed ID: foo", response.bodyAsText())
     }
 
     @Test
@@ -72,7 +72,7 @@ class FileManagerIntegrationTest : IntegrationTest() {
             setBody(maxBytes)
         }
         assertEquals(HttpStatusCode.BadRequest, response.status)
-        assertEquals("\"Bad request: File larger than allowed.\"", response.bodyAsText())
+        assertEquals("Bad request: File larger than allowed.", response.bodyAsText())
         assertNoTmpFiles()
     }
 
@@ -179,7 +179,7 @@ class FileManagerIntegrationTest : IntegrationTest() {
             authenticateWithToken(ownerToken)
         }
         assertEquals(HttpStatusCode.BadRequest, response.status)
-        assertEquals("\"Malformed ID: foo\"", response.bodyAsText())
+        assertEquals("Malformed ID: foo", response.bodyAsText())
     }
 
     @Test
@@ -218,7 +218,7 @@ class FileManagerIntegrationTest : IntegrationTest() {
             authenticateWithToken(ownerToken)
         }
         assertEquals(HttpStatusCode.BadRequest, response.status)
-        assertEquals("\"Malformed ID: foo\"", response.bodyAsText())
+        assertEquals("Malformed ID: foo", response.bodyAsText())
     }
 
     @Test
@@ -227,7 +227,7 @@ class FileManagerIntegrationTest : IntegrationTest() {
             authenticateWithToken(ownerToken)
         }
         assertEquals(HttpStatusCode.BadRequest, response.status)
-        assertEquals("\"Malformed ID: bar\"", response.bodyAsText())
+        assertEquals("Malformed ID: bar", response.bodyAsText())
     }
 
     @Test
@@ -274,7 +274,7 @@ class FileManagerIntegrationTest : IntegrationTest() {
             authenticateWithToken(ownerToken)
         }
         assertEquals(HttpStatusCode.BadRequest, response.status)
-        assertEquals("\"Malformed ID: foo\"", response.bodyAsText())
+        assertEquals("Malformed ID: foo", response.bodyAsText())
     }
 
     @Test
@@ -283,7 +283,7 @@ class FileManagerIntegrationTest : IntegrationTest() {
             authenticateWithToken(ownerToken)
         }
         assertEquals(HttpStatusCode.BadRequest, response.status)
-        assertEquals("\"Malformed ID: bar\"", response.bodyAsText())
+        assertEquals("Malformed ID: bar", response.bodyAsText())
     }
 
     @Test