diff --git a/api/net/sf/briar/clock/Clock.java b/api/net/sf/briar/api/clock/Clock.java
similarity index 87%
rename from api/net/sf/briar/clock/Clock.java
rename to api/net/sf/briar/api/clock/Clock.java
index 701d11412bd330151f4d930adf61f4c0a262fe08..c2258c0647aee99b1b4ca0e7340e04a0dbbae01d 100644
--- a/api/net/sf/briar/clock/Clock.java
+++ b/api/net/sf/briar/api/clock/Clock.java
@@ -1,4 +1,4 @@
-package net.sf.briar.clock;
+package net.sf.briar.api.clock;
 
 /**
  * An interface for time-related system functions that allows them to be
diff --git a/api/net/sf/briar/clock/SystemClock.java b/api/net/sf/briar/api/clock/SystemClock.java
similarity index 83%
rename from api/net/sf/briar/clock/SystemClock.java
rename to api/net/sf/briar/api/clock/SystemClock.java
index 460b147e892febd68452ffa39cafd60862d79619..a0610355f63b172615ccb7b5b68aad600d838689 100644
--- a/api/net/sf/briar/clock/SystemClock.java
+++ b/api/net/sf/briar/api/clock/SystemClock.java
@@ -1,4 +1,4 @@
-package net.sf.briar.clock;
+package net.sf.briar.api.clock;
 
 /** Default clock implementation. */
 public class SystemClock implements Clock {
diff --git a/components/net/sf/briar/clock/ClockModule.java b/components/net/sf/briar/clock/ClockModule.java
index 42ad9217f919073ed2fade1c081d35717ddf1d39..f394211cc3dc9877d4233741baa0e8f0b8396fe5 100644
--- a/components/net/sf/briar/clock/ClockModule.java
+++ b/components/net/sf/briar/clock/ClockModule.java
@@ -1,5 +1,8 @@
 package net.sf.briar.clock;
 
+import net.sf.briar.api.clock.Clock;
+import net.sf.briar.api.clock.SystemClock;
+
 import com.google.inject.AbstractModule;
 
 public class ClockModule extends AbstractModule {
diff --git a/components/net/sf/briar/db/DatabaseComponentImpl.java b/components/net/sf/briar/db/DatabaseComponentImpl.java
index ad21a135f02f503f41ca9e74625b1e662032bf68..408d415095733180af9fd969556a564cae429e8e 100644
--- a/components/net/sf/briar/db/DatabaseComponentImpl.java
+++ b/components/net/sf/briar/db/DatabaseComponentImpl.java
@@ -25,6 +25,7 @@ import net.sf.briar.api.ContactId;
 import net.sf.briar.api.Rating;
 import net.sf.briar.api.TransportConfig;
 import net.sf.briar.api.TransportProperties;
+import net.sf.briar.api.clock.Clock;
 import net.sf.briar.api.db.DatabaseComponent;
 import net.sf.briar.api.db.DbException;
 import net.sf.briar.api.db.MessageHeader;
@@ -61,7 +62,6 @@ import net.sf.briar.api.protocol.TransportIndex;
 import net.sf.briar.api.protocol.TransportUpdate;
 import net.sf.briar.api.transport.ConnectionContext;
 import net.sf.briar.api.transport.ConnectionWindow;
-import net.sf.briar.clock.Clock;
 import net.sf.briar.util.ByteUtils;
 
 import com.google.inject.Inject;
diff --git a/components/net/sf/briar/db/DatabaseModule.java b/components/net/sf/briar/db/DatabaseModule.java
index 9c2b4b0210cccd5e6a79961db52b35b9b85914d3..bb51aa89c0c34495084be456c6519c409a91a9a8 100644
--- a/components/net/sf/briar/db/DatabaseModule.java
+++ b/components/net/sf/briar/db/DatabaseModule.java
@@ -4,6 +4,7 @@ import java.io.File;
 import java.sql.Connection;
 import java.util.concurrent.Executor;
 
+import net.sf.briar.api.clock.Clock;
 import net.sf.briar.api.crypto.Password;
 import net.sf.briar.api.db.DatabaseComponent;
 import net.sf.briar.api.db.DatabaseDirectory;
@@ -15,7 +16,6 @@ import net.sf.briar.api.protocol.GroupFactory;
 import net.sf.briar.api.protocol.PacketFactory;
 import net.sf.briar.api.transport.ConnectionContextFactory;
 import net.sf.briar.api.transport.ConnectionWindowFactory;
-import net.sf.briar.clock.Clock;
 import net.sf.briar.util.BoundedExecutor;
 
 import com.google.inject.AbstractModule;
diff --git a/components/net/sf/briar/db/H2Database.java b/components/net/sf/briar/db/H2Database.java
index 42bc5622d0fe8bd73c2439e644f300502c6e35a5..ed1dd1d47e27fd6cba951f61e62206d8e90a468d 100644
--- a/components/net/sf/briar/db/H2Database.java
+++ b/components/net/sf/briar/db/H2Database.java
@@ -8,6 +8,7 @@ import java.sql.SQLException;
 import java.util.Arrays;
 import java.util.Properties;
 
+import net.sf.briar.api.clock.Clock;
 import net.sf.briar.api.crypto.Password;
 import net.sf.briar.api.db.DatabaseDirectory;
 import net.sf.briar.api.db.DatabaseMaxSize;
@@ -16,7 +17,6 @@ import net.sf.briar.api.db.DbException;
 import net.sf.briar.api.protocol.GroupFactory;
 import net.sf.briar.api.transport.ConnectionContextFactory;
 import net.sf.briar.api.transport.ConnectionWindowFactory;
-import net.sf.briar.clock.Clock;
 
 import org.apache.commons.io.FileSystemUtils;
 
diff --git a/components/net/sf/briar/db/JdbcDatabase.java b/components/net/sf/briar/db/JdbcDatabase.java
index 8d5d87eaebcebd244e9d855311282073433d99d0..b3a42ac5e5b3dc78b541e94b95b1139b9df3af31 100644
--- a/components/net/sf/briar/db/JdbcDatabase.java
+++ b/components/net/sf/briar/db/JdbcDatabase.java
@@ -24,6 +24,7 @@ import net.sf.briar.api.ContactId;
 import net.sf.briar.api.Rating;
 import net.sf.briar.api.TransportConfig;
 import net.sf.briar.api.TransportProperties;
+import net.sf.briar.api.clock.Clock;
 import net.sf.briar.api.db.DbException;
 import net.sf.briar.api.db.MessageHeader;
 import net.sf.briar.api.db.Status;
@@ -42,7 +43,6 @@ import net.sf.briar.api.transport.ConnectionContext;
 import net.sf.briar.api.transport.ConnectionContextFactory;
 import net.sf.briar.api.transport.ConnectionWindow;
 import net.sf.briar.api.transport.ConnectionWindowFactory;
-import net.sf.briar.clock.Clock;
 import net.sf.briar.util.FileUtils;
 
 /**
diff --git a/components/net/sf/briar/plugins/bluetooth/BluetoothPlugin.java b/components/net/sf/briar/plugins/bluetooth/BluetoothPlugin.java
index 2d295bc939b3fb09e81023214cddf2d45d43b6f1..10f7057ca2dd182c497495113094f6d168a7f025 100644
--- a/components/net/sf/briar/plugins/bluetooth/BluetoothPlugin.java
+++ b/components/net/sf/briar/plugins/bluetooth/BluetoothPlugin.java
@@ -26,13 +26,13 @@ import javax.microedition.io.StreamConnectionNotifier;
 
 import net.sf.briar.api.ContactId;
 import net.sf.briar.api.TransportProperties;
+import net.sf.briar.api.clock.Clock;
 import net.sf.briar.api.crypto.PseudoRandom;
 import net.sf.briar.api.plugins.PluginExecutor;
 import net.sf.briar.api.plugins.duplex.DuplexPlugin;
 import net.sf.briar.api.plugins.duplex.DuplexPluginCallback;
 import net.sf.briar.api.plugins.duplex.DuplexTransportConnection;
 import net.sf.briar.api.protocol.TransportId;
-import net.sf.briar.clock.Clock;
 import net.sf.briar.util.OsUtils;
 import net.sf.briar.util.StringUtils;
 
diff --git a/components/net/sf/briar/plugins/bluetooth/BluetoothPluginFactory.java b/components/net/sf/briar/plugins/bluetooth/BluetoothPluginFactory.java
index c1b49e2431b8114a4940172b9b222d14da532d28..e5c165209f22d3e79f92acb620aa6ea80d06f2bd 100644
--- a/components/net/sf/briar/plugins/bluetooth/BluetoothPluginFactory.java
+++ b/components/net/sf/briar/plugins/bluetooth/BluetoothPluginFactory.java
@@ -2,11 +2,11 @@ package net.sf.briar.plugins.bluetooth;
 
 import java.util.concurrent.Executor;
 
+import net.sf.briar.api.clock.SystemClock;
 import net.sf.briar.api.plugins.PluginExecutor;
 import net.sf.briar.api.plugins.duplex.DuplexPlugin;
 import net.sf.briar.api.plugins.duplex.DuplexPluginCallback;
 import net.sf.briar.api.plugins.duplex.DuplexPluginFactory;
-import net.sf.briar.clock.SystemClock;
 
 public class BluetoothPluginFactory implements DuplexPluginFactory {
 
diff --git a/test/net/sf/briar/db/DatabaseComponentImplTest.java b/test/net/sf/briar/db/DatabaseComponentImplTest.java
index 474be1e37a2b8e3102c0b293756233f546089079..389bb46a6314464aae821f5d7a8a32bad54c6fd0 100644
--- a/test/net/sf/briar/db/DatabaseComponentImplTest.java
+++ b/test/net/sf/briar/db/DatabaseComponentImplTest.java
@@ -5,11 +5,11 @@ import static net.sf.briar.db.DatabaseConstants.MIN_FREE_SPACE;
 
 import java.util.Collections;
 
+import net.sf.briar.api.clock.SystemClock;
 import net.sf.briar.api.db.DatabaseComponent;
 import net.sf.briar.api.db.DbException;
 import net.sf.briar.api.lifecycle.ShutdownManager;
 import net.sf.briar.api.protocol.PacketFactory;
-import net.sf.briar.clock.SystemClock;
 import net.sf.briar.db.DatabaseCleaner.Callback;
 
 import org.jmock.Expectations;
diff --git a/test/net/sf/briar/db/H2DatabaseTest.java b/test/net/sf/briar/db/H2DatabaseTest.java
index 2c743f7b722633b08da7cc615d2c2bb3cfec211e..0451fe9f5b688ac0046e4f964632e73160f1a7df 100644
--- a/test/net/sf/briar/db/H2DatabaseTest.java
+++ b/test/net/sf/briar/db/H2DatabaseTest.java
@@ -24,6 +24,7 @@ import net.sf.briar.api.ContactId;
 import net.sf.briar.api.Rating;
 import net.sf.briar.api.TransportConfig;
 import net.sf.briar.api.TransportProperties;
+import net.sf.briar.api.clock.SystemClock;
 import net.sf.briar.api.crypto.Password;
 import net.sf.briar.api.db.DbException;
 import net.sf.briar.api.db.MessageHeader;
@@ -42,7 +43,7 @@ import net.sf.briar.api.transport.ConnectionContextFactory;
 import net.sf.briar.api.transport.ConnectionWindow;
 import net.sf.briar.api.transport.ConnectionWindowFactory;
 import net.sf.briar.api.transport.TransportConstants;
-import net.sf.briar.clock.SystemClock;
+import net.sf.briar.clock.ClockModule;
 import net.sf.briar.crypto.CryptoModule;
 import net.sf.briar.lifecycle.LifecycleModule;
 import net.sf.briar.protocol.ProtocolModule;
@@ -94,7 +95,8 @@ public class H2DatabaseTest extends BriarTestCase {
 
 	public H2DatabaseTest() throws Exception {
 		super();
-		Injector i = Guice.createInjector(new CryptoModule(),
+		// FIXME: Use mocks for the factories rather than building the whole app
+		Injector i = Guice.createInjector(new ClockModule(), new CryptoModule(),
 				new DatabaseModule(), new LifecycleModule(),
 				new ProtocolModule(), new SerialModule(),
 				new SimplexProtocolModule(), new TransportModule(),
diff --git a/test/net/sf/briar/plugins/bluetooth/BluetoothClientTest.java b/test/net/sf/briar/plugins/bluetooth/BluetoothClientTest.java
index 39c9d4331d4abaf7222ca0ac2ff495823c258d23..402b9509f1f98fc5a59283b3e1591ec0196406d0 100644
--- a/test/net/sf/briar/plugins/bluetooth/BluetoothClientTest.java
+++ b/test/net/sf/briar/plugins/bluetooth/BluetoothClientTest.java
@@ -9,7 +9,7 @@ import java.util.concurrent.Executors;
 import net.sf.briar.api.ContactId;
 import net.sf.briar.api.TransportConfig;
 import net.sf.briar.api.TransportProperties;
-import net.sf.briar.clock.SystemClock;
+import net.sf.briar.api.clock.SystemClock;
 import net.sf.briar.plugins.DuplexClientTest;
 
 // This is not a JUnit test - it has to be run manually while the server test
diff --git a/test/net/sf/briar/plugins/bluetooth/BluetoothServerTest.java b/test/net/sf/briar/plugins/bluetooth/BluetoothServerTest.java
index 8bd8eef571aa25c74295224f1694bb39f0ea9e6d..d59dda8f59af52b74d2a9d782bbb1b2c26926574 100644
--- a/test/net/sf/briar/plugins/bluetooth/BluetoothServerTest.java
+++ b/test/net/sf/briar/plugins/bluetooth/BluetoothServerTest.java
@@ -7,7 +7,7 @@ import java.util.concurrent.Executors;
 
 import net.sf.briar.api.TransportConfig;
 import net.sf.briar.api.TransportProperties;
-import net.sf.briar.clock.SystemClock;
+import net.sf.briar.api.clock.SystemClock;
 import net.sf.briar.plugins.DuplexServerTest;
 
 // This is not a JUnit test - it has to be run manually while the client test