diff --git a/briar-tests/src/net/sf/briar/db/H2DatabaseTest.java b/briar-tests/src/net/sf/briar/db/H2DatabaseTest.java
index 433215c78ad72edacc97d61cc1444933e5734cc5..4db3417016a5e3b06ef350ca4bc788e1156691b9 100644
--- a/briar-tests/src/net/sf/briar/db/H2DatabaseTest.java
+++ b/briar-tests/src/net/sf/briar/db/H2DatabaseTest.java
@@ -25,7 +25,6 @@ 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.db.DbException;
 import net.sf.briar.api.db.MessageHeader;
 import net.sf.briar.api.protocol.AuthorId;
@@ -33,7 +32,6 @@ import net.sf.briar.api.protocol.Group;
 import net.sf.briar.api.protocol.GroupId;
 import net.sf.briar.api.protocol.Message;
 import net.sf.briar.api.protocol.MessageId;
-import net.sf.briar.api.protocol.Transport;
 import net.sf.briar.api.protocol.TransportId;
 import net.sf.briar.api.transport.Endpoint;
 import net.sf.briar.api.transport.TemporarySecret;
@@ -298,7 +296,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		assertEquals(contactId, db.addContact(txn));
 		db.addSubscription(txn, group);
 		db.addVisibility(txn, contactId, groupId);
-		db.addSubscription(txn, contactId, group, 0L);
+		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1L);
 		db.addGroupMessage(txn, message);
 		db.setStatus(txn, contactId, messageId, Status.NEW);
 
@@ -336,7 +334,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		assertEquals(contactId, db.addContact(txn));
 		db.addSubscription(txn, group);
 		db.addVisibility(txn, contactId, groupId);
-		db.addSubscription(txn, contactId, group, 0L);
+		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1L);
 		db.addGroupMessage(txn, message);
 		db.setSendability(txn, messageId, 1);
 
@@ -389,7 +387,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		assertFalse(it.hasNext());
 
 		// The contact subscribing should make the message sendable
-		db.addSubscription(txn, contactId, group, 0L);
+		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1L);
 		assertTrue(db.hasSendableMessages(txn, contactId));
 		it = db.getSendableMessages(txn, contactId, ONE_MEGABYTE).iterator();
 		assertTrue(it.hasNext());
@@ -397,7 +395,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		assertFalse(it.hasNext());
 
 		// The contact unsubscribing should make the message unsendable
-		db.removeSubscriptions(txn, contactId, null, null);
+		db.setSubscriptions(txn, contactId, Collections.<Group>emptyList(), 2L);
 		assertFalse(db.hasSendableMessages(txn, contactId));
 		it = db.getSendableMessages(txn, contactId, ONE_MEGABYTE).iterator();
 		assertFalse(it.hasNext());
@@ -406,41 +404,6 @@ public class H2DatabaseTest extends BriarTestCase {
 		db.close();
 	}
 
-	@Test
-	public void testSendableGroupMessagesMustBeNewerThanSubscriptions()
-			throws Exception {
-		Database<Connection> db = open(false);
-		Connection txn = db.startTransaction();
-
-		// Add a contact, subscribe to a group and store a message
-		assertEquals(contactId, db.addContact(txn));
-		db.addSubscription(txn, group);
-		db.addVisibility(txn, contactId, groupId);
-		db.addGroupMessage(txn, message);
-		db.setSendability(txn, messageId, 1);
-		db.setStatus(txn, contactId, messageId, Status.NEW);
-
-		// The message is older than the contact's subscription, so it should
-		// not be sendable
-		db.addSubscription(txn, contactId, group, timestamp + 1);
-		assertFalse(db.hasSendableMessages(txn, contactId));
-		Iterator<MessageId> it =
-				db.getSendableMessages(txn, contactId, ONE_MEGABYTE).iterator();
-		assertFalse(it.hasNext());
-
-		// Changing the contact's subscription should make the message sendable
-		db.removeSubscriptions(txn, contactId, null, null);
-		db.addSubscription(txn, contactId, group, timestamp);
-		assertTrue(db.hasSendableMessages(txn, contactId));
-		it = db.getSendableMessages(txn, contactId, ONE_MEGABYTE).iterator();
-		assertTrue(it.hasNext());
-		assertEquals(messageId, it.next());
-		assertFalse(it.hasNext());
-
-		db.commitTransaction(txn);
-		db.close();
-	}
-
 	@Test
 	public void testSendableGroupMessagesMustFitCapacity() throws Exception {
 		Database<Connection> db = open(false);
@@ -450,7 +413,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		assertEquals(contactId, db.addContact(txn));
 		db.addSubscription(txn, group);
 		db.addVisibility(txn, contactId, groupId);
-		db.addSubscription(txn, contactId, group, 0L);
+		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1L);
 		db.addGroupMessage(txn, message);
 		db.setSendability(txn, messageId, 1);
 		db.setStatus(txn, contactId, messageId, Status.NEW);
