diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxManager.java b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxManager.java
index 380fecec54b09fcbb404730fff0f9b0b20743adf..3a0a14acb45aed08ed28dba1f45e485a9efb7ad7 100644
--- a/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxManager.java
+++ b/bramble-api/src/main/java/org/briarproject/bramble/api/mailbox/MailboxManager.java
@@ -23,4 +23,6 @@ public interface MailboxManager {
 	void handleIncomingMailboxOwnerConnection(StreamContext ctx,
 			TransportId transportId, TransportConnectionReader reader,
 			TransportConnectionWriter writer);
+
+	void handleOwnerContactWithoutMailbox(MailboxInfo mailboxInfo);
 }
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/PrivateMailboxSession.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/PrivateMailboxSession.java
index 044f2432abcc2d33c93e0b58146f12a21ac18da3..cef10a8b62ee6a87417878ab5009b9cc1c9936d7 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/PrivateMailboxSession.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/PrivateMailboxSession.java
@@ -1,25 +1,30 @@
 package org.briarproject.bramble.mailbox;
 
 import org.briarproject.bramble.api.contact.ContactId;
+import org.briarproject.bramble.api.db.DbException;
+import org.briarproject.bramble.api.mailbox.MailboxInfo;
+import org.briarproject.bramble.api.sync.SyncSession;
 import org.briarproject.bramble.api.sync.SyncSessionFactory;
 import org.briarproject.bramble.api.transport.KeyManager;
 import org.briarproject.bramble.api.transport.StreamReaderFactory;
 import org.briarproject.bramble.api.transport.StreamWriterFactory;
 import org.briarproject.bramble.mailbox.protocol.MailboxProtocol;
+import org.briarproject.bramble.mailbox.protocol.MailboxRequest;
 import org.briarproject.bramble.mailbox.protocol.MailboxRequestStore;
-import org.briarproject.bramble.mailbox.protocol.MailboxRequestSync;
-import org.briarproject.bramble.mailbox.protocol.MailboxRequestTake;
 
 import java.io.IOException;
+import java.net.ProtocolException;
 import java.util.concurrent.Executor;
 import java.util.logging.Logger;
 
+import static java.util.logging.Level.INFO;
 import static java.util.logging.Level.WARNING;
 import static org.briarproject.bramble.util.LogUtils.logException;
 
-class PrivateMailboxSession extends MailboxSession {
+class PrivateMailboxSession extends AbstractMailboxSession {
 	private static final Logger LOG =
 			Logger.getLogger(PrivateMailboxSession.class.getName());
+	private MailboxProtocol mailboxProtocol;
 
 	public PrivateMailboxSession(ContactId contactId, Executor ioExecutor,
 			KeyManager keyManager,
@@ -32,29 +37,53 @@ class PrivateMailboxSession extends MailboxSession {
 		super(ioExecutor, keyManager, syncSessionFactory, streamWriterFactory,
 				streamReaderFactory, mailboxProtocol, transportMaxLatency,
 				transportMaxIdleTime, contactId);
+		this.mailboxProtocol = mailboxProtocol;
 	}
 
+	/**
+	 * Stores messages on the private mailbox for a contact
+	 * who does not have a mailbox
+	 */
+	public void handleOwnerContact(MailboxInfo mailboxInfo) {
+		byte[] encryptedStream;
+		try {
+			encryptedStream =
+					getSyncStreamToStore(mailboxInfo.getContactId());
+		} catch (DbException | IOException e) {
+			logException(LOG, WARNING, e);
+			return;
+		}
 
-	@Override
-	public void run() {
-		ioExecutor.execute(() -> super.readRequests());
-		runDuplexOutgoingSession();
+		MailboxRequest req =
+				new MailboxRequestStore(mailboxInfo.getAliasId(),
+						encryptedStream);
+		try {
+			mailboxProtocol.writeRequest(req);
+			if (!req.awaitAndGetResponse())
+				throw new ProtocolException(req.getError());
+		} catch (InterruptedException | IOException e) {
+			// TODO: Handle STORE error!
+			if (LOG.isLoggable(INFO))
+				LOG.info(req.getError());
+		}
 	}
 
 	@Override
-	public void handleSync(MailboxRequestSync req) {
+	public void run() throws IOException {
+		ioExecutor.execute(() -> super.readRequests());
+		createDuplexOutgoingSession().run();
 		try {
-			handleSyncStream(req.getSyncStream());
-		} catch (IOException e) {
-			logException(LOG, WARNING, e);
+			endSession();
+		} catch (InterruptedException e) {
+			throw new IOException("Interrupted while ending session");
 		}
 	}
 
 	@Override
-	public void handleStore(MailboxRequestStore mailboxRequestStore) {
+	public void handleStore(MailboxRequestStore req)
+			throws MailboxSessionHandleException {
+		throw new MailboxSessionHandleException(
+				"Private Mailbox Session does not support the TAKE request");
 	}
 
-	@Override
-	public void handleTake(MailboxRequestTake mailboxRequestTake) {
-	}
 }