diff --git a/briar-api/src/org/briarproject/api/contact/ContactManager.java b/briar-api/src/org/briarproject/api/contact/ContactManager.java
index 183378060f0a74d6d3731ff8e842067eb87b01ea..f18bd1dc3b620a22d0a8b7cd205ba21f59888cf7 100644
--- a/briar-api/src/org/briarproject/api/contact/ContactManager.java
+++ b/briar-api/src/org/briarproject/api/contact/ContactManager.java
@@ -5,6 +5,7 @@ import org.briarproject.api.db.DbException;
 import org.briarproject.api.db.Transaction;
 import org.briarproject.api.identity.Author;
 import org.briarproject.api.identity.AuthorId;
+import org.briarproject.api.identity.LocalAuthor;
 
 import java.util.Collection;
 
@@ -44,6 +45,14 @@ public interface ContactManager {
 	/** Marks a contact as active or inactive. */
 	void setContactActive(ContactId c, boolean active) throws DbException;
 
+	/** Return true if a contact with this name and public key already exists */
+	boolean contactExists(Transaction txn, AuthorId remoteAuthorID,
+			AuthorId localAuthorId) throws DbException;
+
+	/** Return true if a contact with this name and public key already exists */
+	boolean contactExists(AuthorId remoteAuthorID, AuthorId localAuthorId)
+			throws DbException;
+
 	interface AddContactHook {
 		void addingContact(Transaction txn, Contact c) throws DbException;
 	}
diff --git a/briar-api/src/org/briarproject/api/db/DatabaseComponent.java b/briar-api/src/org/briarproject/api/db/DatabaseComponent.java
index 2292bc0ba258a674251de8cdb5b6ebee64750251..a360fa98b61bb104e754a7bd42c6463a8e0918e0 100644
--- a/briar-api/src/org/briarproject/api/db/DatabaseComponent.java
+++ b/briar-api/src/org/briarproject/api/db/DatabaseComponent.java
@@ -162,6 +162,13 @@ public interface DatabaseComponent {
 	Collection<ContactId> getContacts(Transaction txn, AuthorId a)
 			throws DbException;
 
+	/**
+	 * Returns true if the database contains the given contact for the given
+	 * local pseudonym.
+	 */
+	boolean containsContact(Transaction txn, AuthorId remote, AuthorId local)
+			throws DbException;
+
 	/**
 	 * Returns the unique ID for this device.
 	 * <p/>
diff --git a/briar-core/src/org/briarproject/contact/ContactManagerImpl.java b/briar-core/src/org/briarproject/contact/ContactManagerImpl.java
index e04878d43f4bb6d70ba2bfcca0f63aa781f99c67..23ec838802d8ad75c512e970720a185b566e254c 100644
--- a/briar-core/src/org/briarproject/contact/ContactManagerImpl.java
+++ b/briar-core/src/org/briarproject/contact/ContactManagerImpl.java
@@ -125,6 +125,26 @@ class ContactManagerImpl implements ContactManager, RemoveIdentityHook {
 		}
 	}
 
+	@Override
+	public boolean contactExists(Transaction txn, AuthorId remoteAuthorID,
+			AuthorId localAuthorId) throws DbException {
+		return db.containsContact(txn, remoteAuthorID, localAuthorId);
+	}
+
+	@Override
+	public boolean contactExists(AuthorId remoteAuthorID,
+			AuthorId localAuthorId) throws DbException {
+		boolean exists = false;
+		Transaction txn = db.startTransaction(true);
+		try {
+			exists = contactExists(txn, remoteAuthorID, localAuthorId);
+			txn.setComplete();
+		} finally {
+			db.endTransaction(txn);
+		}
+		return exists;
+	}
+
 	private void removeContact(Transaction txn, ContactId c)
 			throws DbException {
 		Contact contact = db.getContact(txn, c);
diff --git a/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java b/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java
index d00159903596c83da6d3750dc115571dcab6215e..150d0a43a2c7422716cdc01c858e026e3e7fe1d1 100644
--- a/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java
+++ b/briar-core/src/org/briarproject/db/DatabaseComponentImpl.java
@@ -342,6 +342,14 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
 		return db.getContacts(txn, a);
 	}
 
+	public boolean containsContact(Transaction transaction, AuthorId remote,
+			AuthorId local) throws DbException {
+		T txn = unbox(transaction);
+		if (!db.containsLocalAuthor(txn, local))
+			throw new NoSuchLocalAuthorException();
+		return db.containsContact(txn, remote, local);
+	}
+
 	public DeviceId getDeviceId(Transaction transaction) throws DbException {
 		T txn = unbox(transaction);
 		return db.getDeviceId(txn);