diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index 19b7231a0ef178ddaf98c42e57c2c1e443e10920..a052e5d79802d6bb7bdd28c494d5c939f2091a85 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -5,28 +5,29 @@
       <profile name="Gradle Imported" enabled="true">
         <outputRelativeToContentRoot value="true" />
         <processorPath useClasspath="false">
-          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.dagger/dagger-compiler/2.33/3b74787a0fe112e6d5bcb5c2e577d7fedb21907b/dagger-compiler-2.33.jar" />
-          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.dagger/dagger-spi/2.33/98b5c776c0dd96b59a2bdc5a113af832c9f222e5/dagger-spi-2.33.jar" />
-          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.dagger/dagger-producers/2.33/71cb57e32a81ea469333d44afd2ad46dc9473595/dagger-producers-2.33.jar" />
-          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.dagger/dagger/2.33/7ac2b51c8cf8e2c1a30fa74b917629c60ae2405d/dagger-2.33.jar" />
+          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.dagger/dagger-compiler/2.43.2/e43f0553f87ea108add8b9d2194411b23dc3cde6/dagger-compiler-2.43.2.jar" />
+          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.dagger/dagger-spi/2.43.2/2025954d901d032d1d1e038b41ea8a4f0c0c7ec/dagger-spi-2.43.2.jar" />
+          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.dagger/dagger-producers/2.43.2/388000f3696995eacde9e202d43beb7184586067/dagger-producers-2.43.2.jar" />
+          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.dagger/dagger/2.43.2/911d07691411f7cbccf00d177ac41c1af3873cbb/dagger-2.43.2.jar" />
           <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.googlejavaformat/google-java-format/1.5/fba7f130d29061d2d2ea384b4880c10cae92ef73/google-java-format-1.5.jar" />
-          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/27.1-jre/e47b59c893079b87743cdcfb6f17ca95c08c592c/guava-27.1-jre.jar" />
+          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.guava/guava/31.0.1-jre/119ea2b2bc205b138974d351777b20f02b92704b/guava-31.0.1-jre.jar" />
           <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.code.findbugs/jsr305/3.0.2/25ea2e8b0c338a877313bd4672d3fe056ea78f0d/jsr305-3.0.2.jar" />
+          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.devtools.ksp/symbol-processing-api/1.7.0-1.0.6/45a08b3d9f1ab8e782690d9bdd446964c6b4203a/symbol-processing-api-1.7.0-1.0.6.jar" />
           <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.guava/failureaccess/1.0.1/1dcf1de382a0bf95a3d8b0849546c88bac1292c9/failureaccess-1.0.1.jar" />
           <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.squareup/javapoet/1.13.0/d6562d385049f35eb50403fa86bb11cce76b866a/javapoet-1.13.0.jar" />
-          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/javax.annotation/jsr250-api/1.0/5025422767732a1ab45d93abfea846513d742dcf/jsr250-api-1.0.jar" />
           <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/javax.inject/javax.inject/1/6975da39a7040257bd51d21a231b76c915872d38/javax.inject-1.jar" />
           <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/net.ltgt.gradle.incap/incap/0.2/c73e3db9bee414d6ee27995d951fcdbee09acad/incap-0.2.jar" />
-          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.checkerframework/checker-compat-qual/2.5.3/45f92d2e0676d05ae9297269b8268f93a875d4a/checker-compat-qual-2.5.3.jar" />
-          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-metadata-jvm/0.1.0/505481587ce23e1d8207734e496632df5c4e6f58/kotlinx-metadata-jvm-0.1.0.jar" />
-          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.4.20/9be77b243a362b745e365f286627b8724337009c/kotlin-stdlib-1.4.20.jar" />
+          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.checkerframework/checker-compat-qual/2.5.5/435dc33e3019c9f019e15f01aa111de9d6b2b79c/checker-compat-qual-2.5.5.jar" />
+          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jdk8/1.7.0/362da0b4951ed79a6591743a7fddcfb8c73809f6/kotlin-stdlib-jdk8-1.7.0.jar" />
+          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlinx/kotlinx-metadata-jvm/0.5.0/46ffd00aaffd1cfc7244a7f0231954a7ddecc6be/kotlinx-metadata-jvm-0.5.0.jar" />
+          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-jdk7/1.7.0/fbeaa8fa63cbab09c547083a449097be6660a9a/kotlin-stdlib-jdk7-1.7.0.jar" />
+          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib/1.7.0/a5f42c684ad9003160ef0d0f693ecf0ba7b13549/kotlin-stdlib-1.7.0.jar" />
           <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.errorprone/javac-shaded/9-dev-r4023-3/72b688efd290280a0afde5f9892b0fde6f362d1d/javac-shaded-9-dev-r4023-3.jar" />
           <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.guava/listenablefuture/9999.0-empty-to-avoid-conflict-with-guava/b421526c5f297295adef1c886e5246c39d4ac629/listenablefuture-9999.0-empty-to-avoid-conflict-with-guava.jar" />
