diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/Contact.java b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/Contact.java
index 1d921e8017f62e03100fda3e16f53692eac31155..883e9a347e1e566ee6300751e8ede761ccc44504 100644
--- a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/Contact.java
+++ b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/Contact.java
@@ -44,6 +44,8 @@ public class Contact {
 		return active;
 	}
 
+	public boolean isHidden() { return false;}
+
 	@Override
 	public int hashCode() {
 		return id.hashCode();
diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactFactory.java b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..b6ea7cdcf82f25aabc39e000c9e50e3adec2ed99
--- /dev/null
+++ b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactFactory.java
@@ -0,0 +1,20 @@
+package org.briarproject.bramble.api.contact;
+
+import org.briarproject.bramble.api.identity.Author;
+import org.briarproject.bramble.api.identity.AuthorId;
+import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
+
+import static org.briarproject.bramble.api.contact.ContactTypes.REGULAR;
+import static org.briarproject.bramble.api.contact.ContactTypes.REPEATER;
+
+@NotNullByDefault
+public class ContactFactory {
+
+	public static Contact createContact(ContactId c, Author author, AuthorId localAuthorId, boolean verified, boolean active, int type) {
+		switch (type){
+			case REGULAR: return new Contact(c, author, localAuthorId, verified, active);
+			case REPEATER: return new RepeaterContact(c, author, localAuthorId,verified,active);
+			default: throw new IllegalArgumentException("Unknown contact type");
+		}
+	}
+}
diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java
index 1f9daf48afc077a71ca87fa1a0a00de4db46cd99..cadedebf40a62a6369c7597d8727c0dd5f6f8377 100644
--- a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java
+++ b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactManager.java
@@ -29,14 +29,14 @@ public interface ContactManager {
 	 */
 	ContactId addContact(Transaction txn, Author remote, AuthorId local,
 			SecretKey master, long timestamp, boolean alice, boolean verified,
-			boolean active) throws DbException;
+			boolean active, int type) throws DbException;
 
 	/**
 	 * Stores a contact associated with the given local and remote pseudonyms
 	 * and returns an ID for the contact.
 	 */
 	ContactId addContact(Transaction txn, Author remote, AuthorId local,
-			boolean verified, boolean active) throws DbException;
+			boolean verified, boolean active, int type) throws DbException;
 
 	/**
 	 * Stores a contact associated with the given local and remote pseudonyms,
@@ -46,7 +46,7 @@ public interface ContactManager {
 	 * @param alice true if the local party is Alice
 	 */
 	ContactId addContact(Author remote, AuthorId local, SecretKey master,
-			long timestamp, boolean alice, boolean verified, boolean active)
+			long timestamp, boolean alice, boolean verified, boolean active, int type)
 			throws DbException;
 
 	/**
@@ -77,6 +77,11 @@ public interface ContactManager {
 	 */
 	Collection<Contact> getActiveContacts() throws DbException;
 
+	/**
+	 * Returns all contacts which are visible to the user.
+	 */
+	Collection<Contact> getVisibleContacts() throws DbException;
+
 	/**
 	 * Removes a contact and all associated state.
 	 */
diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactTypes.java b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactTypes.java
new file mode 100644
index 0000000000000000000000000000000000000000..89af2d9ab1d163a773571786ce9cfcf973c1582e
--- /dev/null
+++ b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactTypes.java
@@ -0,0 +1,6 @@
+package org.briarproject.bramble.api.contact;
+
+public interface ContactTypes{
+	int REGULAR = 0;
+	int REPEATER =1;
+}
diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/RepeaterContact.java b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/RepeaterContact.java
new file mode 100644
index 0000000000000000000000000000000000000000..c9bf0c39a3ba63147f2bce671a26aae6bce0578a
--- /dev/null
+++ b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/RepeaterContact.java
@@ -0,0 +1,17 @@
+package org.briarproject.bramble.api.contact;
+
+import org.briarproject.bramble.api.identity.Author;
+import org.briarproject.bramble.api.identity.AuthorId;
+
+public class RepeaterContact extends Contact {
+
+	public RepeaterContact(ContactId id,
+			Author author,
+			AuthorId localAuthorId,
+			boolean verified, boolean active) {
+		super(id, author, localAuthorId, verified, active);
+	}
+
+	@Override
+	public boolean isHidden() { return true;}
+}
diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java b/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java
index 914b88a2e2d1db1a8bafa328850ca07dd80ed189..788e3433628f9b769bc8e0db85e646266f886a86 100644
--- a/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java
+++ b/bramble-api/src/main/java/org/briarproject/bramble/api/db/DatabaseComponent.java
@@ -79,7 +79,7 @@ public interface DatabaseComponent {
 	 * and returns an ID for the contact.
 	 */
 	ContactId addContact(Transaction txn, Author remote, AuthorId local,
-			boolean verified, boolean active) throws DbException;
+			boolean verified, boolean active, int type) throws DbException;
 
 	/**
 	 * Stores a group.
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactExchangeTaskImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactExchangeTaskImpl.java
index 69a543058c0d9f1bf1fa94f86b8a85a19a5f8ec1..9467947152625f17115177bde2a932ed364c4ccd 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactExchangeTaskImpl.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactExchangeTaskImpl.java
@@ -44,6 +44,7 @@ import java.util.logging.Logger;
 import javax.inject.Inject;
 
 import static java.util.logging.Level.WARNING;
+import static org.briarproject.bramble.api.contact.ContactTypes.REGULAR;
 import static org.briarproject.bramble.api.contact.RecordTypes.CONTACT_INFO;
 import static org.briarproject.bramble.api.identity.AuthorConstants.MAX_SIGNATURE_LENGTH;
 import static org.briarproject.bramble.util.LogUtils.logException;
@@ -292,7 +293,7 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask {
 		try {
 			contactId = contactManager.addContact(txn, remoteAuthor,
 					localAuthor.getId(), masterSecret, timestamp, alice,
-					true, true);
+					true, true, REGULAR);
 			transportPropertyManager.addRemoteProperties(txn, contactId,
 					remoteProperties);
 			db.commitTransaction(txn);
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java
index 02c94fc750aa1cef2edf7673b34d4fa40e65f94d..c4911963da9367e37c2436abe0c9a90ae99dcea6 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/contact/ContactManagerImpl.java
@@ -44,8 +44,8 @@ class ContactManagerImpl implements ContactManager {
 	@Override
 	public ContactId addContact(Transaction txn, Author remote, AuthorId local,
 			SecretKey master, long timestamp, boolean alice, boolean verified,
-			boolean active) throws DbException {
-		ContactId c = db.addContact(txn, remote, local, verified, active);
+			boolean active, int type) throws DbException {
+		ContactId c = db.addContact(txn, remote, local, verified, active, type);
 		keyManager.addContact(txn, c, master, timestamp, alice, active);
 		Contact contact = db.getContact(txn, c);
 		for (ContactHook hook : hooks) hook.addingContact(txn, contact);
@@ -54,8 +54,8 @@ class ContactManagerImpl implements ContactManager {
 
 	@Override
 	public ContactId addContact(Transaction txn, Author remote, AuthorId local,
-			boolean verified, boolean active) throws DbException {
-		ContactId c = db.addContact(txn, remote, local, verified, active);
+			boolean verified, boolean active, int type) throws DbException {
+		ContactId c = db.addContact(txn, remote, local, verified, active, type);
 		Contact contact = db.getContact(txn, c);
 		for (ContactHook hook : hooks) hook.addingContact(txn, contact);
 		return c;
@@ -63,13 +63,14 @@ class ContactManagerImpl implements ContactManager {
 
 	@Override
 	public ContactId addContact(Author remote, AuthorId local, SecretKey master,
-			long timestamp, boolean alice, boolean verified, boolean active)
+			long timestamp, boolean alice, boolean verified, boolean active,
+			int type)
 			throws DbException {
 		ContactId c;
 		Transaction txn = db.startTransaction(false);
 		try {
 			c = addContact(txn, remote, local, master, timestamp, alice,
-					verified, active);
+					verified, active, type);
 			db.commitTransaction(txn);
 		} finally {
 			db.endTransaction(txn);
@@ -116,8 +117,7 @@ class ContactManagerImpl implements ContactManager {
 		throw new NoSuchContactException();
 	}
 
-	@Override
-	public Collection<Contact> getActiveContacts() throws DbException {
+	private Collection<Contact> getContacts() throws DbException {
 		Collection<Contact> contacts;
 		Transaction txn = db.startTransaction(true);
 		try {
@@ -126,11 +126,26 @@ class ContactManagerImpl implements ContactManager {
 		} finally {
 			db.endTransaction(txn);
 		}
+		return contacts;
+	}
+
+	@Override
+	public Collection<Contact> getActiveContacts() throws DbException {
+		Collection<Contact> contacts = getContacts();
 		List<Contact> active = new ArrayList<>(contacts.size());
 		for (Contact c : contacts) if (c.isActive()) active.add(c);
 		return active;
 	}
 
+	@Override
+	public Collection<Contact> getVisibleContacts() throws DbException {
+		Collection<Contact> contacts = getContacts();
+		List<Contact> visible = new ArrayList<>(contacts.size());
+		for (Contact c : contacts)
+			if (c.isActive() && !c.isHidden()) visible.add(c);
+		return visible;
+	}
+
 	@Override
 	public void removeContact(ContactId c) throws DbException {
 		Transaction txn = db.startTransaction(false);
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/Database.java b/bramble-core/src/main/java/org/briarproject/bramble/db/Database.java
index 66e5cfcf6d72ec90eed0dffa4bbf56c51d38b071..d06e7f1e0b361f089cb255a17f10ea86a079f7ab 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/db/Database.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/db/Database.java
@@ -78,7 +78,7 @@ interface Database<T> {
 	 * and returns an ID for the contact.
 	 */
 	ContactId addContact(T txn, Author remote, AuthorId local, boolean verified,
-			boolean active) throws DbException;
+			boolean active, int ype) throws DbException;
 
 	/**
 	 * Stores a group.
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java
index f2e4de1c6fff7cbd3fbc6e92f52dead50c34b458..1a501c029150e3e6f5137a26bcec82b4eafeffcf 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/db/DatabaseComponentImpl.java
@@ -2,6 +2,7 @@ package org.briarproject.bramble.db;
 
 import org.briarproject.bramble.api.contact.Contact;
 import org.briarproject.bramble.api.contact.ContactId;
+import org.briarproject.bramble.api.contact.ContactTypes;
 import org.briarproject.bramble.api.contact.event.ContactAddedEvent;
 import org.briarproject.bramble.api.contact.event.ContactRemovedEvent;
 import org.briarproject.bramble.api.contact.event.ContactStatusChangedEvent;
@@ -172,7 +173,7 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
 
 	@Override
 	public ContactId addContact(Transaction transaction, Author remote,
-			AuthorId local, boolean verified, boolean active)
+			AuthorId local, boolean verified, boolean active, int type)
 			throws DbException {
 		if (transaction.isReadOnly()) throw new IllegalArgumentException();
 		T txn = unbox(transaction);
@@ -182,7 +183,7 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
 			throw new ContactExistsException();
 		if (db.containsContact(txn, remote.getId(), local))
 			throw new ContactExistsException();
-		ContactId c = db.addContact(txn, remote, local, verified, active);
+		ContactId c = db.addContact(txn, remote, local, verified, active, type);
 		transaction.attach(new ContactAddedEvent(c, active));
 		if (active) transaction.attach(new ContactStatusChangedEvent(c, true));
 		return c;
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java
index baa67a29ac6397c6c7e26b17a18feb455924c111..db7fa0b39c7580a06db3fa7f9e801eba0f3318ea 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/db/JdbcDatabase.java
@@ -1,6 +1,7 @@
 package org.briarproject.bramble.db;
 
 import org.briarproject.bramble.api.contact.Contact;
+import org.briarproject.bramble.api.contact.ContactFactory;
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.crypto.SecretKey;
 import org.briarproject.bramble.api.db.DataTooNewException;
@@ -110,6 +111,7 @@ abstract class JdbcDatabase implements Database<Connection> {
 					+ " localAuthorId _HASH NOT NULL,"
 					+ " verified BOOLEAN NOT NULL,"
 					+ " active BOOLEAN NOT NULL,"
+					+ " type INT NOT NULL,"
 					+ " PRIMARY KEY (contactId),"
 					+ " FOREIGN KEY (localAuthorId)"
 					+ " REFERENCES localAuthors (authorId)"
@@ -571,7 +573,7 @@ abstract class JdbcDatabase implements Database<Connection> {
 
 	@Override
 	public ContactId addContact(Connection txn, Author remote, AuthorId local,
-			boolean verified, boolean active) throws DbException {
+			boolean verified, boolean active, int type) throws DbException {
 		PreparedStatement ps = null;
 		ResultSet rs = null;
 		try {
@@ -579,8 +581,8 @@ abstract class JdbcDatabase implements Database<Connection> {
 			String sql = "INSERT INTO contacts"
 					+ " (authorId, formatVersion, name, publicKey,"
 					+ " localAuthorId,"
-					+ " verified, active)"
-					+ " VALUES (?, ?, ?, ?, ?, ?, ?)";
+					+ " verified, active, type)"
+					+ " VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
 			ps = txn.prepareStatement(sql);
 			ps.setBytes(1, remote.getId().getBytes());
 			ps.setInt(2, remote.getFormatVersion());
@@ -589,6 +591,7 @@ abstract class JdbcDatabase implements Database<Connection> {
 			ps.setBytes(5, local.getBytes());
 			ps.setBoolean(6, verified);
 			ps.setBoolean(7, active);
+			ps.setInt(8, type);
 			int affected = ps.executeUpdate();
 			if (affected != 1) throw new DbStateException();
 			ps.close();
@@ -1194,7 +1197,7 @@ abstract class JdbcDatabase implements Database<Connection> {
 		ResultSet rs = null;
 		try {
 			String sql = "SELECT authorId, formatVersion, name, publicKey,"
-					+ " localAuthorId, verified, active"
+					+ " localAuthorId, verified, active, type"
 					+ " FROM contacts"
 					+ " WHERE contactId = ?";
 			ps = txn.prepareStatement(sql);
@@ -1208,11 +1211,12 @@ abstract class JdbcDatabase implements Database<Connection> {
 			AuthorId localAuthorId = new AuthorId(rs.getBytes(5));
 			boolean verified = rs.getBoolean(6);
 			boolean active = rs.getBoolean(7);
+			int type = rs.getInt(8);
 			rs.close();
 			ps.close();
 			Author author =
 					new Author(authorId, formatVersion, name, publicKey);
-			return new Contact(c, author, localAuthorId, verified, active);
+			return ContactFactory.createContact(c, author, localAuthorId, verified, active, type);
 		} catch (SQLException e) {
 			tryToClose(rs);
 			tryToClose(ps);
@@ -1227,7 +1231,7 @@ abstract class JdbcDatabase implements Database<Connection> {
 		ResultSet rs = null;
 		try {
 			String sql = "SELECT contactId, authorId, formatVersion, name,"
-					+ " publicKey, localAuthorId, verified, active"
+					+ " publicKey, localAuthorId, verified, active, type"
 					+ " FROM contacts";
 			ps = txn.prepareStatement(sql);
 			rs = ps.executeQuery();
@@ -1243,8 +1247,9 @@ abstract class JdbcDatabase implements Database<Connection> {
 				AuthorId localAuthorId = new AuthorId(rs.getBytes(6));
 				boolean verified = rs.getBoolean(7);
 				boolean active = rs.getBoolean(8);
-				contacts.add(new Contact(contactId, author, localAuthorId,
-						verified, active));
+				int type = rs.getInt(9);
+				contacts.add(ContactFactory.createContact(contactId, author, localAuthorId,
+						verified, active, type));
 			}
 			rs.close();
 			ps.close();
@@ -1286,7 +1291,7 @@ abstract class JdbcDatabase implements Database<Connection> {
 		ResultSet rs = null;
 		try {
 			String sql = "SELECT contactId, formatVersion, name, publicKey,"
-					+ " localAuthorId, verified, active"
+					+ " localAuthorId, verified, active, type"
 					+ " FROM contacts"
 					+ " WHERE authorId = ?";
 			ps = txn.prepareStatement(sql);
@@ -1301,10 +1306,11 @@ abstract class JdbcDatabase implements Database<Connection> {
 				AuthorId localAuthorId = new AuthorId(rs.getBytes(5));
 				boolean verified = rs.getBoolean(6);
 				boolean active = rs.getBoolean(7);
+				int type = rs.getInt(8);
 				Author author =
 						new Author(remote, formatVersion, name, publicKey);
-				contacts.add(new Contact(c, author, localAuthorId, verified,
-						active));
+				contacts.add(ContactFactory.createContact(c, author, localAuthorId, verified,
+						active, type));
 			}
 			rs.close();
 			ps.close();
diff --git a/bramble-core/src/test/java/org/briarproject/bramble/contact/ContactManagerImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/contact/ContactManagerImplTest.java
index a90d685b185bfb565f34a9d78a275a0953ae0330..e25d6b7b13a93bbef552424c412de55a582c1e13 100644
--- a/bramble-core/src/test/java/org/briarproject/bramble/contact/ContactManagerImplTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/contact/ContactManagerImplTest.java
@@ -20,6 +20,7 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Random;
 
+import static org.briarproject.bramble.api.contact.ContactTypes.REGULAR;
 import static org.briarproject.bramble.test.TestUtils.getAuthor;
 import static org.briarproject.bramble.test.TestUtils.getRandomId;
 import static org.briarproject.bramble.test.TestUtils.getSecretKey;
@@ -53,7 +54,7 @@ public class ContactManagerImplTest extends BrambleMockTestCase {
 		context.checking(new Expectations() {{
 			oneOf(db).startTransaction(false);
 			will(returnValue(txn));
-			oneOf(db).addContact(txn, remote, local, verified, active);
+			oneOf(db).addContact(txn, remote, local, verified, active, REGULAR);
 			will(returnValue(contactId));
 			oneOf(keyManager).addContact(txn, contactId, master, timestamp,
 					alice, active);
@@ -64,7 +65,7 @@ public class ContactManagerImplTest extends BrambleMockTestCase {
 		}});
 
 		assertEquals(contactId, contactManager.addContact(remote, local,
-				master, timestamp, alice, verified, active));
+				master, timestamp, alice, verified, active, REGULAR));
 	}
 
 	@Test
diff --git a/bramble-core/src/test/java/org/briarproject/bramble/db/DatabaseComponentImplTest.java b/bramble-core/src/test/java/org/briarproject/bramble/db/DatabaseComponentImplTest.java
index e16e03da0dc51086f73c9c6ed45ee81483f8a3b1..ad2d669928eefce9c8a420de82976da7113428fa 100644
--- a/bramble-core/src/test/java/org/briarproject/bramble/db/DatabaseComponentImplTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/db/DatabaseComponentImplTest.java
@@ -61,6 +61,7 @@ import java.util.concurrent.atomic.AtomicReference;
 
 import static java.util.Collections.emptyMap;
 import static java.util.Collections.singletonList;
+import static org.briarproject.bramble.api.contact.ContactTypes.REGULAR;
 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;
@@ -162,7 +163,7 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase {
 					localAuthor.getId());
 			will(returnValue(false));
 			oneOf(database).addContact(txn, author, localAuthor.getId(),
-					true, true);
+					true, true, REGULAR);
 			will(returnValue(contactId));
 			oneOf(eventBus).broadcast(with(any(ContactAddedEvent.class)));
 			oneOf(eventBus).broadcast(with(any(
@@ -213,7 +214,7 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase {
 		try {
 			db.addLocalAuthor(transaction, localAuthor);
 			assertEquals(contactId, db.addContact(transaction, author,
-					localAuthor.getId(), true, true));
+					localAuthor.getId(), true, true, REGULAR));
 			assertEquals(singletonList(contact),
 					db.getContacts(transaction));
 			db.addGroup(transaction, group); // First time - listeners called
@@ -479,7 +480,7 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase {
 
 		Transaction transaction = db.startTransaction(false);
 		try {
-			db.addContact(transaction, author, localAuthor.getId(), true, true);
+			db.addContact(transaction, author, localAuthor.getId(), true, true, REGULAR);
 			fail();
 		} catch (NoSuchLocalAuthorException expected) {
 			// Expected
@@ -755,7 +756,7 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase {
 					localAuthor.getId());
 			will(returnValue(false));
 			oneOf(database).addContact(txn, author, localAuthor.getId(),
-					true, true);
+					true, true, REGULAR);
 			will(returnValue(contactId));
 			oneOf(eventBus).broadcast(with(any(ContactAddedEvent.class)));
 			oneOf(eventBus).broadcast(with(any(
@@ -776,7 +777,7 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase {
 		try {
 			db.addLocalAuthor(transaction, localAuthor);
 			assertEquals(contactId, db.addContact(transaction, author,
-					localAuthor.getId(), true, true));
+					localAuthor.getId(), true, true, REGULAR));
 			db.commitTransaction(transaction);
 		} finally {
 			db.endTransaction(transaction);
@@ -1556,7 +1557,7 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase {
 
 		Transaction transaction = db.startTransaction(false);
 		try {
-			db.addContact(transaction, author, localAuthor.getId(), true, true);
+			db.addContact(transaction, author, localAuthor.getId(), true, true, REGULAR);
 			fail();
 		} catch (ContactExistsException expected) {
 			// Expected
@@ -1586,7 +1587,7 @@ public class DatabaseComponentImplTest extends BrambleMockTestCase {
 
 		Transaction transaction = db.startTransaction(false);
 		try {
-			db.addContact(transaction, author, localAuthor.getId(), true, true);
+			db.addContact(transaction, author, localAuthor.getId(), true, true, REGULAR);
 			fail();
 		} catch (ContactExistsException expected) {
 			// Expected
diff --git a/bramble-core/src/test/java/org/briarproject/bramble/db/DatabasePerformanceTest.java b/bramble-core/src/test/java/org/briarproject/bramble/db/DatabasePerformanceTest.java
index e46a75b68460ba81166b20aabbfcddcbca1fe4b8..f4679bc61e99186b9e5c8e1326cdf50250933e5e 100644
--- a/bramble-core/src/test/java/org/briarproject/bramble/db/DatabasePerformanceTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/db/DatabasePerformanceTest.java
@@ -32,6 +32,7 @@ import java.util.Random;
 import java.util.logging.Logger;
 
 import static java.util.logging.Level.OFF;
+import static org.briarproject.bramble.api.contact.ContactTypes.REGULAR;
 import static org.briarproject.bramble.api.sync.SyncConstants.MAX_MESSAGE_IDS;
 import static org.briarproject.bramble.api.sync.ValidationManager.State.DELIVERED;
 import static org.briarproject.bramble.test.TestUtils.deleteTestDirectory;
@@ -546,7 +547,7 @@ public abstract class DatabasePerformanceTest extends BrambleTestCase {
 		db.addLocalAuthor(txn, localAuthor);
 		for (int i = 0; i < CONTACTS; i++) {
 			ContactId c = db.addContact(txn, getAuthor(), localAuthor.getId(),
-					random.nextBoolean(), true);
+					random.nextBoolean(), true, REGULAR);
 			contacts.add(db.getContact(txn, c));
 			contactGroups.put(c, new ArrayList<>());
 			for (int j = 0; j < GROUPS_PER_CONTACT; j++) {
diff --git a/bramble-core/src/test/java/org/briarproject/bramble/db/JdbcDatabaseTest.java b/bramble-core/src/test/java/org/briarproject/bramble/db/JdbcDatabaseTest.java
index 2655e9ef7f571cdbcc80abb2a492e3b0e7c5bdcd..0c02b57a7d059bde879642d957476dd11d7e43bf 100644
--- a/bramble-core/src/test/java/org/briarproject/bramble/db/JdbcDatabaseTest.java
+++ b/bramble-core/src/test/java/org/briarproject/bramble/db/JdbcDatabaseTest.java
@@ -48,6 +48,7 @@ import static java.util.Collections.emptyMap;
 import static java.util.Collections.singletonList;
 import static java.util.Collections.singletonMap;
 import static java.util.concurrent.TimeUnit.SECONDS;
+import static org.briarproject.bramble.api.contact.ContactTypes.REGULAR;
 import static org.briarproject.bramble.api.db.Metadata.REMOVE;
 import static org.briarproject.bramble.api.sync.Group.Visibility.INVISIBLE;
 import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED;
@@ -130,7 +131,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase {
 		assertFalse(db.containsContact(txn, contactId));
 		db.addLocalAuthor(txn, localAuthor);
 		assertEquals(contactId, db.addContact(txn, author, localAuthor.getId(),
-				true, true));
+				true, true, REGULAR));
 		assertTrue(db.containsContact(txn, contactId));
 		assertFalse(db.containsGroup(txn, groupId));
 		db.addGroup(txn, group);
@@ -193,7 +194,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase {
 		// Add a contact, a shared group and a shared message
 		db.addLocalAuthor(txn, localAuthor);
 		assertEquals(contactId, db.addContact(txn, author, localAuthor.getId(),
-				true, true));
+				true, true, REGULAR));
 		db.addGroup(txn, group);
 		db.addGroupVisibility(txn, contactId, groupId, true);
 		db.addMessage(txn, message, DELIVERED, true, null);
@@ -224,7 +225,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase {
 		// Add a contact, a shared group and a shared but unvalidated message
 		db.addLocalAuthor(txn, localAuthor);
 		assertEquals(contactId, db.addContact(txn, author, localAuthor.getId(),
-				true, true));
+				true, true, REGULAR));
 		db.addGroup(txn, group);
 		db.addGroupVisibility(txn, contactId, groupId, true);
 		db.addMessage(txn, message, UNKNOWN, true, null);
@@ -269,7 +270,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase {
 		// Add a contact, an invisible group and a shared message
 		db.addLocalAuthor(txn, localAuthor);
 		assertEquals(contactId, db.addContact(txn, author, localAuthor.getId(),
-				true, true));
+				true, true, REGULAR));
 		db.addGroup(txn, group);
 		db.addMessage(txn, message, DELIVERED, true, null);
 
@@ -320,7 +321,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase {
 		// Add a contact, a shared group and an unshared message
 		db.addLocalAuthor(txn, localAuthor);
 		assertEquals(contactId, db.addContact(txn, author, localAuthor.getId(),
-				true, true));
+				true, true, REGULAR));
 		db.addGroup(txn, group);
 		db.addGroupVisibility(txn, contactId, groupId, true);
 		db.addMessage(txn, message, DELIVERED, false, null);
@@ -351,7 +352,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase {
 		// Add a contact, a shared group and a shared message
 		db.addLocalAuthor(txn, localAuthor);
 		assertEquals(contactId, db.addContact(txn, author, localAuthor.getId(),
-				true, true));
+				true, true, REGULAR));
 		db.addGroup(txn, group);
 		db.addGroupVisibility(txn, contactId, groupId, true);
 		db.addMessage(txn, message, DELIVERED, true, null);
@@ -377,7 +378,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase {
 		// Add a contact and a visible group
 		db.addLocalAuthor(txn, localAuthor);
 		assertEquals(contactId, db.addContact(txn, author, localAuthor.getId(),
-				true, true));
+				true, true, REGULAR));
 		db.addGroup(txn, group);
 		db.addGroupVisibility(txn, contactId, groupId, false);
 
@@ -418,7 +419,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase {
 		// Add a contact, a shared group and a shared message
 		db.addLocalAuthor(txn, localAuthor);
 		assertEquals(contactId, db.addContact(txn, author, localAuthor.getId(),
-				true, true));
+				true, true, REGULAR));
 		db.addGroup(txn, group);
 		db.addGroupVisibility(txn, contactId, groupId, true);
 		db.addMessage(txn, message, DELIVERED, true, null);
@@ -575,7 +576,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase {
 		// Add a contact and a shared group
 		db.addLocalAuthor(txn, localAuthor);
 		assertEquals(contactId, db.addContact(txn, author, localAuthor.getId(),
-				true, true));
+				true, true, REGULAR));
 		db.addGroup(txn, group);
 		db.addGroupVisibility(txn, contactId, groupId, true);
 
@@ -595,7 +596,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase {
 		// Add a contact
 		db.addLocalAuthor(txn, localAuthor);
 		assertEquals(contactId, db.addContact(txn, author, localAuthor.getId(),
-				true, true));
+				true, true, REGULAR));
 
 		// The group is not in the database
 		assertFalse(db.containsVisibleMessage(txn, contactId, messageId));
@@ -613,7 +614,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase {
 		// Add a contact, an invisible group and a message
 		db.addLocalAuthor(txn, localAuthor);
 		assertEquals(contactId, db.addContact(txn, author, localAuthor.getId(),
-				true, true));
+				true, true, REGULAR));
 		db.addGroup(txn, group);
 		db.addMessage(txn, message, DELIVERED, true, null);
 
@@ -632,7 +633,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase {
 		// Add a contact and a group
 		db.addLocalAuthor(txn, localAuthor);
 		assertEquals(contactId, db.addContact(txn, author, localAuthor.getId(),
-				true, true));
+				true, true, REGULAR));
 		db.addGroup(txn, group);
 
 		// The group should not be visible to the contact
@@ -684,7 +685,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase {
 		// Add the contact, the transport and the transport keys
 		db.addLocalAuthor(txn, localAuthor);
 		assertEquals(contactId, db.addContact(txn, author, localAuthor.getId(),
-				true, active));
+				true, active, REGULAR));
 		db.addTransport(txn, transportId, 123);
 		assertEquals(keySetId, db.addTransportKeys(txn, contactId, keys));
 		assertEquals(keySetId1, db.addTransportKeys(txn, contactId, keys1));
@@ -776,7 +777,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase {
 		// Add the contact, transport and transport keys
 		db.addLocalAuthor(txn, localAuthor);
 		assertEquals(contactId, db.addContact(txn, author, localAuthor.getId(),
-				true, true));
+				true, true, REGULAR));
 		db.addTransport(txn, transportId, 123);
 		assertEquals(keySetId, db.addTransportKeys(txn, contactId, keys));
 
@@ -819,7 +820,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase {
 		// Add the contact, transport and transport keys
 		db.addLocalAuthor(txn, localAuthor);
 		assertEquals(contactId, db.addContact(txn, author, localAuthor.getId(),
-				true, active));
+				true, active, REGULAR));
 		db.addTransport(txn, transportId, 123);
 		assertEquals(keySetId, db.addTransportKeys(txn, contactId, keys));
 
@@ -860,7 +861,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase {
 
 		// Add a contact associated with the local author
 		assertEquals(contactId, db.addContact(txn, author, localAuthor.getId(),
-				true, true));
+				true, true, REGULAR));
 
 		// Ensure contact is returned from database by Author ID
 		Collection<Contact> contacts =
@@ -890,7 +891,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase {
 
 		// Add a contact associated with the local author
 		assertEquals(contactId, db.addContact(txn, author, localAuthor.getId(),
-				true, true));
+				true, true, REGULAR));
 		contacts = db.getContacts(txn, localAuthor.getId());
 		assertEquals(singletonList(contactId), contacts);
 
@@ -912,7 +913,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase {
 		// Add a contact - initially there should be no offered messages
 		db.addLocalAuthor(txn, localAuthor);
 		assertEquals(contactId, db.addContact(txn, author, localAuthor.getId(),
-				true, true));
+				true, true, REGULAR));
 		assertEquals(0, db.countOfferedMessages(txn, contactId));
 
 		// Add some offered messages and count them
@@ -1504,7 +1505,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase {
 		// Add a contact, a shared group and a shared message
 		db.addLocalAuthor(txn, localAuthor);
 		assertEquals(contactId, db.addContact(txn, author, localAuthor.getId(),
-				true, true));
+				true, true, REGULAR));
 		db.addGroup(txn, group);
 		db.addGroupVisibility(txn, contactId, groupId, true);
 		db.addMessage(txn, message, DELIVERED, true, null);
@@ -1615,9 +1616,9 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase {
 
 		// Add the same contact for each local author
 		ContactId contactId =
-				db.addContact(txn, author, localAuthor.getId(), true, true);
+				db.addContact(txn, author, localAuthor.getId(), true, true, REGULAR);
 		ContactId contactId1 =
-				db.addContact(txn, author, localAuthor1.getId(), true, true);
+				db.addContact(txn, author, localAuthor1.getId(), true, true, REGULAR);
 
 		// The contacts should be distinct
 		assertNotEquals(contactId, contactId1);
@@ -1637,7 +1638,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase {
 		// Add a contact, a shared group and a shared message
 		db.addLocalAuthor(txn, localAuthor);
 		assertEquals(contactId, db.addContact(txn, author, localAuthor.getId(),
-				true, true));
+				true, true, REGULAR));
 		db.addGroup(txn, group);
 		db.addGroupVisibility(txn, contactId, groupId, true);
 		db.addMessage(txn, message, DELIVERED, true, null);
@@ -1682,7 +1683,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase {
 		// Add a contact
 		db.addLocalAuthor(txn, localAuthor);
 		assertEquals(contactId, db.addContact(txn, author, localAuthor.getId(),
-				true, true));
+				true, true, REGULAR));
 
 		// The contact should be active
 		Contact contact = db.getContact(txn, contactId);
@@ -1737,7 +1738,7 @@ public abstract class JdbcDatabaseTest extends BrambleTestCase {
 		// Add a contact, a group and a message
 		db.addLocalAuthor(txn, localAuthor);
 		assertEquals(contactId, db.addContact(txn, author, localAuthor.getId(),
-				true, true));
+				true, true, REGULAR));
 		db.addGroup(txn, group);
 		db.addMessage(txn, message, UNKNOWN, false, null);
 
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListFragment.java b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListFragment.java
index 2dc00d67f63d6cd1e96507df45627f3de7a63d00..04fa53f9f3375a1daff46d58a728782d5868b588 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListFragment.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/contact/ContactListFragment.java
@@ -198,7 +198,7 @@ public class ContactListFragment extends BaseFragment implements EventListener {
 			try {
 				long start = now();
 				List<ContactListItem> contacts = new ArrayList<>();
-				for (Contact c : contactManager.getActiveContacts()) {
+				for (Contact c : contactManager.getVisibleContacts()) {
 					try {
 						ContactId id = c.getId();
 						GroupCount count =
diff --git a/briar-android/src/main/java/org/briarproject/briar/android/contactselection/ContactSelectorControllerImpl.java b/briar-android/src/main/java/org/briarproject/briar/android/contactselection/ContactSelectorControllerImpl.java
index 9f6380d0faeb96b9c4313fd42a1645ca2d757705..2c33ee63d99498f92921a973265be7f32e45ea2a 100644
--- a/briar-android/src/main/java/org/briarproject/briar/android/contactselection/ContactSelectorControllerImpl.java
+++ b/briar-android/src/main/java/org/briarproject/briar/android/contactselection/ContactSelectorControllerImpl.java
@@ -44,7 +44,7 @@ public abstract class ContactSelectorControllerImpl
 		runOnDbThread(() -> {
 			try {
 				Collection<SelectableContactItem> contacts = new ArrayList<>();
-				for (Contact c : contactManager.getActiveContacts()) {
+				for (Contact c : contactManager.getVisibleContacts()) {
 					// was this contact already selected?
 					boolean selected = selection.contains(c.getId());
 					// can this contact be selected?
diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroduceeProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroduceeProtocolEngine.java
index 651bd8a97336a8d5d352ab24b831eae2c5bfff2f..a52797b3c9fbb3a028c405fcccb4488d4160af4d 100644
--- a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroduceeProtocolEngine.java
+++ b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroduceeProtocolEngine.java
@@ -5,6 +5,7 @@ import org.briarproject.bramble.api.client.ClientHelper;
 import org.briarproject.bramble.api.client.ContactGroupFactory;
 import org.briarproject.bramble.api.contact.Contact;
 import org.briarproject.bramble.api.contact.ContactManager;
+import org.briarproject.bramble.api.contact.ContactTypes;
 import org.briarproject.bramble.api.crypto.KeyPair;
 import org.briarproject.bramble.api.crypto.SecretKey;
 import org.briarproject.bramble.api.data.BdfDictionary;
@@ -40,6 +41,7 @@ import javax.annotation.concurrent.Immutable;
 import javax.inject.Inject;
 
 import static java.util.logging.Level.WARNING;
+import static org.briarproject.bramble.api.contact.ContactTypes.REGULAR;
 import static org.briarproject.bramble.util.LogUtils.logException;
 import static org.briarproject.briar.api.introduction.Role.INTRODUCEE;
 import static org.briarproject.briar.introduction.IntroduceeState.AWAIT_AUTH;
@@ -444,7 +446,7 @@ class IntroduceeProtocolEngine
 		try {
 			contactManager
 					.addContact(txn, s.getRemote().author, localAuthor.getId(),
-							false, true);
+							false, true, REGULAR);
 
 			// Only add transport properties and keys when the contact was added
 			// This will be changed once we have a way to reset state for peers
diff --git a/briar-core/src/main/java/org/briarproject/briar/test/TestDataCreatorImpl.java b/briar-core/src/main/java/org/briarproject/briar/test/TestDataCreatorImpl.java
index 811f3a351008aaca919437fc2519d3d47087ba57..c5f574b12bdb590a409f49e23cb4c4144757022c 100644
--- a/briar-core/src/main/java/org/briarproject/briar/test/TestDataCreatorImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/test/TestDataCreatorImpl.java
@@ -53,6 +53,7 @@ import javax.inject.Inject;
 
 import static java.util.logging.Level.INFO;
 import static java.util.logging.Level.WARNING;
+import static org.briarproject.bramble.api.contact.ContactTypes.REGULAR;
 import static org.briarproject.bramble.api.plugin.BluetoothConstants.UUID_BYTES;
 import static org.briarproject.bramble.api.sync.Group.Visibility.SHARED;
 import static org.briarproject.bramble.util.StringUtils.getRandomString;
@@ -171,7 +172,7 @@ public class TestDataCreatorImpl implements TestDataCreator {
 		try {
 			ContactId contactId = contactManager
 					.addContact(txn, author, localAuthor.getId(), secretKey,
-							timestamp, true, verified, true);
+							timestamp, true, verified, true, REGULAR);
 			transportPropertyManager.addRemoteProperties(txn, contactId, props);
 			contact = db.getContact(txn, contactId);
 			db.commitTransaction(txn);
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 b3161af64dce727a64b1fafa8dba50879ce68094..e508d1d3c06d9ab730bde8c372413ca713e4893e 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
@@ -41,6 +41,7 @@ import java.util.Collection;
 import java.util.Map;
 import java.util.concurrent.TimeoutException;
 
+import static org.briarproject.bramble.api.contact.ContactTypes.REGULAR;
 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.bramble.test.TestUtils.getRandomBytes;
@@ -931,11 +932,11 @@ public class IntroductionIntegrationTest
 		contactManager1.removeContact(contactId0From1);
 		contactId1From0 = contactManager0
 				.addContact(author1, author0.getId(), getSecretKey(),
-						clock.currentTimeMillis(), true, true, true);
+						clock.currentTimeMillis(), true, true, true, REGULAR);
 		contact1From0 = contactManager0.getContact(contactId1From0);
 		contactId0From1 = contactManager1
 				.addContact(author0, author1.getId(), getSecretKey(),
-						clock.currentTimeMillis(), true, true, true);
+						clock.currentTimeMillis(), true, true, true, REGULAR);
 		contact0From1 = contactManager1.getContact(contactId0From1);
 
 		// Sync initial client versioning updates and transport properties
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 1007afe5e08866139119b5d3b3d129d5c1d8d434..692a182b52fb8d30d2748e80132e373e929a0c98 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
@@ -41,6 +41,7 @@ import java.io.ByteArrayOutputStream;
 import java.io.File;
 import java.io.InputStream;
 
+import static org.briarproject.bramble.api.contact.ContactTypes.REGULAR;
 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;
@@ -108,7 +109,7 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase {
 		// Add the other user as a contact
 		ContactManager contactManager = device.getContactManager();
 		return contactManager.addContact(remote, local.getId(), master,
-				timestamp, alice, true, true);
+				timestamp, alice, true, true, REGULAR);
 	}
 
 	private void sendMessage(SimplexMessagingIntegrationTestComponent device,
diff --git a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java
index 481a574869a56d0f455a7f6673b7bf1f56fb5f32..1fb5f730a18e1e2664a139e8f0ffec49732c17ec 100644
--- a/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java
+++ b/briar-core/src/test/java/org/briarproject/briar/test/BriarIntegrationTest.java
@@ -62,6 +62,7 @@ import javax.annotation.Nullable;
 import javax.inject.Inject;
 
 import static junit.framework.Assert.assertNotNull;
+import static org.briarproject.bramble.api.contact.ContactTypes.REGULAR;
 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;
@@ -239,19 +240,19 @@ public abstract class BriarIntegrationTest<C extends BriarIntegrationTestCompone
 	protected void addDefaultContacts() throws Exception {
 		contactId1From0 = contactManager0
 				.addContact(author1, author0.getId(), getSecretKey(),
-						clock.currentTimeMillis(), true, true, true);
+						clock.currentTimeMillis(), true, true, true, REGULAR);
 		contact1From0 = contactManager0.getContact(contactId1From0);
 		contactId0From1 = contactManager1
 				.addContact(author0, author1.getId(), getSecretKey(),
-						clock.currentTimeMillis(), true, true, true);
+						clock.currentTimeMillis(), true, true, true, REGULAR);
 		contact0From1 = contactManager1.getContact(contactId0From1);
 		contactId2From0 = contactManager0
 				.addContact(author2, author0.getId(), getSecretKey(),
-						clock.currentTimeMillis(), true, true, true);
+						clock.currentTimeMillis(), true, true, true, REGULAR);
 		contact2From0 = contactManager0.getContact(contactId2From0);
 		contactId0From2 = contactManager2
 				.addContact(author0, author2.getId(), getSecretKey(),
-						clock.currentTimeMillis(), true, true, true);
+						clock.currentTimeMillis(), true, true, true, REGULAR);
 		contact0From2 = contactManager2.getContact(contactId0From2);
 
 		// Sync initial client versioning updates
@@ -266,10 +267,10 @@ public abstract class BriarIntegrationTest<C extends BriarIntegrationTestCompone
 	protected void addContacts1And2() throws Exception {
 		contactId2From1 = contactManager1
 				.addContact(author2, author1.getId(), getSecretKey(),
-						clock.currentTimeMillis(), true, true, true);
+						clock.currentTimeMillis(), true, true, true, REGULAR);
 		contactId1From2 = contactManager2
 				.addContact(author1, author2.getId(), getSecretKey(),
-						clock.currentTimeMillis(), true, true, true);
+						clock.currentTimeMillis(), true, true, true, REGULAR);
 
 		// Sync initial client versioning updates
 		sync1To2(1, true);