From ab9b05448ded260168073f0c4bc8da847045812f Mon Sep 17 00:00:00 2001
From: akwizgran <akwizgran@users.sourceforge.net>
Date: Fri, 13 Jan 2012 10:53:23 +0000
Subject: [PATCH] APIs for segmented transports.

---
 .../plugins/{ => duplex}/DuplexPlugin.java    |  5 +-
 .../{ => duplex}/DuplexPluginCallback.java    |  5 +-
 .../{ => duplex}/DuplexPluginFactory.java     |  2 +-
 .../plugins/duplex/DuplexSegmentedPlugin.java | 29 +++++++++++
 .../duplex/DuplexSegmentedPluginCallback.java | 16 ++++++
 .../duplex/DuplexSegmentedPluginFactory.java  | 10 ++++
 .../DuplexSegmentedTransportConnection.java   | 33 ++++++++++++
 .../DuplexTransportConnection.java            |  2 +-
 .../plugins/{ => simplex}/SimplexPlugin.java  |  3 +-
 .../{ => simplex}/SimplexPluginCallback.java  |  6 ++-
 .../{ => simplex}/SimplexPluginFactory.java   |  2 +-
 .../simplex/SimplexSegmentedPlugin.java       | 50 +++++++++++++++++++
 .../SimplexSegmentedPluginCallback.java       | 15 ++++++
 .../SimplexSegmentedPluginFactory.java        |  9 ++++
 .../SimplexSegmentedTransportReader.java      | 25 ++++++++++
 .../SimplexSegmentedTransportWriter.java      | 28 +++++++++++
 .../{ => simplex}/SimplexTransportReader.java |  2 +-
 .../{ => simplex}/SimplexTransportWriter.java |  2 +-
 .../duplex/DuplexConnectionFactory.java       |  2 +-
 .../simplex/SimplexConnectionFactory.java     |  4 +-
 .../api/transport/ConnectionDispatcher.java   |  6 +--
 .../sf/briar/plugins/PluginManagerImpl.java   | 18 +++----
 .../plugins/bluetooth/BluetoothPlugin.java    |  6 +--
 .../bluetooth/BluetoothPluginFactory.java     |  6 +--
 .../BluetoothTransportConnection.java         |  2 +-
 .../net/sf/briar/plugins/file/FilePlugin.java |  8 +--
 .../plugins/file/FileTransportReader.java     |  2 +-
 .../plugins/file/FileTransportWriter.java     |  2 +-
 .../plugins/file/RemovableDrivePlugin.java    |  2 +-
 .../file/RemovableDrivePluginFactory.java     |  6 +--
 .../briar/plugins/socket/LanSocketPlugin.java |  4 +-
 .../plugins/socket/SimpleSocketPlugin.java    |  4 +-
 .../socket/SimpleSocketPluginFactory.java     |  6 +--
 .../sf/briar/plugins/socket/SocketPlugin.java |  6 +--
 .../socket/SocketTransportConnection.java     |  2 +-
 .../protocol/duplex/DuplexConnection.java     |  2 +-
 .../duplex/IncomingDuplexConnection.java      |  2 +-
 .../duplex/OutgoingDuplexConnection.java      |  2 +-
 .../duplex/StreamConnectionFactoryImpl.java   |  2 +-
 .../simplex/IncomingSimplexConnection.java    |  2 +-
 .../simplex/OutgoingSimplexConnection.java    |  2 +-
 .../simplex/SimplexConnectionFactoryImpl.java |  4 +-
 .../transport/ConnectionDispatcherImpl.java   |  6 +--
 .../sf/briar/plugins/DuplexClientTest.java    |  4 +-
 .../sf/briar/plugins/DuplexServerTest.java    |  4 +-
 test/net/sf/briar/plugins/DuplexTest.java     |  4 +-
 .../file/RemovableDrivePluginTest.java        |  4 +-
 .../socket/SimpleSocketPluginTest.java        |  4 +-
 .../simplex/TestSimplexTransportReader.java   |  2 +-
 .../simplex/TestSimplexTransportWriter.java   |  2 +-
 50 files changed, 298 insertions(+), 78 deletions(-)
 rename api/net/sf/briar/api/plugins/{ => duplex}/DuplexPlugin.java (83%)
 rename api/net/sf/briar/api/plugins/{ => duplex}/DuplexPluginCallback.java (59%)
 rename api/net/sf/briar/api/plugins/{ => duplex}/DuplexPluginFactory.java (80%)
 create mode 100644 api/net/sf/briar/api/plugins/duplex/DuplexSegmentedPlugin.java
 create mode 100644 api/net/sf/briar/api/plugins/duplex/DuplexSegmentedPluginCallback.java
 create mode 100644 api/net/sf/briar/api/plugins/duplex/DuplexSegmentedPluginFactory.java
 create mode 100644 api/net/sf/briar/api/plugins/duplex/DuplexSegmentedTransportConnection.java
 rename api/net/sf/briar/api/plugins/{ => duplex}/DuplexTransportConnection.java (96%)
 rename api/net/sf/briar/api/plugins/{ => simplex}/SimplexPlugin.java (94%)
 rename api/net/sf/briar/api/plugins/{ => simplex}/SimplexPluginCallback.java (54%)
 rename api/net/sf/briar/api/plugins/{ => simplex}/SimplexPluginFactory.java (80%)
 create mode 100644 api/net/sf/briar/api/plugins/simplex/SimplexSegmentedPlugin.java
 create mode 100644 api/net/sf/briar/api/plugins/simplex/SimplexSegmentedPluginCallback.java
 create mode 100644 api/net/sf/briar/api/plugins/simplex/SimplexSegmentedPluginFactory.java
 create mode 100644 api/net/sf/briar/api/plugins/simplex/SimplexSegmentedTransportReader.java
 create mode 100644 api/net/sf/briar/api/plugins/simplex/SimplexSegmentedTransportWriter.java
 rename api/net/sf/briar/api/plugins/{ => simplex}/SimplexTransportReader.java (94%)
 rename api/net/sf/briar/api/plugins/{ => simplex}/SimplexTransportWriter.java (94%)

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 45656e4023..fed6e5fd63 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 0c240a2d2e..190f67170f 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 25159e41b8..5d9609ff90 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 0000000000..3832cdc3e8
--- /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 0000000000..571b617450
--- /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 0000000000..d32e372faf
--- /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 0000000000..3ff0346220
--- /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 8f03d8b9bb..f5c40e1e46 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 c59553d069..4b06f54f3b 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 6c52a9bb6d..2e808f7eae 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 d007f1b336..d114ec376b 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 0000000000..1f68244ca3
--- /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 0000000000..6f116eb91d
--- /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 0000000000..1657c5f280
--- /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 0000000000..0d9272d558
--- /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 0000000000..e6c09b3a3e
--- /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 70e696eb77..3eb5ea1361 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 58071a7837..ea5c316845 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 0b79f4211e..94b22389bc 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 1fa1f30c27..7c18457c0b 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 d75a3ad684..4d2e144136 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 9276fcc096..652882fd45 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 af068999d5..007106cb2c 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 511f874e2a..615c3c66d9 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 baab4332fe..4a110cf94b 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 eb4c86e42e..5cd992a78a 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 a7df1d3984..71b3a19909 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 e311196907..056e4f05bd 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 200588f21a..a42eb152c1 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 545380c187..689efc8502 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 a6bae33bc6..53290881f4 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 f6efe6fbcb..69d948dcb0 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 e5b2f07bde..d8499fb32e 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 8292a446fc..5fcbf24a6f 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 dc34294535..a9e147faf8 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 7ebba90f3b..b55689222e 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 34059ca58a..75e6554cdf 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 b4a4c0d03f..aee3b4d83b 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 8f4b3c40d4..3a2953abbf 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 6b81a318a9..224071e59a 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 da080bb371..f7e404bf0a 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 3e5d1e16ce..6dfa5892f0 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 ea19fb1bb3..42c3b6cba3 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 9e11a93e04..dd051cf37b 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 0681010363..008ab8108f 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 586acb928a..1eeb292b84 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 d12edcf829..8de3042bc6 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 e9aec16c71..10cfe900b4 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 c8ccd632c8..1d85ed3ec5 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 82a8c9e233..7a1524cb57 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 {
 
-- 
GitLab