diff --git a/.idea/compiler.xml b/.idea/compiler.xml
index a052e5d79802d6bb7bdd28c494d5c939f2091a85..66de1104ddf5bedaea1682cfcbd88f4a57fc4987 100644
--- a/.idea/compiler.xml
+++ b/.idea/compiler.xml
@@ -5,10 +5,10 @@
       <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.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.dagger/dagger-compiler/2.45/7344336aef4dd8e6331c7c382441f95f4b0da520/dagger-compiler-2.45.jar" />
+          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.dagger/dagger-spi/2.45/362fded55ee0636814bfaf55aa605a90355ce3f3/dagger-spi-2.45.jar" />
+          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.dagger/dagger-producers/2.45/87d7969bca21fa4caa5508ce666fc9f1839a5981/dagger-producers-2.45.jar" />
+          <entry name="$USER_HOME$/.gradle/caches/modules-2/files-2.1/com.google.dagger/dagger/2.45/f7e0def41c2dbb7f79613003ae4ee49f65dc2759/dagger-2.45.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/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" />
@@ -18,8 +18,10 @@
           <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.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/com.squareup/kotlinpoet/1.11.0/5a16322632c6361f7058c948bab1aafa6e7a337f/kotlinpoet-1.11.0.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.kotlin/kotlin-reflect/1.6.10/1cbe9c92c12a94eea200d23c2bbaedaf3daf5132/kotlin-reflect-1.6.10.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" />
@@ -31,7 +33,6 @@
           <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" />
-        <module name="briar-desktop.bramble-java.test" />
         <module name="briar-desktop.briar-core.main" />
         <module name="briar-desktop.briar-core.test" />
         <module name="briar-desktop.bramble-java.main" />
