diff --git a/briar-desktop/build.gradle.kts b/briar-desktop/build.gradle.kts
index cebb9dcfabe9e0eac303ea883e1fdd4a5bc91e98..58b6e35f63f033471065231a848d237b50932289 100644
--- a/briar-desktop/build.gradle.kts
+++ b/briar-desktop/build.gradle.kts
@@ -24,7 +24,7 @@ import org.jetbrains.kotlin.gradle.tasks.KotlinCompile
 plugins {
     kotlin("jvm") version "1.9.10"
     kotlin("kapt") version "1.9.10"
-    id("org.jetbrains.compose") version "1.6.11"
+    id("org.jetbrains.compose") version "1.7.3"
     id("de.mobanisto.pinpit") version "0.9.0"
     id("java")
     id("idea")
@@ -166,7 +166,7 @@ tasks.test {
 }
 
 tasks.withType<KotlinCompile> {
-    kotlinOptions.jvmTarget = "11"
+    kotlinOptions.jvmTarget = "17"
     kotlinOptions.freeCompilerArgs += "-opt-in=kotlin.RequiresOptIn"
 }
 
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/attachment/media/AvatarManager.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/attachment/media/AvatarManager.kt
index 9593ae47aedda85331c13e2dbed23838becaeafb..ecf40a9d468609dbcd7407b7c910f5c06bdef9c0 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/attachment/media/AvatarManager.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/attachment/media/AvatarManager.kt
@@ -23,7 +23,6 @@ import androidx.compose.runtime.State
 import androidx.compose.runtime.mutableStateOf
 import androidx.compose.runtime.produceState
 import androidx.compose.ui.graphics.ImageBitmap
-import androidx.compose.ui.res.loadImageBitmap
 import kotlinx.coroutines.Dispatchers
 import kotlinx.coroutines.swing.Swing
 import kotlinx.coroutines.withContext
@@ -34,6 +33,7 @@ import org.briarproject.briar.api.identity.AuthorInfo
 import org.briarproject.briar.desktop.threading.BriarExecutors
 import org.briarproject.briar.desktop.threading.UiExecutor
 import org.briarproject.briar.desktop.ui.LocalAvatarManager
+import org.briarproject.briar.desktop.utils.ImageUtils.loadImageBitmap
 import javax.inject.Inject
 
 class AvatarManager @Inject constructor(
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationInput.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationInput.kt
index 19f8bff69f117771ba7ec73db8199839ba589128..887b20a1e0e6e3d47f6a262594f528dc72980a74 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationInput.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/conversation/ConversationInput.kt
@@ -26,7 +26,6 @@ import androidx.compose.foundation.layout.padding
 import androidx.compose.foundation.layout.size
 import androidx.compose.foundation.shape.RoundedCornerShape
 import androidx.compose.material.AlertDialog
-import androidx.compose.material.ExperimentalMaterialApi
 import androidx.compose.material.IconButton
 import androidx.compose.material.MaterialTheme
 import androidx.compose.material.Text
@@ -47,25 +46,24 @@ import androidx.compose.ui.Modifier
 import androidx.compose.ui.graphics.ImageBitmap
 import androidx.compose.ui.input.pointer.PointerIcon
 import androidx.compose.ui.input.pointer.pointerHoverIcon
-import androidx.compose.ui.res.ResourceLoader
-import androidx.compose.ui.res.loadImageBitmap
 import androidx.compose.ui.unit.dp
 import org.briarproject.briar.desktop.theme.sendButton
 import org.briarproject.briar.desktop.ui.ColoredIconButton
 import org.briarproject.briar.desktop.ui.HorizontalDivider
 import org.briarproject.briar.desktop.ui.LocalWindowScope
 import org.briarproject.briar.desktop.utils.ImagePicker.pickImageUsingDialog
+import org.briarproject.briar.desktop.utils.ImageUtils.loadImageBitmap
 import org.briarproject.briar.desktop.utils.InternationalizationUtils.i18n
 import org.briarproject.briar.desktop.utils.PreviewUtils.preview
+import org.briarproject.briar.desktop.utils.ResourceUtils.getResourceAsStream
 
 @Suppress("HardCodedStringLiteral")
-@OptIn(ExperimentalMaterialApi::class, ExperimentalComposeUiApi::class)
 fun main() = preview {
-    val bitmap = ResourceLoader.Default.load("images/logo_circle.png").use {
+    val bitmap = getResourceAsStream("/images/logo_circle.png")?.use {
         loadImageBitmap(it)
     }
     val (text, updateText) = remember { mutableStateOf("Lorem ipsum.") }
-    val (image, updateImage) = remember { mutableStateOf<ImageBitmap?>(bitmap) }
+    val (image, updateImage) = remember { mutableStateOf(bitmap) }
     var dialogVisible by remember { mutableStateOf(false) }
     var sentText by remember { mutableStateOf("") }
     ConversationInput(text, updateText, image, updateImage) {
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/utils/ImagePicker.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/utils/ImagePicker.kt
index 33f2d820a91194f19c4f05e3faa3005761810dc3..1e0891510d1f89aac4879b57634c0852c8b04b0c 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/utils/ImagePicker.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/utils/ImagePicker.kt
@@ -20,8 +20,8 @@ package org.briarproject.briar.desktop.utils
 
 import androidx.compose.ui.awt.ComposeWindow
 import androidx.compose.ui.graphics.ImageBitmap
-import androidx.compose.ui.res.loadImageBitmap
 import mu.KotlinLogging
+import org.briarproject.briar.desktop.utils.ImageUtils.loadImageBitmap
 import org.briarproject.briar.desktop.utils.KLoggerUtils.d
 import org.briarproject.briar.desktop.utils.KLoggerUtils.w
 import java.io.FileInputStream
diff --git a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/utils/ImageUtils.kt b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/utils/ImageUtils.kt
index 9bdbdd9b7bd7cd392ba93d0062910ffcf0c53a9a..ed18ebd2f47129da75a228c4b5cbca1a6c91ca99 100644
--- a/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/utils/ImageUtils.kt
+++ b/briar-desktop/src/main/kotlin/org/briarproject/briar/desktop/utils/ImageUtils.kt
@@ -19,10 +19,11 @@
 package org.briarproject.briar.desktop.utils
 
 import androidx.compose.ui.graphics.ImageBitmap
-import androidx.compose.ui.res.loadImageBitmap
+import androidx.compose.ui.graphics.toComposeImageBitmap
 import org.briarproject.bramble.api.db.Transaction
 import org.briarproject.briar.api.attachment.AttachmentHeader
 import org.briarproject.briar.api.attachment.AttachmentReader
+import java.io.InputStream
 
 object ImageUtils {
 
@@ -36,4 +37,8 @@ object ImageUtils {
             return loadImageBitmap(it)
         }
     }
+
+    fun loadImageBitmap(it: InputStream): ImageBitmap {
+        return org.jetbrains.skia.Image.makeFromEncoded(it.readAllBytes()).toComposeImageBitmap()
+    }
 }
diff --git a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreatorImpl.kt b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreatorImpl.kt
index 4fdd116ad0b116d0e09d81e2e4632d212e58697f..bc46970b16e7b04b23828823f3b5806ada5c0448 100644
--- a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreatorImpl.kt
+++ b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/testdata/DeterministicTestDataCreatorImpl.kt
@@ -18,8 +18,6 @@
 
 package org.briarproject.briar.desktop.testdata
 
-import androidx.compose.ui.ExperimentalComposeUiApi
-import androidx.compose.ui.res.ResourceLoader
 import mu.KotlinLogging
 import org.briarproject.bramble.api.FormatException
 import org.briarproject.bramble.api.client.ClientHelper
@@ -71,6 +69,7 @@ import org.briarproject.briar.desktop.testdata.forum.PostAuthor
 import org.briarproject.briar.desktop.testdata.forum.forums
 import org.briarproject.briar.desktop.utils.KLoggerUtils.i
 import org.briarproject.briar.desktop.utils.KLoggerUtils.w
+import org.briarproject.briar.desktop.utils.ResourceUtils.getResourceAsStream
 import java.io.IOException
 import java.io.InputStream
 import java.time.LocalDateTime
@@ -406,9 +405,8 @@ class DeterministicTestDataCreatorImpl @Inject internal constructor(
         }
     }
 
-    @OptIn(ExperimentalComposeUiApi::class)
     private fun image(imageResource: String): InputStream {
-        val input = ResourceLoader.Default.load(imageResource)
+        val input = getResourceAsStream(imageResource)
         val image = input.use {
             ImageIO.read(input)
         }
diff --git a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/testdata/conversation/ConversationsData.kt b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/testdata/conversation/ConversationsData.kt
index 335d3c613326eb44ae88835a94e736cd2471626f..8d1425dbebda4f4286d1247791fe3c6d368b53b5 100644
--- a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/testdata/conversation/ConversationsData.kt
+++ b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/testdata/conversation/ConversationsData.kt
@@ -45,7 +45,7 @@ val conversations = conversations {
             date = "2022-01-21 10:13:05"
         }
         outgoing {
-            images = listOf("images/do-it-now.png")
+            images = listOf("/images/do-it-now.png")
             read = true
             date = "2022-01-21 10:13:15"
         }
@@ -141,7 +141,7 @@ val conversations = conversations {
         }
         incoming {
             text = "Check out my latest diagrams"
-            images = listOf("images/voronoi1.png")
+            images = listOf("/images/voronoi1.png")
             read = true
             date = start.plusSeconds(120)
         }
@@ -153,12 +153,12 @@ val conversations = conversations {
         outgoing {
             text = "I've also made some"
             images = listOf(
-                "images/voronoi2.png",
-                "images/voronoi3.png",
-                "images/voronoi4.png",
-                "images/voronoi2.png",
-                "images/voronoi3.png",
-                "images/voronoi4.png",
+                "/images/voronoi2.png",
+                "/images/voronoi3.png",
+                "/images/voronoi4.png",
+                "/images/voronoi2.png",
+                "/images/voronoi3.png",
+                "/images/voronoi4.png",
             )
             read = true
             date = start.plusSeconds(250)
diff --git a/build.gradle.kts b/build.gradle.kts
index 3ec523eb52687b1b0789d3f6a5c2c5bf53679909..31d3fa06ddbcb59bbcf7347c46788d60698ca98e 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -55,6 +55,5 @@ allprojects {
     repositories {
         mavenCentral()
         google()
-        jcenter()
     }
 }