diff --git a/briar-api/src/net/sf/briar/api/Contact.java b/briar-api/src/net/sf/briar/api/Contact.java
new file mode 100644
index 0000000000000000000000000000000000000000..cfe5ddf14573063efabc91f4d913a6ce90a6fffc
--- /dev/null
+++ b/briar-api/src/net/sf/briar/api/Contact.java
@@ -0,0 +1,31 @@
+package net.sf.briar.api;
+
+public class Contact {
+
+	private final ContactId id;
+	private final String name;
+
+	public Contact(ContactId id, String name) {
+		this.id = id;
+		this.name = name;
+	}
+
+	public ContactId getId() {
+		return id;
+	}
+
+	public String getName() {
+		return name;
+	}
+
+	@Override
+	public int hashCode() {
+		return id.hashCode();
+	}
+
+	@Override
+	public boolean equals(Object o) {
+		if(o instanceof Contact) return id.equals(((Contact) o).id);
+		return false;
+	}
+}
diff --git a/briar-api/src/net/sf/briar/api/db/DatabaseComponent.java b/briar-api/src/net/sf/briar/api/db/DatabaseComponent.java
index 1ea9c17b575e08147e7de120c6190a5d5be9c50f..fbfba41c33f27a069565af1bc8b0a6643c3de4a3 100644
--- a/briar-api/src/net/sf/briar/api/db/DatabaseComponent.java
+++ b/briar-api/src/net/sf/briar/api/db/DatabaseComponent.java
@@ -4,6 +4,7 @@ import java.io.IOException;
 import java.util.Collection;
 import java.util.Map;
 
+import net.sf.briar.api.Contact;
 import net.sf.briar.api.ContactId;
 import net.sf.briar.api.Rating;
 import net.sf.briar.api.TransportConfig;
