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 55e327bf1563c4b103cb52610ee091cb0815e2c8..74eac7db723e4da1066953b724573a26de937eb0 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
@@ -160,7 +160,7 @@ class ContactManagerImpl implements ContactManager {
 			throws DbException {
 		ContactId c = db.addContact(txn, remote, local, false, true,
 				CONTACT_MAILBOX);
-		keyManager.addContact(txn, c, master, timestamp, alice, true);
+		//keyManager.addContact(txn, c, master, timestamp, alice, true);
 		Contact contact = db.getContact(txn, c);
 		for (ContactHook hook : hooks) {
 			if (hook.getApplicableContactTypes().contains(contact.getType()))
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 9d91f9598c7bee32ccd88534d2b11f501f411883..d769f4af29217b02c411a3bd688c6f3612dffc63 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
@@ -2,7 +2,6 @@ package org.briarproject.bramble.mailbox;
 
 import org.briarproject.bramble.api.contact.ContactId;
 import org.briarproject.bramble.api.contact.ContactManager;
-import org.briarproject.bramble.api.contact.ContactType;
 import org.briarproject.bramble.api.contact.PrivateMailbox;
 import org.briarproject.bramble.api.contact.event.ContactAddedEvent;
 import org.briarproject.bramble.api.db.DatabaseComponent;
@@ -12,7 +11,6 @@ import org.briarproject.bramble.api.event.Event;
 import org.briarproject.bramble.api.event.EventBus;
 import org.briarproject.bramble.api.event.EventListener;
 import org.briarproject.bramble.api.lifecycle.IoExecutor;
-import org.briarproject.bramble.api.mailbox.MailboxConstants;
 import org.briarproject.bramble.api.mailbox.MailboxInfo;
 import org.briarproject.bramble.api.mailbox.MailboxManager;
 import org.briarproject.bramble.api.mailbox.MailboxService;
@@ -33,7 +31,6 @@ import java.security.SecureRandom;
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
-import java.util.Map;
 import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.Executor;
 import java.util.concurrent.Future;
@@ -246,6 +243,7 @@ public class MailboxServiceImpl implements MailboxService, EventListener {
 			for (TransportId transportId : transportOrder) {
 				if (!activePlugins.containsKey(transportId))
 					continue;
+				if(transportId != LanTcpConstants.ID)continue;
 
 				DuplexPlugin plugin = activePlugins.get(transportId);
 
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/sessions/AbstractMailboxSession.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/sessions/AbstractMailboxSession.java
index d39e05cf5441f77997c0e6802a71486154ae5cd5..5ca81fb5bfc77bde4acf204c417519809dedee43 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/sessions/AbstractMailboxSession.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/sessions/AbstractMailboxSession.java
@@ -6,6 +6,7 @@ import org.briarproject.bramble.api.db.DbException;
 import org.briarproject.bramble.api.db.Transaction;
 import org.briarproject.bramble.api.mailbox.MailboxConstants;
 import org.briarproject.bramble.api.mailbox.MailboxSession;
+import org.briarproject.bramble.api.plugin.LanTcpConstants;
 import org.briarproject.bramble.api.sync.SyncSession;
 import org.briarproject.bramble.api.sync.SyncSessionFactory;
 import org.briarproject.bramble.api.transport.KeyManager;
@@ -251,7 +252,7 @@ public abstract class AbstractMailboxSession implements MailboxSession {
 
 		StreamContext ctx =
 				keyManager
-						.getStreamContext(c, MailboxConstants.ID);
+						.getStreamContext(c, LanTcpConstants.ID);
 
 		if (ctx == null)
 			throw new IOException("Could not allocated stream context");
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/sessions/FeedableSyncInputStream.java b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/sessions/FeedableSyncInputStream.java
index e5310130fadc7232abf74a62cfbe66b7eb7779b6..0aa4b778d7bb8d13165a38aa04733e6f08efd918 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/mailbox/sessions/FeedableSyncInputStream.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/mailbox/sessions/FeedableSyncInputStream.java
@@ -8,13 +8,13 @@ import java.io.InputStream;
 public class FeedableSyncInputStream extends InputStream {
 	private ByteArrayOutputStream os = new ByteArrayOutputStream();
 	private boolean isEOF = false;
-	private byte[] activeBuffer = new byte[]{};
+	private byte[] activeBuffer = new byte[] {};
 	private int activeBufferPointer = 0;
 
 	@Override
 	public synchronized int read() throws IOException {
 		while (!hasBytes()) {
-			if(isEOF)
+			if (isEOF)
 				throw new EOFException();
 
 			try {
@@ -48,7 +48,6 @@ public class FeedableSyncInputStream extends InputStream {
 			throw new EOFException();
 
 		os.write(buffer);
-
 		this.notifyAll();
 	}
 
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/DuplexOutgoingSession.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/DuplexOutgoingSession.java
index 462be735b06443bc503d2ead34dad586df1831cc..f24908a57e3456d8b350810795010d3ffba02970 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/sync/DuplexOutgoingSession.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/DuplexOutgoingSession.java
@@ -14,6 +14,7 @@ import org.briarproject.bramble.api.lifecycle.event.LifecycleEvent;
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
 import org.briarproject.bramble.api.sync.Ack;
 import org.briarproject.bramble.api.sync.Message;
+import org.briarproject.bramble.api.sync.MessageId;
 import org.briarproject.bramble.api.sync.Offer;
 import org.briarproject.bramble.api.sync.Request;
 import org.briarproject.bramble.api.sync.SyncRecordWriter;
@@ -240,6 +241,11 @@ class DuplexOutgoingSession implements SyncSession, EventListener {
 				}
 				if (LOG.isLoggable(INFO))
 					LOG.info("Generated ack: " + (a != null));
+				if (a != null) {
+					LOG.info("Owner acked " + a.getMessageIds().size() +
+							" messages:");
+					for (MessageId id : a.getMessageIds()) LOG.info("\n" + id);
+				}
 				if (a != null) writerTasks.add(new WriteAck(a));
 			} catch (DbException e) {
 				logException(LOG, WARNING, e);
@@ -287,6 +293,12 @@ class DuplexOutgoingSession implements SyncSession, EventListener {
 				}
 				if (LOG.isLoggable(INFO))
 					LOG.info("Generated batch: " + (b != null));
+				if (b != null) {
+					LOG.info("Owner batched " + b.size() +
+							" messages:");
+					for (Message m : b)
+						LOG.info("\n" + m.getId() + " : " + m.getGroupId());
+				}
 				if (b != null) writerTasks.add(new WriteBatch(b));
 			} catch (DbException e) {
 				logException(LOG, WARNING, e);
@@ -332,8 +344,15 @@ class DuplexOutgoingSession implements SyncSession, EventListener {
 				} finally {
 					db.endTransaction(txn);
 				}
-				if (LOG.isLoggable(INFO))
+				if (LOG.isLoggable(INFO)) {
 					LOG.info("Generated offer: " + (o != null));
+					if (o != null) {
+						LOG.info("Owner offered " + o.getMessageIds().size() +
+								" messages:");
+						for (MessageId id : o.getMessageIds())
+							LOG.info("\n" + id);
+					}
+				}
 				if (o != null) writerTasks.add(new WriteOffer(o));
 			} catch (DbException e) {
 				logException(LOG, WARNING, e);
@@ -379,6 +398,11 @@ class DuplexOutgoingSession implements SyncSession, EventListener {
 				}
 				if (LOG.isLoggable(INFO))
 					LOG.info("Generated request: " + (r != null));
+				if (r != null) {
+					LOG.info("Owner requested " + r.getMessageIds().size() +
+							" messages:");
+					for (MessageId id : r.getMessageIds()) LOG.info("\n" + id);
+				}
 				if (r != null) writerTasks.add(new WriteRequest(r));
 			} catch (DbException e) {
 				logException(LOG, WARNING, e);
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/sync/IncomingSession.java b/bramble-core/src/main/java/org/briarproject/bramble/sync/IncomingSession.java
index 93ad805e1fdf11f68ea9ac9318dc26399062111c..bd2584e42ef90494a36a7b6ed80b4881601fbba6 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/sync/IncomingSession.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/sync/IncomingSession.java
@@ -15,6 +15,7 @@ import org.briarproject.bramble.api.lifecycle.event.LifecycleEvent;
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
 import org.briarproject.bramble.api.sync.Ack;
 import org.briarproject.bramble.api.sync.Message;
+import org.briarproject.bramble.api.sync.MessageId;
 import org.briarproject.bramble.api.sync.Offer;
 import org.briarproject.bramble.api.sync.Request;
 import org.briarproject.bramble.api.sync.SyncRecordReader;
@@ -71,15 +72,26 @@ class IncomingSession implements SyncSession, EventListener {
 				}
 				if (recordReader.hasAck()) {
 					Ack a = recordReader.readAck();
+					LOG.info("Owner ack " + a.getMessageIds().size() +
+							" offer of:");
+					for (MessageId id : a.getMessageIds()) LOG.info("\n" + id);
 					dbExecutor.execute(new ReceiveAck(a));
 				} else if (recordReader.hasMessage()) {
 					Message m = recordReader.readMessage();
+					LOG.info("Owner message received:" + m.getId() + " : " +
+							m.getGroupId());
 					dbExecutor.execute(new ReceiveMessage(m));
 				} else if (recordReader.hasOffer()) {
 					Offer o = recordReader.readOffer();
+					LOG.info("Owner received " + o.getMessageIds().size() +
+							" offer of:");
+					for (MessageId id : o.getMessageIds()) LOG.info("\n" + id);
 					dbExecutor.execute(new ReceiveOffer(o));
 				} else if (recordReader.hasRequest()) {
 					Request r = recordReader.readRequest();
+					LOG.info("Owner received " + r.getMessageIds().size() +
+							" request:");
+					for (MessageId id : r.getMessageIds()) LOG.info("\n" + id);
 					dbExecutor.execute(new ReceiveRequest(r));
 				} else {
 					// unknown records are ignored in RecordReader#eof()
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/transport/TransportKeyManagerImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/transport/TransportKeyManagerImpl.java
index 5784cb37830c70d418bc9a649979a3bcf1c824d7..bbf4bbd1bf9197c46d731db908b56628d2fbfe6d 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/transport/TransportKeyManagerImpl.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/transport/TransportKeyManagerImpl.java
@@ -276,6 +276,20 @@ class TransportKeyManagerImpl implements TransportKeyManager {
 			throws DbException {
 		lock.lock();
 		try {
+			StringBuilder s = new StringBuilder();
+			for (Byte b : tag) {
+				s.append(String.format("%02x", b));
+			}
+			LOG.info(s.toString() + "\n---------------");
+			for (Map.Entry<Bytes, TagContext> entry : inContexts.entrySet()) {
+				if (entry.getValue().contactId.getInt() == 2) {
+					 s = new StringBuilder();
+					for (Byte b : entry.getKey().getBytes()) {
+						s.append(String.format("%02x", b));
+					}
+					LOG.info(s.toString());
+				}
+			}
 			// Look up the incoming keys for the tag
 			TagContext tagCtx = inContexts.remove(new Bytes(tag));
 			if (tagCtx == null) return null;
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 e970b6f0dc033e0236065c2ffffbbbb7b32e0e6a..517bbb9bb1b5ce57aa32579212cde97076317b60 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
@@ -210,7 +210,7 @@ class IntroduceeProtocolEngine
 			if (timestamp == -1) throw new AssertionError();
 			contactManager.addContactMailbox(txn, s.getRemote().author,
 					localAuthor.getId(), new SecretKey(s.masterKey), timestamp,
-					true);
+					false);
 			// 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.
@@ -221,7 +221,7 @@ class IntroduceeProtocolEngine
 			//noinspection ConstantConditions
 			Map<TransportId, KeySetId> keys = keyManager
 					.addContact(txn, c.getId(), new SecretKey(s.masterKey),
-							timestamp, s.getLocal().alice, true);
+							timestamp, false, true);
 			// add signed transport properties for the contact
 			//noinspection ConstantConditions
 			transportPropertyManager.addRemoteProperties(txn, c.getId(),
diff --git a/briar-core/src/main/java/org/briarproject/briar/mailbox/MailboxIntroductionCryptoImpl.java b/briar-core/src/main/java/org/briarproject/briar/mailbox/MailboxIntroductionCryptoImpl.java
index 0de274163d683d1c98eb07d77d44d13c5d0111c3..7d510f9db28a98a1da69e1d85627ee285ac3d28f 100644
--- a/briar-core/src/main/java/org/briarproject/briar/mailbox/MailboxIntroductionCryptoImpl.java
+++ b/briar-core/src/main/java/org/briarproject/briar/mailbox/MailboxIntroductionCryptoImpl.java
@@ -72,7 +72,7 @@ class MailboxIntroductionCryptoImpl implements MailboxIntroductionCrypto {
 				s.getLocal().ephemeralPublicKey,
 				s.getLocal().ephemeralPrivateKey,
 				s.getRemote().ephemeralPublicKey,
-				s.getLocal().alice
+				true
 		);
 	}
 
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 b85ca3a82fecb7a01c082ed0a4a50773b13e51f3..9a67ab3de911ee18fd41cb10937ec298f9b49a85 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
@@ -476,6 +476,7 @@ class MailboxIntroductionManagerImpl extends BdfIncomingMessageHook
 		// Apply the client's visibility to the contact group
 		Group g = getContactGroup(c);
 		db.setGroupVisibility(txn, c.getId(), g.getId(), v);
+		LOG.info("MI visibility set to:" + v.name());
 	}
 
 	private static class StoredSession {
diff --git a/mailbox-core/src/main/java/org/briarproject/briar/mailbox/MailboxIntroductionCryptoImpl.java b/mailbox-core/src/main/java/org/briarproject/briar/mailbox/MailboxIntroductionCryptoImpl.java
index 0de274163d683d1c98eb07d77d44d13c5d0111c3..d888cc3c0df4d380fb9effe30e7dbc47c5b3c4d9 100644
--- a/mailbox-core/src/main/java/org/briarproject/briar/mailbox/MailboxIntroductionCryptoImpl.java
+++ b/mailbox-core/src/main/java/org/briarproject/briar/mailbox/MailboxIntroductionCryptoImpl.java
@@ -72,7 +72,7 @@ class MailboxIntroductionCryptoImpl implements MailboxIntroductionCrypto {
 				s.getLocal().ephemeralPublicKey,
 				s.getLocal().ephemeralPrivateKey,
 				s.getRemote().ephemeralPublicKey,
-				s.getLocal().alice
+				false
 		);
 	}
 
diff --git a/mailbox-core/src/main/java/org/briarproject/briar/mailbox/MailboxProtocolEngine.java b/mailbox-core/src/main/java/org/briarproject/briar/mailbox/MailboxProtocolEngine.java
index 7016570b81a985063b0c61e183459b79b964083f..29dfdeff91f3a9b13975010fdd6ba8910780b2cb 100644
--- a/mailbox-core/src/main/java/org/briarproject/briar/mailbox/MailboxProtocolEngine.java
+++ b/mailbox-core/src/main/java/org/briarproject/briar/mailbox/MailboxProtocolEngine.java
@@ -230,7 +230,7 @@ class MailboxProtocolEngine extends AbstractProtocolEngine<MailboxSession> {
 			//noinspection ConstantConditions
 			Map<TransportId, KeySetId> keys = keyManager
 					.addContact(txn, c.getId(), secretKey,
-							timestamp, s.getLocal().alice, true);
+							timestamp, true, true);
 			// add signed transport properties for the contact
 			//noinspection ConstantConditions
 			transportPropertyManager.addRemoteProperties(txn, c.getId(),