diff --git a/briar-core/src/net/sf/briar/invitation/AliceConnector.java b/briar-core/src/net/sf/briar/invitation/AliceConnector.java
index 5e72fc30e291518365228744154fde7177d84c4a..ad49087a1d0c1a0374ee2ba3da920b80dce0b090 100644
--- a/briar-core/src/net/sf/briar/invitation/AliceConnector.java
+++ b/briar-core/src/net/sf/briar/invitation/AliceConnector.java
@@ -28,6 +28,7 @@ import net.sf.briar.api.serial.Reader;
 import net.sf.briar.api.serial.ReaderFactory;
 import net.sf.briar.api.serial.Writer;
 import net.sf.briar.api.serial.WriterFactory;
+import net.sf.briar.api.transport.ConnectionDispatcher;
 import net.sf.briar.api.transport.ConnectionReader;
 import net.sf.briar.api.transport.ConnectionReaderFactory;
 import net.sf.briar.api.transport.ConnectionWriter;
@@ -43,13 +44,15 @@ class AliceConnector extends Connector {
 			ReaderFactory readerFactory, WriterFactory writerFactory,
 			ConnectionReaderFactory connectionReaderFactory,
 			ConnectionWriterFactory connectionWriterFactory,
-			AuthorFactory authorFactory, KeyManager keyManager, Clock clock,
+			AuthorFactory authorFactory, KeyManager keyManager,
+			ConnectionDispatcher connectionDispatcher, Clock clock,
 			ConnectorGroup group, DuplexPlugin plugin, LocalAuthor localAuthor,
 			Map<TransportId, TransportProperties> localProps,
 			PseudoRandom random) {
 		super(crypto, db, readerFactory, writerFactory, connectionReaderFactory,
-				connectionWriterFactory, authorFactory, keyManager, clock,
-				group, plugin, localAuthor, localProps, random);
+				connectionWriterFactory, authorFactory, keyManager,
+				connectionDispatcher, clock, group, plugin, localAuthor,
+				localProps, random);
 	}
 
 	@Override
@@ -171,6 +174,7 @@ class AliceConnector extends Connector {
 		if(LOG.isLoggable(INFO))
 			LOG.info(pluginName + " pseudonym exchange succeeded");
 		group.pseudonymExchangeSucceeded(remoteAuthor);
-		tryToClose(conn, false);
+		// Reuse the connection as an outgoing BTP connection
+		reuseConnection(conn, true);
 	}
 }
\ No newline at end of file
diff --git a/briar-core/src/net/sf/briar/invitation/BobConnector.java b/briar-core/src/net/sf/briar/invitation/BobConnector.java
index db759e3e17b180609ce2d9b0dd9a2e0ac5081cf0..a86b1ea01359756f3a289f795a3f620cd9f3dd46 100644
--- a/briar-core/src/net/sf/briar/invitation/BobConnector.java
+++ b/briar-core/src/net/sf/briar/invitation/BobConnector.java
@@ -28,6 +28,7 @@ import net.sf.briar.api.serial.Reader;
 import net.sf.briar.api.serial.ReaderFactory;
 import net.sf.briar.api.serial.Writer;
 import net.sf.briar.api.serial.WriterFactory;
+import net.sf.briar.api.transport.ConnectionDispatcher;
 import net.sf.briar.api.transport.ConnectionReader;
 import net.sf.briar.api.transport.ConnectionReaderFactory;
 import net.sf.briar.api.transport.ConnectionWriter;
@@ -43,13 +44,15 @@ class BobConnector extends Connector {
 			ReaderFactory readerFactory, WriterFactory writerFactory,
 			ConnectionReaderFactory connectionReaderFactory,
 			ConnectionWriterFactory connectionWriterFactory,
-			AuthorFactory authorFactory, KeyManager keyManager, Clock clock,
+			AuthorFactory authorFactory, KeyManager keyManager,
+			ConnectionDispatcher connectionDispatcher, Clock clock,
 			ConnectorGroup group, DuplexPlugin plugin, LocalAuthor localAuthor,
 			Map<TransportId, TransportProperties> localProps,
 			PseudoRandom random) {
 		super(crypto, db, readerFactory, writerFactory, connectionReaderFactory,
-				connectionWriterFactory, authorFactory, keyManager, clock,
-				group, plugin, localAuthor, localProps, random);
+				connectionWriterFactory, authorFactory, keyManager,
+				connectionDispatcher, clock, group, plugin, localAuthor,
+				localProps, random);
 	}
 
 	@Override
