diff --git a/bramble-api/build.gradle b/bramble-api/build.gradle
index 138b9484c42499641050b92a65f2a5974ca30364..0f68839eef9ed477d4f48df8f26ff8f3e3946cf7 100644
--- a/bramble-api/build.gradle
+++ b/bramble-api/build.gradle
@@ -5,18 +5,37 @@ targetCompatibility = 1.6
 apply plugin: 'witness'
 
 dependencies {
-	compile "com.google.dagger:dagger:2.0.2"
-	compile 'com.google.dagger:dagger-compiler:2.0.2'
+	compile "com.google.dagger:dagger:2.8"
+	compile 'com.google.dagger:dagger-compiler:2.8'
 	compile 'com.google.code.findbugs:jsr305:3.0.1'
+
+	testCompile 'junit:junit:4.12'
+	testCompile "org.jmock:jmock:2.8.1"
+	testCompile "org.jmock:jmock-junit4:2.8.1"
+	testCompile "org.jmock:jmock-legacy:2.8.1"
+	testCompile "org.hamcrest:hamcrest-library:1.3"
+	testCompile "org.hamcrest:hamcrest-core:1.3"
 }
 
 dependencyVerification {
 	verify = [
-			'com.google.dagger:dagger:84c0282ed8be73a29e0475d639da030b55dee72369e58dd35ae7d4fe6243dcf9',
-			'com.google.dagger:dagger-compiler:b74bc9de063dd4c6400b232231f2ef5056145b8fbecbf5382012007dd1c071b3',
+			'com.google.dagger:dagger:5070e1dff5c551a4908ba7b93125c0243de2a688aed3d2f475357d86d9d7c0ad',
+			'com.google.dagger:dagger-compiler:7b2686f94907868c5364e9965601ffe2f020ba4af1849ad9b57dad5fe3fa6242',
+			'com.google.code.findbugs:jsr305:c885ce34249682bc0236b4a7d56efcc12048e6135a5baf7a9cde8ad8cda13fcd',
 			'javax.inject:javax.inject:91c77044a50c481636c32d916fd89c9118a72195390452c81065080f957de7ff',
-			'com.google.dagger:dagger-producers:99ec15e8a0507ba569e7655bc1165ee5e5ca5aa914b3c8f7e2c2458f724edd6b',
-			'com.google.guava:guava:d664fbfc03d2e5ce9cab2a44fb01f1d0bf9dfebeccc1a473b1f9ea31f79f6f99',
-			'com.google.code.findbugs:jsr305:c885ce34249682bc0236b4a7d56efcc12048e6135a5baf7a9cde8ad8cda13fcd'
+			'com.google.dagger:dagger-producers:1e4043e85f67de381d19e22c7932aaf7ff1611091be7e1aaae93f2c37f331cf2',
+			'com.google.guava:guava:ff89d4a4a6b303c4084194975a5a35f55a8af6f7337678b4cc8ddbea9005c323',
 	]
 }
+
+// needed to make test output available to bramble-core and briar-core
+configurations {
+	testOutput.extendsFrom(testCompile)
+}
+task jarTest(type: Jar, dependsOn: testClasses) {
+	from sourceSets.test.output
+	classifier = 'test'
+}
+artifacts {
+	testOutput jarTest
+}
diff --git a/briar-tests/src/org/briarproject/bramble/data/BdfDictionaryTest.java b/bramble-api/src/test/java/org/briarproject/bramble/api/data/BdfDictionaryTest.java
similarity index 94%
rename from briar-tests/src/org/briarproject/bramble/data/BdfDictionaryTest.java
rename to bramble-api/src/test/java/org/briarproject/bramble/api/data/BdfDictionaryTest.java
index 5aabfdd609f4052c89a0c177ca8c2546a034e82f..17bb651163b4e0294fae3cac32b6a0cf0981d0d4 100644
--- a/briar-tests/src/org/briarproject/bramble/data/BdfDictionaryTest.java
+++ b/bramble-api/src/test/java/org/briarproject/bramble/api/data/BdfDictionaryTest.java
@@ -1,9 +1,7 @@
-package org.briarproject.bramble.data;
+package org.briarproject.bramble.api.data;
 
-import org.briarproject.BriarTestCase;
 import org.briarproject.bramble.api.Bytes;
-import org.briarproject.bramble.api.data.BdfDictionary;
-import org.briarproject.bramble.api.data.BdfEntry;
+import org.briarproject.bramble.test.BrambleTestCase;
 import org.junit.Test;
 
 import java.util.Collections;