@@ -50,11 +51,12 @@ public interface DatabaseComponent {
 	void removeListener(DatabaseListener d);
 
 	/**
-	 * Adds a new contact to the database and returns an ID for the contact.
+	 * Adds a contact with the given name to the database and returns an ID for
+	 * the contact.
 	 */
-	ContactId addContact() throws DbException;
+	ContactId addContact(String name) throws DbException;
 
-	/** Adds an endpoitn to the database. */
+	/** Adds an endpoint to the database. */
 	void addEndpoint(Endpoint ep) throws DbException;
 
 	/** Adds a locally generated group message to the database. */
@@ -155,8 +157,8 @@ public interface DatabaseComponent {
 	/** Returns the configuration for the given transport. */
 	TransportConfig getConfig(TransportId t) throws DbException;
 
-	/** Returns the IDs of all contacts. */
-	Collection<ContactId> getContacts() throws DbException;
+	/** Returns all contacts. */
+	Collection<Contact> getContacts() throws DbException;
 
 	/** Returns the local transport properties for the given transport. */
 	TransportProperties getLocalProperties(TransportId t) throws DbException;
diff --git a/briar-core/src/net/sf/briar/db/Database.java b/briar-core/src/net/sf/briar/db/Database.java
index 209c40722df549242a0872766212f7d22b0db66d..34fe4ab8ccd3f57652d9ce549921fb733617787d 100644
--- a/briar-core/src/net/sf/briar/db/Database.java
+++ b/briar-core/src/net/sf/briar/db/Database.java
@@ -4,6 +4,7 @@ import java.io.IOException;
 import java.util.Collection;
 import java.util.Map;
 
+import net.sf.briar.api.Contact;
 import net.sf.briar.api.ContactId;
 import net.sf.briar.api.Rating;
 import net.sf.briar.api.TransportConfig;
@@ -77,11 +78,12 @@ interface Database<T> {
 	void commitTransaction(T txn) throws DbException;
 
 	/**
-	 * Adds a new contact to the database and returns an ID for the contact.
+	 * Adds a contact with the given name to the database and returns an ID for
+	 * the contact.
 	 * <p>
 	 * Locking: contact write, subscription write.
 	 */
-	ContactId addContact(T txn) throws DbException;
+	ContactId addContact(T txn, String name) throws DbException;
 
 	/**
 	 * Adds an endpoint to the database.
@@ -203,7 +205,14 @@ interface Database<T> {
 	 * <p>
 	 * Locking: contact read.
 	 */
-	Collection<ContactId> getContacts(T txn) throws DbException;
+	Collection<ContactId> getContactIds(T txn) throws DbException;
+
+	/**
+	 * Returns all contacts.
+	 * <p>
+	 * Locking: contact read.
+	 */
+	Collection<Contact> getContacts(T txn) throws DbException;
 
 	/**
 	 * Returns all endpoints.
diff --git a/briar-core/src/net/sf/briar/db/DatabaseComponentImpl.java b/briar-core/src/net/sf/briar/db/DatabaseComponentImpl.java
index b27f8acc754a3fe97cefa533992995c08af246f7..789b37bd563288dd61b4a723e901cea6075f1d5c 100644
--- a/briar-core/src/net/sf/briar/db/DatabaseComponentImpl.java
+++ b/briar-core/src/net/sf/briar/db/DatabaseComponentImpl.java
@@ -22,6 +22,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
 import java.util.concurrent.locks.ReentrantReadWriteLock;
 import java.util.logging.Logger;
 
+import net.sf.briar.api.Contact;
 import net.sf.briar.api.ContactId;
 import net.sf.briar.api.Rating;
 import net.sf.briar.api.TransportConfig;
@@ -171,7 +172,7 @@ DatabaseCleaner.Callback {
 		listeners.remove(d);
 	}
 
-	public ContactId addContact() throws DbException {
+	public ContactId addContact(String name) throws DbException {
 		ContactId c;
 		contactLock.writeLock().lock();
 		try {
@@ -179,7 +180,7 @@ DatabaseCleaner.Callback {
 			try {
 				T txn = db.startTransaction();
 				try {
-					c = db.addContact(txn);
+					c = db.addContact(txn, name);
 					db.commitTransaction(txn);
 				} catch(DbException e) {
 					db.abortTransaction(txn);
@@ -279,7 +280,7 @@ DatabaseCleaner.Callback {
 		if(sender != null) db.addStatus(txn, sender, id, true);
 		if(stored) {
 			// Mark the message as unseen by other contacts
-			for(ContactId c : db.getContacts(txn)) {
+			for(ContactId c : db.getContactIds(txn)) {
 				if(!c.equals(sender)) db.addStatus(txn, c, id, false);
 			}
 			// Calculate and store the message's sendability
@@ -801,12 +802,12 @@ DatabaseCleaner.Callback {
 		}
 	}
 
-	public Collection<ContactId> getContacts() throws DbException {
+	public Collection<Contact> getContacts() throws DbException {
 		contactLock.readLock().lock();
 		try {
 			T txn = db.startTransaction();
 			try {
-				Collection<ContactId> contacts = db.getContacts(txn);
+				Collection<Contact> contacts = db.getContacts(txn);
 				db.commitTransaction(txn);
 				return contacts;
 			} catch(DbException e) {
@@ -1691,7 +1692,7 @@ DatabaseCleaner.Callback {
 					HashSet<ContactId> oldVisible =
 							new HashSet<ContactId>(db.getVisibility(txn, g));
 					// Set the group's visibility for each current contact
-					for(ContactId c : db.getContacts(txn)) {
+					for(ContactId c : db.getContactIds(txn)) {
 						boolean then = oldVisible.contains(c);
 						boolean now = newVisible.contains(c);
 						if(!then && now) {
diff --git a/briar-core/src/net/sf/briar/db/JdbcDatabase.java b/briar-core/src/net/sf/briar/db/JdbcDatabase.java
index 550b20e4406d818a1ee45fc1b36706a7a9171c4c..28ddeb940124d966a78a9e437e0729da8a6a0d61 100644
--- a/briar-core/src/net/sf/briar/db/JdbcDatabase.java
+++ b/briar-core/src/net/sf/briar/db/JdbcDatabase.java
@@ -26,6 +26,7 @@ import java.util.Map;
 import java.util.Map.Entry;
 import java.util.logging.Logger;
 
+import net.sf.briar.api.Contact;
 import net.sf.briar.api.ContactId;
 import net.sf.briar.api.Rating;
 import net.sf.briar.api.TransportConfig;
@@ -58,7 +59,10 @@ abstract class JdbcDatabase implements Database<Connection> {
 
 	// Locking: contact
 	private static final String CREATE_CONTACTS =
-			"CREATE TABLE contacts (contactId COUNTER)";
+			"CREATE TABLE contacts "
+					+ " (contactId COUNTER,"
+					+ " name VARCHAR NOT NULL,"
+					+ " PRIMARY KEY (contactId))";
 
 	// Locking: subscription
 	private static final String CREATE_GROUPS =
@@ -492,13 +496,15 @@ abstract class JdbcDatabase implements Database<Connection> {
 		if(interrupted) Thread.currentThread().interrupt();
 	}
 
-	public ContactId addContact(Connection txn) throws DbException {
+	public ContactId addContact(Connection txn, String name)
+			throws DbException {
 		PreparedStatement ps = null;
 		ResultSet rs = null;
 		try {
 			// Create a contact row
-			String sql = "INSERT INTO contacts DEFAULT VALUES";
+			String sql = "INSERT INTO contacts (name) VALUES (?)";
 			ps = txn.prepareStatement(sql);
+			ps.setString(1, name);
 			int affected = ps.executeUpdate();
 			if(affected != 1) throw new DbStateException();
 			ps.close();
@@ -1001,7 +1007,7 @@ abstract class JdbcDatabase implements Database<Connection> {
 		}
 	}
 
-	public Collection<ContactId> getContacts(Connection txn)
+	public Collection<ContactId> getContactIds(Connection txn)
 			throws DbException {
 		PreparedStatement ps = null;
 		ResultSet rs = null;
@@ -1021,6 +1027,30 @@ abstract class JdbcDatabase implements Database<Connection> {
 		}
 	}
 
+	public Collection<Contact> getContacts(Connection txn)
+			throws DbException {
+		PreparedStatement ps = null;
+		ResultSet rs = null;
+		try {
+			String sql = "SELECT contactId, name FROM contacts";
+			ps = txn.prepareStatement(sql);
+			rs = ps.executeQuery();
+			List<Contact> contacts = new ArrayList<Contact>();
+			while(rs.next()) {
+				ContactId id = new ContactId(rs.getInt(1));
+				String name = rs.getString(2);
+				contacts.add(new Contact(id, name));
+			}
+			rs.close();
+			ps.close();
+			return Collections.unmodifiableList(contacts);
+		} catch(SQLException e) {
+			tryToClose(rs);
+			tryToClose(ps);
+			throw new DbException(e);
+		}
+	}
+
 	public Collection<Endpoint> getEndpoints(Connection txn)
 			throws DbException {
 		PreparedStatement ps = null;
diff --git a/briar-tests/src/net/sf/briar/db/DatabaseComponentTest.java b/briar-tests/src/net/sf/briar/db/DatabaseComponentTest.java
index 4d1cbb4b84ee89fb118b399e7cf1a0102ac24cd7..f035ed314ffa5faa85a79be7b1a6586c0ba28ea9 100644
--- a/briar-tests/src/net/sf/briar/db/DatabaseComponentTest.java
+++ b/briar-tests/src/net/sf/briar/db/DatabaseComponentTest.java
@@ -14,6 +14,7 @@ import java.util.Map;
 import net.sf.briar.BriarTestCase;
 import net.sf.briar.TestMessage;
 import net.sf.briar.TestUtils;
+import net.sf.briar.api.Contact;
 import net.sf.briar.api.ContactId;
 import net.sf.briar.api.TransportConfig;
 import net.sf.briar.api.TransportProperties;
@@ -56,10 +57,11 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
 	protected final ContactId contactId;
 	protected final GroupId groupId;
 	protected final MessageId messageId, messageId1;
-	private final String subject;
+	private final String contactName, subject;
 	private final long timestamp;
 	private final int size;
 	private final byte[] raw;
+	private final Contact contact;
 	private final Message message, privateMessage;
 	private final Group group;
 	private final TransportId transportId;
@@ -74,10 +76,12 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
 		groupId = new GroupId(TestUtils.getRandomId());
 		messageId = new MessageId(TestUtils.getRandomId());
 		messageId1 = new MessageId(TestUtils.getRandomId());
+		contactName = "Alice";
 		subject = "Foo";
 		timestamp = System.currentTimeMillis();
 		size = 1234;
 		raw = new byte[size];
+		contact = new Contact(contactId, contactName);
 		message = new TestMessage(messageId, null, groupId, authorId, subject,
 				timestamp, raw);
 		privateMessage = new TestMessage(messageId, null, null, null, subject,
@@ -127,13 +131,13 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
 			// setRating(authorId, GOOD) again
 			oneOf(database).setRating(txn, authorId, GOOD);
 			will(returnValue(GOOD));
-			// addContact()
-			oneOf(database).addContact(txn);
+			// addContact(contactName)
+			oneOf(database).addContact(txn, contactName);
 			will(returnValue(contactId));
 			oneOf(listener).eventOccurred(with(any(ContactAddedEvent.class)));
 			// getContacts()
 			oneOf(database).getContacts(txn);
-			will(returnValue(Arrays.asList(contactId)));
+			will(returnValue(Arrays.asList(contact)));
 			// getRemoteProperties(transportId)
 			oneOf(database).getRemoteProperties(txn, transportId);
 			will(returnValue(Collections.emptyMap()));
@@ -178,8 +182,8 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
 		assertEquals(UNRATED, db.getRating(authorId));
 		db.setRating(authorId, GOOD); // First time - listeners called
 		db.setRating(authorId, GOOD); // Second time - not called
-		assertEquals(contactId, db.addContact());
-		assertEquals(Arrays.asList(contactId), db.getContacts());
+		assertEquals(contactId, db.addContact(contactName));
+		assertEquals(Arrays.asList(contact), db.getContacts());
 		assertEquals(Collections.emptyMap(),
 				db.getRemoteProperties(transportId));
 		db.subscribe(group); // First time - listeners called
@@ -366,7 +370,7 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
 			will(returnValue(true));
 			oneOf(database).addGroupMessage(txn, message);
 			will(returnValue(true));
-			oneOf(database).getContacts(txn);
+			oneOf(database).getContactIds(txn);
 			will(returnValue(Arrays.asList(contactId)));
 			oneOf(database).addStatus(txn, contactId, messageId, false);
 			// The author is unrated and there are no sendable children
@@ -401,7 +405,7 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
 			will(returnValue(true));
 			oneOf(database).addGroupMessage(txn, message);
 			will(returnValue(true));
-			oneOf(database).getContacts(txn);
+			oneOf(database).getContactIds(txn);
 			will(returnValue(Arrays.asList(contactId)));
 			oneOf(database).addStatus(txn, contactId, messageId, false);
 			// The author is rated GOOD and there are two sendable children
@@ -653,7 +657,7 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
 			// addContact()
 			oneOf(database).startTransaction();
 			will(returnValue(txn));
-			oneOf(database).addContact(txn);
+			oneOf(database).addContact(txn, contactName);
 			will(returnValue(contactId));
 			oneOf(database).commitTransaction(txn);
 			// Check whether the transport is in the DB (which it's not)
@@ -667,7 +671,7 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
 		}});
 		DatabaseComponent db = createDatabaseComponent(database, cleaner,
 				shutdown);
-		assertEquals(contactId, db.addContact());
+		assertEquals(contactId, db.addContact(contactName));
 
 		try {
 			db.addEndpoint(endpoint);
@@ -1182,7 +1186,7 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
 			will(returnValue(true));
 			oneOf(database).addStatus(txn, contactId, messageId, true);
 			// Set the status to seen = true for all other contacts (none)
-			oneOf(database).getContacts(txn);
+			oneOf(database).getContactIds(txn);
 			will(returnValue(Arrays.asList(contactId)));
 			// Calculate the sendability - zero, so ancestors aren't updated
 			oneOf(database).getRating(txn, authorId);
@@ -1224,7 +1228,7 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
 			will(returnValue(true));
 			oneOf(database).addStatus(txn, contactId, messageId, true);
 			// Set the status to seen = true for all other contacts (none)
-			oneOf(database).getContacts(txn);
+			oneOf(database).getContactIds(txn);
 			will(returnValue(Arrays.asList(contactId)));
 			// Calculate the sendability - ancestors are updated
 			oneOf(database).getRating(txn, authorId);
@@ -1424,7 +1428,7 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
 			will(returnValue(true));
 			oneOf(database).addGroupMessage(txn, message);
 			will(returnValue(true));
-			oneOf(database).getContacts(txn);
+			oneOf(database).getContactIds(txn);
 			will(returnValue(Arrays.asList(contactId)));
 			oneOf(database).addStatus(txn, contactId, messageId, false);
 			oneOf(database).getRating(txn, authorId);
@@ -1631,7 +1635,7 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
 			will(returnValue(true));
 			oneOf(database).getVisibility(txn, groupId);
 			will(returnValue(both));
-			oneOf(database).getContacts(txn);
+			oneOf(database).getContactIds(txn);
 			will(returnValue(both));
 			oneOf(database).removeVisibility(txn, contactId1, groupId);
 			oneOf(database).commitTransaction(txn);
@@ -1665,7 +1669,7 @@ public abstract class DatabaseComponentTest extends BriarTestCase {
 			will(returnValue(true));
 			oneOf(database).getVisibility(txn, groupId);
 			will(returnValue(both));
-			oneOf(database).getContacts(txn);
+			oneOf(database).getContactIds(txn);
 			will(returnValue(both));
 			oneOf(database).commitTransaction(txn);
 		}});
diff --git a/briar-tests/src/net/sf/briar/db/H2DatabaseTest.java b/briar-tests/src/net/sf/briar/db/H2DatabaseTest.java
index 927871d755b462c2286d76280e21196119519a09..37cc20a629b2ad97235ebaa45c56575219ae5808 100644
--- a/briar-tests/src/net/sf/briar/db/H2DatabaseTest.java
+++ b/briar-tests/src/net/sf/briar/db/H2DatabaseTest.java
@@ -55,7 +55,7 @@ public class H2DatabaseTest extends BriarTestCase {
 	private final ContactId contactId;
 	private final GroupId groupId;
 	private final MessageId messageId, messageId1;
-	private final String subject;
+	private final String contactName, subject;
 	private final long timestamp;
 	private final int size;
 	private final byte[] raw;
@@ -70,6 +70,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		messageId = new MessageId(TestUtils.getRandomId());
 		messageId1 = new MessageId(TestUtils.getRandomId());
 		group = new Group(groupId, "Foo", null);
+		contactName = "Alice";
 		subject = "Foo";
 		timestamp = System.currentTimeMillis();
 		size = 1234;
@@ -93,7 +94,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		Database<Connection> db = open(false);
 		Connection txn = db.startTransaction();
 		assertFalse(db.containsContact(txn, contactId));
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		assertTrue(db.containsContact(txn, contactId));
 		assertFalse(db.containsSubscription(txn, groupId));
 		db.addSubscription(txn, group);
@@ -147,22 +148,22 @@ public class H2DatabaseTest extends BriarTestCase {
 		Database<Connection> db = open(false);
 		Connection txn = db.startTransaction();
 
-		// Create three contacts
+		// Create three contacts, all with the same name
 		assertFalse(db.containsContact(txn, contactId));
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		assertTrue(db.containsContact(txn, contactId));
 		assertFalse(db.containsContact(txn, contactId1));
-		assertEquals(contactId1, db.addContact(txn));
+		assertEquals(contactId1, db.addContact(txn, contactName));
 		assertTrue(db.containsContact(txn, contactId1));
 		assertFalse(db.containsContact(txn, contactId2));
-		assertEquals(contactId2, db.addContact(txn));
+		assertEquals(contactId2, db.addContact(txn, contactName));
 		assertTrue(db.containsContact(txn, contactId2));
 		// Delete the contact with the highest ID
 		db.removeContact(txn, contactId2);
 		assertFalse(db.containsContact(txn, contactId2));
-		// Add another contact - a new ID should be created
+		// Add another contact (same name again) - a new ID should be created
 		assertFalse(db.containsContact(txn, contactId3));
-		assertEquals(contactId3, db.addContact(txn));
+		assertEquals(contactId3, db.addContact(txn, contactName));
 		assertTrue(db.containsContact(txn, contactId3));
 
 		db.commitTransaction(txn);
@@ -209,7 +210,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		Connection txn = db.startTransaction();
 
 		// Add a contact and store a private message
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.addPrivateMessage(txn, privateMessage, contactId);
 
 		// Removing the contact should remove the message
@@ -228,7 +229,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		Connection txn = db.startTransaction();
 
 		// Add a contact and store a private message
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.addPrivateMessage(txn, privateMessage, contactId);
 
 		// The message has no status yet, so it should not be sendable
@@ -256,7 +257,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		Connection txn = db.startTransaction();
 
 		// Add a contact and store a private message
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.addPrivateMessage(txn, privateMessage, contactId);
 		db.addStatus(txn, contactId, messageId1, false);
 
@@ -284,7 +285,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		Connection txn = db.startTransaction();
 
 		// Add a contact, subscribe to a group and store a message
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.addSubscription(txn, group);
 		db.addVisibility(txn, contactId, groupId);
 		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1);
@@ -322,7 +323,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		Connection txn = db.startTransaction();
 
 		// Add a contact, subscribe to a group and store a message
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.addSubscription(txn, group);
 		db.addVisibility(txn, contactId, groupId);
 		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1);
@@ -359,7 +360,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		Connection txn = db.startTransaction();
 
 		// Add a contact, subscribe to a group and store a message
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.addSubscription(txn, group);
 		db.addVisibility(txn, contactId, groupId);
 		db.addGroupMessage(txn, message);
@@ -396,7 +397,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		Connection txn = db.startTransaction();
 
 		// Add a contact, subscribe to a group and store a message
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.addSubscription(txn, group);
 		db.addVisibility(txn, contactId, groupId);
 		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1);
@@ -427,7 +428,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		Connection txn = db.startTransaction();
 
 		// Add a contact, subscribe to a group and store a message
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.addSubscription(txn, group);
 		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1);
 		db.addGroupMessage(txn, message);
@@ -459,7 +460,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		Connection txn = db.startTransaction();
 
 		// Add a contact and some messages to ack
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.addMessageToAck(txn, contactId, messageId);
 		db.addMessageToAck(txn, contactId, messageId1);
 
@@ -484,7 +485,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		Connection txn = db.startTransaction();
 
 		// Add a contact and receive the same message twice
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.addMessageToAck(txn, contactId, messageId);
 		db.addMessageToAck(txn, contactId, messageId);
 
@@ -509,7 +510,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		Connection txn = db.startTransaction();
 
 		// Add a contact, subscribe to a group and store a message
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.addSubscription(txn, group);
 		db.addVisibility(txn, contactId, groupId);
 		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1);
@@ -748,7 +749,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		// Add a contact with a transport
 		TransportProperties p = new TransportProperties(
 				Collections.singletonMap("foo", "bar"));
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.setRemoteProperties(txn, contactId, transportId, p, 1);
 		assertEquals(Collections.singletonMap(contactId, p),
 				db.getRemoteProperties(txn, transportId));
@@ -838,7 +839,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		// Initialise the transport properties with version 1
 		TransportProperties p = new TransportProperties(
 				Collections.singletonMap("foo", "bar"));
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.setRemoteProperties(txn, contactId, transportId, p, 1);
 		assertEquals(Collections.singletonMap(contactId, p),
 				db.getRemoteProperties(txn, transportId));
@@ -870,7 +871,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		Connection txn = db.startTransaction();
 
 		// Add a contact and subscribe to a group
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.addSubscription(txn, group);
 		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1);
 
@@ -887,7 +888,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		Connection txn = db.startTransaction();
 
 		// Add a contact, subscribe to a group and store a message
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.addSubscription(txn, group);
 		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1);
 		db.addGroupMessage(txn, message);
@@ -910,7 +911,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		Connection txn = db.startTransaction();
 
 		// Add a contact, subscribe to a group and store a message
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.addSubscription(txn, group);
 		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1);
 		db.addGroupMessage(txn, message);
@@ -933,7 +934,7 @@ public class H2DatabaseTest extends BriarTestCase {
 
 		// Add a contact, subscribe to a group and store a message -
 		// the message is older than the contact's retention time
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.addSubscription(txn, group);
 		db.addVisibility(txn, contactId, groupId);
 		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1);
@@ -957,7 +958,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		Connection txn = db.startTransaction();
 
 		// Add a contact, subscribe to a group and store a message
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.addSubscription(txn, group);
 		db.addVisibility(txn, contactId, groupId);
 		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1);
@@ -982,7 +983,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		Connection txn = db.startTransaction();
 
 		// Add a contact and subscribe to a group
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.addSubscription(txn, group);
 		db.addVisibility(txn, contactId, groupId);
 		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1);
@@ -1001,7 +1002,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		Connection txn = db.startTransaction();
 
 		// Add a contact with a subscription
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1);
 
 		// There's no local subscription for the group
@@ -1018,7 +1019,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		Connection txn = db.startTransaction();
 
 		// Add a contact, subscribe to a group and store a message
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.addSubscription(txn, group);
 		db.addGroupMessage(txn, message);
 		db.addStatus(txn, contactId, messageId, false);
@@ -1037,7 +1038,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		Connection txn = db.startTransaction();
 
 		// Add a contact, subscribe to a group and store a message
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.addSubscription(txn, group);
 		db.addGroupMessage(txn, message);
 		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1);
@@ -1057,7 +1058,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		Connection txn = db.startTransaction();
 
 		// Add a contact, subscribe to a group and store a message
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.addSubscription(txn, group);
 		db.addVisibility(txn, contactId, groupId);
 		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1);
@@ -1079,7 +1080,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		Connection txn = db.startTransaction();
 
 		// Add a contact, subscribe to a group and store a message
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.addSubscription(txn, group);
 		db.addVisibility(txn, contactId, groupId);
 		db.setSubscriptions(txn, contactId, Arrays.asList(group), 1);
@@ -1100,7 +1101,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		Connection txn = db.startTransaction();
 
 		// Add a contact and subscribe to a group
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.addSubscription(txn, group);
 		// The group should not be visible to the contact
 		assertEquals(Collections.emptyList(), db.getVisibility(txn, groupId));
@@ -1192,7 +1193,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		Connection txn = db.startTransaction();
 
 		// Add a contact and subscribe to a group
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.addSubscription(txn, group);
 
 		// A message with a private parent should return null
@@ -1241,7 +1242,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		Connection txn = db.startTransaction();
 
 		// Add a contact and subscribe to a group
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.addSubscription(txn, group);
 
 		// Store a couple of messages
@@ -1472,7 +1473,7 @@ public class H2DatabaseTest extends BriarTestCase {
 
 		// Subscribe to the groups and add a contact
 		for(Group g : groups) db.addSubscription(txn, g);
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 
 		// Make the groups visible to the contact
 		Collections.shuffle(groups);
@@ -1528,7 +1529,7 @@ public class H2DatabaseTest extends BriarTestCase {
 
 		// Add the contact, the transport, the endpoint and the first two
 		// secrets (periods 0 and 1)
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.addTransport(txn, transportId);
 		db.addEndpoint(txn, ep);
 		db.addSecrets(txn, Arrays.asList(s1, s2));
@@ -1622,7 +1623,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		Connection txn = db.startTransaction();
 
 		// Add the contact, the transport, the endpoint and the temporary secret
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.addTransport(txn, transportId);
 		db.addEndpoint(txn, ep);
 		db.addSecrets(txn, Arrays.asList(s));
@@ -1678,7 +1679,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		Connection txn = db.startTransaction();
 
 		// Add the contact, the transport, the endpoint and the temporary secret
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.addTransport(txn, transportId);
 		db.addEndpoint(txn, ep);
 		db.addSecrets(txn, Arrays.asList(s));
@@ -1749,7 +1750,7 @@ public class H2DatabaseTest extends BriarTestCase {
 		assertEquals(Collections.emptyList(), db.getEndpoints(txn));
 
 		// Add the contact, the transports and the endpoints
-		assertEquals(contactId, db.addContact(txn));
+		assertEquals(contactId, db.addContact(txn, contactName));
 		db.addTransport(txn, transportId1);
 		db.addTransport(txn, transportId2);
 		db.addEndpoint(txn, ep1);
diff --git a/briar-tests/src/net/sf/briar/messaging/simplex/SimplexMessagingIntegrationTest.java b/briar-tests/src/net/sf/briar/messaging/simplex/SimplexMessagingIntegrationTest.java
index c5f9a402c4c48e685a06f562ca9064aad104b17a..4ee3256b5aa3f2aaee77f1dada580baba17827df 100644
--- a/briar-tests/src/net/sf/briar/messaging/simplex/SimplexMessagingIntegrationTest.java
+++ b/briar-tests/src/net/sf/briar/messaging/simplex/SimplexMessagingIntegrationTest.java
@@ -104,7 +104,7 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase {
 		KeyManager km = alice.getInstance(KeyManager.class);
 		km.start();
 		// Add Bob as a contact
-		ContactId contactId = db.addContact();
+		ContactId contactId = db.addContact("Bob");
 		Endpoint ep = new Endpoint(contactId, transportId, epoch,
 				CLOCK_DIFFERENCE, LATENCY, true);
 		// Add the transport and the endpoint
@@ -151,7 +151,7 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase {
 		KeyManager km = bob.getInstance(KeyManager.class);
 		km.start();
 		// Add Alice as a contact
-		ContactId contactId = db.addContact();
+		ContactId contactId = db.addContact("Alice");
 		Endpoint ep = new Endpoint(contactId, transportId, epoch,
 				CLOCK_DIFFERENCE, LATENCY, false);
 		// Add the transport and the endpoint