@@ -171,6 +174,7 @@ class BobConnector extends Connector {
 		if(LOG.isLoggable(INFO))
 			LOG.info(pluginName + " pseudonym exchange succeeded");
 		group.pseudonymExchangeSucceeded(remoteAuthor);
-		tryToClose(conn, false);
+		// Reuse the connection as an incoming BTP connection
+		reuseConnection(conn, false);
 	}
 }
diff --git a/briar-core/src/net/sf/briar/invitation/Connector.java b/briar-core/src/net/sf/briar/invitation/Connector.java
index e938f6f0cda5fa14a8cc50bd434a8efc01fb3701..e54f1518d8f430e779d3caaedababe9ea0ecc508 100644
--- a/briar-core/src/net/sf/briar/invitation/Connector.java
+++ b/briar-core/src/net/sf/briar/invitation/Connector.java
@@ -48,6 +48,7 @@ import net.sf.briar.api.serial.Reader;
 import net.sf.briar.api.serial.ReaderFactory;
 import net.sf.briar.api.serial.Writer;
 import net.sf.briar.api.serial.WriterFactory;
+import net.sf.briar.api.transport.ConnectionDispatcher;
 import net.sf.briar.api.transport.ConnectionReaderFactory;
 import net.sf.briar.api.transport.ConnectionWriterFactory;
 import net.sf.briar.api.transport.Endpoint;