@@ -15,7 +13,7 @@ import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-public class BdfDictionaryTest extends BriarTestCase {
+public class BdfDictionaryTest extends BrambleTestCase {
 
 	@Test
 	public void testConstructors() {
diff --git a/briar-tests/src/org/briarproject/bramble/data/BdfListTest.java b/bramble-api/src/test/java/org/briarproject/bramble/api/data/BdfListTest.java
similarity index 97%
rename from briar-tests/src/org/briarproject/bramble/data/BdfListTest.java
rename to bramble-api/src/test/java/org/briarproject/bramble/api/data/BdfListTest.java
index 7fd85878f64a115298524691277486f2714be357..55fbf39dbf798f5cd041d3dbd2f6737bb5cc6e74 100644
--- a/briar-tests/src/org/briarproject/bramble/data/BdfListTest.java
+++ b/bramble-api/src/test/java/org/briarproject/bramble/api/data/BdfListTest.java
@@ -1,11 +1,8 @@
-package org.briarproject.bramble.data;
+package org.briarproject.bramble.api.data;
 
-import org.briarproject.BriarTestCase;
 import org.briarproject.bramble.api.Bytes;
 import org.briarproject.bramble.api.FormatException;
-import org.briarproject.bramble.api.data.BdfDictionary;
-import org.briarproject.bramble.api.data.BdfEntry;
-import org.briarproject.bramble.api.data.BdfList;
+import org.briarproject.bramble.test.BrambleTestCase;
 import org.junit.Test;
 
 import java.util.Arrays;
@@ -15,7 +12,7 @@ import static org.briarproject.bramble.api.data.BdfDictionary.NULL_VALUE;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 
-public class BdfListTest extends BriarTestCase {
+public class BdfListTest extends BrambleTestCase {
 
 	@Test
 	public void testConstructors() {
diff --git a/briar-tests/src/org/briarproject/BriarMockTestCase.java b/bramble-api/src/test/java/org/briarproject/bramble/test/BrambleMockTestCase.java
similarity index 62%
rename from briar-tests/src/org/briarproject/BriarMockTestCase.java
rename to bramble-api/src/test/java/org/briarproject/bramble/test/BrambleMockTestCase.java
index 45b662013b6050e1c12b554f1437c674aa13a4e5..650063c042d4e7459b6a121652c2378337604b72 100644
--- a/briar-tests/src/org/briarproject/BriarMockTestCase.java
+++ b/bramble-api/src/test/java/org/briarproject/bramble/test/BrambleMockTestCase.java
@@ -1,9 +1,10 @@
-package org.briarproject;
+package org.briarproject.bramble.test;
 
 import org.jmock.Mockery;
 import org.junit.After;
 
-public abstract class BriarMockTestCase extends BriarTestCase {
+public abstract class BrambleMockTestCase extends
+		BrambleTestCase {
 
 	protected final Mockery context = new Mockery();
 
diff --git a/briar-tests/src/org/briarproject/BriarTestCase.java b/bramble-api/src/test/java/org/briarproject/bramble/test/BrambleTestCase.java
similarity index 79%
rename from briar-tests/src/org/briarproject/BriarTestCase.java
rename to bramble-api/src/test/java/org/briarproject/bramble/test/BrambleTestCase.java
index 745628c539be797a2a4cdb753250ca8344945719..aa0eb55e506d66599827cf09bc8605c22679f212 100644
--- a/briar-tests/src/org/briarproject/BriarTestCase.java
+++ b/bramble-api/src/test/java/org/briarproject/bramble/test/BrambleTestCase.java
@@ -1,12 +1,12 @@
-package org.briarproject;
+package org.briarproject.bramble.test;
 
 import java.lang.Thread.UncaughtExceptionHandler;
 
 import static org.junit.Assert.fail;
 
-public abstract class BriarTestCase {
+public abstract class BrambleTestCase {
 
-	public BriarTestCase() {
+	public BrambleTestCase() {
 		// Ensure exceptions thrown on worker threads cause tests to fail
 		UncaughtExceptionHandler fail = new UncaughtExceptionHandler() {
 			@Override
diff --git a/briar-tests/src/org/briarproject/TestUtils.java b/bramble-api/src/test/java/org/briarproject/bramble/test/TestUtils.java
similarity index 56%
rename from briar-tests/src/org/briarproject/TestUtils.java
rename to bramble-api/src/test/java/org/briarproject/bramble/test/TestUtils.java
index 6e28dce8cfea41777300c61dfd4ef51c1adac86a..9e8a1df9acdd3a04350d5b976e1fb7ff756b6fa7 100644
--- a/briar-tests/src/org/briarproject/TestUtils.java
+++ b/bramble-api/src/test/java/org/briarproject/bramble/test/TestUtils.java
@@ -1,19 +1,13 @@
-package org.briarproject;
+package org.briarproject.bramble.test;
 
 import org.briarproject.bramble.api.UniqueId;
 import org.briarproject.bramble.api.crypto.SecretKey;
-import org.briarproject.bramble.api.db.DbException;
-import org.briarproject.bramble.api.sync.GroupId;
 import org.briarproject.bramble.util.IoUtils;
-import org.briarproject.briar.api.client.MessageTracker;
-import org.briarproject.briar.api.client.MessageTracker.GroupCount;
 
 import java.io.File;
 import java.util.Random;
 import java.util.concurrent.atomic.AtomicInteger;
 
-import static org.junit.Assert.assertEquals;
-
 public class TestUtils {
 
 	private static final AtomicInteger nextTestDir =
@@ -51,19 +45,4 @@ public class TestUtils {
 		return new SecretKey(getRandomBytes(SecretKey.LENGTH));
 	}
 
-	public static void assertGroupCount(MessageTracker tracker, GroupId g,
-			long msgCount, long unreadCount, long latestMsgTime)
-			throws DbException {
-		GroupCount groupCount = tracker.getGroupCount(g);
-		assertEquals(msgCount, groupCount.getMsgCount());
-		assertEquals(unreadCount, groupCount.getUnreadCount());
-		assertEquals(latestMsgTime, groupCount.getLatestMsgTime());
-	}
-
-	public static void assertGroupCount(MessageTracker tracker, GroupId g,
-			long msgCount, long unreadCount) throws	DbException {
-		GroupCount c1 = tracker.getGroupCount(g);
-		assertEquals(msgCount, c1.getMsgCount());
-		assertEquals(unreadCount, c1.getUnreadCount());
-	}
 }
diff --git a/bramble-core/.gitignore b/bramble-core/.gitignore
index eeb02632a0a71dc53ad5bbb4f04aff39855b50e6..217c03c15290909413558c6b2453ab0718e96d8c 100644
--- a/bramble-core/.gitignore
+++ b/bramble-core/.gitignore
@@ -1,3 +1,4 @@
 bin
 build
+test.tmp
 .settings
diff --git a/bramble-core/build.gradle b/bramble-core/build.gradle
index 30ea06e20eafe8e0ef44fe16b9d686d0ab2bf02e..ffc432b2898a2076b0a28e3886e774a5f2d16dc0 100644
--- a/bramble-core/build.gradle
+++ b/bramble-core/build.gradle
@@ -14,10 +14,7 @@ dependencies {
 	compile 'com.madgag.spongycastle:core:1.54.0.0'
 	compile 'com.h2database:h2:1.4.190'
 
-	testCompile project(':briar-tests') // TODO remove when moving unit tests (#778)
-	testCompile 'junit:junit:4.12'
-	testCompile 'com.google.dagger:dagger-compiler:2.8'
-	testApt 'com.google.dagger:dagger-compiler:2.8'
+	testCompile project(path: ':bramble-api', configuration: 'testOutput')
 }
 
 dependencyVerification {
@@ -26,3 +23,15 @@ dependencyVerification {
 			'com.h2database:h2:23ba495a07bbbb3bd6c3084d10a96dad7a23741b8b6d64b213459a784195a98c'
 	]
 }
+
+// needed to make test output available to bramble-j2se
+configurations {
+	testOutput.extendsFrom(testCompile)
+}
+task jarTest(type: Jar, dependsOn: testClasses) {
+	from sourceSets.test.output
+	classifier = 'test'
+}
+artifacts {
+	testOutput jarTest
+}
diff --git a/briar-tests/src/org/briarproject/bramble/client/BdfMessageValidatorTest.java b/bramble-core/src/test/java/org/briarproject/bramble/client/BdfMessageValidatorTest.java
similarity index 99%
rename from briar-tests/src/org/briarproject/bramble/client/BdfMessageValidatorTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/client/BdfMessageValidatorTest.java
index c14032271dbc39bdc6402e32cf2f75c24e39d6ef..58afef572e2eb56eac2c160c5e53b6d2d09dad94 100644
--- a/briar-tests/src/org/briarproject/bramble/client/BdfMessageValidatorTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/client/BdfMessageValidatorTest.java
@@ -1,6 +1,5 @@
 package org.briarproject.bramble.client;
 
-import org.briarproject.ValidatorTestCase;
 import org.briarproject.bramble.api.FormatException;
 import org.briarproject.bramble.api.client.BdfMessageContext;
 import org.briarproject.bramble.api.client.BdfMessageValidator;
@@ -12,6 +11,7 @@ import org.briarproject.bramble.api.sync.Group;
 import org.briarproject.bramble.api.sync.InvalidMessageException;
 import org.briarproject.bramble.api.sync.Message;
 import org.briarproject.bramble.api.sync.MessageContext;
+import org.briarproject.bramble.test.ValidatorTestCase;
 import org.jmock.Expectations;
 import org.jmock.lib.legacy.ClassImposteriser;
 import org.junit.Test;
diff --git a/briar-tests/src/org/briarproject/bramble/client/ClientHelperImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/client/ClientHelperImplTest.java
similarity index 95%
rename from briar-tests/src/org/briarproject/bramble/client/ClientHelperImplTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/client/ClientHelperImplTest.java
index 818db58b612aa9ed8e386bb15873471599f47156..d0def2ad4cd817a3319359dc2b92eef309fd4481 100644
--- a/briar-tests/src/org/briarproject/bramble/client/ClientHelperImplTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/client/ClientHelperImplTest.java
@@ -1,7 +1,5 @@
 package org.briarproject.bramble.client;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.FormatException;
 import org.briarproject.bramble.api.client.ClientHelper;
 import org.briarproject.bramble.api.crypto.CryptoComponent;
@@ -21,6 +19,8 @@ import org.briarproject.bramble.api.sync.GroupId;
 import org.briarproject.bramble.api.sync.Message;
 import org.briarproject.bramble.api.sync.MessageFactory;
 import org.briarproject.bramble.api.sync.MessageId;
+import org.briarproject.bramble.test.BrambleTestCase;
+import org.briarproject.bramble.test.TestUtils;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.junit.Test;
@@ -32,13 +32,13 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
-import static org.briarproject.TestUtils.getRandomBytes;
-import static org.briarproject.TestUtils.getRandomId;
+import static org.briarproject.bramble.test.TestUtils.getRandomBytes;
+import static org.briarproject.bramble.test.TestUtils.getRandomId;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
-public class ClientHelperImplTest extends BriarTestCase {
+public class ClientHelperImplTest extends BrambleTestCase {
 
 	private final Mockery context = new Mockery();
 	private final DatabaseComponent db = context.mock(DatabaseComponent.class);
@@ -165,7 +165,8 @@ public class ClientHelperImplTest extends BriarTestCase {
 
 	@Test
 	public void testGetMessageMetadataAsDictionaryMap() throws Exception {
-		final Map<MessageId, BdfDictionary> map = new HashMap<>();
+		final Map<MessageId, BdfDictionary> map =
+				new HashMap<MessageId, BdfDictionary>();
 		map.put(messageId, dictionary);
 		final Transaction txn = new Transaction(null, true);
 
@@ -187,7 +188,8 @@ public class ClientHelperImplTest extends BriarTestCase {
 
 	@Test
 	public void testGetMessageMetadataAsDictionaryQuery() throws Exception {
-		final Map<MessageId, BdfDictionary> map = new HashMap<>();
+		final Map<MessageId, BdfDictionary> map =
+				new HashMap<MessageId, BdfDictionary>();
 		map.put(messageId, dictionary);
 		final BdfDictionary query =
 				BdfDictionary.of(new BdfEntry("query", "me"));
diff --git a/briar-tests/src/org/briarproject/bramble/contact/ContactManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/contact/ContactManagerImplTest.java
similarity index 93%
rename from briar-tests/src/org/briarproject/bramble/contact/ContactManagerImplTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/contact/ContactManagerImplTest.java
index d4f6bfc9762cf70bf1982ae094f2d870f1fd2e4b..1c4f2907374a9a90942eb6f60e060d6b561625f2 100644
--- a/briar-tests/src/org/briarproject/bramble/contact/ContactManagerImplTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/contact/ContactManagerImplTest.java
@@ -1,6 +1,5 @@
 package org.briarproject.bramble.contact;
 
-import org.briarproject.BriarMockTestCase;
 import org.briarproject.bramble.api.contact.Contact;
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.contact.ContactManager;
@@ -11,6 +10,7 @@ import org.briarproject.bramble.api.db.Transaction;
 import org.briarproject.bramble.api.identity.Author;
 import org.briarproject.bramble.api.identity.AuthorId;
 import org.briarproject.bramble.api.transport.KeyManager;
+import org.briarproject.bramble.test.BrambleMockTestCase;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.junit.Test;
@@ -19,13 +19,13 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 
-import static org.briarproject.TestUtils.getRandomBytes;
-import static org.briarproject.TestUtils.getRandomId;
-import static org.briarproject.TestUtils.getSecretKey;
+import static org.briarproject.bramble.test.TestUtils.getRandomBytes;
+import static org.briarproject.bramble.test.TestUtils.getRandomId;
+import static org.briarproject.bramble.test.TestUtils.getSecretKey;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-public class ContactManagerImplTest extends BriarMockTestCase {
+public class ContactManagerImplTest extends BrambleMockTestCase {
 
 	private final Mockery context = new Mockery();
 	private final DatabaseComponent db = context.mock(DatabaseComponent.class);
@@ -132,7 +132,8 @@ public class ContactManagerImplTest extends BriarMockTestCase {
 	@Test
 	public void testActiveContacts() throws Exception {
 		Collection<Contact> activeContacts = Collections.singletonList(contact);
-		final Collection<Contact> contacts = new ArrayList<>(activeContacts);
+		final Collection<Contact> contacts =
+				new ArrayList<Contact>(activeContacts);
 		contacts.add(new Contact(new ContactId(3), remote, local, true, false));
 		final Transaction txn = new Transaction(null, true);
 		context.checking(new Expectations() {{
diff --git a/briar-tests/src/org/briarproject/bramble/crypto/AsciiArmourTest.java b/bramble-core/src/test/java/org/briarproject/bramble/crypto/AsciiArmourTest.java
similarity index 92%
rename from briar-tests/src/org/briarproject/bramble/crypto/AsciiArmourTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/crypto/AsciiArmourTest.java
index 21fb4e3102c50c29304d10f592e0ca9ab195366b..7d1f045c2fc6077afef2a25620b6c9fa0c8b4e7c 100644
--- a/briar-tests/src/org/briarproject/bramble/crypto/AsciiArmourTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/crypto/AsciiArmourTest.java
@@ -1,12 +1,12 @@
 package org.briarproject.bramble.crypto;
 
-import org.briarproject.BriarTestCase;
+import org.briarproject.bramble.test.BrambleTestCase;
 import org.junit.Test;
 
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 
-public class AsciiArmourTest extends BriarTestCase {
+public class AsciiArmourTest extends BrambleTestCase {
 
 	@Test
 	public void testWrapOnSingleLine() {
diff --git a/briar-tests/src/org/briarproject/bramble/crypto/Blake2sDigestTest.java b/bramble-core/src/test/java/org/briarproject/bramble/crypto/Blake2sDigestTest.java
similarity index 98%
rename from briar-tests/src/org/briarproject/bramble/crypto/Blake2sDigestTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/crypto/Blake2sDigestTest.java
index cd6494a400f0905bbba60533d31b144765f90e92..da0e7d5dad1a4c63f48ced68e34554afffe5314b 100644
--- a/briar-tests/src/org/briarproject/bramble/crypto/Blake2sDigestTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/crypto/Blake2sDigestTest.java
@@ -1,6 +1,6 @@
 package org.briarproject.bramble.crypto;
 
-import org.briarproject.BriarTestCase;
+import org.briarproject.bramble.test.BrambleTestCase;
 import org.briarproject.bramble.util.StringUtils;
 import org.junit.Test;
 
@@ -8,7 +8,7 @@ import java.util.Random;
 
 import static org.junit.Assert.assertArrayEquals;
 
-public class Blake2sDigestTest extends BriarTestCase {
+public class Blake2sDigestTest extends BrambleTestCase {
 
 	// Vectors from BLAKE2 web site: https://blake2.net/blake2s-test.txt
 	private static final String[][] keyedTestVectors = {
diff --git a/briar-tests/src/org/briarproject/bramble/crypto/EllipticCurveMultiplicationTest.java b/bramble-core/src/test/java/org/briarproject/bramble/crypto/EllipticCurveMultiplicationTest.java
similarity index 97%
rename from briar-tests/src/org/briarproject/bramble/crypto/EllipticCurveMultiplicationTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/crypto/EllipticCurveMultiplicationTest.java
index 241e57c6ae8c449ea7a88b65beb67128218e1211..ce3d03e443339a041454947603ff54509d2c24d4 100644
--- a/briar-tests/src/org/briarproject/bramble/crypto/EllipticCurveMultiplicationTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/crypto/EllipticCurveMultiplicationTest.java
@@ -1,6 +1,6 @@
 package org.briarproject.bramble.crypto;
 
-import org.briarproject.BriarTestCase;
+import org.briarproject.bramble.test.BrambleTestCase;
 import org.junit.Test;
 import org.spongycastle.asn1.teletrust.TeleTrusTNamedCurves;
 import org.spongycastle.asn1.x9.X9ECParameters;
@@ -20,7 +20,7 @@ import java.security.SecureRandom;
 import static org.briarproject.bramble.crypto.EllipticCurveConstants.PARAMETERS;
 import static org.junit.Assert.assertEquals;
 
-public class EllipticCurveMultiplicationTest extends BriarTestCase {
+public class EllipticCurveMultiplicationTest extends BrambleTestCase {
 
 	@Test
 	public void testMultiplierProducesSameResultsAsDefault() throws Exception {
diff --git a/briar-tests/src/org/briarproject/bramble/crypto/EllipticCurvePerformanceTest.java b/bramble-core/src/test/java/org/briarproject/bramble/crypto/EllipticCurvePerformanceTest.java
similarity index 98%
rename from briar-tests/src/org/briarproject/bramble/crypto/EllipticCurvePerformanceTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/crypto/EllipticCurvePerformanceTest.java
index b9e695eda67af04b34f8272232497e4bf05ec3f9..ec166c34498190b2193c98bac1ba35162ea04f32 100644
--- a/briar-tests/src/org/briarproject/bramble/crypto/EllipticCurvePerformanceTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/crypto/EllipticCurvePerformanceTest.java
@@ -69,7 +69,7 @@ public class EllipticCurvePerformanceTest {
 		ECPublicKeyParameters public2 =
 				(ECPublicKeyParameters) keyPair2.getPublic();
 		// Time some ECDH key agreements
-		List<Long> samples = new ArrayList<>();
+		List<Long> samples = new ArrayList<Long>();
 		for (int i = 0; i < SAMPLES; i++) {
 			ECDHCBasicAgreement agreement = new ECDHCBasicAgreement();
 			long start = System.nanoTime();
@@ -79,7 +79,7 @@ public class EllipticCurvePerformanceTest {
 		}
 		long agreementMedian = median(samples);
 		// Time some signatures
-		List<byte[]> signatures = new ArrayList<>();
+		List<byte[]> signatures = new ArrayList<byte[]>();
 		samples.clear();
 		for (int i = 0; i < SAMPLES; i++) {
 			Digest digest = new Blake2sDigest();
diff --git a/briar-tests/src/org/briarproject/bramble/crypto/FortunaGeneratorTest.java b/bramble-core/src/test/java/org/briarproject/bramble/crypto/FortunaGeneratorTest.java
similarity index 96%
rename from briar-tests/src/org/briarproject/bramble/crypto/FortunaGeneratorTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/crypto/FortunaGeneratorTest.java
index 44f986b7e61eedbac144c4ca9f30264db087084b..c1573f610f3fb8cfcf74e77840e511cfaea3d7e9 100644
--- a/briar-tests/src/org/briarproject/bramble/crypto/FortunaGeneratorTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/crypto/FortunaGeneratorTest.java
@@ -1,6 +1,6 @@
 package org.briarproject.bramble.crypto;
 
-import org.briarproject.BriarTestCase;
+import org.briarproject.bramble.test.BrambleTestCase;
 import org.junit.Test;
 import org.spongycastle.crypto.BlockCipher;
 import org.spongycastle.crypto.engines.AESLightEngine;
@@ -9,7 +9,7 @@ import org.spongycastle.crypto.params.KeyParameter;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 
-public class FortunaGeneratorTest extends BriarTestCase {
+public class FortunaGeneratorTest extends BrambleTestCase {
 
 	@Test
 	public void testCounterInitialisedToOne() {
diff --git a/briar-tests/src/org/briarproject/bramble/crypto/FortunaSecureRandomTest.java b/bramble-core/src/test/java/org/briarproject/bramble/crypto/FortunaSecureRandomTest.java
similarity index 95%
rename from briar-tests/src/org/briarproject/bramble/crypto/FortunaSecureRandomTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/crypto/FortunaSecureRandomTest.java
index 6e789aa7fedb2c79b5eb0156a1956ea527a67536..d685ce11fba2cf0f0da06b1681727af3c65c5ca3 100644
--- a/briar-tests/src/org/briarproject/bramble/crypto/FortunaSecureRandomTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/crypto/FortunaSecureRandomTest.java
@@ -1,6 +1,6 @@
 package org.briarproject.bramble.crypto;
 
-import org.briarproject.BriarTestCase;
+import org.briarproject.bramble.test.BrambleTestCase;
 import org.junit.Test;
 import org.spongycastle.crypto.BlockCipher;
 import org.spongycastle.crypto.digests.SHA256Digest;
@@ -13,7 +13,7 @@ import static org.briarproject.bramble.crypto.FortunaSecureRandom.SELF_TEST_VECT
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertTrue;
 
-public class FortunaSecureRandomTest extends BriarTestCase {
+public class FortunaSecureRandomTest extends BrambleTestCase {
 
 	@Test
 	public void testClassPassesSelfTest() {
diff --git a/briar-tests/src/org/briarproject/bramble/crypto/KeyAgreementTest.java b/bramble-core/src/test/java/org/briarproject/bramble/crypto/KeyAgreementTest.java
similarity index 90%
rename from briar-tests/src/org/briarproject/bramble/crypto/KeyAgreementTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/crypto/KeyAgreementTest.java
index 00cb0e79822f251a3f01783dae723c8943bafc1b..0a0e826dc92445b75b191fc1a4fe6e85d948d241 100644
--- a/briar-tests/src/org/briarproject/bramble/crypto/KeyAgreementTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/crypto/KeyAgreementTest.java
@@ -1,16 +1,16 @@
 package org.briarproject.bramble.crypto;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestSeedProvider;
 import org.briarproject.bramble.api.crypto.CryptoComponent;
 import org.briarproject.bramble.api.crypto.KeyPair;
 import org.briarproject.bramble.api.crypto.SecretKey;
 import org.briarproject.bramble.api.system.SeedProvider;
+import org.briarproject.bramble.test.BrambleTestCase;
+import org.briarproject.bramble.test.TestSeedProvider;
 import org.junit.Test;
 
 import static org.junit.Assert.assertArrayEquals;
 
-public class KeyAgreementTest extends BriarTestCase {
+public class KeyAgreementTest extends BrambleTestCase {
 
 	@Test
 	public void testDeriveMasterSecret() throws Exception {
diff --git a/briar-tests/src/org/briarproject/bramble/crypto/KeyDerivationTest.java b/bramble-core/src/test/java/org/briarproject/bramble/crypto/KeyDerivationTest.java
similarity index 96%
rename from briar-tests/src/org/briarproject/bramble/crypto/KeyDerivationTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/crypto/KeyDerivationTest.java
index 3d80762e06c8c13d8f2009544dc2aee73b892da9..616833c470b8f0d4217acd18519e206d2116e14e 100644
--- a/briar-tests/src/org/briarproject/bramble/crypto/KeyDerivationTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/crypto/KeyDerivationTest.java
@@ -1,12 +1,12 @@
 package org.briarproject.bramble.crypto;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestSeedProvider;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.crypto.CryptoComponent;
 import org.briarproject.bramble.api.crypto.SecretKey;
 import org.briarproject.bramble.api.plugin.TransportId;
 import org.briarproject.bramble.api.transport.TransportKeys;
+import org.briarproject.bramble.test.BrambleTestCase;
+import org.briarproject.bramble.test.TestSeedProvider;
+import org.briarproject.bramble.test.TestUtils;
 import org.junit.Test;
 
 import java.util.ArrayList;
@@ -16,7 +16,7 @@ import java.util.List;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertFalse;
 
-public class KeyDerivationTest extends BriarTestCase {
+public class KeyDerivationTest extends BrambleTestCase {
 
 	private final TransportId transportId = new TransportId("id");
 	private final CryptoComponent crypto;
@@ -141,7 +141,7 @@ public class KeyDerivationTest extends BriarTestCase {
 	}
 
 	private void assertAllDifferent(TransportKeys... transportKeys) {
-		List<SecretKey> secretKeys = new ArrayList<>();
+		List<SecretKey> secretKeys = new ArrayList<SecretKey>();
 		for (TransportKeys k : transportKeys) {
 			secretKeys.add(k.getPreviousIncomingKeys().getTagKey());
 			secretKeys.add(k.getPreviousIncomingKeys().getHeaderKey());
diff --git a/briar-tests/src/org/briarproject/bramble/crypto/KeyEncodingAndParsingTest.java b/bramble-core/src/test/java/org/briarproject/bramble/crypto/KeyEncodingAndParsingTest.java
similarity index 96%
rename from briar-tests/src/org/briarproject/bramble/crypto/KeyEncodingAndParsingTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/crypto/KeyEncodingAndParsingTest.java
index 350354bf0e582a16e3cbc74b5604a47fdf45cdcf..3a6f011f87ff2dcfa0479e1b130c98ce76123fc9 100644
--- a/briar-tests/src/org/briarproject/bramble/crypto/KeyEncodingAndParsingTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/crypto/KeyEncodingAndParsingTest.java
@@ -1,12 +1,12 @@
 package org.briarproject.bramble.crypto;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestSeedProvider;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.crypto.KeyPair;
 import org.briarproject.bramble.api.crypto.KeyParser;
 import org.briarproject.bramble.api.crypto.PrivateKey;
 import org.briarproject.bramble.api.crypto.PublicKey;
+import org.briarproject.bramble.test.BrambleTestCase;
+import org.briarproject.bramble.test.TestSeedProvider;
+import org.briarproject.bramble.test.TestUtils;
 import org.junit.Test;
 
 import java.security.GeneralSecurityException;
@@ -16,7 +16,7 @@ import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_SIGNATUR
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertTrue;
 
-public class KeyEncodingAndParsingTest extends BriarTestCase {
+public class KeyEncodingAndParsingTest extends BrambleTestCase {
 
 	private final CryptoComponentImpl crypto =
 			new CryptoComponentImpl(new TestSeedProvider());
diff --git a/briar-tests/src/org/briarproject/bramble/crypto/MacTest.java b/bramble-core/src/test/java/org/briarproject/bramble/crypto/MacTest.java
similarity index 89%
rename from briar-tests/src/org/briarproject/bramble/crypto/MacTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/crypto/MacTest.java
index 8b9e59bab4515636b55de7526f03b9d3d5668ea2..3699e601e810d9588830ba52d4fbdc8e30a46c41 100644
--- a/briar-tests/src/org/briarproject/bramble/crypto/MacTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/crypto/MacTest.java
@@ -1,10 +1,10 @@
 package org.briarproject.bramble.crypto;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestSeedProvider;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.crypto.CryptoComponent;
 import org.briarproject.bramble.api.crypto.SecretKey;
+import org.briarproject.bramble.test.BrambleTestCase;
+import org.briarproject.bramble.test.TestSeedProvider;
+import org.briarproject.bramble.test.TestUtils;
 import org.junit.Test;
 
 import java.util.Arrays;
@@ -12,7 +12,7 @@ import java.util.Arrays;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertFalse;
 
-public class MacTest extends BriarTestCase {
+public class MacTest extends BrambleTestCase {
 
 	private final CryptoComponent crypto;
 
diff --git a/briar-tests/src/org/briarproject/bramble/crypto/MessageEncrypterTest.java b/bramble-core/src/test/java/org/briarproject/bramble/crypto/MessageEncrypterTest.java
similarity index 91%
rename from briar-tests/src/org/briarproject/bramble/crypto/MessageEncrypterTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/crypto/MessageEncrypterTest.java
index ea36d9ca366d51d8cc9984f30870b1fc1e591eb6..8b15e222a12c06a9d665cc7ff9b2456d7b7b1a1f 100644
--- a/briar-tests/src/org/briarproject/bramble/crypto/MessageEncrypterTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/crypto/MessageEncrypterTest.java
@@ -1,9 +1,9 @@
 package org.briarproject.bramble.crypto;
 
-import org.briarproject.BriarTestCase;
 import org.briarproject.bramble.api.crypto.KeyPair;
 import org.briarproject.bramble.api.crypto.PrivateKey;
 import org.briarproject.bramble.api.crypto.PublicKey;
+import org.briarproject.bramble.test.BrambleTestCase;
 import org.junit.Test;
 import org.spongycastle.crypto.CryptoException;
 
@@ -11,7 +11,7 @@ import java.security.SecureRandom;
 
 import static org.junit.Assert.assertArrayEquals;
 
-public class MessageEncrypterTest extends BriarTestCase {
+public class MessageEncrypterTest extends BrambleTestCase {
 
 	private final SecureRandom random = new SecureRandom();
 
diff --git a/briar-tests/src/org/briarproject/bramble/crypto/PasswordBasedKdfTest.java b/bramble-core/src/test/java/org/briarproject/bramble/crypto/PasswordBasedKdfTest.java
similarity index 88%
rename from briar-tests/src/org/briarproject/bramble/crypto/PasswordBasedKdfTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/crypto/PasswordBasedKdfTest.java
index 5d070af0d088b4f30e95867e136edb16eb3f7bbb..f92b0fef69dc429ef45258b16a714c7fa90a179d 100644
--- a/briar-tests/src/org/briarproject/bramble/crypto/PasswordBasedKdfTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/crypto/PasswordBasedKdfTest.java
@@ -1,8 +1,8 @@
 package org.briarproject.bramble.crypto;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestSeedProvider;
-import org.briarproject.TestUtils;
+import org.briarproject.bramble.test.BrambleTestCase;
+import org.briarproject.bramble.test.TestSeedProvider;
+import org.briarproject.bramble.test.TestUtils;
 import org.junit.Test;
 
 import java.util.Random;
@@ -12,7 +12,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
-public class PasswordBasedKdfTest extends BriarTestCase {
+public class PasswordBasedKdfTest extends BrambleTestCase {
 
 	private final CryptoComponentImpl crypto =
 			new CryptoComponentImpl(new TestSeedProvider());
diff --git a/briar-tests/src/org/briarproject/bramble/crypto/PasswordStrengthEstimatorImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/crypto/PasswordStrengthEstimatorImplTest.java
similarity index 87%
rename from briar-tests/src/org/briarproject/bramble/crypto/PasswordStrengthEstimatorImplTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/crypto/PasswordStrengthEstimatorImplTest.java
index 3eea773aa4dc1e85f3d5e358d4049c016bdc8dd2..28f7e4bd211d534790bbcc85e7233b7c547589eb 100644
--- a/briar-tests/src/org/briarproject/bramble/crypto/PasswordStrengthEstimatorImplTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/crypto/PasswordStrengthEstimatorImplTest.java
@@ -1,13 +1,13 @@
 package org.briarproject.bramble.crypto;
 
-import org.briarproject.BriarTestCase;
 import org.briarproject.bramble.api.crypto.PasswordStrengthEstimator;
+import org.briarproject.bramble.test.BrambleTestCase;
 import org.junit.Test;
 
 import static org.briarproject.bramble.api.crypto.PasswordStrengthEstimator.QUITE_STRONG;
 import static org.junit.Assert.assertTrue;
 
-public class PasswordStrengthEstimatorImplTest extends BriarTestCase {
+public class PasswordStrengthEstimatorImplTest extends BrambleTestCase {
 
 	@Test
 	public void testWeakPasswords() {
diff --git a/briar-tests/src/org/briarproject/bramble/crypto/SignatureTest.java b/bramble-core/src/test/java/org/briarproject/bramble/crypto/SignatureTest.java
similarity index 94%
rename from briar-tests/src/org/briarproject/bramble/crypto/SignatureTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/crypto/SignatureTest.java
index 7971809ddc30855ca2768ef486ee230a7e42dfda..017ba3a3ba2896ef73e6ae5152ca718e2a1ac2ad 100644
--- a/briar-tests/src/org/briarproject/bramble/crypto/SignatureTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/crypto/SignatureTest.java
@@ -1,10 +1,10 @@
 package org.briarproject.bramble.crypto;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestSeedProvider;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.crypto.CryptoComponent;
 import org.briarproject.bramble.api.crypto.KeyPair;
+import org.briarproject.bramble.test.BrambleTestCase;
+import org.briarproject.bramble.test.TestSeedProvider;
+import org.briarproject.bramble.test.TestUtils;
 import org.junit.Test;
 
 import java.util.Arrays;
@@ -13,7 +13,7 @@ import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
-public class SignatureTest extends BriarTestCase {
+public class SignatureTest extends BrambleTestCase {
 
 	private final CryptoComponent crypto;
 
diff --git a/briar-tests/src/org/briarproject/bramble/crypto/StreamDecrypterImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/crypto/StreamDecrypterImplTest.java
similarity index 97%
rename from briar-tests/src/org/briarproject/bramble/crypto/StreamDecrypterImplTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/crypto/StreamDecrypterImplTest.java
index 50d6c10c2bbf3ba79ab4899d7c9f55e553c745e9..0a6a5f4c0ede9658a15fb50b1bbdf82c3d79e039 100644
--- a/briar-tests/src/org/briarproject/bramble/crypto/StreamDecrypterImplTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/crypto/StreamDecrypterImplTest.java
@@ -1,8 +1,8 @@
 package org.briarproject.bramble.crypto;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.crypto.SecretKey;
+import org.briarproject.bramble.test.BrambleTestCase;
+import org.briarproject.bramble.test.TestUtils;
 import org.briarproject.bramble.util.ByteUtils;
 import org.junit.Test;
 
@@ -18,7 +18,7 @@ import static org.briarproject.bramble.api.transport.TransportConstants.STREAM_H
 import static org.briarproject.bramble.util.ByteUtils.INT_16_BYTES;
 import static org.junit.Assert.assertArrayEquals;
 
-public class StreamDecrypterImplTest extends BriarTestCase {
+public class StreamDecrypterImplTest extends BrambleTestCase {
 
 	private final AuthenticatedCipher cipher;
 	private final SecretKey streamHeaderKey, frameKey;
diff --git a/briar-tests/src/org/briarproject/bramble/crypto/StreamEncrypterImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/crypto/StreamEncrypterImplTest.java
similarity index 98%
rename from briar-tests/src/org/briarproject/bramble/crypto/StreamEncrypterImplTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/crypto/StreamEncrypterImplTest.java
index bb542662c583c8f6d8c341ac6afd2ca88b272ff7..8ed35336d4523771f65848eb82fa3f5b7fb317b1 100644
--- a/briar-tests/src/org/briarproject/bramble/crypto/StreamEncrypterImplTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/crypto/StreamEncrypterImplTest.java
@@ -1,8 +1,8 @@
 package org.briarproject.bramble.crypto;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.crypto.SecretKey;
+import org.briarproject.bramble.test.BrambleTestCase;
+import org.briarproject.bramble.test.TestUtils;
 import org.junit.Test;
 
 import java.io.ByteArrayOutputStream;
@@ -13,7 +13,7 @@ import static org.briarproject.bramble.api.transport.TransportConstants.STREAM_H
 import static org.briarproject.bramble.api.transport.TransportConstants.TAG_LENGTH;
 import static org.junit.Assert.assertArrayEquals;
 
-public class StreamEncrypterImplTest extends BriarTestCase {
+public class StreamEncrypterImplTest extends BrambleTestCase {
 
 	private final AuthenticatedCipher cipher;
 	private final SecretKey streamHeaderKey, frameKey;
diff --git a/briar-tests/src/org/briarproject/bramble/crypto/TestAuthenticatedCipher.java b/bramble-core/src/test/java/org/briarproject/bramble/crypto/TestAuthenticatedCipher.java
similarity index 100%
rename from briar-tests/src/org/briarproject/bramble/crypto/TestAuthenticatedCipher.java
rename to bramble-core/src/test/java/org/briarproject/bramble/crypto/TestAuthenticatedCipher.java
diff --git a/briar-tests/src/org/briarproject/bramble/crypto/XSalsa20Poly1305AuthenticatedCipherTest.java b/bramble-core/src/test/java/org/briarproject/bramble/crypto/XSalsa20Poly1305AuthenticatedCipherTest.java
similarity index 96%
rename from briar-tests/src/org/briarproject/bramble/crypto/XSalsa20Poly1305AuthenticatedCipherTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/crypto/XSalsa20Poly1305AuthenticatedCipherTest.java
index 8c19201f9f1d69138a88cd8e57f28f0e2f4f6c76..9ddcc9487c3336ab5a7091941b30c54cccb21ca2 100644
--- a/briar-tests/src/org/briarproject/bramble/crypto/XSalsa20Poly1305AuthenticatedCipherTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/crypto/XSalsa20Poly1305AuthenticatedCipherTest.java
@@ -1,7 +1,7 @@
 package org.briarproject.bramble.crypto;
 
-import org.briarproject.BriarTestCase;
 import org.briarproject.bramble.api.crypto.SecretKey;
+import org.briarproject.bramble.test.BrambleTestCase;
 import org.briarproject.bramble.util.StringUtils;
 import org.junit.Test;
 
@@ -11,7 +11,7 @@ import java.util.Random;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 
-public class XSalsa20Poly1305AuthenticatedCipherTest extends BriarTestCase {
+public class XSalsa20Poly1305AuthenticatedCipherTest extends BrambleTestCase {
 
 	// Test vectors from the NaCl paper
 	// http://cr.yp.to/highspeed/naclcrypto-20090310.pdf
diff --git a/briar-tests/src/org/briarproject/bramble/data/BdfReaderImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/data/BdfReaderImplTest.java
similarity index 99%
rename from briar-tests/src/org/briarproject/bramble/data/BdfReaderImplTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/data/BdfReaderImplTest.java
index 7520fdebd3ca72253865be8df67cc6c1ed76c3ab..f8e5fc070a4e9c32e6fa78184980334e5676290b 100644
--- a/briar-tests/src/org/briarproject/bramble/data/BdfReaderImplTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/data/BdfReaderImplTest.java
@@ -1,10 +1,10 @@
 package org.briarproject.bramble.data;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.FormatException;
 import org.briarproject.bramble.api.data.BdfDictionary;
 import org.briarproject.bramble.api.data.BdfList;
+import org.briarproject.bramble.test.BrambleTestCase;
+import org.briarproject.bramble.test.TestUtils;
 import org.briarproject.bramble.util.StringUtils;
 import org.junit.Test;
 
@@ -17,7 +17,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
-public class BdfReaderImplTest extends BriarTestCase {
+public class BdfReaderImplTest extends BrambleTestCase {
 
 	private BdfReaderImpl r = null;
 
diff --git a/briar-tests/src/org/briarproject/bramble/data/BdfWriterImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/data/BdfWriterImplTest.java
similarity index 93%
rename from briar-tests/src/org/briarproject/bramble/data/BdfWriterImplTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/data/BdfWriterImplTest.java
index c2856e5b0df73f577e9c868ef0ae1cfbae3fb85a..c480c91c65048a116e8ac93647fb6123bb167134 100644
--- a/briar-tests/src/org/briarproject/bramble/data/BdfWriterImplTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/data/BdfWriterImplTest.java
@@ -1,7 +1,7 @@
 package org.briarproject.bramble.data;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestUtils;
+import org.briarproject.bramble.test.BrambleTestCase;
+import org.briarproject.bramble.test.TestUtils;
 import org.briarproject.bramble.util.StringUtils;
 import org.junit.Before;
 import org.junit.Test;
@@ -16,7 +16,7 @@ import java.util.Map;
 import static org.briarproject.bramble.api.data.BdfDictionary.NULL_VALUE;
 import static org.junit.Assert.assertArrayEquals;
 
-public class BdfWriterImplTest extends BriarTestCase {
+public class BdfWriterImplTest extends BrambleTestCase {
 
 	private ByteArrayOutputStream out = null;
 	private BdfWriterImpl w = null;
@@ -155,7 +155,7 @@ public class BdfWriterImplTest extends BriarTestCase {
 
 	@Test
 	public void testWriteList() throws IOException {
-		List<Object> l = new ArrayList<>();
+		List<Object> l = new ArrayList<Object>();
 		for (int i = 0; i < 3; i++) l.add(i);
 		w.writeList(l);
 		// LIST tag, elements as integers, END tag
@@ -164,7 +164,7 @@ public class BdfWriterImplTest extends BriarTestCase {
 
 	@Test
 	public void testListCanContainNull() throws IOException {
-		List<Object> l = new ArrayList<>();
+		List<Object> l = new ArrayList<Object>();
 		l.add(1);
 		l.add(null);
 		l.add(NULL_VALUE);
@@ -177,7 +177,7 @@ public class BdfWriterImplTest extends BriarTestCase {
 	@Test
 	public void testWriteDictionary() throws IOException {
 		// Use LinkedHashMap to get predictable iteration order
-		Map<String, Object> m = new LinkedHashMap<>();
+		Map<String, Object> m = new LinkedHashMap<String, Object>();
 		for (int i = 0; i < 4; i++) m.put(String.valueOf(i), i);
 		w.writeDictionary(m);
 		// DICTIONARY tag, keys as strings and values as integers, END tag
@@ -216,12 +216,12 @@ public class BdfWriterImplTest extends BriarTestCase {
 
 	@Test
 	public void testWriteNestedDictionariesAndLists() throws IOException {
-		Map<String, Object> inner = new LinkedHashMap<>();
+		Map<String, Object> inner = new LinkedHashMap<String, Object>();
 		inner.put("bar", new byte[0]);
-		List<Object> list = new ArrayList<>();
+		List<Object> list = new ArrayList<Object>();
 		list.add(1);
 		list.add(inner);
-		Map<String, Object> outer = new LinkedHashMap<>();
+		Map<String, Object> outer = new LinkedHashMap<String, Object>();
 		outer.put("foo", list);
 		w.writeDictionary(outer);
 		// DICTIONARY tag, "foo" as string, LIST tag, 1 as integer,
diff --git a/briar-tests/src/org/briarproject/bramble/data/MetadataEncoderParserIntegrationTest.java b/bramble-core/src/test/java/org/briarproject/bramble/data/MetadataEncoderParserIntegrationTest.java
similarity index 90%
rename from briar-tests/src/org/briarproject/bramble/data/MetadataEncoderParserIntegrationTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/data/MetadataEncoderParserIntegrationTest.java
index 953c99a1fdeceed3034237e2fbb99e952575d90f..7fbdcb18d3523094b3fa916926a8fe5123199266 100644
--- a/briar-tests/src/org/briarproject/bramble/data/MetadataEncoderParserIntegrationTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/data/MetadataEncoderParserIntegrationTest.java
@@ -1,9 +1,9 @@
 package org.briarproject.bramble.data;
 
-import org.briarproject.BriarTestCase;
 import org.briarproject.bramble.api.FormatException;
 import org.briarproject.bramble.api.data.BdfDictionary;
 import org.briarproject.bramble.api.db.Metadata;
+import org.briarproject.bramble.test.BrambleTestCase;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -15,7 +15,7 @@ import java.util.Map;
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 
-public class MetadataEncoderParserIntegrationTest extends BriarTestCase {
+public class MetadataEncoderParserIntegrationTest extends BrambleTestCase {
 
 	private MetadataEncoderImpl e;
 	private MetadataParserImpl p;
@@ -99,7 +99,7 @@ public class MetadataEncoderParserIntegrationTest extends BriarTestCase {
 
 	@Test
 	public void testList() throws FormatException {
-		List<Long> l = new ArrayList<>(4);
+		List<Long> l = new ArrayList<Long>(4);
 		l.add(42L);
 		l.add(1337L);
 		l.add(Long.MIN_VALUE);
@@ -114,7 +114,7 @@ public class MetadataEncoderParserIntegrationTest extends BriarTestCase {
 
 	@Test
 	public void testDictionary() throws FormatException {
-		Map<String, Boolean> m = new HashMap<>();
+		Map<String, Boolean> m = new HashMap<String, Boolean>();
 		m.put("1", true);
 		m.put("2", false);
 
@@ -130,19 +130,19 @@ public class MetadataEncoderParserIntegrationTest extends BriarTestCase {
 
 	@Test
 	public void testComplexDictionary() throws FormatException {
-		Map<String, List> m = new HashMap<>();
-		List<String> one = new ArrayList<>(3);
+		Map<String, List> m = new HashMap<String, List>();
+		List<String> one = new ArrayList<String>(3);
 		one.add("\uFDD0");
 		one.add("\uFDD1");
 		one.add("\uFDD2");
 		m.put("One", one);
-		List<String> two = new ArrayList<>(2);
+		List<String> two = new ArrayList<String>(2);
 		two.add("\u0080");
 		two.add("\uD800\uDC00");
 		m.put("Two", two);
 		d.put("test", m);
 
-		Map<String, Boolean> m2 = new HashMap<>();
+		Map<String, Boolean> m2 = new HashMap<String, Boolean>();
 		m2.put("should be true", true);
 		d.put("another test", m2);
 
diff --git a/briar-tests/src/org/briarproject/bramble/db/BasicH2Test.java b/bramble-core/src/test/java/org/briarproject/bramble/db/BasicH2Test.java
similarity index 98%
rename from briar-tests/src/org/briarproject/bramble/db/BasicH2Test.java
rename to bramble-core/src/test/java/org/briarproject/bramble/db/BasicH2Test.java
index a5658ed95656277689c01a787a8877f08c8a87c6..da5d7aecfef96c8cabcc35d6d19907719a567904 100644
--- a/briar-tests/src/org/briarproject/bramble/db/BasicH2Test.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/db/BasicH2Test.java
@@ -1,7 +1,7 @@
 package org.briarproject.bramble.db;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestUtils;
+import org.briarproject.bramble.test.BrambleTestCase;
+import org.briarproject.bramble.test.TestUtils;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -23,7 +23,7 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
-public class BasicH2Test extends BriarTestCase {
+public class BasicH2Test extends BrambleTestCase {
 
 	private static final String CREATE_TABLE =
 			"CREATE TABLE foo (uniqueId BINARY(32), name VARCHAR NOT NULL)";
@@ -322,7 +322,7 @@ public class BasicH2Test extends BriarTestCase {
 
 	private List<String> getNames() throws SQLException {
 		String sql = "SELECT name FROM foo ORDER BY uniqueId";
-		List<String> names = new ArrayList<>();
+		List<String> names = new ArrayList<String>();
 		try {
 			PreparedStatement ps = connection.prepareStatement(sql);
 			ResultSet rs = ps.executeQuery();
diff --git a/briar-tests/src/org/briarproject/bramble/db/DatabaseComponentImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/db/DatabaseComponentImplTest.java
similarity index 99%
rename from briar-tests/src/org/briarproject/bramble/db/DatabaseComponentImplTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/db/DatabaseComponentImplTest.java
index 62b7cc0834153915e53ac6bb53e5ac71be9fcfe6..7c46cc6e59b0617a62cef606811441612fc8be19 100644
--- a/briar-tests/src/org/briarproject/bramble/db/DatabaseComponentImplTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/db/DatabaseComponentImplTest.java
@@ -1,7 +1,5 @@
 package org.briarproject.bramble.db;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.contact.Contact;
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.contact.event.ContactAddedEvent;
@@ -49,6 +47,8 @@ import org.briarproject.bramble.api.sync.event.MessagesSentEvent;
 import org.briarproject.bramble.api.transport.IncomingKeys;
 import org.briarproject.bramble.api.transport.OutgoingKeys;
 import org.briarproject.bramble.api.transport.TransportKeys;
+import org.briarproject.bramble.test.BrambleTestCase;
+import org.briarproject.bramble.test.TestUtils;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.junit.Test;
@@ -72,7 +72,7 @@ import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.fail;
 
-public class DatabaseComponentImplTest extends BriarTestCase {
+public class DatabaseComponentImplTest extends BrambleTestCase {
 
 	private final Object txn = new Object();
 	private final ClientId clientId;
@@ -118,8 +118,8 @@ public class DatabaseComponentImplTest extends BriarTestCase {
 
 	private DatabaseComponent createDatabaseComponent(Database<Object> database,
 			EventBus eventBus, ShutdownManager shutdown) {
-		return new DatabaseComponentImpl<>(database, Object.class, eventBus,
-				shutdown);
+		return new DatabaseComponentImpl<Object>(database, Object.class,
+				eventBus, shutdown);
 	}
 
 	@Test
@@ -1701,7 +1701,7 @@ public class DatabaseComponentImplTest extends BriarTestCase {
 		Transaction transaction = db.startTransaction(false);
 		try {
 			db.addLocalMessage(transaction, message, metadata, true);
-			Collection<MessageId> dependencies = new ArrayList<>(2);
+			Collection<MessageId> dependencies = new ArrayList<MessageId>(2);
 			dependencies.add(messageId1);
 			dependencies.add(messageId2);
 			db.addMessageDependencies(transaction, message, dependencies);
diff --git a/briar-tests/src/org/briarproject/bramble/db/ExponentialBackoffTest.java b/bramble-core/src/test/java/org/briarproject/bramble/db/ExponentialBackoffTest.java
similarity index 95%
rename from briar-tests/src/org/briarproject/bramble/db/ExponentialBackoffTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/db/ExponentialBackoffTest.java
index 376d7e54a74fc261a84043e65cabdb041997a867..6d1de7e364f00005f7b6c5292c0d2feab6a766d2 100644
--- a/briar-tests/src/org/briarproject/bramble/db/ExponentialBackoffTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/db/ExponentialBackoffTest.java
@@ -1,11 +1,11 @@
 package org.briarproject.bramble.db;
 
-import org.briarproject.BriarTestCase;
+import org.briarproject.bramble.test.BrambleTestCase;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
 
-public class ExponentialBackoffTest extends BriarTestCase {
+public class ExponentialBackoffTest extends BrambleTestCase {
 
 	private static final int ONE_HOUR = 60 * 60 * 1000;
 
diff --git a/briar-tests/src/org/briarproject/bramble/db/H2DatabaseTest.java b/bramble-core/src/test/java/org/briarproject/bramble/db/H2DatabaseTest.java
similarity index 99%
rename from briar-tests/src/org/briarproject/bramble/db/H2DatabaseTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/db/H2DatabaseTest.java
index faf91edcd4d1595a9fcdaa9a6ccd1999ee6252da..3552beac7ea812f5405684894d695eabb7602a0e 100644
--- a/briar-tests/src/org/briarproject/bramble/db/H2DatabaseTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/db/H2DatabaseTest.java
@@ -1,8 +1,5 @@
 package org.briarproject.bramble.db;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestDatabaseConfig;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.contact.Contact;
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.crypto.SecretKey;
@@ -24,6 +21,9 @@ import org.briarproject.bramble.api.transport.IncomingKeys;
 import org.briarproject.bramble.api.transport.OutgoingKeys;
 import org.briarproject.bramble.api.transport.TransportKeys;
 import org.briarproject.bramble.system.SystemClock;
+import org.briarproject.bramble.test.BrambleTestCase;
+import org.briarproject.bramble.test.TestDatabaseConfig;
+import org.briarproject.bramble.test.TestUtils;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -61,7 +61,7 @@ import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-public class H2DatabaseTest extends BriarTestCase {
+public class H2DatabaseTest extends BrambleTestCase {
 
 	private static final int ONE_MEGABYTE = 1024 * 1024;
 	private static final int MAX_SIZE = 5 * ONE_MEGABYTE;
@@ -868,7 +868,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		assertEquals(0, db.countOfferedMessages(txn, contactId));
 
 		// Add some offered messages and count them
-		List<MessageId> ids = new ArrayList<>();
+		List<MessageId> ids = new ArrayList<MessageId>();
 		for (int i = 0; i < 10; i++) {
 			MessageId m = new MessageId(TestUtils.getRandomId());
 			db.addOfferedMessage(txn, contactId, m);
diff --git a/briar-tests/src/org/briarproject/bramble/db/LockFairnessTest.java b/bramble-core/src/test/java/org/briarproject/bramble/db/LockFairnessTest.java
similarity index 97%
rename from briar-tests/src/org/briarproject/bramble/db/LockFairnessTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/db/LockFairnessTest.java
index 947e802bd4ba1e7da74dd3595997fecb7e24e969..5b0d376106045dade93e12b2d0aea64f08e6e38e 100644
--- a/briar-tests/src/org/briarproject/bramble/db/LockFairnessTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/db/LockFairnessTest.java
@@ -1,6 +1,6 @@
 package org.briarproject.bramble.db;
 
-import org.briarproject.BriarTestCase;
+import org.briarproject.bramble.test.BrambleTestCase;
 import org.junit.Test;
 
 import java.util.concurrent.CountDownLatch;
@@ -12,7 +12,7 @@ import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-public class LockFairnessTest extends BriarTestCase {
+public class LockFairnessTest extends BrambleTestCase {
 
 	@Test
 	public void testReadersCanShareTheLock() throws Exception {
diff --git a/briar-tests/src/org/briarproject/bramble/db/TransactionIsolationTest.java b/bramble-core/src/test/java/org/briarproject/bramble/db/TransactionIsolationTest.java
similarity index 97%
rename from briar-tests/src/org/briarproject/bramble/db/TransactionIsolationTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/db/TransactionIsolationTest.java
index 77b849b60e9b4e17a48bb4f0f20df76b682c6c40..6596861cc3fcab926386c5fa8a4a6dc5f6c62021 100644
--- a/briar-tests/src/org/briarproject/bramble/db/TransactionIsolationTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/db/TransactionIsolationTest.java
@@ -1,7 +1,7 @@
 package org.briarproject.bramble.db;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestUtils;
+import org.briarproject.bramble.test.BrambleTestCase;
+import org.briarproject.bramble.test.TestUtils;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -19,7 +19,7 @@ import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-public class TransactionIsolationTest extends BriarTestCase {
+public class TransactionIsolationTest extends BrambleTestCase {
 
 	private static final String DROP_TABLE = "DROP TABLE foo IF EXISTS";
 	private static final String CREATE_TABLE = "CREATE TABLE foo"
diff --git a/briar-tests/src/org/briarproject/bramble/identity/IdentityManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/identity/IdentityManagerImplTest.java
similarity index 95%
rename from briar-tests/src/org/briarproject/bramble/identity/IdentityManagerImplTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/identity/IdentityManagerImplTest.java
index f35044b07992fd52d8ad4ec2276e8dc6d8eeed1b..fee5bc9fc1c3b24c1e38cb42f5f002de4a68e0fb 100644
--- a/briar-tests/src/org/briarproject/bramble/identity/IdentityManagerImplTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/identity/IdentityManagerImplTest.java
@@ -1,7 +1,5 @@
 package org.briarproject.bramble.identity;
 
-import org.briarproject.BriarMockTestCase;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.contact.Contact;
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.db.DatabaseComponent;
@@ -11,6 +9,8 @@ import org.briarproject.bramble.api.identity.Author;
 import org.briarproject.bramble.api.identity.AuthorId;
 import org.briarproject.bramble.api.identity.IdentityManager;
 import org.briarproject.bramble.api.identity.LocalAuthor;
+import org.briarproject.bramble.test.BrambleMockTestCase;
+import org.briarproject.bramble.test.TestUtils;
 import org.jmock.Expectations;
 import org.junit.Test;
 
@@ -24,7 +24,7 @@ import static org.briarproject.bramble.api.identity.Author.Status.UNVERIFIED;
 import static org.briarproject.bramble.api.identity.Author.Status.VERIFIED;
 import static org.junit.Assert.assertEquals;
 
-public class IdentityManagerImplTest extends BriarMockTestCase {
+public class IdentityManagerImplTest extends BrambleMockTestCase {
 
 	private final IdentityManager identityManager;
 	private final DatabaseComponent db = context.mock(DatabaseComponent.class);
@@ -79,7 +79,7 @@ public class IdentityManagerImplTest extends BriarMockTestCase {
 	@Test
 	public void testGetAuthorStatus() throws DbException {
 		final AuthorId authorId = new AuthorId(TestUtils.getRandomId());
-		final Collection<Contact> contacts = new ArrayList<>();
+		final Collection<Contact> contacts = new ArrayList<Contact>();
 
 		context.checking(new Expectations() {{
 			oneOf(db).startTransaction(true);
diff --git a/briar-tests/src/org/briarproject/bramble/keyagreement/KeyAgreementProtocolTest.java b/bramble-core/src/test/java/org/briarproject/bramble/keyagreement/KeyAgreementProtocolTest.java
similarity index 98%
rename from briar-tests/src/org/briarproject/bramble/keyagreement/KeyAgreementProtocolTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/keyagreement/KeyAgreementProtocolTest.java
index 8efc0f535c087a5adc904b5191b13d4f2a9bedfe..25cff47783861f9cb6162d5e0248b968236a46c9 100644
--- a/briar-tests/src/org/briarproject/bramble/keyagreement/KeyAgreementProtocolTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/keyagreement/KeyAgreementProtocolTest.java
@@ -1,13 +1,13 @@
 package org.briarproject.bramble.keyagreement;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.crypto.CryptoComponent;
 import org.briarproject.bramble.api.crypto.KeyPair;
 import org.briarproject.bramble.api.crypto.PublicKey;
 import org.briarproject.bramble.api.crypto.SecretKey;
 import org.briarproject.bramble.api.keyagreement.Payload;
 import org.briarproject.bramble.api.keyagreement.PayloadEncoder;
+import org.briarproject.bramble.test.BrambleTestCase;
+import org.briarproject.bramble.test.TestUtils;
 import org.jmock.Expectations;
 import org.jmock.auto.Mock;
 import org.jmock.integration.junit4.JUnitRuleMockery;
@@ -20,7 +20,7 @@ import static org.hamcrest.Matchers.equalTo;
 import static org.hamcrest.Matchers.is;
 import static org.junit.Assert.assertThat;
 
-public class KeyAgreementProtocolTest extends BriarTestCase {
+public class KeyAgreementProtocolTest extends BrambleTestCase {
 
 	@Rule
 	public JUnitRuleMockery context = new JUnitRuleMockery() {{
diff --git a/briar-tests/src/org/briarproject/bramble/lifecycle/ShutdownManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/lifecycle/ShutdownManagerImplTest.java
similarity index 84%
rename from briar-tests/src/org/briarproject/bramble/lifecycle/ShutdownManagerImplTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/lifecycle/ShutdownManagerImplTest.java
index 7fb15985421feb88af66cdbcefaac03dfff60449..f4fc1ed706b48adb8f1d89eeedb3bda6b0b9e155 100644
--- a/briar-tests/src/org/briarproject/bramble/lifecycle/ShutdownManagerImplTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/lifecycle/ShutdownManagerImplTest.java
@@ -1,7 +1,7 @@
 package org.briarproject.bramble.lifecycle;
 
-import org.briarproject.BriarTestCase;
 import org.briarproject.bramble.api.lifecycle.ShutdownManager;
+import org.briarproject.bramble.test.BrambleTestCase;
 import org.junit.Test;
 
 import java.util.HashSet;
@@ -10,12 +10,12 @@ import java.util.Set;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
-public class ShutdownManagerImplTest extends BriarTestCase {
+public class ShutdownManagerImplTest extends BrambleTestCase {
 
 	@Test
 	public void testAddAndRemove() {
 		ShutdownManager s = createShutdownManager();
-		Set<Integer> handles = new HashSet<>();
+		Set<Integer> handles = new HashSet<Integer>();
 		for (int i = 0; i < 100; i++) {
 			int handle = s.addShutdownHook(new Runnable() {
 				@Override
diff --git a/briar-tests/src/org/briarproject/bramble/plugin/BackoffImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/plugin/BackoffImplTest.java
similarity index 94%
rename from briar-tests/src/org/briarproject/bramble/plugin/BackoffImplTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/plugin/BackoffImplTest.java
index 894dc4e480ecf369f362c3bdfd5241ad45ce86fd..09bf49726e3e0a27e5a15dc1cc003d01262b4ec4 100644
--- a/briar-tests/src/org/briarproject/bramble/plugin/BackoffImplTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/plugin/BackoffImplTest.java
@@ -1,12 +1,12 @@
 package org.briarproject.bramble.plugin;
 
-import org.briarproject.BriarTestCase;
+import org.briarproject.bramble.test.BrambleTestCase;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-public class BackoffImplTest extends BriarTestCase {
+public class BackoffImplTest extends BrambleTestCase {
 
 	private static final int MIN_INTERVAL = 60 * 1000;
 	private static final int MAX_INTERVAL = 60 * 60 * 1000;
diff --git a/briar-tests/src/org/briarproject/bramble/plugin/ConnectionRegistryImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/plugin/ConnectionRegistryImplTest.java
similarity index 97%
rename from briar-tests/src/org/briarproject/bramble/plugin/ConnectionRegistryImplTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/plugin/ConnectionRegistryImplTest.java
index c455cd82f6a2aede555905cf2fcc19d590b437cf..dba85a6b2ab33bd16630810d25b4664a67a5b4c2 100644
--- a/briar-tests/src/org/briarproject/bramble/plugin/ConnectionRegistryImplTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/plugin/ConnectionRegistryImplTest.java
@@ -1,6 +1,5 @@
 package org.briarproject.bramble.plugin;
 
-import org.briarproject.BriarTestCase;
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.event.EventBus;
 import org.briarproject.bramble.api.plugin.ConnectionRegistry;
@@ -9,6 +8,7 @@ import org.briarproject.bramble.api.plugin.event.ConnectionClosedEvent;
 import org.briarproject.bramble.api.plugin.event.ConnectionOpenedEvent;
 import org.briarproject.bramble.api.plugin.event.ContactConnectedEvent;
 import org.briarproject.bramble.api.plugin.event.ContactDisconnectedEvent;
+import org.briarproject.bramble.test.BrambleTestCase;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.junit.Test;
@@ -20,7 +20,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-public class ConnectionRegistryImplTest extends BriarTestCase {
+public class ConnectionRegistryImplTest extends BrambleTestCase {
 
 	private final ContactId contactId, contactId1;
 	private final TransportId transportId, transportId1;
diff --git a/briar-tests/src/org/briarproject/bramble/plugin/PluginManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/plugin/PluginManagerImplTest.java
similarity index 97%
rename from briar-tests/src/org/briarproject/bramble/plugin/PluginManagerImplTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/plugin/PluginManagerImplTest.java
index ad4e4b665fd2da8bf385821e6ea8914306e98ba2..23a40ed20db4ae08451dcf22a12d58e512366ce6 100644
--- a/briar-tests/src/org/briarproject/bramble/plugin/PluginManagerImplTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/plugin/PluginManagerImplTest.java
@@ -1,6 +1,5 @@
 package org.briarproject.bramble.plugin;
 
-import org.briarproject.BriarTestCase;
 import org.briarproject.bramble.api.event.EventBus;
 import org.briarproject.bramble.api.plugin.ConnectionManager;
 import org.briarproject.bramble.api.plugin.PluginConfig;
@@ -14,6 +13,7 @@ import org.briarproject.bramble.api.plugin.simplex.SimplexPluginFactory;
 import org.briarproject.bramble.api.properties.TransportPropertyManager;
 import org.briarproject.bramble.api.settings.SettingsManager;
 import org.briarproject.bramble.api.ui.UiCallback;
+import org.briarproject.bramble.test.BrambleTestCase;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.jmock.lib.concurrent.Synchroniser;
@@ -23,7 +23,7 @@ import java.util.Arrays;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Executors;
 
-public class PluginManagerImplTest extends BriarTestCase {
+public class PluginManagerImplTest extends BrambleTestCase {
 
 	@Test
 	public void testStartAndStop() throws Exception {
diff --git a/briar-tests/src/org/briarproject/bramble/plugin/PollerTest.java b/bramble-core/src/test/java/org/briarproject/bramble/plugin/PollerTest.java
similarity index 98%
rename from briar-tests/src/org/briarproject/bramble/plugin/PollerTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/plugin/PollerTest.java
index 3cdbcf8a67ca34248ef53a1b75c586e21a4c9215..89afcdf85f632796e35c71def0ff1e1e24dee112 100644
--- a/briar-tests/src/org/briarproject/bramble/plugin/PollerTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/plugin/PollerTest.java
@@ -1,8 +1,5 @@
 package org.briarproject.bramble.plugin;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.ImmediateExecutor;
-import org.briarproject.RunAction;
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.contact.event.ContactStatusChangedEvent;
 import org.briarproject.bramble.api.plugin.ConnectionManager;
@@ -18,6 +15,9 @@ import org.briarproject.bramble.api.plugin.event.ConnectionOpenedEvent;
 import org.briarproject.bramble.api.plugin.event.TransportEnabledEvent;
 import org.briarproject.bramble.api.plugin.simplex.SimplexPlugin;
 import org.briarproject.bramble.api.system.Clock;
+import org.briarproject.bramble.test.BrambleTestCase;
+import org.briarproject.bramble.test.ImmediateExecutor;
+import org.briarproject.bramble.test.RunAction;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.jmock.lib.legacy.ClassImposteriser;
@@ -32,7 +32,7 @@ import java.util.concurrent.ScheduledExecutorService;
 
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 
-public class PollerTest extends BriarTestCase {
+public class PollerTest extends BrambleTestCase {
 
 	private final ContactId contactId = new ContactId(234);
 	private final int pollingInterval = 60 * 1000;
diff --git a/briar-tests/src/org/briarproject/bramble/plugin/tcp/LanTcpPluginTest.java b/bramble-core/src/test/java/org/briarproject/bramble/plugin/tcp/LanTcpPluginTest.java
similarity index 98%
rename from briar-tests/src/org/briarproject/bramble/plugin/tcp/LanTcpPluginTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/plugin/tcp/LanTcpPluginTest.java
index cd8e31d647c518d0e6633aeed9c9db927d5105e4..a873ee829fea1eb39651ae952f2dc54d57503638 100644
--- a/briar-tests/src/org/briarproject/bramble/plugin/tcp/LanTcpPluginTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/plugin/tcp/LanTcpPluginTest.java
@@ -1,6 +1,5 @@
 package org.briarproject.bramble.plugin.tcp;
 
-import org.briarproject.BriarTestCase;
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.data.BdfList;
 import org.briarproject.bramble.api.keyagreement.KeyAgreementConnection;
@@ -12,6 +11,7 @@ import org.briarproject.bramble.api.plugin.duplex.DuplexPluginCallback;
 import org.briarproject.bramble.api.plugin.duplex.DuplexTransportConnection;
 import org.briarproject.bramble.api.properties.TransportProperties;
 import org.briarproject.bramble.api.settings.Settings;
+import org.briarproject.bramble.test.BrambleTestCase;
 import org.junit.Test;
 
 import java.io.IOException;
@@ -39,7 +39,7 @@ import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertTrue;
 
-public class LanTcpPluginTest extends BriarTestCase {
+public class LanTcpPluginTest extends BrambleTestCase {
 
 	private final ContactId contactId = new ContactId(234);
 	private final Backoff backoff = new TestBackoff();
@@ -194,7 +194,8 @@ public class LanTcpPluginTest extends BriarTestCase {
 				plugin.createKeyAgreementListener(new byte[COMMIT_LENGTH]);
 		assertNotNull(kal);
 		Callable<KeyAgreementConnection> c = kal.listen();
-		FutureTask<KeyAgreementConnection> f = new FutureTask<>(c);
+		FutureTask<KeyAgreementConnection> f =
+				new FutureTask<KeyAgreementConnection>(c);
 		new Thread(f).start();
 		// The plugin should have bound a socket and stored the port number
 		BdfList descriptor = kal.getDescriptor();
@@ -290,7 +291,7 @@ public class LanTcpPluginTest extends BriarTestCase {
 	private static class Callback implements DuplexPluginCallback {
 
 		private final Map<ContactId, TransportProperties> remote =
-				new Hashtable<>();
+				new Hashtable<ContactId, TransportProperties>();
 		private final CountDownLatch propertiesLatch = new CountDownLatch(1);
 		private final CountDownLatch connectionsLatch = new CountDownLatch(1);
 		private final TransportProperties local = new TransportProperties();
diff --git a/briar-tests/src/org/briarproject/bramble/properties/TransportPropertyManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyManagerImplTest.java
similarity index 60%
rename from briar-tests/src/org/briarproject/bramble/properties/TransportPropertyManagerImplTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyManagerImplTest.java
index 510b2a98e3510bc54c2917ea0b1039309d9b33e1..3cf98a8c09d75ce2cf9651bde9bb117e0e78e8e7 100644
--- a/briar-tests/src/org/briarproject/bramble/properties/TransportPropertyManagerImplTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyManagerImplTest.java
@@ -1,11 +1,11 @@
 package org.briarproject.bramble.properties;
 
-import org.briarproject.BriarTestCase;
+import org.briarproject.bramble.test.BrambleTestCase;
 import org.junit.Test;
 
 import static org.junit.Assert.fail;
 
-public class TransportPropertyManagerImplTest extends BriarTestCase {
+public class TransportPropertyManagerImplTest extends BrambleTestCase {
 
 	@Test
 	public void testUnitTestsExist() {
diff --git a/briar-tests/src/org/briarproject/bramble/properties/TransportPropertyValidatorTest.java b/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyValidatorTest.java
similarity index 95%
rename from briar-tests/src/org/briarproject/bramble/properties/TransportPropertyValidatorTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyValidatorTest.java
index 3a67bb7f87da39515259e785a4d9a12317892d3c..7d48fa75df441379f93835eada7abfaa49580364 100644
--- a/briar-tests/src/org/briarproject/bramble/properties/TransportPropertyValidatorTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/properties/TransportPropertyValidatorTest.java
@@ -1,7 +1,5 @@
 package org.briarproject.bramble.properties;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.FormatException;
 import org.briarproject.bramble.api.client.ClientHelper;
 import org.briarproject.bramble.api.data.BdfDictionary;
@@ -14,6 +12,8 @@ import org.briarproject.bramble.api.sync.GroupId;
 import org.briarproject.bramble.api.sync.Message;
 import org.briarproject.bramble.api.sync.MessageId;
 import org.briarproject.bramble.api.system.Clock;
+import org.briarproject.bramble.test.BrambleTestCase;
+import org.briarproject.bramble.test.TestUtils;
 import org.jmock.Mockery;
 import org.junit.Test;
 
@@ -23,7 +23,7 @@ import static org.briarproject.bramble.api.plugin.TransportId.MAX_TRANSPORT_ID_L
 import static org.briarproject.bramble.api.properties.TransportPropertyConstants.MAX_PROPERTIES_PER_TRANSPORT;
 import static org.junit.Assert.assertEquals;
 
-public class TransportPropertyValidatorTest extends BriarTestCase {
+public class TransportPropertyValidatorTest extends BrambleTestCase {
 
 	private final TransportId transportId;
 	private final BdfDictionary bdfDictionary;
diff --git a/briar-tests/src/org/briarproject/bramble/sync/PacketReaderImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/sync/PacketReaderImplTest.java
similarity index 97%
rename from briar-tests/src/org/briarproject/bramble/sync/PacketReaderImplTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/sync/PacketReaderImplTest.java
index 1652208d67b3f7e4b588bef7ff855247da4de55e..3d68494299824a783777ac8b1142596ff048fe77 100644
--- a/briar-tests/src/org/briarproject/bramble/sync/PacketReaderImplTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/sync/PacketReaderImplTest.java
@@ -1,9 +1,9 @@
 package org.briarproject.bramble.sync;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.FormatException;
 import org.briarproject.bramble.api.UniqueId;
+import org.briarproject.bramble.test.BrambleTestCase;
+import org.briarproject.bramble.test.TestUtils;
 import org.briarproject.bramble.util.ByteUtils;
 import org.junit.Test;
 
@@ -17,7 +17,7 @@ import static org.briarproject.bramble.api.sync.SyncConstants.MAX_PACKET_PAYLOAD
 import static org.briarproject.bramble.api.sync.SyncConstants.PACKET_HEADER_LENGTH;
 import static org.junit.Assert.assertEquals;
 
-public class PacketReaderImplTest extends BriarTestCase {
+public class PacketReaderImplTest extends BrambleTestCase {
 
 	@Test(expected = FormatException.class)
 	public void testFormatExceptionIfAckIsTooLarge() throws Exception {
diff --git a/briar-tests/src/org/briarproject/bramble/sync/SimplexOutgoingSessionTest.java b/bramble-core/src/test/java/org/briarproject/bramble/sync/SimplexOutgoingSessionTest.java
similarity index 95%
rename from briar-tests/src/org/briarproject/bramble/sync/SimplexOutgoingSessionTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/sync/SimplexOutgoingSessionTest.java
index d9c58531e2a397a71717b43618dd3440d4a79043..2304b4053b1f0cbfef149ae67145522434a96a9f 100644
--- a/briar-tests/src/org/briarproject/bramble/sync/SimplexOutgoingSessionTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/sync/SimplexOutgoingSessionTest.java
@@ -1,8 +1,5 @@
 package org.briarproject.bramble.sync;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.ImmediateExecutor;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.db.DatabaseComponent;
 import org.briarproject.bramble.api.db.Transaction;
@@ -10,6 +7,9 @@ import org.briarproject.bramble.api.event.EventBus;
 import org.briarproject.bramble.api.sync.Ack;
 import org.briarproject.bramble.api.sync.MessageId;
 import org.briarproject.bramble.api.sync.PacketWriter;
+import org.briarproject.bramble.test.BrambleTestCase;
+import org.briarproject.bramble.test.ImmediateExecutor;
+import org.briarproject.bramble.test.TestUtils;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.junit.Test;
@@ -20,7 +20,7 @@ import java.util.concurrent.Executor;
 
 import static org.briarproject.bramble.api.sync.SyncConstants.MAX_MESSAGE_IDS;
 
-public class SimplexOutgoingSessionTest extends BriarTestCase {
+public class SimplexOutgoingSessionTest extends BrambleTestCase {
 
 	private final Mockery context;
 	private final DatabaseComponent db;
diff --git a/bramble-core/src/test/java/org/briarproject/bramble/sync/SyncIntegrationTest.java b/bramble-core/src/test/java/org/briarproject/bramble/sync/SyncIntegrationTest.java
index f97d3fe32a77b910d2fcbf51b824d654e30e980c..3d895990968ed579fdcdf520c4cf0469bc9bf20e 100644
--- a/bramble-core/src/test/java/org/briarproject/bramble/sync/SyncIntegrationTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/sync/SyncIntegrationTest.java
@@ -1,7 +1,5 @@
 package org.briarproject.bramble.sync;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.crypto.CryptoComponent;
 import org.briarproject.bramble.api.crypto.SecretKey;
@@ -22,6 +20,8 @@ import org.briarproject.bramble.api.sync.Request;
 import org.briarproject.bramble.api.transport.StreamContext;
 import org.briarproject.bramble.api.transport.StreamReaderFactory;
 import org.briarproject.bramble.api.transport.StreamWriterFactory;
+import org.briarproject.bramble.test.BrambleTestCase;
+import org.briarproject.bramble.test.TestUtils;
 import org.junit.Test;
 
 import java.io.ByteArrayInputStream;
@@ -39,7 +39,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
-public class SyncIntegrationTest extends BriarTestCase {
+public class SyncIntegrationTest extends BrambleTestCase {
 
 	@Inject
 	GroupFactory groupFactory;
diff --git a/bramble-core/src/test/java/org/briarproject/bramble/sync/SyncIntegrationTestComponent.java b/bramble-core/src/test/java/org/briarproject/bramble/sync/SyncIntegrationTestComponent.java
index 456911d54f2d94aead4306cb583b1ee7d26f7545..6c0ffa19cb24562228d945305862a1718718c20c 100644
--- a/bramble-core/src/test/java/org/briarproject/bramble/sync/SyncIntegrationTestComponent.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/sync/SyncIntegrationTestComponent.java
@@ -1,7 +1,7 @@
 package org.briarproject.bramble.sync;
 
-import org.briarproject.TestSeedProviderModule;
 import org.briarproject.bramble.crypto.CryptoModule;
+import org.briarproject.bramble.test.TestSeedProviderModule;
 import org.briarproject.bramble.transport.TransportModule;
 
 import javax.inject.Singleton;
diff --git a/briar-tests/src/org/briarproject/bramble/sync/ValidationManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/sync/ValidationManagerImplTest.java
similarity index 98%
rename from briar-tests/src/org/briarproject/bramble/sync/ValidationManagerImplTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/sync/ValidationManagerImplTest.java
index a436e8977fc53729db0e1273147e19a0c999851a..b99c2f0627edfc5c0947a6a360b86e073f21140f 100644
--- a/briar-tests/src/org/briarproject/bramble/sync/ValidationManagerImplTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/sync/ValidationManagerImplTest.java
@@ -1,8 +1,5 @@
 package org.briarproject.bramble.sync;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.ImmediateExecutor;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.UniqueId;
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.db.DatabaseComponent;
@@ -22,6 +19,9 @@ import org.briarproject.bramble.api.sync.ValidationManager.IncomingMessageHook;
 import org.briarproject.bramble.api.sync.ValidationManager.MessageValidator;
 import org.briarproject.bramble.api.sync.ValidationManager.State;
 import org.briarproject.bramble.api.sync.event.MessageAddedEvent;
+import org.briarproject.bramble.test.BrambleTestCase;
+import org.briarproject.bramble.test.ImmediateExecutor;
+import org.briarproject.bramble.test.TestUtils;
 import org.briarproject.bramble.util.ByteUtils;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
@@ -38,7 +38,7 @@ import static org.briarproject.bramble.api.sync.ValidationManager.State.INVALID;
 import static org.briarproject.bramble.api.sync.ValidationManager.State.PENDING;
 import static org.briarproject.bramble.api.sync.ValidationManager.State.UNKNOWN;
 
-public class ValidationManagerImplTest extends BriarTestCase {
+public class ValidationManagerImplTest extends BrambleTestCase {
 
 	private final ClientId clientId =
 			new ClientId(TestUtils.getRandomString(5));
@@ -831,7 +831,8 @@ public class ValidationManagerImplTest extends BriarTestCase {
 				context.mock(IncomingMessageHook.class);
 		final MessageId messageId3 = new MessageId(TestUtils.getRandomId());
 		final MessageId messageId4 = new MessageId(TestUtils.getRandomId());
-		final Map<MessageId, State> twoDependents = new LinkedHashMap<>();
+		final Map<MessageId, State> twoDependents =
+				new LinkedHashMap<MessageId, State>();
 		twoDependents.put(messageId1, PENDING);
 		twoDependents.put(messageId2, PENDING);
 		final Transaction txn = new Transaction(null, true);
@@ -952,10 +953,12 @@ public class ValidationManagerImplTest extends BriarTestCase {
 				raw);
 		final Message message4 = new Message(messageId4, groupId, timestamp,
 				raw);
-		final Map<MessageId, State> twoDependents = new LinkedHashMap<>();
+		final Map<MessageId, State> twoDependents =
+				new LinkedHashMap<MessageId, State>();
 		twoDependents.put(messageId1, PENDING);
 		twoDependents.put(messageId2, PENDING);
-		final Map<MessageId, State> twoDependencies = new LinkedHashMap<>();
+		final Map<MessageId, State> twoDependencies =
+				new LinkedHashMap<MessageId, State>();
 		twoDependencies.put(messageId1, DELIVERED);
 		twoDependencies.put(messageId2, DELIVERED);
 		final Transaction txn = new Transaction(null, true);
@@ -1117,7 +1120,8 @@ public class ValidationManagerImplTest extends BriarTestCase {
 		final MessageValidator validator = context.mock(MessageValidator.class);
 		final IncomingMessageHook hook =
 				context.mock(IncomingMessageHook.class);
-		final Map<MessageId, State> twoDependencies = new LinkedHashMap<>();
+		final Map<MessageId, State> twoDependencies =
+				new LinkedHashMap<MessageId, State>();
 		twoDependencies.put(messageId, DELIVERED);
 		twoDependencies.put(messageId2, UNKNOWN);
 		final Transaction txn = new Transaction(null, true);
diff --git a/briar-tests/src/org/briarproject/bramble/system/LinuxSeedProviderTest.java b/bramble-core/src/test/java/org/briarproject/bramble/system/LinuxSeedProviderTest.java
similarity index 92%
rename from briar-tests/src/org/briarproject/bramble/system/LinuxSeedProviderTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/system/LinuxSeedProviderTest.java
index ad9affb9a737d3e755604ad36263109c641a93f2..0e0fe119c947427f93ce4e461f064cf31e7be5ef 100644
--- a/briar-tests/src/org/briarproject/bramble/system/LinuxSeedProviderTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/system/LinuxSeedProviderTest.java
@@ -1,8 +1,8 @@
 package org.briarproject.bramble.system;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.Bytes;
+import org.briarproject.bramble.test.BrambleTestCase;
+import org.briarproject.bramble.test.TestUtils;
 import org.briarproject.bramble.util.OsUtils;
 import org.junit.After;
 import org.junit.Before;
@@ -18,7 +18,7 @@ import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 
-public class LinuxSeedProviderTest extends BriarTestCase {
+public class LinuxSeedProviderTest extends BrambleTestCase {
 
 	private final File testDir = TestUtils.getTestDirectory();
 
@@ -33,7 +33,7 @@ public class LinuxSeedProviderTest extends BriarTestCase {
 			System.err.println("WARNING: Skipping test, can't run on this OS");
 			return;
 		}
-		Set<Bytes> seeds = new HashSet<>();
+		Set<Bytes> seeds = new HashSet<Bytes>();
 		LinuxSeedProvider p = new LinuxSeedProvider();
 		for (int i = 0; i < 1000; i++) {
 			byte[] seed = p.getSeed();
diff --git a/briar-tests/src/org/briarproject/CaptureArgumentAction.java b/bramble-core/src/test/java/org/briarproject/bramble/test/CaptureArgumentAction.java
similarity index 95%
rename from briar-tests/src/org/briarproject/CaptureArgumentAction.java
rename to bramble-core/src/test/java/org/briarproject/bramble/test/CaptureArgumentAction.java
index 6fda69885a8ca621afcf8370ea47a4e83bc6ee7f..b0463eab3a449a9a52aed58951044bdf124455f4 100644
--- a/briar-tests/src/org/briarproject/CaptureArgumentAction.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/test/CaptureArgumentAction.java
@@ -1,4 +1,4 @@
-package org.briarproject;
+package org.briarproject.bramble.test;
 
 import org.hamcrest.Description;
 import org.jmock.api.Action;
diff --git a/briar-tests/src/org/briarproject/ImmediateExecutor.java b/bramble-core/src/test/java/org/briarproject/bramble/test/ImmediateExecutor.java
similarity index 86%
rename from briar-tests/src/org/briarproject/ImmediateExecutor.java
rename to bramble-core/src/test/java/org/briarproject/bramble/test/ImmediateExecutor.java
index 424e6674b2fca15051e9ee3a8693f67f5b54669c..7d488ecc71f08a23823cfdf3f33ae6bf46aa0dcb 100644
--- a/briar-tests/src/org/briarproject/ImmediateExecutor.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/test/ImmediateExecutor.java
@@ -1,4 +1,4 @@
-package org.briarproject;
+package org.briarproject.bramble.test;
 
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
 
diff --git a/briar-tests/src/org/briarproject/RunAction.java b/bramble-core/src/test/java/org/briarproject/bramble/test/RunAction.java
similarity index 91%
rename from briar-tests/src/org/briarproject/RunAction.java
rename to bramble-core/src/test/java/org/briarproject/bramble/test/RunAction.java
index ef547ce189deda0120d635bab425dcd693d8334f..0ec8d7ac8a61227ff1cb0c0db293f314ac4d144a 100644
--- a/briar-tests/src/org/briarproject/RunAction.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/test/RunAction.java
@@ -1,4 +1,4 @@
-package org.briarproject;
+package org.briarproject.bramble.test;
 
 import org.hamcrest.Description;
 import org.jmock.api.Action;
diff --git a/briar-tests/src/org/briarproject/TestDatabaseConfig.java b/bramble-core/src/test/java/org/briarproject/bramble/test/TestDatabaseConfig.java
similarity index 96%
rename from briar-tests/src/org/briarproject/TestDatabaseConfig.java
rename to bramble-core/src/test/java/org/briarproject/bramble/test/TestDatabaseConfig.java
index 0d366e867792c03e9a38c8375f66429095b98599..d6ee0325f70ff3fc03923d98ccabf92a6092ecfa 100644
--- a/briar-tests/src/org/briarproject/TestDatabaseConfig.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/test/TestDatabaseConfig.java
@@ -1,4 +1,4 @@
-package org.briarproject;
+package org.briarproject.bramble.test;
 
 import org.briarproject.bramble.api.crypto.SecretKey;
 import org.briarproject.bramble.api.db.DatabaseConfig;
diff --git a/briar-tests/src/org/briarproject/TestDatabaseModule.java b/bramble-core/src/test/java/org/briarproject/bramble/test/TestDatabaseModule.java
similarity index 94%
rename from briar-tests/src/org/briarproject/TestDatabaseModule.java
rename to bramble-core/src/test/java/org/briarproject/bramble/test/TestDatabaseModule.java
index b978c8deaeeb3bd1c98ee2863ec57d19d6730833..e4f2f5585cdbf58da580ad964e773b76a7365288 100644
--- a/briar-tests/src/org/briarproject/TestDatabaseModule.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/test/TestDatabaseModule.java
@@ -1,4 +1,4 @@
-package org.briarproject;
+package org.briarproject.bramble.test;
 
 import org.briarproject.bramble.api.db.DatabaseConfig;
 import org.briarproject.bramble.api.db.DatabaseExecutor;
diff --git a/briar-tests/src/org/briarproject/TestLifecycleModule.java b/bramble-core/src/test/java/org/briarproject/bramble/test/TestLifecycleModule.java
similarity index 97%
rename from briar-tests/src/org/briarproject/TestLifecycleModule.java
rename to bramble-core/src/test/java/org/briarproject/bramble/test/TestLifecycleModule.java
index 8f8c9030b27d24a1bebb138efe3bff884497d98f..ee8d5115e07b3285bb0ac5be2251878102d84935 100644
--- a/briar-tests/src/org/briarproject/TestLifecycleModule.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/test/TestLifecycleModule.java
@@ -1,4 +1,4 @@
-package org.briarproject;
+package org.briarproject.bramble.test;
 
 import org.briarproject.bramble.api.lifecycle.IoExecutor;
 import org.briarproject.bramble.api.lifecycle.LifecycleManager;
diff --git a/briar-tests/src/org/briarproject/TestPluginConfigModule.java b/bramble-core/src/test/java/org/briarproject/bramble/test/TestPluginConfigModule.java
similarity index 97%
rename from briar-tests/src/org/briarproject/TestPluginConfigModule.java
rename to bramble-core/src/test/java/org/briarproject/bramble/test/TestPluginConfigModule.java
index 416d5f1085b8c3d2f70e86c9fda610cd7ee137a8..5709770b5ed6de02739fba08d24dc27dd6a25bd2 100644
--- a/briar-tests/src/org/briarproject/TestPluginConfigModule.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/test/TestPluginConfigModule.java
@@ -1,4 +1,4 @@
-package org.briarproject;
+package org.briarproject.bramble.test;
 
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
 import org.briarproject.bramble.api.plugin.PluginConfig;
diff --git a/briar-tests/src/org/briarproject/TestSeedProvider.java b/bramble-core/src/test/java/org/briarproject/bramble/test/TestSeedProvider.java
similarity index 87%
rename from briar-tests/src/org/briarproject/TestSeedProvider.java
rename to bramble-core/src/test/java/org/briarproject/bramble/test/TestSeedProvider.java
index a6d761a4c913a98801a9b61fcc78bd96210ccbc2..a149bec8b6ea8ab25f475e2ff5c447dc48b3a09d 100644
--- a/briar-tests/src/org/briarproject/TestSeedProvider.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/test/TestSeedProvider.java
@@ -1,4 +1,4 @@
-package org.briarproject;
+package org.briarproject.bramble.test;
 
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
 import org.briarproject.bramble.api.system.SeedProvider;
diff --git a/briar-tests/src/org/briarproject/TestSeedProviderModule.java b/bramble-core/src/test/java/org/briarproject/bramble/test/TestSeedProviderModule.java
similarity index 87%
rename from briar-tests/src/org/briarproject/TestSeedProviderModule.java
rename to bramble-core/src/test/java/org/briarproject/bramble/test/TestSeedProviderModule.java
index 1d449284fa7c3a2c078f297cdb1f238479fb2361..ce8650d264881ee17c3f6c9739045fdb2997dd27 100644
--- a/briar-tests/src/org/briarproject/TestSeedProviderModule.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/test/TestSeedProviderModule.java
@@ -1,4 +1,4 @@
-package org.briarproject;
+package org.briarproject.bramble.test;
 
 import org.briarproject.bramble.api.system.SeedProvider;
 
diff --git a/briar-tests/src/org/briarproject/ValidatorTestCase.java b/bramble-core/src/test/java/org/briarproject/bramble/test/ValidatorTestCase.java
similarity index 92%
rename from briar-tests/src/org/briarproject/ValidatorTestCase.java
rename to bramble-core/src/test/java/org/briarproject/bramble/test/ValidatorTestCase.java
index 0ece8f562d773a41f2d6b3c88520dcf26568c5ba..07afb2e58b6e4f6f57031a7e79eebd7e6659b45e 100644
--- a/briar-tests/src/org/briarproject/ValidatorTestCase.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/test/ValidatorTestCase.java
@@ -1,4 +1,4 @@
-package org.briarproject;
+package org.briarproject.bramble.test;
 
 import org.briarproject.bramble.api.client.ClientHelper;
 import org.briarproject.bramble.api.data.MetadataEncoder;
@@ -10,7 +10,7 @@ import org.briarproject.bramble.api.sync.Message;
 import org.briarproject.bramble.api.sync.MessageId;
 import org.briarproject.bramble.api.system.Clock;
 
-public abstract class ValidatorTestCase extends BriarMockTestCase {
+public abstract class ValidatorTestCase extends BrambleMockTestCase {
 
 	protected final ClientHelper clientHelper =
 			context.mock(ClientHelper.class);
diff --git a/briar-tests/src/org/briarproject/bramble/transport/KeyManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/transport/KeyManagerImplTest.java
similarity index 94%
rename from briar-tests/src/org/briarproject/bramble/transport/KeyManagerImplTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/transport/KeyManagerImplTest.java
index d3de3b87ae438af7ce3a4973cc7a49c08a6b8185..340dfb1468ef6b38c3951cf247e19e948733cb20 100644
--- a/briar-tests/src/org/briarproject/bramble/transport/KeyManagerImplTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/transport/KeyManagerImplTest.java
@@ -1,6 +1,5 @@
 package org.briarproject.bramble.transport;
 
-import org.briarproject.BriarTestCase;
 import org.briarproject.bramble.api.contact.Contact;
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.contact.event.ContactRemovedEvent;
@@ -14,6 +13,7 @@ import org.briarproject.bramble.api.plugin.PluginConfig;
 import org.briarproject.bramble.api.plugin.TransportId;
 import org.briarproject.bramble.api.plugin.simplex.SimplexPluginFactory;
 import org.briarproject.bramble.api.transport.StreamContext;
+import org.briarproject.bramble.test.BrambleTestCase;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.jmock.lib.concurrent.DeterministicExecutor;
@@ -24,13 +24,13 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.Collections;
 
-import static org.briarproject.TestUtils.getRandomBytes;
-import static org.briarproject.TestUtils.getRandomId;
-import static org.briarproject.TestUtils.getSecretKey;
 import static org.briarproject.bramble.api.transport.TransportConstants.TAG_LENGTH;
+import static org.briarproject.bramble.test.TestUtils.getRandomBytes;
+import static org.briarproject.bramble.test.TestUtils.getRandomId;
+import static org.briarproject.bramble.test.TestUtils.getSecretKey;
 import static org.junit.Assert.assertEquals;
 
-public class KeyManagerImplTest extends BriarTestCase {
+public class KeyManagerImplTest extends BrambleTestCase {
 
 	private final Mockery context = new Mockery();
 	private final KeyManagerImpl keyManager;
@@ -63,7 +63,7 @@ public class KeyManagerImplTest extends BriarTestCase {
 		Author remoteAuthor = new Author(remoteAuthorId, "author",
 				getRandomBytes(42));
 		AuthorId localAuthorId = new AuthorId(getRandomId());
-		final Collection<Contact> contacts = new ArrayList<>();
+		final Collection<Contact> contacts = new ArrayList<Contact>();
 		contacts.add(new Contact(contactId, remoteAuthor, localAuthorId, true,
 				true));
 		contacts.add(new Contact(inactiveContactId, remoteAuthor, localAuthorId,
diff --git a/briar-tests/src/org/briarproject/bramble/transport/ReorderingWindowTest.java b/bramble-core/src/test/java/org/briarproject/bramble/transport/ReorderingWindowTest.java
similarity index 96%
rename from briar-tests/src/org/briarproject/bramble/transport/ReorderingWindowTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/transport/ReorderingWindowTest.java
index 827ba97e2840e3f6a945cfd8619f164e8541b90e..5031583575ecbeb32cf27560c38b5d3bf4c104f0 100644
--- a/briar-tests/src/org/briarproject/bramble/transport/ReorderingWindowTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/transport/ReorderingWindowTest.java
@@ -1,7 +1,7 @@
 package org.briarproject.bramble.transport;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestUtils;
+import org.briarproject.bramble.test.BrambleTestCase;
+import org.briarproject.bramble.test.TestUtils;
 import org.briarproject.bramble.transport.ReorderingWindow.Change;
 import org.junit.Test;
 
@@ -12,7 +12,7 @@ import static org.briarproject.bramble.api.transport.TransportConstants.REORDERI
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 
-public class ReorderingWindowTest extends BriarTestCase {
+public class ReorderingWindowTest extends BrambleTestCase {
 
 	private static final int BITMAP_BYTES = REORDERING_WINDOW_SIZE / 8;
 
diff --git a/briar-tests/src/org/briarproject/bramble/transport/StreamReaderImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/transport/StreamReaderImplTest.java
similarity index 97%
rename from briar-tests/src/org/briarproject/bramble/transport/StreamReaderImplTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/transport/StreamReaderImplTest.java
index cd01b5779c7a2753d7d3a6943113bbb1da8f7902..40ff0763105d6756b87752fc08af10dda68fef3c 100644
--- a/briar-tests/src/org/briarproject/bramble/transport/StreamReaderImplTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/transport/StreamReaderImplTest.java
@@ -1,7 +1,7 @@
 package org.briarproject.bramble.transport;
 
-import org.briarproject.BriarTestCase;
 import org.briarproject.bramble.api.crypto.StreamDecrypter;
+import org.briarproject.bramble.test.BrambleTestCase;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.junit.Test;
@@ -9,7 +9,7 @@ import org.junit.Test;
 import static org.briarproject.bramble.api.transport.TransportConstants.MAX_PAYLOAD_LENGTH;
 import static org.junit.Assert.assertEquals;
 
-public class StreamReaderImplTest extends BriarTestCase {
+public class StreamReaderImplTest extends BrambleTestCase {
 
 	@Test
 	public void testEmptyFramesAreSkipped() throws Exception {
diff --git a/briar-tests/src/org/briarproject/bramble/transport/StreamReaderWriterIntegrationTest.java b/bramble-core/src/test/java/org/briarproject/bramble/transport/StreamReaderWriterIntegrationTest.java
similarity index 93%
rename from briar-tests/src/org/briarproject/bramble/transport/StreamReaderWriterIntegrationTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/transport/StreamReaderWriterIntegrationTest.java
index 8292f804f3bd2113bbdcf393a78fb69d376f7228..e8bdcc0357da27b58a24d2aee8b5a199b760c11c 100644
--- a/briar-tests/src/org/briarproject/bramble/transport/StreamReaderWriterIntegrationTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/transport/StreamReaderWriterIntegrationTest.java
@@ -1,9 +1,9 @@
 package org.briarproject.bramble.transport;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.crypto.StreamDecrypter;
 import org.briarproject.bramble.api.crypto.StreamEncrypter;
+import org.briarproject.bramble.test.BrambleTestCase;
+import org.briarproject.bramble.test.TestUtils;
 import org.junit.Test;
 
 import java.io.ByteArrayInputStream;
@@ -19,7 +19,7 @@ import static org.briarproject.bramble.api.transport.TransportConstants.TAG_LENG
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 
-public class StreamReaderWriterIntegrationTest extends BriarTestCase {
+public class StreamReaderWriterIntegrationTest extends BrambleTestCase {
 
 	@Test
 	public void testWriteAndRead() throws Exception {
diff --git a/briar-tests/src/org/briarproject/bramble/transport/StreamWriterImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/transport/StreamWriterImplTest.java
similarity index 97%
rename from briar-tests/src/org/briarproject/bramble/transport/StreamWriterImplTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/transport/StreamWriterImplTest.java
index 01e9c7c0e94ee9ae0027f318c2db853b31544500..b0db082ba8d4b968d0fe6f4bcd1e25929df6ba38 100644
--- a/briar-tests/src/org/briarproject/bramble/transport/StreamWriterImplTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/transport/StreamWriterImplTest.java
@@ -1,7 +1,7 @@
 package org.briarproject.bramble.transport;
 
-import org.briarproject.BriarTestCase;
 import org.briarproject.bramble.api.crypto.StreamEncrypter;
+import org.briarproject.bramble.test.BrambleTestCase;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.junit.Test;
@@ -9,7 +9,7 @@ import org.junit.Test;
 import static org.briarproject.bramble.api.transport.TransportConstants.MAX_PAYLOAD_LENGTH;
 import static org.junit.Assert.assertEquals;
 
-public class StreamWriterImplTest extends BriarTestCase {
+public class StreamWriterImplTest extends BrambleTestCase {
 
 	@Test
 	public void testCloseWithoutWritingWritesFinalFrame() throws Exception {
diff --git a/briar-tests/src/org/briarproject/bramble/transport/TestStreamDecrypter.java b/bramble-core/src/test/java/org/briarproject/bramble/transport/TestStreamDecrypter.java
similarity index 100%
rename from briar-tests/src/org/briarproject/bramble/transport/TestStreamDecrypter.java
rename to bramble-core/src/test/java/org/briarproject/bramble/transport/TestStreamDecrypter.java
diff --git a/briar-tests/src/org/briarproject/bramble/transport/TestStreamEncrypter.java b/bramble-core/src/test/java/org/briarproject/bramble/transport/TestStreamEncrypter.java
similarity index 100%
rename from briar-tests/src/org/briarproject/bramble/transport/TestStreamEncrypter.java
rename to bramble-core/src/test/java/org/briarproject/bramble/transport/TestStreamEncrypter.java
diff --git a/briar-tests/src/org/briarproject/bramble/transport/TransportKeyManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/transport/TransportKeyManagerImplTest.java
similarity index 98%
rename from briar-tests/src/org/briarproject/bramble/transport/TransportKeyManagerImplTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/transport/TransportKeyManagerImplTest.java
index 71e646bf98df95ee5124cefa273d78a454825d9e..5962afcf5269e1df0a41925b7de2586db0dedff3 100644
--- a/briar-tests/src/org/briarproject/bramble/transport/TransportKeyManagerImplTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/transport/TransportKeyManagerImplTest.java
@@ -1,8 +1,5 @@
 package org.briarproject.bramble.transport;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.RunAction;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.crypto.CryptoComponent;
 import org.briarproject.bramble.api.crypto.SecretKey;
@@ -14,6 +11,9 @@ import org.briarproject.bramble.api.transport.IncomingKeys;
 import org.briarproject.bramble.api.transport.OutgoingKeys;
 import org.briarproject.bramble.api.transport.StreamContext;
 import org.briarproject.bramble.api.transport.TransportKeys;
+import org.briarproject.bramble.test.BrambleTestCase;
+import org.briarproject.bramble.test.RunAction;
+import org.briarproject.bramble.test.TestUtils;
 import org.hamcrest.Description;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
@@ -40,7 +40,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 
-public class TransportKeyManagerImplTest extends BriarTestCase {
+public class TransportKeyManagerImplTest extends BrambleTestCase {
 
 	private final TransportId transportId = new TransportId("id");
 	private final long maxLatency = 30 * 1000; // 30 seconds
@@ -62,7 +62,8 @@ public class TransportKeyManagerImplTest extends BriarTestCase {
 				context.mock(ScheduledExecutorService.class);
 		final Clock clock = context.mock(Clock.class);
 
-		final Map<ContactId, TransportKeys> loaded = new LinkedHashMap<>();
+		final Map<ContactId, TransportKeys> loaded =
+				new LinkedHashMap<ContactId, TransportKeys>();
 		final TransportKeys shouldRotate = createTransportKeys(900, 0);
 		final TransportKeys shouldNotRotate = createTransportKeys(1000, 0);
 		loaded.put(contactId, shouldRotate);
@@ -341,7 +342,7 @@ public class TransportKeyManagerImplTest extends BriarTestCase {
 		final boolean alice = true;
 		final TransportKeys transportKeys = createTransportKeys(1000, 0);
 		// Keep a copy of the tags
-		final List<byte[]> tags = new ArrayList<>();
+		final List<byte[]> tags = new ArrayList<byte[]>();
 		final Transaction txn = new Transaction(null, false);
 
 		context.checking(new Expectations() {{
diff --git a/briar-tests/src/org/briarproject/bramble/util/ByteUtilsTest.java b/bramble-core/src/test/java/org/briarproject/bramble/util/ByteUtilsTest.java
similarity index 98%
rename from briar-tests/src/org/briarproject/bramble/util/ByteUtilsTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/util/ByteUtilsTest.java
index 54eebbce128b94ed3b4339884d0b3fbc2511e110..eef6c0b68aec1eab3f45f295efb00fb96d06cc81 100644
--- a/briar-tests/src/org/briarproject/bramble/util/ByteUtilsTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/util/ByteUtilsTest.java
@@ -1,6 +1,6 @@
 package org.briarproject.bramble.util;
 
-import org.briarproject.BriarTestCase;
+import org.briarproject.bramble.test.BrambleTestCase;
 import org.junit.Test;
 
 import static org.briarproject.bramble.util.ByteUtils.MAX_16_BIT_UNSIGNED;
@@ -8,7 +8,7 @@ import static org.briarproject.bramble.util.ByteUtils.MAX_32_BIT_UNSIGNED;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.fail;
 
-public class ByteUtilsTest extends BriarTestCase {
+public class ByteUtilsTest extends BrambleTestCase {
 
 	@Test
 	public void testReadUint16() {
diff --git a/briar-tests/src/org/briarproject/bramble/util/StringUtilsTest.java b/bramble-core/src/test/java/org/briarproject/bramble/util/StringUtilsTest.java
similarity index 98%
rename from briar-tests/src/org/briarproject/bramble/util/StringUtilsTest.java
rename to bramble-core/src/test/java/org/briarproject/bramble/util/StringUtilsTest.java
index 0814db61119b9adbcc40a85781e4d5d0b361e69f..f7042027d5d2ec2e8cb19c0abcffba49ac80365d 100644
--- a/briar-tests/src/org/briarproject/bramble/util/StringUtilsTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/util/StringUtilsTest.java
@@ -1,13 +1,13 @@
 package org.briarproject.bramble.util;
 
-import org.briarproject.BriarTestCase;
+import org.briarproject.bramble.test.BrambleTestCase;
 import org.junit.Test;
 
 import static org.junit.Assert.assertArrayEquals;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertSame;
 
-public class StringUtilsTest extends BriarTestCase {
+public class StringUtilsTest extends BrambleTestCase {
 
 	@Test
 	public void testToHexString() {
diff --git a/bramble-j2se/build.gradle b/bramble-j2se/build.gradle
index d61f5dcdcdae51e34d8e282aa8969d248ea99fd1..5a874f7d9ca6538e5836a393f1077291b54748c5 100644
--- a/bramble-j2se/build.gradle
+++ b/bramble-j2se/build.gradle
@@ -7,4 +7,10 @@ apply plugin: 'witness'
 dependencies {
 	compile project(':bramble-core')
 	compile fileTree(dir: 'libs', include: '*.jar')
+
+	testCompile project(path: ':bramble-core', configuration: 'testOutput')
+}
+
+tasks.withType(Test) {
+	systemProperty 'java.library.path', 'libs'
 }
diff --git a/briar-tests/src/org/briarproject/bramble/lifecycle/WindowsShutdownManagerImplTest.java b/bramble-j2se/src/test/java/org/briarproject/bramble/lifecycle/WindowsShutdownManagerImplTest.java
similarity index 100%
rename from briar-tests/src/org/briarproject/bramble/lifecycle/WindowsShutdownManagerImplTest.java
rename to bramble-j2se/src/test/java/org/briarproject/bramble/lifecycle/WindowsShutdownManagerImplTest.java
diff --git a/briar-tests/src/org/briarproject/bramble/plugin/file/LinuxRemovableDriveFinderTest.java b/bramble-j2se/src/test/java/org/briarproject/bramble/plugin/file/LinuxRemovableDriveFinderTest.java
similarity index 88%
rename from briar-tests/src/org/briarproject/bramble/plugin/file/LinuxRemovableDriveFinderTest.java
rename to bramble-j2se/src/test/java/org/briarproject/bramble/plugin/file/LinuxRemovableDriveFinderTest.java
index 9de331d42ffefc13b96a8ba0ed5a86a70219ffc3..b26bc77a889723b2a1808ff0d4c7f3276987b45f 100644
--- a/briar-tests/src/org/briarproject/bramble/plugin/file/LinuxRemovableDriveFinderTest.java
+++ b/bramble-j2se/src/test/java/org/briarproject/bramble/plugin/file/LinuxRemovableDriveFinderTest.java
@@ -1,11 +1,11 @@
 package org.briarproject.bramble.plugin.file;
 
-import org.briarproject.BriarTestCase;
+import org.briarproject.bramble.test.BrambleTestCase;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
 
-public class LinuxRemovableDriveFinderTest extends BriarTestCase {
+public class LinuxRemovableDriveFinderTest extends BrambleTestCase {
 
 	@Test
 	public void testParseMountPoint() {
diff --git a/briar-tests/src/org/briarproject/bramble/plugin/file/MacRemovableDriveFinderTest.java b/bramble-j2se/src/test/java/org/briarproject/bramble/plugin/file/MacRemovableDriveFinderTest.java
similarity index 86%
rename from briar-tests/src/org/briarproject/bramble/plugin/file/MacRemovableDriveFinderTest.java
rename to bramble-j2se/src/test/java/org/briarproject/bramble/plugin/file/MacRemovableDriveFinderTest.java
index 3050581d5d102a57822d5b60ed078d158d8b6c50..db2cf210074017dec145affcbbb5a0b051a3d926 100644
--- a/briar-tests/src/org/briarproject/bramble/plugin/file/MacRemovableDriveFinderTest.java
+++ b/bramble-j2se/src/test/java/org/briarproject/bramble/plugin/file/MacRemovableDriveFinderTest.java
@@ -1,11 +1,11 @@
 package org.briarproject.bramble.plugin.file;
 
-import org.briarproject.BriarTestCase;
+import org.briarproject.bramble.test.BrambleTestCase;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
 
-public class MacRemovableDriveFinderTest extends BriarTestCase {
+public class MacRemovableDriveFinderTest extends BrambleTestCase {
 
 	@Test
 	public void testParseMountPoint() {
diff --git a/briar-tests/src/org/briarproject/bramble/plugin/file/PollingRemovableDriveMonitorTest.java b/bramble-j2se/src/test/java/org/briarproject/bramble/plugin/file/PollingRemovableDriveMonitorTest.java
similarity index 96%
rename from briar-tests/src/org/briarproject/bramble/plugin/file/PollingRemovableDriveMonitorTest.java
rename to bramble-j2se/src/test/java/org/briarproject/bramble/plugin/file/PollingRemovableDriveMonitorTest.java
index d2bd29cd4e52aa80677c9d1461b1bac41637153a..9d8db1b84ddcc7743ee2bf91a6e6b62bf097e284 100644
--- a/briar-tests/src/org/briarproject/bramble/plugin/file/PollingRemovableDriveMonitorTest.java
+++ b/bramble-j2se/src/test/java/org/briarproject/bramble/plugin/file/PollingRemovableDriveMonitorTest.java
@@ -1,8 +1,8 @@
 package org.briarproject.bramble.plugin.file;
 
-import org.briarproject.BriarTestCase;
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
 import org.briarproject.bramble.plugin.file.RemovableDriveMonitor.Callback;
+import org.briarproject.bramble.test.BrambleTestCase;
 import org.junit.Test;
 
 import java.io.File;
@@ -21,7 +21,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-public class PollingRemovableDriveMonitorTest extends BriarTestCase {
+public class PollingRemovableDriveMonitorTest extends BrambleTestCase {
 
 	@Test
 	public void testOneCallbackPerFile() throws Exception {
diff --git a/briar-tests/src/org/briarproject/bramble/plugin/file/RemovableDrivePluginTest.java b/bramble-j2se/src/test/java/org/briarproject/bramble/plugin/file/RemovableDrivePluginTest.java
similarity index 98%
rename from briar-tests/src/org/briarproject/bramble/plugin/file/RemovableDrivePluginTest.java
rename to bramble-j2se/src/test/java/org/briarproject/bramble/plugin/file/RemovableDrivePluginTest.java
index 25a2a1b16ba099d96dfcfb6fb1083a426d9abc3b..101c74cf7796368a1995dcdd58d178f8833c96e7 100644
--- a/briar-tests/src/org/briarproject/bramble/plugin/file/RemovableDrivePluginTest.java
+++ b/bramble-j2se/src/test/java/org/briarproject/bramble/plugin/file/RemovableDrivePluginTest.java
@@ -1,12 +1,12 @@
 package org.briarproject.bramble.plugin.file;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.ImmediateExecutor;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.plugin.TransportConnectionWriter;
 import org.briarproject.bramble.api.plugin.simplex.SimplexPluginCallback;
 import org.briarproject.bramble.plugin.file.RemovableDriveMonitor.Callback;
+import org.briarproject.bramble.test.BrambleTestCase;
+import org.briarproject.bramble.test.ImmediateExecutor;
+import org.briarproject.bramble.test.TestUtils;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.jmock.lib.concurrent.Synchroniser;
@@ -29,7 +29,7 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
-public class RemovableDrivePluginTest extends BriarTestCase {
+public class RemovableDrivePluginTest extends BrambleTestCase {
 
 	private final File testDir = TestUtils.getTestDirectory();
 	private final ContactId contactId = new ContactId(234);
diff --git a/briar-tests/src/org/briarproject/bramble/plugin/file/UnixRemovableDriveMonitorTest.java b/bramble-j2se/src/test/java/org/briarproject/bramble/plugin/file/UnixRemovableDriveMonitorTest.java
similarity index 94%
rename from briar-tests/src/org/briarproject/bramble/plugin/file/UnixRemovableDriveMonitorTest.java
rename to bramble-j2se/src/test/java/org/briarproject/bramble/plugin/file/UnixRemovableDriveMonitorTest.java
index 6b49f7d70331a026f3533d67993edfa5dc0fb175..0a43ba1538ca19a3bc14bf33cad82614688a13a0 100644
--- a/briar-tests/src/org/briarproject/bramble/plugin/file/UnixRemovableDriveMonitorTest.java
+++ b/bramble-j2se/src/test/java/org/briarproject/bramble/plugin/file/UnixRemovableDriveMonitorTest.java
@@ -1,9 +1,9 @@
 package org.briarproject.bramble.plugin.file;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
 import org.briarproject.bramble.plugin.file.RemovableDriveMonitor.Callback;
+import org.briarproject.bramble.test.BrambleTestCase;
+import org.briarproject.bramble.test.TestUtils;
 import org.briarproject.bramble.util.OsUtils;
 import org.junit.After;
 import org.junit.Before;
@@ -20,7 +20,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertTrue;
 import static org.junit.Assert.fail;
 
-public class UnixRemovableDriveMonitorTest extends BriarTestCase {
+public class UnixRemovableDriveMonitorTest extends BrambleTestCase {
 
 	private final File testDir = TestUtils.getTestDirectory();
 
diff --git a/briar-tests/src/org/briarproject/bramble/plugin/modem/CountryCodesTest.java b/bramble-j2se/src/test/java/org/briarproject/bramble/plugin/modem/CountryCodesTest.java
similarity index 95%
rename from briar-tests/src/org/briarproject/bramble/plugin/modem/CountryCodesTest.java
rename to bramble-j2se/src/test/java/org/briarproject/bramble/plugin/modem/CountryCodesTest.java
index 35aea6e15ca6c966c7dd13013b4579632e7fa86d..0f560b089a6f82f3783bf7c80c885b4ea001c28f 100644
--- a/briar-tests/src/org/briarproject/bramble/plugin/modem/CountryCodesTest.java
+++ b/bramble-j2se/src/test/java/org/briarproject/bramble/plugin/modem/CountryCodesTest.java
@@ -1,12 +1,12 @@
 package org.briarproject.bramble.plugin.modem;
 
-import org.briarproject.BriarTestCase;
+import org.briarproject.bramble.test.BrambleTestCase;
 import org.junit.Test;
 
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertNull;
 
-public class CountryCodesTest extends BriarTestCase {
+public class CountryCodesTest extends BrambleTestCase {
 
 	@Test
 	public void testTranslation() {
diff --git a/briar-tests/src/org/briarproject/bramble/plugin/modem/ModemPluginTest.java b/bramble-j2se/src/test/java/org/briarproject/bramble/plugin/modem/ModemPluginTest.java
similarity index 98%
rename from briar-tests/src/org/briarproject/bramble/plugin/modem/ModemPluginTest.java
rename to bramble-j2se/src/test/java/org/briarproject/bramble/plugin/modem/ModemPluginTest.java
index d50a54fae95b535cb76881e6a2fa97e7851d0bea..c516acb175a5d9ba3056b4515fc9c24ec2b1b614 100644
--- a/briar-tests/src/org/briarproject/bramble/plugin/modem/ModemPluginTest.java
+++ b/bramble-j2se/src/test/java/org/briarproject/bramble/plugin/modem/ModemPluginTest.java
@@ -1,9 +1,9 @@
 package org.briarproject.bramble.plugin.modem;
 
-import org.briarproject.BriarTestCase;
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.plugin.duplex.DuplexPluginCallback;
 import org.briarproject.bramble.api.properties.TransportProperties;
+import org.briarproject.bramble.test.BrambleTestCase;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.junit.Test;
@@ -16,7 +16,7 @@ import static org.junit.Assert.assertNotNull;
 import static org.junit.Assert.assertNull;
 import static org.junit.Assert.assertTrue;
 
-public class ModemPluginTest extends BriarTestCase {
+public class ModemPluginTest extends BrambleTestCase {
 
 	private static final String ISO_1336 = "GB";
 	private static final String NUMBER = "0123456789";
diff --git a/briar-android/build.gradle b/briar-android/build.gradle
index ab370acc6b5a677ae6ea02dd53416f690382cef2..5d24464bab565d9c6d32fe46ac3fe4fe1f867b46 100644
--- a/briar-android/build.gradle
+++ b/briar-android/build.gradle
@@ -30,14 +30,13 @@ dependencies {
 	compile 'info.guardianproject.trustedintents:trustedintents:0.2'
 	compile 'de.hdodenhof:circleimageview:2.1.0'
 	compile 'com.google.zxing:core:3.2.1'
-	apt 'com.google.dagger:dagger-compiler:2.0.2'
+	apt 'com.google.dagger:dagger-compiler:2.8'
 	provided 'javax.annotation:jsr250-api:1.0'
 	compile 'com.jpardogo.materialtabstrip:library:1.1.0'
 	compile 'com.github.bumptech.glide:glide:3.7.0'
 	compile 'uk.co.samuelwall:material-tap-target-prompt:1.3.0'
 
-	testCompile 'junit:junit:4.12'
-	testCompile project(path: ':briar-tests')
+	testCompile project(path: ':bramble-core', configuration: 'testOutput')
 	testCompile 'org.robolectric:robolectric:3.0'
 	testCompile 'org.mockito:mockito-core:1.10.19'
 }
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogController.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogController.java
index e67450474e4586ff9e2c4742fb49afe3a76b7a67..69eccd479b0ce3fee9cdcc09bf6d22d36078509e 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogController.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogController.java
@@ -2,7 +2,6 @@ package org.briarproject.briar.android.blog;
 
 import android.support.annotation.UiThread;
 
-import org.briarproject.bramble.api.contact.Contact;
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.db.DbException;
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostFragment.java
index 2f219ea866e7358df3f890b06eda8b35b7a53513..2655c7ff33aca6c0aae2778fd72527daf1c45124 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostFragment.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/blog/BlogPostFragment.java
@@ -2,9 +2,6 @@ package org.briarproject.briar.android.blog;
 
 import android.os.Bundle;
 import android.support.annotation.UiThread;
-import android.view.LayoutInflater;
-import android.view.View;
-import android.view.ViewGroup;
 
 import org.briarproject.bramble.api.db.DbException;
 import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
@@ -13,7 +10,6 @@ import org.briarproject.bramble.api.sync.MessageId;
 import org.briarproject.briar.android.activity.ActivityComponent;
 import org.briarproject.briar.android.controller.handler.UiResultExceptionHandler;
 
-import javax.annotation.Nullable;
 import javax.inject.Inject;
 
 @UiThread
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/controller/SharingController.java b/briar-android/src/main/java/org/briarproject/briar/android/controller/SharingController.java
index 81d9ce794c9504a1efe69d7ac68059558093f217..b04834b41a51b09e4ba9df357ca6a08c61c679c4 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/controller/SharingController.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/controller/SharingController.java
@@ -4,7 +4,6 @@ import android.support.annotation.UiThread;
 
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
-import org.briarproject.bramble.api.sync.GroupId;
 import org.briarproject.briar.android.DestroyableContext;
 
 import java.util.Collection;
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/controller/SharingControllerImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/controller/SharingControllerImpl.java
index 700beee63ec11b0a12906576dd99d8385b173894..c41df9f238704a16784b2c8c9437a32b0f664146 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/controller/SharingControllerImpl.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/controller/SharingControllerImpl.java
@@ -1,7 +1,6 @@
 package org.briarproject.briar.android.controller;
 
 import android.support.annotation.Nullable;
-import android.support.annotation.UiThread;
 
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.event.Event;
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/login/SetupActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/login/SetupActivity.java
index 694d78927ed07ef8eaf68c2dd0ff025de7b0872f..decf81f76b935f086cf17a75286d771f9e88d916 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/login/SetupActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/login/SetupActivity.java
@@ -35,7 +35,7 @@ public class SetupActivity extends BaseActivity implements OnClickListener,
 		OnEditorActionListener {
 
 	@Inject
-	protected SetupController setupController;
+	SetupController setupController;
 
 	private TextInputLayout nicknameEntryWrapper;
 	private TextInputLayout passwordEntryWrapper;
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/sharing/ForumSharingStatusActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/sharing/ForumSharingStatusActivity.java
index e9edf9e839916bb2e935533ec6d111784d99ab47..057da939e1a8449134691f3f2811c8b5725308b8 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/sharing/ForumSharingStatusActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/sharing/ForumSharingStatusActivity.java
@@ -9,7 +9,6 @@ import org.briarproject.briar.android.activity.ActivityComponent;
 import org.briarproject.briar.api.forum.ForumSharingManager;
 
 import java.util.Collection;
-import java.util.HashSet;
 
 import javax.inject.Inject;
 
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/sharing/ShareActivity.java b/briar-android/src/main/java/org/briarproject/briar/android/sharing/ShareActivity.java
index 2d0c4f0af83af120b37d3575ca5e993821bd3cb1..5258a3210e3e258a220eeebe06707f1d5077597c 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/sharing/ShareActivity.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/sharing/ShareActivity.java
@@ -8,7 +8,6 @@ import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.nullsafety.MethodsNotNullByDefault;
 import org.briarproject.bramble.api.nullsafety.ParametersNotNullByDefault;
 import org.briarproject.bramble.api.sync.GroupId;
-import org.briarproject.briar.R;
 import org.briarproject.briar.android.contactselection.ContactSelectorActivity;
 import org.briarproject.briar.android.sharing.BaseMessageFragment.MessageFragmentListener;
 
diff --git a/briar-android/src/test/java/org/briarproject/briar/android/TestSetupActivity.java b/briar-android/src/test/java/org/briarproject/briar/android/TestSetupActivity.java
deleted file mode 100644
index d9c78c800405d3beb8775814f8cb353fba0fbf09..0000000000000000000000000000000000000000
--- a/briar-android/src/test/java/org/briarproject/briar/android/TestSetupActivity.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package org.briarproject.briar.android;
-
-import org.briarproject.briar.android.login.SetupActivity;
-import org.briarproject.briar.android.login.SetupController;
-
-/**
- * This class exposes the SetupController and offers the possibility to
- * override it.
- */
-public class TestSetupActivity extends SetupActivity {
-
-	public SetupController getController() {
-		return setupController;
-	}
-
-	public void setController(SetupController setupController) {
-		this.setupController = setupController;
-	}
-}
diff --git a/briar-android/src/test/java/org/briarproject/briar/android/forum/ForumActivityTest.java b/briar-android/src/test/java/org/briarproject/briar/android/forum/ForumActivityTest.java
index 6b4d135b4b032bbbb14045a0cc2f109df6c98ee2..5773f0d2aa518bb83525871336c23ece4abba6a0 100644
--- a/briar-android/src/test/java/org/briarproject/briar/android/forum/ForumActivityTest.java
+++ b/briar-android/src/test/java/org/briarproject/briar/android/forum/ForumActivityTest.java
@@ -4,11 +4,11 @@ import android.content.Intent;
 
 import junit.framework.Assert;
 
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.db.DbException;
 import org.briarproject.bramble.api.identity.Author;
 import org.briarproject.bramble.api.identity.AuthorId;
 import org.briarproject.bramble.api.sync.MessageId;
+import org.briarproject.bramble.test.TestUtils;
 import org.briarproject.briar.BuildConfig;
 import org.briarproject.briar.android.TestBriarApplication;
 import org.briarproject.briar.android.controller.handler.UiResultExceptionHandler;
diff --git a/briar-android/src/test/java/org/briarproject/briar/android/SetupActivityTest.java b/briar-android/src/test/java/org/briarproject/briar/android/login/SetupActivityTest.java
similarity index 98%
rename from briar-android/src/test/java/org/briarproject/briar/android/SetupActivityTest.java
rename to briar-android/src/test/java/org/briarproject/briar/android/login/SetupActivityTest.java
index d6c445eb85f72cdcc9b44b25ebcae1fd10d37126..86472493c7cfd2bfb5aa77635b4f10e3836bf372 100644
--- a/briar-android/src/test/java/org/briarproject/briar/android/SetupActivityTest.java
+++ b/briar-android/src/test/java/org/briarproject/briar/android/login/SetupActivityTest.java
@@ -1,4 +1,4 @@
-package org.briarproject.briar.android;
+package org.briarproject.briar.android.login;
 
 import android.content.Context;
 import android.content.Intent;
@@ -12,9 +12,8 @@ import com.google.common.base.Strings;
 import org.briarproject.bramble.api.identity.AuthorConstants;
 import org.briarproject.briar.BuildConfig;
 import org.briarproject.briar.R;
+import org.briarproject.briar.android.TestBriarApplication;
 import org.briarproject.briar.android.controller.handler.ResultHandler;
-import org.briarproject.briar.android.login.SetupController;
-import org.briarproject.briar.android.login.StrengthMeter;
 import org.briarproject.briar.android.navdrawer.NavDrawerActivity;
 import org.junit.Assert;
 import org.junit.Before;
diff --git a/briar-android/src/test/java/org/briarproject/briar/android/login/TestSetupActivity.java b/briar-android/src/test/java/org/briarproject/briar/android/login/TestSetupActivity.java
new file mode 100644
index 0000000000000000000000000000000000000000..0595329be7f367f8cdc9edaa66b9e0395a52f8b1
--- /dev/null
+++ b/briar-android/src/test/java/org/briarproject/briar/android/login/TestSetupActivity.java
@@ -0,0 +1,16 @@
+package org.briarproject.briar.android.login;
+
+/**
+ * This class exposes the SetupController and offers the possibility to
+ * override it.
+ */
+public class TestSetupActivity extends SetupActivity {
+
+	SetupController getController() {
+		return setupController;
+	}
+
+	void setController(SetupController setupController) {
+		this.setupController = setupController;
+	}
+}
diff --git a/briar-core/.gitignore b/briar-core/.gitignore
index eeb02632a0a71dc53ad5bbb4f04aff39855b50e6..217c03c15290909413558c6b2453ab0718e96d8c 100644
--- a/briar-core/.gitignore
+++ b/briar-core/.gitignore
@@ -1,3 +1,4 @@
 bin
 build
+test.tmp
 .settings
diff --git a/briar-core/build.gradle b/briar-core/build.gradle
index d75100870a6a76734250db066794bb589098b2d0..0f8177975f6adb80b41db8cb858360521cce30ea 100644
--- a/briar-core/build.gradle
+++ b/briar-core/build.gradle
@@ -16,11 +16,10 @@ dependencies {
 	compile 'com.squareup.okhttp3:okhttp:3.3.1'
 	compile 'org.jsoup:jsoup:1.9.2'
 
-	testCompile project(':briar-tests') // TODO remove when moving unit tests (#778)
-	testCompile 'junit:junit:4.12'
+	testCompile project(':bramble-core')
+	testCompile project(path: ':bramble-core', configuration: 'testOutput')
+	testCompile project(path: ':bramble-api', configuration: 'testOutput')
 	testCompile 'net.jodah:concurrentunit:0.4.2'
-	testCompile 'com.google.dagger:dagger-compiler:2.8'
-	testApt 'com.google.dagger:dagger-compiler:2.8'
 }
 
 dependencyVerification {
diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroduceeEngine.java b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroduceeEngine.java
index f93fb0aa4164320e717e9b24f8569cd418acad52..74ecc946a3215c373be52709912319e393e76222 100644
--- a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroduceeEngine.java
+++ b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroduceeEngine.java
@@ -17,7 +17,6 @@ import org.briarproject.briar.api.introduction.event.IntroductionAbortedEvent;
 import org.briarproject.briar.api.introduction.event.IntroductionRequestReceivedEvent;
 
 import java.util.ArrayList;
-import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 import java.util.logging.Logger;
@@ -43,7 +42,6 @@ import static org.briarproject.briar.api.introduction.IntroductionConstants.CONT
 import static org.briarproject.briar.api.introduction.IntroductionConstants.EXISTS;
 import static org.briarproject.briar.api.introduction.IntroductionConstants.E_PUBLIC_KEY;
 import static org.briarproject.briar.api.introduction.IntroductionConstants.GROUP_ID;
-import static org.briarproject.briar.api.introduction.IntroductionConstants.INTRODUCER;
 import static org.briarproject.briar.api.introduction.IntroductionConstants.MAC;
 import static org.briarproject.briar.api.introduction.IntroductionConstants.MESSAGE_ID;
 import static org.briarproject.briar.api.introduction.IntroductionConstants.MESSAGE_TIME;
diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java
index 44ba7496069dd9d22f0b02f4a2270de4f9ed53a8..c96d0df9fd422498632deaf06831dc4c48fef839 100644
--- a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java
@@ -37,9 +37,9 @@ import org.briarproject.briar.api.sharing.InvitationMessage;
 import org.briarproject.briar.api.sharing.Shareable;
 import org.briarproject.briar.api.sharing.SharingInvitationItem;
 import org.briarproject.briar.api.sharing.SharingManager;
+import org.briarproject.briar.api.sharing.event.ContactLeftShareableEvent;
 import org.briarproject.briar.api.sharing.event.InvitationRequestReceivedEvent;
 import org.briarproject.briar.api.sharing.event.InvitationResponseReceivedEvent;
-import org.briarproject.briar.api.sharing.event.ContactLeftShareableEvent;
 import org.briarproject.briar.client.ConversationClientImpl;
 
 import java.io.IOException;
diff --git a/briar-tests/src/org/briarproject/briar/blog/BlogManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerImplTest.java
similarity index 98%
rename from briar-tests/src/org/briarproject/briar/blog/BlogManagerImplTest.java
rename to briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerImplTest.java
index 3430dc39909d5190b68128db60e188a983bf9668..e2b5e8ef5206d162cc029c3cd945362f894eaa96 100644
--- a/briar-tests/src/org/briarproject/briar/blog/BlogManagerImplTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerImplTest.java
@@ -1,6 +1,5 @@
 package org.briarproject.briar.blog;
 
-import org.briarproject.BriarTestCase;
 import org.briarproject.bramble.api.FormatException;
 import org.briarproject.bramble.api.client.ClientHelper;
 import org.briarproject.bramble.api.contact.Contact;
@@ -27,6 +26,7 @@ import org.briarproject.briar.api.blog.BlogPost;
 import org.briarproject.briar.api.blog.BlogPostFactory;
 import org.briarproject.briar.api.blog.BlogPostHeader;
 import org.briarproject.briar.api.blog.event.BlogPostAddedEvent;
+import org.briarproject.briar.test.BriarTestCase;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.junit.Test;
@@ -34,11 +34,11 @@ import org.junit.Test;
 import java.util.Collection;
 import java.util.Collections;
 
-import static org.briarproject.TestUtils.getRandomBytes;
-import static org.briarproject.TestUtils.getRandomId;
 import static org.briarproject.bramble.api.identity.Author.Status.VERIFIED;
 import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_PUBLIC_KEY_LENGTH;
 import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED;
+import static org.briarproject.bramble.test.TestUtils.getRandomBytes;
+import static org.briarproject.bramble.test.TestUtils.getRandomId;
 import static org.briarproject.briar.api.blog.BlogConstants.KEY_AUTHOR;
 import static org.briarproject.briar.api.blog.BlogConstants.KEY_AUTHOR_ID;
 import static org.briarproject.briar.api.blog.BlogConstants.KEY_AUTHOR_NAME;
diff --git a/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerIntegrationTest.java
index 85a2659d09ee3eccfea1c8dabf10a468eb2fd7e1..7c7a681804af042470aa4285f7d3511cc62102c5 100644
--- a/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerIntegrationTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/blog/BlogManagerIntegrationTest.java
@@ -1,16 +1,16 @@
 package org.briarproject.briar.blog;
 
-import org.briarproject.TestDatabaseModule;
 import org.briarproject.bramble.api.db.DbException;
 import org.briarproject.bramble.api.sync.MessageId;
-import org.briarproject.briar.BriarIntegrationTest;
-import org.briarproject.briar.BriarIntegrationTestComponent;
-import org.briarproject.briar.DaggerBriarIntegrationTestComponent;
+import org.briarproject.bramble.test.TestDatabaseModule;
 import org.briarproject.briar.api.blog.Blog;
 import org.briarproject.briar.api.blog.BlogCommentHeader;
 import org.briarproject.briar.api.blog.BlogManager;
 import org.briarproject.briar.api.blog.BlogPost;
 import org.briarproject.briar.api.blog.BlogPostHeader;
+import org.briarproject.briar.test.BriarIntegrationTest;
+import org.briarproject.briar.test.BriarIntegrationTestComponent;
+import org.briarproject.briar.test.DaggerBriarIntegrationTestComponent;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -21,7 +21,7 @@ import java.util.Iterator;
 
 import static junit.framework.Assert.assertFalse;
 import static junit.framework.Assert.assertNotNull;
-import static org.briarproject.TestUtils.getRandomString;
+import static org.briarproject.bramble.test.TestUtils.getRandomString;
 import static org.briarproject.briar.api.blog.MessageType.COMMENT;
 import static org.briarproject.briar.api.blog.MessageType.POST;
 import static org.briarproject.briar.api.blog.MessageType.WRAPPED_COMMENT;
diff --git a/briar-tests/src/org/briarproject/briar/blog/BlogPostValidatorTest.java b/briar-core/src/test/java/org/briarproject/briar/blog/BlogPostValidatorTest.java
similarity index 99%
rename from briar-tests/src/org/briarproject/briar/blog/BlogPostValidatorTest.java
rename to briar-core/src/test/java/org/briarproject/briar/blog/BlogPostValidatorTest.java
index 56c8999bd9bdf5fcee08e05acc41d0ca2c4d0b00..1ac77a550e8d3737eadd84e447e9981abb0d443f 100644
--- a/briar-tests/src/org/briarproject/briar/blog/BlogPostValidatorTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/blog/BlogPostValidatorTest.java
@@ -1,7 +1,5 @@
 package org.briarproject.briar.blog;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.FormatException;
 import org.briarproject.bramble.api.client.ClientHelper;
 import org.briarproject.bramble.api.data.BdfDictionary;
@@ -19,8 +17,10 @@ import org.briarproject.bramble.api.sync.MessageFactory;
 import org.briarproject.bramble.api.sync.MessageId;
 import org.briarproject.bramble.api.system.Clock;
 import org.briarproject.bramble.system.SystemClock;
+import org.briarproject.bramble.test.TestUtils;
 import org.briarproject.briar.api.blog.Blog;
 import org.briarproject.briar.api.blog.BlogFactory;
+import org.briarproject.briar.test.BriarTestCase;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.junit.Test;
diff --git a/briar-tests/src/org/briarproject/briar/client/MessageQueueManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/client/MessageQueueManagerImplTest.java
similarity index 96%
rename from briar-tests/src/org/briarproject/briar/client/MessageQueueManagerImplTest.java
rename to briar-core/src/test/java/org/briarproject/briar/client/MessageQueueManagerImplTest.java
index 2c38258e2a42e7bf6570fed19551cf27e5faa4a3..19878e4ad37e47a75b30330541cbadc2a0416997 100644
--- a/briar-tests/src/org/briarproject/briar/client/MessageQueueManagerImplTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/client/MessageQueueManagerImplTest.java
@@ -1,8 +1,5 @@
 package org.briarproject.briar.client;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.CaptureArgumentAction;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.client.ClientHelper;
 import org.briarproject.bramble.api.data.BdfDictionary;
 import org.briarproject.bramble.api.data.BdfList;
@@ -19,11 +16,14 @@ import org.briarproject.bramble.api.sync.MessageId;
 import org.briarproject.bramble.api.sync.ValidationManager;
 import org.briarproject.bramble.api.sync.ValidationManager.IncomingMessageHook;
 import org.briarproject.bramble.api.sync.ValidationManager.MessageValidator;
+import org.briarproject.bramble.test.CaptureArgumentAction;
+import org.briarproject.bramble.test.TestUtils;
 import org.briarproject.bramble.util.ByteUtils;
 import org.briarproject.briar.api.client.MessageQueueManager.IncomingQueueMessageHook;
 import org.briarproject.briar.api.client.MessageQueueManager.QueueMessageValidator;
 import org.briarproject.briar.api.client.QueueMessage;
 import org.briarproject.briar.api.client.QueueMessageFactory;
+import org.briarproject.briar.test.BriarTestCase;
 import org.hamcrest.Description;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
@@ -130,7 +130,7 @@ public class MessageQueueManagerImplTest extends BriarTestCase {
 				context.mock(ValidationManager.class);
 
 		final AtomicReference<MessageValidator> captured =
-				new AtomicReference<>();
+				new AtomicReference<MessageValidator>();
 		final QueueMessageValidator queueMessageValidator =
 				context.mock(QueueMessageValidator.class);
 		// The message is too short to be a valid queue message
@@ -141,7 +141,7 @@ public class MessageQueueManagerImplTest extends BriarTestCase {
 		context.checking(new Expectations() {{
 			oneOf(validationManager).registerMessageValidator(with(clientId),
 					with(any(MessageValidator.class)));
-			will(new CaptureArgumentAction<>(captured,
+			will(new CaptureArgumentAction<MessageValidator>(captured,
 					MessageValidator.class, 1));
 		}});
 
@@ -174,7 +174,7 @@ public class MessageQueueManagerImplTest extends BriarTestCase {
 				context.mock(ValidationManager.class);
 
 		final AtomicReference<MessageValidator> captured =
-				new AtomicReference<>();
+				new AtomicReference<MessageValidator>();
 		final QueueMessageValidator queueMessageValidator =
 				context.mock(QueueMessageValidator.class);
 		// The message has a negative queue position
@@ -187,7 +187,7 @@ public class MessageQueueManagerImplTest extends BriarTestCase {
 		context.checking(new Expectations() {{
 			oneOf(validationManager).registerMessageValidator(with(clientId),
 					with(any(MessageValidator.class)));
-			will(new CaptureArgumentAction<>(captured,
+			will(new CaptureArgumentAction<MessageValidator>(captured,
 					MessageValidator.class, 1));
 		}});
 
@@ -220,7 +220,7 @@ public class MessageQueueManagerImplTest extends BriarTestCase {
 				context.mock(ValidationManager.class);
 
 		final AtomicReference<MessageValidator> captured =
-				new AtomicReference<>();
+				new AtomicReference<MessageValidator>();
 		final QueueMessageValidator queueMessageValidator =
 				context.mock(QueueMessageValidator.class);
 		final Metadata metadata = new Metadata();
@@ -234,7 +234,7 @@ public class MessageQueueManagerImplTest extends BriarTestCase {
 		context.checking(new Expectations() {{
 			oneOf(validationManager).registerMessageValidator(with(clientId),
 					with(any(MessageValidator.class)));
-			will(new CaptureArgumentAction<>(captured,
+			will(new CaptureArgumentAction<MessageValidator>(captured,
 					MessageValidator.class, 1));
 			// The message should be delegated
 			oneOf(queueMessageValidator).validateMessage(
@@ -267,7 +267,7 @@ public class MessageQueueManagerImplTest extends BriarTestCase {
 		final ValidationManager validationManager =
 				context.mock(ValidationManager.class);
 		final AtomicReference<IncomingMessageHook> captured =
-				new AtomicReference<>();
+				new AtomicReference<IncomingMessageHook>();
 		final IncomingQueueMessageHook incomingQueueMessageHook =
 				context.mock(IncomingQueueMessageHook.class);
 
@@ -283,7 +283,7 @@ public class MessageQueueManagerImplTest extends BriarTestCase {
 		context.checking(new Expectations() {{
 			oneOf(validationManager).registerIncomingMessageHook(with(clientId),
 					with(any(IncomingMessageHook.class)));
-			will(new CaptureArgumentAction<>(captured,
+			will(new CaptureArgumentAction<IncomingMessageHook>(captured,
 					IncomingMessageHook.class, 1));
 			oneOf(db).getGroupMetadata(txn, groupId);
 			will(returnValue(groupMetadata));
@@ -319,7 +319,7 @@ public class MessageQueueManagerImplTest extends BriarTestCase {
 		final ValidationManager validationManager =
 				context.mock(ValidationManager.class);
 		final AtomicReference<IncomingMessageHook> captured =
-				new AtomicReference<>();
+				new AtomicReference<IncomingMessageHook>();
 		final IncomingQueueMessageHook incomingQueueMessageHook =
 				context.mock(IncomingQueueMessageHook.class);
 
@@ -337,7 +337,7 @@ public class MessageQueueManagerImplTest extends BriarTestCase {
 		context.checking(new Expectations() {{
 			oneOf(validationManager).registerIncomingMessageHook(with(clientId),
 					with(any(IncomingMessageHook.class)));
-			will(new CaptureArgumentAction<>(captured,
+			will(new CaptureArgumentAction<IncomingMessageHook>(captured,
 					IncomingMessageHook.class, 1));
 			oneOf(db).getGroupMetadata(txn, groupId);
 			will(returnValue(groupMetadata));
@@ -375,7 +375,7 @@ public class MessageQueueManagerImplTest extends BriarTestCase {
 		final ValidationManager validationManager =
 				context.mock(ValidationManager.class);
 		final AtomicReference<IncomingMessageHook> captured =
-				new AtomicReference<>();
+				new AtomicReference<IncomingMessageHook>();
 		final IncomingQueueMessageHook incomingQueueMessageHook =
 				context.mock(IncomingQueueMessageHook.class);
 
@@ -392,7 +392,7 @@ public class MessageQueueManagerImplTest extends BriarTestCase {
 		context.checking(new Expectations() {{
 			oneOf(validationManager).registerIncomingMessageHook(with(clientId),
 					with(any(IncomingMessageHook.class)));
-			will(new CaptureArgumentAction<>(captured,
+			will(new CaptureArgumentAction<IncomingMessageHook>(captured,
 					IncomingMessageHook.class, 1));
 			oneOf(db).getGroupMetadata(txn, groupId);
 			will(returnValue(groupMetadata));
@@ -433,7 +433,7 @@ public class MessageQueueManagerImplTest extends BriarTestCase {
 		final ValidationManager validationManager =
 				context.mock(ValidationManager.class);
 		final AtomicReference<IncomingMessageHook> captured =
-				new AtomicReference<>();
+				new AtomicReference<IncomingMessageHook>();
 		final IncomingQueueMessageHook incomingQueueMessageHook =
 				context.mock(IncomingQueueMessageHook.class);
 
@@ -457,7 +457,7 @@ public class MessageQueueManagerImplTest extends BriarTestCase {
 		context.checking(new Expectations() {{
 			oneOf(validationManager).registerIncomingMessageHook(with(clientId),
 					with(any(IncomingMessageHook.class)));
-			will(new CaptureArgumentAction<>(captured,
+			will(new CaptureArgumentAction<IncomingMessageHook>(captured,
 					IncomingMessageHook.class, 1));
 			oneOf(db).getGroupMetadata(txn, groupId);
 			will(returnValue(groupMetadata));
diff --git a/briar-tests/src/org/briarproject/briar/client/MessageTreeImplTest.java b/briar-core/src/test/java/org/briarproject/briar/client/MessageTreeImplTest.java
similarity index 96%
rename from briar-tests/src/org/briarproject/briar/client/MessageTreeImplTest.java
rename to briar-core/src/test/java/org/briarproject/briar/client/MessageTreeImplTest.java
index e35af03566c3cf9cc840bf6c89f6538d18e1d523..b1a457c8a799598a528eefe7c083b12f4e43d8c9 100644
--- a/briar-tests/src/org/briarproject/briar/client/MessageTreeImplTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/client/MessageTreeImplTest.java
@@ -1,8 +1,8 @@
 package org.briarproject.briar.client;
 
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
 import org.briarproject.bramble.api.sync.MessageId;
+import org.briarproject.bramble.test.TestUtils;
 import org.briarproject.briar.api.client.MessageTree;
 import org.junit.Test;
 
@@ -19,7 +19,7 @@ public class MessageTreeImplTest {
 
 	@Test
 	public void testMessageTree() {
-		tree = new MessageTreeImpl<>();
+		tree = new MessageTreeImpl<TestNode>();
 		testSimpleTree();
 		tree.clear();
 		testSimpleTree();
diff --git a/briar-tests/src/org/briarproject/briar/forum/ForumManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/forum/ForumManagerImplTest.java
similarity index 82%
rename from briar-tests/src/org/briarproject/briar/forum/ForumManagerImplTest.java
rename to briar-core/src/test/java/org/briarproject/briar/forum/ForumManagerImplTest.java
index 0a4a0ac6fd89be677b770a3a7e960f32af9310d5..084da117f64df425a7e57a9c8cde8bb91f6a56c5 100644
--- a/briar-tests/src/org/briarproject/briar/forum/ForumManagerImplTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/forum/ForumManagerImplTest.java
@@ -1,6 +1,6 @@
 package org.briarproject.briar.forum;
 
-import org.briarproject.BriarTestCase;
+import org.briarproject.briar.test.BriarTestCase;
 import org.junit.Test;
 
 import static org.junit.Assert.fail;
diff --git a/briar-core/src/test/java/org/briarproject/briar/forum/ForumManagerTest.java b/briar-core/src/test/java/org/briarproject/briar/forum/ForumManagerTest.java
index f4527089ca20feccf79675d2c611f5558d9c2f00..9ca8805f20819998ad4df22c41a798315d10e19e 100644
--- a/briar-core/src/test/java/org/briarproject/briar/forum/ForumManagerTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/forum/ForumManagerTest.java
@@ -1,15 +1,15 @@
 package org.briarproject.briar.forum;
 
-import org.briarproject.TestDatabaseModule;
 import org.briarproject.bramble.api.sync.GroupId;
-import org.briarproject.briar.BriarIntegrationTest;
-import org.briarproject.briar.BriarIntegrationTestComponent;
-import org.briarproject.briar.DaggerBriarIntegrationTestComponent;
+import org.briarproject.bramble.test.TestDatabaseModule;
 import org.briarproject.briar.api.forum.Forum;
 import org.briarproject.briar.api.forum.ForumManager;
 import org.briarproject.briar.api.forum.ForumPost;
 import org.briarproject.briar.api.forum.ForumPostHeader;
 import org.briarproject.briar.api.forum.ForumSharingManager;
+import org.briarproject.briar.test.BriarIntegrationTest;
+import org.briarproject.briar.test.BriarIntegrationTestComponent;
+import org.briarproject.briar.test.DaggerBriarIntegrationTestComponent;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -17,7 +17,7 @@ import java.util.Collection;
 
 import javax.annotation.Nullable;
 
-import static org.briarproject.TestUtils.assertGroupCount;
+import static org.briarproject.briar.test.BriarTestUtils.assertGroupCount;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNull;
diff --git a/briar-tests/src/org/briarproject/briar/forum/ForumPostValidatorTest.java b/briar-core/src/test/java/org/briarproject/briar/forum/ForumPostValidatorTest.java
similarity index 99%
rename from briar-tests/src/org/briarproject/briar/forum/ForumPostValidatorTest.java
rename to briar-core/src/test/java/org/briarproject/briar/forum/ForumPostValidatorTest.java
index 4eacdc503360ae59ad146f36a5dcd29a025aff48..d61a16d1250bcfbd33f44c65a69bf3e160344640 100644
--- a/briar-tests/src/org/briarproject/briar/forum/ForumPostValidatorTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/forum/ForumPostValidatorTest.java
@@ -1,7 +1,5 @@
 package org.briarproject.briar.forum;
 
-import org.briarproject.TestUtils;
-import org.briarproject.ValidatorTestCase;
 import org.briarproject.bramble.api.FormatException;
 import org.briarproject.bramble.api.UniqueId;
 import org.briarproject.bramble.api.client.BdfMessageContext;
@@ -11,6 +9,8 @@ import org.briarproject.bramble.api.identity.Author;
 import org.briarproject.bramble.api.identity.AuthorId;
 import org.briarproject.bramble.api.sync.InvalidMessageException;
 import org.briarproject.bramble.api.sync.MessageId;
+import org.briarproject.bramble.test.TestUtils;
+import org.briarproject.bramble.test.ValidatorTestCase;
 import org.jmock.Expectations;
 import org.junit.Test;
 
diff --git a/briar-tests/src/org/briarproject/briar/introduction/IntroduceeManagerTest.java b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroduceeManagerTest.java
similarity index 99%
rename from briar-tests/src/org/briarproject/briar/introduction/IntroduceeManagerTest.java
rename to briar-core/src/test/java/org/briarproject/briar/introduction/IntroduceeManagerTest.java
index c0de31ef2deb531118380d570a5eb5c34ece7808..30b58d5871f52003a751d926d442cc23c60e40b4 100644
--- a/briar-tests/src/org/briarproject/briar/introduction/IntroduceeManagerTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroduceeManagerTest.java
@@ -1,7 +1,5 @@
 package org.briarproject.briar.introduction;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.Bytes;
 import org.briarproject.bramble.api.FormatException;
 import org.briarproject.bramble.api.client.ClientHelper;
@@ -27,8 +25,10 @@ import org.briarproject.bramble.api.sync.GroupId;
 import org.briarproject.bramble.api.sync.Message;
 import org.briarproject.bramble.api.sync.MessageId;
 import org.briarproject.bramble.api.system.Clock;
+import org.briarproject.bramble.test.TestUtils;
 import org.briarproject.briar.api.client.SessionId;
 import org.briarproject.briar.api.introduction.IntroduceeProtocolState;
+import org.briarproject.briar.test.BriarTestCase;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.jmock.lib.legacy.ClassImposteriser;
diff --git a/briar-tests/src/org/briarproject/briar/introduction/IntroducerManagerTest.java b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroducerManagerTest.java
similarity index 98%
rename from briar-tests/src/org/briarproject/briar/introduction/IntroducerManagerTest.java
rename to briar-core/src/test/java/org/briarproject/briar/introduction/IntroducerManagerTest.java
index 09c0474d9135257aa485f77edc225f952107d7fa..1eb26692f53b1b6d2f4e88e0c9e3d202048522ac 100644
--- a/briar-tests/src/org/briarproject/briar/introduction/IntroducerManagerTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroducerManagerTest.java
@@ -1,7 +1,5 @@
 package org.briarproject.briar.introduction;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.Bytes;
 import org.briarproject.bramble.api.FormatException;
 import org.briarproject.bramble.api.client.ClientHelper;
@@ -20,6 +18,8 @@ import org.briarproject.bramble.api.sync.GroupId;
 import org.briarproject.bramble.api.sync.Message;
 import org.briarproject.bramble.api.sync.MessageId;
 import org.briarproject.bramble.api.system.Clock;
+import org.briarproject.bramble.test.TestUtils;
+import org.briarproject.briar.test.BriarTestCase;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.jmock.lib.legacy.ClassImposteriser;
diff --git a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTest.java
index 80cd0c1581af6739fd5cf07134c72fb993ca6cfb..06ff73e6838565efdd72f4b4e3df173aebb001fd 100644
--- a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTest.java
@@ -2,8 +2,6 @@ package org.briarproject.briar.introduction;
 
 import net.jodah.concurrentunit.Waiter;
 
-import org.briarproject.TestDatabaseModule;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.FormatException;
 import org.briarproject.bramble.api.client.ClientHelper;
 import org.briarproject.bramble.api.contact.Contact;
@@ -26,7 +24,8 @@ import org.briarproject.bramble.api.properties.TransportPropertyManager;
 import org.briarproject.bramble.api.sync.Group;
 import org.briarproject.bramble.api.sync.GroupId;
 import org.briarproject.bramble.api.sync.MessageId;
-import org.briarproject.briar.BriarIntegrationTest;
+import org.briarproject.bramble.test.TestDatabaseModule;
+import org.briarproject.bramble.test.TestUtils;
 import org.briarproject.briar.api.client.SessionId;
 import org.briarproject.briar.api.introduction.IntroductionManager;
 import org.briarproject.briar.api.introduction.IntroductionMessage;
@@ -35,6 +34,7 @@ import org.briarproject.briar.api.introduction.event.IntroductionAbortedEvent;
 import org.briarproject.briar.api.introduction.event.IntroductionRequestReceivedEvent;
 import org.briarproject.briar.api.introduction.event.IntroductionResponseReceivedEvent;
 import org.briarproject.briar.api.introduction.event.IntroductionSucceededEvent;
+import org.briarproject.briar.test.BriarIntegrationTest;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -51,9 +51,8 @@ import java.util.logging.Logger;
 
 import javax.inject.Inject;
 
-import static org.briarproject.TestPluginConfigModule.TRANSPORT_ID;
-import static org.briarproject.TestUtils.assertGroupCount;
 import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_PUBLIC_KEY_LENGTH;
+import static org.briarproject.bramble.test.TestPluginConfigModule.TRANSPORT_ID;
 import static org.briarproject.briar.api.client.MessageQueueManager.QUEUE_STATE_KEY;
 import static org.briarproject.briar.api.introduction.IntroductionConstants.E_PUBLIC_KEY;
 import static org.briarproject.briar.api.introduction.IntroductionConstants.GROUP_ID;
@@ -70,6 +69,7 @@ import static org.briarproject.briar.api.introduction.IntroductionConstants.TYPE
 import static org.briarproject.briar.api.introduction.IntroductionConstants.TYPE_REQUEST;
 import static org.briarproject.briar.api.introduction.IntroductionConstants.TYPE_RESPONSE;
 import static org.briarproject.briar.introduction.IntroduceeManager.SIGNING_LABEL_RESPONSE;
+import static org.briarproject.briar.test.BriarTestUtils.assertGroupCount;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
diff --git a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTestComponent.java b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTestComponent.java
index ba3dcae6a109181a4410a5dec354109dbbdec0e5..538d4def320ba2cbbbea1e9a1cd0150bf77f7a4d 100644
--- a/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTestComponent.java
+++ b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionIntegrationTestComponent.java
@@ -1,8 +1,5 @@
 package org.briarproject.briar.introduction;
 
-import org.briarproject.TestDatabaseModule;
-import org.briarproject.TestPluginConfigModule;
-import org.briarproject.TestSeedProviderModule;
 import org.briarproject.bramble.client.ClientModule;
 import org.briarproject.bramble.contact.ContactModule;
 import org.briarproject.bramble.crypto.CryptoModule;
@@ -14,8 +11,10 @@ import org.briarproject.bramble.lifecycle.LifecycleModule;
 import org.briarproject.bramble.properties.PropertiesModule;
 import org.briarproject.bramble.sync.SyncModule;
 import org.briarproject.bramble.system.SystemModule;
+import org.briarproject.bramble.test.TestDatabaseModule;
+import org.briarproject.bramble.test.TestPluginConfigModule;
+import org.briarproject.bramble.test.TestSeedProviderModule;
 import org.briarproject.bramble.transport.TransportModule;
-import org.briarproject.briar.BriarIntegrationTestComponent;
 import org.briarproject.briar.blog.BlogModule;
 import org.briarproject.briar.client.BriarClientModule;
 import org.briarproject.briar.forum.ForumModule;
@@ -23,6 +22,7 @@ import org.briarproject.briar.messaging.MessagingModule;
 import org.briarproject.briar.privategroup.PrivateGroupModule;
 import org.briarproject.briar.privategroup.invitation.GroupInvitationModule;
 import org.briarproject.briar.sharing.SharingModule;
+import org.briarproject.briar.test.BriarIntegrationTestComponent;
 
 import javax.inject.Singleton;
 
diff --git a/briar-tests/src/org/briarproject/briar/introduction/IntroductionManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionManagerImplTest.java
similarity index 99%
rename from briar-tests/src/org/briarproject/briar/introduction/IntroductionManagerImplTest.java
rename to briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionManagerImplTest.java
index 6d9841e2c780f26fd75f336bb32c4a9485da9cb3..20673e7a5ada0ba8682e90c4c55421167d614192 100644
--- a/briar-tests/src/org/briarproject/briar/introduction/IntroductionManagerImplTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionManagerImplTest.java
@@ -1,7 +1,5 @@
 package org.briarproject.briar.introduction;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.FormatException;
 import org.briarproject.bramble.api.client.ClientHelper;
 import org.briarproject.bramble.api.contact.Contact;
@@ -21,8 +19,10 @@ import org.briarproject.bramble.api.sync.GroupId;
 import org.briarproject.bramble.api.sync.Message;
 import org.briarproject.bramble.api.sync.MessageId;
 import org.briarproject.bramble.api.sync.MessageStatus;
+import org.briarproject.bramble.test.TestUtils;
 import org.briarproject.briar.api.client.MessageTracker;
 import org.briarproject.briar.api.client.SessionId;
+import org.briarproject.briar.test.BriarTestCase;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.jmock.lib.legacy.ClassImposteriser;
diff --git a/briar-tests/src/org/briarproject/briar/introduction/IntroductionValidatorTest.java b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionValidatorTest.java
similarity index 99%
rename from briar-tests/src/org/briarproject/briar/introduction/IntroductionValidatorTest.java
rename to briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionValidatorTest.java
index 5678cc61c452cd57c2729fd9a79cb8c1da25e6a9..fd76151097460a2296f7be5764d955c8b391fbaf 100644
--- a/briar-tests/src/org/briarproject/briar/introduction/IntroductionValidatorTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/introduction/IntroductionValidatorTest.java
@@ -1,7 +1,5 @@
 package org.briarproject.briar.introduction;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.FormatException;
 import org.briarproject.bramble.api.client.ClientHelper;
 import org.briarproject.bramble.api.data.BdfDictionary;
@@ -16,7 +14,9 @@ import org.briarproject.bramble.api.sync.Message;
 import org.briarproject.bramble.api.sync.MessageId;
 import org.briarproject.bramble.api.system.Clock;
 import org.briarproject.bramble.system.SystemClock;
+import org.briarproject.bramble.test.TestUtils;
 import org.briarproject.briar.api.client.SessionId;
+import org.briarproject.briar.test.BriarTestCase;
 import org.jmock.Mockery;
 import org.junit.Test;
 
diff --git a/briar-tests/src/org/briarproject/briar/introduction/MessageSenderTest.java b/briar-core/src/test/java/org/briarproject/briar/introduction/MessageSenderTest.java
similarity index 97%
rename from briar-tests/src/org/briarproject/briar/introduction/MessageSenderTest.java
rename to briar-core/src/test/java/org/briarproject/briar/introduction/MessageSenderTest.java
index 5c43548c43e5657a368398da830460d0eb592b8e..2cfe9e712e04a85265e8e4ec2454fcf180796894 100644
--- a/briar-tests/src/org/briarproject/briar/introduction/MessageSenderTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/introduction/MessageSenderTest.java
@@ -1,7 +1,5 @@
 package org.briarproject.briar.introduction;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.FormatException;
 import org.briarproject.bramble.api.client.ClientHelper;
 import org.briarproject.bramble.api.data.BdfDictionary;
@@ -16,8 +14,10 @@ import org.briarproject.bramble.api.sync.ClientId;
 import org.briarproject.bramble.api.sync.Group;
 import org.briarproject.bramble.api.sync.GroupId;
 import org.briarproject.bramble.api.system.Clock;
+import org.briarproject.bramble.test.TestUtils;
 import org.briarproject.briar.api.client.MessageQueueManager;
 import org.briarproject.briar.api.client.SessionId;
+import org.briarproject.briar.test.BriarTestCase;
 import org.jmock.Expectations;
 import org.jmock.Mockery;
 import org.junit.Test;
diff --git a/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTest.java
index 348e829e4a2c3bf01c9f478e462d3ab04ef46e81..79197bf4393fb6b58d97da582c57df2eb6736324 100644
--- a/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTest.java
@@ -1,7 +1,5 @@
 package org.briarproject.briar.messaging;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.UniqueId;
 import org.briarproject.bramble.api.crypto.CryptoComponent;
 import org.briarproject.bramble.api.crypto.PrivateKey;
@@ -10,20 +8,22 @@ import org.briarproject.bramble.api.identity.LocalAuthor;
 import org.briarproject.bramble.api.sync.GroupId;
 import org.briarproject.bramble.api.sync.MessageId;
 import org.briarproject.bramble.system.SystemModule;
+import org.briarproject.bramble.test.TestUtils;
 import org.briarproject.bramble.util.StringUtils;
 import org.briarproject.briar.api.forum.ForumConstants;
 import org.briarproject.briar.api.forum.ForumPost;
 import org.briarproject.briar.api.forum.ForumPostFactory;
 import org.briarproject.briar.api.messaging.PrivateMessage;
 import org.briarproject.briar.api.messaging.PrivateMessageFactory;
+import org.briarproject.briar.test.BriarTestCase;
 import org.junit.Test;
 
 import javax.inject.Inject;
 
-import static org.briarproject.TestUtils.getRandomId;
 import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_AUTHOR_NAME_LENGTH;
 import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_PUBLIC_KEY_LENGTH;
 import static org.briarproject.bramble.api.sync.SyncConstants.MAX_PACKET_PAYLOAD_LENGTH;
+import static org.briarproject.bramble.test.TestUtils.getRandomId;
 import static org.briarproject.briar.api.forum.ForumConstants.MAX_FORUM_POST_BODY_LENGTH;
 import static org.briarproject.briar.api.messaging.MessagingConstants.MAX_PRIVATE_MESSAGE_BODY_LENGTH;
 import static org.junit.Assert.assertTrue;
diff --git a/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTestComponent.java b/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTestComponent.java
index 37ede5370201dfb27f1d1eda191c28a65c1f1987..2c91a0bd87bb4ac536309505b2620d22b8ff12e8 100644
--- a/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTestComponent.java
+++ b/briar-core/src/test/java/org/briarproject/briar/messaging/MessageSizeIntegrationTestComponent.java
@@ -1,8 +1,5 @@
 package org.briarproject.briar.messaging;
 
-import org.briarproject.TestDatabaseModule;
-import org.briarproject.TestLifecycleModule;
-import org.briarproject.TestSeedProviderModule;
 import org.briarproject.bramble.client.ClientModule;
 import org.briarproject.bramble.crypto.CryptoModule;
 import org.briarproject.bramble.data.DataModule;
@@ -11,6 +8,9 @@ import org.briarproject.bramble.event.EventModule;
 import org.briarproject.bramble.identity.IdentityModule;
 import org.briarproject.bramble.sync.SyncModule;
 import org.briarproject.bramble.system.SystemModule;
+import org.briarproject.bramble.test.TestDatabaseModule;
+import org.briarproject.bramble.test.TestLifecycleModule;
+import org.briarproject.bramble.test.TestSeedProviderModule;
 import org.briarproject.briar.client.BriarClientModule;
 import org.briarproject.briar.forum.ForumModule;
 
diff --git a/briar-tests/src/org/briarproject/briar/messaging/MessagingManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/messaging/MessagingManagerImplTest.java
similarity index 83%
rename from briar-tests/src/org/briarproject/briar/messaging/MessagingManagerImplTest.java
rename to briar-core/src/test/java/org/briarproject/briar/messaging/MessagingManagerImplTest.java
index f6ac2bf66e4d1447750f4ed19dc98ae00b0d6284..a9d3043d88fe4feaa48e005ec5115ef5dc7daf80 100644
--- a/briar-tests/src/org/briarproject/briar/messaging/MessagingManagerImplTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/messaging/MessagingManagerImplTest.java
@@ -1,6 +1,6 @@
 package org.briarproject.briar.messaging;
 
-import org.briarproject.BriarTestCase;
+import org.briarproject.briar.test.BriarTestCase;
 import org.junit.Test;
 
 import static org.junit.Assert.fail;
diff --git a/briar-tests/src/org/briarproject/briar/messaging/PrivateMessageValidatorTest.java b/briar-core/src/test/java/org/briarproject/briar/messaging/PrivateMessageValidatorTest.java
similarity index 96%
rename from briar-tests/src/org/briarproject/briar/messaging/PrivateMessageValidatorTest.java
rename to briar-core/src/test/java/org/briarproject/briar/messaging/PrivateMessageValidatorTest.java
index 88b9fcf201a93766d1c5f08ed2b73f3f094e3886..ef776d726e16cc8a53f5c1abfd08e49b049932a8 100644
--- a/briar-tests/src/org/briarproject/briar/messaging/PrivateMessageValidatorTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/messaging/PrivateMessageValidatorTest.java
@@ -1,11 +1,11 @@
 package org.briarproject.briar.messaging;
 
-import org.briarproject.TestUtils;
-import org.briarproject.ValidatorTestCase;
 import org.briarproject.bramble.api.FormatException;
 import org.briarproject.bramble.api.client.BdfMessageContext;
 import org.briarproject.bramble.api.data.BdfDictionary;
 import org.briarproject.bramble.api.data.BdfList;
+import org.briarproject.bramble.test.TestUtils;
+import org.briarproject.bramble.test.ValidatorTestCase;
 import org.junit.Test;
 
 import static org.briarproject.briar.api.messaging.MessagingConstants.MAX_PRIVATE_MESSAGE_BODY_LENGTH;
diff --git a/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTest.java
index 098fdb11b70f7e5d479587caee33e28d09705ffa..b12b951cf25ca8db5ac18fba5540870b31f07326 100644
--- a/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTest.java
@@ -1,8 +1,5 @@
 package org.briarproject.briar.messaging;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestDatabaseModule;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.contact.ContactManager;
 import org.briarproject.bramble.api.crypto.SecretKey;
@@ -23,9 +20,12 @@ import org.briarproject.bramble.api.transport.StreamContext;
 import org.briarproject.bramble.api.transport.StreamReaderFactory;
 import org.briarproject.bramble.api.transport.StreamWriterFactory;
 import org.briarproject.bramble.system.SystemModule;
+import org.briarproject.bramble.test.TestDatabaseModule;
+import org.briarproject.bramble.test.TestUtils;
 import org.briarproject.briar.api.messaging.MessagingManager;
 import org.briarproject.briar.api.messaging.PrivateMessage;
 import org.briarproject.briar.api.messaging.PrivateMessageFactory;
+import org.briarproject.briar.test.BriarTestCase;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.Test;
@@ -36,10 +36,10 @@ import java.io.File;
 import java.io.InputStream;
 import java.io.OutputStream;
 
-import static org.briarproject.TestPluginConfigModule.MAX_LATENCY;
-import static org.briarproject.TestPluginConfigModule.TRANSPORT_ID;
 import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_PUBLIC_KEY_LENGTH;
 import static org.briarproject.bramble.api.transport.TransportConstants.TAG_LENGTH;
+import static org.briarproject.bramble.test.TestPluginConfigModule.MAX_LATENCY;
+import static org.briarproject.bramble.test.TestPluginConfigModule.TRANSPORT_ID;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertNotNull;
diff --git a/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTestComponent.java b/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTestComponent.java
index 566c9783060e0221aa5262eff11b9aae98c23763..085d28ae1ceff45921da742e71bfc856d1295e5e 100644
--- a/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTestComponent.java
+++ b/briar-core/src/test/java/org/briarproject/briar/messaging/SimplexMessagingIntegrationTestComponent.java
@@ -1,8 +1,5 @@
 package org.briarproject.briar.messaging;
 
-import org.briarproject.TestDatabaseModule;
-import org.briarproject.TestPluginConfigModule;
-import org.briarproject.TestSeedProviderModule;
 import org.briarproject.bramble.api.contact.ContactManager;
 import org.briarproject.bramble.api.event.EventBus;
 import org.briarproject.bramble.api.identity.IdentityManager;
@@ -21,6 +18,9 @@ import org.briarproject.bramble.identity.IdentityModule;
 import org.briarproject.bramble.lifecycle.LifecycleModule;
 import org.briarproject.bramble.sync.SyncModule;
 import org.briarproject.bramble.system.SystemModule;
+import org.briarproject.bramble.test.TestDatabaseModule;
+import org.briarproject.bramble.test.TestPluginConfigModule;
+import org.briarproject.bramble.test.TestSeedProviderModule;
 import org.briarproject.bramble.transport.TransportModule;
 import org.briarproject.briar.api.messaging.MessagingManager;
 import org.briarproject.briar.api.messaging.PrivateMessageFactory;
diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/GroupInvitationIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/GroupInvitationIntegrationTest.java
index 249d46fad6b6cc6b62d0f1ba9e9555aff925e433..83eb59003fca5f49a6030a33b90981c29cbcaac5 100644
--- a/briar-core/src/test/java/org/briarproject/briar/privategroup/GroupInvitationIntegrationTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/GroupInvitationIntegrationTest.java
@@ -1,11 +1,8 @@
 package org.briarproject.briar.privategroup;
 
-import org.briarproject.TestDatabaseModule;
 import org.briarproject.bramble.api.db.DbException;
 import org.briarproject.bramble.api.sync.Group;
-import org.briarproject.briar.BriarIntegrationTest;
-import org.briarproject.briar.BriarIntegrationTestComponent;
-import org.briarproject.briar.DaggerBriarIntegrationTestComponent;
+import org.briarproject.bramble.test.TestDatabaseModule;
 import org.briarproject.briar.api.client.ProtocolStateException;
 import org.briarproject.briar.api.privategroup.GroupMessage;
 import org.briarproject.briar.api.privategroup.PrivateGroup;
@@ -15,6 +12,9 @@ import org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager
 import org.briarproject.briar.api.privategroup.invitation.GroupInvitationRequest;
 import org.briarproject.briar.api.privategroup.invitation.GroupInvitationResponse;
 import org.briarproject.briar.api.sharing.InvitationMessage;
+import org.briarproject.briar.test.BriarIntegrationTest;
+import org.briarproject.briar.test.BriarIntegrationTestComponent;
+import org.briarproject.briar.test.DaggerBriarIntegrationTestComponent;
 import org.junit.Before;
 import org.junit.Test;
 
@@ -22,7 +22,7 @@ import java.util.Collection;
 
 import javax.annotation.Nullable;
 
-import static org.briarproject.TestUtils.assertGroupCount;
+import static org.briarproject.briar.test.BriarTestUtils.assertGroupCount;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
diff --git a/briar-tests/src/org/briarproject/briar/privategroup/GroupMessageValidatorTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/GroupMessageValidatorTest.java
similarity index 98%
rename from briar-tests/src/org/briarproject/briar/privategroup/GroupMessageValidatorTest.java
rename to briar-core/src/test/java/org/briarproject/briar/privategroup/GroupMessageValidatorTest.java
index 88650c06f2a3668fb32665f0c9dd8077db1ab4cc..a4cf4603b852dd4b700fae5223485ea694c6eea4 100644
--- a/briar-tests/src/org/briarproject/briar/privategroup/GroupMessageValidatorTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/GroupMessageValidatorTest.java
@@ -1,6 +1,5 @@
 package org.briarproject.briar.privategroup;
 
-import org.briarproject.ValidatorTestCase;
 import org.briarproject.bramble.api.FormatException;
 import org.briarproject.bramble.api.client.BdfMessageContext;
 import org.briarproject.bramble.api.data.BdfDictionary;
@@ -9,6 +8,7 @@ import org.briarproject.bramble.api.identity.Author;
 import org.briarproject.bramble.api.identity.AuthorId;
 import org.briarproject.bramble.api.sync.InvalidMessageException;
 import org.briarproject.bramble.api.sync.MessageId;
+import org.briarproject.bramble.test.ValidatorTestCase;
 import org.briarproject.briar.api.privategroup.MessageType;
 import org.briarproject.briar.api.privategroup.PrivateGroup;
 import org.briarproject.briar.api.privategroup.PrivateGroupFactory;
@@ -21,12 +21,12 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 
-import static org.briarproject.TestUtils.getRandomBytes;
-import static org.briarproject.TestUtils.getRandomId;
-import static org.briarproject.TestUtils.getRandomString;
 import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_AUTHOR_NAME_LENGTH;
 import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_PUBLIC_KEY_LENGTH;
 import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_SIGNATURE_LENGTH;
+import static org.briarproject.bramble.test.TestUtils.getRandomBytes;
+import static org.briarproject.bramble.test.TestUtils.getRandomId;
+import static org.briarproject.bramble.test.TestUtils.getRandomString;
 import static org.briarproject.briar.api.privategroup.GroupMessageFactory.SIGNING_LABEL_JOIN;
 import static org.briarproject.briar.api.privategroup.GroupMessageFactory.SIGNING_LABEL_POST;
 import static org.briarproject.briar.api.privategroup.MessageType.JOIN;
diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/PrivateGroupIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/PrivateGroupIntegrationTest.java
index 19fb33f6137022d6a08780a2be6953aeff6cdd29..2d384dac7e053f51ae7d92074d63b25ee7874bfd 100644
--- a/briar-core/src/test/java/org/briarproject/briar/privategroup/PrivateGroupIntegrationTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/PrivateGroupIntegrationTest.java
@@ -1,15 +1,12 @@
 package org.briarproject.briar.privategroup;
 
-import org.briarproject.TestDatabaseModule;
 import org.briarproject.bramble.api.contact.Contact;
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.db.DbException;
 import org.briarproject.bramble.api.identity.AuthorId;
 import org.briarproject.bramble.api.sync.GroupId;
 import org.briarproject.bramble.api.sync.MessageId;
-import org.briarproject.briar.BriarIntegrationTest;
-import org.briarproject.briar.BriarIntegrationTestComponent;
-import org.briarproject.briar.DaggerBriarIntegrationTestComponent;
+import org.briarproject.bramble.test.TestDatabaseModule;
 import org.briarproject.briar.api.privategroup.GroupMember;
 import org.briarproject.briar.api.privategroup.GroupMessage;
 import org.briarproject.briar.api.privategroup.GroupMessageHeader;
@@ -17,6 +14,9 @@ import org.briarproject.briar.api.privategroup.JoinMessageHeader;
 import org.briarproject.briar.api.privategroup.PrivateGroup;
 import org.briarproject.briar.api.privategroup.PrivateGroupManager;
 import org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager;
+import org.briarproject.briar.test.BriarIntegrationTest;
+import org.briarproject.briar.test.BriarIntegrationTestComponent;
+import org.briarproject.briar.test.DaggerBriarIntegrationTestComponent;
 import org.junit.Before;
 import org.junit.Test;
 
diff --git a/briar-core/src/test/java/org/briarproject/briar/privategroup/PrivateGroupManagerIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/PrivateGroupManagerIntegrationTest.java
index 0d680b8b2c7dc5a3bef2255a1e19fb6bda42fadb..943c4dabe513b0d3d1f7d11c7d1d4ce39113ab41 100644
--- a/briar-core/src/test/java/org/briarproject/briar/privategroup/PrivateGroupManagerIntegrationTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/PrivateGroupManagerIntegrationTest.java
@@ -1,14 +1,11 @@
 package org.briarproject.briar.privategroup;
 
-import org.briarproject.TestDatabaseModule;
 import org.briarproject.bramble.api.contact.Contact;
 import org.briarproject.bramble.api.data.BdfList;
 import org.briarproject.bramble.api.db.Transaction;
 import org.briarproject.bramble.api.sync.GroupId;
 import org.briarproject.bramble.api.sync.MessageId;
-import org.briarproject.briar.BriarIntegrationTest;
-import org.briarproject.briar.BriarIntegrationTestComponent;
-import org.briarproject.briar.DaggerBriarIntegrationTestComponent;
+import org.briarproject.bramble.test.TestDatabaseModule;
 import org.briarproject.briar.api.client.MessageTracker.GroupCount;
 import org.briarproject.briar.api.privategroup.GroupMember;
 import org.briarproject.briar.api.privategroup.GroupMessage;
@@ -16,15 +13,18 @@ import org.briarproject.briar.api.privategroup.GroupMessageHeader;
 import org.briarproject.briar.api.privategroup.JoinMessageHeader;
 import org.briarproject.briar.api.privategroup.PrivateGroup;
 import org.briarproject.briar.api.privategroup.PrivateGroupManager;
+import org.briarproject.briar.test.BriarIntegrationTest;
+import org.briarproject.briar.test.BriarIntegrationTestComponent;
+import org.briarproject.briar.test.DaggerBriarIntegrationTestComponent;
 import org.junit.Before;
 import org.junit.Test;
 
 import java.util.Collection;
 
-import static org.briarproject.TestUtils.getRandomBytes;
-import static org.briarproject.TestUtils.getRandomId;
 import static org.briarproject.bramble.api.identity.Author.Status.VERIFIED;
 import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED;
+import static org.briarproject.bramble.test.TestUtils.getRandomBytes;
+import static org.briarproject.bramble.test.TestUtils.getRandomId;
 import static org.briarproject.briar.api.privategroup.Visibility.INVISIBLE;
 import static org.briarproject.briar.api.privategroup.Visibility.REVEALED_BY_CONTACT;
 import static org.briarproject.briar.api.privategroup.Visibility.REVEALED_BY_US;
@@ -42,6 +42,7 @@ public class PrivateGroupManagerIntegrationTest
 	private PrivateGroupManager groupManager0, groupManager1, groupManager2;
 
 	@Before
+	@Override
 	public void setUp() throws Exception {
 		super.setUp();
 
diff --git a/briar-tests/src/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java
similarity index 96%
rename from briar-tests/src/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java
rename to briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java
index f3bbccb495e609f8822f8abf758ca4e49d694ae0..9ce107eee18c71b1660a108f0b9ab3bd0020cc1d 100644
--- a/briar-tests/src/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/AbstractProtocolEngineTest.java
@@ -1,6 +1,5 @@
 package org.briarproject.briar.privategroup.invitation;
 
-import org.briarproject.BriarMockTestCase;
 import org.briarproject.bramble.api.client.ClientHelper;
 import org.briarproject.bramble.api.contact.Contact;
 import org.briarproject.bramble.api.contact.ContactId;
@@ -16,6 +15,7 @@ import org.briarproject.bramble.api.sync.GroupId;
 import org.briarproject.bramble.api.sync.Message;
 import org.briarproject.bramble.api.sync.MessageId;
 import org.briarproject.bramble.api.system.Clock;
+import org.briarproject.bramble.test.BrambleMockTestCase;
 import org.briarproject.briar.api.client.MessageTracker;
 import org.briarproject.briar.api.privategroup.GroupMessageFactory;
 import org.briarproject.briar.api.privategroup.PrivateGroup;
@@ -23,9 +23,9 @@ import org.briarproject.briar.api.privategroup.PrivateGroupFactory;
 import org.briarproject.briar.api.privategroup.PrivateGroupManager;
 import org.jmock.Expectations;
 
-import static org.briarproject.TestUtils.getRandomBytes;
-import static org.briarproject.TestUtils.getRandomId;
-import static org.briarproject.briar.api.privategroup.PrivateGroupManager.*;
+import static org.briarproject.bramble.test.TestUtils.getRandomBytes;
+import static org.briarproject.bramble.test.TestUtils.getRandomId;
+import static org.briarproject.briar.api.privategroup.PrivateGroupManager.CLIENT_ID;
 import static org.briarproject.briar.privategroup.invitation.GroupInvitationConstants.GROUP_KEY_CONTACT_ID;
 import static org.briarproject.briar.privategroup.invitation.MessageType.ABORT;
 import static org.briarproject.briar.privategroup.invitation.MessageType.INVITE;
@@ -33,7 +33,7 @@ import static org.briarproject.briar.privategroup.invitation.MessageType.JOIN;
 import static org.briarproject.briar.privategroup.invitation.MessageType.LEAVE;
 import static org.junit.Assert.assertEquals;
 
-public abstract class AbstractProtocolEngineTest extends BriarMockTestCase {
+public abstract class AbstractProtocolEngineTest extends BrambleMockTestCase {
 
 	protected final DatabaseComponent db =
 			context.mock(DatabaseComponent.class);
diff --git a/briar-tests/src/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngineTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngineTest.java
similarity index 99%
rename from briar-tests/src/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngineTest.java
rename to briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngineTest.java
index 48989510048d14c28e3b309fe486ee37c7b7dc43..d116e018d05572872bb2bc82af768728f585144f 100644
--- a/briar-tests/src/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngineTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/CreatorProtocolEngineTest.java
@@ -5,9 +5,9 @@ import org.briarproject.briar.api.client.ProtocolStateException;
 import org.jmock.Expectations;
 import org.junit.Test;
 
-import static org.briarproject.TestUtils.getRandomId;
 import static org.briarproject.bramble.api.sync.Group.Visibility.INVISIBLE;
 import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED;
+import static org.briarproject.bramble.test.TestUtils.getRandomId;
 import static org.briarproject.briar.privategroup.invitation.CreatorState.DISSOLVED;
 import static org.briarproject.briar.privategroup.invitation.CreatorState.ERROR;
 import static org.briarproject.briar.privategroup.invitation.CreatorState.INVITED;
diff --git a/briar-tests/src/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java
similarity index 98%
rename from briar-tests/src/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java
rename to briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java
index c1557b9404714a4d66eb8ba1e7a17aa7ad43ef14..aa1f95ae614b9248f9296d7739e36f29ff6ce56b 100644
--- a/briar-tests/src/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImplTest.java
@@ -1,7 +1,5 @@
 package org.briarproject.briar.privategroup.invitation;
 
-import org.briarproject.BriarMockTestCase;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.FormatException;
 import org.briarproject.bramble.api.client.ClientHelper;
 import org.briarproject.bramble.api.client.ContactGroupFactory;
@@ -21,6 +19,8 @@ import org.briarproject.bramble.api.sync.Group;
 import org.briarproject.bramble.api.sync.GroupId;
 import org.briarproject.bramble.api.sync.Message;
 import org.briarproject.bramble.api.sync.MessageId;
+import org.briarproject.bramble.test.BrambleMockTestCase;
+import org.briarproject.bramble.test.TestUtils;
 import org.briarproject.briar.api.client.MessageTracker;
 import org.briarproject.briar.api.client.SessionId;
 import org.briarproject.briar.api.privategroup.PrivateGroup;
@@ -44,11 +44,11 @@ import java.util.Map;
 import javax.annotation.Nullable;
 
 import static junit.framework.TestCase.fail;
-import static org.briarproject.TestUtils.getRandomBytes;
-import static org.briarproject.TestUtils.getRandomId;
-import static org.briarproject.TestUtils.getRandomString;
 import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED;
 import static org.briarproject.bramble.api.sync.SyncConstants.MESSAGE_HEADER_LENGTH;
+import static org.briarproject.bramble.test.TestUtils.getRandomBytes;
+import static org.briarproject.bramble.test.TestUtils.getRandomId;
+import static org.briarproject.bramble.test.TestUtils.getRandomString;
 import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.GROUP_SALT_LENGTH;
 import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.MAX_GROUP_NAME_LENGTH;
 import static org.briarproject.briar.api.privategroup.invitation.GroupInvitationManager.CLIENT_ID;
@@ -61,7 +61,7 @@ import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
 
-public class GroupInvitationManagerImplTest extends BriarMockTestCase {
+public class GroupInvitationManagerImplTest extends BrambleMockTestCase {
 
 	private final DatabaseComponent db = context.mock(DatabaseComponent.class);
 	private final ClientHelper clientHelper = context.mock(ClientHelper.class);
@@ -636,7 +636,8 @@ public class GroupInvitationManagerImplTest extends BriarMockTestCase {
 		final BdfDictionary query = BdfDictionary.of(new BdfEntry("q", "u"));
 		final MessageId messageId2 = new MessageId(TestUtils.getRandomId());
 		final BdfDictionary meta2 = BdfDictionary.of(new BdfEntry("m2", "e"));
-		final Map<MessageId, BdfDictionary> results = new HashMap<>();
+		final Map<MessageId, BdfDictionary> results =
+				new HashMap<MessageId, BdfDictionary>();
 		results.put(message.getId(), meta);
 		results.put(messageId2, meta2);
 		long time1 = 1L, time2 = 2L;
@@ -700,7 +701,8 @@ public class GroupInvitationManagerImplTest extends BriarMockTestCase {
 		final BdfDictionary query = BdfDictionary.of(new BdfEntry("q", "u"));
 		final MessageId messageId2 = new MessageId(TestUtils.getRandomId());
 		final BdfDictionary meta2 = BdfDictionary.of(new BdfEntry("m2", "e"));
-		final Map<MessageId, BdfDictionary> results = new HashMap<>();
+		final Map<MessageId, BdfDictionary> results =
+				new HashMap<MessageId, BdfDictionary>();
 		results.put(message.getId(), meta);
 		results.put(messageId2, meta2);
 		final Message message2 = new Message(messageId2, contactGroup.getId(),
diff --git a/briar-tests/src/org/briarproject/briar/privategroup/invitation/GroupInvitationValidatorTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationValidatorTest.java
similarity index 98%
rename from briar-tests/src/org/briarproject/briar/privategroup/invitation/GroupInvitationValidatorTest.java
rename to briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationValidatorTest.java
index b230be881f424809c0dba72d9bc6d620e529f51e..fe79b36784dbb412633e331e15442e551a786f4c 100644
--- a/briar-tests/src/org/briarproject/briar/privategroup/invitation/GroupInvitationValidatorTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/GroupInvitationValidatorTest.java
@@ -1,6 +1,5 @@
 package org.briarproject.briar.privategroup.invitation;
 
-import org.briarproject.ValidatorTestCase;
 import org.briarproject.bramble.api.FormatException;
 import org.briarproject.bramble.api.UniqueId;
 import org.briarproject.bramble.api.client.BdfMessageContext;
@@ -11,6 +10,7 @@ import org.briarproject.bramble.api.identity.Author;
 import org.briarproject.bramble.api.identity.AuthorId;
 import org.briarproject.bramble.api.sync.GroupId;
 import org.briarproject.bramble.api.sync.MessageId;
+import org.briarproject.bramble.test.ValidatorTestCase;
 import org.briarproject.briar.api.privategroup.PrivateGroup;
 import org.briarproject.briar.api.privategroup.PrivateGroupFactory;
 import org.jmock.Expectations;
@@ -18,12 +18,12 @@ import org.junit.Test;
 
 import java.security.GeneralSecurityException;
 
-import static org.briarproject.TestUtils.getRandomBytes;
-import static org.briarproject.TestUtils.getRandomId;
-import static org.briarproject.TestUtils.getRandomString;
 import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_AUTHOR_NAME_LENGTH;
 import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_PUBLIC_KEY_LENGTH;
 import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_SIGNATURE_LENGTH;
+import static org.briarproject.bramble.test.TestUtils.getRandomBytes;
+import static org.briarproject.bramble.test.TestUtils.getRandomId;
+import static org.briarproject.bramble.test.TestUtils.getRandomString;
 import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.GROUP_SALT_LENGTH;
 import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.MAX_GROUP_INVITATION_MSG_LENGTH;
 import static org.briarproject.briar.api.privategroup.PrivateGroupConstants.MAX_GROUP_NAME_LENGTH;
diff --git a/briar-tests/src/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngineTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngineTest.java
similarity index 99%
rename from briar-tests/src/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngineTest.java
rename to briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngineTest.java
index 1b7f763a05058cb7a3444dd79c5338ffeea14c2f..bc83f9053fb1c3a989186e78efa85762b7023dde 100644
--- a/briar-tests/src/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngineTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/InviteeProtocolEngineTest.java
@@ -17,11 +17,11 @@ import org.junit.Test;
 import java.util.Collections;
 import java.util.Map;
 
-import static org.briarproject.TestUtils.getRandomBytes;
-import static org.briarproject.TestUtils.getRandomId;
 import static org.briarproject.bramble.api.sync.Group.Visibility.INVISIBLE;
 import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED;
 import static org.briarproject.bramble.api.sync.Group.Visibility.VISIBLE;
+import static org.briarproject.bramble.test.TestUtils.getRandomBytes;
+import static org.briarproject.bramble.test.TestUtils.getRandomId;
 import static org.briarproject.briar.privategroup.invitation.InviteeState.ACCEPTED;
 import static org.briarproject.briar.privategroup.invitation.InviteeState.DISSOLVED;
 import static org.briarproject.briar.privategroup.invitation.InviteeState.ERROR;
diff --git a/briar-tests/src/org/briarproject/briar/privategroup/invitation/PeerProtocolEngineTest.java b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngineTest.java
similarity index 99%
rename from briar-tests/src/org/briarproject/briar/privategroup/invitation/PeerProtocolEngineTest.java
rename to briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngineTest.java
index 0f88bbc964413085ca2263a3ce4e315112feb9d1..fb3ebb49a71e89b40eb126a51ebe83bb20190f5c 100644
--- a/briar-tests/src/org/briarproject/briar/privategroup/invitation/PeerProtocolEngineTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/privategroup/invitation/PeerProtocolEngineTest.java
@@ -5,10 +5,10 @@ import org.briarproject.briar.api.client.ProtocolStateException;
 import org.jmock.Expectations;
 import org.junit.Test;
 
-import static org.briarproject.TestUtils.getRandomId;
 import static org.briarproject.bramble.api.sync.Group.Visibility.INVISIBLE;
 import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED;
 import static org.briarproject.bramble.api.sync.Group.Visibility.VISIBLE;
+import static org.briarproject.bramble.test.TestUtils.getRandomId;
 import static org.briarproject.briar.privategroup.invitation.PeerState.AWAIT_MEMBER;
 import static org.briarproject.briar.privategroup.invitation.PeerState.BOTH_JOINED;
 import static org.briarproject.briar.privategroup.invitation.PeerState.ERROR;
diff --git a/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingIntegrationTest.java
index 40a225142c28cc2136a398a1c1ab1c081f112726..e5e65f94f9256cc30cf72e86b1bdf548235b1638 100644
--- a/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingIntegrationTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/sharing/BlogSharingIntegrationTest.java
@@ -2,7 +2,6 @@ package org.briarproject.briar.sharing;
 
 import net.jodah.concurrentunit.Waiter;
 
-import org.briarproject.TestDatabaseModule;
 import org.briarproject.bramble.api.contact.Contact;
 import org.briarproject.bramble.api.db.DbException;
 import org.briarproject.bramble.api.db.NoSuchGroupException;
@@ -10,9 +9,7 @@ import org.briarproject.bramble.api.event.Event;
 import org.briarproject.bramble.api.event.EventListener;
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
 import org.briarproject.bramble.api.sync.GroupId;
-import org.briarproject.briar.BriarIntegrationTest;
-import org.briarproject.briar.BriarIntegrationTestComponent;
-import org.briarproject.briar.DaggerBriarIntegrationTestComponent;
+import org.briarproject.bramble.test.TestDatabaseModule;
 import org.briarproject.briar.api.blog.Blog;
 import org.briarproject.briar.api.blog.BlogInvitationRequest;
 import org.briarproject.briar.api.blog.BlogInvitationResponse;
@@ -21,6 +18,9 @@ import org.briarproject.briar.api.blog.BlogSharingManager;
 import org.briarproject.briar.api.blog.event.BlogInvitationRequestReceivedEvent;
 import org.briarproject.briar.api.blog.event.BlogInvitationResponseReceivedEvent;
 import org.briarproject.briar.api.sharing.InvitationMessage;
+import org.briarproject.briar.test.BriarIntegrationTest;
+import org.briarproject.briar.test.BriarIntegrationTestComponent;
+import org.briarproject.briar.test.DaggerBriarIntegrationTestComponent;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -30,8 +30,8 @@ import java.util.ArrayList;
 import java.util.Collection;
 import java.util.List;
 
-import static org.briarproject.TestUtils.assertGroupCount;
 import static org.briarproject.briar.api.blog.BlogSharingManager.CLIENT_ID;
+import static org.briarproject.briar.test.BriarTestUtils.assertGroupCount;
 import static org.junit.Assert.assertEquals;
 import static org.junit.Assert.assertFalse;
 import static org.junit.Assert.assertTrue;
diff --git a/briar-core/src/test/java/org/briarproject/briar/sharing/ForumSharingIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/sharing/ForumSharingIntegrationTest.java
index e5845d7cce84263a0960ba3a36a4d4ee902e7b8b..72c0156b20f614d8ef8960743fe01840436a5641 100644
--- a/briar-core/src/test/java/org/briarproject/briar/sharing/ForumSharingIntegrationTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/sharing/ForumSharingIntegrationTest.java
@@ -2,7 +2,6 @@ package org.briarproject.briar.sharing;
 
 import net.jodah.concurrentunit.Waiter;
 
-import org.briarproject.TestDatabaseModule;
 import org.briarproject.bramble.api.Bytes;
 import org.briarproject.bramble.api.contact.Contact;
 import org.briarproject.bramble.api.data.BdfList;
@@ -13,9 +12,7 @@ import org.briarproject.bramble.api.event.Event;
 import org.briarproject.bramble.api.event.EventListener;
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
 import org.briarproject.bramble.api.sync.Group;
-import org.briarproject.briar.BriarIntegrationTest;
-import org.briarproject.briar.BriarIntegrationTestComponent;
-import org.briarproject.briar.DaggerBriarIntegrationTestComponent;
+import org.briarproject.bramble.test.TestDatabaseModule;
 import org.briarproject.briar.api.client.MessageQueueManager;
 import org.briarproject.briar.api.client.SessionId;
 import org.briarproject.briar.api.forum.Forum;
@@ -29,6 +26,9 @@ import org.briarproject.briar.api.forum.event.ForumInvitationRequestReceivedEven
 import org.briarproject.briar.api.forum.event.ForumInvitationResponseReceivedEvent;
 import org.briarproject.briar.api.sharing.InvitationMessage;
 import org.briarproject.briar.api.sharing.SharingInvitationItem;
+import org.briarproject.briar.test.BriarIntegrationTest;
+import org.briarproject.briar.test.BriarIntegrationTestComponent;
+import org.briarproject.briar.test.DaggerBriarIntegrationTestComponent;
 import org.junit.Before;
 import org.junit.Rule;
 import org.junit.Test;
@@ -39,8 +39,8 @@ import java.util.Collection;
 import java.util.List;
 
 import static junit.framework.Assert.assertNotNull;
-import static org.briarproject.TestUtils.getRandomBytes;
-import static org.briarproject.TestUtils.getRandomString;
+import static org.briarproject.bramble.test.TestUtils.getRandomBytes;
+import static org.briarproject.bramble.test.TestUtils.getRandomString;
 import static org.briarproject.briar.api.forum.ForumConstants.FORUM_SALT_LENGTH;
 import static org.briarproject.briar.api.forum.ForumSharingManager.CLIENT_ID;
 import static org.briarproject.briar.api.sharing.SharingConstants.SHARE_MSG_TYPE_INVITATION;
diff --git a/briar-tests/src/org/briarproject/briar/sharing/ForumSharingValidatorTest.java b/briar-core/src/test/java/org/briarproject/briar/sharing/ForumSharingValidatorTest.java
similarity index 99%
rename from briar-tests/src/org/briarproject/briar/sharing/ForumSharingValidatorTest.java
rename to briar-core/src/test/java/org/briarproject/briar/sharing/ForumSharingValidatorTest.java
index 7c8423e2adda0e7da0083eef24424d3d7cf086c4..52887134cf3c0945aac3d2ef02a4d5bc1bdfb7b2 100644
--- a/briar-tests/src/org/briarproject/briar/sharing/ForumSharingValidatorTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/sharing/ForumSharingValidatorTest.java
@@ -1,12 +1,12 @@
 package org.briarproject.briar.sharing;
 
-import org.briarproject.TestUtils;
-import org.briarproject.ValidatorTestCase;
 import org.briarproject.bramble.api.FormatException;
 import org.briarproject.bramble.api.UniqueId;
 import org.briarproject.bramble.api.client.BdfMessageContext;
 import org.briarproject.bramble.api.data.BdfDictionary;
 import org.briarproject.bramble.api.data.BdfList;
+import org.briarproject.bramble.test.TestUtils;
+import org.briarproject.bramble.test.ValidatorTestCase;
 import org.briarproject.briar.api.client.SessionId;
 import org.junit.Test;
 
diff --git a/briar-tests/src/org/briarproject/briar/sharing/SharingManagerImplTest.java b/briar-core/src/test/java/org/briarproject/briar/sharing/SharingManagerImplTest.java
similarity index 82%
rename from briar-tests/src/org/briarproject/briar/sharing/SharingManagerImplTest.java
rename to briar-core/src/test/java/org/briarproject/briar/sharing/SharingManagerImplTest.java
index 10306c4f522901e95b56a3b317c829e267012619..e38df1992996f21a252022c2e274a2a668dc4a38 100644
--- a/briar-tests/src/org/briarproject/briar/sharing/SharingManagerImplTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/sharing/SharingManagerImplTest.java
@@ -1,6 +1,6 @@
 package org.briarproject.briar.sharing;
 
-import org.briarproject.BriarTestCase;
+import org.briarproject.briar.test.BriarTestCase;
 import org.junit.Test;
 
 import static org.junit.Assert.fail;
diff --git a/briar-core/src/test/java/org/briarproject/briar/BriarIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java
similarity index 97%
rename from briar-core/src/test/java/org/briarproject/briar/BriarIntegrationTest.java
rename to briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java
index a03603046af7bec2235af592f0afcdf61a0e2edd..7d216adca00b13d03793f98d37623b8453417b54 100644
--- a/briar-core/src/test/java/org/briarproject/briar/BriarIntegrationTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java
@@ -1,9 +1,7 @@
-package org.briarproject.briar;
+package org.briarproject.briar.test;
 
 import net.jodah.concurrentunit.Waiter;
 
-import org.briarproject.BriarTestCase;
-import org.briarproject.TestUtils;
 import org.briarproject.bramble.api.client.ClientHelper;
 import org.briarproject.bramble.api.client.ContactGroupFactory;
 import org.briarproject.bramble.api.contact.Contact;
@@ -31,6 +29,8 @@ import org.briarproject.bramble.lifecycle.LifecycleModule;
 import org.briarproject.bramble.properties.PropertiesModule;
 import org.briarproject.bramble.sync.SyncModule;
 import org.briarproject.bramble.system.SystemModule;
+import org.briarproject.bramble.test.TestPluginConfigModule;
+import org.briarproject.bramble.test.TestUtils;
 import org.briarproject.bramble.transport.TransportModule;
 import org.briarproject.briar.api.blog.BlogFactory;
 import org.briarproject.briar.api.blog.BlogPostFactory;
@@ -60,11 +60,10 @@ import javax.annotation.Nullable;
 import javax.inject.Inject;
 
 import static junit.framework.Assert.assertNotNull;
-import static org.briarproject.TestPluginConfigModule.MAX_LATENCY;
-import static org.briarproject.TestUtils.getSecretKey;
 import static org.briarproject.bramble.api.sync.ValidationManager.State.DELIVERED;
 import static org.briarproject.bramble.api.sync.ValidationManager.State.INVALID;
 import static org.briarproject.bramble.api.sync.ValidationManager.State.PENDING;
+import static org.briarproject.bramble.test.TestUtils.getSecretKey;
 import static org.junit.Assert.assertTrue;
 
 @MethodsNotNullByDefault
@@ -326,7 +325,7 @@ public abstract class BriarIntegrationTest<C extends BriarIntegrationTestCompone
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
 		// Create an outgoing sync session
 		SyncSession sessionFrom =
-				fromSync.createSimplexOutgoingSession(toId, MAX_LATENCY, out);
+				fromSync.createSimplexOutgoingSession(toId, TestPluginConfigModule.MAX_LATENCY, out);
 		// Write whatever needs to be written
 		sessionFrom.run();
 		out.close();
diff --git a/briar-core/src/test/java/org/briarproject/briar/BriarIntegrationTestComponent.java b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTestComponent.java
similarity index 95%
rename from briar-core/src/test/java/org/briarproject/briar/BriarIntegrationTestComponent.java
rename to briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTestComponent.java
index dc76b464261ff1484121d869e8ac8cf7e8223456..5f036e6ee5603b23992a751235c13d124cab6e72 100644
--- a/briar-core/src/test/java/org/briarproject/briar/BriarIntegrationTestComponent.java
+++ b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTestComponent.java
@@ -1,8 +1,5 @@
-package org.briarproject.briar;
+package org.briarproject.briar.test;
 
-import org.briarproject.TestDatabaseModule;
-import org.briarproject.TestPluginConfigModule;
-import org.briarproject.TestSeedProviderModule;
 import org.briarproject.bramble.api.client.ClientHelper;
 import org.briarproject.bramble.api.contact.ContactManager;
 import org.briarproject.bramble.api.db.DatabaseComponent;
@@ -22,6 +19,9 @@ import org.briarproject.bramble.lifecycle.LifecycleModule;
 import org.briarproject.bramble.properties.PropertiesModule;
 import org.briarproject.bramble.sync.SyncModule;
 import org.briarproject.bramble.system.SystemModule;
+import org.briarproject.bramble.test.TestDatabaseModule;
+import org.briarproject.bramble.test.TestPluginConfigModule;
+import org.briarproject.bramble.test.TestSeedProviderModule;
 import org.briarproject.bramble.transport.TransportModule;
 import org.briarproject.briar.api.blog.BlogManager;
 import org.briarproject.briar.api.blog.BlogSharingManager;
diff --git a/briar-core/src/test/java/org/briarproject/briar/test/BriarTestCase.java b/briar-core/src/test/java/org/briarproject/briar/test/BriarTestCase.java
new file mode 100644
index 0000000000000000000000000000000000000000..afd5d4be3bebf9dbc44f245a013df172ab8432a5
--- /dev/null
+++ b/briar-core/src/test/java/org/briarproject/briar/test/BriarTestCase.java
@@ -0,0 +1,11 @@
+package org.briarproject.briar.test;
+
+import org.briarproject.bramble.test.BrambleTestCase;
+
+public abstract class BriarTestCase extends BrambleTestCase {
+
+	public BriarTestCase() {
+		super();
+	}
+
+}
diff --git a/briar-core/src/test/java/org/briarproject/briar/test/BriarTestUtils.java b/briar-core/src/test/java/org/briarproject/briar/test/BriarTestUtils.java
new file mode 100644
index 0000000000000000000000000000000000000000..d29fc0b54167dba4eb80b43c77575fd994925114
--- /dev/null
+++ b/briar-core/src/test/java/org/briarproject/briar/test/BriarTestUtils.java
@@ -0,0 +1,28 @@
+package org.briarproject.briar.test;
+
+import org.briarproject.bramble.api.db.DbException;
+import org.briarproject.bramble.api.sync.GroupId;
+import org.briarproject.briar.api.client.MessageTracker;
+import org.briarproject.briar.api.client.MessageTracker.GroupCount;
+
+import static org.junit.Assert.assertEquals;
+
+public class BriarTestUtils {
+
+	public static void assertGroupCount(MessageTracker tracker, GroupId g,
+			long msgCount, long unreadCount, long latestMsgTime)
+			throws DbException {
+		GroupCount groupCount = tracker.getGroupCount(g);
+		assertEquals(msgCount, groupCount.getMsgCount());
+		assertEquals(unreadCount, groupCount.getUnreadCount());
+		assertEquals(latestMsgTime, groupCount.getLatestMsgTime());
+	}
+
+	public static void assertGroupCount(MessageTracker tracker, GroupId g,
+			long msgCount, long unreadCount) throws	DbException {
+		GroupCount c1 = tracker.getGroupCount(g);
+		assertEquals(msgCount, c1.getMsgCount());
+		assertEquals(unreadCount, c1.getUnreadCount());
+	}
+
+}
diff --git a/briar-tests/.gitignore b/briar-tests/.gitignore
deleted file mode 100644
index eeb02632a0a71dc53ad5bbb4f04aff39855b50e6..0000000000000000000000000000000000000000
--- a/briar-tests/.gitignore
+++ /dev/null
@@ -1,3 +0,0 @@
-bin
-build
-.settings
diff --git a/briar-tests/build.gradle b/briar-tests/build.gradle
deleted file mode 100644
index 31009696687ed30f5e8e69fdb81a5537b2bd7241..0000000000000000000000000000000000000000
--- a/briar-tests/build.gradle
+++ /dev/null
@@ -1,43 +0,0 @@
-apply plugin: 'java'
-sourceCompatibility = 1.7
-targetCompatibility = 1.7
-
-apply plugin: 'witness'
-
-dependencies {
-	compile project(':briar-core')
-	compile project(':bramble-j2se')
-	compile "junit:junit:4.12"
-	compile "org.jmock:jmock:2.8.1"
-	compile "org.jmock:jmock-junit4:2.8.1"
-	compile "org.jmock:jmock-legacy:2.8.1"
-	compile "org.hamcrest:hamcrest-library:1.3"
-	compile "org.hamcrest:hamcrest-core:1.3"
-}
-
-dependencyVerification {
-	verify = [
-			'junit:junit:59721f0805e223d84b90677887d9ff567dc534d7c502ca903c0c2b17f05c116a',
-			'org.jmock:jmock:75d4bdaf636879f0215830c5e6ab99407069a625eaffde5d57b32d887b75dc14',
-			'org.jmock:jmock-junit4:81e3fff46ed56738a6f3f5147525d1d85cda591ce5df007cc193e735cee31113',
-			'org.jmock:jmock-legacy:19c76059eb254775ba884fc8039bc5c7d1700dc68cc55ad3be5b405a2a8a1819',
-			'org.jmock:jmock-testjar:c3642147a5980771dde19d5f1d782d4790a7f9b1521bf9c8cd2b4c23f6384730',
-			'org.hamcrest:hamcrest-library:711d64522f9ec410983bd310934296da134be4254a125080a0416ec178dfad1c',
-			'org.hamcrest:hamcrest-core:66fdef91e9739348df7a096aa384a5685f4e875584cce89386a7a47251c4d8e9',
-			'cglib:cglib-nodep:3a9ab1f5de15b49dedc7e96d35363c4c43a2b2cd42275f5d4731846042f3fcf2',
-			'org.ow2.asm:asm:71c4f78e437b8fdcd9cc0dfd2abea8c089eb677005a6a5cff320206cc52b46cc',
-			'org.beanshell:bsh:9b04edc75d19db54f1b4e8b5355e9364384c6cf71eb0a1b9724c159d779879f8',
-			'org.objenesis:objenesis:c74330cc6b806c804fd37e74487b4fe5d7c2750c5e15fbc6efa13bdee1bdef80',
-	]
-}
-
-sourceSets {
-	main.java.srcDirs = ['src']
-	main.resources.srcDirs = ['src']
-	test.java.srcDirs = ['src']
-	test.resources.srcDirs = ['src']
-}
-
-tasks.withType(Test) {
-	systemProperty 'java.library.path', '../bramble-j2se/libs'
-}
diff --git a/briar-tests/src/.gitignore b/briar-tests/src/.gitignore
deleted file mode 100644
index 94260a35069411445665db3f9b9b41ee347f32af..0000000000000000000000000000000000000000
--- a/briar-tests/src/.gitignore
+++ /dev/null
@@ -1,2 +0,0 @@
-build
-test.tmp
diff --git a/settings.gradle b/settings.gradle
index d66211a06fe585a28589807c1caf676356d570b9..de661574c253874536c6bd89b1366fc568f62bd0 100644
--- a/settings.gradle
+++ b/settings.gradle
@@ -3,5 +3,4 @@ include ':bramble-core'
 include ':bramble-j2se'
 include ':briar-api'
 include ':briar-core'
-include ':briar-tests'
 include ':briar-android'