-          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.checkerframework/checker-qual/2.5.2/cea74543d5904a30861a61b4643a5f2bb372efc4/checker-qual-2.5.2.jar" />
-          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.errorprone/error_prone_annotations/2.2.0/88e3c593e9b3586e1c6177f89267da6fc6986f0c/error_prone_annotations-2.2.0.jar" />
-          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.j2objc/j2objc-annotations/1.1/ed28ded51a8b1c6b112568def5f4b455e6809019/j2objc-annotations-1.1.jar" />
-          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.codehaus.mojo/animal-sniffer-annotations/1.17/f97ce6decaea32b36101e37979f8b647f00681fb/animal-sniffer-annotations-1.17.jar" />
-          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.4.20/c6761d7805b5312302f2bbd78cda68c976ce0c70/kotlin-stdlib-common-1.4.20.jar" />
+          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.checkerframework/checker-qual/3.12.0/d5692f0526415fcc6de94bb5bfbd3afd9dd3b3e5/checker-qual-3.12.0.jar" />
+          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.errorprone/error_prone_annotations/2.7.1/458d9042f7aa6fa9a634df902b37f544e15aacac/error_prone_annotations-2.7.1.jar" />
+          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.j2objc/j2objc-annotations/1.3/ba035118bc8bac37d7eff77700720999acd9986d/j2objc-annotations-1.3.jar" />
+          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains.kotlin/kotlin-stdlib-common/1.7.0/51736992f422993a1e741051bdf3c12801bc1ca1/kotlin-stdlib-common-1.7.0.jar" />
           <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/org.jetbrains/annotations/13.0/919f0dfe192fb4e063e7dacadee7f8bb9a2672a9/annotations-13.0.jar" />
         </processorPath>
         <module name="briar-desktop.bramble-core.test" />
diff --git a/briar b/briar
index bc9c4c9e3f4f73871d778142d8a2f0928f1fcc1b..441b28fede9dbfab1da1373824045202fc21decd 160000
--- a/briar
+++ b/briar
@@ -1 +1 @@
-Subproject commit bc9c4c9e3f4f73871d778142d8a2f0928f1fcc1b
+Subproject commit 441b28fede9dbfab1da1373824045202fc21decd
diff --git a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/BriarDesktopTestApp.kt b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/BriarDesktopTestApp.kt
index cfa94ffba1357f3fc8d63f5ef2a718e95d642912..9557b64d133914253ab90f17f091a6fab3519666 100644
--- a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/BriarDesktopTestApp.kt
+++ b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/BriarDesktopTestApp.kt
@@ -33,6 +33,8 @@ import org.briarproject.bramble.api.lifecycle.ShutdownManager
 import org.briarproject.bramble.api.properties.TransportPropertyManager
 import org.briarproject.briar.BriarCoreEagerSingletons
 import org.briarproject.briar.BriarCoreModule
+import org.briarproject.briar.api.forum.ForumManager
+import org.briarproject.briar.api.forum.ForumSharingManager
 import org.briarproject.briar.api.introduction.IntroductionManager
 import org.briarproject.briar.api.test.TestDataCreator
 import org.briarproject.briar.desktop.testdata.DeterministicTestDataCreator
@@ -81,4 +83,8 @@ internal interface BriarDesktopTestApp : BrambleCoreEagerSingletons, BriarCoreEa
     fun getCryptoComponent(): CryptoComponent
 
     fun getBriarExecutors(): BriarExecutors
+
+    fun getForumManager(): ForumManager
+
+    fun getForumSharingManager(): ForumSharingManager
 }
