diff --git a/api/net/sf/briar/api/transport/BatchConnectionFactory.java b/api/net/sf/briar/api/protocol/batch/BatchConnectionFactory.java
similarity index 60%
rename from api/net/sf/briar/api/transport/BatchConnectionFactory.java
rename to api/net/sf/briar/api/protocol/batch/BatchConnectionFactory.java
index eab7395aab24aecc5dfdd3db1531f825ec5bcca2..8f7bca029b12d4032c7513ed0141c89dfeaa2fa3 100644
--- a/api/net/sf/briar/api/transport/BatchConnectionFactory.java
+++ b/api/net/sf/briar/api/protocol/batch/BatchConnectionFactory.java
@@ -1,7 +1,10 @@
-package net.sf.briar.api.transport;
+package net.sf.briar.api.protocol.batch;
 
 import net.sf.briar.api.ContactId;
 import net.sf.briar.api.protocol.TransportIndex;
+import net.sf.briar.api.transport.BatchTransportReader;
+import net.sf.briar.api.transport.BatchTransportWriter;
+import net.sf.briar.api.transport.ConnectionContext;
 
 public interface BatchConnectionFactory {
 
diff --git a/api/net/sf/briar/api/transport/StreamConnectionFactory.java b/api/net/sf/briar/api/protocol/stream/StreamConnectionFactory.java
similarity index 67%
rename from api/net/sf/briar/api/transport/StreamConnectionFactory.java
rename to api/net/sf/briar/api/protocol/stream/StreamConnectionFactory.java
index 1cabf37e3390d5a758d15030578176e092a7e9eb..5cf78317e979b23e167bd88db12e09dd625dae2f 100644
--- a/api/net/sf/briar/api/transport/StreamConnectionFactory.java
+++ b/api/net/sf/briar/api/protocol/stream/StreamConnectionFactory.java
@@ -1,7 +1,9 @@
-package net.sf.briar.api.transport;
+package net.sf.briar.api.protocol.stream;
 
 import net.sf.briar.api.ContactId;
 import net.sf.briar.api.protocol.TransportIndex;
+import net.sf.briar.api.transport.ConnectionContext;
+import net.sf.briar.api.transport.StreamTransportConnection;
 
 public interface StreamConnectionFactory {
 
diff --git a/components/net/sf/briar/transport/batch/BatchConnectionFactoryImpl.java b/components/net/sf/briar/protocol/batch/BatchConnectionFactoryImpl.java
similarity index 96%
rename from components/net/sf/briar/transport/batch/BatchConnectionFactoryImpl.java
rename to components/net/sf/briar/protocol/batch/BatchConnectionFactoryImpl.java
index 3afe1a4fa38f91da25c6a940d22cae40937877a7..6fba90348f671e0fdbab711db6724102b9eb96c3 100644
--- a/components/net/sf/briar/transport/batch/BatchConnectionFactoryImpl.java
+++ b/components/net/sf/briar/protocol/batch/BatchConnectionFactoryImpl.java
@@ -1,4 +1,4 @@
-package net.sf.briar.transport.batch;
+package net.sf.briar.protocol.batch;
 
 import java.util.concurrent.Executor;
 
@@ -9,7 +9,7 @@ import net.sf.briar.api.protocol.ProtocolReaderFactory;
 import net.sf.briar.api.protocol.ProtocolWriterFactory;
 import net.sf.briar.api.protocol.TransportIndex;
 import net.sf.briar.api.protocol.VerificationExecutor;
-import net.sf.briar.api.transport.BatchConnectionFactory;
+import net.sf.briar.api.protocol.batch.BatchConnectionFactory;
 import net.sf.briar.api.transport.BatchTransportReader;
 import net.sf.briar.api.transport.BatchTransportWriter;
 import net.sf.briar.api.transport.ConnectionContext;
diff --git a/components/net/sf/briar/transport/batch/IncomingBatchConnection.java b/components/net/sf/briar/protocol/batch/IncomingBatchConnection.java
similarity index 99%
rename from components/net/sf/briar/transport/batch/IncomingBatchConnection.java
rename to components/net/sf/briar/protocol/batch/IncomingBatchConnection.java
index 074245db4ac1a6d5b31898aea239da994a7525e1..09fca527316b59aced24860ecf1055c785cf52b6 100644
--- a/components/net/sf/briar/transport/batch/IncomingBatchConnection.java
+++ b/components/net/sf/briar/protocol/batch/IncomingBatchConnection.java
@@ -1,4 +1,4 @@
-package net.sf.briar.transport.batch;
+package net.sf.briar.protocol.batch;
 
 import java.io.IOException;
 import java.io.InputStream;
diff --git a/components/net/sf/briar/transport/batch/OutgoingBatchConnection.java b/components/net/sf/briar/protocol/batch/OutgoingBatchConnection.java
similarity index 99%
rename from components/net/sf/briar/transport/batch/OutgoingBatchConnection.java
rename to components/net/sf/briar/protocol/batch/OutgoingBatchConnection.java
index 57b45b3fa37ea9ea9ce2c3cf86b526872c99cb76..e9811587fd3e6e0dbbb38cc06d0d08d7d73f2483 100644
--- a/components/net/sf/briar/transport/batch/OutgoingBatchConnection.java
+++ b/components/net/sf/briar/protocol/batch/OutgoingBatchConnection.java
@@ -1,4 +1,4 @@
-package net.sf.briar.transport.batch;
+package net.sf.briar.protocol.batch;
 
 import static net.sf.briar.api.protocol.ProtocolConstants.MAX_PACKET_LENGTH;
 
diff --git a/components/net/sf/briar/transport/batch/TransportBatchModule.java b/components/net/sf/briar/protocol/batch/ProtocolBatchModule.java
similarity index 58%
rename from components/net/sf/briar/transport/batch/TransportBatchModule.java
rename to components/net/sf/briar/protocol/batch/ProtocolBatchModule.java
index 633b4a67e1512ae18d3a74446bfb1529a74aef99..e5ce39b198d36895d66b26c5f1b3e9784a19cf13 100644
--- a/components/net/sf/briar/transport/batch/TransportBatchModule.java
+++ b/components/net/sf/briar/protocol/batch/ProtocolBatchModule.java
@@ -1,11 +1,11 @@
-package net.sf.briar.transport.batch;
+package net.sf.briar.protocol.batch;
 
-import net.sf.briar.api.transport.BatchConnectionFactory;
+import net.sf.briar.api.protocol.batch.BatchConnectionFactory;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.Singleton;
 
-public class TransportBatchModule extends AbstractModule {
+public class ProtocolBatchModule extends AbstractModule {
 
 	@Override
 	protected void configure() {
diff --git a/components/net/sf/briar/transport/stream/IncomingStreamConnection.java b/components/net/sf/briar/protocol/stream/IncomingStreamConnection.java
similarity index 97%
rename from components/net/sf/briar/transport/stream/IncomingStreamConnection.java
rename to components/net/sf/briar/protocol/stream/IncomingStreamConnection.java
index 6fcf17e6a221ee8b036c781d244a7a1c6304a915..e7229ab7ac5f94b83cb3323ff8bebe7c5e8e3df3 100644
--- a/components/net/sf/briar/transport/stream/IncomingStreamConnection.java
+++ b/components/net/sf/briar/protocol/stream/IncomingStreamConnection.java
@@ -1,4 +1,4 @@
-package net.sf.briar.transport.stream;
+package net.sf.briar.protocol.stream;
 
 import java.io.IOException;
 import java.util.concurrent.Executor;
diff --git a/components/net/sf/briar/transport/stream/OutgoingStreamConnection.java b/components/net/sf/briar/protocol/stream/OutgoingStreamConnection.java
similarity index 98%
rename from components/net/sf/briar/transport/stream/OutgoingStreamConnection.java
rename to components/net/sf/briar/protocol/stream/OutgoingStreamConnection.java
index d7c41336da8e1b2f6ce2acd505baa03d54b091d2..c27724f1424b624f044bfe0b23f2271d975f2137 100644
--- a/components/net/sf/briar/transport/stream/OutgoingStreamConnection.java
+++ b/components/net/sf/briar/protocol/stream/OutgoingStreamConnection.java
@@ -1,4 +1,4 @@
-package net.sf.briar.transport.stream;
+package net.sf.briar.protocol.stream;
 
 import java.io.IOException;
 import java.util.concurrent.Executor;
diff --git a/components/net/sf/briar/transport/stream/TransportStreamModule.java b/components/net/sf/briar/protocol/stream/ProtocolStreamModule.java
similarity index 58%
rename from components/net/sf/briar/transport/stream/TransportStreamModule.java
rename to components/net/sf/briar/protocol/stream/ProtocolStreamModule.java
index fb55479fafe50f745ccfb66429819ae2a5c9fb27..d870d248b998a0ea3136c671309867757477454f 100644
--- a/components/net/sf/briar/transport/stream/TransportStreamModule.java
+++ b/components/net/sf/briar/protocol/stream/ProtocolStreamModule.java
@@ -1,11 +1,11 @@
-package net.sf.briar.transport.stream;
+package net.sf.briar.protocol.stream;
 
-import net.sf.briar.api.transport.StreamConnectionFactory;
+import net.sf.briar.api.protocol.stream.StreamConnectionFactory;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.Singleton;
 
-public class TransportStreamModule extends AbstractModule {
+public class ProtocolStreamModule extends AbstractModule {
 
 	@Override
 	protected void configure() {
diff --git a/components/net/sf/briar/transport/stream/StreamConnection.java b/components/net/sf/briar/protocol/stream/StreamConnection.java
similarity index 99%
rename from components/net/sf/briar/transport/stream/StreamConnection.java
rename to components/net/sf/briar/protocol/stream/StreamConnection.java
index a3af59c873abee57fc08586dcbaec868342dd00f..f91714c46b85adcff02f46e895dc65361dc5a9ed 100644
--- a/components/net/sf/briar/transport/stream/StreamConnection.java
+++ b/components/net/sf/briar/protocol/stream/StreamConnection.java
@@ -1,4 +1,4 @@
-package net.sf.briar.transport.stream;
+package net.sf.briar.protocol.stream;
 
 import java.io.IOException;
 import java.io.InputStream;
diff --git a/components/net/sf/briar/transport/stream/StreamConnectionFactoryImpl.java b/components/net/sf/briar/protocol/stream/StreamConnectionFactoryImpl.java
similarity index 96%
rename from components/net/sf/briar/transport/stream/StreamConnectionFactoryImpl.java
rename to components/net/sf/briar/protocol/stream/StreamConnectionFactoryImpl.java
index b6c100996bf170a9f67609ac44d464e2640291c0..2b27c91eaa51a60f0d67479354e0091105dc9eb6 100644
--- a/components/net/sf/briar/transport/stream/StreamConnectionFactoryImpl.java
+++ b/components/net/sf/briar/protocol/stream/StreamConnectionFactoryImpl.java
@@ -1,4 +1,4 @@
-package net.sf.briar.transport.stream;
+package net.sf.briar.protocol.stream;
 
 import java.util.concurrent.Executor;
 
@@ -9,10 +9,10 @@ import net.sf.briar.api.protocol.ProtocolReaderFactory;
 import net.sf.briar.api.protocol.ProtocolWriterFactory;
 import net.sf.briar.api.protocol.TransportIndex;
 import net.sf.briar.api.protocol.VerificationExecutor;
+import net.sf.briar.api.protocol.stream.StreamConnectionFactory;
 import net.sf.briar.api.transport.ConnectionContext;
 import net.sf.briar.api.transport.ConnectionReaderFactory;
 import net.sf.briar.api.transport.ConnectionWriterFactory;
-import net.sf.briar.api.transport.StreamConnectionFactory;
 import net.sf.briar.api.transport.StreamTransportConnection;
 
 import com.google.inject.Inject;
diff --git a/components/net/sf/briar/transport/ConnectionDispatcherImpl.java b/components/net/sf/briar/transport/ConnectionDispatcherImpl.java
index 1415e242e805a533686608451ba9693f6a83bb59..b35d48d5c87c1871d4a8ee620a6bf163e09a6f61 100644
--- a/components/net/sf/briar/transport/ConnectionDispatcherImpl.java
+++ b/components/net/sf/briar/transport/ConnectionDispatcherImpl.java
@@ -9,14 +9,14 @@ import net.sf.briar.api.ContactId;
 import net.sf.briar.api.db.DbException;
 import net.sf.briar.api.protocol.TransportId;
 import net.sf.briar.api.protocol.TransportIndex;
-import net.sf.briar.api.transport.BatchConnectionFactory;
+import net.sf.briar.api.protocol.batch.BatchConnectionFactory;
+import net.sf.briar.api.protocol.stream.StreamConnectionFactory;
 import net.sf.briar.api.transport.BatchTransportReader;
 import net.sf.briar.api.transport.BatchTransportWriter;
 import net.sf.briar.api.transport.ConnectionContext;
 import net.sf.briar.api.transport.ConnectionDispatcher;
 import net.sf.briar.api.transport.ConnectionRecogniser;
 import net.sf.briar.api.transport.ConnectionRecogniser.Callback;
-import net.sf.briar.api.transport.StreamConnectionFactory;
 import net.sf.briar.api.transport.StreamTransportConnection;
 import net.sf.briar.api.transport.TransportConstants;
 
diff --git a/test/build.xml b/test/build.xml
index ddb7c805fb133bcbdbb85538791c969384e75772..62fc80685ca28919793da009f517d345b8a97277 100644
--- a/test/build.xml
+++ b/test/build.xml
@@ -44,6 +44,7 @@
 			<test name='net.sf.briar.protocol.ProtocolWriterImplTest'/>
 			<test name='net.sf.briar.protocol.RequestReaderTest'/>
 			<test name='net.sf.briar.protocol.UnverifiedBatchImplTest'/>
+			<test name='net.sf.briar.protocol.batch.BatchConnectionReadWriteTest'/>
 			<test name='net.sf.briar.serial.ReaderImplTest'/>
 			<test name='net.sf.briar.serial.WriterImplTest'/>
 			<test name='net.sf.briar.setup.SetupWorkerTest'/>
@@ -55,7 +56,6 @@
 			<test name='net.sf.briar.transport.ConnectionWriterImplTest'/>
 			<test name='net.sf.briar.transport.ConnectionWriterTest'/>
 			<test name='net.sf.briar.transport.FrameReadWriteTest'/>
-			<test name='net.sf.briar.transport.batch.BatchConnectionReadWriteTest'/>
 			<test name='net.sf.briar.util.ByteUtilsTest'/>
 			<test name='net.sf.briar.util.FileUtilsTest'/>
 			<test name='net.sf.briar.util.StringUtilsTest'/>
diff --git a/test/net/sf/briar/ProtocolIntegrationTest.java b/test/net/sf/briar/ProtocolIntegrationTest.java
index ca726f7a866def51efae31b5d012db204d1a8ff8..8d22479fe74229d49dc0ad18f1aedcaca27dd400 100644
--- a/test/net/sf/briar/ProtocolIntegrationTest.java
+++ b/test/net/sf/briar/ProtocolIntegrationTest.java
@@ -52,10 +52,10 @@ import net.sf.briar.crypto.CryptoModule;
 import net.sf.briar.db.DatabaseModule;
 import net.sf.briar.lifecycle.LifecycleModule;
 import net.sf.briar.protocol.ProtocolModule;
+import net.sf.briar.protocol.batch.ProtocolBatchModule;
+import net.sf.briar.protocol.stream.ProtocolStreamModule;
 import net.sf.briar.serial.SerialModule;
 import net.sf.briar.transport.TransportModule;
-import net.sf.briar.transport.batch.TransportBatchModule;
-import net.sf.briar.transport.stream.TransportStreamModule;
 
 import org.junit.Test;
 
@@ -97,8 +97,8 @@ public class ProtocolIntegrationTest extends TestCase {
 		Injector i = Guice.createInjector(testModule, new CryptoModule(),
 				new DatabaseModule(), new LifecycleModule(),
 				new ProtocolModule(), new SerialModule(),
-				new TestDatabaseModule(), new TransportBatchModule(),
-				new TransportModule(), new TransportStreamModule());
+				new TestDatabaseModule(), new ProtocolBatchModule(),
+				new TransportModule(), new ProtocolStreamModule());
 		connectionReaderFactory = i.getInstance(ConnectionReaderFactory.class);
 		connectionWriterFactory = i.getInstance(ConnectionWriterFactory.class);
 		protocolReaderFactory = i.getInstance(ProtocolReaderFactory.class);
diff --git a/test/net/sf/briar/db/H2DatabaseTest.java b/test/net/sf/briar/db/H2DatabaseTest.java
index 5dbaea4a212dd72ca1e66e771bb5685cd13b672b..56e441b0972c01e28c6e838b1788e24a2dcf7d2d 100644
--- a/test/net/sf/briar/db/H2DatabaseTest.java
+++ b/test/net/sf/briar/db/H2DatabaseTest.java
@@ -46,10 +46,10 @@ import net.sf.briar.api.transport.ConnectionWindowFactory;
 import net.sf.briar.crypto.CryptoModule;
 import net.sf.briar.lifecycle.LifecycleModule;
 import net.sf.briar.protocol.ProtocolModule;
+import net.sf.briar.protocol.batch.ProtocolBatchModule;
+import net.sf.briar.protocol.stream.ProtocolStreamModule;
 import net.sf.briar.serial.SerialModule;
 import net.sf.briar.transport.TransportModule;
-import net.sf.briar.transport.batch.TransportBatchModule;
-import net.sf.briar.transport.stream.TransportStreamModule;
 
 import org.apache.commons.io.FileSystemUtils;
 import org.junit.After;
@@ -107,8 +107,8 @@ public class H2DatabaseTest extends TestCase {
 		Injector i = Guice.createInjector(testModule, new CryptoModule(),
 				new DatabaseModule(), new LifecycleModule(),
 				new ProtocolModule(), new SerialModule(),
-				new TransportBatchModule(), new TransportModule(),
-				new TransportStreamModule(), new TestDatabaseModule(testDir));
+				new ProtocolBatchModule(), new TransportModule(),
+				new ProtocolStreamModule(), new TestDatabaseModule(testDir));
 		connectionContextFactory =
 			i.getInstance(ConnectionContextFactory.class);
 		connectionWindowFactory = i.getInstance(ConnectionWindowFactory.class);
diff --git a/test/net/sf/briar/transport/batch/BatchConnectionReadWriteTest.java b/test/net/sf/briar/protocol/batch/BatchConnectionReadWriteTest.java
similarity index 95%
rename from test/net/sf/briar/transport/batch/BatchConnectionReadWriteTest.java
rename to test/net/sf/briar/protocol/batch/BatchConnectionReadWriteTest.java
index 6895b52a48d58342c6ff6f0de81659eb78661b55..10af1dcb99f89b5e636dad05b45df445895f76d7 100644
--- a/test/net/sf/briar/transport/batch/BatchConnectionReadWriteTest.java
+++ b/test/net/sf/briar/protocol/batch/BatchConnectionReadWriteTest.java
@@ -1,4 +1,4 @@
-package net.sf.briar.transport.batch;
+package net.sf.briar.protocol.batch;
 
 import static net.sf.briar.api.transport.TransportConstants.TAG_LENGTH;
 
@@ -43,9 +43,12 @@ import net.sf.briar.db.DatabaseModule;
 import net.sf.briar.lifecycle.LifecycleModule;
 import net.sf.briar.plugins.ImmediateExecutor;
 import net.sf.briar.protocol.ProtocolModule;
+import net.sf.briar.protocol.batch.IncomingBatchConnection;
+import net.sf.briar.protocol.batch.OutgoingBatchConnection;
+import net.sf.briar.protocol.batch.ProtocolBatchModule;
+import net.sf.briar.protocol.stream.ProtocolStreamModule;
 import net.sf.briar.serial.SerialModule;
 import net.sf.briar.transport.TransportModule;
-import net.sf.briar.transport.stream.TransportStreamModule;
 
 import org.junit.After;
 import org.junit.Before;
@@ -97,8 +100,8 @@ public class BatchConnectionReadWriteTest extends TestCase {
 		return Guice.createInjector(testModule, new CryptoModule(),
 				new DatabaseModule(), new LifecycleModule(),
 				new ProtocolModule(), new SerialModule(),
-				new TestDatabaseModule(dir), new TransportBatchModule(),
-				new TransportModule(), new TransportStreamModule());
+				new TestDatabaseModule(dir), new ProtocolBatchModule(),
+				new TransportModule(), new ProtocolStreamModule());
 	}
 
 	@Test
diff --git a/test/net/sf/briar/transport/ConnectionWriterTest.java b/test/net/sf/briar/transport/ConnectionWriterTest.java
index d4aa42103a3c5a9ce27eb46836f84693c13beb5d..9e01fd3c0836b50c8a38203e91bb264e299120b5 100644
--- a/test/net/sf/briar/transport/ConnectionWriterTest.java
+++ b/test/net/sf/briar/transport/ConnectionWriterTest.java
@@ -16,9 +16,9 @@ import net.sf.briar.crypto.CryptoModule;
 import net.sf.briar.db.DatabaseModule;
 import net.sf.briar.lifecycle.LifecycleModule;
 import net.sf.briar.protocol.ProtocolModule;
+import net.sf.briar.protocol.batch.ProtocolBatchModule;
+import net.sf.briar.protocol.stream.ProtocolStreamModule;
 import net.sf.briar.serial.SerialModule;
-import net.sf.briar.transport.batch.TransportBatchModule;
-import net.sf.briar.transport.stream.TransportStreamModule;
 
 import org.junit.Test;
 
@@ -44,8 +44,8 @@ public class ConnectionWriterTest extends TestCase {
 		Injector i = Guice.createInjector(testModule, new CryptoModule(),
 				new DatabaseModule(), new LifecycleModule(),
 				new ProtocolModule(), new SerialModule(),
-				new TestDatabaseModule(), new TransportBatchModule(),
-				new TransportModule(), new TransportStreamModule());
+				new TestDatabaseModule(), new ProtocolBatchModule(),
+				new TransportModule(), new ProtocolStreamModule());
 		connectionWriterFactory = i.getInstance(ConnectionWriterFactory.class);
 		secret = new byte[32];
 		new Random().nextBytes(secret);