diff --git a/api/net/sf/briar/api/plugins/DuplexPlugin.java b/api/net/sf/briar/api/plugins/duplex/DuplexPlugin.java
similarity index 83%
rename from api/net/sf/briar/api/plugins/DuplexPlugin.java
rename to api/net/sf/briar/api/plugins/duplex/DuplexPlugin.java
index 45656e4023092d4c50acee936fa5fef53da03c65..fed6e5fd63d822d8c3f2f5f7d61e304f55332124 100644
--- a/api/net/sf/briar/api/plugins/DuplexPlugin.java
+++ b/api/net/sf/briar/api/plugins/duplex/DuplexPlugin.java
@@ -1,8 +1,9 @@
-package net.sf.briar.api.plugins;
+package net.sf.briar.api.plugins.duplex;
 
 import net.sf.briar.api.ContactId;
+import net.sf.briar.api.plugins.Plugin;
 
-/**  An interface for transport plugins that support duplex communication. */
+/** An interface for transport plugins that support duplex communication. */
 public interface DuplexPlugin extends Plugin {
 
 	/**
diff --git a/api/net/sf/briar/api/plugins/DuplexPluginCallback.java b/api/net/sf/briar/api/plugins/duplex/DuplexPluginCallback.java
similarity index 59%
rename from api/net/sf/briar/api/plugins/DuplexPluginCallback.java
rename to api/net/sf/briar/api/plugins/duplex/DuplexPluginCallback.java
index 0c240a2d2e1ce3c44ea7ae6dfe6f632545631abd..190f67170f17e3c7ee1a625d32f215274b26f7ee 100644
--- a/api/net/sf/briar/api/plugins/DuplexPluginCallback.java
+++ b/api/net/sf/briar/api/plugins/duplex/DuplexPluginCallback.java
@@ -1,9 +1,10 @@
-package net.sf.briar.api.plugins;
+package net.sf.briar.api.plugins.duplex;
 
 import net.sf.briar.api.ContactId;
+import net.sf.briar.api.plugins.PluginCallback;
 
 /**
- * An interface for receiving connections created by a duplex transport plugin.
+ * An interface for handling connections created by a duplex transport plugin.
  */
 public interface DuplexPluginCallback extends PluginCallback {
 
diff --git a/api/net/sf/briar/api/plugins/DuplexPluginFactory.java b/api/net/sf/briar/api/plugins/duplex/DuplexPluginFactory.java
similarity index 80%
rename from api/net/sf/briar/api/plugins/DuplexPluginFactory.java
rename to api/net/sf/briar/api/plugins/duplex/DuplexPluginFactory.java
index 25159e41b8a98fb681c3a06b8545524a982c86ab..5d9609ff902d44b0401d635f546b0a57f3dfa8f4 100644
--- a/api/net/sf/briar/api/plugins/DuplexPluginFactory.java
+++ b/api/net/sf/briar/api/plugins/duplex/DuplexPluginFactory.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.plugins;
+package net.sf.briar.api.plugins.duplex;
 
 import java.util.concurrent.Executor;
 
diff --git a/api/net/sf/briar/api/plugins/duplex/DuplexSegmentedPlugin.java b/api/net/sf/briar/api/plugins/duplex/DuplexSegmentedPlugin.java
new file mode 100644
index 0000000000000000000000000000000000000000..3832cdc3e88b91ee5f28567b4e618ca8407c6ba4
--- /dev/null
+++ b/api/net/sf/briar/api/plugins/duplex/DuplexSegmentedPlugin.java
@@ -0,0 +1,29 @@
+package net.sf.briar.api.plugins.duplex;
+
+import net.sf.briar.api.ContactId;
+
+/**
+ * An interface for transport plugins that support duplex segmented
+ * communication.
+ */
+public interface DuplexSegmentedPlugin {
+
+	/**
+	 * Attempts to create and return a connection to the given contact using
+	 * the current transport and configuration properties. Returns null if a
+	 * connection could not be created.
+	 */
+	DuplexSegmentedTransportConnection createConnection(ContactId c);
+
+	/**
+	 * Starts the invitation process from the inviter's side. Returns null if
+	 * no connection can be established within the given timeout.
+	 */
+	DuplexSegmentedTransportConnection sendInvitation(int code, long timeout);
+
+	/**
+	 * Starts the invitation process from the invitee's side. Returns null if
+	 * no connection can be established within the given timeout.
+	 */
+	DuplexSegmentedTransportConnection acceptInvitation(int code, long timeout);
+}
diff --git a/api/net/sf/briar/api/plugins/duplex/DuplexSegmentedPluginCallback.java b/api/net/sf/briar/api/plugins/duplex/DuplexSegmentedPluginCallback.java
new file mode 100644
index 0000000000000000000000000000000000000000..571b617450f1c5b7f6a6e423b8be5b031e0ec194
--- /dev/null
+++ b/api/net/sf/briar/api/plugins/duplex/DuplexSegmentedPluginCallback.java
@@ -0,0 +1,16 @@
+package net.sf.briar.api.plugins.duplex;
+
+import net.sf.briar.api.ContactId;
+
+/**
+ * An interface for handling connections created by a duplex segmented
+ * transport plugin.
+ */
+public interface DuplexSegmentedPluginCallback {
+
+	void incomingConnectionCreated(DuplexSegmentedTransportConnection d);
+
+	void outgoingConnectionCreated(ContactId c,
+			DuplexSegmentedTransportConnection d);
+
+}
diff --git a/api/net/sf/briar/api/plugins/duplex/DuplexSegmentedPluginFactory.java b/api/net/sf/briar/api/plugins/duplex/DuplexSegmentedPluginFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..d32e372fafdb46b119710ecadea9150d5e6dbe63
--- /dev/null
+++ b/api/net/sf/briar/api/plugins/duplex/DuplexSegmentedPluginFactory.java
@@ -0,0 +1,10 @@
+package net.sf.briar.api.plugins.duplex;
+
+import java.util.concurrent.Executor;
+
+public interface DuplexSegmentedPluginFactory {
+
+	DuplexSegmentedPlugin createPlugin(Executor pluginExecutor,
+			DuplexSegmentedPluginCallback callback);
+
+}
diff --git a/api/net/sf/briar/api/plugins/duplex/DuplexSegmentedTransportConnection.java b/api/net/sf/briar/api/plugins/duplex/DuplexSegmentedTransportConnection.java
new file mode 100644
index 0000000000000000000000000000000000000000..3ff03462208d071c5309abc66144cf93605eacd3
--- /dev/null
+++ b/api/net/sf/briar/api/plugins/duplex/DuplexSegmentedTransportConnection.java
@@ -0,0 +1,33 @@
+package net.sf.briar.api.plugins.duplex;
+
+import java.io.IOException;
+
+/**
+ * An interface for reading and writing data over a duplex segmented transport.
+ * The connection is not responsible for encrypting/decrypting or authenticating
+ * the data.
+ */
+public interface DuplexSegmentedTransportConnection {
+
+	/**
+	 * Reads a frame into the given buffer and returns its length, or -1 if no
+	 * more frames can be read.
+	 */
+	int readFrame(byte[] b) throws IOException;
+
+	/** Writes the given frame to the transport. */
+	void writeFrame(byte[] b, int len) throws IOException;
+
+	/**
+	 * Returns true if the output stream should be flushed after each packet.
+	 */
+	boolean shouldFlush();
+
+	/**
+	 * Closes the connection and disposes of any associated resources. The
+	 * first argument indicates whether the connection is being closed because
+	 * of an exception and the second argument indicates whether the connection
+	 * was recognised, which may affect how resources are disposed of.
+	 */
+	void dispose(boolean exception, boolean recognised);
+}
diff --git a/api/net/sf/briar/api/plugins/DuplexTransportConnection.java b/api/net/sf/briar/api/plugins/duplex/DuplexTransportConnection.java
similarity index 96%
rename from api/net/sf/briar/api/plugins/DuplexTransportConnection.java
rename to api/net/sf/briar/api/plugins/duplex/DuplexTransportConnection.java
index 8f03d8b9bbd8e5352e964073f4faa205574450f9..f5c40e1e465f9ccdba66b68b0dc29eadc1b86ffc 100644
--- a/api/net/sf/briar/api/plugins/DuplexTransportConnection.java
+++ b/api/net/sf/briar/api/plugins/duplex/DuplexTransportConnection.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.plugins;
+package net.sf.briar.api.plugins.duplex;
 
 import java.io.IOException;
 import java.io.InputStream;
diff --git a/api/net/sf/briar/api/plugins/SimplexPlugin.java b/api/net/sf/briar/api/plugins/simplex/SimplexPlugin.java
similarity index 94%
rename from api/net/sf/briar/api/plugins/SimplexPlugin.java
rename to api/net/sf/briar/api/plugins/simplex/SimplexPlugin.java
index c59553d069199b671abe47ff4cff247b4e97bb49..4b06f54f3b0fb9a033888450cfa3240ba2778d88 100644
--- a/api/net/sf/briar/api/plugins/SimplexPlugin.java
+++ b/api/net/sf/briar/api/plugins/simplex/SimplexPlugin.java
@@ -1,6 +1,7 @@
-package net.sf.briar.api.plugins;
+package net.sf.briar.api.plugins.simplex;
 
 import net.sf.briar.api.ContactId;
+import net.sf.briar.api.plugins.Plugin;
 
 /** An interface for transport plugins that support simplex communication. */
 public interface SimplexPlugin extends Plugin {
diff --git a/api/net/sf/briar/api/plugins/SimplexPluginCallback.java b/api/net/sf/briar/api/plugins/simplex/SimplexPluginCallback.java
similarity index 54%
rename from api/net/sf/briar/api/plugins/SimplexPluginCallback.java
rename to api/net/sf/briar/api/plugins/simplex/SimplexPluginCallback.java
index 6c52a9bb6def6c1b6a7c1e0f731ed1d14dcaaf56..2e808f7eae53504349bc469dd6a17d9a9dfc8543 100644
--- a/api/net/sf/briar/api/plugins/SimplexPluginCallback.java
+++ b/api/net/sf/briar/api/plugins/simplex/SimplexPluginCallback.java
@@ -1,9 +1,11 @@
-package net.sf.briar.api.plugins;
+package net.sf.briar.api.plugins.simplex;
 
 import net.sf.briar.api.ContactId;
+import net.sf.briar.api.plugins.PluginCallback;
 
 /**
- * An interface for receiving readers and writers created by a simplex plugin.
+ * An interface for handling readers and writers created by a simplex transport
+ * plugin.
  */
 public interface SimplexPluginCallback extends PluginCallback {
 
diff --git a/api/net/sf/briar/api/plugins/SimplexPluginFactory.java b/api/net/sf/briar/api/plugins/simplex/SimplexPluginFactory.java
similarity index 80%
rename from api/net/sf/briar/api/plugins/SimplexPluginFactory.java
rename to api/net/sf/briar/api/plugins/simplex/SimplexPluginFactory.java
index d007f1b336e160df3c6458a9a29abd45dad8d19f..d114ec376b08928d9fed433e896899a052d8b149 100644
--- a/api/net/sf/briar/api/plugins/SimplexPluginFactory.java
+++ b/api/net/sf/briar/api/plugins/simplex/SimplexPluginFactory.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.plugins;
+package net.sf.briar.api.plugins.simplex;
 
 import java.util.concurrent.Executor;
 
diff --git a/api/net/sf/briar/api/plugins/simplex/SimplexSegmentedPlugin.java b/api/net/sf/briar/api/plugins/simplex/SimplexSegmentedPlugin.java
new file mode 100644
index 0000000000000000000000000000000000000000..1f68244ca37ef1b65298d824a51a45356d22092a
--- /dev/null
+++ b/api/net/sf/briar/api/plugins/simplex/SimplexSegmentedPlugin.java
@@ -0,0 +1,50 @@
+package net.sf.briar.api.plugins.simplex;
+
+import net.sf.briar.api.ContactId;
+
+/**
+ * An interface for transport plugins that support simplex segmented
+ * communication.
+ */
+public interface SimplexSegmentedPlugin {
+
+	/**
+	 * Attempts to create and return a reader for the given contact using the
+	 * current transport and configuration properties. Returns null if a reader
+	 * could not be created.
+	 */
+	SimplexSegmentedTransportReader createReader(ContactId c);
+
+	/**
+	 * Attempts to create and return a writer for the given contact using the
+	 * current transport and configuration properties. Returns null if a writer
+	 * could not be created.
+	 */
+	SimplexSegmentedTransportWriter createWriter(ContactId c);
+
+	/**
+	 * Starts the invitation process from the inviter's side. Returns null if
+	 * no connection can be established within the given timeout.
+	 */
+	SimplexSegmentedTransportWriter sendInvitation(int code, long timeout);
+
+	/**
+	 * Starts the invitation process from the invitee's side. Returns null if
+	 * no connection can be established within the given timeout.
+	 */
+	SimplexSegmentedTransportReader acceptInvitation(int code, long timeout);
+
+	/**
+	 * Continues the invitation process from the invitee's side. Returns null
+	 * if no connection can be established within the given timeout.
+	 */
+	SimplexSegmentedTransportWriter sendInvitationResponse(int code,
+			long timeout);
+
+	/**
+	 * Continues the invitation process from the inviter's side. Returns null
+	 * if no connection can be established within the given timeout.
+	 */
+	SimplexSegmentedTransportReader acceptInvitationResponse(int code,
+			long timeout);
+}
diff --git a/api/net/sf/briar/api/plugins/simplex/SimplexSegmentedPluginCallback.java b/api/net/sf/briar/api/plugins/simplex/SimplexSegmentedPluginCallback.java
new file mode 100644
index 0000000000000000000000000000000000000000..6f116eb91dd89f43137b4776a21a6ace14e91c5d
--- /dev/null
+++ b/api/net/sf/briar/api/plugins/simplex/SimplexSegmentedPluginCallback.java
@@ -0,0 +1,15 @@
+package net.sf.briar.api.plugins.simplex;
+
+import net.sf.briar.api.ContactId;
+
+/**
+ * An interface for handling readers and writers created by a simplex
+ * segmented transport plugin.
+ */
+public interface SimplexSegmentedPluginCallback {
+
+	void readerCreated(SimplexSegmentedTransportReader r);
+
+	void writerCreated(ContactId c, SimplexSegmentedTransportWriter w);
+
+}
diff --git a/api/net/sf/briar/api/plugins/simplex/SimplexSegmentedPluginFactory.java b/api/net/sf/briar/api/plugins/simplex/SimplexSegmentedPluginFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..1657c5f280bce1f7ba2f2ddafbded7b8288069e7
--- /dev/null
+++ b/api/net/sf/briar/api/plugins/simplex/SimplexSegmentedPluginFactory.java
@@ -0,0 +1,9 @@
+package net.sf.briar.api.plugins.simplex;
+
+import java.util.concurrent.Executor;
+
+public interface SimplexSegmentedPluginFactory {
+
+	SimplexSegmentedPlugin createPlugin(Executor pluginExecutor,
+			SimplexSegmentedPluginCallback callback);
+}
diff --git a/api/net/sf/briar/api/plugins/simplex/SimplexSegmentedTransportReader.java b/api/net/sf/briar/api/plugins/simplex/SimplexSegmentedTransportReader.java
new file mode 100644
index 0000000000000000000000000000000000000000..0d9272d5584e5f76a7989a2ceaa2c97d2c343e86
--- /dev/null
+++ b/api/net/sf/briar/api/plugins/simplex/SimplexSegmentedTransportReader.java
@@ -0,0 +1,25 @@
+package net.sf.briar.api.plugins.simplex;
+
+import java.io.IOException;
+
+/**
+ * An interface for reading data from a simplex segmented transport. The reader
+ * is not responsible for decrypting or authenticating the data before
+ * returning it.
+ */
+public interface SimplexSegmentedTransportReader {
+
+	/**
+	 * Reads a frame into the given buffer and returns its length, or -1 if no
+	 * more frames can be read.
+	 */
+	int readFrame(byte[] b) throws IOException;
+
+	/**
+	 * Closes the reader and disposes of any associated resources. The first
+	 * argument indicates whether the reader is being closed because of an
+	 * exception and the second argument indicates whether the connection was
+	 * recognised, which may affect how resources are disposed of.
+	 */
+	void dispose(boolean exception, boolean recognised);
+}
diff --git a/api/net/sf/briar/api/plugins/simplex/SimplexSegmentedTransportWriter.java b/api/net/sf/briar/api/plugins/simplex/SimplexSegmentedTransportWriter.java
new file mode 100644
index 0000000000000000000000000000000000000000..e6c09b3a3e8ba2b679955a36e59bf18bf9ce8f9b
--- /dev/null
+++ b/api/net/sf/briar/api/plugins/simplex/SimplexSegmentedTransportWriter.java
@@ -0,0 +1,28 @@
+package net.sf.briar.api.plugins.simplex;
+
+import java.io.IOException;
+
+/**
+ * An interface for writing data to a simplex segmented transport. The writer is
+ * not responsible for authenticating or encrypting the data before writing it.
+ */
+public interface SimplexSegmentedTransportWriter {
+
+	/** Returns the capacity of the transport in bytes. */
+	long getCapacity();
+
+	/** Writes the given frame to the transport. */
+	void writeFrame(byte[] b, int len) throws IOException;
+
+	/**
+	 * Returns true if the output stream should be flushed after each packet.
+	 */
+	boolean shouldFlush();
+
+	/**
+	 * Closes the writer and disposes of any associated resources. The
+	 * argument indicates whether the writer is being closed because of an
+	 * exception, which may affect how resources are disposed of.
+	 */
+	void dispose(boolean exception);
+}
diff --git a/api/net/sf/briar/api/plugins/SimplexTransportReader.java b/api/net/sf/briar/api/plugins/simplex/SimplexTransportReader.java
similarity index 94%
rename from api/net/sf/briar/api/plugins/SimplexTransportReader.java
rename to api/net/sf/briar/api/plugins/simplex/SimplexTransportReader.java
index 70e696eb7747e9c79e2d62f8d672ab4d4f861e63..3eb5ea1361baca17f787f128ae88c40b808d4c88 100644
--- a/api/net/sf/briar/api/plugins/SimplexTransportReader.java
+++ b/api/net/sf/briar/api/plugins/simplex/SimplexTransportReader.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.plugins;
+package net.sf.briar.api.plugins.simplex;
 
 import java.io.InputStream;
 
diff --git a/api/net/sf/briar/api/plugins/SimplexTransportWriter.java b/api/net/sf/briar/api/plugins/simplex/SimplexTransportWriter.java
similarity index 94%
rename from api/net/sf/briar/api/plugins/SimplexTransportWriter.java
rename to api/net/sf/briar/api/plugins/simplex/SimplexTransportWriter.java
index 58071a7837b74ba214420ecb387cdd869bcee6d8..ea5c316845acf4f22f23b7552ca4ecfebda2635e 100644
--- a/api/net/sf/briar/api/plugins/SimplexTransportWriter.java
+++ b/api/net/sf/briar/api/plugins/simplex/SimplexTransportWriter.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.plugins;
+package net.sf.briar.api.plugins.simplex;
 
 import java.io.OutputStream;
 
diff --git a/api/net/sf/briar/api/protocol/duplex/DuplexConnectionFactory.java b/api/net/sf/briar/api/protocol/duplex/DuplexConnectionFactory.java
index 0b79f4211edb6982508500025b81dc680241d71f..94b22389bc3e29bb916bd9f48fd1759e528baf97 100644
--- a/api/net/sf/briar/api/protocol/duplex/DuplexConnectionFactory.java
+++ b/api/net/sf/briar/api/protocol/duplex/DuplexConnectionFactory.java
@@ -1,7 +1,7 @@
 package net.sf.briar.api.protocol.duplex;
 
 import net.sf.briar.api.ContactId;
-import net.sf.briar.api.plugins.DuplexTransportConnection;
+import net.sf.briar.api.plugins.duplex.DuplexTransportConnection;
 import net.sf.briar.api.protocol.TransportId;
 import net.sf.briar.api.protocol.TransportIndex;
 import net.sf.briar.api.transport.ConnectionContext;
diff --git a/api/net/sf/briar/api/protocol/simplex/SimplexConnectionFactory.java b/api/net/sf/briar/api/protocol/simplex/SimplexConnectionFactory.java
index 1fa1f30c27bafab098f116967a71482ae60a1b5a..7c18457c0b1a0f10c32b4f4336b101292c5cc29b 100644
--- a/api/net/sf/briar/api/protocol/simplex/SimplexConnectionFactory.java
+++ b/api/net/sf/briar/api/protocol/simplex/SimplexConnectionFactory.java
@@ -1,8 +1,8 @@
 package net.sf.briar.api.protocol.simplex;
 
 import net.sf.briar.api.ContactId;
-import net.sf.briar.api.plugins.SimplexTransportReader;
-import net.sf.briar.api.plugins.SimplexTransportWriter;
+import net.sf.briar.api.plugins.simplex.SimplexTransportReader;
+import net.sf.briar.api.plugins.simplex.SimplexTransportWriter;
 import net.sf.briar.api.protocol.TransportId;
 import net.sf.briar.api.protocol.TransportIndex;
 import net.sf.briar.api.transport.ConnectionContext;
diff --git a/api/net/sf/briar/api/transport/ConnectionDispatcher.java b/api/net/sf/briar/api/transport/ConnectionDispatcher.java
index d75a3ad684540e723866f1250733332930d8a675..4d2e144136511e1c186faec36b83521b932ab40e 100644
--- a/api/net/sf/briar/api/transport/ConnectionDispatcher.java
+++ b/api/net/sf/briar/api/transport/ConnectionDispatcher.java
@@ -1,9 +1,9 @@
 package net.sf.briar.api.transport;
 
 import net.sf.briar.api.ContactId;
-import net.sf.briar.api.plugins.SimplexTransportReader;
-import net.sf.briar.api.plugins.SimplexTransportWriter;
-import net.sf.briar.api.plugins.DuplexTransportConnection;
+import net.sf.briar.api.plugins.duplex.DuplexTransportConnection;
+import net.sf.briar.api.plugins.simplex.SimplexTransportReader;
+import net.sf.briar.api.plugins.simplex.SimplexTransportWriter;
 import net.sf.briar.api.protocol.TransportId;
 import net.sf.briar.api.protocol.TransportIndex;
 
diff --git a/components/net/sf/briar/plugins/PluginManagerImpl.java b/components/net/sf/briar/plugins/PluginManagerImpl.java
index 9276fcc096088eae440ff767d665a2967f218b22..652882fd4592c81bb5acb3c0d5f7e039b3c404e2 100644
--- a/components/net/sf/briar/plugins/PluginManagerImpl.java
+++ b/components/net/sf/briar/plugins/PluginManagerImpl.java
@@ -16,19 +16,19 @@ import net.sf.briar.api.TransportConfig;
 import net.sf.briar.api.TransportProperties;
 import net.sf.briar.api.db.DatabaseComponent;
 import net.sf.briar.api.db.DbException;
-import net.sf.briar.api.plugins.SimplexPlugin;
-import net.sf.briar.api.plugins.SimplexPluginCallback;
-import net.sf.briar.api.plugins.SimplexPluginFactory;
-import net.sf.briar.api.plugins.SimplexTransportReader;
-import net.sf.briar.api.plugins.SimplexTransportWriter;
 import net.sf.briar.api.plugins.Plugin;
 import net.sf.briar.api.plugins.PluginCallback;
 import net.sf.briar.api.plugins.PluginExecutor;
 import net.sf.briar.api.plugins.PluginManager;
-import net.sf.briar.api.plugins.DuplexPlugin;
-import net.sf.briar.api.plugins.DuplexPluginCallback;
-import net.sf.briar.api.plugins.DuplexPluginFactory;
-import net.sf.briar.api.plugins.DuplexTransportConnection;
+import net.sf.briar.api.plugins.duplex.DuplexPlugin;
+import net.sf.briar.api.plugins.duplex.DuplexPluginCallback;
+import net.sf.briar.api.plugins.duplex.DuplexPluginFactory;
+import net.sf.briar.api.plugins.duplex.DuplexTransportConnection;
+import net.sf.briar.api.plugins.simplex.SimplexPlugin;
+import net.sf.briar.api.plugins.simplex.SimplexPluginCallback;
+import net.sf.briar.api.plugins.simplex.SimplexPluginFactory;
+import net.sf.briar.api.plugins.simplex.SimplexTransportReader;
+import net.sf.briar.api.plugins.simplex.SimplexTransportWriter;
 import net.sf.briar.api.protocol.ProtocolConstants;
 import net.sf.briar.api.protocol.TransportId;
 import net.sf.briar.api.protocol.TransportIndex;
diff --git a/components/net/sf/briar/plugins/bluetooth/BluetoothPlugin.java b/components/net/sf/briar/plugins/bluetooth/BluetoothPlugin.java
index af068999d523a14bfede39fc509d2b03e4c7107a..007106cb2c888ce4b778149aae1b83ff3bad8b4a 100644
--- a/components/net/sf/briar/plugins/bluetooth/BluetoothPlugin.java
+++ b/components/net/sf/briar/plugins/bluetooth/BluetoothPlugin.java
@@ -26,9 +26,9 @@ import javax.microedition.io.StreamConnectionNotifier;
 import net.sf.briar.api.ContactId;
 import net.sf.briar.api.TransportProperties;
 import net.sf.briar.api.plugins.PluginExecutor;
-import net.sf.briar.api.plugins.DuplexPlugin;
-import net.sf.briar.api.plugins.DuplexPluginCallback;
-import net.sf.briar.api.plugins.DuplexTransportConnection;
+import net.sf.briar.api.plugins.duplex.DuplexPlugin;
+import net.sf.briar.api.plugins.duplex.DuplexPluginCallback;
+import net.sf.briar.api.plugins.duplex.DuplexTransportConnection;
 import net.sf.briar.api.protocol.TransportId;
 import net.sf.briar.util.OsUtils;
 import net.sf.briar.util.StringUtils;
diff --git a/components/net/sf/briar/plugins/bluetooth/BluetoothPluginFactory.java b/components/net/sf/briar/plugins/bluetooth/BluetoothPluginFactory.java
index 511f874e2ab051aa99dec08519f911e1547295ed..615c3c66d94adfe1065625dbeeb9d175783bb9e8 100644
--- a/components/net/sf/briar/plugins/bluetooth/BluetoothPluginFactory.java
+++ b/components/net/sf/briar/plugins/bluetooth/BluetoothPluginFactory.java
@@ -3,9 +3,9 @@ package net.sf.briar.plugins.bluetooth;
 import java.util.concurrent.Executor;
 
 import net.sf.briar.api.plugins.PluginExecutor;
-import net.sf.briar.api.plugins.DuplexPlugin;
-import net.sf.briar.api.plugins.DuplexPluginCallback;
-import net.sf.briar.api.plugins.DuplexPluginFactory;
+import net.sf.briar.api.plugins.duplex.DuplexPlugin;
+import net.sf.briar.api.plugins.duplex.DuplexPluginCallback;
+import net.sf.briar.api.plugins.duplex.DuplexPluginFactory;
 
 public class BluetoothPluginFactory implements DuplexPluginFactory {
 
diff --git a/components/net/sf/briar/plugins/bluetooth/BluetoothTransportConnection.java b/components/net/sf/briar/plugins/bluetooth/BluetoothTransportConnection.java
index baab4332fe6557f11465be2939a27c5caf487622..4a110cf94becf8d4eb05ed197778364c45e80dc7 100644
--- a/components/net/sf/briar/plugins/bluetooth/BluetoothTransportConnection.java
+++ b/components/net/sf/briar/plugins/bluetooth/BluetoothTransportConnection.java
@@ -8,7 +8,7 @@ import java.util.logging.Logger;
 
 import javax.microedition.io.StreamConnection;
 
-import net.sf.briar.api.plugins.DuplexTransportConnection;
+import net.sf.briar.api.plugins.duplex.DuplexTransportConnection;
 
 class BluetoothTransportConnection implements DuplexTransportConnection {
 
diff --git a/components/net/sf/briar/plugins/file/FilePlugin.java b/components/net/sf/briar/plugins/file/FilePlugin.java
index eb4c86e42e3a15737ba377725c869a562c85c82b..5cd992a78af88b0838eacefcd263af88e9ac8b95 100644
--- a/components/net/sf/briar/plugins/file/FilePlugin.java
+++ b/components/net/sf/briar/plugins/file/FilePlugin.java
@@ -11,11 +11,11 @@ import java.util.logging.Level;
 import java.util.logging.Logger;
 
 import net.sf.briar.api.ContactId;
-import net.sf.briar.api.plugins.SimplexPlugin;
-import net.sf.briar.api.plugins.SimplexPluginCallback;
-import net.sf.briar.api.plugins.SimplexTransportReader;
-import net.sf.briar.api.plugins.SimplexTransportWriter;
 import net.sf.briar.api.plugins.PluginExecutor;
+import net.sf.briar.api.plugins.simplex.SimplexPlugin;
+import net.sf.briar.api.plugins.simplex.SimplexPluginCallback;
+import net.sf.briar.api.plugins.simplex.SimplexTransportReader;
+import net.sf.briar.api.plugins.simplex.SimplexTransportWriter;
 import net.sf.briar.api.transport.TransportConstants;
 
 import org.apache.commons.io.FileSystemUtils;
diff --git a/components/net/sf/briar/plugins/file/FileTransportReader.java b/components/net/sf/briar/plugins/file/FileTransportReader.java
index a7df1d398463b612807c02d63ca720943aee69a6..71b3a19909b871aa006ce8c2b0c433977ca253b0 100644
--- a/components/net/sf/briar/plugins/file/FileTransportReader.java
+++ b/components/net/sf/briar/plugins/file/FileTransportReader.java
@@ -6,7 +6,7 @@ import java.io.InputStream;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-import net.sf.briar.api.plugins.SimplexTransportReader;
+import net.sf.briar.api.plugins.simplex.SimplexTransportReader;
 
 class FileTransportReader implements SimplexTransportReader {
 
diff --git a/components/net/sf/briar/plugins/file/FileTransportWriter.java b/components/net/sf/briar/plugins/file/FileTransportWriter.java
index e311196907dc33368a28cca592f25e232a2e6c4d..056e4f05bd950a99064ba4aa87f386132915ff6f 100644
--- a/components/net/sf/briar/plugins/file/FileTransportWriter.java
+++ b/components/net/sf/briar/plugins/file/FileTransportWriter.java
@@ -6,7 +6,7 @@ import java.io.OutputStream;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-import net.sf.briar.api.plugins.SimplexTransportWriter;
+import net.sf.briar.api.plugins.simplex.SimplexTransportWriter;
 
 class FileTransportWriter implements SimplexTransportWriter {
 
diff --git a/components/net/sf/briar/plugins/file/RemovableDrivePlugin.java b/components/net/sf/briar/plugins/file/RemovableDrivePlugin.java
index 200588f21aaf9cafed69fe493c38c0c82b93dd28..a42eb152c10983c88d868bab08c77da8d4b0c42b 100644
--- a/components/net/sf/briar/plugins/file/RemovableDrivePlugin.java
+++ b/components/net/sf/briar/plugins/file/RemovableDrivePlugin.java
@@ -11,8 +11,8 @@ import java.util.logging.Level;
 import java.util.logging.Logger;
 
 import net.sf.briar.api.ContactId;
-import net.sf.briar.api.plugins.SimplexPluginCallback;
 import net.sf.briar.api.plugins.PluginExecutor;
+import net.sf.briar.api.plugins.simplex.SimplexPluginCallback;
 import net.sf.briar.api.protocol.TransportId;
 import net.sf.briar.util.StringUtils;
 
diff --git a/components/net/sf/briar/plugins/file/RemovableDrivePluginFactory.java b/components/net/sf/briar/plugins/file/RemovableDrivePluginFactory.java
index 545380c187cd418a66c221f68cf4ea23e854251f..689efc8502309661b750717957f3d724e71e07de 100644
--- a/components/net/sf/briar/plugins/file/RemovableDrivePluginFactory.java
+++ b/components/net/sf/briar/plugins/file/RemovableDrivePluginFactory.java
@@ -2,10 +2,10 @@ package net.sf.briar.plugins.file;
 
 import java.util.concurrent.Executor;
 
-import net.sf.briar.api.plugins.SimplexPlugin;
-import net.sf.briar.api.plugins.SimplexPluginCallback;
-import net.sf.briar.api.plugins.SimplexPluginFactory;
 import net.sf.briar.api.plugins.PluginExecutor;
+import net.sf.briar.api.plugins.simplex.SimplexPlugin;
+import net.sf.briar.api.plugins.simplex.SimplexPluginCallback;
+import net.sf.briar.api.plugins.simplex.SimplexPluginFactory;
 import net.sf.briar.util.OsUtils;
 
 public class RemovableDrivePluginFactory implements SimplexPluginFactory {
diff --git a/components/net/sf/briar/plugins/socket/LanSocketPlugin.java b/components/net/sf/briar/plugins/socket/LanSocketPlugin.java
index a6bae33bc6d141c93867bc17ee375b1afc515ce0..53290881f4ac8af3067c10a12ea62af6e2133a46 100644
--- a/components/net/sf/briar/plugins/socket/LanSocketPlugin.java
+++ b/components/net/sf/briar/plugins/socket/LanSocketPlugin.java
@@ -15,8 +15,8 @@ import java.util.logging.Level;
 import java.util.logging.Logger;
 
 import net.sf.briar.api.plugins.PluginExecutor;
-import net.sf.briar.api.plugins.DuplexPluginCallback;
-import net.sf.briar.api.plugins.DuplexTransportConnection;
+import net.sf.briar.api.plugins.duplex.DuplexPluginCallback;
+import net.sf.briar.api.plugins.duplex.DuplexTransportConnection;
 import net.sf.briar.util.ByteUtils;
 
 /** A socket plugin that supports exchanging invitations over a LAN. */
diff --git a/components/net/sf/briar/plugins/socket/SimpleSocketPlugin.java b/components/net/sf/briar/plugins/socket/SimpleSocketPlugin.java
index f6efe6fbcbaca78981c5ba9629a4112b7b6f815d..69d948dcb0899f3ae2d4fc890c7872b817329810 100644
--- a/components/net/sf/briar/plugins/socket/SimpleSocketPlugin.java
+++ b/components/net/sf/briar/plugins/socket/SimpleSocketPlugin.java
@@ -16,8 +16,8 @@ import java.util.logging.Logger;
 import net.sf.briar.api.ContactId;
 import net.sf.briar.api.TransportProperties;
 import net.sf.briar.api.plugins.PluginExecutor;
-import net.sf.briar.api.plugins.DuplexPluginCallback;
-import net.sf.briar.api.plugins.DuplexTransportConnection;
+import net.sf.briar.api.plugins.duplex.DuplexPluginCallback;
+import net.sf.briar.api.plugins.duplex.DuplexTransportConnection;
 import net.sf.briar.api.protocol.TransportId;
 import net.sf.briar.util.StringUtils;
 
diff --git a/components/net/sf/briar/plugins/socket/SimpleSocketPluginFactory.java b/components/net/sf/briar/plugins/socket/SimpleSocketPluginFactory.java
index e5b2f07bde0cf8b3e0fb6f9fd7f5a8c323bb1862..d8499fb32e8c16173ef8ee10f37414b3d46a1ce1 100644
--- a/components/net/sf/briar/plugins/socket/SimpleSocketPluginFactory.java
+++ b/components/net/sf/briar/plugins/socket/SimpleSocketPluginFactory.java
@@ -3,9 +3,9 @@ package net.sf.briar.plugins.socket;
 import java.util.concurrent.Executor;
 
 import net.sf.briar.api.plugins.PluginExecutor;
-import net.sf.briar.api.plugins.DuplexPlugin;
-import net.sf.briar.api.plugins.DuplexPluginCallback;
-import net.sf.briar.api.plugins.DuplexPluginFactory;
+import net.sf.briar.api.plugins.duplex.DuplexPlugin;
+import net.sf.briar.api.plugins.duplex.DuplexPluginCallback;
+import net.sf.briar.api.plugins.duplex.DuplexPluginFactory;
 
 public class SimpleSocketPluginFactory implements DuplexPluginFactory {
 
diff --git a/components/net/sf/briar/plugins/socket/SocketPlugin.java b/components/net/sf/briar/plugins/socket/SocketPlugin.java
index 8292a446fc63a2213e98e7f1404533dce3c97a38..5fcbf24a6f135a37fde940a6a306ada8b7644d95 100644
--- a/components/net/sf/briar/plugins/socket/SocketPlugin.java
+++ b/components/net/sf/briar/plugins/socket/SocketPlugin.java
@@ -13,9 +13,9 @@ import java.util.logging.Logger;
 import net.sf.briar.api.ContactId;
 import net.sf.briar.api.TransportProperties;
 import net.sf.briar.api.plugins.PluginExecutor;
-import net.sf.briar.api.plugins.DuplexPlugin;
-import net.sf.briar.api.plugins.DuplexPluginCallback;
-import net.sf.briar.api.plugins.DuplexTransportConnection;
+import net.sf.briar.api.plugins.duplex.DuplexPlugin;
+import net.sf.briar.api.plugins.duplex.DuplexPluginCallback;
+import net.sf.briar.api.plugins.duplex.DuplexTransportConnection;
 
 abstract class SocketPlugin implements DuplexPlugin {
 
diff --git a/components/net/sf/briar/plugins/socket/SocketTransportConnection.java b/components/net/sf/briar/plugins/socket/SocketTransportConnection.java
index dc342945357c2a02f19d5481f3a611e8e9db7abd..a9e147faf89d0a75ab4bd5851cf6a650c2a26613 100644
--- a/components/net/sf/briar/plugins/socket/SocketTransportConnection.java
+++ b/components/net/sf/briar/plugins/socket/SocketTransportConnection.java
@@ -7,7 +7,7 @@ import java.net.Socket;
 import java.util.logging.Level;
 import java.util.logging.Logger;
 
-import net.sf.briar.api.plugins.DuplexTransportConnection;
+import net.sf.briar.api.plugins.duplex.DuplexTransportConnection;
 
 class SocketTransportConnection implements DuplexTransportConnection {
 
diff --git a/components/net/sf/briar/protocol/duplex/DuplexConnection.java b/components/net/sf/briar/protocol/duplex/DuplexConnection.java
index 7ebba90f3bfdfcb31e475853b06a67684b306a10..b55689222ecbef72e12066e675c76f6bea7ba372 100644
--- a/components/net/sf/briar/protocol/duplex/DuplexConnection.java
+++ b/components/net/sf/briar/protocol/duplex/DuplexConnection.java
@@ -29,7 +29,7 @@ import net.sf.briar.api.db.event.DatabaseListener;
 import net.sf.briar.api.db.event.LocalTransportsUpdatedEvent;
 import net.sf.briar.api.db.event.MessagesAddedEvent;
 import net.sf.briar.api.db.event.SubscriptionsUpdatedEvent;
-import net.sf.briar.api.plugins.DuplexTransportConnection;
+import net.sf.briar.api.plugins.duplex.DuplexTransportConnection;
 import net.sf.briar.api.protocol.Ack;
 import net.sf.briar.api.protocol.Batch;
 import net.sf.briar.api.protocol.MessageId;
diff --git a/components/net/sf/briar/protocol/duplex/IncomingDuplexConnection.java b/components/net/sf/briar/protocol/duplex/IncomingDuplexConnection.java
index 34059ca58aaa9d965323bbf999b67e58e4d6b910..75e6554cdf315e219b3af0ef64d85417b3c12354 100644
--- a/components/net/sf/briar/protocol/duplex/IncomingDuplexConnection.java
+++ b/components/net/sf/briar/protocol/duplex/IncomingDuplexConnection.java
@@ -5,7 +5,7 @@ import java.util.concurrent.Executor;
 
 import net.sf.briar.api.db.DatabaseComponent;
 import net.sf.briar.api.db.DatabaseExecutor;
-import net.sf.briar.api.plugins.DuplexTransportConnection;
+import net.sf.briar.api.plugins.duplex.DuplexTransportConnection;
 import net.sf.briar.api.protocol.ProtocolReaderFactory;
 import net.sf.briar.api.protocol.ProtocolWriterFactory;
 import net.sf.briar.api.protocol.TransportId;
diff --git a/components/net/sf/briar/protocol/duplex/OutgoingDuplexConnection.java b/components/net/sf/briar/protocol/duplex/OutgoingDuplexConnection.java
index b4a4c0d03fd9f15699145e68c132bdf7325fcbfa..aee3b4d83b4b6980e2ca2fc996bac0e6bfd1e97c 100644
--- a/components/net/sf/briar/protocol/duplex/OutgoingDuplexConnection.java
+++ b/components/net/sf/briar/protocol/duplex/OutgoingDuplexConnection.java
@@ -7,7 +7,7 @@ import net.sf.briar.api.ContactId;
 import net.sf.briar.api.db.DatabaseComponent;
 import net.sf.briar.api.db.DatabaseExecutor;
 import net.sf.briar.api.db.DbException;
-import net.sf.briar.api.plugins.DuplexTransportConnection;
+import net.sf.briar.api.plugins.duplex.DuplexTransportConnection;
 import net.sf.briar.api.protocol.ProtocolReaderFactory;
 import net.sf.briar.api.protocol.ProtocolWriterFactory;
 import net.sf.briar.api.protocol.TransportId;
diff --git a/components/net/sf/briar/protocol/duplex/StreamConnectionFactoryImpl.java b/components/net/sf/briar/protocol/duplex/StreamConnectionFactoryImpl.java
index 8f4b3c40d435d4de8edd4bc59eab76f795a684c6..3a2953abbf5fcbd15e1887dbc4a018b0b88b3539 100644
--- a/components/net/sf/briar/protocol/duplex/StreamConnectionFactoryImpl.java
+++ b/components/net/sf/briar/protocol/duplex/StreamConnectionFactoryImpl.java
@@ -5,7 +5,7 @@ import java.util.concurrent.Executor;
 import net.sf.briar.api.ContactId;
 import net.sf.briar.api.db.DatabaseComponent;
 import net.sf.briar.api.db.DatabaseExecutor;
-import net.sf.briar.api.plugins.DuplexTransportConnection;
+import net.sf.briar.api.plugins.duplex.DuplexTransportConnection;
 import net.sf.briar.api.protocol.ProtocolReaderFactory;
 import net.sf.briar.api.protocol.ProtocolWriterFactory;
 import net.sf.briar.api.protocol.TransportId;
diff --git a/components/net/sf/briar/protocol/simplex/IncomingSimplexConnection.java b/components/net/sf/briar/protocol/simplex/IncomingSimplexConnection.java
index 6b81a318a9cd922df6cd4ea6aaaeac71f155d151..224071e59a35b350c6d80c2b15620b125d3ceecc 100644
--- a/components/net/sf/briar/protocol/simplex/IncomingSimplexConnection.java
+++ b/components/net/sf/briar/protocol/simplex/IncomingSimplexConnection.java
@@ -12,7 +12,7 @@ import net.sf.briar.api.FormatException;
 import net.sf.briar.api.db.DatabaseComponent;
 import net.sf.briar.api.db.DatabaseExecutor;
 import net.sf.briar.api.db.DbException;
-import net.sf.briar.api.plugins.SimplexTransportReader;
+import net.sf.briar.api.plugins.simplex.SimplexTransportReader;
 import net.sf.briar.api.protocol.Ack;
 import net.sf.briar.api.protocol.Batch;
 import net.sf.briar.api.protocol.ProtocolReader;
diff --git a/components/net/sf/briar/protocol/simplex/OutgoingSimplexConnection.java b/components/net/sf/briar/protocol/simplex/OutgoingSimplexConnection.java
index da080bb371681df804dfb45c291723a8ef19ef10..f7e404bf0af56b08812e7e1ccf00ad96e1eaf96b 100644
--- a/components/net/sf/briar/protocol/simplex/OutgoingSimplexConnection.java
+++ b/components/net/sf/briar/protocol/simplex/OutgoingSimplexConnection.java
@@ -11,7 +11,7 @@ import java.util.logging.Logger;
 import net.sf.briar.api.ContactId;
 import net.sf.briar.api.db.DatabaseComponent;
 import net.sf.briar.api.db.DbException;
-import net.sf.briar.api.plugins.SimplexTransportWriter;
+import net.sf.briar.api.plugins.simplex.SimplexTransportWriter;
 import net.sf.briar.api.protocol.Ack;
 import net.sf.briar.api.protocol.ProtocolWriter;
 import net.sf.briar.api.protocol.ProtocolWriterFactory;
diff --git a/components/net/sf/briar/protocol/simplex/SimplexConnectionFactoryImpl.java b/components/net/sf/briar/protocol/simplex/SimplexConnectionFactoryImpl.java
index 3e5d1e16ce399c4958fa6d871e1d4df07bac7f3b..6dfa5892f0ca10aa0a0efc925fb7204497b44b2c 100644
--- a/components/net/sf/briar/protocol/simplex/SimplexConnectionFactoryImpl.java
+++ b/components/net/sf/briar/protocol/simplex/SimplexConnectionFactoryImpl.java
@@ -5,8 +5,8 @@ import java.util.concurrent.Executor;
 import net.sf.briar.api.ContactId;
 import net.sf.briar.api.db.DatabaseComponent;
 import net.sf.briar.api.db.DatabaseExecutor;
-import net.sf.briar.api.plugins.SimplexTransportReader;
-import net.sf.briar.api.plugins.SimplexTransportWriter;
+import net.sf.briar.api.plugins.simplex.SimplexTransportReader;
+import net.sf.briar.api.plugins.simplex.SimplexTransportWriter;
 import net.sf.briar.api.protocol.ProtocolReaderFactory;
 import net.sf.briar.api.protocol.ProtocolWriterFactory;
 import net.sf.briar.api.protocol.TransportId;
diff --git a/components/net/sf/briar/transport/ConnectionDispatcherImpl.java b/components/net/sf/briar/transport/ConnectionDispatcherImpl.java
index ea19fb1bb3e2e8d24490ea3f911bb753854afe90..42c3b6cba3dd4c768a6a5c6d9d690134367c3006 100644
--- a/components/net/sf/briar/transport/ConnectionDispatcherImpl.java
+++ b/components/net/sf/briar/transport/ConnectionDispatcherImpl.java
@@ -9,9 +9,9 @@ import java.util.logging.Logger;
 
 import net.sf.briar.api.ContactId;
 import net.sf.briar.api.db.DbException;
-import net.sf.briar.api.plugins.SimplexTransportReader;
-import net.sf.briar.api.plugins.SimplexTransportWriter;
-import net.sf.briar.api.plugins.DuplexTransportConnection;
+import net.sf.briar.api.plugins.duplex.DuplexTransportConnection;
+import net.sf.briar.api.plugins.simplex.SimplexTransportReader;
+import net.sf.briar.api.plugins.simplex.SimplexTransportWriter;
 import net.sf.briar.api.protocol.TransportId;
 import net.sf.briar.api.protocol.TransportIndex;
 import net.sf.briar.api.protocol.duplex.DuplexConnectionFactory;
diff --git a/test/net/sf/briar/plugins/DuplexClientTest.java b/test/net/sf/briar/plugins/DuplexClientTest.java
index 9e11a93e043b3473523d73bef8ca10928e1c85c0..dd051cf37b5fc4465fff1f54a1adb593ec5bc677 100644
--- a/test/net/sf/briar/plugins/DuplexClientTest.java
+++ b/test/net/sf/briar/plugins/DuplexClientTest.java
@@ -6,8 +6,8 @@ import java.util.Map;
 import net.sf.briar.api.ContactId;
 import net.sf.briar.api.TransportConfig;
 import net.sf.briar.api.TransportProperties;
-import net.sf.briar.api.plugins.DuplexPluginCallback;
-import net.sf.briar.api.plugins.DuplexTransportConnection;
+import net.sf.briar.api.plugins.duplex.DuplexPluginCallback;
+import net.sf.briar.api.plugins.duplex.DuplexTransportConnection;
 
 public abstract class DuplexClientTest extends DuplexTest {
 
diff --git a/test/net/sf/briar/plugins/DuplexServerTest.java b/test/net/sf/briar/plugins/DuplexServerTest.java
index 0681010363ae9cf4de8c750746ac7ced8bf7d952..008ab8108fd465686515d4918c1453e68d508d9b 100644
--- a/test/net/sf/briar/plugins/DuplexServerTest.java
+++ b/test/net/sf/briar/plugins/DuplexServerTest.java
@@ -6,8 +6,8 @@ import java.util.concurrent.CountDownLatch;
 import net.sf.briar.api.ContactId;
 import net.sf.briar.api.TransportConfig;
 import net.sf.briar.api.TransportProperties;
-import net.sf.briar.api.plugins.DuplexPluginCallback;
-import net.sf.briar.api.plugins.DuplexTransportConnection;
+import net.sf.briar.api.plugins.duplex.DuplexPluginCallback;
+import net.sf.briar.api.plugins.duplex.DuplexTransportConnection;
 
 public abstract class DuplexServerTest extends DuplexTest {
 
diff --git a/test/net/sf/briar/plugins/DuplexTest.java b/test/net/sf/briar/plugins/DuplexTest.java
index 586acb928a51d5121cf2c42a452e5b80672be57e..1eeb292b840123889201c394d0337f19ccdfb5ac 100644
--- a/test/net/sf/briar/plugins/DuplexTest.java
+++ b/test/net/sf/briar/plugins/DuplexTest.java
@@ -5,8 +5,8 @@ import java.io.PrintStream;
 import java.util.Scanner;
 
 import net.sf.briar.api.ContactId;
-import net.sf.briar.api.plugins.DuplexPlugin;
-import net.sf.briar.api.plugins.DuplexTransportConnection;
+import net.sf.briar.api.plugins.duplex.DuplexPlugin;
+import net.sf.briar.api.plugins.duplex.DuplexTransportConnection;
 
 abstract class DuplexTest {
 
diff --git a/test/net/sf/briar/plugins/file/RemovableDrivePluginTest.java b/test/net/sf/briar/plugins/file/RemovableDrivePluginTest.java
index d12edcf82980d806dc3648053d692ef7a0b9fd39..8de3042bc620c8545358bc7aa146a6f083ce07b2 100644
--- a/test/net/sf/briar/plugins/file/RemovableDrivePluginTest.java
+++ b/test/net/sf/briar/plugins/file/RemovableDrivePluginTest.java
@@ -13,8 +13,8 @@ import java.util.concurrent.Executor;
 import net.sf.briar.BriarTestCase;
 import net.sf.briar.TestUtils;
 import net.sf.briar.api.ContactId;
-import net.sf.briar.api.plugins.SimplexPluginCallback;
-import net.sf.briar.api.plugins.SimplexTransportWriter;
+import net.sf.briar.api.plugins.simplex.SimplexPluginCallback;
+import net.sf.briar.api.plugins.simplex.SimplexTransportWriter;
 import net.sf.briar.api.transport.TransportConstants;
 import net.sf.briar.plugins.ImmediateExecutor;
 import net.sf.briar.plugins.file.RemovableDriveMonitor.Callback;
diff --git a/test/net/sf/briar/plugins/socket/SimpleSocketPluginTest.java b/test/net/sf/briar/plugins/socket/SimpleSocketPluginTest.java
index e9aec16c7156a680d8501c08c31f493496dacce1..10cfe900b479f0534f508e02caa9b074b999b07b 100644
--- a/test/net/sf/briar/plugins/socket/SimpleSocketPluginTest.java
+++ b/test/net/sf/briar/plugins/socket/SimpleSocketPluginTest.java
@@ -16,8 +16,8 @@ import net.sf.briar.BriarTestCase;
 import net.sf.briar.api.ContactId;
 import net.sf.briar.api.TransportConfig;
 import net.sf.briar.api.TransportProperties;
-import net.sf.briar.api.plugins.DuplexPluginCallback;
-import net.sf.briar.api.plugins.DuplexTransportConnection;
+import net.sf.briar.api.plugins.duplex.DuplexPluginCallback;
+import net.sf.briar.api.plugins.duplex.DuplexTransportConnection;
 
 import org.junit.Test;
 
diff --git a/test/net/sf/briar/protocol/simplex/TestSimplexTransportReader.java b/test/net/sf/briar/protocol/simplex/TestSimplexTransportReader.java
index c8ccd632c8d1c4666a36e4f8981f612fbdb3b615..1d85ed3ec57599ea7e3e49b273bf1e09313c4db3 100644
--- a/test/net/sf/briar/protocol/simplex/TestSimplexTransportReader.java
+++ b/test/net/sf/briar/protocol/simplex/TestSimplexTransportReader.java
@@ -2,7 +2,7 @@ package net.sf.briar.protocol.simplex;
 
 import java.io.InputStream;
 
-import net.sf.briar.api.plugins.SimplexTransportReader;
+import net.sf.briar.api.plugins.simplex.SimplexTransportReader;
 
 class TestSimplexTransportReader implements SimplexTransportReader {
 
diff --git a/test/net/sf/briar/protocol/simplex/TestSimplexTransportWriter.java b/test/net/sf/briar/protocol/simplex/TestSimplexTransportWriter.java
index 82a8c9e2336df2ad325269fc734a521c5e6ce66f..7a1524cb5761d6e43899a4f1e6860183dd4451c2 100644
--- a/test/net/sf/briar/protocol/simplex/TestSimplexTransportWriter.java
+++ b/test/net/sf/briar/protocol/simplex/TestSimplexTransportWriter.java
@@ -3,7 +3,7 @@ package net.sf.briar.protocol.simplex;
 import java.io.ByteArrayOutputStream;
 import java.io.OutputStream;
 
-import net.sf.briar.api.plugins.SimplexTransportWriter;
+import net.sf.briar.api.plugins.simplex.SimplexTransportWriter;
 
 class TestSimplexTransportWriter implements SimplexTransportWriter {