@@ -480,7 +443,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		// Add a contact, subscribe to a group and store a message
 		assertEquals(contactId, db.addContact(txn));
 		db.addSubscription(txn, group);
-		db.addSubscription(txn, contactId, group, 0L);
+		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1L);
 		db.addGroupMessage(txn, message);
 		db.setSendability(txn, messageId, 1);
 		db.setStatus(txn, contactId, messageId, Status.NEW);
@@ -564,7 +527,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		assertEquals(contactId, db.addContact(txn));
 		db.addSubscription(txn, group);
 		db.addVisibility(txn, contactId, groupId);
-		db.addSubscription(txn, contactId, group, 0L);
+		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1L);
 		db.addGroupMessage(txn, message);
 		db.setSendability(txn, messageId, 1);
 		db.setStatus(txn, contactId, messageId, Status.NEW);
@@ -795,34 +758,28 @@ public class H2DatabaseTest extends BriarTestCase {
 	}
 
 	@Test
-	public void testUpdateTransportProperties() throws Exception {
+	public void testUpdateRemoteTransportProperties() throws Exception {
 		Database<Connection> db = open(false);
 		Connection txn = db.startTransaction();
 
 		// Add a contact with a transport
-		TransportProperties properties =
-				new TransportProperties(Collections.singletonMap("foo", "bar"));
-		Transport transport = new Transport(transportId, properties);
+		TransportProperties p = new TransportProperties(
+				Collections.singletonMap("foo", "bar"));
 		assertEquals(contactId, db.addContact(txn));
-		db.setTransports(txn, contactId,
-				Collections.singletonList(transport), 1);
-		assertEquals(Collections.singletonMap(contactId, properties),
+		db.setRemoteProperties(txn, contactId, transportId, p, 1L);
+		assertEquals(Collections.singletonMap(contactId, p),
 				db.getRemoteProperties(txn, transportId));
 
 		// Replace the transport properties
-		TransportProperties properties1 =
-				new TransportProperties(Collections.singletonMap("baz", "bam"));
-		Transport transport1 = new Transport(transportId, properties1);
-		db.setTransports(txn, contactId,
-				Collections.singletonList(transport1), 2);
-		assertEquals(Collections.singletonMap(contactId, properties1),
+		TransportProperties p1 = new TransportProperties(
+				Collections.singletonMap("baz", "bam"));
+		db.setRemoteProperties(txn, contactId, transportId, p1, 2L);
+		assertEquals(Collections.singletonMap(contactId, p1),
 				db.getRemoteProperties(txn, transportId));
 
 		// Remove the transport properties
-		TransportProperties properties2 = new TransportProperties();
-		Transport transport2 = new Transport(transportId, properties2);
-		db.setTransports(txn, contactId,
-				Collections.singletonList(transport2), 3);
+		TransportProperties p2 = new TransportProperties();
+		db.setRemoteProperties(txn, contactId, transportId, p2, 3L);
 		assertEquals(Collections.emptyMap(),
 				db.getRemoteProperties(txn, transportId));
 
@@ -831,31 +788,30 @@ public class H2DatabaseTest extends BriarTestCase {
 	}
 
 	@Test
-	public void testLocalTransports() throws Exception {
+	public void testUpdateLocalTransportProperties() throws Exception {
 		Database<Connection> db = open(false);
 		Connection txn = db.startTransaction();
 
+		// Add a transport to the database
+		db.addTransport(txn, transportId);
+
 		// Set the transport properties
-		TransportProperties properties = new TransportProperties();
-		properties.put("foo", "foo");
-		properties.put("bar", "bar");
-		db.mergeLocalProperties(txn, transportId, properties);
-		Transport transport = new Transport(transportId, properties);
-		assertEquals(Collections.singletonList(transport),
-				db.getLocalTransports(txn));
+		TransportProperties p = new TransportProperties();
+		p.put("foo", "foo");
+		p.put("bar", "bar");
+		db.mergeLocalProperties(txn, transportId, p);
+		assertEquals(p, db.getLocalProperties(txn, transportId));
 
 		// Update one of the properties and add another
-		TransportProperties properties1 = new TransportProperties();
-		properties1.put("bar", "baz");
-		properties1.put("bam", "bam");
-		db.mergeLocalProperties(txn, transportId, properties1);
+		TransportProperties p1 = new TransportProperties();
+		p1.put("bar", "baz");
+		p1.put("bam", "bam");
+		db.mergeLocalProperties(txn, transportId, p1);
 		TransportProperties merged = new TransportProperties();
 		merged.put("foo", "foo");
 		merged.put("bar", "baz");
 		merged.put("bam", "bam");
-		Transport transport1 = new Transport(transportId, merged);
-		assertEquals(Collections.singletonList(transport1),
-				db.getLocalTransports(txn));
+		assertEquals(merged, db.getLocalProperties(txn, transportId));
 
 		db.commitTransaction(txn);
 		db.close();
@@ -866,61 +822,58 @@ public class H2DatabaseTest extends BriarTestCase {
 		Database<Connection> db = open(false);
 		Connection txn = db.startTransaction();
 
+		// Add a transport to the database
+		db.addTransport(txn, transportId);
+
 		// Set the transport config
-		TransportConfig config = new TransportConfig();
-		config.put("foo", "foo");
-		config.put("bar", "bar");
-		db.mergeConfig(txn, transportId, config);
-		assertEquals(config, db.getConfig(txn, transportId));
+		TransportConfig c = new TransportConfig();
+		c.put("foo", "foo");
+		c.put("bar", "bar");
+		db.mergeConfig(txn, transportId, c);
+		assertEquals(c, db.getConfig(txn, transportId));
 
 		// Update one of the properties and add another
-		TransportConfig config1 = new TransportConfig();
-		config1.put("bar", "baz");
-		config1.put("bam", "bam");
-		db.mergeConfig(txn, transportId, config1);
-		TransportConfig expected = new TransportConfig();
-		expected.put("foo", "foo");
-		expected.put("bar", "baz");
-		expected.put("bam", "bam");
-		assertEquals(expected, db.getConfig(txn, transportId));
+		TransportConfig c1 = new TransportConfig();
+		c1.put("bar", "baz");
+		c1.put("bam", "bam");
+		db.mergeConfig(txn, transportId, c1);
+		TransportConfig merged = new TransportConfig();
+		merged.put("foo", "foo");
+		merged.put("bar", "baz");
+		merged.put("bam", "bam");
+		assertEquals(merged, db.getConfig(txn, transportId));
 
 		db.commitTransaction(txn);
 		db.close();
 	}
 
 	@Test
-	public void testTransportsNotUpdatedIfTimestampIsOld() throws Exception {
+	public void testTransportsNotUpdatedIfVersionIsOld() throws Exception {
 		Database<Connection> db = open(false);
 		Connection txn = db.startTransaction();
 
-		// Add a contact with a transport
-		TransportProperties properties =
-				new TransportProperties(Collections.singletonMap("foo", "bar"));
-		Transport transport = new Transport(transportId, properties);
+		// Initialise the transport properties with version 1
+		TransportProperties p = new TransportProperties(
+				Collections.singletonMap("foo", "bar"));
 		assertEquals(contactId, db.addContact(txn));
-		db.setTransports(txn, contactId,
-				Collections.singletonList(transport), 1);
-		assertEquals(Collections.singletonMap(contactId, properties),
+		db.setRemoteProperties(txn, contactId, transportId, p, 1L);
+		assertEquals(Collections.singletonMap(contactId, p),
 				db.getRemoteProperties(txn, transportId));
 
-		// Replace the transport properties using a timestamp of 2
-		TransportProperties properties1 =
-				new TransportProperties(Collections.singletonMap("baz", "bam"));
-		Transport transport1 = new Transport(transportId, properties1);
-		db.setTransports(txn, contactId,
-				Collections.singletonList(transport1), 2);
-		assertEquals(Collections.singletonMap(contactId, properties1),
+		// Replace the transport properties with version 2
+		TransportProperties p1 = new TransportProperties(
+				Collections.singletonMap("baz", "bam"));
+		db.setRemoteProperties(txn, contactId, transportId, p1, 2L);
+		assertEquals(Collections.singletonMap(contactId, p1),
 				db.getRemoteProperties(txn, transportId));
 
-		// Try to replace the transport properties using a timestamp of 1
-		TransportProperties properties2 =
-				new TransportProperties(Collections.singletonMap("quux", "etc"));
-		Transport transport2 = new Transport(transportId, properties2);
-		db.setTransports(txn, contactId,
-				Collections.singletonList(transport2), 1);
+		// Try to replace the transport properties with version 1
+		TransportProperties p2 = new TransportProperties(
+				Collections.singletonMap("quux", "etc"));
+		db.setRemoteProperties(txn, contactId, transportId, p2, 1L);
 
-		// The old properties should still be there
-		assertEquals(Collections.singletonMap(contactId, properties1),
+		// Version 2 of the properties should still be there
+		assertEquals(Collections.singletonMap(contactId, p1),
 				db.getRemoteProperties(txn, transportId));
 
 		db.commitTransaction(txn);
@@ -936,7 +889,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		// Add a contact and subscribe to a group
 		assertEquals(contactId, db.addContact(txn));
 		db.addSubscription(txn, group);
-		db.addSubscription(txn, contactId, group, 0L);
+		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1L);
 
 		// The message is not in the database
 		assertNull(db.getMessageIfSendable(txn, contactId, messageId));
@@ -953,7 +906,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		// Add a contact, subscribe to a group and store a message
 		assertEquals(contactId, db.addContact(txn));
 		db.addSubscription(txn, group);
-		db.addSubscription(txn, contactId, group, 0L);
+		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1L);
 		db.addGroupMessage(txn, message);
 
 		// Set the sendability to > 0 and the status to SEEN
@@ -976,7 +929,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		// Add a contact, subscribe to a group and store a message
 		assertEquals(contactId, db.addContact(txn));
 		db.addSubscription(txn, group);
-		db.addSubscription(txn, contactId, group, 0L);
+		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1L);
 		db.addGroupMessage(txn, message);
 
 		// Set the sendability to 0 and the status to NEW
@@ -996,11 +949,12 @@ public class H2DatabaseTest extends BriarTestCase {
 		Connection txn = db.startTransaction();
 
 		// Add a contact, subscribe to a group and store a message -
-		// the message is older than the contact's subscription
+		// the message is older than the contact's retention time
 		assertEquals(contactId, db.addContact(txn));
 		db.addSubscription(txn, group);
 		db.addVisibility(txn, contactId, groupId);
-		db.addSubscription(txn, contactId, group, timestamp + 1);
+		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1L);
+		db.setRetentionTime(txn, contactId, timestamp + 1, 1L);
 		db.addGroupMessage(txn, message);
 
 		// Set the sendability to > 0 and the status to NEW
@@ -1023,7 +977,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		assertEquals(contactId, db.addContact(txn));
 		db.addSubscription(txn, group);
 		db.addVisibility(txn, contactId, groupId);
-		db.addSubscription(txn, contactId, group, 0L);
+		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1L);
 		db.addGroupMessage(txn, message);
 
 		// Set the sendability to > 0 and the status to NEW
@@ -1048,7 +1002,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		assertEquals(contactId, db.addContact(txn));
 		db.addSubscription(txn, group);
 		db.addVisibility(txn, contactId, groupId);
-		db.addSubscription(txn, contactId, group, 0L);
+		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1L);
 
 		// The message is not in the database
 		assertFalse(db.setStatusSeenIfVisible(txn, contactId, messageId));
@@ -1065,7 +1019,7 @@ public class H2DatabaseTest extends BriarTestCase {
 
 		// Add a contact with a subscription
 		assertEquals(contactId, db.addContact(txn));
-		db.addSubscription(txn, contactId, group, 0L);
+		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1L);
 
 		// There's no local subscription for the group
 		assertFalse(db.setStatusSeenIfVisible(txn, contactId, messageId));
@@ -1103,7 +1057,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		assertEquals(contactId, db.addContact(txn));
 		db.addSubscription(txn, group);
 		db.addGroupMessage(txn, message);
-		db.addSubscription(txn, contactId, group, 0L);
+		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1L);
 		db.setStatus(txn, contactId, messageId, Status.NEW);
 
 		// The subscription is not visible
@@ -1123,7 +1077,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		assertEquals(contactId, db.addContact(txn));
 		db.addSubscription(txn, group);
 		db.addVisibility(txn, contactId, groupId);
-		db.addSubscription(txn, contactId, group, 0L);
+		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1L);
 		db.addGroupMessage(txn, message);
 
 		// The message has already been seen by the contact
@@ -1145,7 +1099,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		assertEquals(contactId, db.addContact(txn));
 		db.addSubscription(txn, group);
 		db.addVisibility(txn, contactId, groupId);
-		db.addSubscription(txn, contactId, group, 0L);
+		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1L);
 		db.addGroupMessage(txn, message);
 
 		// The message has not been seen by the contact
@@ -1556,14 +1510,14 @@ public class H2DatabaseTest extends BriarTestCase {
 
 	@Test
 	public void testTemporarySecrets() throws Exception {
-		// Create a contact transport and three consecutive temporary secrets
+		// Create an endpoint and three consecutive temporary secrets
 		long epoch = 123L, clockDiff = 234L, latency = 345L;
 		boolean alice = false;
 		long outgoing1 = 456L, centre1 = 567L;
 		long outgoing2 = 678L, centre2 = 789L;
 		long outgoing3 = 890L, centre3 = 901L;
-		Endpoint ct = new Endpoint(contactId, transportId,
-				epoch, clockDiff, latency, alice);
+		Endpoint ep = new Endpoint(contactId, transportId, epoch, clockDiff,
+				latency, alice);
 		Random random = new Random();
 		byte[] secret1 = new byte[32], bitmap1 = new byte[4];
 		random.nextBytes(secret1);
@@ -1590,9 +1544,11 @@ public class H2DatabaseTest extends BriarTestCase {
 		// Initially there should be no secrets in the database
 		assertEquals(Collections.emptyList(), db.getSecrets(txn));
 
-		// Add the contact transport and the first two secrets
+		// Add the contact, the transport, the endpoint and the first two
+		// secrets (periods 0 and 1)
 		assertEquals(contactId, db.addContact(txn));
-		db.addEndpoint(txn, ct);
+		db.addTransport(txn, transportId);
+		db.addEndpoint(txn, ep);
 		db.addSecrets(txn, Arrays.asList(s1, s2));
 
 		// Retrieve the first two secrets
@@ -1667,12 +1623,12 @@ public class H2DatabaseTest extends BriarTestCase {
 
 	@Test
 	public void testIncrementConnectionCounter() throws Exception {
-		// Create a contact transport and a temporary secret
+		// Create an endpoint and a temporary secret
 		long epoch = 123L, clockDiff = 234L, latency = 345L;
 		boolean alice = false;
 		long period = 456L, outgoing = 567L, centre = 678L;
-		Endpoint ct = new Endpoint(contactId, transportId,
-				epoch, clockDiff, latency, alice);
+		Endpoint ep = new Endpoint(contactId, transportId, epoch, clockDiff,
+				latency, alice);
 		Random random = new Random();
 		byte[] secret = new byte[32], bitmap = new byte[4];
 		random.nextBytes(secret);
@@ -1683,9 +1639,10 @@ public class H2DatabaseTest extends BriarTestCase {
 		Database<Connection> db = open(false);
 		Connection txn = db.startTransaction();
 
-		// Add the contact transport and the temporary secret
+		// Add the contact, the transport, the endpoint and the temporary secret
 		assertEquals(contactId, db.addContact(txn));
-		db.addEndpoint(txn, ct);
+		db.addTransport(txn, transportId);
+		db.addEndpoint(txn, ep);
 		db.addSecrets(txn, Arrays.asList(s));
 
 		// Retrieve the secret
@@ -1722,12 +1679,12 @@ public class H2DatabaseTest extends BriarTestCase {
 
 	@Test
 	public void testSetConnectionWindow() throws Exception {
-		// Create a contact transport and a temporary secret
+		// Create an endpoint and a temporary secret
 		long epoch = 123L, clockDiff = 234L, latency = 345L;
 		boolean alice = false;
 		long period = 456L, outgoing = 567L, centre = 678L;
-		Endpoint ct = new Endpoint(contactId, transportId,
-				epoch, clockDiff, latency, alice);
+		Endpoint ep = new Endpoint(contactId, transportId, epoch, clockDiff,
+				latency, alice);
 		Random random = new Random();
 		byte[] secret = new byte[32], bitmap = new byte[4];
 		random.nextBytes(secret);
@@ -1738,9 +1695,10 @@ public class H2DatabaseTest extends BriarTestCase {
 		Database<Connection> db = open(false);
 		Connection txn = db.startTransaction();
 
-		// Add the contact transport and the temporary secret
+		// Add the contact, the transport, the endpoint and the temporary secret
 		assertEquals(contactId, db.addContact(txn));
-		db.addEndpoint(txn, ct);
+		db.addTransport(txn, transportId);
+		db.addEndpoint(txn, ep);
 		db.addSecrets(txn, Arrays.asList(s));
 
 		// Retrieve the secret
@@ -1791,45 +1749,47 @@ public class H2DatabaseTest extends BriarTestCase {
 
 	@Test
 	public void testContactTransports() throws Exception {
-		// Create some contact transports
+		// Create some endpoints
 		long epoch1 = 123L, clockDiff1 = 234L, latency1 = 345L;
 		long epoch2 = 456L, clockDiff2 = 567L, latency2 = 678L;
 		boolean alice1 = true, alice2 = false;
 		TransportId transportId1 = new TransportId(TestUtils.getRandomId());
 		TransportId transportId2 = new TransportId(TestUtils.getRandomId());
-		Endpoint ct1 = new Endpoint(contactId, transportId1,
-				epoch1, clockDiff1, latency1, alice1);
-		Endpoint ct2 = new Endpoint(contactId, transportId2,
-				epoch2, clockDiff2, latency2, alice2);
+		Endpoint ep1 = new Endpoint(contactId, transportId1, epoch1, clockDiff1,
+				latency1, alice1);
+		Endpoint ep2 = new Endpoint(contactId, transportId2, epoch2, clockDiff2,
+				latency2, alice2);
 
 		Database<Connection> db = open(false);
 		Connection txn = db.startTransaction();
 
-		// Initially there should be no contact transports in the database
+		// Initially there should be no endpoints in the database
 		assertEquals(Collections.emptyList(), db.getEndpoints(txn));
 
-		// Add a contact and the contact transports
+		// Add the contact, the transports and the endpoints
 		assertEquals(contactId, db.addContact(txn));
-		db.addEndpoint(txn, ct1);
-		db.addEndpoint(txn, ct2);
+		db.addTransport(txn, transportId1);
+		db.addTransport(txn, transportId2);
+		db.addEndpoint(txn, ep1);
+		db.addEndpoint(txn, ep2);
 
 		// Retrieve the contact transports
-		Collection<Endpoint> cts = db.getEndpoints(txn);
-		assertEquals(2, cts.size());
+		Collection<Endpoint> endpoints = db.getEndpoints(txn);
+		assertEquals(2, endpoints.size());
 		boolean foundFirst = false, foundSecond = false;
-		for(Endpoint ct : cts) {
-			assertEquals(contactId, ct.getContactId());
-			if(ct.getTransportId().equals(transportId1)) {
-				assertEquals(epoch1, ct.getEpoch());
-				assertEquals(clockDiff1, ct.getClockDifference());
-				assertEquals(latency1, ct.getLatency());
-				assertEquals(alice1, ct.getAlice());
+		for(Endpoint ep : endpoints) {
+			assertEquals(contactId, ep.getContactId());
+			if(ep.getTransportId().equals(transportId1)) {
+				assertEquals(epoch1, ep.getEpoch());
+				assertEquals(clockDiff1, ep.getClockDifference());
+				assertEquals(latency1, ep.getLatency());
+				assertEquals(alice1, ep.getAlice());
 				foundFirst = true;
-			} else if(ct.getTransportId().equals(transportId2)) {
-				assertEquals(epoch2, ct.getEpoch());
-				assertEquals(clockDiff2, ct.getClockDifference());
-				assertEquals(latency2, ct.getLatency());
-				assertEquals(alice2, ct.getAlice());
+			} else if(ep.getTransportId().equals(transportId2)) {
+				assertEquals(epoch2, ep.getEpoch());
+				assertEquals(clockDiff2, ep.getClockDifference());
+				assertEquals(latency2, ep.getLatency());
+				assertEquals(alice2, ep.getAlice());
 				foundSecond = true;
 			} else {
 				fail();
@@ -1863,8 +1823,8 @@ public class H2DatabaseTest extends BriarTestCase {
 	}
 
 	private Database<Connection> open(boolean resume) throws Exception {
-		Database<Connection> db = new H2Database(new SystemClock(),
-				new TestDatabaseConfig(testDir, MAX_SIZE));
+		Database<Connection> db = new H2Database(new TestDatabaseConfig(testDir,
+				MAX_SIZE));
 		db.open(resume);
 		return db;
 	}