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 b12c19c9927b4ff4b00668daaa047cde8d0a9e4f..ab3eb6eaeb29cb95f7ae4036c9f758bf3849e0e9 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
@@ -19,6 +19,9 @@ public interface ContactFactory {
 			case MAILBOX_OWNER:
 				return new MailboxOwner(c, author, localAuthorId, verified,
 						active);
+			case CONTACT_MAILBOX:
+				return new ContactMailbox(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/ContactMailbox.java b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactMailbox.java
new file mode 100644
index 0000000000000000000000000000000000000000..6a044b94b79f3ce1648ab62ff91064308832176c
--- /dev/null
+++ b/bramble-api/src/main/java/org/briarproject/bramble/api/contact/ContactMailbox.java
@@ -0,0 +1,26 @@
+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 javax.annotation.concurrent.Immutable;
+
+import static org.briarproject.bramble.api.contact.ContactType.CONTACT_MAILBOX;
+
+@Immutable
+@NotNullByDefault
+public class ContactMailbox extends Contact {
+
+	public ContactMailbox(ContactId id,
+			Author author,
+			AuthorId localAuthorId,
+			boolean verified, boolean active) {
+		super(id, author, localAuthorId, verified, active);
+	}
+
+	@Override
+	public ContactType getType() {
+		return CONTACT_MAILBOX;
+	}
+}
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 e2b3299e14543292eee42dd6e88db22e4a240bf5..b2b40209d2060d400ea1241897000abcb3d9c117 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
@@ -66,6 +66,10 @@ public interface ContactManager {
 			SecretKey secretKey, long currentTimeMillis, boolean alice)
 			throws DbException;
 
+	ContactId addContactMailbox(Transaction txn, Author remote,
+			AuthorId local, SecretKey master, long timestamp, boolean alice)
+			throws DbException;
+
 	/**
 	 * Returns the contact with the given ID.
 	 */
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 f6b8fb515f21a14be862866ba15b6f0ca5d32a30..55e327bf1563c4b103cb52610ee091cb0815e2c8 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
@@ -24,6 +24,7 @@ import javax.annotation.concurrent.ThreadSafe;
 import javax.inject.Inject;
 
 import static org.briarproject.bramble.api.contact.ContactType.CONTACT;
+import static org.briarproject.bramble.api.contact.ContactType.CONTACT_MAILBOX;
 import static org.briarproject.bramble.api.contact.ContactType.MAILBOX_OWNER;
 import static org.briarproject.bramble.api.contact.ContactType.PRIVATE_MAILBOX;
 
@@ -153,6 +154,21 @@ class ContactManagerImpl implements ContactManager {
 		return c;
 	}
 
+	@Override
+	public ContactId addContactMailbox(Transaction txn, Author remote,
+			AuthorId local, SecretKey master, long timestamp, boolean alice)
+			throws DbException {
+		ContactId c = db.addContact(txn, remote, local, false, true,
+				CONTACT_MAILBOX);
+		keyManager.addContact(txn, c, master, timestamp, alice, true);
+		Contact contact = db.getContact(txn, c);
+		for (ContactHook hook : hooks) {
+			if (hook.getApplicableContactTypes().contains(contact.getType()))
+				hook.addingContact(txn, contact);
+		}
+		return c;
+	}
+
 	@Override
 	public Contact getContact(ContactId c) throws DbException {
 		Contact contact;
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 132f3b8de0c1a42aaad7f4257d26643236c9027f..a185633c75f8b76bc800050846075aab4f022122 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
@@ -996,7 +996,7 @@ abstract class JdbcDatabase implements Database<Connection> {
 			ps = txn.prepareStatement(sql);
 			ps.setInt(1, contactId.getInt());
 			if (mailboxId == null) ps.setNull(2, INTEGER);
-			else ps.setInt(1, mailboxId.getInt());
+			else ps.setInt(2, mailboxId.getInt());
 			if (aliasId == null) ps.setNull(3, INTEGER);
 			else ps.setInt(3, aliasId.getInt());
 			int affected = ps.executeUpdate();
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/Poller.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/Poller.java
index 8b140969c714b4d85c2b1333f3cfa1440493f14c..38422eb9af88a467d5ff6f3749d1f2da873b40ce 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/Poller.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/Poller.java
@@ -111,10 +111,12 @@ class Poller implements EventListener {
 	}
 
 	private void connectToContact(ContactId c) {
+		/*
 		for (SimplexPlugin s : pluginManager.getSimplexPlugins())
 			if (s.shouldPoll()) connectToContact(c, s);
 		for (DuplexPlugin d : pluginManager.getDuplexPlugins())
 			if (d.shouldPoll()) connectToContact(c, d);
+			*/
 	}
 
 	private void connectToContact(ContactId c, TransportId t) {
diff --git a/briar-core/src/main/java/org/briarproject/briar/mailbox/IntroduceeProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/mailbox/IntroduceeProtocolEngine.java
index 39c5d6302ca4f9042f326e80b6d1441a44f81e50..e970b6f0dc033e0236065c2ffffbbbb7b32e0e6a 100644
--- a/briar-core/src/main/java/org/briarproject/briar/mailbox/IntroduceeProtocolEngine.java
+++ b/briar-core/src/main/java/org/briarproject/briar/mailbox/IntroduceeProtocolEngine.java
@@ -33,7 +33,6 @@ import javax.annotation.Nullable;
 import javax.inject.Inject;
 
 import static java.util.logging.Level.WARNING;
-import static org.briarproject.bramble.api.contact.ContactType.CONTACT_MAILBOX;
 import static org.briarproject.bramble.util.LogUtils.logException;
 import static org.briarproject.briar.mailbox.IntroduceeState.AWAIT_AUTH;
 import static org.briarproject.briar.mailbox.IntroduceeState.LOCAL_ACCEPTED;
@@ -209,8 +208,9 @@ class IntroduceeProtocolEngine
 			long timestamp = Math.min(s.getLocal().acceptTimestamp,
 					s.getRemote().acceptTimestamp);
 			if (timestamp == -1) throw new AssertionError();
-			db.addContact(txn, s.getRemote().author, localAuthor.getId(), false,
-					true, CONTACT_MAILBOX);
+			contactManager.addContactMailbox(txn, s.getRemote().author,
+					localAuthor.getId(), new SecretKey(s.masterKey), timestamp,
+					true);
 			// 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
 			// that were contacts already at some point in the past.
@@ -226,6 +226,10 @@ class IntroduceeProtocolEngine
 			//noinspection ConstantConditions
 			transportPropertyManager.addRemoteProperties(txn, c.getId(),
 					m.getTransportProperties());
+			Contact owner = contactManager
+					.getContact(txn, s.getIntroducer().getId(),
+							localAuthor.getId());
+			db.setMailboxForContact(txn, owner.getId(), c.getId(), null);
 			// Broadcast MailboxIntroductionSucceededEvent, because contact got added
 			MailboxIntroductionSucceededEvent e =
 					new MailboxIntroductionSucceededEvent(c);