diff --git a/bramble-android/src/main/res/raw/tor b/bramble-android/src/main/res/raw/tor
new file mode 100755
index 0000000000000000000000000000000000000000..c4490cdd52b97d4cc46f48d999eb574a001da32d
Binary files /dev/null and b/bramble-android/src/main/res/raw/tor differ
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
index 73174b5f8e07c954bfa33b80937c4daa9d6cdfd5..b12c19c9927b4ff4b00668daaa047cde8d0a9e4f 100644
--- 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
@@ -5,9 +5,9 @@ import org.briarproject.bramble.api.identity.AuthorId;
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
 
 @NotNullByDefault
-public class ContactFactory {
+public interface ContactFactory {
 
-	public static Contact createContact(ContactId c, Author author,
+	static Contact createContact(ContactId c, Author author,
 			AuthorId localAuthorId, boolean verified, boolean active,
 			ContactType type) {
 		switch (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 2909c072f51755c1f1bb75761363dd486f4cf865..fe98a6cff95a9ea12f6c1ef00d8f55dd0f9104b9 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
@@ -127,6 +127,8 @@ public interface ContactManager {
 
 	interface ContactHook {
 
+		Collection<ContactType> getApplicableContactTypes();
+
 		void addingContact(Transaction txn, Contact c) throws DbException;
 
 		void removingContact(Transaction txn, Contact c) throws DbException;
diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactType.java b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactType.java
index 4fb77e0e2512823be8a60ac0b983fc853780aa5b..c5461dd76f642ec4e5e8c49305425be1e94274b3 100644
--- a/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactType.java
+++ b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactType.java
@@ -3,7 +3,6 @@ package org.briarproject.bramble.api.contact;
 import org.briarproject.bramble.api.FormatException;
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
 
-import javax.annotation.Nullable;
 import javax.annotation.concurrent.Immutable;
 
 /**
@@ -22,7 +21,7 @@ public enum ContactType {
 	 */
 	PRIVATE_MAILBOX(1),
 	/**
-	 * The {@link ContactType#CONTACT} paired with this mailbox.
+	 * The owner of a mailbox.
 	 */
 	MAILBOX_OWNER(2);
 
@@ -40,10 +39,9 @@ public enum ContactType {
 	}
 
 	// Use this for values coming from the database
-	@Nullable
-	public static ContactType fromLocaleValue(int value) {
+	public static ContactType fromLocalValue(int value) {
 		for (ContactType type : values()) if (type.value == value) return type;
-		return null;
+		throw new IllegalArgumentException();
 	}
 
 	public int getValue() {
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 ec708e1f27891a582175964695132cf6ee57facb..9de67f743031cffe05e41a489f82536c29acda4c 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
@@ -221,7 +221,8 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask {
 		}
 
 		// Verify the contact's signature
-		if (!verify(remoteInfo.getAuthor(), remoteNonce, remoteInfo.getSignature())) {
+		if (!verify(remoteInfo.getAuthor(), remoteNonce,
+				remoteInfo.getSignature())) {
 			LOG.warning("Invalid signature");
 			listener.contactExchangeFailed();
 			tryToClose(conn);
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 fbeaf4e0c1219bd51060301d62d476aff1a269ce..4067ddfaf8de46cb6dc1c1cb1aabe0a8555a22de 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
@@ -54,7 +54,10 @@ class ContactManagerImpl implements ContactManager {
 				CONTACT);
 		keyManager.addContact(txn, c, master, timestamp, alice, active);
 		Contact contact = db.getContact(txn, c);
-		for (ContactHook hook : hooks) hook.addingContact(txn, contact);
+		for (ContactHook hook : hooks) {
+			if (hook.getApplicableContactTypes().contains(contact.getType()))
+				hook.addingContact(txn, contact);
+		}
 		return c;
 	}
 
@@ -64,7 +67,10 @@ class ContactManagerImpl implements ContactManager {
 		ContactId c = db.addContact(txn, remote, local, verified, active,
 				CONTACT);
 		Contact contact = db.getContact(txn, c);
-		for (ContactHook hook : hooks) hook.addingContact(txn, contact);
+		for (ContactHook hook : hooks) {
+			if (hook.getApplicableContactTypes().contains(contact.getType()))
+				hook.addingContact(txn, contact);
+		}
 		return c;
 	}
 
@@ -92,7 +98,10 @@ class ContactManagerImpl implements ContactManager {
 				PRIVATE_MAILBOX);
 		keyManager.addContact(txn, c, master, timestamp, alice, true);
 		Contact contact = db.getContact(txn, c);
-		for (ContactHook hook : hooks) hook.addingContact(txn, contact);
+		for (ContactHook hook : hooks) {
+			if (hook.getApplicableContactTypes().contains(contact.getType()))
+				hook.addingContact(txn, contact);
+		}
 		return c;
 	}
 
@@ -104,7 +113,10 @@ class ContactManagerImpl implements ContactManager {
 				MAILBOX_OWNER);
 		keyManager.addContact(txn, c, master, timestamp, alice, true);
 		Contact contact = db.getContact(txn, c);
-		for (ContactHook hook : hooks) hook.addingContact(txn, contact);
+		for (ContactHook hook : hooks) {
+			if (hook.getApplicableContactTypes().contains(contact.getType()))
+				hook.addingContact(txn, contact);
+		}
 		return c;
 	}
 
@@ -231,7 +243,10 @@ class ContactManagerImpl implements ContactManager {
 	public void removeContact(Transaction txn, ContactId c)
 			throws DbException {
 		Contact contact = db.getContact(txn, c);
-		for (ContactHook hook : hooks) hook.removingContact(txn, contact);
+		for (ContactHook hook : hooks) {
+			if (hook.getApplicableContactTypes().contains(contact.getType()))
+				hook.removingContact(txn, contact);
+		}
 		db.removeContact(txn, c);
 	}
 
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 f30b8ce50d8b26c5f03c4f34b9880f938acfc842..2fd9a93b0f0f28b0bc9255a4bab0b5f2337a8ab6 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
@@ -70,8 +70,6 @@ import javax.annotation.concurrent.ThreadSafe;
 import javax.inject.Inject;
 
 import static java.util.logging.Level.WARNING;
-import static org.briarproject.bramble.api.contact.ContactType.MAILBOX_OWNER;
-import static org.briarproject.bramble.api.contact.ContactType.PRIVATE_MAILBOX;
 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.ValidationManager.State.DELIVERED;
@@ -185,20 +183,9 @@ class DatabaseComponentImpl<T> implements DatabaseComponent {
 			throw new ContactExistsException();
 		if (db.containsContact(txn, remote.getId(), local))
 			throw new ContactExistsException();
-		if (type == PRIVATE_MAILBOX &&
-				!db.getContactsByType(txn, PRIVATE_MAILBOX).isEmpty())
-			throw new ContactExistsException();
-		if (type == MAILBOX_OWNER &&
-				!db.getContactsByType(txn, MAILBOX_OWNER).isEmpty())
-			throw new ContactExistsException();
-		ContactId c =
-				db.addContact(txn, remote, local, verified, active, type);
-		transaction.attach(new
-
-				ContactAddedEvent(c, active));
-		if (active) transaction.attach(new
-
-				ContactStatusChangedEvent(c, true));
+		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 e81f2b9648d520b882e9b51094a304e2d706b1f7..fe8c402c160f9c4e49529a2f7727209c62e70721 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
@@ -1214,7 +1214,7 @@ abstract class JdbcDatabase implements Database<Connection> {
 			boolean verified = rs.getBoolean(6);
 			boolean active = rs.getBoolean(7);
 			ContactType type = null;
-			type = ContactType.fromLocaleValue(rs.getInt(8));
+			type = ContactType.fromLocalValue(rs.getInt(8));
 			rs.close();
 			ps.close();
 			Author author =
@@ -1252,7 +1252,7 @@ abstract class JdbcDatabase implements Database<Connection> {
 				AuthorId localAuthorId = new AuthorId(rs.getBytes(6));
 				boolean verified = rs.getBoolean(7);
 				boolean active = rs.getBoolean(8);
-				ContactType type = ContactType.fromLocaleValue(rs.getInt(9));
+				ContactType type = ContactType.fromLocalValue(rs.getInt(9));
 				contacts.add(ContactFactory
 						.createContact(contactId, author, localAuthorId,
 								verified, active, type));
@@ -1312,7 +1312,7 @@ abstract class JdbcDatabase implements Database<Connection> {
 				AuthorId localAuthorId = new AuthorId(rs.getBytes(5));
 				boolean verified = rs.getBoolean(6);
 				boolean active = rs.getBoolean(7);
-				ContactType type = ContactType.fromLocaleValue(rs.getInt(8));
+				ContactType type = ContactType.fromLocalValue(rs.getInt(8));
 				Author author =
 						new Author(remote, formatVersion, name, publicKey);
 				contacts.add(ContactFactory
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/properties/TransportPropertyManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/properties/TransportPropertyManagerImpl.java
index 4b4c360dbd4c2a07c02860e9427c17b8a75a9888..e94f28d8b8630e50215f2ea00a6a0b0ad0b46a6d 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/properties/TransportPropertyManagerImpl.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/properties/TransportPropertyManagerImpl.java
@@ -6,6 +6,7 @@ import org.briarproject.bramble.api.client.ContactGroupFactory;
 import org.briarproject.bramble.api.contact.Contact;
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.contact.ContactManager.ContactHook;
+import org.briarproject.bramble.api.contact.ContactType;
 import org.briarproject.bramble.api.data.BdfDictionary;
 import org.briarproject.bramble.api.data.BdfList;
 import org.briarproject.bramble.api.data.MetadataParser;
@@ -29,6 +30,8 @@ import org.briarproject.bramble.api.system.Clock;
 import org.briarproject.bramble.api.versioning.ClientVersioningManager;
 import org.briarproject.bramble.api.versioning.ClientVersioningManager.ClientVersioningHook;
 
+import java.util.Arrays;
+import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -96,6 +99,11 @@ class TransportPropertyManagerImpl implements TransportPropertyManager,
 		db.removeGroup(txn, getContactGroup(c));
 	}
 
+	@Override
+	public Collection<ContactType> getApplicableContactTypes() {
+		return Arrays.asList(ContactType.values());
+	}
+
 	@Override
 	public void onClientVisibilityChanging(Transaction txn, Contact c,
 			Visibility v) throws DbException {
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java
index 4c73abfe3787137a4a73231d86a27f32379be9d6..2ca444a15672dcf209ed6d99cf645cabc9c04b27 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/versioning/ClientVersioningManagerImpl.java
@@ -6,6 +6,7 @@ import org.briarproject.bramble.api.client.ContactGroupFactory;
 import org.briarproject.bramble.api.contact.Contact;
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.contact.ContactManager.ContactHook;
+import org.briarproject.bramble.api.contact.ContactType;
 import org.briarproject.bramble.api.data.BdfDictionary;
 import org.briarproject.bramble.api.data.BdfList;
 import org.briarproject.bramble.api.db.DatabaseComponent;
@@ -29,6 +30,7 @@ import org.briarproject.bramble.api.versioning.ClientMajorVersion;
 import org.briarproject.bramble.api.versioning.ClientVersioningManager;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
@@ -167,6 +169,11 @@ class ClientVersioningManagerImpl implements ClientVersioningManager, Client,
 		db.removeGroup(txn, getContactGroup(c));
 	}
 
+	@Override
+	public Collection<ContactType> getApplicableContactTypes() {
+		return Arrays.asList(ContactType.values());
+	}
+
 	@Override
 	public boolean incomingMessage(Transaction txn, Message m, Metadata meta)
 			throws DbException, InvalidMessageException {
diff --git a/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java
index c6fcbec0c12d686da89fb3a8c7a22ac75505905a..46f612e376cf05e2ac4b25cbb0489725cc04eb7a 100644
--- a/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/blog/BlogManagerImpl.java
@@ -4,6 +4,7 @@ import org.briarproject.bramble.api.FormatException;
 import org.briarproject.bramble.api.client.ClientHelper;
 import org.briarproject.bramble.api.contact.Contact;
 import org.briarproject.bramble.api.contact.ContactManager.ContactHook;
+import org.briarproject.bramble.api.contact.ContactType;
 import org.briarproject.bramble.api.data.BdfDictionary;
 import org.briarproject.bramble.api.data.BdfEntry;
 import org.briarproject.bramble.api.data.BdfList;
@@ -99,16 +100,16 @@ class BlogManagerImpl extends BdfIncomingMessageHook implements BlogManager,
 
 	@Override
 	public void removingContact(Transaction txn, Contact c) throws DbException {
-		switch (c.getType()) {
-			case PRIVATE_MAILBOX:
-			case MAILBOX_OWNER:
-				return;
-		}
 		Blog b = blogFactory.createBlog(c.getAuthor());
 		// TODO we might want to reconsider removing b, if otherwise shared
 		if (db.containsGroup(txn, b.getId())) removeBlog(txn, b);
 	}
 
+	@Override
+	public Collection<ContactType> getApplicableContactTypes() {
+		return Collections.singletonList(ContactType.CONTACT);
+	}
+
 	@Override
 	protected boolean incomingMessage(Transaction txn, Message m, BdfList list,
 			BdfDictionary meta) throws DbException, FormatException {
diff --git a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java
index 873527692b7bed6efd7a9748acb9bfa3f13bfdd3..0a330b2faee21529e11b76273c22864444d5a152 100644
--- a/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/introduction/IntroductionManagerImpl.java
@@ -7,6 +7,7 @@ import org.briarproject.bramble.api.contact.Contact;
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.contact.ContactManager;
 import org.briarproject.bramble.api.contact.ContactManager.ContactHook;
+import org.briarproject.bramble.api.contact.ContactType;
 import org.briarproject.bramble.api.data.BdfDictionary;
 import org.briarproject.bramble.api.data.BdfList;
 import org.briarproject.bramble.api.data.MetadataParser;
@@ -39,6 +40,7 @@ import org.briarproject.briar.introduction.IntroducerSession.Introducee;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -119,11 +121,6 @@ class IntroductionManagerImpl extends ConversationClientImpl
 
 	@Override
 	public void addingContact(Transaction txn, Contact c) throws DbException {
-		switch (c.getType()) {
-			case PRIVATE_MAILBOX:
-			case MAILBOX_OWNER:
-				return;
-		}
 		// Create a group to share with the contact
 		Group g = getContactGroup(c);
 		db.addGroup(txn, g);
@@ -143,11 +140,6 @@ class IntroductionManagerImpl extends ConversationClientImpl
 
 	@Override
 	public void removingContact(Transaction txn, Contact c) throws DbException {
-		switch (c.getType()) {
-			case PRIVATE_MAILBOX:
-			case MAILBOX_OWNER:
-				return;
-		}
 		removeSessionWithIntroducer(txn, c);
 		abortOrRemoveSessionWithIntroducee(txn, c);
 
@@ -155,6 +147,11 @@ class IntroductionManagerImpl extends ConversationClientImpl
 		db.removeGroup(txn, getContactGroup(c));
 	}
 
+	@Override
+	public Collection<ContactType> getApplicableContactTypes() {
+		return Collections.singletonList(ContactType.CONTACT);
+	}
+
 	@Override
 	public void onClientVisibilityChanging(Transaction txn, Contact c,
 			Visibility v) throws DbException {
diff --git a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java
index 555a209905a810fd57df4dd4df78691a427d170b..92973288abb7c55cf9e61fdbe31e72f6a8ce4bf0 100644
--- a/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/messaging/MessagingManagerImpl.java
@@ -6,6 +6,7 @@ import org.briarproject.bramble.api.client.ContactGroupFactory;
 import org.briarproject.bramble.api.contact.Contact;
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.contact.ContactManager.ContactHook;
+import org.briarproject.bramble.api.contact.ContactType;
 import org.briarproject.bramble.api.data.BdfDictionary;
 import org.briarproject.bramble.api.data.BdfList;
 import org.briarproject.bramble.api.data.MetadataParser;
@@ -30,6 +31,7 @@ import org.briarproject.briar.api.messaging.event.PrivateMessageReceivedEvent;
 import org.briarproject.briar.client.ConversationClientImpl;
 
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Map;
 
@@ -97,6 +99,11 @@ class MessagingManagerImpl extends ConversationClientImpl
 		db.removeGroup(txn, getContactGroup(c));
 	}
 
+	@Override
+	public Collection<ContactType> getApplicableContactTypes() {
+		return Arrays.asList(ContactType.values());
+	}
+
 	@Override
 	public void onClientVisibilityChanging(Transaction txn, Contact c,
 			Visibility v) throws DbException {
diff --git a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java
index fe0f1016f8e4aa45e17e1ba6d9a8e134068a99ea..b5a771970aef2f5249aa42b0167972cfea2f2d04 100644
--- a/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/privategroup/invitation/GroupInvitationManagerImpl.java
@@ -6,6 +6,7 @@ import org.briarproject.bramble.api.client.ContactGroupFactory;
 import org.briarproject.bramble.api.contact.Contact;
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.contact.ContactManager.ContactHook;
+import org.briarproject.bramble.api.contact.ContactType;
 import org.briarproject.bramble.api.data.BdfDictionary;
 import org.briarproject.bramble.api.data.BdfList;
 import org.briarproject.bramble.api.data.MetadataParser;
@@ -39,6 +40,7 @@ import org.briarproject.briar.client.ConversationClientImpl;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -113,11 +115,6 @@ class GroupInvitationManagerImpl extends ConversationClientImpl
 
 	@Override
 	public void addingContact(Transaction txn, Contact c) throws DbException {
-		switch (c.getType()) {
-			case PRIVATE_MAILBOX:
-			case MAILBOX_OWNER:
-				return;
-		}
 		// Create a group to share with the contact
 		Group g = getContactGroup(c);
 		db.addGroup(txn, g);
@@ -142,15 +139,15 @@ class GroupInvitationManagerImpl extends ConversationClientImpl
 
 	@Override
 	public void removingContact(Transaction txn, Contact c) throws DbException {
-		switch (c.getType()) {
-			case PRIVATE_MAILBOX:
-			case MAILBOX_OWNER:
-				return;
-		}
 		// Remove the contact group (all messages will be removed with it)
 		db.removeGroup(txn, getContactGroup(c));
 	}
 
+	@Override
+	public Collection<ContactType> getApplicableContactTypes() {
+		return Collections.singletonList(ContactType.CONTACT);
+	}
+
 	@Override
 	public Group getContactGroup(Contact c) {
 		return contactGroupFactory.createContactGroup(CLIENT_ID,
diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java
index 3d6ce01a674ae8d8ac11e4cc312dff857f9761c8..138be9bbecb49cc9591f84d912614a00b5e31da4 100644
--- a/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/sharing/BlogSharingManagerImpl.java
@@ -4,6 +4,7 @@ import org.briarproject.bramble.api.FormatException;
 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.ContactType;
 import org.briarproject.bramble.api.data.MetadataParser;
 import org.briarproject.bramble.api.db.DatabaseComponent;
 import org.briarproject.bramble.api.db.DbException;
@@ -20,6 +21,9 @@ import org.briarproject.briar.api.blog.BlogManager.RemoveBlogHook;
 import org.briarproject.briar.api.blog.BlogSharingManager;
 import org.briarproject.briar.api.client.MessageTracker;
 
+import java.util.Collection;
+import java.util.Collections;
+
 import javax.annotation.concurrent.Immutable;
 import javax.inject.Inject;
 
@@ -70,11 +74,6 @@ class BlogSharingManagerImpl extends SharingManagerImpl<Blog>
 
 	@Override
 	public void addingContact(Transaction txn, Contact c) throws DbException {
-		switch (c.getType()) {
-			case PRIVATE_MAILBOX:
-			case MAILBOX_OWNER:
-				return;
-		}
 		// Create a group to share with the contact
 		super.addingContact(txn, c);
 
@@ -92,6 +91,11 @@ class BlogSharingManagerImpl extends SharingManagerImpl<Blog>
 		}
 	}
 
+	@Override
+	public Collection<ContactType> getApplicableContactTypes() {
+		return Collections.singletonList(ContactType.CONTACT);
+	}
+
 	@Override
 	public void removingBlog(Transaction txn, Blog b) throws DbException {
 		removingShareable(txn, b);
diff --git a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java
index ef7f4d77a3a55f077ec6a4931ae4693efe2b9ac9..7b9c81867503c79356b8d12126c9df79270ba862 100644
--- a/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/sharing/SharingManagerImpl.java
@@ -6,6 +6,7 @@ import org.briarproject.bramble.api.client.ContactGroupFactory;
 import org.briarproject.bramble.api.contact.Contact;
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.contact.ContactManager.ContactHook;
+import org.briarproject.bramble.api.contact.ContactType;
 import org.briarproject.bramble.api.data.BdfDictionary;
 import org.briarproject.bramble.api.data.BdfList;
 import org.briarproject.bramble.api.data.MetadataParser;
@@ -36,6 +37,7 @@ import org.briarproject.briar.client.ConversationClientImpl;
 
 import java.util.ArrayList;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
@@ -104,10 +106,6 @@ abstract class SharingManagerImpl<S extends Shareable>
 
 	@Override
 	public void addingContact(Transaction txn, Contact c) throws DbException {
-		switch (c.getType()) {
-			case PRIVATE_MAILBOX:
-			case MAILBOX_OWNER:
-		}
 		// Create a group to share with the contact
 		Group g = getContactGroup(c);
 		db.addGroup(txn, g);
@@ -126,15 +124,15 @@ abstract class SharingManagerImpl<S extends Shareable>
 
 	@Override
 	public void removingContact(Transaction txn, Contact c) throws DbException {
-		switch (c.getType()) {
-			case PRIVATE_MAILBOX:
-			case MAILBOX_OWNER:
-				return;
-		}
 		// Remove the contact group (all messages will be removed with it)
 		db.removeGroup(txn, getContactGroup(c));
 	}
 
+	@Override
+	public Collection<ContactType> getApplicableContactTypes() {
+		return Collections.singletonList(ContactType.CONTACT);
+	}
+
 	@Override
 	public Group getContactGroup(Contact c) {
 		return contactGroupFactory.createContactGroup(getClientId(),