diff --git a/.idea/icon.svg b/.idea/icon.svg
new file mode 100644
index 0000000000000000000000000000000000000000..20b6cabbbc45fcf7d7690b6ba5b6c713b14df539
--- /dev/null
+++ b/.idea/icon.svg
@@ -0,0 +1,98 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<svg
+   xmlns:dc="http://purl.org/dc/elements/1.1/"
+   xmlns:cc="http://creativecommons.org/ns#"
+   xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
+   xmlns:svg="http://www.w3.org/2000/svg"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   version="1.1"
+   id="Ebene_1"
+   x="0px"
+   y="0px"
+   viewBox="0 0 330.00001 330.00001"
+   xml:space="preserve"
+   inkscape:version="0.92.5 (2060ec1f9f, 2020-04-08)"
+   sodipodi:docname="logo_circle.svg"
+   width="330"
+   height="330"><metadata
+     id="metadata61"><rdf:RDF><cc:Work
+         rdf:about=""><dc:format>image/svg+xml</dc:format><dc:type
+           rdf:resource="http://purl.org/dc/dcmitype/StillImage" /><dc:title></dc:title></cc:Work></rdf:RDF></metadata><defs
+     id="defs59" /><sodipodi:namedview
+     pagecolor="#000000"
+     bordercolor="#666666"
+     borderopacity="1"
+     objecttolerance="10"
+     gridtolerance="10"
+     guidetolerance="10"
+     inkscape:pageopacity="0"
+     inkscape:pageshadow="2"
+     inkscape:window-width="1680"
+     inkscape:window-height="993"
+     id="namedview57"
+     showgrid="false"
+     inkscape:zoom="1.2101234"
+     inkscape:cx="50.121881"
+     inkscape:cy="156.73039"
+     inkscape:window-x="0"
+     inkscape:window-y="0"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="Ebene_1" /><style
+     type="text/css"
+     id="style3">
+	.st0{fill:#FFFFFF;}
+	.st1{display:none;fill:#87C214;}
+	.st2{fill:#87C214;}
+	.st3{display:none;fill:#FFFFFF;}
+	.st4{fill:#95D220;}
+	.st5{display:none;fill:#95D220;}
+</style><circle
+     style="fill:#ffffff"
+     id="circle7"
+     cy="165"
+     cx="165"
+     class="st0"
+     r="165" /><g
+     id="g1059"><path
+       class="st2"
+       d="m 94.299994,145.70001 v 119.5 c 0,9.7 7.899996,17.7 17.699996,17.7 h 8.3 c 9.7,0 17.7,-8 17.7,-17.7 v -119.5 z"
+       id="path15"
+       inkscape:connector-curvature="0"
+       style="fill:#87c214" /><path
+       class="st2"
+       d="m 137.99999,88.000006 v -22.5 c 0,-9.7 -8,-17.7 -17.7,-17.7 h -8.3 c -9.7,0 -17.699996,8 -17.699996,17.7 v 22.5 z"
+       id="path17"
+       inkscape:connector-curvature="0"
+       style="fill:#87c214" /><path
+       class="st2"
+       d="M 234.99999,185.00001 V 65.500006 c 0,-9.7 -7.9,-17.7 -17.7,-17.7 h -8.3 c -9.7,0 -17.7,8 -17.7,17.7 V 185.00001 Z"
+       id="path25"
+       inkscape:connector-curvature="0"
+       style="fill:#87c214" /><path
+       class="st2"
+       d="m 191.29999,242.70001 v 22.5 c 0,9.7 8,17.7 17.7,17.7 h 8.3 c 9.7,0 17.7,-8 17.7,-17.7 v -22.5 z"
+       id="path29"
+       inkscape:connector-curvature="0"
+       style="fill:#87c214" /><path
+       class="st4"
+       d="m 87.299994,192.00001 h -22.5 c -9.7,0 -17.7,7.9 -17.7,17.7 v 8.3 c 0,9.7 7.9,17.7 17.7,17.7 h 22.5 z"
+       id="path37"
+       inkscape:connector-curvature="0"
+       style="fill:#95d220" /><path
+       class="st4"
+       d="m 264.49999,192.00001 h -119.5 v 43.7 h 119.5 c 9.7,0 17.7,-8 17.7,-17.7 v -8.3 c -0.1,-9.7 -8,-17.7 -17.7,-17.7 z"
+       id="path41"
+       inkscape:connector-curvature="0"
+       style="fill:#95d220" /><path
+       class="st4"
+       d="M 184.29999,95.000006 H 64.799994 c -9.7,0 -17.7,7.900004 -17.7,17.700004 v 8.3 c 0,9.7 7.9,17.7 17.7,17.7 H 184.29999 Z"
+       id="path51"
+       inkscape:connector-curvature="0"
+       style="fill:#95d220" /><path
+       class="st4"
+       d="m 264.49999,95.000006 h -22.5 v 43.700004 h 22.5 c 9.7,0 17.7,-7.9 17.7,-17.7 v -8.3 c -0.1,-9.7 -8,-17.700004 -17.7,-17.700004 z"
+       id="path53"
+       inkscape:connector-curvature="0"
+       style="fill:#95d220" /></g></svg>
diff --git a/briar-desktop/build.gradle.kts b/briar-desktop/build.gradle.kts
index 88dbb7bf5147cdf58a0fba20896364f4d2b801e9..c3f86fa97885449ac1fd671c469cb1da4bfe0464 100644
--- a/briar-desktop/build.gradle.kts
+++ b/briar-desktop/build.gradle.kts
@@ -93,6 +93,7 @@ buildData {
 val tor_version: String by rootProject.extra
 val obfs4proxy_version: String by rootProject.extra
 val snowflake_version: String by rootProject.extra
+val dagger_version: String by rootProject.extra
 
 dependencies {
     currentOs(compose.desktop.currentOs)
@@ -143,13 +144,12 @@ dependencies {
         exclude(group = "net.java.dev.jna", module = "jna")
     }
 
-    val daggerVersion = "2.24"
-    kapt("com.google.dagger:dagger-compiler:$daggerVersion")
+    kapt("com.google.dagger:dagger-compiler:$dagger_version")
 
     testImplementation(kotlin("test-testng"))
     testImplementation(project(path = ":bramble-core", configuration = "testOutput"))
     testImplementation("commons-io:commons-io:2.11.0")
-    kaptTest("com.google.dagger:dagger-compiler:$daggerVersion")
+    kaptTest("com.google.dagger:dagger-compiler:$dagger_version")
 }
 
 // hacky fix for upstream issue when selecting skiko in gradle