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 fb71f9a778b9c974dcdc14eea7adf0fd4216c2f9..d4f49af6ba16f692c67eb1e331f3c3a6bb15494d 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
@@ -244,6 +244,10 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask {
 			// Pseudonym exchange succeeded
 			LOG.info("Pseudonym exchange succeeded");
 			listener.contactExchangeSucceeded(remoteInfo.getAuthor());
+			connectionManager
+					.manageOutgoingConnection(contactId, transportId,
+							conn);
+			/*
 			// Reuse the connection as a transport connection
 			if (localType == CONTACT) {
 				connectionManager
@@ -252,6 +256,7 @@ class ContactExchangeTaskImpl extends Thread implements ContactExchangeTask {
 			} else {
 				tryToClose(conn);
 			}
+			*/
 		} catch (ContactExistsException e) {
 			logException(LOG, WARNING, e);
 			tryToClose(conn);
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxServiceImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxServiceImpl.java
index 7c9604cf85fba476f9bd5018ff7db8f35c6d8c5e..e4693373c302ee82d6dd98053287e28357102943 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxServiceImpl.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/MailboxServiceImpl.java
@@ -1,6 +1,5 @@
 package org.briarproject.bramble.mailbox;
 
-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.ContactType;
@@ -30,7 +29,6 @@ import org.briarproject.bramble.api.properties.TransportProperties;
 import org.briarproject.bramble.api.properties.TransportPropertyManager;
 import org.briarproject.bramble.api.system.Scheduler;
 
-import java.security.SecureRandom;
 import java.util.Collection;
 import java.util.Map;
 import java.util.concurrent.Executor;
@@ -44,7 +42,6 @@ import javax.inject.Inject;
 import static java.util.concurrent.TimeUnit.MILLISECONDS;
 import static java.util.logging.Level.INFO;
 import static java.util.logging.Level.WARNING;
-import static org.briarproject.bramble.api.contact.ContactType.PRIVATE_MAILBOX;
 import static org.briarproject.bramble.api.mailbox.MailboxConstants.POLLING_INTERVALL;
 import static org.briarproject.bramble.util.LogUtils.logException;
 
@@ -97,7 +94,7 @@ public class MailboxServiceImpl implements MailboxService, EventListener {
 
 		try {
 			PrivateMailbox mb = contactManager.getPrivateMailbox();
-			if (mb!=null)
+			if (mb != null)
 				privateMailboxId = mb.getId();
 		} catch (DbException e1) {
 			if (LOG.isLoggable(WARNING))
@@ -105,7 +102,7 @@ public class MailboxServiceImpl implements MailboxService, EventListener {
 		}
 		if (privateMailboxId != null)
 			hasPrivateMailbox.set(true);
-		
+
 		tryToRunLanMailboxFuture();
 		this.eventBus.addListener(this);
 	}
@@ -128,12 +125,12 @@ public class MailboxServiceImpl implements MailboxService, EventListener {
 			}
 		}
 
-		if (e instanceof ContactAddedEvent){
+		if (e instanceof ContactAddedEvent) {
 			if (hasPrivateMailbox.get())
 				return;
 			try {
 				PrivateMailbox mb = contactManager.getPrivateMailbox();
-				if (mb!=null)
+				if (mb != null)
 					privateMailboxId = mb.getId();
 			} catch (DbException e1) {
 				if (LOG.isLoggable(WARNING))
@@ -181,6 +178,7 @@ public class MailboxServiceImpl implements MailboxService, EventListener {
 
 		@Override
 		public void run() {
+			/*
 			if (hasPrivateMailbox.get() &&
 					!connectionRegistry.isConnected(privateMailboxId)) {
 				try {
@@ -190,7 +188,7 @@ public class MailboxServiceImpl implements MailboxService, EventListener {
 					return;
 				}
 			}
-
+*/
 			// Poll Contact mailboxes
 			Map<ContactId, TransportProperties> contacts;
 			Collection<MailboxInfo> contactMailboxes;
@@ -210,9 +208,15 @@ public class MailboxServiceImpl implements MailboxService, EventListener {
 					db.endTransaction(txn);
 			}
 
+
 			for (MailboxInfo mailboxInfo : contactMailboxes) {
 				if (mailboxInfo.getMailboxId() == null)
-					continue;
+					if (mailboxInfo.getMailboxId() == null &&
+							hasPrivateMailbox.get()) {
+						mailboxManager
+								.handleOwnerContactWithoutMailbox(mailboxInfo);
+						continue;
+					}
 				if (!connectionRegistry
 						.isConnected(mailboxInfo.getContactId())) {
 					TransportProperties mailboxTP =
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/plugin/ConnectionManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/plugin/ConnectionManagerImpl.java
index 4e7bf40241bf51e356b4acab8e83d47ffe4c78cd..a47357c0671d4c0d281f4f91502d9c4da688d513 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/plugin/ConnectionManagerImpl.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/plugin/ConnectionManagerImpl.java
@@ -273,10 +273,16 @@ class ConnectionManagerImpl implements ConnectionManager {
 				txn = db.startTransaction(true);
 				ContactType type = db.getContactType(txn, contactId);
 				switch (type) {
-					case MAILBOX_OWNER:
+					case MAILBOX_OWNER: {
 						mailboxManager.handleIncomingMailboxOwnerConnection(ctx,
 								transportId, reader, writer);
 						return;
+					}
+					case MAILBOX_CONTACT: {
+						mailboxManager.handleInomingOwnerContactConnection(ctx,
+								transportId, reader, writer);
+						return;
+					}
 					default:
 				}
 				db.commitTransaction(txn);
@@ -284,7 +290,7 @@ class ConnectionManagerImpl implements ConnectionManager {
 				logException(LOG, WARNING, e);
 				disposeReader(true, true);
 				return;
-			}finally {
+			} finally {
 				if (txn != null)
 					db.endTransaction(txn);
 			}
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 c2ad06076d8f2119315f414baf9d223b3a82a57a..c239fc311e75a986e98f79a4d2cda6f1d4a1b5e5 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
@@ -111,6 +111,7 @@ class IntroduceeProtocolEngine
 	private IntroduceeSession onRemoteRequest(Transaction txn,
 			IntroduceeSession s,
 			IntroduceeRequestMessage m) throws DbException {
+		LOG.info("IntroduceeRequest received");
 		// The dependency, if any, must be the last remote message
 		if (isInvalidDependency(s, m.getPreviousMessageId()))
 			return abort(txn, s);
@@ -196,6 +197,7 @@ class IntroduceeProtocolEngine
 	public IntroduceeSession onAuthMessage(Transaction txn,
 			IntroduceeSession s,
 			MailboxAuthMessage m) throws DbException, FormatException {
+		LOG.info("AuthMessage received");
 		// The dependency, if any, must be the last remote message
 		if (isInvalidDependency(s.getLastLocalMessageId(),
 				m.getPreviousMessageId()))
diff --git a/briar-core/src/main/java/org/briarproject/briar/mailbox/MailboxIntroductionManagerImpl.java b/briar-core/src/main/java/org/briarproject/briar/mailbox/MailboxIntroductionManagerImpl.java
index 4192afbe87cbaea64d606a0f3ca09f17651a44ae..b4080ff786c873c11e440244620e30ec7574fe8b 100644
--- a/briar-core/src/main/java/org/briarproject/briar/mailbox/MailboxIntroductionManagerImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/mailbox/MailboxIntroductionManagerImpl.java
@@ -41,9 +41,11 @@ import javax.annotation.Nullable;
 import javax.inject.Inject;
 
 import static org.briarproject.bramble.api.contact.ContactManager.ContactHook;
+import static org.briarproject.bramble.api.contact.ContactType.CONTACT;
 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.contact.ContactType.values;
+import static org.briarproject.bramble.api.sync.Group.Visibility;
 import static org.briarproject.bramble.api.versioning.ClientVersioningManager.ClientVersioningHook;
 import static org.briarproject.briar.api.mailbox.Role.INTRODUCEE;
 import static org.briarproject.briar.api.mailbox.Role.MAILBOX;
@@ -121,6 +123,7 @@ class MailboxIntroductionManagerImpl extends BdfIncomingMessageHook
 	@Override
 	protected boolean incomingMessage(Transaction txn, Message m, BdfList body,
 			BdfDictionary bdfMeta) throws DbException, FormatException {
+		LOG.info("Incoming message");
 		// For testing
 		ContactId introduceeId = getContactId(txn, m.getGroupId());
 		ContactType type = db.getContactType(txn, introduceeId);
@@ -316,9 +319,7 @@ class MailboxIntroductionManagerImpl extends BdfIncomingMessageHook
 	public void addingContact(Transaction txn, Contact c) throws DbException {
 		switch (c.getType()) {
 			case PRIVATE_MAILBOX:
-				break;
 			case MAILBOX_OWNER:
-				break;
 			case CONTACT:
 				contactAdded(txn, c);
 				break;
@@ -333,7 +334,7 @@ class MailboxIntroductionManagerImpl extends BdfIncomingMessageHook
 		Group g = getContactGroup(c);
 		db.addGroup(txn, g);
 		// Apply the client's visibility to the contact group
-		Group.Visibility client = clientVersioningManager
+		Visibility client = clientVersioningManager
 				.getClientVisibility(txn, c.getId(), CLIENT_ID, MAJOR_VERSION);
 		db.setGroupVisibility(txn, c.getId(), g.getId(), client);
 		// Attach the contact ID to the group
@@ -344,23 +345,7 @@ class MailboxIntroductionManagerImpl extends BdfIncomingMessageHook
 		} catch (FormatException e) {
 			throw new AssertionError(e);
 		}
-		Collection<Contact> pm = db.getContactsByType(txn, PRIVATE_MAILBOX);
-		if (pm.isEmpty()) return;
-		Collection<MailboxInfo> mailboxes = db.getContactMailboxes(txn);
-		for (MailboxInfo mailboxInfo : mailboxes) {
-			if (mailboxInfo.getContactId().equals(c.getId())) return;
-		}
-		ioExecutor.execute(
-				() -> {
-					try {
-						makeIntroduction((PrivateMailbox) pm.iterator().next(),
-								c,
-								clock.currentTimeMillis());
-					} catch (DbException e) {
-						LOG.warning(
-								"Mailbox introduction failed: " + e.toString());
-					}
-				});
+
 	}
 
 	@Override
@@ -386,6 +371,7 @@ class MailboxIntroductionManagerImpl extends BdfIncomingMessageHook
 	@Override
 	public void makeIntroduction(PrivateMailbox privateMailbox, Contact contact,
 			long timestamp) throws DbException {
+		LOG.info("Starting introduction");
 		Transaction txn = db.startTransaction(false);
 		try {
 			// Look up the session, if there is one
@@ -471,11 +457,29 @@ class MailboxIntroductionManagerImpl extends BdfIncomingMessageHook
 
 	@Override
 	public void onClientVisibilityChanging(Transaction txn, Contact c,
-			Group.Visibility v) throws DbException {
+			Visibility v) throws DbException {
 		if (!getApplicableContactTypes().contains(c.getType())) return;
 		// Apply the client's visibility to the contact group
 		Group g = getContactGroup(c);
 		db.setGroupVisibility(txn, c.getId(), g.getId(), v);
+		if (v == Visibility.VISIBLE && c.getType() == CONTACT) {
+			Collection<Contact> pm = db.getContactsByType(txn, PRIVATE_MAILBOX);
+			if (pm.isEmpty()) return;
+			Collection<MailboxInfo> mailboxes = db.getContactMailboxes(txn);
+			for (MailboxInfo mailboxInfo : mailboxes) {
+				if (mailboxInfo.getContactId().equals(c.getId())) return;
+			}
+			PrivateMailbox privateMailbox =
+					(PrivateMailbox) pm.iterator().next();
+			ioExecutor.execute(() -> {
+				try {
+					makeIntroduction(privateMailbox, c,
+							clock.currentTimeMillis());
+				} catch (DbException e) {
+					e.printStackTrace();
+				}
+			});
+		}
 	}
 
 	private static class StoredSession {
@@ -483,7 +487,8 @@ class MailboxIntroductionManagerImpl extends BdfIncomingMessageHook
 		private final MessageId storageId;
 		private final BdfDictionary bdfSession;
 
-		private StoredSession(MessageId storageId, BdfDictionary bdfSession) {
+		private StoredSession(MessageId storageId,
+				BdfDictionary bdfSession) {
 			this.storageId = storageId;
 			this.bdfSession = bdfSession;
 		}
diff --git a/briar-core/src/main/java/org/briarproject/briar/mailbox/MailboxProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/mailbox/MailboxProtocolEngine.java
index 82f96d31b011b12562df82bdec49a65b6a6d8bde..1abbd4f6a11a9a6b3399b45700e0950d0c8263e6 100644
--- a/briar-core/src/main/java/org/briarproject/briar/mailbox/MailboxProtocolEngine.java
+++ b/briar-core/src/main/java/org/briarproject/briar/mailbox/MailboxProtocolEngine.java
@@ -96,6 +96,7 @@ class MailboxProtocolEngine extends AbstractProtocolEngine<MailboxSession> {
 
 	private MailboxSession onRemoteRequest(Transaction txn, MailboxSession s,
 			RequestMessage m) throws DbException {
+		LOG.info("REmote request");
 		// The dependency, if any, must be the last remote message
 		if (isInvalidDependency(s, m.getPreviousMessageId()))
 			return abort(txn, s);
@@ -189,6 +190,7 @@ class MailboxProtocolEngine extends AbstractProtocolEngine<MailboxSession> {
 	@Override
 	public MailboxSession onIntroduceeAcceptMessage(Transaction txn,
 			MailboxSession s, IntroduceeAcceptMessage m) throws DbException {
+		LOG.info("Introducee accept");
 		// The dependency, if any, must be the last remote message
 		if (isInvalidDependency(s.getLastLocalMessageId(),
 				m.getPreviousMessageId()))
diff --git a/briar-core/src/main/java/org/briarproject/briar/mailbox/OwnerProtocolEngine.java b/briar-core/src/main/java/org/briarproject/briar/mailbox/OwnerProtocolEngine.java
index d54397a746a1fc2996973e31578478fa376fc2f9..d240c76a6d06edb5a82b8854f56b96a520540491 100644
--- a/briar-core/src/main/java/org/briarproject/briar/mailbox/OwnerProtocolEngine.java
+++ b/briar-core/src/main/java/org/briarproject/briar/mailbox/OwnerProtocolEngine.java
@@ -19,6 +19,8 @@ import org.briarproject.briar.api.client.ProtocolStateException;
 import org.briarproject.briar.api.mailbox.event.MailboxIntroductionResponseReceivedEvent;
 import org.briarproject.briar.api.mailbox.event.MailboxIntroductionSucceededEvent;
 
+import java.util.logging.Logger;
+
 import javax.inject.Inject;
 
 import static org.briarproject.briar.mailbox.OwnerState.ADDED;
@@ -28,6 +30,9 @@ import static org.briarproject.briar.mailbox.OwnerState.AWAIT_RESPONSE_M;
 
 class OwnerProtocolEngine extends AbstractProtocolEngine<OwnerSession> {
 
+	private final static Logger LOG =
+			Logger.getLogger(OwnerProtocolEngine.class.getName());
+
 	@Inject
 	OwnerProtocolEngine(DatabaseComponent db, ClientHelper clientHelper,
 			ContactManager contactManager,
@@ -113,6 +118,7 @@ class OwnerProtocolEngine extends AbstractProtocolEngine<OwnerSession> {
 
 	private OwnerSession onMailboxAccept(Transaction txn, OwnerSession s,
 			MailboxAcceptMessage m) throws DbException {
+		LOG.info("Mailbox accept");
 		// The dependency, if any, must be the last remote message
 		if (isInvalidDependency(s.getMailbox().lastRemoteMessageId,
 				m.getPreviousMessageId())) return abort(txn, s);
@@ -139,6 +145,7 @@ class OwnerProtocolEngine extends AbstractProtocolEngine<OwnerSession> {
 	@Override
 	public OwnerSession onAuthMessage(Transaction txn, OwnerSession s,
 			MailboxAuthMessage m) throws DbException, FormatException {
+		LOG.info("AUth message");
 		// The dependency, if any, must be the last remote message
 		if (isInvalidDependency(s.getMailbox().getLastLocalMessageId(),
 				m.getPreviousMessageId())) return abort(txn, s);
@@ -166,6 +173,7 @@ class OwnerProtocolEngine extends AbstractProtocolEngine<OwnerSession> {
 	@Override
 	public OwnerSession onIntroduceeAcceptMessage(Transaction txn,
 			OwnerSession s, IntroduceeAcceptMessage m) throws DbException {
+		LOG.info("IntroduceeAccept");
 		// The dependency, if any, must be the last remote message
 		if (isInvalidDependency(s.getIntroducee().getLastLocalMessageId(),
 				m.getPreviousMessageId())) return abort(txn, s);
@@ -185,6 +193,7 @@ class OwnerProtocolEngine extends AbstractProtocolEngine<OwnerSession> {
 
 	private OwnerSession onLocalRequest(Transaction txn, OwnerSession s,
 			long timestamp) throws DbException {
+		LOG.info("Local Request");
 		// Send REQUEST messages
 		long maxIntroduceeTimestamp =
 				Math.max(getLocalTimestamp(s, s.getMailbox()),