diff --git a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/RunWithMultipleTemporaryAccounts.kt b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/RunWithMultipleTemporaryAccounts.kt
index bd3e2c4f2c0761010e5fd2ace4f46238669c59b1..eaeb3f74fb0c1f18547861b031ac641d73a8f2c0 100644
--- a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/RunWithMultipleTemporaryAccounts.kt
+++ b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/RunWithMultipleTemporaryAccounts.kt
@@ -22,7 +22,6 @@ import androidx.compose.runtime.Composable
 import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.ui.window.ApplicationScope
 import androidx.compose.ui.window.application
-import kotlinx.coroutines.delay
 import mu.KotlinLogging
 import org.briarproject.bramble.BrambleCoreEagerSingletons
 import org.briarproject.bramble.api.plugin.TorConstants.DEFAULT_CONTROL_PORT
@@ -57,8 +56,6 @@ internal class RunWithMultipleTemporaryAccounts(
 
         application {
             LaunchedEffect(Unit) {
-                delay(500)
-
                 apps.forEach {
                     val accountManager = it.getAccountManager()
                     val lifecycleManager = it.getLifecycleManager()
diff --git a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/RunWithTemporaryAccount.kt b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/RunWithTemporaryAccount.kt
index e857db65d0052715628904ec8ee22913c3a9894b..26de62c9e0ff598a16af6147df75fcc543906426 100644
--- a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/RunWithTemporaryAccount.kt
+++ b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/RunWithTemporaryAccount.kt
@@ -21,7 +21,6 @@ package org.briarproject.briar.desktop
 import androidx.compose.runtime.LaunchedEffect
 import androidx.compose.ui.ExperimentalComposeUiApi
 import androidx.compose.ui.window.application
-import kotlinx.coroutines.delay
 import mu.KotlinLogging
 import org.briarproject.bramble.BrambleCoreEagerSingletons
 import org.briarproject.briar.BriarCoreEagerSingletons
@@ -38,7 +37,7 @@ internal class RunWithTemporaryAccount(
     val createAccount: Boolean = true,
     val login: Boolean = true,
     val makeDirUnwritable: Boolean = false,
-    val customization: suspend BriarDesktopTestApp.() -> Unit = {},
+    val customization: BriarDesktopTestApp.() -> Unit = {},
 ) {
 
     companion object {
@@ -88,8 +87,6 @@ internal class RunWithTemporaryAccount(
 
         application {
             LaunchedEffect(Unit) {
-                delay(500)
-
                 if (createAccount && login) {
                     val dbKey = accountManager.databaseKey ?: throw AssertionError()
                     lifecycleManager.startServices(dbKey)
diff --git a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestScreenshot.kt b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestScreenshot.kt
index b2db21f697424079aac960525af0a807ef0e83d4..c9a31cdf70342ed2096f2098ab043230aef8fff0 100644
--- a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestScreenshot.kt
+++ b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestScreenshot.kt
@@ -18,7 +18,7 @@
 
 package org.briarproject.briar.desktop
 
-import kotlinx.coroutines.delay
+import org.briarproject.bramble.api.contact.event.ContactAddedEvent
 import org.briarproject.bramble.api.plugin.LanTcpConstants
 
 /**
@@ -29,13 +29,13 @@ import org.briarproject.bramble.api.plugin.LanTcpConstants
 fun main() = RunWithTemporaryAccount {
     getDeterministicTestDataCreator().createTestData(5, 20, 50, 10, 20)
     getContactManager().addPendingContact("briar://aatkjq4seoualafpwh4cfckdzr4vpr4slk3bbvpxklf7y7lv4ajw6", "Faythe")
-    // Need to wait a moment before registering incoming connections
-    delay(1000)
-    getIoExecutor().execute {
-        val contacts = getContactManager().contacts
-        contacts.forEach { contact ->
-            if (contact.author.name == "Bob" || contact.author.name == "Chuck") // NON-NLS
-                getConnectionRegistry().registerIncomingConnection(contact.id, LanTcpConstants.ID) {}
+
+    getEventBus().addListener { e ->
+        if (e is ContactAddedEvent) {
+            if (getContactManager().getContact(e.contactId).author.name in listOf("Bob", "Chuck")) // NON-NLS
+                getIoExecutor().execute {
+                    getConnectionRegistry().registerIncomingConnection(e.contactId, LanTcpConstants.ID) {}
+                }
         }
     }
 }.run()
diff --git a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestUtils.kt b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestUtils.kt
index 63704e5da4e32c20ef8c3764f95672fd2d1af659..e06f6cde026bb1620b75cffd0e5ca8d722c1855f 100644
--- a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestUtils.kt
+++ b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestUtils.kt
@@ -27,6 +27,9 @@ import org.briarproject.bramble.api.identity.Author
 import org.briarproject.bramble.api.identity.LocalAuthor
 import org.briarproject.bramble.api.plugin.TransportId
 import org.briarproject.bramble.api.properties.TransportProperties
+import org.briarproject.bramble.api.versioning.event.ClientVersionUpdatedEvent
+import org.briarproject.briar.api.forum.ForumManager
+import org.briarproject.briar.api.forum.event.ForumInvitationRequestReceivedEvent
 import org.briarproject.briar.desktop.utils.FileUtils
 import java.io.IOException
 import java.nio.file.Files
@@ -145,4 +148,34 @@ object TestUtils {
             }
         }
     }
+
+    internal fun List<BriarDesktopTestApp>.createForumForAll() {
+        if (isEmpty()) return
+
+        // create forum
+        val creator = get(0)
+        val forum = creator.getForumManager().addForum("Shared Forum") // NON-NLS
+
+        // invite all contacts
+        creator.getEventBus().addListener { e ->
+            if (e is ClientVersionUpdatedEvent && e.clientVersion.clientId == ForumManager.CLIENT_ID) {
+                creator.getBriarExecutors().onDbThread {
+                    val contact = creator.getContactManager().getContact(e.contactId)
+                    val sharingManager = creator.getForumSharingManager()
+                    if (sharingManager.canBeShared(forum.id, contact))
+                        sharingManager.sendInvitation(forum.id, e.contactId, null)
+                }
+            }
+        }
+
+        // accept invitation at all contacts
+        drop(1).forEach { app ->
+            app.getEventBus().addListener { e ->
+                if (e is ForumInvitationRequestReceivedEvent) {
+                    val contact = app.getContactManager().getContact(e.contactId)
+                    app.getForumSharingManager().respondToInvitation(forum, contact, true)
+                }
+            }
+        }
+    }
 }
diff --git a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestWithInvitationAndThreeConnectedTemporaryAccounts.kt b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestWithInvitationAndThreeConnectedTemporaryAccounts.kt
new file mode 100644
index 0000000000000000000000000000000000000000..31a490e405e3eb8b662e6f8c9051605c9a101dd5
--- /dev/null
+++ b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestWithInvitationAndThreeConnectedTemporaryAccounts.kt
@@ -0,0 +1,54 @@
+/*
+ * Briar Desktop
+ * Copyright (C) 2021-2022 The Briar Project
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Affero General Public License as
+ * published by the Free Software Foundation, either version 3 of the
+ * License, or (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Affero General Public License for more details.
+ *
+ * You should have received a copy of the GNU Affero General Public License
+ * along with this program.  If not, see <https://www.gnu.org/licenses/>.
+ */
+
+package org.briarproject.briar.desktop
+
+import org.briarproject.bramble.api.contact.Contact
+import org.briarproject.bramble.api.contact.event.ContactAddedEvent
+import org.briarproject.briar.desktop.TestUtils.connectAppsInstantly
+
+fun main() = RunWithMultipleTemporaryAccounts(listOf("alice", "bob", "eve")) { // NON-NLS
+    val alice = this[0]
+    val bob = this[1]
+    val eve = this[2]
+
+    listOf(bob, eve).forEach {
+        it.getDeterministicTestDataCreator().createTestData(1, 2, 0, 0, 0)
+        connectAppsInstantly(alice, it)
+    }
+
+    // alice introduces eve to bob
+    alice.run {
+        var eve: Contact? = null
+        var bob: Contact? = null
+        getEventBus().addListener {
+            when (it) {
+                is ContactAddedEvent -> {
+                    val contact = getContactManager().getContact(it.contactId)
+                    when (contact.author.name) {
+                        "eve" -> eve = contact // NON-NLS
+                        "bob" -> bob = contact // NON-NLS
+                    }
+                    if (eve != null && bob != null) {
+                        getIntroductionManager().makeIntroduction(eve!!, bob!!, "Eve and Bob") // NON-NLS
+                    }
+                }
+            }
+        }
+    }
+}.run()
diff --git a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestWithThreeConnectedTemporaryAccounts.kt b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestWithThreeConnectedTemporaryAccounts.kt
index 31a490e405e3eb8b662e6f8c9051605c9a101dd5..db1857b22e2236f4c6914c97a4165f978187d82d 100644
--- a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestWithThreeConnectedTemporaryAccounts.kt
+++ b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestWithThreeConnectedTemporaryAccounts.kt
@@ -18,37 +18,13 @@
 
 package org.briarproject.briar.desktop
 
-import org.briarproject.bramble.api.contact.Contact
-import org.briarproject.bramble.api.contact.event.ContactAddedEvent
-import org.briarproject.briar.desktop.TestUtils.connectAppsInstantly
+import org.briarproject.briar.desktop.TestUtils.connectAllInstantly
+import org.briarproject.briar.desktop.TestUtils.createForumForAll
 
 fun main() = RunWithMultipleTemporaryAccounts(listOf("alice", "bob", "eve")) { // NON-NLS
-    val alice = this[0]
-    val bob = this[1]
-    val eve = this[2]
-
-    listOf(bob, eve).forEach {
-        it.getDeterministicTestDataCreator().createTestData(1, 2, 0, 0, 0)
-        connectAppsInstantly(alice, it)
-    }
-
-    // alice introduces eve to bob
-    alice.run {
-        var eve: Contact? = null
-        var bob: Contact? = null
-        getEventBus().addListener {
-            when (it) {
-                is ContactAddedEvent -> {
-                    val contact = getContactManager().getContact(it.contactId)
-                    when (contact.author.name) {
-                        "eve" -> eve = contact // NON-NLS
-                        "bob" -> bob = contact // NON-NLS
-                    }
-                    if (eve != null && bob != null) {
-                        getIntroductionManager().makeIntroduction(eve!!, bob!!, "Eve and Bob") // NON-NLS
-                    }
-                }
-            }
-        }
+    forEach {
+        it.getDeterministicTestDataCreator().createTestData(5, 20, 50, 10, 20)
     }
+    connectAllInstantly()
+    createForumForAll()
 }.run()
diff --git a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestWithTwoConnectedTemporaryAccounts.kt b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestWithTwoConnectedTemporaryAccounts.kt
index 782af890eec445d0f1c108c2f3a1e9ac2abf1203..c13c5e994369c29f0007acff8d7747bb60c7a31c 100644
--- a/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestWithTwoConnectedTemporaryAccounts.kt
+++ b/briar-desktop/src/test/kotlin/org/briarproject/briar/desktop/TestWithTwoConnectedTemporaryAccounts.kt
@@ -19,10 +19,12 @@
 package org.briarproject.briar.desktop
 
 import org.briarproject.briar.desktop.TestUtils.connectAllInstantly
+import org.briarproject.briar.desktop.TestUtils.createForumForAll
 
 fun main() = RunWithMultipleTemporaryAccounts(listOf("alice", "bob")) { // NON-NLS
     forEach {
         it.getDeterministicTestDataCreator().createTestData(5, 20, 50, 10, 20)
     }
     connectAllInstantly()
+    createForumForAll()
 }.run()
diff --git a/build.gradle.kts b/build.gradle.kts
index de41ab2c7d8a2ce85c39c503214c742b7c54deef..ae478abc47fbc734ff1df01ca6f2a2baf32fa5f9 100644
--- a/build.gradle.kts
+++ b/build.gradle.kts
@@ -20,7 +20,7 @@
 
 buildscript {
     repositories {
-        jcenter()
+        mavenCentral()
         mavenLocal()
         google()
         maven("https://plugins.gradle.org/m2/")
@@ -36,11 +36,11 @@ buildscript {
     // keep version here in sync when updating briar
     extra.apply {
         set("kotlin_version", "1.7.10") // todo: different version used in Briar-Desktop?!
-        set("dagger_version", "2.33")
+        set("dagger_version", "2.43.2")
         set("okhttp_version", "3.12.13")
-        set("jackson_version", "2.13.0")
+        set("jackson_version", "2.13.4")
         set("tor_version", "0.4.5.14")
-        set("obfs4proxy_version", "0.0.14")
+        set("obfs4proxy_version", "0.0.14-tor1")
         set("snowflake_version", "2.3.1")
         set("junit_version", "4.13.2")
         set("jmock_version", "2.12.0")