@@ -65,6 +66,7 @@ abstract class Connector extends Thread {
 	protected final ConnectionWriterFactory connectionWriterFactory;
 	protected final AuthorFactory authorFactory;
 	protected final KeyManager keyManager;
+	protected final ConnectionDispatcher connectionDispatcher;
 	protected final Clock clock;
 	protected final ConnectorGroup group;
 	protected final DuplexPlugin plugin;
@@ -77,11 +79,14 @@ abstract class Connector extends Thread {
 	private final KeyParser keyParser;
 	private final MessageDigest messageDigest;
 
+	private volatile ContactId contactId = null;
+
 	Connector(CryptoComponent crypto, DatabaseComponent db,
 			ReaderFactory readerFactory, WriterFactory writerFactory,
 			ConnectionReaderFactory connectionReaderFactory,
 			ConnectionWriterFactory connectionWriterFactory,
-			AuthorFactory authorFactory, KeyManager keyManager, Clock clock,
+			AuthorFactory authorFactory, KeyManager keyManager,
+			ConnectionDispatcher connectionDispatcher, Clock clock,
 			ConnectorGroup group, DuplexPlugin plugin, LocalAuthor localAuthor,
 			Map<TransportId, TransportProperties> localProps,
 			PseudoRandom random) {
@@ -94,6 +99,7 @@ abstract class Connector extends Thread {
 		this.connectionWriterFactory = connectionWriterFactory;
 		this.authorFactory = authorFactory;
 		this.keyManager = keyManager;
+		this.connectionDispatcher = connectionDispatcher;
 		this.clock = clock;
 		this.group = group;
 		this.plugin = plugin;
@@ -275,11 +281,11 @@ abstract class Connector extends Thread {
 			Map<TransportId, TransportProperties> remoteProps,  byte[] secret,
 			long epoch, boolean alice) throws DbException {
 		// Add the contact to the database
-		ContactId c = db.addContact(remoteAuthor, localAuthor.getId());
+		contactId = db.addContact(remoteAuthor, localAuthor.getId());
 		// Add a positive rating for the contact's pseudonym
 		db.setRating(remoteAuthor.getId(), GOOD);
 		// Store the remote transport properties
-		db.setRemoteProperties(c, remoteProps);
+		db.setRemoteProperties(contactId, remoteProps);
 		// Create an endpoint for each transport shared with the contact
 		List<TransportId> ids = new ArrayList<TransportId>();
 		for(TransportId id : localProps.keySet())
@@ -288,7 +294,7 @@ abstract class Connector extends Thread {
 		Collections.sort(ids, TransportIdComparator.INSTANCE);
 		int size = ids.size();
 		for(int i = 0; i < size; i++) {
-			Endpoint ep = new Endpoint(c, ids.get(i), epoch, alice);
+			Endpoint ep = new Endpoint(contactId, ids.get(i), epoch, alice);
 			try {
 				db.addEndpoint(ep);
 			} catch(NoSuchTransportException e) {
@@ -308,6 +314,15 @@ abstract class Connector extends Thread {
 		}
 	}
 
+	protected void reuseConnection(DuplexTransportConnection conn,
+			boolean alice) {
+		if(contactId == null) throw new IllegalStateException();
+		TransportId t = plugin.getId();
+		if(alice)
+			connectionDispatcher.dispatchOutgoingConnection(contactId, t, conn);
+		else connectionDispatcher.dispatchIncomingConnection(t, conn);
+	}
+
 	private static class TransportIdComparator
 	implements Comparator<TransportId> {
 
diff --git a/briar-core/src/net/sf/briar/invitation/ConnectorGroup.java b/briar-core/src/net/sf/briar/invitation/ConnectorGroup.java
index cc0602789d4cba4e5976f69fddf935a03e074de4..a96b1b556e94adab2fd6c16cb44a25f8f5b5dc6d 100644
--- a/briar-core/src/net/sf/briar/invitation/ConnectorGroup.java
+++ b/briar-core/src/net/sf/briar/invitation/ConnectorGroup.java
@@ -31,6 +31,7 @@ import net.sf.briar.api.plugins.PluginManager;
 import net.sf.briar.api.plugins.duplex.DuplexPlugin;
 import net.sf.briar.api.serial.ReaderFactory;
 import net.sf.briar.api.serial.WriterFactory;
+import net.sf.briar.api.transport.ConnectionDispatcher;
 import net.sf.briar.api.transport.ConnectionReaderFactory;
 import net.sf.briar.api.transport.ConnectionWriterFactory;
 
@@ -48,6 +49,7 @@ class ConnectorGroup extends Thread implements InvitationTask {
 	private final ConnectionWriterFactory connectionWriterFactory;
 	private final AuthorFactory authorFactory;
 	private final KeyManager keyManager;
+	private final ConnectionDispatcher connectionDispatcher;
 	private final Clock clock;
 	private final PluginManager pluginManager;
 	private final AuthorId localAuthorId;
@@ -72,7 +74,8 @@ class ConnectorGroup extends Thread implements InvitationTask {
 			ReaderFactory readerFactory, WriterFactory writerFactory,
 			ConnectionReaderFactory connectionReaderFactory,
 			ConnectionWriterFactory connectionWriterFactory,
-			AuthorFactory authorFactory, KeyManager keyManager, Clock clock,
+			AuthorFactory authorFactory, KeyManager keyManager,
+			ConnectionDispatcher connectionDispatcher, Clock clock,
 			PluginManager pluginManager, AuthorId localAuthorId,
 			int localInvitationCode, int remoteInvitationCode) {
 		super("ConnectorGroup");
@@ -84,6 +87,7 @@ class ConnectorGroup extends Thread implements InvitationTask {
 		this.connectionWriterFactory = connectionWriterFactory;
 		this.authorFactory = authorFactory;
 		this.keyManager = keyManager;
+		this.connectionDispatcher = connectionDispatcher;
 		this.clock = clock;
 		this.pluginManager = pluginManager;
 		this.localAuthorId = localAuthorId;
@@ -167,8 +171,8 @@ class ConnectorGroup extends Thread implements InvitationTask {
 				remoteInvitationCode);
 		return new AliceConnector(crypto, db, readerFactory, writerFactory,
 				connectionReaderFactory, connectionWriterFactory, authorFactory,
-				keyManager, clock, this, plugin, localAuthor, localProps,
-				random);
+				keyManager, connectionDispatcher, clock, this, plugin,
+				localAuthor, localProps, random);
 	}
 
 	private Connector createBobConnector(DuplexPlugin plugin,
@@ -178,8 +182,8 @@ class ConnectorGroup extends Thread implements InvitationTask {
 				localInvitationCode);
 		return new BobConnector(crypto, db, readerFactory, writerFactory,
 				connectionReaderFactory, connectionWriterFactory, authorFactory,
-				keyManager, clock, this, plugin, localAuthor, localProps,
-				random);
+				keyManager, connectionDispatcher, clock, this, plugin,
+				localAuthor, localProps, random);
 	}
 
 	public void localConfirmationSucceeded() {
diff --git a/briar-core/src/net/sf/briar/invitation/InvitationTaskFactoryImpl.java b/briar-core/src/net/sf/briar/invitation/InvitationTaskFactoryImpl.java
index 62ffa37cf2b11a5ed12e01c41c7bd907d0ba2afa..66d5d649f43568852b83ff043dde0a88fb6a596c 100644
--- a/briar-core/src/net/sf/briar/invitation/InvitationTaskFactoryImpl.java
+++ b/briar-core/src/net/sf/briar/invitation/InvitationTaskFactoryImpl.java
@@ -11,6 +11,7 @@ import net.sf.briar.api.invitation.InvitationTaskFactory;
 import net.sf.briar.api.plugins.PluginManager;
 import net.sf.briar.api.serial.ReaderFactory;
 import net.sf.briar.api.serial.WriterFactory;
+import net.sf.briar.api.transport.ConnectionDispatcher;
 import net.sf.briar.api.transport.ConnectionReaderFactory;
 import net.sf.briar.api.transport.ConnectionWriterFactory;
 
@@ -26,6 +27,7 @@ class InvitationTaskFactoryImpl implements InvitationTaskFactory {
 	private final ConnectionWriterFactory connectionWriterFactory;
 	private final AuthorFactory authorFactory;
 	private final KeyManager keyManager;
+	private final ConnectionDispatcher connectionDispatcher;
 	private final Clock clock;
 	private final PluginManager pluginManager;
 
@@ -34,7 +36,8 @@ class InvitationTaskFactoryImpl implements InvitationTaskFactory {
 			ReaderFactory readerFactory, WriterFactory writerFactory,
 			ConnectionReaderFactory connectionReaderFactory,
 			ConnectionWriterFactory connectionWriterFactory,
-			AuthorFactory authorFactory, KeyManager keyManager, Clock clock,
+			AuthorFactory authorFactory, KeyManager keyManager,
+			ConnectionDispatcher connectionDispatcher, Clock clock,
 			PluginManager pluginManager) {
 		this.crypto = crypto;
 		this.db = db;
@@ -44,6 +47,7 @@ class InvitationTaskFactoryImpl implements InvitationTaskFactory {
 		this.connectionWriterFactory = connectionWriterFactory;
 		this.authorFactory = authorFactory;
 		this.keyManager = keyManager;
+		this.connectionDispatcher = connectionDispatcher;
 		this.clock = clock;
 		this.pluginManager = pluginManager;
 	}
@@ -52,7 +56,7 @@ class InvitationTaskFactoryImpl implements InvitationTaskFactory {
 			int remoteCode) {
 		return new ConnectorGroup(crypto, db, readerFactory, writerFactory,
 				connectionReaderFactory, connectionWriterFactory,
-				authorFactory, keyManager, clock, pluginManager, localAuthorId,
-				localCode, remoteCode);
+				authorFactory, keyManager, connectionDispatcher, clock,
+				pluginManager, localAuthorId, localCode, remoteCode);
 	}
 }