From 9a78071bde68d4bd6e50ed526eb244c05c8f8479 Mon Sep 17 00:00:00 2001
From: akwizgran <michael@briarproject.org>
Date: Wed, 30 Jan 2013 17:48:43 +0000
Subject: [PATCH] Refactoring: renamed package 'protocol' -> 'messaging'.

---
 .../net/sf/briar/api/crypto/KeyManager.java   |  2 +-
 .../sf/briar/api/db/DatabaseComponent.java    | 30 ++++-----
 .../net/sf/briar/api/db/MessageHeader.java    |  6 +-
 .../api/db/event/RatingChangedEvent.java      |  2 +-
 .../event/RemoteTransportsUpdatedEvent.java   |  2 +-
 .../api/db/event/TransportAddedEvent.java     |  2 +-
 .../api/db/event/TransportRemovedEvent.java   |  2 +-
 .../api/{protocol => messaging}/Ack.java      |  2 +-
 .../api/{protocol => messaging}/Author.java   |  2 +-
 .../AuthorFactory.java                        |  2 +-
 .../api/{protocol => messaging}/AuthorId.java |  2 +-
 .../api/{protocol => messaging}/Group.java    |  2 +-
 .../{protocol => messaging}/GroupFactory.java |  2 +-
 .../api/{protocol => messaging}/GroupId.java  |  2 +-
 .../api/{protocol => messaging}/Message.java  |  2 +-
 .../MessageFactory.java                       |  2 +-
 .../{protocol => messaging}/MessageId.java    |  2 +-
 .../MessageVerifier.java                      |  2 +-
 .../MessagingConstants.java}                  |  4 +-
 .../api/{protocol => messaging}/Offer.java    |  2 +-
 .../PacketReader.java}                        |  4 +-
 .../api/messaging/PacketReaderFactory.java    |  8 +++
 .../PacketWriter.java}                        |  4 +-
 .../api/messaging/PacketWriterFactory.java    |  8 +++
 .../api/{protocol => messaging}/Request.java  |  2 +-
 .../{protocol => messaging}/RetentionAck.java |  2 +-
 .../RetentionUpdate.java                      |  2 +-
 .../SubscriptionAck.java                      |  2 +-
 .../SubscriptionUpdate.java                   |  2 +-
 .../{protocol => messaging}/TransportAck.java |  2 +-
 .../{protocol => messaging}/TransportId.java  |  2 +-
 .../TransportUpdate.java                      |  2 +-
 .../api/{protocol => messaging}/Types.java    |  2 +-
 .../api/{protocol => messaging}/UniqueId.java |  2 +-
 .../UnverifiedMessage.java                    |  2 +-
 .../VerificationExecutor.java                 |  2 +-
 .../duplex/DuplexConnectionFactory.java       |  4 +-
 .../simplex/SimplexConnectionFactory.java     |  4 +-
 .../src/net/sf/briar/api/plugins/Plugin.java  |  2 +-
 .../plugins/duplex/DuplexPluginFactory.java   |  2 +-
 .../plugins/simplex/SimplexPluginFactory.java |  2 +-
 .../api/protocol/ProtocolReaderFactory.java   |  8 ---
 .../api/protocol/ProtocolWriterFactory.java   |  8 ---
 .../api/transport/ConnectionContext.java      |  2 +-
 .../api/transport/ConnectionDispatcher.java   |  2 +-
 .../api/transport/ConnectionRecogniser.java   |  2 +-
 .../api/transport/ConnectionRegistry.java     |  2 +-
 .../net/sf/briar/api/transport/Endpoint.java  |  2 +-
 .../briar/api/transport/TemporarySecret.java  |  2 +-
 briar-core/src/net/sf/briar/db/Database.java  | 24 +++----
 .../sf/briar/db/DatabaseComponentImpl.java    | 30 ++++-----
 .../src/net/sf/briar/db/JdbcDatabase.java     | 24 +++----
 .../net/sf/briar/db/MessageHeaderImpl.java    |  6 +-
 .../AuthorFactoryImpl.java                    | 10 +--
 .../{protocol => messaging}/AuthorReader.java | 12 ++--
 .../GroupFactoryImpl.java                     | 10 +--
 .../{protocol => messaging}/GroupReader.java  | 12 ++--
 .../MessageFactoryImpl.java                   | 32 +++++-----
 .../{protocol => messaging}/MessageImpl.java  | 12 ++--
 .../MessageReader.java                        | 24 +++----
 .../MessageVerifierImpl.java                  | 18 +++---
 .../MessagingModule.java}                     | 30 ++++-----
 .../PacketReaderFactoryImpl.java}             | 18 +++---
 .../PacketReaderImpl.java}                    | 62 +++++++++----------
 .../messaging/PacketWriterFactoryImpl.java    | 28 +++++++++
 .../PacketWriterImpl.java}                    | 54 ++++++++--------
 .../SubscriptionUpdateReader.java             | 10 +--
 .../duplex/DuplexConnection.java              | 54 ++++++++--------
 .../duplex/DuplexConnectionFactoryImpl.java   | 20 +++---
 .../duplex/DuplexMessagingModule.java}        |  6 +-
 .../duplex/IncomingDuplexConnection.java      | 14 ++---
 .../duplex/OutgoingDuplexConnection.java      | 14 ++---
 .../simplex/IncomingSimplexConnection.java    | 36 +++++------
 .../simplex/OutgoingSimplexConnection.java    | 30 ++++-----
 .../simplex/SimplexConnectionFactoryImpl.java | 22 +++----
 .../simplex/SimplexMessagingModule.java}      |  6 +-
 .../sf/briar/plugins/PluginManagerImpl.java   |  2 +-
 .../plugins/bluetooth/BluetoothPlugin.java    |  2 +-
 .../bluetooth/BluetoothPluginFactory.java     |  2 +-
 .../plugins/droidtooth/DroidtoothPlugin.java  |  2 +-
 .../droidtooth/DroidtoothPluginFactory.java   |  2 +-
 .../plugins/file/RemovableDrivePlugin.java    |  2 +-
 .../file/RemovableDrivePluginFactory.java     |  2 +-
 .../sf/briar/plugins/modem/ModemPlugin.java   |  2 +-
 .../plugins/modem/ModemPluginFactory.java     |  2 +-
 .../sf/briar/plugins/tcp/LanTcpPlugin.java    |  2 +-
 .../plugins/tcp/LanTcpPluginFactory.java      |  2 +-
 .../sf/briar/plugins/tcp/WanTcpPlugin.java    |  2 +-
 .../plugins/tcp/WanTcpPluginFactory.java      |  2 +-
 .../net/sf/briar/plugins/tor/TorPlugin.java   |  2 +-
 .../briar/plugins/tor/TorPluginFactory.java   |  2 +-
 .../protocol/ProtocolWriterFactoryImpl.java   | 28 ---------
 .../sf/briar/serial/SerialComponentImpl.java  |  2 +-
 .../transport/ConnectionDispatcherImpl.java   |  6 +-
 .../transport/ConnectionRecogniserImpl.java   |  2 +-
 .../transport/ConnectionRegistryImpl.java     |  2 +-
 .../sf/briar/transport/KeyManagerImpl.java    |  2 +-
 .../TransportConnectionRecogniser.java        |  2 +-
 briar-tests/build.xml                         | 12 ++--
 .../net/sf/briar/ProtocolIntegrationTest.java | 60 +++++++++---------
 briar-tests/src/net/sf/briar/TestMessage.java |  8 +--
 briar-tests/src/net/sf/briar/TestUtils.java   |  2 +-
 .../sf/briar/db/DatabaseComponentTest.java    | 22 +++----
 .../src/net/sf/briar/db/H2DatabaseTest.java   | 12 ++--
 .../ConstantsTest.java                        | 49 ++++++++-------
 .../ConsumersTest.java                        |  2 +-
 .../PacketReaderImplTest.java}                | 35 ++++++-----
 .../PacketWriterImplTest.java}                | 18 +++---
 .../OutgoingSimplexConnectionTest.java        | 28 +++++----
 .../SimplexMessagingIntegrationTest.java}     | 41 ++++++------
 .../simplex/TestSimplexTransportReader.java   |  2 +-
 .../simplex/TestSimplexTransportWriter.java   |  2 +-
 .../briar/plugins/PluginManagerImplTest.java  |  2 +-
 .../transport/ConnectionRegistryImplTest.java |  2 +-
 .../TransportConnectionRecogniserTest.java    |  2 +-
 .../transport/TransportIntegrationTest.java   |  4 +-
 116 files changed, 584 insertions(+), 575 deletions(-)
 rename briar-api/src/net/sf/briar/api/{protocol => messaging}/Ack.java (91%)
 rename briar-api/src/net/sf/briar/api/{protocol => messaging}/Author.java (95%)
 rename briar-api/src/net/sf/briar/api/{protocol => messaging}/AuthorFactory.java (79%)
 rename briar-api/src/net/sf/briar/api/{protocol => messaging}/AuthorId.java (90%)
 rename briar-api/src/net/sf/briar/api/{protocol => messaging}/Group.java (95%)
 rename briar-api/src/net/sf/briar/api/{protocol => messaging}/GroupFactory.java (78%)
 rename briar-api/src/net/sf/briar/api/{protocol => messaging}/GroupId.java (90%)
 rename briar-api/src/net/sf/briar/api/{protocol => messaging}/Message.java (96%)
 rename briar-api/src/net/sf/briar/api/{protocol => messaging}/MessageFactory.java (97%)
 rename briar-api/src/net/sf/briar/api/{protocol => messaging}/MessageId.java (90%)
 rename briar-api/src/net/sf/briar/api/{protocol => messaging}/MessageVerifier.java (86%)
 rename briar-api/src/net/sf/briar/api/{protocol/ProtocolConstants.java => messaging/MessagingConstants.java} (94%)
 rename briar-api/src/net/sf/briar/api/{protocol => messaging}/Offer.java (91%)
 rename briar-api/src/net/sf/briar/api/{protocol/ProtocolReader.java => messaging/PacketReader.java} (93%)
 create mode 100644 briar-api/src/net/sf/briar/api/messaging/PacketReaderFactory.java
 rename briar-api/src/net/sf/briar/api/{protocol/ProtocolWriter.java => messaging/PacketWriter.java} (91%)
 create mode 100644 briar-api/src/net/sf/briar/api/messaging/PacketWriterFactory.java
 rename briar-api/src/net/sf/briar/api/{protocol => messaging}/Request.java (94%)
 rename briar-api/src/net/sf/briar/api/{protocol => messaging}/RetentionAck.java (89%)
 rename briar-api/src/net/sf/briar/api/{protocol => messaging}/RetentionUpdate.java (91%)
 rename briar-api/src/net/sf/briar/api/{protocol => messaging}/SubscriptionAck.java (89%)
 rename briar-api/src/net/sf/briar/api/{protocol => messaging}/SubscriptionUpdate.java (94%)
 rename briar-api/src/net/sf/briar/api/{protocol => messaging}/TransportAck.java (92%)
 rename briar-api/src/net/sf/briar/api/{protocol => messaging}/TransportId.java (91%)
 rename briar-api/src/net/sf/briar/api/{protocol => messaging}/TransportUpdate.java (95%)
 rename briar-api/src/net/sf/briar/api/{protocol => messaging}/Types.java (90%)
 rename briar-api/src/net/sf/briar/api/{protocol => messaging}/UniqueId.java (94%)
 rename briar-api/src/net/sf/briar/api/{protocol => messaging}/UnverifiedMessage.java (98%)
 rename briar-api/src/net/sf/briar/api/{protocol => messaging}/VerificationExecutor.java (92%)
 rename briar-api/src/net/sf/briar/api/{protocol => messaging}/duplex/DuplexConnectionFactory.java (80%)
 rename briar-api/src/net/sf/briar/api/{protocol => messaging}/simplex/SimplexConnectionFactory.java (82%)
 delete mode 100644 briar-api/src/net/sf/briar/api/protocol/ProtocolReaderFactory.java
 delete mode 100644 briar-api/src/net/sf/briar/api/protocol/ProtocolWriterFactory.java
 rename briar-core/src/net/sf/briar/{protocol => messaging}/AuthorFactoryImpl.java (82%)
 rename briar-core/src/net/sf/briar/{protocol => messaging}/AuthorReader.java (73%)
 rename briar-core/src/net/sf/briar/{protocol => messaging}/GroupFactoryImpl.java (83%)
 rename briar-core/src/net/sf/briar/{protocol => messaging}/GroupReader.java (74%)
 rename briar-core/src/net/sf/briar/{protocol => messaging}/MessageFactoryImpl.java (85%)
 rename briar-core/src/net/sf/briar/{protocol => messaging}/MessageImpl.java (84%)
 rename briar-core/src/net/sf/briar/{protocol => messaging}/MessageReader.java (79%)
 rename briar-core/src/net/sf/briar/{protocol => messaging}/MessageVerifierImpl.java (83%)
 rename briar-core/src/net/sf/briar/{protocol/ProtocolModule.java => messaging/MessagingModule.java} (71%)
 rename briar-core/src/net/sf/briar/{protocol/ProtocolReaderFactoryImpl.java => messaging/PacketReaderFactoryImpl.java} (56%)
 rename briar-core/src/net/sf/briar/{protocol/ProtocolReaderImpl.java => messaging/PacketReaderImpl.java} (79%)
 create mode 100644 briar-core/src/net/sf/briar/messaging/PacketWriterFactoryImpl.java
 rename briar-core/src/net/sf/briar/{protocol/ProtocolWriterImpl.java => messaging/PacketWriterImpl.java} (73%)
 rename briar-core/src/net/sf/briar/{protocol => messaging}/SubscriptionUpdateReader.java (81%)
 rename briar-core/src/net/sf/briar/{protocol => messaging}/duplex/DuplexConnection.java (93%)
 rename briar-core/src/net/sf/briar/{protocol => messaging}/duplex/DuplexConnectionFactoryImpl.java (85%)
 rename briar-core/src/net/sf/briar/{protocol/duplex/DuplexProtocolModule.java => messaging/duplex/DuplexMessagingModule.java} (58%)
 rename briar-core/src/net/sf/briar/{protocol => messaging}/duplex/IncomingDuplexConnection.java (81%)
 rename briar-core/src/net/sf/briar/{protocol => messaging}/duplex/OutgoingDuplexConnection.java (80%)
 rename briar-core/src/net/sf/briar/{protocol => messaging}/simplex/IncomingSimplexConnection.java (88%)
 rename briar-core/src/net/sf/briar/{protocol => messaging}/simplex/OutgoingSimplexConnection.java (84%)
 rename briar-core/src/net/sf/briar/{protocol => messaging}/simplex/SimplexConnectionFactoryImpl.java (83%)
 rename briar-core/src/net/sf/briar/{protocol/simplex/SimplexProtocolModule.java => messaging/simplex/SimplexMessagingModule.java} (57%)
 delete mode 100644 briar-core/src/net/sf/briar/protocol/ProtocolWriterFactoryImpl.java
 rename briar-tests/src/net/sf/briar/{protocol => messaging}/ConstantsTest.java (74%)
 rename briar-tests/src/net/sf/briar/{protocol => messaging}/ConsumersTest.java (98%)
 rename briar-tests/src/net/sf/briar/{protocol/ProtocolReaderImplTest.java => messaging/PacketReaderImplTest.java} (85%)
 rename briar-tests/src/net/sf/briar/{protocol/ProtocolWriterImplTest.java => messaging/PacketWriterImplTest.java} (79%)
 rename briar-tests/src/net/sf/briar/{protocol => messaging}/simplex/OutgoingSimplexConnectionTest.java (89%)
 rename briar-tests/src/net/sf/briar/{protocol/simplex/SimplexProtocolIntegrationTest.java => messaging/simplex/SimplexMessagingIntegrationTest.java} (85%)
 rename briar-tests/src/net/sf/briar/{protocol => messaging}/simplex/TestSimplexTransportReader.java (94%)
 rename briar-tests/src/net/sf/briar/{protocol => messaging}/simplex/TestSimplexTransportWriter.java (95%)

diff --git a/briar-api/src/net/sf/briar/api/crypto/KeyManager.java b/briar-api/src/net/sf/briar/api/crypto/KeyManager.java
index b0703abbbf..e1ebbf512e 100644
--- a/briar-api/src/net/sf/briar/api/crypto/KeyManager.java
+++ b/briar-api/src/net/sf/briar/api/crypto/KeyManager.java
@@ -1,7 +1,7 @@
 package net.sf.briar.api.crypto;
 
 import net.sf.briar.api.ContactId;
-import net.sf.briar.api.protocol.TransportId;
+import net.sf.briar.api.messaging.TransportId;
 import net.sf.briar.api.transport.ConnectionContext;
 import net.sf.briar.api.transport.Endpoint;
 
diff --git a/briar-api/src/net/sf/briar/api/db/DatabaseComponent.java b/briar-api/src/net/sf/briar/api/db/DatabaseComponent.java
index 0932c53595..5bd99e5371 100644
--- a/briar-api/src/net/sf/briar/api/db/DatabaseComponent.java
+++ b/briar-api/src/net/sf/briar/api/db/DatabaseComponent.java
@@ -9,21 +9,21 @@ import net.sf.briar.api.Rating;
 import net.sf.briar.api.TransportConfig;
 import net.sf.briar.api.TransportProperties;
 import net.sf.briar.api.db.event.DatabaseListener;
-import net.sf.briar.api.protocol.Ack;
-import net.sf.briar.api.protocol.AuthorId;
-import net.sf.briar.api.protocol.RetentionAck;
-import net.sf.briar.api.protocol.RetentionUpdate;
-import net.sf.briar.api.protocol.Group;
-import net.sf.briar.api.protocol.GroupId;
-import net.sf.briar.api.protocol.Message;
-import net.sf.briar.api.protocol.MessageId;
-import net.sf.briar.api.protocol.Offer;
-import net.sf.briar.api.protocol.Request;
-import net.sf.briar.api.protocol.SubscriptionAck;
-import net.sf.briar.api.protocol.SubscriptionUpdate;
-import net.sf.briar.api.protocol.TransportAck;
-import net.sf.briar.api.protocol.TransportId;
-import net.sf.briar.api.protocol.TransportUpdate;
+import net.sf.briar.api.messaging.Ack;
+import net.sf.briar.api.messaging.AuthorId;
+import net.sf.briar.api.messaging.Group;
+import net.sf.briar.api.messaging.GroupId;
+import net.sf.briar.api.messaging.Message;
+import net.sf.briar.api.messaging.MessageId;
+import net.sf.briar.api.messaging.Offer;
+import net.sf.briar.api.messaging.Request;
+import net.sf.briar.api.messaging.RetentionAck;
+import net.sf.briar.api.messaging.RetentionUpdate;
+import net.sf.briar.api.messaging.SubscriptionAck;
+import net.sf.briar.api.messaging.SubscriptionUpdate;
+import net.sf.briar.api.messaging.TransportAck;
+import net.sf.briar.api.messaging.TransportId;
+import net.sf.briar.api.messaging.TransportUpdate;
 import net.sf.briar.api.transport.Endpoint;
 import net.sf.briar.api.transport.TemporarySecret;
 
diff --git a/briar-api/src/net/sf/briar/api/db/MessageHeader.java b/briar-api/src/net/sf/briar/api/db/MessageHeader.java
index dc5b4e5296..313377ab01 100644
--- a/briar-api/src/net/sf/briar/api/db/MessageHeader.java
+++ b/briar-api/src/net/sf/briar/api/db/MessageHeader.java
@@ -1,8 +1,8 @@
 package net.sf.briar.api.db;
 
-import net.sf.briar.api.protocol.AuthorId;
-import net.sf.briar.api.protocol.GroupId;
-import net.sf.briar.api.protocol.MessageId;
+import net.sf.briar.api.messaging.AuthorId;
+import net.sf.briar.api.messaging.GroupId;
+import net.sf.briar.api.messaging.MessageId;
 
 public interface MessageHeader {
 
diff --git a/briar-api/src/net/sf/briar/api/db/event/RatingChangedEvent.java b/briar-api/src/net/sf/briar/api/db/event/RatingChangedEvent.java
index a3395ef27e..aec11c50f2 100644
--- a/briar-api/src/net/sf/briar/api/db/event/RatingChangedEvent.java
+++ b/briar-api/src/net/sf/briar/api/db/event/RatingChangedEvent.java
@@ -1,7 +1,7 @@
 package net.sf.briar.api.db.event;
 
 import net.sf.briar.api.Rating;
-import net.sf.briar.api.protocol.AuthorId;
+import net.sf.briar.api.messaging.AuthorId;
 
 public class RatingChangedEvent extends DatabaseEvent {
 
diff --git a/briar-api/src/net/sf/briar/api/db/event/RemoteTransportsUpdatedEvent.java b/briar-api/src/net/sf/briar/api/db/event/RemoteTransportsUpdatedEvent.java
index 6458ad54bd..afb2f4a268 100644
--- a/briar-api/src/net/sf/briar/api/db/event/RemoteTransportsUpdatedEvent.java
+++ b/briar-api/src/net/sf/briar/api/db/event/RemoteTransportsUpdatedEvent.java
@@ -1,7 +1,7 @@
 package net.sf.briar.api.db.event;
 
 import net.sf.briar.api.ContactId;
-import net.sf.briar.api.protocol.TransportId;
+import net.sf.briar.api.messaging.TransportId;
 
 /**
  * An event that is broadcast when a contact's remote transport properties
diff --git a/briar-api/src/net/sf/briar/api/db/event/TransportAddedEvent.java b/briar-api/src/net/sf/briar/api/db/event/TransportAddedEvent.java
index 7515688229..02d5b6b3b2 100644
--- a/briar-api/src/net/sf/briar/api/db/event/TransportAddedEvent.java
+++ b/briar-api/src/net/sf/briar/api/db/event/TransportAddedEvent.java
@@ -1,6 +1,6 @@
 package net.sf.briar.api.db.event;
 
-import net.sf.briar.api.protocol.TransportId;
+import net.sf.briar.api.messaging.TransportId;
 
 /** An event that is broadcast when a transport is added. */
 public class TransportAddedEvent extends DatabaseEvent {
diff --git a/briar-api/src/net/sf/briar/api/db/event/TransportRemovedEvent.java b/briar-api/src/net/sf/briar/api/db/event/TransportRemovedEvent.java
index 2b7dd98a26..3381b63da8 100644
--- a/briar-api/src/net/sf/briar/api/db/event/TransportRemovedEvent.java
+++ b/briar-api/src/net/sf/briar/api/db/event/TransportRemovedEvent.java
@@ -1,6 +1,6 @@
 package net.sf.briar.api.db.event;
 
-import net.sf.briar.api.protocol.TransportId;
+import net.sf.briar.api.messaging.TransportId;
 
 /** An event that is broadcast when a transport is removed. */
 public class TransportRemovedEvent extends DatabaseEvent {
diff --git a/briar-api/src/net/sf/briar/api/protocol/Ack.java b/briar-api/src/net/sf/briar/api/messaging/Ack.java
similarity index 91%
rename from briar-api/src/net/sf/briar/api/protocol/Ack.java
rename to briar-api/src/net/sf/briar/api/messaging/Ack.java
index 8a39f38a98..562ccb5fe9 100644
--- a/briar-api/src/net/sf/briar/api/protocol/Ack.java
+++ b/briar-api/src/net/sf/briar/api/messaging/Ack.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.protocol;
+package net.sf.briar.api.messaging;
 
 import java.util.Collection;
 
diff --git a/briar-api/src/net/sf/briar/api/protocol/Author.java b/briar-api/src/net/sf/briar/api/messaging/Author.java
similarity index 95%
rename from briar-api/src/net/sf/briar/api/protocol/Author.java
rename to briar-api/src/net/sf/briar/api/messaging/Author.java
index 1532155c32..3621fbd84f 100644
--- a/briar-api/src/net/sf/briar/api/protocol/Author.java
+++ b/briar-api/src/net/sf/briar/api/messaging/Author.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.protocol;
+package net.sf.briar.api.messaging;
 
 /** A pseudonymous author of {@link Message}s. */
 public class Author {
diff --git a/briar-api/src/net/sf/briar/api/protocol/AuthorFactory.java b/briar-api/src/net/sf/briar/api/messaging/AuthorFactory.java
similarity index 79%
rename from briar-api/src/net/sf/briar/api/protocol/AuthorFactory.java
rename to briar-api/src/net/sf/briar/api/messaging/AuthorFactory.java
index 59c21df227..d1708340a5 100644
--- a/briar-api/src/net/sf/briar/api/protocol/AuthorFactory.java
+++ b/briar-api/src/net/sf/briar/api/messaging/AuthorFactory.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.protocol;
+package net.sf.briar.api.messaging;
 
 import java.io.IOException;
 
diff --git a/briar-api/src/net/sf/briar/api/protocol/AuthorId.java b/briar-api/src/net/sf/briar/api/messaging/AuthorId.java
similarity index 90%
rename from briar-api/src/net/sf/briar/api/protocol/AuthorId.java
rename to briar-api/src/net/sf/briar/api/messaging/AuthorId.java
index 3d572d5ada..25360a3255 100644
--- a/briar-api/src/net/sf/briar/api/protocol/AuthorId.java
+++ b/briar-api/src/net/sf/briar/api/messaging/AuthorId.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.protocol;
+package net.sf.briar.api.messaging;
 
 import java.util.Arrays;
 
diff --git a/briar-api/src/net/sf/briar/api/protocol/Group.java b/briar-api/src/net/sf/briar/api/messaging/Group.java
similarity index 95%
rename from briar-api/src/net/sf/briar/api/protocol/Group.java
rename to briar-api/src/net/sf/briar/api/messaging/Group.java
index 2887c8478a..3e1bf6466f 100644
--- a/briar-api/src/net/sf/briar/api/protocol/Group.java
+++ b/briar-api/src/net/sf/briar/api/messaging/Group.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.protocol;
+package net.sf.briar.api.messaging;
 
 /** A group to which users may subscribe. */
 public class Group {
diff --git a/briar-api/src/net/sf/briar/api/protocol/GroupFactory.java b/briar-api/src/net/sf/briar/api/messaging/GroupFactory.java
similarity index 78%
rename from briar-api/src/net/sf/briar/api/protocol/GroupFactory.java
rename to briar-api/src/net/sf/briar/api/messaging/GroupFactory.java
index b1db22d6db..4d85ed88b7 100644
--- a/briar-api/src/net/sf/briar/api/protocol/GroupFactory.java
+++ b/briar-api/src/net/sf/briar/api/messaging/GroupFactory.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.protocol;
+package net.sf.briar.api.messaging;
 
 import java.io.IOException;
 
diff --git a/briar-api/src/net/sf/briar/api/protocol/GroupId.java b/briar-api/src/net/sf/briar/api/messaging/GroupId.java
similarity index 90%
rename from briar-api/src/net/sf/briar/api/protocol/GroupId.java
rename to briar-api/src/net/sf/briar/api/messaging/GroupId.java
index b530f8c2f5..ea2eb546b4 100644
--- a/briar-api/src/net/sf/briar/api/protocol/GroupId.java
+++ b/briar-api/src/net/sf/briar/api/messaging/GroupId.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.protocol;
+package net.sf.briar.api.messaging;
 
 import java.util.Arrays;
 
diff --git a/briar-api/src/net/sf/briar/api/protocol/Message.java b/briar-api/src/net/sf/briar/api/messaging/Message.java
similarity index 96%
rename from briar-api/src/net/sf/briar/api/protocol/Message.java
rename to briar-api/src/net/sf/briar/api/messaging/Message.java
index c5dca006ef..5140ffc0e9 100644
--- a/briar-api/src/net/sf/briar/api/protocol/Message.java
+++ b/briar-api/src/net/sf/briar/api/messaging/Message.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.protocol;
+package net.sf.briar.api.messaging;
 
 public interface Message {
 
diff --git a/briar-api/src/net/sf/briar/api/protocol/MessageFactory.java b/briar-api/src/net/sf/briar/api/messaging/MessageFactory.java
similarity index 97%
rename from briar-api/src/net/sf/briar/api/protocol/MessageFactory.java
rename to briar-api/src/net/sf/briar/api/messaging/MessageFactory.java
index 2c9dbe50e2..ee16823153 100644
--- a/briar-api/src/net/sf/briar/api/protocol/MessageFactory.java
+++ b/briar-api/src/net/sf/briar/api/messaging/MessageFactory.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.protocol;
+package net.sf.briar.api.messaging;
 
 import java.io.IOException;
 import java.security.GeneralSecurityException;
diff --git a/briar-api/src/net/sf/briar/api/protocol/MessageId.java b/briar-api/src/net/sf/briar/api/messaging/MessageId.java
similarity index 90%
rename from briar-api/src/net/sf/briar/api/protocol/MessageId.java
rename to briar-api/src/net/sf/briar/api/messaging/MessageId.java
index 88cdb1c312..e0acc7d7a1 100644
--- a/briar-api/src/net/sf/briar/api/protocol/MessageId.java
+++ b/briar-api/src/net/sf/briar/api/messaging/MessageId.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.protocol;
+package net.sf.briar.api.messaging;
 
 import java.util.Arrays;
 
diff --git a/briar-api/src/net/sf/briar/api/protocol/MessageVerifier.java b/briar-api/src/net/sf/briar/api/messaging/MessageVerifier.java
similarity index 86%
rename from briar-api/src/net/sf/briar/api/protocol/MessageVerifier.java
rename to briar-api/src/net/sf/briar/api/messaging/MessageVerifier.java
index f99b348754..3f666631a1 100644
--- a/briar-api/src/net/sf/briar/api/protocol/MessageVerifier.java
+++ b/briar-api/src/net/sf/briar/api/messaging/MessageVerifier.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.protocol;
+package net.sf.briar.api.messaging;
 
 import java.security.GeneralSecurityException;
 
diff --git a/briar-api/src/net/sf/briar/api/protocol/ProtocolConstants.java b/briar-api/src/net/sf/briar/api/messaging/MessagingConstants.java
similarity index 94%
rename from briar-api/src/net/sf/briar/api/protocol/ProtocolConstants.java
rename to briar-api/src/net/sf/briar/api/messaging/MessagingConstants.java
index 5dffe995c7..e95c7462f1 100644
--- a/briar-api/src/net/sf/briar/api/protocol/ProtocolConstants.java
+++ b/briar-api/src/net/sf/briar/api/messaging/MessagingConstants.java
@@ -1,8 +1,8 @@
-package net.sf.briar.api.protocol;
+package net.sf.briar.api.messaging;
 
 import static net.sf.briar.api.transport.TransportConstants.MIN_CONNECTION_LENGTH;
 
-public interface ProtocolConstants {
+public interface MessagingConstants {
 
 	/**
 	 * The maximum length of a serialised packet in bytes. To allow for future
diff --git a/briar-api/src/net/sf/briar/api/protocol/Offer.java b/briar-api/src/net/sf/briar/api/messaging/Offer.java
similarity index 91%
rename from briar-api/src/net/sf/briar/api/protocol/Offer.java
rename to briar-api/src/net/sf/briar/api/messaging/Offer.java
index d3be3b55e1..9f107c73e4 100644
--- a/briar-api/src/net/sf/briar/api/protocol/Offer.java
+++ b/briar-api/src/net/sf/briar/api/messaging/Offer.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.protocol;
+package net.sf.briar.api.messaging;
 
 import java.util.Collection;
 
diff --git a/briar-api/src/net/sf/briar/api/protocol/ProtocolReader.java b/briar-api/src/net/sf/briar/api/messaging/PacketReader.java
similarity index 93%
rename from briar-api/src/net/sf/briar/api/protocol/ProtocolReader.java
rename to briar-api/src/net/sf/briar/api/messaging/PacketReader.java
index 12f675b5bd..1f13497c98 100644
--- a/briar-api/src/net/sf/briar/api/protocol/ProtocolReader.java
+++ b/briar-api/src/net/sf/briar/api/messaging/PacketReader.java
@@ -1,8 +1,8 @@
-package net.sf.briar.api.protocol;
+package net.sf.briar.api.messaging;
 
 import java.io.IOException;
 
-public interface ProtocolReader {
+public interface PacketReader {
 
 	boolean eof() throws IOException;
 
diff --git a/briar-api/src/net/sf/briar/api/messaging/PacketReaderFactory.java b/briar-api/src/net/sf/briar/api/messaging/PacketReaderFactory.java
new file mode 100644
index 0000000000..40aa880fa3
--- /dev/null
+++ b/briar-api/src/net/sf/briar/api/messaging/PacketReaderFactory.java
@@ -0,0 +1,8 @@
+package net.sf.briar.api.messaging;
+
+import java.io.InputStream;
+
+public interface PacketReaderFactory {
+
+	PacketReader createPacketReader(InputStream in);
+}
diff --git a/briar-api/src/net/sf/briar/api/protocol/ProtocolWriter.java b/briar-api/src/net/sf/briar/api/messaging/PacketWriter.java
similarity index 91%
rename from briar-api/src/net/sf/briar/api/protocol/ProtocolWriter.java
rename to briar-api/src/net/sf/briar/api/messaging/PacketWriter.java
index f2d9fa2b6d..94b6a44bb5 100644
--- a/briar-api/src/net/sf/briar/api/protocol/ProtocolWriter.java
+++ b/briar-api/src/net/sf/briar/api/messaging/PacketWriter.java
@@ -1,8 +1,8 @@
-package net.sf.briar.api.protocol;
+package net.sf.briar.api.messaging;
 
 import java.io.IOException;
 
-public interface ProtocolWriter {
+public interface PacketWriter {
 
 	int getMaxMessagesForAck(long capacity);
 
diff --git a/briar-api/src/net/sf/briar/api/messaging/PacketWriterFactory.java b/briar-api/src/net/sf/briar/api/messaging/PacketWriterFactory.java
new file mode 100644
index 0000000000..371fe7cb07
--- /dev/null
+++ b/briar-api/src/net/sf/briar/api/messaging/PacketWriterFactory.java
@@ -0,0 +1,8 @@
+package net.sf.briar.api.messaging;
+
+import java.io.OutputStream;
+
+public interface PacketWriterFactory {
+
+	PacketWriter createPacketWriter(OutputStream out, boolean flush);
+}
diff --git a/briar-api/src/net/sf/briar/api/protocol/Request.java b/briar-api/src/net/sf/briar/api/messaging/Request.java
similarity index 94%
rename from briar-api/src/net/sf/briar/api/protocol/Request.java
rename to briar-api/src/net/sf/briar/api/messaging/Request.java
index 7e5d86fdd5..e789b4f353 100644
--- a/briar-api/src/net/sf/briar/api/protocol/Request.java
+++ b/briar-api/src/net/sf/briar/api/messaging/Request.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.protocol;
+package net.sf.briar.api.messaging;
 
 import java.util.BitSet;
 
diff --git a/briar-api/src/net/sf/briar/api/protocol/RetentionAck.java b/briar-api/src/net/sf/briar/api/messaging/RetentionAck.java
similarity index 89%
rename from briar-api/src/net/sf/briar/api/protocol/RetentionAck.java
rename to briar-api/src/net/sf/briar/api/messaging/RetentionAck.java
index 7b87f0db67..faae81bf6d 100644
--- a/briar-api/src/net/sf/briar/api/protocol/RetentionAck.java
+++ b/briar-api/src/net/sf/briar/api/messaging/RetentionAck.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.protocol;
+package net.sf.briar.api.messaging;
 
 /** A packet acknowledging a (@link RetentionUpdate} */
 public class RetentionAck {
diff --git a/briar-api/src/net/sf/briar/api/protocol/RetentionUpdate.java b/briar-api/src/net/sf/briar/api/messaging/RetentionUpdate.java
similarity index 91%
rename from briar-api/src/net/sf/briar/api/protocol/RetentionUpdate.java
rename to briar-api/src/net/sf/briar/api/messaging/RetentionUpdate.java
index bdfee3e066..5815b0650c 100644
--- a/briar-api/src/net/sf/briar/api/protocol/RetentionUpdate.java
+++ b/briar-api/src/net/sf/briar/api/messaging/RetentionUpdate.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.protocol;
+package net.sf.briar.api.messaging;
 
 /**
  * A packet updating the recipient's view of the retention time of the sender's
diff --git a/briar-api/src/net/sf/briar/api/protocol/SubscriptionAck.java b/briar-api/src/net/sf/briar/api/messaging/SubscriptionAck.java
similarity index 89%
rename from briar-api/src/net/sf/briar/api/protocol/SubscriptionAck.java
rename to briar-api/src/net/sf/briar/api/messaging/SubscriptionAck.java
index caacca97f8..5ef2664e98 100644
--- a/briar-api/src/net/sf/briar/api/protocol/SubscriptionAck.java
+++ b/briar-api/src/net/sf/briar/api/messaging/SubscriptionAck.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.protocol;
+package net.sf.briar.api.messaging;
 
 /** A packet acknowledging a {@link SubscriptionUpdate}. */
 public class SubscriptionAck {
diff --git a/briar-api/src/net/sf/briar/api/protocol/SubscriptionUpdate.java b/briar-api/src/net/sf/briar/api/messaging/SubscriptionUpdate.java
similarity index 94%
rename from briar-api/src/net/sf/briar/api/protocol/SubscriptionUpdate.java
rename to briar-api/src/net/sf/briar/api/messaging/SubscriptionUpdate.java
index 00e797184f..337d23b991 100644
--- a/briar-api/src/net/sf/briar/api/protocol/SubscriptionUpdate.java
+++ b/briar-api/src/net/sf/briar/api/messaging/SubscriptionUpdate.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.protocol;
+package net.sf.briar.api.messaging;
 
 import java.util.Collection;
 
diff --git a/briar-api/src/net/sf/briar/api/protocol/TransportAck.java b/briar-api/src/net/sf/briar/api/messaging/TransportAck.java
similarity index 92%
rename from briar-api/src/net/sf/briar/api/protocol/TransportAck.java
rename to briar-api/src/net/sf/briar/api/messaging/TransportAck.java
index 2ccfd9c361..f336945569 100644
--- a/briar-api/src/net/sf/briar/api/protocol/TransportAck.java
+++ b/briar-api/src/net/sf/briar/api/messaging/TransportAck.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.protocol;
+package net.sf.briar.api.messaging;
 
 /** A packet acknowledging a {@link TransportUpdate}. */
 public class TransportAck {
diff --git a/briar-api/src/net/sf/briar/api/protocol/TransportId.java b/briar-api/src/net/sf/briar/api/messaging/TransportId.java
similarity index 91%
rename from briar-api/src/net/sf/briar/api/protocol/TransportId.java
rename to briar-api/src/net/sf/briar/api/messaging/TransportId.java
index 8f295683dd..3d546f4cba 100644
--- a/briar-api/src/net/sf/briar/api/protocol/TransportId.java
+++ b/briar-api/src/net/sf/briar/api/messaging/TransportId.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.protocol;
+package net.sf.briar.api.messaging;
 
 import java.util.Arrays;
 
diff --git a/briar-api/src/net/sf/briar/api/protocol/TransportUpdate.java b/briar-api/src/net/sf/briar/api/messaging/TransportUpdate.java
similarity index 95%
rename from briar-api/src/net/sf/briar/api/protocol/TransportUpdate.java
rename to briar-api/src/net/sf/briar/api/messaging/TransportUpdate.java
index 28e3a4cb1f..56ed14f2ad 100644
--- a/briar-api/src/net/sf/briar/api/protocol/TransportUpdate.java
+++ b/briar-api/src/net/sf/briar/api/messaging/TransportUpdate.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.protocol;
+package net.sf.briar.api.messaging;
 
 import net.sf.briar.api.TransportProperties;
 
diff --git a/briar-api/src/net/sf/briar/api/protocol/Types.java b/briar-api/src/net/sf/briar/api/messaging/Types.java
similarity index 90%
rename from briar-api/src/net/sf/briar/api/protocol/Types.java
rename to briar-api/src/net/sf/briar/api/messaging/Types.java
index eefa685cf6..a141c071c9 100644
--- a/briar-api/src/net/sf/briar/api/protocol/Types.java
+++ b/briar-api/src/net/sf/briar/api/messaging/Types.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.protocol;
+package net.sf.briar.api.messaging;
 
 /** Struct identifiers for encoding and decoding protocol objects. */
 public interface Types {
diff --git a/briar-api/src/net/sf/briar/api/protocol/UniqueId.java b/briar-api/src/net/sf/briar/api/messaging/UniqueId.java
similarity index 94%
rename from briar-api/src/net/sf/briar/api/protocol/UniqueId.java
rename to briar-api/src/net/sf/briar/api/messaging/UniqueId.java
index 819c0810ad..a15573e9aa 100644
--- a/briar-api/src/net/sf/briar/api/protocol/UniqueId.java
+++ b/briar-api/src/net/sf/briar/api/messaging/UniqueId.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.protocol;
+package net.sf.briar.api.messaging;
 
 import java.util.Arrays;
 
diff --git a/briar-api/src/net/sf/briar/api/protocol/UnverifiedMessage.java b/briar-api/src/net/sf/briar/api/messaging/UnverifiedMessage.java
similarity index 98%
rename from briar-api/src/net/sf/briar/api/protocol/UnverifiedMessage.java
rename to briar-api/src/net/sf/briar/api/messaging/UnverifiedMessage.java
index 8d46431f86..cf1fcf2ce4 100644
--- a/briar-api/src/net/sf/briar/api/protocol/UnverifiedMessage.java
+++ b/briar-api/src/net/sf/briar/api/messaging/UnverifiedMessage.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.protocol;
+package net.sf.briar.api.messaging;
 
 /** A {@link Message} that has not yet had its signatures verified. */
 public class UnverifiedMessage {
diff --git a/briar-api/src/net/sf/briar/api/protocol/VerificationExecutor.java b/briar-api/src/net/sf/briar/api/messaging/VerificationExecutor.java
similarity index 92%
rename from briar-api/src/net/sf/briar/api/protocol/VerificationExecutor.java
rename to briar-api/src/net/sf/briar/api/messaging/VerificationExecutor.java
index 90a20d7c53..18e7da9661 100644
--- a/briar-api/src/net/sf/briar/api/protocol/VerificationExecutor.java
+++ b/briar-api/src/net/sf/briar/api/messaging/VerificationExecutor.java
@@ -1,4 +1,4 @@
-package net.sf.briar.api.protocol;
+package net.sf.briar.api.messaging;
 
 import static java.lang.annotation.ElementType.PARAMETER;
 import static java.lang.annotation.RetentionPolicy.RUNTIME;
diff --git a/briar-api/src/net/sf/briar/api/protocol/duplex/DuplexConnectionFactory.java b/briar-api/src/net/sf/briar/api/messaging/duplex/DuplexConnectionFactory.java
similarity index 80%
rename from briar-api/src/net/sf/briar/api/protocol/duplex/DuplexConnectionFactory.java
rename to briar-api/src/net/sf/briar/api/messaging/duplex/DuplexConnectionFactory.java
index c7504f376e..8b85de2a65 100644
--- a/briar-api/src/net/sf/briar/api/protocol/duplex/DuplexConnectionFactory.java
+++ b/briar-api/src/net/sf/briar/api/messaging/duplex/DuplexConnectionFactory.java
@@ -1,8 +1,8 @@
-package net.sf.briar.api.protocol.duplex;
+package net.sf.briar.api.messaging.duplex;
 
 import net.sf.briar.api.ContactId;
+import net.sf.briar.api.messaging.TransportId;
 import net.sf.briar.api.plugins.duplex.DuplexTransportConnection;
-import net.sf.briar.api.protocol.TransportId;
 import net.sf.briar.api.transport.ConnectionContext;
 
 public interface DuplexConnectionFactory {
diff --git a/briar-api/src/net/sf/briar/api/protocol/simplex/SimplexConnectionFactory.java b/briar-api/src/net/sf/briar/api/messaging/simplex/SimplexConnectionFactory.java
similarity index 82%
rename from briar-api/src/net/sf/briar/api/protocol/simplex/SimplexConnectionFactory.java
rename to briar-api/src/net/sf/briar/api/messaging/simplex/SimplexConnectionFactory.java
index fa8d2c021f..6f39db80ed 100644
--- a/briar-api/src/net/sf/briar/api/protocol/simplex/SimplexConnectionFactory.java
+++ b/briar-api/src/net/sf/briar/api/messaging/simplex/SimplexConnectionFactory.java
@@ -1,9 +1,9 @@
-package net.sf.briar.api.protocol.simplex;
+package net.sf.briar.api.messaging.simplex;
 
 import net.sf.briar.api.ContactId;
+import net.sf.briar.api.messaging.TransportId;
 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.transport.ConnectionContext;
 
 public interface SimplexConnectionFactory {
diff --git a/briar-api/src/net/sf/briar/api/plugins/Plugin.java b/briar-api/src/net/sf/briar/api/plugins/Plugin.java
index c6284ca92d..f76833a39f 100644
--- a/briar-api/src/net/sf/briar/api/plugins/Plugin.java
+++ b/briar-api/src/net/sf/briar/api/plugins/Plugin.java
@@ -4,7 +4,7 @@ import java.io.IOException;
 import java.util.Collection;
 
 import net.sf.briar.api.ContactId;
-import net.sf.briar.api.protocol.TransportId;
+import net.sf.briar.api.messaging.TransportId;
 
 public interface Plugin {
 
diff --git a/briar-api/src/net/sf/briar/api/plugins/duplex/DuplexPluginFactory.java b/briar-api/src/net/sf/briar/api/plugins/duplex/DuplexPluginFactory.java
index 4919f9fc23..5cdd8e7683 100644
--- a/briar-api/src/net/sf/briar/api/plugins/duplex/DuplexPluginFactory.java
+++ b/briar-api/src/net/sf/briar/api/plugins/duplex/DuplexPluginFactory.java
@@ -1,6 +1,6 @@
 package net.sf.briar.api.plugins.duplex;
 
-import net.sf.briar.api.protocol.TransportId;
+import net.sf.briar.api.messaging.TransportId;
 
 public interface DuplexPluginFactory {
 
diff --git a/briar-api/src/net/sf/briar/api/plugins/simplex/SimplexPluginFactory.java b/briar-api/src/net/sf/briar/api/plugins/simplex/SimplexPluginFactory.java
index f6a9f2ea86..5a842fdc1c 100644
--- a/briar-api/src/net/sf/briar/api/plugins/simplex/SimplexPluginFactory.java
+++ b/briar-api/src/net/sf/briar/api/plugins/simplex/SimplexPluginFactory.java
@@ -1,6 +1,6 @@
 package net.sf.briar.api.plugins.simplex;
 
-import net.sf.briar.api.protocol.TransportId;
+import net.sf.briar.api.messaging.TransportId;
 
 public interface SimplexPluginFactory {
 
diff --git a/briar-api/src/net/sf/briar/api/protocol/ProtocolReaderFactory.java b/briar-api/src/net/sf/briar/api/protocol/ProtocolReaderFactory.java
deleted file mode 100644
index 2eb1a75187..0000000000
--- a/briar-api/src/net/sf/briar/api/protocol/ProtocolReaderFactory.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package net.sf.briar.api.protocol;
-
-import java.io.InputStream;
-
-public interface ProtocolReaderFactory {
-
-	ProtocolReader createProtocolReader(InputStream in);
-}
diff --git a/briar-api/src/net/sf/briar/api/protocol/ProtocolWriterFactory.java b/briar-api/src/net/sf/briar/api/protocol/ProtocolWriterFactory.java
deleted file mode 100644
index 8c0d465ebf..0000000000
--- a/briar-api/src/net/sf/briar/api/protocol/ProtocolWriterFactory.java
+++ /dev/null
@@ -1,8 +0,0 @@
-package net.sf.briar.api.protocol;
-
-import java.io.OutputStream;
-
-public interface ProtocolWriterFactory {
-
-	ProtocolWriter createProtocolWriter(OutputStream out, boolean flush);
-}
diff --git a/briar-api/src/net/sf/briar/api/transport/ConnectionContext.java b/briar-api/src/net/sf/briar/api/transport/ConnectionContext.java
index dac9544982..ad7c329d21 100644
--- a/briar-api/src/net/sf/briar/api/transport/ConnectionContext.java
+++ b/briar-api/src/net/sf/briar/api/transport/ConnectionContext.java
@@ -1,7 +1,7 @@
 package net.sf.briar.api.transport;
 
 import net.sf.briar.api.ContactId;
-import net.sf.briar.api.protocol.TransportId;
+import net.sf.briar.api.messaging.TransportId;
 
 public class ConnectionContext {
 
diff --git a/briar-api/src/net/sf/briar/api/transport/ConnectionDispatcher.java b/briar-api/src/net/sf/briar/api/transport/ConnectionDispatcher.java
index 4e7dbd793d..a11b28ef2c 100644
--- a/briar-api/src/net/sf/briar/api/transport/ConnectionDispatcher.java
+++ b/briar-api/src/net/sf/briar/api/transport/ConnectionDispatcher.java
@@ -1,10 +1,10 @@
 package net.sf.briar.api.transport;
 
 import net.sf.briar.api.ContactId;
+import net.sf.briar.api.messaging.TransportId;
 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;
 
 public interface ConnectionDispatcher {
 
diff --git a/briar-api/src/net/sf/briar/api/transport/ConnectionRecogniser.java b/briar-api/src/net/sf/briar/api/transport/ConnectionRecogniser.java
index 69e53b39f6..12f6ce1b7a 100644
--- a/briar-api/src/net/sf/briar/api/transport/ConnectionRecogniser.java
+++ b/briar-api/src/net/sf/briar/api/transport/ConnectionRecogniser.java
@@ -2,7 +2,7 @@ package net.sf.briar.api.transport;
 
 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.messaging.TransportId;
 
 /**
  * Maintains the connection reordering windows and decides whether incoming
diff --git a/briar-api/src/net/sf/briar/api/transport/ConnectionRegistry.java b/briar-api/src/net/sf/briar/api/transport/ConnectionRegistry.java
index f9b3489cbf..2983fff39c 100644
--- a/briar-api/src/net/sf/briar/api/transport/ConnectionRegistry.java
+++ b/briar-api/src/net/sf/briar/api/transport/ConnectionRegistry.java
@@ -3,7 +3,7 @@ package net.sf.briar.api.transport;
 import java.util.Collection;
 
 import net.sf.briar.api.ContactId;
-import net.sf.briar.api.protocol.TransportId;
+import net.sf.briar.api.messaging.TransportId;
 
 /**
  * Keeps track of which contacts are currently connected by which transports.
diff --git a/briar-api/src/net/sf/briar/api/transport/Endpoint.java b/briar-api/src/net/sf/briar/api/transport/Endpoint.java
index 3e1590e919..0b66b64776 100644
--- a/briar-api/src/net/sf/briar/api/transport/Endpoint.java
+++ b/briar-api/src/net/sf/briar/api/transport/Endpoint.java
@@ -1,7 +1,7 @@
 package net.sf.briar.api.transport;
 
 import net.sf.briar.api.ContactId;
-import net.sf.briar.api.protocol.TransportId;
+import net.sf.briar.api.messaging.TransportId;
 
 public class Endpoint {
 
diff --git a/briar-api/src/net/sf/briar/api/transport/TemporarySecret.java b/briar-api/src/net/sf/briar/api/transport/TemporarySecret.java
index 4fc8110e03..60d10dabbd 100644
--- a/briar-api/src/net/sf/briar/api/transport/TemporarySecret.java
+++ b/briar-api/src/net/sf/briar/api/transport/TemporarySecret.java
@@ -2,7 +2,7 @@ package net.sf.briar.api.transport;
 
 import static net.sf.briar.api.transport.TransportConstants.CONNECTION_WINDOW_SIZE;
 import net.sf.briar.api.ContactId;
-import net.sf.briar.api.protocol.TransportId;
+import net.sf.briar.api.messaging.TransportId;
 
 public class TemporarySecret extends Endpoint {
 
diff --git a/briar-core/src/net/sf/briar/db/Database.java b/briar-core/src/net/sf/briar/db/Database.java
index 9fa585ff38..ea1b8e65cb 100644
--- a/briar-core/src/net/sf/briar/db/Database.java
+++ b/briar-core/src/net/sf/briar/db/Database.java
@@ -10,18 +10,18 @@ import net.sf.briar.api.TransportConfig;
 import net.sf.briar.api.TransportProperties;
 import net.sf.briar.api.db.DbException;
 import net.sf.briar.api.db.MessageHeader;
-import net.sf.briar.api.protocol.AuthorId;
-import net.sf.briar.api.protocol.RetentionAck;
-import net.sf.briar.api.protocol.RetentionUpdate;
-import net.sf.briar.api.protocol.Group;
-import net.sf.briar.api.protocol.GroupId;
-import net.sf.briar.api.protocol.Message;
-import net.sf.briar.api.protocol.MessageId;
-import net.sf.briar.api.protocol.SubscriptionAck;
-import net.sf.briar.api.protocol.SubscriptionUpdate;
-import net.sf.briar.api.protocol.TransportAck;
-import net.sf.briar.api.protocol.TransportId;
-import net.sf.briar.api.protocol.TransportUpdate;
+import net.sf.briar.api.messaging.AuthorId;
+import net.sf.briar.api.messaging.Group;
+import net.sf.briar.api.messaging.GroupId;
+import net.sf.briar.api.messaging.Message;
+import net.sf.briar.api.messaging.MessageId;
+import net.sf.briar.api.messaging.RetentionAck;
+import net.sf.briar.api.messaging.RetentionUpdate;
+import net.sf.briar.api.messaging.SubscriptionAck;
+import net.sf.briar.api.messaging.SubscriptionUpdate;
+import net.sf.briar.api.messaging.TransportAck;
+import net.sf.briar.api.messaging.TransportId;
+import net.sf.briar.api.messaging.TransportUpdate;
 import net.sf.briar.api.transport.Endpoint;
 import net.sf.briar.api.transport.TemporarySecret;
 
diff --git a/briar-core/src/net/sf/briar/db/DatabaseComponentImpl.java b/briar-core/src/net/sf/briar/db/DatabaseComponentImpl.java
index 2cd5149a72..251373efe7 100644
--- a/briar-core/src/net/sf/briar/db/DatabaseComponentImpl.java
+++ b/briar-core/src/net/sf/briar/db/DatabaseComponentImpl.java
@@ -47,21 +47,21 @@ import net.sf.briar.api.db.event.RemoteTransportsUpdatedEvent;
 import net.sf.briar.api.db.event.TransportAddedEvent;
 import net.sf.briar.api.db.event.TransportRemovedEvent;
 import net.sf.briar.api.lifecycle.ShutdownManager;
-import net.sf.briar.api.protocol.Ack;
-import net.sf.briar.api.protocol.AuthorId;
-import net.sf.briar.api.protocol.Group;
-import net.sf.briar.api.protocol.GroupId;
-import net.sf.briar.api.protocol.Message;
-import net.sf.briar.api.protocol.MessageId;
-import net.sf.briar.api.protocol.Offer;
-import net.sf.briar.api.protocol.Request;
-import net.sf.briar.api.protocol.RetentionAck;
-import net.sf.briar.api.protocol.RetentionUpdate;
-import net.sf.briar.api.protocol.SubscriptionAck;
-import net.sf.briar.api.protocol.SubscriptionUpdate;
-import net.sf.briar.api.protocol.TransportAck;
-import net.sf.briar.api.protocol.TransportId;
-import net.sf.briar.api.protocol.TransportUpdate;
+import net.sf.briar.api.messaging.Ack;
+import net.sf.briar.api.messaging.AuthorId;
+import net.sf.briar.api.messaging.Group;
+import net.sf.briar.api.messaging.GroupId;
+import net.sf.briar.api.messaging.Message;
+import net.sf.briar.api.messaging.MessageId;
+import net.sf.briar.api.messaging.Offer;
+import net.sf.briar.api.messaging.Request;
+import net.sf.briar.api.messaging.RetentionAck;
+import net.sf.briar.api.messaging.RetentionUpdate;
+import net.sf.briar.api.messaging.SubscriptionAck;
+import net.sf.briar.api.messaging.SubscriptionUpdate;
+import net.sf.briar.api.messaging.TransportAck;
+import net.sf.briar.api.messaging.TransportId;
+import net.sf.briar.api.messaging.TransportUpdate;
 import net.sf.briar.api.transport.Endpoint;
 import net.sf.briar.api.transport.TemporarySecret;
 
diff --git a/briar-core/src/net/sf/briar/db/JdbcDatabase.java b/briar-core/src/net/sf/briar/db/JdbcDatabase.java
index 4423030ac7..fced9675b2 100644
--- a/briar-core/src/net/sf/briar/db/JdbcDatabase.java
+++ b/briar-core/src/net/sf/briar/db/JdbcDatabase.java
@@ -30,18 +30,18 @@ import net.sf.briar.api.TransportProperties;
 import net.sf.briar.api.db.DbClosedException;
 import net.sf.briar.api.db.DbException;
 import net.sf.briar.api.db.MessageHeader;
-import net.sf.briar.api.protocol.AuthorId;
-import net.sf.briar.api.protocol.Group;
-import net.sf.briar.api.protocol.GroupId;
-import net.sf.briar.api.protocol.Message;
-import net.sf.briar.api.protocol.MessageId;
-import net.sf.briar.api.protocol.RetentionAck;
-import net.sf.briar.api.protocol.RetentionUpdate;
-import net.sf.briar.api.protocol.SubscriptionAck;
-import net.sf.briar.api.protocol.SubscriptionUpdate;
-import net.sf.briar.api.protocol.TransportAck;
-import net.sf.briar.api.protocol.TransportId;
-import net.sf.briar.api.protocol.TransportUpdate;
+import net.sf.briar.api.messaging.AuthorId;
+import net.sf.briar.api.messaging.Group;
+import net.sf.briar.api.messaging.GroupId;
+import net.sf.briar.api.messaging.Message;
+import net.sf.briar.api.messaging.MessageId;
+import net.sf.briar.api.messaging.RetentionAck;
+import net.sf.briar.api.messaging.RetentionUpdate;
+import net.sf.briar.api.messaging.SubscriptionAck;
+import net.sf.briar.api.messaging.SubscriptionUpdate;
+import net.sf.briar.api.messaging.TransportAck;
+import net.sf.briar.api.messaging.TransportId;
+import net.sf.briar.api.messaging.TransportUpdate;
 import net.sf.briar.api.transport.Endpoint;
 import net.sf.briar.api.transport.TemporarySecret;
 import net.sf.briar.util.FileUtils;
diff --git a/briar-core/src/net/sf/briar/db/MessageHeaderImpl.java b/briar-core/src/net/sf/briar/db/MessageHeaderImpl.java
index 0e4d6fa668..7cb201a848 100644
--- a/briar-core/src/net/sf/briar/db/MessageHeaderImpl.java
+++ b/briar-core/src/net/sf/briar/db/MessageHeaderImpl.java
@@ -1,9 +1,9 @@
 package net.sf.briar.db;
 
 import net.sf.briar.api.db.MessageHeader;
-import net.sf.briar.api.protocol.AuthorId;
-import net.sf.briar.api.protocol.GroupId;
-import net.sf.briar.api.protocol.MessageId;
+import net.sf.briar.api.messaging.AuthorId;
+import net.sf.briar.api.messaging.GroupId;
+import net.sf.briar.api.messaging.MessageId;
 
 class MessageHeaderImpl implements MessageHeader {
 
diff --git a/briar-core/src/net/sf/briar/protocol/AuthorFactoryImpl.java b/briar-core/src/net/sf/briar/messaging/AuthorFactoryImpl.java
similarity index 82%
rename from briar-core/src/net/sf/briar/protocol/AuthorFactoryImpl.java
rename to briar-core/src/net/sf/briar/messaging/AuthorFactoryImpl.java
index 41fa3d7826..407cc9ebb4 100644
--- a/briar-core/src/net/sf/briar/protocol/AuthorFactoryImpl.java
+++ b/briar-core/src/net/sf/briar/messaging/AuthorFactoryImpl.java
@@ -1,15 +1,15 @@
-package net.sf.briar.protocol;
+package net.sf.briar.messaging;
 
-import static net.sf.briar.api.protocol.Types.AUTHOR;
+import static net.sf.briar.api.messaging.Types.AUTHOR;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 
 import net.sf.briar.api.crypto.CryptoComponent;
 import net.sf.briar.api.crypto.MessageDigest;
-import net.sf.briar.api.protocol.Author;
-import net.sf.briar.api.protocol.AuthorFactory;
-import net.sf.briar.api.protocol.AuthorId;
+import net.sf.briar.api.messaging.Author;
+import net.sf.briar.api.messaging.AuthorFactory;
+import net.sf.briar.api.messaging.AuthorId;
 import net.sf.briar.api.serial.Writer;
 import net.sf.briar.api.serial.WriterFactory;
 
diff --git a/briar-core/src/net/sf/briar/protocol/AuthorReader.java b/briar-core/src/net/sf/briar/messaging/AuthorReader.java
similarity index 73%
rename from briar-core/src/net/sf/briar/protocol/AuthorReader.java
rename to briar-core/src/net/sf/briar/messaging/AuthorReader.java
index d8d392503d..410fdbb772 100644
--- a/briar-core/src/net/sf/briar/protocol/AuthorReader.java
+++ b/briar-core/src/net/sf/briar/messaging/AuthorReader.java
@@ -1,15 +1,15 @@
-package net.sf.briar.protocol;
+package net.sf.briar.messaging;
 
-import static net.sf.briar.api.protocol.ProtocolConstants.MAX_AUTHOR_NAME_LENGTH;
-import static net.sf.briar.api.protocol.ProtocolConstants.MAX_PUBLIC_KEY_LENGTH;
-import static net.sf.briar.api.protocol.Types.AUTHOR;
+import static net.sf.briar.api.messaging.MessagingConstants.MAX_AUTHOR_NAME_LENGTH;
+import static net.sf.briar.api.messaging.MessagingConstants.MAX_PUBLIC_KEY_LENGTH;
+import static net.sf.briar.api.messaging.Types.AUTHOR;
 
 import java.io.IOException;
 
 import net.sf.briar.api.crypto.CryptoComponent;
 import net.sf.briar.api.crypto.MessageDigest;
-import net.sf.briar.api.protocol.Author;
-import net.sf.briar.api.protocol.AuthorId;
+import net.sf.briar.api.messaging.Author;
+import net.sf.briar.api.messaging.AuthorId;
 import net.sf.briar.api.serial.DigestingConsumer;
 import net.sf.briar.api.serial.Reader;
 import net.sf.briar.api.serial.StructReader;
diff --git a/briar-core/src/net/sf/briar/protocol/GroupFactoryImpl.java b/briar-core/src/net/sf/briar/messaging/GroupFactoryImpl.java
similarity index 83%
rename from briar-core/src/net/sf/briar/protocol/GroupFactoryImpl.java
rename to briar-core/src/net/sf/briar/messaging/GroupFactoryImpl.java
index 893ba9cc98..6ceeee6a1d 100644
--- a/briar-core/src/net/sf/briar/protocol/GroupFactoryImpl.java
+++ b/briar-core/src/net/sf/briar/messaging/GroupFactoryImpl.java
@@ -1,15 +1,15 @@
-package net.sf.briar.protocol;
+package net.sf.briar.messaging;
 
-import static net.sf.briar.api.protocol.Types.GROUP;
+import static net.sf.briar.api.messaging.Types.GROUP;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 
 import net.sf.briar.api.crypto.CryptoComponent;
 import net.sf.briar.api.crypto.MessageDigest;
-import net.sf.briar.api.protocol.Group;
-import net.sf.briar.api.protocol.GroupFactory;
-import net.sf.briar.api.protocol.GroupId;
+import net.sf.briar.api.messaging.Group;
+import net.sf.briar.api.messaging.GroupFactory;
+import net.sf.briar.api.messaging.GroupId;
 import net.sf.briar.api.serial.Writer;
 import net.sf.briar.api.serial.WriterFactory;
 
diff --git a/briar-core/src/net/sf/briar/protocol/GroupReader.java b/briar-core/src/net/sf/briar/messaging/GroupReader.java
similarity index 74%
rename from briar-core/src/net/sf/briar/protocol/GroupReader.java
rename to briar-core/src/net/sf/briar/messaging/GroupReader.java
index 3cfc9d908c..c594a7f6ff 100644
--- a/briar-core/src/net/sf/briar/protocol/GroupReader.java
+++ b/briar-core/src/net/sf/briar/messaging/GroupReader.java
@@ -1,15 +1,15 @@
-package net.sf.briar.protocol;
+package net.sf.briar.messaging;
 
-import static net.sf.briar.api.protocol.ProtocolConstants.MAX_GROUP_NAME_LENGTH;
-import static net.sf.briar.api.protocol.ProtocolConstants.MAX_PUBLIC_KEY_LENGTH;
-import static net.sf.briar.api.protocol.Types.GROUP;
+import static net.sf.briar.api.messaging.MessagingConstants.MAX_GROUP_NAME_LENGTH;
+import static net.sf.briar.api.messaging.MessagingConstants.MAX_PUBLIC_KEY_LENGTH;
+import static net.sf.briar.api.messaging.Types.GROUP;
 
 import java.io.IOException;
 
 import net.sf.briar.api.crypto.CryptoComponent;
 import net.sf.briar.api.crypto.MessageDigest;
-import net.sf.briar.api.protocol.Group;
-import net.sf.briar.api.protocol.GroupId;
+import net.sf.briar.api.messaging.Group;
+import net.sf.briar.api.messaging.GroupId;
 import net.sf.briar.api.serial.DigestingConsumer;
 import net.sf.briar.api.serial.Reader;
 import net.sf.briar.api.serial.StructReader;
diff --git a/briar-core/src/net/sf/briar/protocol/MessageFactoryImpl.java b/briar-core/src/net/sf/briar/messaging/MessageFactoryImpl.java
similarity index 85%
rename from briar-core/src/net/sf/briar/protocol/MessageFactoryImpl.java
rename to briar-core/src/net/sf/briar/messaging/MessageFactoryImpl.java
index 4bbcdff101..c6c6011b46 100644
--- a/briar-core/src/net/sf/briar/protocol/MessageFactoryImpl.java
+++ b/briar-core/src/net/sf/briar/messaging/MessageFactoryImpl.java
@@ -1,13 +1,13 @@
-package net.sf.briar.protocol;
+package net.sf.briar.messaging;
 
-import static net.sf.briar.api.protocol.ProtocolConstants.MAX_BODY_LENGTH;
-import static net.sf.briar.api.protocol.ProtocolConstants.MAX_PACKET_LENGTH;
-import static net.sf.briar.api.protocol.ProtocolConstants.MAX_SIGNATURE_LENGTH;
-import static net.sf.briar.api.protocol.ProtocolConstants.MAX_SUBJECT_LENGTH;
-import static net.sf.briar.api.protocol.ProtocolConstants.SALT_LENGTH;
-import static net.sf.briar.api.protocol.Types.AUTHOR;
-import static net.sf.briar.api.protocol.Types.GROUP;
-import static net.sf.briar.api.protocol.Types.MESSAGE;
+import static net.sf.briar.api.messaging.MessagingConstants.MAX_BODY_LENGTH;
+import static net.sf.briar.api.messaging.MessagingConstants.MAX_PACKET_LENGTH;
+import static net.sf.briar.api.messaging.MessagingConstants.MAX_SIGNATURE_LENGTH;
+import static net.sf.briar.api.messaging.MessagingConstants.MAX_SUBJECT_LENGTH;
+import static net.sf.briar.api.messaging.MessagingConstants.SALT_LENGTH;
+import static net.sf.briar.api.messaging.Types.AUTHOR;
+import static net.sf.briar.api.messaging.Types.GROUP;
+import static net.sf.briar.api.messaging.Types.MESSAGE;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
@@ -19,13 +19,13 @@ import java.security.Signature;
 import net.sf.briar.api.clock.Clock;
 import net.sf.briar.api.crypto.CryptoComponent;
 import net.sf.briar.api.crypto.MessageDigest;
-import net.sf.briar.api.protocol.Author;
-import net.sf.briar.api.protocol.AuthorId;
-import net.sf.briar.api.protocol.Group;
-import net.sf.briar.api.protocol.GroupId;
-import net.sf.briar.api.protocol.Message;
-import net.sf.briar.api.protocol.MessageFactory;
-import net.sf.briar.api.protocol.MessageId;
+import net.sf.briar.api.messaging.Author;
+import net.sf.briar.api.messaging.AuthorId;
+import net.sf.briar.api.messaging.Group;
+import net.sf.briar.api.messaging.GroupId;
+import net.sf.briar.api.messaging.Message;
+import net.sf.briar.api.messaging.MessageFactory;
+import net.sf.briar.api.messaging.MessageId;
 import net.sf.briar.api.serial.Consumer;
 import net.sf.briar.api.serial.CountingConsumer;
 import net.sf.briar.api.serial.DigestingConsumer;
diff --git a/briar-core/src/net/sf/briar/protocol/MessageImpl.java b/briar-core/src/net/sf/briar/messaging/MessageImpl.java
similarity index 84%
rename from briar-core/src/net/sf/briar/protocol/MessageImpl.java
rename to briar-core/src/net/sf/briar/messaging/MessageImpl.java
index 3b6c739c23..e7090a9612 100644
--- a/briar-core/src/net/sf/briar/protocol/MessageImpl.java
+++ b/briar-core/src/net/sf/briar/messaging/MessageImpl.java
@@ -1,10 +1,10 @@
-package net.sf.briar.protocol;
+package net.sf.briar.messaging;
 
-import static net.sf.briar.api.protocol.ProtocolConstants.MAX_BODY_LENGTH;
-import net.sf.briar.api.protocol.AuthorId;
-import net.sf.briar.api.protocol.GroupId;
-import net.sf.briar.api.protocol.Message;
-import net.sf.briar.api.protocol.MessageId;
+import static net.sf.briar.api.messaging.MessagingConstants.MAX_BODY_LENGTH;
+import net.sf.briar.api.messaging.AuthorId;
+import net.sf.briar.api.messaging.GroupId;
+import net.sf.briar.api.messaging.Message;
+import net.sf.briar.api.messaging.MessageId;
 
 /** A simple in-memory implementation of a message. */
 class MessageImpl implements Message {
diff --git a/briar-core/src/net/sf/briar/protocol/MessageReader.java b/briar-core/src/net/sf/briar/messaging/MessageReader.java
similarity index 79%
rename from briar-core/src/net/sf/briar/protocol/MessageReader.java
rename to briar-core/src/net/sf/briar/messaging/MessageReader.java
index 8c6eb2d406..7fa93c2d69 100644
--- a/briar-core/src/net/sf/briar/protocol/MessageReader.java
+++ b/briar-core/src/net/sf/briar/messaging/MessageReader.java
@@ -1,20 +1,20 @@
-package net.sf.briar.protocol;
+package net.sf.briar.messaging;
 
-import static net.sf.briar.api.protocol.ProtocolConstants.MAX_BODY_LENGTH;
-import static net.sf.briar.api.protocol.ProtocolConstants.MAX_PACKET_LENGTH;
-import static net.sf.briar.api.protocol.ProtocolConstants.MAX_SIGNATURE_LENGTH;
-import static net.sf.briar.api.protocol.ProtocolConstants.MAX_SUBJECT_LENGTH;
-import static net.sf.briar.api.protocol.ProtocolConstants.SALT_LENGTH;
-import static net.sf.briar.api.protocol.Types.MESSAGE;
+import static net.sf.briar.api.messaging.MessagingConstants.MAX_BODY_LENGTH;
+import static net.sf.briar.api.messaging.MessagingConstants.MAX_PACKET_LENGTH;
+import static net.sf.briar.api.messaging.MessagingConstants.MAX_SIGNATURE_LENGTH;
+import static net.sf.briar.api.messaging.MessagingConstants.MAX_SUBJECT_LENGTH;
+import static net.sf.briar.api.messaging.MessagingConstants.SALT_LENGTH;
+import static net.sf.briar.api.messaging.Types.MESSAGE;
 
 import java.io.IOException;
 
 import net.sf.briar.api.FormatException;
-import net.sf.briar.api.protocol.Author;
-import net.sf.briar.api.protocol.Group;
-import net.sf.briar.api.protocol.MessageId;
-import net.sf.briar.api.protocol.UniqueId;
-import net.sf.briar.api.protocol.UnverifiedMessage;
+import net.sf.briar.api.messaging.Author;
+import net.sf.briar.api.messaging.Group;
+import net.sf.briar.api.messaging.MessageId;
+import net.sf.briar.api.messaging.UniqueId;
+import net.sf.briar.api.messaging.UnverifiedMessage;
 import net.sf.briar.api.serial.CopyingConsumer;
 import net.sf.briar.api.serial.CountingConsumer;
 import net.sf.briar.api.serial.Reader;
diff --git a/briar-core/src/net/sf/briar/protocol/MessageVerifierImpl.java b/briar-core/src/net/sf/briar/messaging/MessageVerifierImpl.java
similarity index 83%
rename from briar-core/src/net/sf/briar/protocol/MessageVerifierImpl.java
rename to briar-core/src/net/sf/briar/messaging/MessageVerifierImpl.java
index cb445a8c9b..1296481152 100644
--- a/briar-core/src/net/sf/briar/protocol/MessageVerifierImpl.java
+++ b/briar-core/src/net/sf/briar/messaging/MessageVerifierImpl.java
@@ -1,4 +1,4 @@
-package net.sf.briar.protocol;
+package net.sf.briar.messaging;
 
 import java.security.GeneralSecurityException;
 import java.security.PublicKey;
@@ -7,14 +7,14 @@ import java.security.Signature;
 import net.sf.briar.api.crypto.CryptoComponent;
 import net.sf.briar.api.crypto.KeyParser;
 import net.sf.briar.api.crypto.MessageDigest;
-import net.sf.briar.api.protocol.Author;
-import net.sf.briar.api.protocol.AuthorId;
-import net.sf.briar.api.protocol.Group;
-import net.sf.briar.api.protocol.GroupId;
-import net.sf.briar.api.protocol.Message;
-import net.sf.briar.api.protocol.MessageId;
-import net.sf.briar.api.protocol.MessageVerifier;
-import net.sf.briar.api.protocol.UnverifiedMessage;
+import net.sf.briar.api.messaging.Author;
+import net.sf.briar.api.messaging.AuthorId;
+import net.sf.briar.api.messaging.Group;
+import net.sf.briar.api.messaging.GroupId;
+import net.sf.briar.api.messaging.Message;
+import net.sf.briar.api.messaging.MessageId;
+import net.sf.briar.api.messaging.MessageVerifier;
+import net.sf.briar.api.messaging.UnverifiedMessage;
 
 import com.google.inject.Inject;
 
diff --git a/briar-core/src/net/sf/briar/protocol/ProtocolModule.java b/briar-core/src/net/sf/briar/messaging/MessagingModule.java
similarity index 71%
rename from briar-core/src/net/sf/briar/protocol/ProtocolModule.java
rename to briar-core/src/net/sf/briar/messaging/MessagingModule.java
index 9d32b9ef19..573a3f32b3 100644
--- a/briar-core/src/net/sf/briar/protocol/ProtocolModule.java
+++ b/briar-core/src/net/sf/briar/messaging/MessagingModule.java
@@ -1,26 +1,26 @@
-package net.sf.briar.protocol;
+package net.sf.briar.messaging;
 
 import java.util.concurrent.Executor;
 
 import net.sf.briar.api.crypto.CryptoComponent;
-import net.sf.briar.api.protocol.Author;
-import net.sf.briar.api.protocol.AuthorFactory;
-import net.sf.briar.api.protocol.Group;
-import net.sf.briar.api.protocol.GroupFactory;
-import net.sf.briar.api.protocol.MessageFactory;
-import net.sf.briar.api.protocol.MessageVerifier;
-import net.sf.briar.api.protocol.ProtocolReaderFactory;
-import net.sf.briar.api.protocol.ProtocolWriterFactory;
-import net.sf.briar.api.protocol.SubscriptionUpdate;
-import net.sf.briar.api.protocol.UnverifiedMessage;
-import net.sf.briar.api.protocol.VerificationExecutor;
+import net.sf.briar.api.messaging.Author;
+import net.sf.briar.api.messaging.AuthorFactory;
+import net.sf.briar.api.messaging.Group;
+import net.sf.briar.api.messaging.GroupFactory;
+import net.sf.briar.api.messaging.MessageFactory;
+import net.sf.briar.api.messaging.MessageVerifier;
+import net.sf.briar.api.messaging.PacketReaderFactory;
+import net.sf.briar.api.messaging.PacketWriterFactory;
+import net.sf.briar.api.messaging.SubscriptionUpdate;
+import net.sf.briar.api.messaging.UnverifiedMessage;
+import net.sf.briar.api.messaging.VerificationExecutor;
 import net.sf.briar.api.serial.StructReader;
 import net.sf.briar.util.BoundedExecutor;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.Provides;
 
-public class ProtocolModule extends AbstractModule {
+public class MessagingModule extends AbstractModule {
 
 	// FIXME: Determine suitable values for these constants empirically
 
@@ -43,8 +43,8 @@ public class ProtocolModule extends AbstractModule {
 		bind(GroupFactory.class).to(GroupFactoryImpl.class);
 		bind(MessageFactory.class).to(MessageFactoryImpl.class);
 		bind(MessageVerifier.class).to(MessageVerifierImpl.class);
-		bind(ProtocolReaderFactory.class).to(ProtocolReaderFactoryImpl.class);
-		bind(ProtocolWriterFactory.class).to(ProtocolWriterFactoryImpl.class);
+		bind(PacketReaderFactory.class).to(PacketReaderFactoryImpl.class);
+		bind(PacketWriterFactory.class).to(PacketWriterFactoryImpl.class);
 		// The executor is bounded, so tasks must be independent and short-lived
 		bind(Executor.class).annotatedWith(
 				VerificationExecutor.class).toInstance(
diff --git a/briar-core/src/net/sf/briar/protocol/ProtocolReaderFactoryImpl.java b/briar-core/src/net/sf/briar/messaging/PacketReaderFactoryImpl.java
similarity index 56%
rename from briar-core/src/net/sf/briar/protocol/ProtocolReaderFactoryImpl.java
rename to briar-core/src/net/sf/briar/messaging/PacketReaderFactoryImpl.java
index ac1af5728f..624e8506ce 100644
--- a/briar-core/src/net/sf/briar/protocol/ProtocolReaderFactoryImpl.java
+++ b/briar-core/src/net/sf/briar/messaging/PacketReaderFactoryImpl.java
@@ -1,24 +1,24 @@
-package net.sf.briar.protocol;
+package net.sf.briar.messaging;
 
 import java.io.InputStream;
 
-import net.sf.briar.api.protocol.ProtocolReader;
-import net.sf.briar.api.protocol.ProtocolReaderFactory;
-import net.sf.briar.api.protocol.SubscriptionUpdate;
-import net.sf.briar.api.protocol.UnverifiedMessage;
+import net.sf.briar.api.messaging.PacketReader;
+import net.sf.briar.api.messaging.PacketReaderFactory;
+import net.sf.briar.api.messaging.SubscriptionUpdate;
+import net.sf.briar.api.messaging.UnverifiedMessage;
 import net.sf.briar.api.serial.ReaderFactory;
 import net.sf.briar.api.serial.StructReader;
 
 import com.google.inject.Inject;
 
-class ProtocolReaderFactoryImpl implements ProtocolReaderFactory {
+class PacketReaderFactoryImpl implements PacketReaderFactory {
 
 	private final ReaderFactory readerFactory;
 	private final StructReader<UnverifiedMessage> messageReader;
 	private final StructReader<SubscriptionUpdate> subscriptionUpdateReader;
 
 	@Inject
-	ProtocolReaderFactoryImpl(ReaderFactory readerFactory,
+	PacketReaderFactoryImpl(ReaderFactory readerFactory,
 			StructReader<UnverifiedMessage> messageReader,
 			StructReader<SubscriptionUpdate> subscriptionUpdateReader) {
 		this.readerFactory = readerFactory;
@@ -26,8 +26,8 @@ class ProtocolReaderFactoryImpl implements ProtocolReaderFactory {
 		this.subscriptionUpdateReader = subscriptionUpdateReader;
 	}
 
-	public ProtocolReader createProtocolReader(InputStream in) {
-		return new ProtocolReaderImpl(readerFactory, messageReader,
+	public PacketReader createPacketReader(InputStream in) {
+		return new PacketReaderImpl(readerFactory, messageReader,
 				subscriptionUpdateReader, in);
 	}
 }
diff --git a/briar-core/src/net/sf/briar/protocol/ProtocolReaderImpl.java b/briar-core/src/net/sf/briar/messaging/PacketReaderImpl.java
similarity index 79%
rename from briar-core/src/net/sf/briar/protocol/ProtocolReaderImpl.java
rename to briar-core/src/net/sf/briar/messaging/PacketReaderImpl.java
index 2e49cb2b6b..cdd5bdcbb4 100644
--- a/briar-core/src/net/sf/briar/protocol/ProtocolReaderImpl.java
+++ b/briar-core/src/net/sf/briar/messaging/PacketReaderImpl.java
@@ -1,18 +1,18 @@
-package net.sf.briar.protocol;
-
-import static net.sf.briar.api.protocol.ProtocolConstants.MAX_PACKET_LENGTH;
-import static net.sf.briar.api.protocol.ProtocolConstants.MAX_PROPERTIES_PER_TRANSPORT;
-import static net.sf.briar.api.protocol.ProtocolConstants.MAX_PROPERTY_LENGTH;
-import static net.sf.briar.api.protocol.Types.ACK;
-import static net.sf.briar.api.protocol.Types.RETENTION_ACK;
-import static net.sf.briar.api.protocol.Types.RETENTION_UPDATE;
-import static net.sf.briar.api.protocol.Types.MESSAGE;
-import static net.sf.briar.api.protocol.Types.OFFER;
-import static net.sf.briar.api.protocol.Types.REQUEST;
-import static net.sf.briar.api.protocol.Types.SUBSCRIPTION_ACK;
-import static net.sf.briar.api.protocol.Types.SUBSCRIPTION_UPDATE;
-import static net.sf.briar.api.protocol.Types.TRANSPORT_ACK;
-import static net.sf.briar.api.protocol.Types.TRANSPORT_UPDATE;
+package net.sf.briar.messaging;
+
+import static net.sf.briar.api.messaging.MessagingConstants.MAX_PACKET_LENGTH;
+import static net.sf.briar.api.messaging.MessagingConstants.MAX_PROPERTIES_PER_TRANSPORT;
+import static net.sf.briar.api.messaging.MessagingConstants.MAX_PROPERTY_LENGTH;
+import static net.sf.briar.api.messaging.Types.ACK;
+import static net.sf.briar.api.messaging.Types.MESSAGE;
+import static net.sf.briar.api.messaging.Types.OFFER;
+import static net.sf.briar.api.messaging.Types.REQUEST;
+import static net.sf.briar.api.messaging.Types.RETENTION_ACK;
+import static net.sf.briar.api.messaging.Types.RETENTION_UPDATE;
+import static net.sf.briar.api.messaging.Types.SUBSCRIPTION_ACK;
+import static net.sf.briar.api.messaging.Types.SUBSCRIPTION_UPDATE;
+import static net.sf.briar.api.messaging.Types.TRANSPORT_ACK;
+import static net.sf.briar.api.messaging.Types.TRANSPORT_UPDATE;
 
 import java.io.IOException;
 import java.io.InputStream;
@@ -25,20 +25,20 @@ import java.util.Map;
 import net.sf.briar.api.Bytes;
 import net.sf.briar.api.FormatException;
 import net.sf.briar.api.TransportProperties;
-import net.sf.briar.api.protocol.Ack;
-import net.sf.briar.api.protocol.RetentionAck;
-import net.sf.briar.api.protocol.RetentionUpdate;
-import net.sf.briar.api.protocol.MessageId;
-import net.sf.briar.api.protocol.Offer;
-import net.sf.briar.api.protocol.ProtocolReader;
-import net.sf.briar.api.protocol.Request;
-import net.sf.briar.api.protocol.SubscriptionAck;
-import net.sf.briar.api.protocol.SubscriptionUpdate;
-import net.sf.briar.api.protocol.TransportAck;
-import net.sf.briar.api.protocol.TransportId;
-import net.sf.briar.api.protocol.TransportUpdate;
-import net.sf.briar.api.protocol.UniqueId;
-import net.sf.briar.api.protocol.UnverifiedMessage;
+import net.sf.briar.api.messaging.Ack;
+import net.sf.briar.api.messaging.MessageId;
+import net.sf.briar.api.messaging.Offer;
+import net.sf.briar.api.messaging.PacketReader;
+import net.sf.briar.api.messaging.Request;
+import net.sf.briar.api.messaging.RetentionAck;
+import net.sf.briar.api.messaging.RetentionUpdate;
+import net.sf.briar.api.messaging.SubscriptionAck;
+import net.sf.briar.api.messaging.SubscriptionUpdate;
+import net.sf.briar.api.messaging.TransportAck;
+import net.sf.briar.api.messaging.TransportId;
+import net.sf.briar.api.messaging.TransportUpdate;
+import net.sf.briar.api.messaging.UniqueId;
+import net.sf.briar.api.messaging.UnverifiedMessage;
 import net.sf.briar.api.serial.Consumer;
 import net.sf.briar.api.serial.CountingConsumer;
 import net.sf.briar.api.serial.Reader;
@@ -46,13 +46,13 @@ import net.sf.briar.api.serial.ReaderFactory;
 import net.sf.briar.api.serial.StructReader;
 
 // This class is not thread-safe
-class ProtocolReaderImpl implements ProtocolReader {
+class PacketReaderImpl implements PacketReader {
 
 	private final StructReader<UnverifiedMessage> messageReader;
 	private final StructReader<SubscriptionUpdate> subscriptionUpdateReader;
 	private final Reader r;
 
-	ProtocolReaderImpl(ReaderFactory readerFactory,
+	PacketReaderImpl(ReaderFactory readerFactory,
 			StructReader<UnverifiedMessage> messageReader,
 			StructReader<SubscriptionUpdate> subscriptionUpdateReader,
 			InputStream in) {
diff --git a/briar-core/src/net/sf/briar/messaging/PacketWriterFactoryImpl.java b/briar-core/src/net/sf/briar/messaging/PacketWriterFactoryImpl.java
new file mode 100644
index 0000000000..3d80c3b3ab
--- /dev/null
+++ b/briar-core/src/net/sf/briar/messaging/PacketWriterFactoryImpl.java
@@ -0,0 +1,28 @@
+package net.sf.briar.messaging;
+
+import java.io.OutputStream;
+
+import net.sf.briar.api.messaging.PacketWriter;
+import net.sf.briar.api.messaging.PacketWriterFactory;
+import net.sf.briar.api.serial.SerialComponent;
+import net.sf.briar.api.serial.WriterFactory;
+
+import com.google.inject.Inject;
+
+class PacketWriterFactoryImpl implements PacketWriterFactory {
+
+	private final SerialComponent serial;
+	private final WriterFactory writerFactory;
+
+	@Inject
+	PacketWriterFactoryImpl(SerialComponent serial,
+			WriterFactory writerFactory) {
+		this.serial = serial;
+		this.writerFactory = writerFactory;
+	}
+
+	public PacketWriter createPacketWriter(OutputStream out,
+			boolean flush) {
+		return new PacketWriterImpl(serial, writerFactory, out, flush);
+	}
+}
diff --git a/briar-core/src/net/sf/briar/protocol/ProtocolWriterImpl.java b/briar-core/src/net/sf/briar/messaging/PacketWriterImpl.java
similarity index 73%
rename from briar-core/src/net/sf/briar/protocol/ProtocolWriterImpl.java
rename to briar-core/src/net/sf/briar/messaging/PacketWriterImpl.java
index 3a9a813fa0..0e54cec9b9 100644
--- a/briar-core/src/net/sf/briar/protocol/ProtocolWriterImpl.java
+++ b/briar-core/src/net/sf/briar/messaging/PacketWriterImpl.java
@@ -1,46 +1,46 @@
-package net.sf.briar.protocol;
-
-import static net.sf.briar.api.protocol.ProtocolConstants.MAX_PACKET_LENGTH;
-import static net.sf.briar.api.protocol.Types.ACK;
-import static net.sf.briar.api.protocol.Types.RETENTION_ACK;
-import static net.sf.briar.api.protocol.Types.RETENTION_UPDATE;
-import static net.sf.briar.api.protocol.Types.GROUP;
-import static net.sf.briar.api.protocol.Types.OFFER;
-import static net.sf.briar.api.protocol.Types.REQUEST;
-import static net.sf.briar.api.protocol.Types.SUBSCRIPTION_ACK;
-import static net.sf.briar.api.protocol.Types.SUBSCRIPTION_UPDATE;
-import static net.sf.briar.api.protocol.Types.TRANSPORT_ACK;
-import static net.sf.briar.api.protocol.Types.TRANSPORT_UPDATE;
+package net.sf.briar.messaging;
+
+import static net.sf.briar.api.messaging.MessagingConstants.MAX_PACKET_LENGTH;
+import static net.sf.briar.api.messaging.Types.ACK;
+import static net.sf.briar.api.messaging.Types.GROUP;
+import static net.sf.briar.api.messaging.Types.OFFER;
+import static net.sf.briar.api.messaging.Types.REQUEST;
+import static net.sf.briar.api.messaging.Types.RETENTION_ACK;
+import static net.sf.briar.api.messaging.Types.RETENTION_UPDATE;
+import static net.sf.briar.api.messaging.Types.SUBSCRIPTION_ACK;
+import static net.sf.briar.api.messaging.Types.SUBSCRIPTION_UPDATE;
+import static net.sf.briar.api.messaging.Types.TRANSPORT_ACK;
+import static net.sf.briar.api.messaging.Types.TRANSPORT_UPDATE;
 
 import java.io.IOException;
 import java.io.OutputStream;
 import java.util.BitSet;
 
-import net.sf.briar.api.protocol.Ack;
-import net.sf.briar.api.protocol.RetentionAck;
-import net.sf.briar.api.protocol.RetentionUpdate;
-import net.sf.briar.api.protocol.Group;
-import net.sf.briar.api.protocol.MessageId;
-import net.sf.briar.api.protocol.Offer;
-import net.sf.briar.api.protocol.ProtocolWriter;
-import net.sf.briar.api.protocol.Request;
-import net.sf.briar.api.protocol.SubscriptionAck;
-import net.sf.briar.api.protocol.SubscriptionUpdate;
-import net.sf.briar.api.protocol.TransportAck;
-import net.sf.briar.api.protocol.TransportUpdate;
+import net.sf.briar.api.messaging.Ack;
+import net.sf.briar.api.messaging.Group;
+import net.sf.briar.api.messaging.MessageId;
+import net.sf.briar.api.messaging.Offer;
+import net.sf.briar.api.messaging.PacketWriter;
+import net.sf.briar.api.messaging.Request;
+import net.sf.briar.api.messaging.RetentionAck;
+import net.sf.briar.api.messaging.RetentionUpdate;
+import net.sf.briar.api.messaging.SubscriptionAck;
+import net.sf.briar.api.messaging.SubscriptionUpdate;
+import net.sf.briar.api.messaging.TransportAck;
+import net.sf.briar.api.messaging.TransportUpdate;
 import net.sf.briar.api.serial.SerialComponent;
 import net.sf.briar.api.serial.Writer;
 import net.sf.briar.api.serial.WriterFactory;
 
 // This class is not thread-safe
-class ProtocolWriterImpl implements ProtocolWriter {
+class PacketWriterImpl implements PacketWriter {
 
 	private final SerialComponent serial;
 	private final OutputStream out;
 	private final boolean flush;
 	private final Writer w;
 
-	ProtocolWriterImpl(SerialComponent serial, WriterFactory writerFactory,
+	PacketWriterImpl(SerialComponent serial, WriterFactory writerFactory,
 			OutputStream out, boolean flush) {
 		this.serial = serial;
 		this.out = out;
diff --git a/briar-core/src/net/sf/briar/protocol/SubscriptionUpdateReader.java b/briar-core/src/net/sf/briar/messaging/SubscriptionUpdateReader.java
similarity index 81%
rename from briar-core/src/net/sf/briar/protocol/SubscriptionUpdateReader.java
rename to briar-core/src/net/sf/briar/messaging/SubscriptionUpdateReader.java
index 5c20994486..cfbae5675a 100644
--- a/briar-core/src/net/sf/briar/protocol/SubscriptionUpdateReader.java
+++ b/briar-core/src/net/sf/briar/messaging/SubscriptionUpdateReader.java
@@ -1,7 +1,7 @@
-package net.sf.briar.protocol;
+package net.sf.briar.messaging;
 
-import static net.sf.briar.api.protocol.ProtocolConstants.MAX_PACKET_LENGTH;
-import static net.sf.briar.api.protocol.Types.SUBSCRIPTION_UPDATE;
+import static net.sf.briar.api.messaging.MessagingConstants.MAX_PACKET_LENGTH;
+import static net.sf.briar.api.messaging.Types.SUBSCRIPTION_UPDATE;
 
 import java.io.IOException;
 import java.util.ArrayList;
@@ -9,8 +9,8 @@ import java.util.Collections;
 import java.util.List;
 
 import net.sf.briar.api.FormatException;
-import net.sf.briar.api.protocol.Group;
-import net.sf.briar.api.protocol.SubscriptionUpdate;
+import net.sf.briar.api.messaging.Group;
+import net.sf.briar.api.messaging.SubscriptionUpdate;
 import net.sf.briar.api.serial.Consumer;
 import net.sf.briar.api.serial.CountingConsumer;
 import net.sf.briar.api.serial.Reader;
diff --git a/briar-core/src/net/sf/briar/protocol/duplex/DuplexConnection.java b/briar-core/src/net/sf/briar/messaging/duplex/DuplexConnection.java
similarity index 93%
rename from briar-core/src/net/sf/briar/protocol/duplex/DuplexConnection.java
rename to briar-core/src/net/sf/briar/messaging/duplex/DuplexConnection.java
index 0a50becb93..9c02e1ed4c 100644
--- a/briar-core/src/net/sf/briar/protocol/duplex/DuplexConnection.java
+++ b/briar-core/src/net/sf/briar/messaging/duplex/DuplexConnection.java
@@ -1,4 +1,4 @@
-package net.sf.briar.protocol.duplex;
+package net.sf.briar.messaging.duplex;
 
 import static java.util.logging.Level.INFO;
 import static java.util.logging.Level.WARNING;
@@ -31,26 +31,26 @@ import net.sf.briar.api.db.event.LocalSubscriptionsUpdatedEvent;
 import net.sf.briar.api.db.event.LocalTransportsUpdatedEvent;
 import net.sf.briar.api.db.event.MessageAddedEvent;
 import net.sf.briar.api.db.event.MessageReceivedEvent;
+import net.sf.briar.api.messaging.Ack;
+import net.sf.briar.api.messaging.Message;
+import net.sf.briar.api.messaging.MessageId;
+import net.sf.briar.api.messaging.MessageVerifier;
+import net.sf.briar.api.messaging.Offer;
+import net.sf.briar.api.messaging.PacketReader;
+import net.sf.briar.api.messaging.PacketReaderFactory;
+import net.sf.briar.api.messaging.PacketWriter;
+import net.sf.briar.api.messaging.PacketWriterFactory;
+import net.sf.briar.api.messaging.Request;
+import net.sf.briar.api.messaging.RetentionAck;
+import net.sf.briar.api.messaging.RetentionUpdate;
+import net.sf.briar.api.messaging.SubscriptionAck;
+import net.sf.briar.api.messaging.SubscriptionUpdate;
+import net.sf.briar.api.messaging.TransportAck;
+import net.sf.briar.api.messaging.TransportId;
+import net.sf.briar.api.messaging.TransportUpdate;
+import net.sf.briar.api.messaging.UnverifiedMessage;
+import net.sf.briar.api.messaging.VerificationExecutor;
 import net.sf.briar.api.plugins.duplex.DuplexTransportConnection;
-import net.sf.briar.api.protocol.Ack;
-import net.sf.briar.api.protocol.Message;
-import net.sf.briar.api.protocol.MessageId;
-import net.sf.briar.api.protocol.MessageVerifier;
-import net.sf.briar.api.protocol.Offer;
-import net.sf.briar.api.protocol.ProtocolReader;
-import net.sf.briar.api.protocol.ProtocolReaderFactory;
-import net.sf.briar.api.protocol.ProtocolWriter;
-import net.sf.briar.api.protocol.ProtocolWriterFactory;
-import net.sf.briar.api.protocol.Request;
-import net.sf.briar.api.protocol.RetentionAck;
-import net.sf.briar.api.protocol.RetentionUpdate;
-import net.sf.briar.api.protocol.SubscriptionAck;
-import net.sf.briar.api.protocol.SubscriptionUpdate;
-import net.sf.briar.api.protocol.TransportAck;
-import net.sf.briar.api.protocol.TransportId;
-import net.sf.briar.api.protocol.TransportUpdate;
-import net.sf.briar.api.protocol.UnverifiedMessage;
-import net.sf.briar.api.protocol.VerificationExecutor;
 import net.sf.briar.api.transport.ConnectionContext;
 import net.sf.briar.api.transport.ConnectionReader;
 import net.sf.briar.api.transport.ConnectionReaderFactory;
@@ -72,8 +72,8 @@ abstract class DuplexConnection implements DatabaseListener {
 	protected final ConnectionRegistry connRegistry;
 	protected final ConnectionReaderFactory connReaderFactory;
 	protected final ConnectionWriterFactory connWriterFactory;
-	protected final ProtocolReaderFactory protoReaderFactory;
-	protected final ProtocolWriterFactory protoWriterFactory;
+	protected final PacketReaderFactory protoReaderFactory;
+	protected final PacketWriterFactory protoWriterFactory;
 	protected final ConnectionContext ctx;
 	protected final DuplexTransportConnection transport;
 	protected final ContactId contactId;
@@ -86,7 +86,7 @@ abstract class DuplexConnection implements DatabaseListener {
 
 	private Collection<MessageId> offered = null; // Locking: this
 
-	private volatile ProtocolWriter writer = null;
+	private volatile PacketWriter writer = null;
 
 	DuplexConnection(@DatabaseExecutor Executor dbExecutor,
 			@VerificationExecutor Executor verificationExecutor,
@@ -94,8 +94,8 @@ abstract class DuplexConnection implements DatabaseListener {
 			ConnectionRegistry connRegistry,
 			ConnectionReaderFactory connReaderFactory,
 			ConnectionWriterFactory connWriterFactory,
-			ProtocolReaderFactory protoReaderFactory,
-			ProtocolWriterFactory protoWriterFactory, ConnectionContext ctx,
+			PacketReaderFactory protoReaderFactory,
+			PacketWriterFactory protoWriterFactory, ConnectionContext ctx,
 			DuplexTransportConnection transport) {
 		this.dbExecutor = dbExecutor;
 		this.verificationExecutor = verificationExecutor;
@@ -144,7 +144,7 @@ abstract class DuplexConnection implements DatabaseListener {
 	void read() {
 		try {
 			InputStream in = createConnectionReader().getInputStream();
-			ProtocolReader reader = protoReaderFactory.createProtocolReader(in);
+			PacketReader reader = protoReaderFactory.createPacketReader(in);
 			while(!reader.eof()) {
 				if(reader.hasAck()) {
 					Ack a = reader.readAck();
@@ -209,7 +209,7 @@ abstract class DuplexConnection implements DatabaseListener {
 		db.addListener(this);
 		try {
 			OutputStream out = createConnectionWriter().getOutputStream();
-			writer = protoWriterFactory.createProtocolWriter(out,
+			writer = protoWriterFactory.createPacketWriter(out,
 					transport.shouldFlush());
 			// Send the initial packets: updates, acks, offer
 			dbExecutor.execute(new GenerateTransportAcks());
diff --git a/briar-core/src/net/sf/briar/protocol/duplex/DuplexConnectionFactoryImpl.java b/briar-core/src/net/sf/briar/messaging/duplex/DuplexConnectionFactoryImpl.java
similarity index 85%
rename from briar-core/src/net/sf/briar/protocol/duplex/DuplexConnectionFactoryImpl.java
rename to briar-core/src/net/sf/briar/messaging/duplex/DuplexConnectionFactoryImpl.java
index e60f9c0be7..5230475c9d 100644
--- a/briar-core/src/net/sf/briar/protocol/duplex/DuplexConnectionFactoryImpl.java
+++ b/briar-core/src/net/sf/briar/messaging/duplex/DuplexConnectionFactoryImpl.java
@@ -1,4 +1,4 @@
-package net.sf.briar.protocol.duplex;
+package net.sf.briar.messaging.duplex;
 
 import static java.util.logging.Level.WARNING;
 
@@ -9,13 +9,13 @@ import net.sf.briar.api.ContactId;
 import net.sf.briar.api.crypto.KeyManager;
 import net.sf.briar.api.db.DatabaseComponent;
 import net.sf.briar.api.db.DatabaseExecutor;
+import net.sf.briar.api.messaging.MessageVerifier;
+import net.sf.briar.api.messaging.PacketReaderFactory;
+import net.sf.briar.api.messaging.PacketWriterFactory;
+import net.sf.briar.api.messaging.TransportId;
+import net.sf.briar.api.messaging.VerificationExecutor;
+import net.sf.briar.api.messaging.duplex.DuplexConnectionFactory;
 import net.sf.briar.api.plugins.duplex.DuplexTransportConnection;
-import net.sf.briar.api.protocol.MessageVerifier;
-import net.sf.briar.api.protocol.ProtocolReaderFactory;
-import net.sf.briar.api.protocol.ProtocolWriterFactory;
-import net.sf.briar.api.protocol.TransportId;
-import net.sf.briar.api.protocol.VerificationExecutor;
-import net.sf.briar.api.protocol.duplex.DuplexConnectionFactory;
 import net.sf.briar.api.transport.ConnectionContext;
 import net.sf.briar.api.transport.ConnectionReaderFactory;
 import net.sf.briar.api.transport.ConnectionRegistry;
@@ -35,8 +35,8 @@ class DuplexConnectionFactoryImpl implements DuplexConnectionFactory {
 	private final ConnectionRegistry connRegistry;
 	private final ConnectionReaderFactory connReaderFactory;
 	private final ConnectionWriterFactory connWriterFactory;
-	private final ProtocolReaderFactory protoReaderFactory;
-	private final ProtocolWriterFactory protoWriterFactory;
+	private final PacketReaderFactory protoReaderFactory;
+	private final PacketWriterFactory protoWriterFactory;
 
 	@Inject
 	DuplexConnectionFactoryImpl(@DatabaseExecutor Executor dbExecutor,
@@ -45,7 +45,7 @@ class DuplexConnectionFactoryImpl implements DuplexConnectionFactory {
 			KeyManager keyManager, ConnectionRegistry connRegistry,
 			ConnectionReaderFactory connReaderFactory,
 			ConnectionWriterFactory connWriterFactory,
-			ProtocolReaderFactory protoReaderFactory, ProtocolWriterFactory protoWriterFactory) {
+			PacketReaderFactory protoReaderFactory, PacketWriterFactory protoWriterFactory) {
 		this.dbExecutor = dbExecutor;
 		this.verificationExecutor = verificationExecutor;
 		this.messageVerifier = messageVerifier;
diff --git a/briar-core/src/net/sf/briar/protocol/duplex/DuplexProtocolModule.java b/briar-core/src/net/sf/briar/messaging/duplex/DuplexMessagingModule.java
similarity index 58%
rename from briar-core/src/net/sf/briar/protocol/duplex/DuplexProtocolModule.java
rename to briar-core/src/net/sf/briar/messaging/duplex/DuplexMessagingModule.java
index 1ba18df14b..ef69948243 100644
--- a/briar-core/src/net/sf/briar/protocol/duplex/DuplexProtocolModule.java
+++ b/briar-core/src/net/sf/briar/messaging/duplex/DuplexMessagingModule.java
@@ -1,11 +1,11 @@
-package net.sf.briar.protocol.duplex;
+package net.sf.briar.messaging.duplex;
 
-import net.sf.briar.api.protocol.duplex.DuplexConnectionFactory;
+import net.sf.briar.api.messaging.duplex.DuplexConnectionFactory;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.Singleton;
 
-public class DuplexProtocolModule extends AbstractModule {
+public class DuplexMessagingModule extends AbstractModule {
 
 	@Override
 	protected void configure() {
diff --git a/briar-core/src/net/sf/briar/protocol/duplex/IncomingDuplexConnection.java b/briar-core/src/net/sf/briar/messaging/duplex/IncomingDuplexConnection.java
similarity index 81%
rename from briar-core/src/net/sf/briar/protocol/duplex/IncomingDuplexConnection.java
rename to briar-core/src/net/sf/briar/messaging/duplex/IncomingDuplexConnection.java
index 2f5b006eca..f9aba80b8a 100644
--- a/briar-core/src/net/sf/briar/protocol/duplex/IncomingDuplexConnection.java
+++ b/briar-core/src/net/sf/briar/messaging/duplex/IncomingDuplexConnection.java
@@ -1,15 +1,15 @@
-package net.sf.briar.protocol.duplex;
+package net.sf.briar.messaging.duplex;
 
 import java.io.IOException;
 import java.util.concurrent.Executor;
 
 import net.sf.briar.api.db.DatabaseComponent;
 import net.sf.briar.api.db.DatabaseExecutor;
+import net.sf.briar.api.messaging.MessageVerifier;
+import net.sf.briar.api.messaging.PacketReaderFactory;
+import net.sf.briar.api.messaging.PacketWriterFactory;
+import net.sf.briar.api.messaging.VerificationExecutor;
 import net.sf.briar.api.plugins.duplex.DuplexTransportConnection;
-import net.sf.briar.api.protocol.MessageVerifier;
-import net.sf.briar.api.protocol.ProtocolReaderFactory;
-import net.sf.briar.api.protocol.ProtocolWriterFactory;
-import net.sf.briar.api.protocol.VerificationExecutor;
 import net.sf.briar.api.transport.ConnectionContext;
 import net.sf.briar.api.transport.ConnectionReader;
 import net.sf.briar.api.transport.ConnectionReaderFactory;
@@ -25,8 +25,8 @@ class IncomingDuplexConnection extends DuplexConnection {
 			ConnectionRegistry connRegistry,
 			ConnectionReaderFactory connReaderFactory,
 			ConnectionWriterFactory connWriterFactory,
-			ProtocolReaderFactory protoReaderFactory,
-			ProtocolWriterFactory protoWriterFactory,
+			PacketReaderFactory protoReaderFactory,
+			PacketWriterFactory protoWriterFactory,
 			ConnectionContext ctx, DuplexTransportConnection transport) {
 		super(dbExecutor, verificationExecutor, messageVerifier, db,
 				connRegistry, connReaderFactory, connWriterFactory,
diff --git a/briar-core/src/net/sf/briar/protocol/duplex/OutgoingDuplexConnection.java b/briar-core/src/net/sf/briar/messaging/duplex/OutgoingDuplexConnection.java
similarity index 80%
rename from briar-core/src/net/sf/briar/protocol/duplex/OutgoingDuplexConnection.java
rename to briar-core/src/net/sf/briar/messaging/duplex/OutgoingDuplexConnection.java
index 4b67f433fb..06418f78b9 100644
--- a/briar-core/src/net/sf/briar/protocol/duplex/OutgoingDuplexConnection.java
+++ b/briar-core/src/net/sf/briar/messaging/duplex/OutgoingDuplexConnection.java
@@ -1,15 +1,15 @@
-package net.sf.briar.protocol.duplex;
+package net.sf.briar.messaging.duplex;
 
 import java.io.IOException;
 import java.util.concurrent.Executor;
 
 import net.sf.briar.api.db.DatabaseComponent;
 import net.sf.briar.api.db.DatabaseExecutor;
+import net.sf.briar.api.messaging.MessageVerifier;
+import net.sf.briar.api.messaging.PacketReaderFactory;
+import net.sf.briar.api.messaging.PacketWriterFactory;
+import net.sf.briar.api.messaging.VerificationExecutor;
 import net.sf.briar.api.plugins.duplex.DuplexTransportConnection;
-import net.sf.briar.api.protocol.MessageVerifier;
-import net.sf.briar.api.protocol.ProtocolReaderFactory;
-import net.sf.briar.api.protocol.ProtocolWriterFactory;
-import net.sf.briar.api.protocol.VerificationExecutor;
 import net.sf.briar.api.transport.ConnectionContext;
 import net.sf.briar.api.transport.ConnectionReader;
 import net.sf.briar.api.transport.ConnectionReaderFactory;
@@ -25,8 +25,8 @@ class OutgoingDuplexConnection extends DuplexConnection {
 			ConnectionRegistry connRegistry,
 			ConnectionReaderFactory connReaderFactory,
 			ConnectionWriterFactory connWriterFactory,
-			ProtocolReaderFactory protoReaderFactory,
-			ProtocolWriterFactory protoWriterFactory, ConnectionContext ctx,
+			PacketReaderFactory protoReaderFactory,
+			PacketWriterFactory protoWriterFactory, ConnectionContext ctx,
 			DuplexTransportConnection transport) {
 		super(dbExecutor, verificationExecutor, messageVerifier, db,
 				connRegistry, connReaderFactory, connWriterFactory,
diff --git a/briar-core/src/net/sf/briar/protocol/simplex/IncomingSimplexConnection.java b/briar-core/src/net/sf/briar/messaging/simplex/IncomingSimplexConnection.java
similarity index 88%
rename from briar-core/src/net/sf/briar/protocol/simplex/IncomingSimplexConnection.java
rename to briar-core/src/net/sf/briar/messaging/simplex/IncomingSimplexConnection.java
index f922a56fbb..9d48be5958 100644
--- a/briar-core/src/net/sf/briar/protocol/simplex/IncomingSimplexConnection.java
+++ b/briar-core/src/net/sf/briar/messaging/simplex/IncomingSimplexConnection.java
@@ -1,4 +1,4 @@
-package net.sf.briar.protocol.simplex;
+package net.sf.briar.messaging.simplex;
 
 import static java.util.logging.Level.WARNING;
 
@@ -13,21 +13,21 @@ 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.messaging.Ack;
+import net.sf.briar.api.messaging.Message;
+import net.sf.briar.api.messaging.MessageVerifier;
+import net.sf.briar.api.messaging.PacketReader;
+import net.sf.briar.api.messaging.PacketReaderFactory;
+import net.sf.briar.api.messaging.RetentionAck;
+import net.sf.briar.api.messaging.RetentionUpdate;
+import net.sf.briar.api.messaging.SubscriptionAck;
+import net.sf.briar.api.messaging.SubscriptionUpdate;
+import net.sf.briar.api.messaging.TransportAck;
+import net.sf.briar.api.messaging.TransportId;
+import net.sf.briar.api.messaging.TransportUpdate;
+import net.sf.briar.api.messaging.UnverifiedMessage;
+import net.sf.briar.api.messaging.VerificationExecutor;
 import net.sf.briar.api.plugins.simplex.SimplexTransportReader;
-import net.sf.briar.api.protocol.Ack;
-import net.sf.briar.api.protocol.Message;
-import net.sf.briar.api.protocol.MessageVerifier;
-import net.sf.briar.api.protocol.ProtocolReader;
-import net.sf.briar.api.protocol.ProtocolReaderFactory;
-import net.sf.briar.api.protocol.RetentionAck;
-import net.sf.briar.api.protocol.RetentionUpdate;
-import net.sf.briar.api.protocol.SubscriptionAck;
-import net.sf.briar.api.protocol.SubscriptionUpdate;
-import net.sf.briar.api.protocol.TransportAck;
-import net.sf.briar.api.protocol.TransportId;
-import net.sf.briar.api.protocol.TransportUpdate;
-import net.sf.briar.api.protocol.UnverifiedMessage;
-import net.sf.briar.api.protocol.VerificationExecutor;
 import net.sf.briar.api.transport.ConnectionContext;
 import net.sf.briar.api.transport.ConnectionReader;
 import net.sf.briar.api.transport.ConnectionReaderFactory;
@@ -44,7 +44,7 @@ class IncomingSimplexConnection {
 	private final DatabaseComponent db;
 	private final ConnectionRegistry connRegistry;
 	private final ConnectionReaderFactory connFactory;
-	private final ProtocolReaderFactory protoFactory;
+	private final PacketReaderFactory protoFactory;
 	private final ConnectionContext ctx;
 	private final SimplexTransportReader transport;
 	private final ContactId contactId;
@@ -55,7 +55,7 @@ class IncomingSimplexConnection {
 			MessageVerifier messageVerifier, DatabaseComponent db,
 			ConnectionRegistry connRegistry,
 			ConnectionReaderFactory connFactory,
-			ProtocolReaderFactory protoFactory, ConnectionContext ctx,
+			PacketReaderFactory protoFactory, ConnectionContext ctx,
 			SimplexTransportReader transport) {
 		this.dbExecutor = dbExecutor;
 		this.verificationExecutor = verificationExecutor;
@@ -76,7 +76,7 @@ class IncomingSimplexConnection {
 			ConnectionReader conn = connFactory.createConnectionReader(
 					transport.getInputStream(), ctx, true, true);
 			InputStream in = conn.getInputStream();
-			ProtocolReader reader = protoFactory.createProtocolReader(in);
+			PacketReader reader = protoFactory.createPacketReader(in);
 			// Read packets until EOF
 			while(!reader.eof()) {
 				if(reader.hasAck()) {
diff --git a/briar-core/src/net/sf/briar/protocol/simplex/OutgoingSimplexConnection.java b/briar-core/src/net/sf/briar/messaging/simplex/OutgoingSimplexConnection.java
similarity index 84%
rename from briar-core/src/net/sf/briar/protocol/simplex/OutgoingSimplexConnection.java
rename to briar-core/src/net/sf/briar/messaging/simplex/OutgoingSimplexConnection.java
index e32bf287ff..21ac4b0f33 100644
--- a/briar-core/src/net/sf/briar/protocol/simplex/OutgoingSimplexConnection.java
+++ b/briar-core/src/net/sf/briar/messaging/simplex/OutgoingSimplexConnection.java
@@ -1,7 +1,7 @@
-package net.sf.briar.protocol.simplex;
+package net.sf.briar.messaging.simplex;
 
 import static java.util.logging.Level.WARNING;
-import static net.sf.briar.api.protocol.ProtocolConstants.MAX_PACKET_LENGTH;
+import static net.sf.briar.api.messaging.MessagingConstants.MAX_PACKET_LENGTH;
 
 import java.io.EOFException;
 import java.io.IOException;
@@ -12,17 +12,17 @@ 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.messaging.Ack;
+import net.sf.briar.api.messaging.PacketWriter;
+import net.sf.briar.api.messaging.PacketWriterFactory;
+import net.sf.briar.api.messaging.RetentionAck;
+import net.sf.briar.api.messaging.RetentionUpdate;
+import net.sf.briar.api.messaging.SubscriptionAck;
+import net.sf.briar.api.messaging.SubscriptionUpdate;
+import net.sf.briar.api.messaging.TransportAck;
+import net.sf.briar.api.messaging.TransportId;
+import net.sf.briar.api.messaging.TransportUpdate;
 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;
-import net.sf.briar.api.protocol.RetentionAck;
-import net.sf.briar.api.protocol.RetentionUpdate;
-import net.sf.briar.api.protocol.SubscriptionAck;
-import net.sf.briar.api.protocol.SubscriptionUpdate;
-import net.sf.briar.api.protocol.TransportAck;
-import net.sf.briar.api.protocol.TransportId;
-import net.sf.briar.api.protocol.TransportUpdate;
 import net.sf.briar.api.transport.ConnectionContext;
 import net.sf.briar.api.transport.ConnectionRegistry;
 import net.sf.briar.api.transport.ConnectionWriter;
@@ -37,7 +37,7 @@ class OutgoingSimplexConnection {
 	private final DatabaseComponent db;
 	private final ConnectionRegistry connRegistry;
 	private final ConnectionWriterFactory connFactory;
-	private final ProtocolWriterFactory protoFactory;
+	private final PacketWriterFactory protoFactory;
 	private final ConnectionContext ctx;
 	private final SimplexTransportWriter transport;
 	private final ContactId contactId;
@@ -46,7 +46,7 @@ class OutgoingSimplexConnection {
 	OutgoingSimplexConnection(DatabaseComponent db,
 			ConnectionRegistry connRegistry,
 			ConnectionWriterFactory connFactory,
-			ProtocolWriterFactory protoFactory, ConnectionContext ctx,
+			PacketWriterFactory protoFactory, ConnectionContext ctx,
 			SimplexTransportWriter transport) {
 		this.db = db;
 		this.connRegistry = connRegistry;
@@ -69,7 +69,7 @@ class OutgoingSimplexConnection {
 			OutputStream out = conn.getOutputStream();
 			if(conn.getRemainingCapacity() < MAX_PACKET_LENGTH)
 				throw new EOFException();
-			ProtocolWriter writer = protoFactory.createProtocolWriter(out,
+			PacketWriter writer = protoFactory.createPacketWriter(out,
 					transport.shouldFlush());
 			// Send the initial packets: updates and acks
 			Collection<TransportAck> transportAcks =
diff --git a/briar-core/src/net/sf/briar/protocol/simplex/SimplexConnectionFactoryImpl.java b/briar-core/src/net/sf/briar/messaging/simplex/SimplexConnectionFactoryImpl.java
similarity index 83%
rename from briar-core/src/net/sf/briar/protocol/simplex/SimplexConnectionFactoryImpl.java
rename to briar-core/src/net/sf/briar/messaging/simplex/SimplexConnectionFactoryImpl.java
index 6f6736ca3c..c06f35e586 100644
--- a/briar-core/src/net/sf/briar/protocol/simplex/SimplexConnectionFactoryImpl.java
+++ b/briar-core/src/net/sf/briar/messaging/simplex/SimplexConnectionFactoryImpl.java
@@ -1,4 +1,4 @@
-package net.sf.briar.protocol.simplex;
+package net.sf.briar.messaging.simplex;
 
 import static java.util.logging.Level.WARNING;
 
@@ -9,14 +9,14 @@ import net.sf.briar.api.ContactId;
 import net.sf.briar.api.crypto.KeyManager;
 import net.sf.briar.api.db.DatabaseComponent;
 import net.sf.briar.api.db.DatabaseExecutor;
+import net.sf.briar.api.messaging.MessageVerifier;
+import net.sf.briar.api.messaging.PacketReaderFactory;
+import net.sf.briar.api.messaging.PacketWriterFactory;
+import net.sf.briar.api.messaging.TransportId;
+import net.sf.briar.api.messaging.VerificationExecutor;
+import net.sf.briar.api.messaging.simplex.SimplexConnectionFactory;
 import net.sf.briar.api.plugins.simplex.SimplexTransportReader;
 import net.sf.briar.api.plugins.simplex.SimplexTransportWriter;
-import net.sf.briar.api.protocol.MessageVerifier;
-import net.sf.briar.api.protocol.ProtocolReaderFactory;
-import net.sf.briar.api.protocol.ProtocolWriterFactory;
-import net.sf.briar.api.protocol.TransportId;
-import net.sf.briar.api.protocol.VerificationExecutor;
-import net.sf.briar.api.protocol.simplex.SimplexConnectionFactory;
 import net.sf.briar.api.transport.ConnectionContext;
 import net.sf.briar.api.transport.ConnectionReaderFactory;
 import net.sf.briar.api.transport.ConnectionRegistry;
@@ -36,8 +36,8 @@ class SimplexConnectionFactoryImpl implements SimplexConnectionFactory {
 	private final ConnectionRegistry connRegistry;
 	private final ConnectionReaderFactory connReaderFactory;
 	private final ConnectionWriterFactory connWriterFactory;
-	private final ProtocolReaderFactory protoReaderFactory;
-	private final ProtocolWriterFactory protoWriterFactory;
+	private final PacketReaderFactory protoReaderFactory;
+	private final PacketWriterFactory protoWriterFactory;
 
 	@Inject
 	SimplexConnectionFactoryImpl(@DatabaseExecutor Executor dbExecutor,
@@ -46,8 +46,8 @@ class SimplexConnectionFactoryImpl implements SimplexConnectionFactory {
 			KeyManager keyManager, ConnectionRegistry connRegistry,
 			ConnectionReaderFactory connReaderFactory,
 			ConnectionWriterFactory connWriterFactory,
-			ProtocolReaderFactory protoReaderFactory,
-			ProtocolWriterFactory protoWriterFactory) {
+			PacketReaderFactory protoReaderFactory,
+			PacketWriterFactory protoWriterFactory) {
 		this.dbExecutor = dbExecutor;
 		this.verificationExecutor = verificationExecutor;
 		this.messageVerifier = messageVerifier;
diff --git a/briar-core/src/net/sf/briar/protocol/simplex/SimplexProtocolModule.java b/briar-core/src/net/sf/briar/messaging/simplex/SimplexMessagingModule.java
similarity index 57%
rename from briar-core/src/net/sf/briar/protocol/simplex/SimplexProtocolModule.java
rename to briar-core/src/net/sf/briar/messaging/simplex/SimplexMessagingModule.java
index 45ec2a9d14..b69086258b 100644
--- a/briar-core/src/net/sf/briar/protocol/simplex/SimplexProtocolModule.java
+++ b/briar-core/src/net/sf/briar/messaging/simplex/SimplexMessagingModule.java
@@ -1,11 +1,11 @@
-package net.sf.briar.protocol.simplex;
+package net.sf.briar.messaging.simplex;
 
-import net.sf.briar.api.protocol.simplex.SimplexConnectionFactory;
+import net.sf.briar.api.messaging.simplex.SimplexConnectionFactory;
 
 import com.google.inject.AbstractModule;
 import com.google.inject.Singleton;
 
-public class SimplexProtocolModule extends AbstractModule {
+public class SimplexMessagingModule extends AbstractModule {
 
 	@Override
 	protected void configure() {
diff --git a/briar-core/src/net/sf/briar/plugins/PluginManagerImpl.java b/briar-core/src/net/sf/briar/plugins/PluginManagerImpl.java
index 697b84346c..c11c4fcd6e 100644
--- a/briar-core/src/net/sf/briar/plugins/PluginManagerImpl.java
+++ b/briar-core/src/net/sf/briar/plugins/PluginManagerImpl.java
@@ -20,6 +20,7 @@ import net.sf.briar.api.TransportProperties;
 import net.sf.briar.api.android.AndroidExecutor;
 import net.sf.briar.api.db.DatabaseComponent;
 import net.sf.briar.api.db.DbException;
+import net.sf.briar.api.messaging.TransportId;
 import net.sf.briar.api.plugins.Plugin;
 import net.sf.briar.api.plugins.PluginCallback;
 import net.sf.briar.api.plugins.PluginExecutor;
@@ -35,7 +36,6 @@ import net.sf.briar.api.plugins.simplex.SimplexPluginConfig;
 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.TransportId;
 import net.sf.briar.api.transport.ConnectionDispatcher;
 import net.sf.briar.api.ui.UiCallback;
 import android.content.Context;
diff --git a/briar-core/src/net/sf/briar/plugins/bluetooth/BluetoothPlugin.java b/briar-core/src/net/sf/briar/plugins/bluetooth/BluetoothPlugin.java
index a8a4b4e105..6f185e31a0 100644
--- a/briar-core/src/net/sf/briar/plugins/bluetooth/BluetoothPlugin.java
+++ b/briar-core/src/net/sf/briar/plugins/bluetooth/BluetoothPlugin.java
@@ -27,11 +27,11 @@ import net.sf.briar.api.ContactId;
 import net.sf.briar.api.TransportProperties;
 import net.sf.briar.api.clock.Clock;
 import net.sf.briar.api.crypto.PseudoRandom;
+import net.sf.briar.api.messaging.TransportId;
 import net.sf.briar.api.plugins.PluginExecutor;
 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/briar-core/src/net/sf/briar/plugins/bluetooth/BluetoothPluginFactory.java b/briar-core/src/net/sf/briar/plugins/bluetooth/BluetoothPluginFactory.java
index 94fbdd06a0..2d909bc5ff 100644
--- a/briar-core/src/net/sf/briar/plugins/bluetooth/BluetoothPluginFactory.java
+++ b/briar-core/src/net/sf/briar/plugins/bluetooth/BluetoothPluginFactory.java
@@ -4,11 +4,11 @@ import java.util.concurrent.Executor;
 
 import net.sf.briar.api.clock.Clock;
 import net.sf.briar.api.clock.SystemClock;
+import net.sf.briar.api.messaging.TransportId;
 import net.sf.briar.api.plugins.PluginExecutor;
 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.protocol.TransportId;
 
 public class BluetoothPluginFactory implements DuplexPluginFactory {
 
diff --git a/briar-core/src/net/sf/briar/plugins/droidtooth/DroidtoothPlugin.java b/briar-core/src/net/sf/briar/plugins/droidtooth/DroidtoothPlugin.java
index 95e9fa0219..ea7dc74b2a 100644
--- a/briar-core/src/net/sf/briar/plugins/droidtooth/DroidtoothPlugin.java
+++ b/briar-core/src/net/sf/briar/plugins/droidtooth/DroidtoothPlugin.java
@@ -26,11 +26,11 @@ import net.sf.briar.api.ContactId;
 import net.sf.briar.api.TransportProperties;
 import net.sf.briar.api.android.AndroidExecutor;
 import net.sf.briar.api.crypto.PseudoRandom;
+import net.sf.briar.api.messaging.TransportId;
 import net.sf.briar.api.plugins.PluginExecutor;
 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.StringUtils;
 import android.bluetooth.BluetoothAdapter;
 import android.bluetooth.BluetoothDevice;
diff --git a/briar-core/src/net/sf/briar/plugins/droidtooth/DroidtoothPluginFactory.java b/briar-core/src/net/sf/briar/plugins/droidtooth/DroidtoothPluginFactory.java
index cb9d0e1f64..501944d4d2 100644
--- a/briar-core/src/net/sf/briar/plugins/droidtooth/DroidtoothPluginFactory.java
+++ b/briar-core/src/net/sf/briar/plugins/droidtooth/DroidtoothPluginFactory.java
@@ -3,11 +3,11 @@ package net.sf.briar.plugins.droidtooth;
 import java.util.concurrent.Executor;
 
 import net.sf.briar.api.android.AndroidExecutor;
+import net.sf.briar.api.messaging.TransportId;
 import net.sf.briar.api.plugins.PluginExecutor;
 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.protocol.TransportId;
 import android.content.Context;
 
 public class DroidtoothPluginFactory implements DuplexPluginFactory {
diff --git a/briar-core/src/net/sf/briar/plugins/file/RemovableDrivePlugin.java b/briar-core/src/net/sf/briar/plugins/file/RemovableDrivePlugin.java
index 9e95cc865e..a647c1507c 100644
--- a/briar-core/src/net/sf/briar/plugins/file/RemovableDrivePlugin.java
+++ b/briar-core/src/net/sf/briar/plugins/file/RemovableDrivePlugin.java
@@ -12,9 +12,9 @@ import java.util.concurrent.Executor;
 import java.util.logging.Logger;
 
 import net.sf.briar.api.ContactId;
+import net.sf.briar.api.messaging.TransportId;
 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;
 
 class RemovableDrivePlugin extends FilePlugin
diff --git a/briar-core/src/net/sf/briar/plugins/file/RemovableDrivePluginFactory.java b/briar-core/src/net/sf/briar/plugins/file/RemovableDrivePluginFactory.java
index 3a36160a17..ed5594027b 100644
--- a/briar-core/src/net/sf/briar/plugins/file/RemovableDrivePluginFactory.java
+++ b/briar-core/src/net/sf/briar/plugins/file/RemovableDrivePluginFactory.java
@@ -2,11 +2,11 @@ package net.sf.briar.plugins.file;
 
 import java.util.concurrent.Executor;
 
+import net.sf.briar.api.messaging.TransportId;
 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.api.protocol.TransportId;
 import net.sf.briar.util.OsUtils;
 
 public class RemovableDrivePluginFactory implements SimplexPluginFactory {
diff --git a/briar-core/src/net/sf/briar/plugins/modem/ModemPlugin.java b/briar-core/src/net/sf/briar/plugins/modem/ModemPlugin.java
index 5404a106f4..49184a8c48 100644
--- a/briar-core/src/net/sf/briar/plugins/modem/ModemPlugin.java
+++ b/briar-core/src/net/sf/briar/plugins/modem/ModemPlugin.java
@@ -19,11 +19,11 @@ import java.util.logging.Logger;
 import net.sf.briar.api.ContactId;
 import net.sf.briar.api.TransportProperties;
 import net.sf.briar.api.crypto.PseudoRandom;
+import net.sf.briar.api.messaging.TransportId;
 import net.sf.briar.api.plugins.PluginExecutor;
 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.StringUtils;
 
 class ModemPlugin implements DuplexPlugin, Modem.Callback {
diff --git a/briar-core/src/net/sf/briar/plugins/modem/ModemPluginFactory.java b/briar-core/src/net/sf/briar/plugins/modem/ModemPluginFactory.java
index 7b845fd801..cf5c2eb531 100644
--- a/briar-core/src/net/sf/briar/plugins/modem/ModemPluginFactory.java
+++ b/briar-core/src/net/sf/briar/plugins/modem/ModemPluginFactory.java
@@ -2,11 +2,11 @@ package net.sf.briar.plugins.modem;
 
 import java.util.concurrent.Executor;
 
+import net.sf.briar.api.messaging.TransportId;
 import net.sf.briar.api.plugins.PluginExecutor;
 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.protocol.TransportId;
 import net.sf.briar.api.reliability.ReliabilityLayerFactory;
 import net.sf.briar.util.StringUtils;
 
diff --git a/briar-core/src/net/sf/briar/plugins/tcp/LanTcpPlugin.java b/briar-core/src/net/sf/briar/plugins/tcp/LanTcpPlugin.java
index dc515219c7..243488a32d 100644
--- a/briar-core/src/net/sf/briar/plugins/tcp/LanTcpPlugin.java
+++ b/briar-core/src/net/sf/briar/plugins/tcp/LanTcpPlugin.java
@@ -24,10 +24,10 @@ import java.util.logging.Logger;
 import net.sf.briar.api.TransportProperties;
 import net.sf.briar.api.clock.Clock;
 import net.sf.briar.api.crypto.PseudoRandom;
+import net.sf.briar.api.messaging.TransportId;
 import net.sf.briar.api.plugins.PluginExecutor;
 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.ByteUtils;
 import net.sf.briar.util.StringUtils;
 
diff --git a/briar-core/src/net/sf/briar/plugins/tcp/LanTcpPluginFactory.java b/briar-core/src/net/sf/briar/plugins/tcp/LanTcpPluginFactory.java
index 8c938e2c30..9a930c15a3 100644
--- a/briar-core/src/net/sf/briar/plugins/tcp/LanTcpPluginFactory.java
+++ b/briar-core/src/net/sf/briar/plugins/tcp/LanTcpPluginFactory.java
@@ -4,11 +4,11 @@ import java.util.concurrent.Executor;
 
 import net.sf.briar.api.clock.Clock;
 import net.sf.briar.api.clock.SystemClock;
+import net.sf.briar.api.messaging.TransportId;
 import net.sf.briar.api.plugins.PluginExecutor;
 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.protocol.TransportId;
 
 public class LanTcpPluginFactory implements DuplexPluginFactory {
 
diff --git a/briar-core/src/net/sf/briar/plugins/tcp/WanTcpPlugin.java b/briar-core/src/net/sf/briar/plugins/tcp/WanTcpPlugin.java
index 264c3906e5..dd688c1014 100644
--- a/briar-core/src/net/sf/briar/plugins/tcp/WanTcpPlugin.java
+++ b/briar-core/src/net/sf/briar/plugins/tcp/WanTcpPlugin.java
@@ -16,10 +16,10 @@ import java.util.logging.Logger;
 
 import net.sf.briar.api.TransportProperties;
 import net.sf.briar.api.crypto.PseudoRandom;
+import net.sf.briar.api.messaging.TransportId;
 import net.sf.briar.api.plugins.PluginExecutor;
 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;
 
 class WanTcpPlugin extends TcpPlugin {
diff --git a/briar-core/src/net/sf/briar/plugins/tcp/WanTcpPluginFactory.java b/briar-core/src/net/sf/briar/plugins/tcp/WanTcpPluginFactory.java
index f40d357dc1..8adbc2cc1b 100644
--- a/briar-core/src/net/sf/briar/plugins/tcp/WanTcpPluginFactory.java
+++ b/briar-core/src/net/sf/briar/plugins/tcp/WanTcpPluginFactory.java
@@ -3,11 +3,11 @@ package net.sf.briar.plugins.tcp;
 import java.util.concurrent.Executor;
 
 import net.sf.briar.api.lifecycle.ShutdownManager;
+import net.sf.briar.api.messaging.TransportId;
 import net.sf.briar.api.plugins.PluginExecutor;
 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.protocol.TransportId;
 
 public class WanTcpPluginFactory implements DuplexPluginFactory {
 
diff --git a/briar-core/src/net/sf/briar/plugins/tor/TorPlugin.java b/briar-core/src/net/sf/briar/plugins/tor/TorPlugin.java
index 71d60b47bf..325e6e277b 100644
--- a/briar-core/src/net/sf/briar/plugins/tor/TorPlugin.java
+++ b/briar-core/src/net/sf/briar/plugins/tor/TorPlugin.java
@@ -13,11 +13,11 @@ import net.sf.briar.api.ContactId;
 import net.sf.briar.api.TransportConfig;
 import net.sf.briar.api.TransportProperties;
 import net.sf.briar.api.crypto.PseudoRandom;
+import net.sf.briar.api.messaging.TransportId;
 import net.sf.briar.api.plugins.PluginExecutor;
 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.StringUtils;
 
 import org.silvertunnel.netlib.api.NetAddress;
diff --git a/briar-core/src/net/sf/briar/plugins/tor/TorPluginFactory.java b/briar-core/src/net/sf/briar/plugins/tor/TorPluginFactory.java
index dc87cf2ab9..c5eb7ba00f 100644
--- a/briar-core/src/net/sf/briar/plugins/tor/TorPluginFactory.java
+++ b/briar-core/src/net/sf/briar/plugins/tor/TorPluginFactory.java
@@ -2,11 +2,11 @@ package net.sf.briar.plugins.tor;
 
 import java.util.concurrent.Executor;
 
+import net.sf.briar.api.messaging.TransportId;
 import net.sf.briar.api.plugins.PluginExecutor;
 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.protocol.TransportId;
 import net.sf.briar.util.StringUtils;
 
 public class TorPluginFactory implements DuplexPluginFactory {
diff --git a/briar-core/src/net/sf/briar/protocol/ProtocolWriterFactoryImpl.java b/briar-core/src/net/sf/briar/protocol/ProtocolWriterFactoryImpl.java
deleted file mode 100644
index a2d40759e4..0000000000
--- a/briar-core/src/net/sf/briar/protocol/ProtocolWriterFactoryImpl.java
+++ /dev/null
@@ -1,28 +0,0 @@
-package net.sf.briar.protocol;
-
-import java.io.OutputStream;
-
-import net.sf.briar.api.protocol.ProtocolWriter;
-import net.sf.briar.api.protocol.ProtocolWriterFactory;
-import net.sf.briar.api.serial.SerialComponent;
-import net.sf.briar.api.serial.WriterFactory;
-
-import com.google.inject.Inject;
-
-class ProtocolWriterFactoryImpl implements ProtocolWriterFactory {
-
-	private final SerialComponent serial;
-	private final WriterFactory writerFactory;
-
-	@Inject
-	ProtocolWriterFactoryImpl(SerialComponent serial,
-			WriterFactory writerFactory) {
-		this.serial = serial;
-		this.writerFactory = writerFactory;
-	}
-
-	public ProtocolWriter createProtocolWriter(OutputStream out,
-			boolean flush) {
-		return new ProtocolWriterImpl(serial, writerFactory, out, flush);
-	}
-}
diff --git a/briar-core/src/net/sf/briar/serial/SerialComponentImpl.java b/briar-core/src/net/sf/briar/serial/SerialComponentImpl.java
index 950be7be13..bf64c7fd2e 100644
--- a/briar-core/src/net/sf/briar/serial/SerialComponentImpl.java
+++ b/briar-core/src/net/sf/briar/serial/SerialComponentImpl.java
@@ -1,6 +1,6 @@
 package net.sf.briar.serial;
 
-import net.sf.briar.api.protocol.UniqueId;
+import net.sf.briar.api.messaging.UniqueId;
 import net.sf.briar.api.serial.SerialComponent;
 
 class SerialComponentImpl implements SerialComponent {
diff --git a/briar-core/src/net/sf/briar/transport/ConnectionDispatcherImpl.java b/briar-core/src/net/sf/briar/transport/ConnectionDispatcherImpl.java
index 220e36d8f8..c8e0de79b0 100644
--- a/briar-core/src/net/sf/briar/transport/ConnectionDispatcherImpl.java
+++ b/briar-core/src/net/sf/briar/transport/ConnectionDispatcherImpl.java
@@ -11,12 +11,12 @@ import java.util.logging.Logger;
 
 import net.sf.briar.api.ContactId;
 import net.sf.briar.api.db.DbException;
+import net.sf.briar.api.messaging.TransportId;
+import net.sf.briar.api.messaging.duplex.DuplexConnectionFactory;
+import net.sf.briar.api.messaging.simplex.SimplexConnectionFactory;
 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.duplex.DuplexConnectionFactory;
-import net.sf.briar.api.protocol.simplex.SimplexConnectionFactory;
 import net.sf.briar.api.transport.ConnectionContext;
 import net.sf.briar.api.transport.ConnectionDispatcher;
 import net.sf.briar.api.transport.ConnectionRecogniser;
diff --git a/briar-core/src/net/sf/briar/transport/ConnectionRecogniserImpl.java b/briar-core/src/net/sf/briar/transport/ConnectionRecogniserImpl.java
index 73492ed3c5..f86b651447 100644
--- a/briar-core/src/net/sf/briar/transport/ConnectionRecogniserImpl.java
+++ b/briar-core/src/net/sf/briar/transport/ConnectionRecogniserImpl.java
@@ -7,7 +7,7 @@ import net.sf.briar.api.ContactId;
 import net.sf.briar.api.crypto.CryptoComponent;
 import net.sf.briar.api.db.DatabaseComponent;
 import net.sf.briar.api.db.DbException;
-import net.sf.briar.api.protocol.TransportId;
+import net.sf.briar.api.messaging.TransportId;
 import net.sf.briar.api.transport.ConnectionContext;
 import net.sf.briar.api.transport.ConnectionRecogniser;
 import net.sf.briar.api.transport.TemporarySecret;
diff --git a/briar-core/src/net/sf/briar/transport/ConnectionRegistryImpl.java b/briar-core/src/net/sf/briar/transport/ConnectionRegistryImpl.java
index 4b84551eba..ffa0c2c97b 100644
--- a/briar-core/src/net/sf/briar/transport/ConnectionRegistryImpl.java
+++ b/briar-core/src/net/sf/briar/transport/ConnectionRegistryImpl.java
@@ -8,7 +8,7 @@ import java.util.List;
 import java.util.Map;
 
 import net.sf.briar.api.ContactId;
-import net.sf.briar.api.protocol.TransportId;
+import net.sf.briar.api.messaging.TransportId;
 import net.sf.briar.api.transport.ConnectionRegistry;
 
 class ConnectionRegistryImpl implements ConnectionRegistry {
diff --git a/briar-core/src/net/sf/briar/transport/KeyManagerImpl.java b/briar-core/src/net/sf/briar/transport/KeyManagerImpl.java
index 53b1e7e4f2..d9abc385de 100644
--- a/briar-core/src/net/sf/briar/transport/KeyManagerImpl.java
+++ b/briar-core/src/net/sf/briar/transport/KeyManagerImpl.java
@@ -21,7 +21,7 @@ import net.sf.briar.api.db.DbException;
 import net.sf.briar.api.db.event.ContactRemovedEvent;
 import net.sf.briar.api.db.event.DatabaseEvent;
 import net.sf.briar.api.db.event.DatabaseListener;
-import net.sf.briar.api.protocol.TransportId;
+import net.sf.briar.api.messaging.TransportId;
 import net.sf.briar.api.transport.ConnectionContext;
 import net.sf.briar.api.transport.ConnectionRecogniser;
 import net.sf.briar.api.transport.Endpoint;
diff --git a/briar-core/src/net/sf/briar/transport/TransportConnectionRecogniser.java b/briar-core/src/net/sf/briar/transport/TransportConnectionRecogniser.java
index dfada60a59..761f846a39 100644
--- a/briar-core/src/net/sf/briar/transport/TransportConnectionRecogniser.java
+++ b/briar-core/src/net/sf/briar/transport/TransportConnectionRecogniser.java
@@ -15,7 +15,7 @@ import net.sf.briar.api.crypto.CryptoComponent;
 import net.sf.briar.api.crypto.ErasableKey;
 import net.sf.briar.api.db.DatabaseComponent;
 import net.sf.briar.api.db.DbException;
-import net.sf.briar.api.protocol.TransportId;
+import net.sf.briar.api.messaging.TransportId;
 import net.sf.briar.api.transport.ConnectionContext;
 import net.sf.briar.api.transport.TemporarySecret;
 import net.sf.briar.util.ByteUtils;
diff --git a/briar-tests/build.xml b/briar-tests/build.xml
index 8bbb88e7d7..62f7292bf1 100644
--- a/briar-tests/build.xml
+++ b/briar-tests/build.xml
@@ -79,6 +79,12 @@
 			<test name='net.sf.briar.db.DatabaseComponentImplTest'/>
 			<test name='net.sf.briar.lifecycle.ShutdownManagerImplTest'/>
 			<test name='net.sf.briar.lifecycle.WindowsShutdownManagerImplTest'/>
+			<test name='net.sf.briar.messaging.ConstantsTest'/>
+			<test name='net.sf.briar.messaging.ConsumersTest'/>
+			<test name='net.sf.briar.messaging.PacketReaderImplTest'/>
+			<test name='net.sf.briar.messaging.PacketWriterImplTest'/>
+			<test name='net.sf.briar.messaging.simplex.OutgoingSimplexConnectionTest'/>
+			<test name='net.sf.briar.messaging.simplex.SimplexMessagingIntegrationTest'/>
 			<test name='net.sf.briar.plugins.PluginManagerImplTest'/>
 			<test name='net.sf.briar.plugins.file.LinuxRemovableDriveFinderTest'/>
 			<test name='net.sf.briar.plugins.file.MacRemovableDriveFinderTest'/>
@@ -88,12 +94,6 @@
 			<test name='net.sf.briar.plugins.modem.CountryCodesTest'/>
 			<test name='net.sf.briar.plugins.modem.ModemPluginTest'/>
 			<test name='net.sf.briar.plugins.tcp.LanTcpPluginTest'/>
-			<test name='net.sf.briar.protocol.ConstantsTest'/>
-			<test name='net.sf.briar.protocol.ConsumersTest'/>
-			<test name='net.sf.briar.protocol.ProtocolReaderImplTest'/>
-			<test name='net.sf.briar.protocol.ProtocolWriterImplTest'/>
-			<test name='net.sf.briar.protocol.simplex.OutgoingSimplexConnectionTest'/>
-			<test name='net.sf.briar.protocol.simplex.SimplexProtocolIntegrationTest'/>
 			<test name='net.sf.briar.serial.ReaderImplTest'/>
 			<test name='net.sf.briar.serial.WriterImplTest'/>
 			<test name='net.sf.briar.transport.ConnectionReaderImplTest'/>
diff --git a/briar-tests/src/net/sf/briar/ProtocolIntegrationTest.java b/briar-tests/src/net/sf/briar/ProtocolIntegrationTest.java
index 5abda455f9..dcb14d8047 100644
--- a/briar-tests/src/net/sf/briar/ProtocolIntegrationTest.java
+++ b/briar-tests/src/net/sf/briar/ProtocolIntegrationTest.java
@@ -17,25 +17,25 @@ import java.util.Random;
 import net.sf.briar.api.ContactId;
 import net.sf.briar.api.TransportProperties;
 import net.sf.briar.api.crypto.CryptoComponent;
-import net.sf.briar.api.protocol.Ack;
-import net.sf.briar.api.protocol.Author;
-import net.sf.briar.api.protocol.AuthorFactory;
-import net.sf.briar.api.protocol.Group;
-import net.sf.briar.api.protocol.GroupFactory;
-import net.sf.briar.api.protocol.Message;
-import net.sf.briar.api.protocol.MessageFactory;
-import net.sf.briar.api.protocol.MessageId;
-import net.sf.briar.api.protocol.MessageVerifier;
-import net.sf.briar.api.protocol.Offer;
-import net.sf.briar.api.protocol.ProtocolReader;
-import net.sf.briar.api.protocol.ProtocolReaderFactory;
-import net.sf.briar.api.protocol.ProtocolWriter;
-import net.sf.briar.api.protocol.ProtocolWriterFactory;
-import net.sf.briar.api.protocol.Request;
-import net.sf.briar.api.protocol.SubscriptionUpdate;
-import net.sf.briar.api.protocol.TransportId;
-import net.sf.briar.api.protocol.TransportUpdate;
-import net.sf.briar.api.protocol.UnverifiedMessage;
+import net.sf.briar.api.messaging.Ack;
+import net.sf.briar.api.messaging.Author;
+import net.sf.briar.api.messaging.AuthorFactory;
+import net.sf.briar.api.messaging.Group;
+import net.sf.briar.api.messaging.GroupFactory;
+import net.sf.briar.api.messaging.Message;
+import net.sf.briar.api.messaging.MessageFactory;
+import net.sf.briar.api.messaging.MessageId;
+import net.sf.briar.api.messaging.MessageVerifier;
+import net.sf.briar.api.messaging.Offer;
+import net.sf.briar.api.messaging.PacketReader;
+import net.sf.briar.api.messaging.PacketReaderFactory;
+import net.sf.briar.api.messaging.PacketWriter;
+import net.sf.briar.api.messaging.PacketWriterFactory;
+import net.sf.briar.api.messaging.Request;
+import net.sf.briar.api.messaging.SubscriptionUpdate;
+import net.sf.briar.api.messaging.TransportId;
+import net.sf.briar.api.messaging.TransportUpdate;
+import net.sf.briar.api.messaging.UnverifiedMessage;
 import net.sf.briar.api.transport.ConnectionContext;
 import net.sf.briar.api.transport.ConnectionReader;
 import net.sf.briar.api.transport.ConnectionReaderFactory;
@@ -45,9 +45,9 @@ import net.sf.briar.clock.ClockModule;
 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.duplex.DuplexProtocolModule;
-import net.sf.briar.protocol.simplex.SimplexProtocolModule;
+import net.sf.briar.messaging.MessagingModule;
+import net.sf.briar.messaging.duplex.DuplexMessagingModule;
+import net.sf.briar.messaging.simplex.SimplexMessagingModule;
 import net.sf.briar.serial.SerialModule;
 import net.sf.briar.transport.TransportModule;
 
@@ -60,8 +60,8 @@ public class ProtocolIntegrationTest extends BriarTestCase {
 
 	private final ConnectionReaderFactory connectionReaderFactory;
 	private final ConnectionWriterFactory connectionWriterFactory;
-	private final ProtocolReaderFactory protocolReaderFactory;
-	private final ProtocolWriterFactory protocolWriterFactory;
+	private final PacketReaderFactory packetReaderFactory;
+	private final PacketWriterFactory packetWriterFactory;
 	private final MessageVerifier messageVerifier;
 
 	private final ContactId contactId;
@@ -80,13 +80,13 @@ public class ProtocolIntegrationTest extends BriarTestCase {
 		super();
 		Injector i = Guice.createInjector(new TestDatabaseModule(),
 				new ClockModule(), new CryptoModule(), new DatabaseModule(),
-				new LifecycleModule(), new ProtocolModule(),
-				new DuplexProtocolModule(), new SimplexProtocolModule(),
+				new LifecycleModule(), new MessagingModule(),
+				new DuplexMessagingModule(), new SimplexMessagingModule(),
 				new SerialModule(), new TransportModule());
 		connectionReaderFactory = i.getInstance(ConnectionReaderFactory.class);
 		connectionWriterFactory = i.getInstance(ConnectionWriterFactory.class);
-		protocolReaderFactory = i.getInstance(ProtocolReaderFactory.class);
-		protocolWriterFactory = i.getInstance(ProtocolWriterFactory.class);
+		packetReaderFactory = i.getInstance(PacketReaderFactory.class);
+		packetWriterFactory = i.getInstance(PacketWriterFactory.class);
 		messageVerifier = i.getInstance(MessageVerifier.class);
 		contactId = new ContactId(234);
 		// Create a shared secret
@@ -137,7 +137,7 @@ public class ProtocolIntegrationTest extends BriarTestCase {
 		ConnectionWriter conn = connectionWriterFactory.createConnectionWriter(
 				out, Long.MAX_VALUE, ctx, false, true);
 		OutputStream out1 = conn.getOutputStream();
-		ProtocolWriter writer = protocolWriterFactory.createProtocolWriter(out1,
+		PacketWriter writer = packetWriterFactory.createPacketWriter(out1,
 				false);
 
 		writer.writeAck(new Ack(messageIds));
@@ -176,7 +176,7 @@ public class ProtocolIntegrationTest extends BriarTestCase {
 		ConnectionReader conn = connectionReaderFactory.createConnectionReader(
 				in, ctx, true, true);
 		InputStream in1 = conn.getInputStream();
-		ProtocolReader reader = protocolReaderFactory.createProtocolReader(in1);
+		PacketReader reader = packetReaderFactory.createPacketReader(in1);
 
 		// Read the ack
 		assertTrue(reader.hasAck());
diff --git a/briar-tests/src/net/sf/briar/TestMessage.java b/briar-tests/src/net/sf/briar/TestMessage.java
index c66abc8bb0..881b02777a 100644
--- a/briar-tests/src/net/sf/briar/TestMessage.java
+++ b/briar-tests/src/net/sf/briar/TestMessage.java
@@ -3,10 +3,10 @@ package net.sf.briar;
 import java.io.ByteArrayInputStream;
 import java.io.InputStream;
 
-import net.sf.briar.api.protocol.AuthorId;
-import net.sf.briar.api.protocol.GroupId;
-import net.sf.briar.api.protocol.Message;
-import net.sf.briar.api.protocol.MessageId;
+import net.sf.briar.api.messaging.AuthorId;
+import net.sf.briar.api.messaging.GroupId;
+import net.sf.briar.api.messaging.Message;
+import net.sf.briar.api.messaging.MessageId;
 
 public class TestMessage implements Message {
 
diff --git a/briar-tests/src/net/sf/briar/TestUtils.java b/briar-tests/src/net/sf/briar/TestUtils.java
index e5c4f6cfe2..21c4beff93 100644
--- a/briar-tests/src/net/sf/briar/TestUtils.java
+++ b/briar-tests/src/net/sf/briar/TestUtils.java
@@ -10,7 +10,7 @@ import java.util.Random;
 import java.util.concurrent.atomic.AtomicInteger;
 
 import junit.framework.TestCase;
-import net.sf.briar.api.protocol.UniqueId;
+import net.sf.briar.api.messaging.UniqueId;
 
 public class TestUtils {
 
diff --git a/briar-tests/src/net/sf/briar/db/DatabaseComponentTest.java b/briar-tests/src/net/sf/briar/db/DatabaseComponentTest.java
index 8f74e5cd1f..c7322c84ab 100644
--- a/briar-tests/src/net/sf/briar/db/DatabaseComponentTest.java
+++ b/briar-tests/src/net/sf/briar/db/DatabaseComponentTest.java
@@ -22,17 +22,17 @@ import net.sf.briar.api.db.event.LocalSubscriptionsUpdatedEvent;
 import net.sf.briar.api.db.event.MessageAddedEvent;
 import net.sf.briar.api.db.event.RatingChangedEvent;
 import net.sf.briar.api.lifecycle.ShutdownManager;
-import net.sf.briar.api.protocol.Ack;
-import net.sf.briar.api.protocol.AuthorId;
-import net.sf.briar.api.protocol.Group;
-import net.sf.briar.api.protocol.GroupId;
-import net.sf.briar.api.protocol.Message;
-import net.sf.briar.api.protocol.MessageId;
-import net.sf.briar.api.protocol.Offer;
-import net.sf.briar.api.protocol.Request;
-import net.sf.briar.api.protocol.SubscriptionUpdate;
-import net.sf.briar.api.protocol.TransportId;
-import net.sf.briar.api.protocol.TransportUpdate;
+import net.sf.briar.api.messaging.Ack;
+import net.sf.briar.api.messaging.AuthorId;
+import net.sf.briar.api.messaging.Group;
+import net.sf.briar.api.messaging.GroupId;
+import net.sf.briar.api.messaging.Message;
+import net.sf.briar.api.messaging.MessageId;
+import net.sf.briar.api.messaging.Offer;
+import net.sf.briar.api.messaging.Request;
+import net.sf.briar.api.messaging.SubscriptionUpdate;
+import net.sf.briar.api.messaging.TransportId;
+import net.sf.briar.api.messaging.TransportUpdate;
 import net.sf.briar.api.transport.Endpoint;
 import net.sf.briar.api.transport.TemporarySecret;
 
diff --git a/briar-tests/src/net/sf/briar/db/H2DatabaseTest.java b/briar-tests/src/net/sf/briar/db/H2DatabaseTest.java
index 4db3417016..fa7b1ec7dc 100644
--- a/briar-tests/src/net/sf/briar/db/H2DatabaseTest.java
+++ b/briar-tests/src/net/sf/briar/db/H2DatabaseTest.java
@@ -27,12 +27,12 @@ import net.sf.briar.api.TransportConfig;
 import net.sf.briar.api.TransportProperties;
 import net.sf.briar.api.db.DbException;
 import net.sf.briar.api.db.MessageHeader;
-import net.sf.briar.api.protocol.AuthorId;
-import net.sf.briar.api.protocol.Group;
-import net.sf.briar.api.protocol.GroupId;
-import net.sf.briar.api.protocol.Message;
-import net.sf.briar.api.protocol.MessageId;
-import net.sf.briar.api.protocol.TransportId;
+import net.sf.briar.api.messaging.AuthorId;
+import net.sf.briar.api.messaging.Group;
+import net.sf.briar.api.messaging.GroupId;
+import net.sf.briar.api.messaging.Message;
+import net.sf.briar.api.messaging.MessageId;
+import net.sf.briar.api.messaging.TransportId;
 import net.sf.briar.api.transport.Endpoint;
 import net.sf.briar.api.transport.TemporarySecret;
 
diff --git a/briar-tests/src/net/sf/briar/protocol/ConstantsTest.java b/briar-tests/src/net/sf/briar/messaging/ConstantsTest.java
similarity index 74%
rename from briar-tests/src/net/sf/briar/protocol/ConstantsTest.java
rename to briar-tests/src/net/sf/briar/messaging/ConstantsTest.java
index 3b06c4b49a..91209dadcb 100644
--- a/briar-tests/src/net/sf/briar/protocol/ConstantsTest.java
+++ b/briar-tests/src/net/sf/briar/messaging/ConstantsTest.java
@@ -1,11 +1,11 @@
-package net.sf.briar.protocol;
+package net.sf.briar.messaging;
 
-import static net.sf.briar.api.protocol.ProtocolConstants.MAX_AUTHOR_NAME_LENGTH;
-import static net.sf.briar.api.protocol.ProtocolConstants.MAX_BODY_LENGTH;
-import static net.sf.briar.api.protocol.ProtocolConstants.MAX_GROUP_NAME_LENGTH;
-import static net.sf.briar.api.protocol.ProtocolConstants.MAX_PACKET_LENGTH;
-import static net.sf.briar.api.protocol.ProtocolConstants.MAX_PUBLIC_KEY_LENGTH;
-import static net.sf.briar.api.protocol.ProtocolConstants.MAX_SUBJECT_LENGTH;
+import static net.sf.briar.api.messaging.MessagingConstants.MAX_AUTHOR_NAME_LENGTH;
+import static net.sf.briar.api.messaging.MessagingConstants.MAX_BODY_LENGTH;
+import static net.sf.briar.api.messaging.MessagingConstants.MAX_GROUP_NAME_LENGTH;
+import static net.sf.briar.api.messaging.MessagingConstants.MAX_PACKET_LENGTH;
+import static net.sf.briar.api.messaging.MessagingConstants.MAX_PUBLIC_KEY_LENGTH;
+import static net.sf.briar.api.messaging.MessagingConstants.MAX_SUBJECT_LENGTH;
 
 import java.io.ByteArrayOutputStream;
 import java.security.PrivateKey;
@@ -15,20 +15,21 @@ import java.util.Collection;
 import net.sf.briar.BriarTestCase;
 import net.sf.briar.TestUtils;
 import net.sf.briar.api.crypto.CryptoComponent;
-import net.sf.briar.api.protocol.Ack;
-import net.sf.briar.api.protocol.Author;
-import net.sf.briar.api.protocol.AuthorFactory;
-import net.sf.briar.api.protocol.Group;
-import net.sf.briar.api.protocol.GroupFactory;
-import net.sf.briar.api.protocol.Message;
-import net.sf.briar.api.protocol.MessageFactory;
-import net.sf.briar.api.protocol.MessageId;
-import net.sf.briar.api.protocol.Offer;
-import net.sf.briar.api.protocol.ProtocolWriter;
-import net.sf.briar.api.protocol.ProtocolWriterFactory;
-import net.sf.briar.api.protocol.UniqueId;
+import net.sf.briar.api.messaging.Ack;
+import net.sf.briar.api.messaging.Author;
+import net.sf.briar.api.messaging.AuthorFactory;
+import net.sf.briar.api.messaging.Group;
+import net.sf.briar.api.messaging.GroupFactory;
+import net.sf.briar.api.messaging.Message;
+import net.sf.briar.api.messaging.MessageFactory;
+import net.sf.briar.api.messaging.MessageId;
+import net.sf.briar.api.messaging.Offer;
+import net.sf.briar.api.messaging.PacketWriter;
+import net.sf.briar.api.messaging.PacketWriterFactory;
+import net.sf.briar.api.messaging.UniqueId;
 import net.sf.briar.clock.ClockModule;
 import net.sf.briar.crypto.CryptoModule;
+import net.sf.briar.messaging.MessagingModule;
 import net.sf.briar.serial.SerialModule;
 
 import org.junit.Test;
@@ -42,17 +43,17 @@ public class ConstantsTest extends BriarTestCase {
 	private final GroupFactory groupFactory;
 	private final AuthorFactory authorFactory;
 	private final MessageFactory messageFactory;
-	private final ProtocolWriterFactory protocolWriterFactory;
+	private final PacketWriterFactory packetWriterFactory;
 
 	public ConstantsTest() throws Exception {
 		super();
 		Injector i = Guice.createInjector(new ClockModule(), new CryptoModule(),
-				new ProtocolModule(), new SerialModule());
+				new MessagingModule(), new SerialModule());
 		crypto = i.getInstance(CryptoComponent.class);
 		groupFactory = i.getInstance(GroupFactory.class);
 		authorFactory = i.getInstance(AuthorFactory.class);
 		messageFactory = i.getInstance(MessageFactory.class);
-		protocolWriterFactory = i.getInstance(ProtocolWriterFactory.class);
+		packetWriterFactory = i.getInstance(PacketWriterFactory.class);
 	}
 
 	@Test
@@ -68,7 +69,7 @@ public class ConstantsTest extends BriarTestCase {
 	private void testMessageIdsFitIntoAck(int length) throws Exception {
 		// Create an ack with as many message IDs as possible
 		ByteArrayOutputStream out = new ByteArrayOutputStream(length);
-		ProtocolWriter writer = protocolWriterFactory.createProtocolWriter(out,
+		PacketWriter writer = packetWriterFactory.createPacketWriter(out,
 				true);
 		int maxMessages = writer.getMaxMessagesForAck(length);
 		Collection<MessageId> acked = new ArrayList<MessageId>();
@@ -118,7 +119,7 @@ public class ConstantsTest extends BriarTestCase {
 	private void testMessageIdsFitIntoOffer(int length) throws Exception {
 		// Create an offer with as many message IDs as possible
 		ByteArrayOutputStream out = new ByteArrayOutputStream(length);
-		ProtocolWriter writer = protocolWriterFactory.createProtocolWriter(out,
+		PacketWriter writer = packetWriterFactory.createPacketWriter(out,
 				true);
 		int maxMessages = writer.getMaxMessagesForOffer(length);
 		Collection<MessageId> offered = new ArrayList<MessageId>();
diff --git a/briar-tests/src/net/sf/briar/protocol/ConsumersTest.java b/briar-tests/src/net/sf/briar/messaging/ConsumersTest.java
similarity index 98%
rename from briar-tests/src/net/sf/briar/protocol/ConsumersTest.java
rename to briar-tests/src/net/sf/briar/messaging/ConsumersTest.java
index 0bb89d6d29..0432c699dd 100644
--- a/briar-tests/src/net/sf/briar/protocol/ConsumersTest.java
+++ b/briar-tests/src/net/sf/briar/messaging/ConsumersTest.java
@@ -1,4 +1,4 @@
-package net.sf.briar.protocol;
+package net.sf.briar.messaging;
 
 import static org.junit.Assert.assertArrayEquals;
 
diff --git a/briar-tests/src/net/sf/briar/protocol/ProtocolReaderImplTest.java b/briar-tests/src/net/sf/briar/messaging/PacketReaderImplTest.java
similarity index 85%
rename from briar-tests/src/net/sf/briar/protocol/ProtocolReaderImplTest.java
rename to briar-tests/src/net/sf/briar/messaging/PacketReaderImplTest.java
index 15339e20ba..cb6309fae2 100644
--- a/briar-tests/src/net/sf/briar/protocol/ProtocolReaderImplTest.java
+++ b/briar-tests/src/net/sf/briar/messaging/PacketReaderImplTest.java
@@ -1,9 +1,9 @@
-package net.sf.briar.protocol;
+package net.sf.briar.messaging;
 
-import static net.sf.briar.api.protocol.ProtocolConstants.MAX_PACKET_LENGTH;
-import static net.sf.briar.api.protocol.Types.ACK;
-import static net.sf.briar.api.protocol.Types.OFFER;
-import static net.sf.briar.api.protocol.Types.REQUEST;
+import static net.sf.briar.api.messaging.MessagingConstants.MAX_PACKET_LENGTH;
+import static net.sf.briar.api.messaging.Types.ACK;
+import static net.sf.briar.api.messaging.Types.OFFER;
+import static net.sf.briar.api.messaging.Types.REQUEST;
 
 import java.io.ByteArrayInputStream;
 import java.io.ByteArrayOutputStream;
@@ -12,11 +12,12 @@ import java.util.BitSet;
 import net.sf.briar.BriarTestCase;
 import net.sf.briar.TestUtils;
 import net.sf.briar.api.FormatException;
-import net.sf.briar.api.protocol.Request;
+import net.sf.briar.api.messaging.Request;
 import net.sf.briar.api.serial.ReaderFactory;
 import net.sf.briar.api.serial.SerialComponent;
 import net.sf.briar.api.serial.Writer;
 import net.sf.briar.api.serial.WriterFactory;
+import net.sf.briar.messaging.PacketReaderImpl;
 import net.sf.briar.serial.SerialModule;
 
 import org.junit.Test;
@@ -24,7 +25,7 @@ import org.junit.Test;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 
-public class ProtocolReaderImplTest extends BriarTestCase {
+public class PacketReaderImplTest extends BriarTestCase {
 
 	// FIXME: This is an integration test, not a unit test
 
@@ -32,7 +33,7 @@ public class ProtocolReaderImplTest extends BriarTestCase {
 	private final ReaderFactory readerFactory;
 	private final WriterFactory writerFactory;
 
-	public ProtocolReaderImplTest() throws Exception {
+	public PacketReaderImplTest() throws Exception {
 		super();
 		Injector i = Guice.createInjector(new SerialModule());
 		serial = i.getInstance(SerialComponent.class);
@@ -44,7 +45,7 @@ public class ProtocolReaderImplTest extends BriarTestCase {
 	public void testFormatExceptionIfAckIsTooLarge() throws Exception {
 		byte[] b = createAck(true);
 		ByteArrayInputStream in = new ByteArrayInputStream(b);
-		ProtocolReaderImpl reader = new ProtocolReaderImpl(readerFactory, null,
+		PacketReaderImpl reader = new PacketReaderImpl(readerFactory, null,
 				null, in);
 		try {
 			reader.readAck();
@@ -56,7 +57,7 @@ public class ProtocolReaderImplTest extends BriarTestCase {
 	public void testNoFormatExceptionIfAckIsMaximumSize() throws Exception {
 		byte[] b = createAck(false);
 		ByteArrayInputStream in = new ByteArrayInputStream(b);
-		ProtocolReaderImpl reader = new ProtocolReaderImpl(readerFactory, null,
+		PacketReaderImpl reader = new PacketReaderImpl(readerFactory, null,
 				null, in);
 		reader.readAck();
 	}
@@ -65,7 +66,7 @@ public class ProtocolReaderImplTest extends BriarTestCase {
 	public void testEmptyAck() throws Exception {
 		byte[] b = createEmptyAck();
 		ByteArrayInputStream in = new ByteArrayInputStream(b);
-		ProtocolReaderImpl reader = new ProtocolReaderImpl(readerFactory, null,
+		PacketReaderImpl reader = new PacketReaderImpl(readerFactory, null,
 				null, in);
 		try {
 			reader.readAck();
@@ -77,7 +78,7 @@ public class ProtocolReaderImplTest extends BriarTestCase {
 	public void testFormatExceptionIfOfferIsTooLarge() throws Exception {
 		byte[] b = createOffer(true);
 		ByteArrayInputStream in = new ByteArrayInputStream(b);
-		ProtocolReaderImpl reader = new ProtocolReaderImpl(readerFactory, null,
+		PacketReaderImpl reader = new PacketReaderImpl(readerFactory, null,
 				null, in);
 		try {
 			reader.readOffer();
@@ -89,7 +90,7 @@ public class ProtocolReaderImplTest extends BriarTestCase {
 	public void testNoFormatExceptionIfOfferIsMaximumSize() throws Exception {
 		byte[] b = createOffer(false);
 		ByteArrayInputStream in = new ByteArrayInputStream(b);
-		ProtocolReaderImpl reader = new ProtocolReaderImpl(readerFactory, null,
+		PacketReaderImpl reader = new PacketReaderImpl(readerFactory, null,
 				null, in);
 		reader.readOffer();
 	}
@@ -98,7 +99,7 @@ public class ProtocolReaderImplTest extends BriarTestCase {
 	public void testEmptyOffer() throws Exception {
 		byte[] b = createEmptyOffer();
 		ByteArrayInputStream in = new ByteArrayInputStream(b);
-		ProtocolReaderImpl reader = new ProtocolReaderImpl(readerFactory, null,
+		PacketReaderImpl reader = new PacketReaderImpl(readerFactory, null,
 				null, in);
 		try {
 			reader.readOffer();
@@ -110,7 +111,7 @@ public class ProtocolReaderImplTest extends BriarTestCase {
 	public void testFormatExceptionIfRequestIsTooLarge() throws Exception {
 		byte[] b = createRequest(true);
 		ByteArrayInputStream in = new ByteArrayInputStream(b);
-		ProtocolReaderImpl reader = new ProtocolReaderImpl(readerFactory, null,
+		PacketReaderImpl reader = new PacketReaderImpl(readerFactory, null,
 				null, in);
 		try {
 			reader.readRequest();
@@ -122,7 +123,7 @@ public class ProtocolReaderImplTest extends BriarTestCase {
 	public void testNoFormatExceptionIfRequestIsMaximumSize() throws Exception {
 		byte[] b = createRequest(false);
 		ByteArrayInputStream in = new ByteArrayInputStream(b);
-		ProtocolReaderImpl reader = new ProtocolReaderImpl(readerFactory, null,
+		PacketReaderImpl reader = new PacketReaderImpl(readerFactory, null,
 				null, in);
 		reader.readRequest();
 	}
@@ -148,7 +149,7 @@ public class ProtocolReaderImplTest extends BriarTestCase {
 			byte[] b = createRequest(bitmap);
 			// Deserialise the request
 			ByteArrayInputStream in = new ByteArrayInputStream(b);
-			ProtocolReaderImpl reader = new ProtocolReaderImpl(readerFactory,
+			PacketReaderImpl reader = new PacketReaderImpl(readerFactory,
 					null, null, in);
 			Request request = reader.readRequest();
 			BitSet decoded = request.getBitmap();
diff --git a/briar-tests/src/net/sf/briar/protocol/ProtocolWriterImplTest.java b/briar-tests/src/net/sf/briar/messaging/PacketWriterImplTest.java
similarity index 79%
rename from briar-tests/src/net/sf/briar/protocol/ProtocolWriterImplTest.java
rename to briar-tests/src/net/sf/briar/messaging/PacketWriterImplTest.java
index 7e84217179..5a691ee2e7 100644
--- a/briar-tests/src/net/sf/briar/protocol/ProtocolWriterImplTest.java
+++ b/briar-tests/src/net/sf/briar/messaging/PacketWriterImplTest.java
@@ -1,16 +1,18 @@
-package net.sf.briar.protocol;
+package net.sf.briar.messaging;
 
 import java.io.ByteArrayOutputStream;
 import java.io.IOException;
 import java.util.BitSet;
 
 import net.sf.briar.BriarTestCase;
-import net.sf.briar.api.protocol.ProtocolWriter;
-import net.sf.briar.api.protocol.Request;
+import net.sf.briar.api.messaging.PacketWriter;
+import net.sf.briar.api.messaging.Request;
 import net.sf.briar.api.serial.SerialComponent;
 import net.sf.briar.api.serial.WriterFactory;
 import net.sf.briar.clock.ClockModule;
 import net.sf.briar.crypto.CryptoModule;
+import net.sf.briar.messaging.MessagingModule;
+import net.sf.briar.messaging.PacketWriterImpl;
 import net.sf.briar.serial.SerialModule;
 import net.sf.briar.util.StringUtils;
 
@@ -19,17 +21,17 @@ import org.junit.Test;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 
-public class ProtocolWriterImplTest extends BriarTestCase {
+public class PacketWriterImplTest extends BriarTestCase {
 
 	// FIXME: This is an integration test, not a unit test
 
 	private final SerialComponent serial;
 	private final WriterFactory writerFactory;
 
-	public ProtocolWriterImplTest() {
+	public PacketWriterImplTest() {
 		super();
 		Injector i = Guice.createInjector(new ClockModule(), new CryptoModule(),
-				new ProtocolModule(), new SerialModule());
+				new MessagingModule(), new SerialModule());
 		serial = i.getInstance(SerialComponent.class);
 		writerFactory = i.getInstance(WriterFactory.class);
 	}
@@ -37,7 +39,7 @@ public class ProtocolWriterImplTest extends BriarTestCase {
 	@Test
 	public void testWriteBitmapNoPadding() throws IOException {
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		ProtocolWriter w = new ProtocolWriterImpl(serial, writerFactory, out,
+		PacketWriter w = new PacketWriterImpl(serial, writerFactory, out,
 				true);
 		BitSet b = new BitSet();
 		// 11011001 = 0xD9
@@ -61,7 +63,7 @@ public class ProtocolWriterImplTest extends BriarTestCase {
 	@Test
 	public void testWriteBitmapWithPadding() throws IOException {
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		ProtocolWriter w = new ProtocolWriterImpl(serial, writerFactory, out,
+		PacketWriter w = new PacketWriterImpl(serial, writerFactory, out,
 				true);
 		BitSet b = new BitSet();
 		// 01011001 = 0x59
diff --git a/briar-tests/src/net/sf/briar/protocol/simplex/OutgoingSimplexConnectionTest.java b/briar-tests/src/net/sf/briar/messaging/simplex/OutgoingSimplexConnectionTest.java
similarity index 89%
rename from briar-tests/src/net/sf/briar/protocol/simplex/OutgoingSimplexConnectionTest.java
rename to briar-tests/src/net/sf/briar/messaging/simplex/OutgoingSimplexConnectionTest.java
index 7098c6d90e..9be90a38d5 100644
--- a/briar-tests/src/net/sf/briar/protocol/simplex/OutgoingSimplexConnectionTest.java
+++ b/briar-tests/src/net/sf/briar/messaging/simplex/OutgoingSimplexConnectionTest.java
@@ -1,6 +1,6 @@
-package net.sf.briar.protocol.simplex;
+package net.sf.briar.messaging.simplex;
 
-import static net.sf.briar.api.protocol.ProtocolConstants.MAX_PACKET_LENGTH;
+import static net.sf.briar.api.messaging.MessagingConstants.MAX_PACKET_LENGTH;
 import static net.sf.briar.api.transport.TransportConstants.HEADER_LENGTH;
 import static net.sf.briar.api.transport.TransportConstants.MAC_LENGTH;
 import static net.sf.briar.api.transport.TransportConstants.MIN_CONNECTION_LENGTH;
@@ -17,18 +17,20 @@ import net.sf.briar.TestUtils;
 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.protocol.Ack;
-import net.sf.briar.api.protocol.MessageId;
-import net.sf.briar.api.protocol.ProtocolWriterFactory;
-import net.sf.briar.api.protocol.TransportId;
-import net.sf.briar.api.protocol.UniqueId;
+import net.sf.briar.api.messaging.Ack;
+import net.sf.briar.api.messaging.MessageId;
+import net.sf.briar.api.messaging.PacketWriterFactory;
+import net.sf.briar.api.messaging.TransportId;
+import net.sf.briar.api.messaging.UniqueId;
 import net.sf.briar.api.transport.ConnectionContext;
 import net.sf.briar.api.transport.ConnectionRegistry;
 import net.sf.briar.api.transport.ConnectionWriterFactory;
 import net.sf.briar.clock.ClockModule;
 import net.sf.briar.crypto.CryptoModule;
-import net.sf.briar.protocol.ProtocolModule;
-import net.sf.briar.protocol.duplex.DuplexProtocolModule;
+import net.sf.briar.messaging.MessagingModule;
+import net.sf.briar.messaging.duplex.DuplexMessagingModule;
+import net.sf.briar.messaging.simplex.OutgoingSimplexConnection;
+import net.sf.briar.messaging.simplex.SimplexMessagingModule;
 import net.sf.briar.serial.SerialModule;
 import net.sf.briar.transport.TransportModule;
 
@@ -49,7 +51,7 @@ public class OutgoingSimplexConnectionTest extends BriarTestCase {
 	private final DatabaseComponent db;
 	private final ConnectionRegistry connRegistry;
 	private final ConnectionWriterFactory connFactory;
-	private final ProtocolWriterFactory protoFactory;
+	private final PacketWriterFactory protoFactory;
 	private final ContactId contactId;
 	private final MessageId messageId;
 	private final TransportId transportId;
@@ -70,11 +72,11 @@ public class OutgoingSimplexConnectionTest extends BriarTestCase {
 		};
 		Injector i = Guice.createInjector(testModule, new ClockModule(),
 				new CryptoModule(), new SerialModule(), new TransportModule(),
-				new SimplexProtocolModule(), new ProtocolModule(),
-				new DuplexProtocolModule());
+				new SimplexMessagingModule(), new MessagingModule(),
+				new DuplexMessagingModule());
 		connRegistry = i.getInstance(ConnectionRegistry.class);
 		connFactory = i.getInstance(ConnectionWriterFactory.class);
-		protoFactory = i.getInstance(ProtocolWriterFactory.class);
+		protoFactory = i.getInstance(PacketWriterFactory.class);
 		contactId = new ContactId(234);
 		messageId = new MessageId(TestUtils.getRandomId());
 		transportId = new TransportId(TestUtils.getRandomId());
diff --git a/briar-tests/src/net/sf/briar/protocol/simplex/SimplexProtocolIntegrationTest.java b/briar-tests/src/net/sf/briar/messaging/simplex/SimplexMessagingIntegrationTest.java
similarity index 85%
rename from briar-tests/src/net/sf/briar/protocol/simplex/SimplexProtocolIntegrationTest.java
rename to briar-tests/src/net/sf/briar/messaging/simplex/SimplexMessagingIntegrationTest.java
index 7731790ff0..72c36ea2d8 100644
--- a/briar-tests/src/net/sf/briar/protocol/simplex/SimplexProtocolIntegrationTest.java
+++ b/briar-tests/src/net/sf/briar/messaging/simplex/SimplexMessagingIntegrationTest.java
@@ -1,4 +1,4 @@
-package net.sf.briar.protocol.simplex;
+package net.sf.briar.messaging.simplex;
 
 import static net.sf.briar.api.transport.TransportConstants.TAG_LENGTH;
 
@@ -17,13 +17,13 @@ import net.sf.briar.api.db.DatabaseComponent;
 import net.sf.briar.api.db.event.DatabaseEvent;
 import net.sf.briar.api.db.event.DatabaseListener;
 import net.sf.briar.api.db.event.MessageAddedEvent;
-import net.sf.briar.api.protocol.Message;
-import net.sf.briar.api.protocol.MessageFactory;
-import net.sf.briar.api.protocol.MessageVerifier;
-import net.sf.briar.api.protocol.ProtocolReaderFactory;
-import net.sf.briar.api.protocol.ProtocolWriterFactory;
-import net.sf.briar.api.protocol.TransportId;
-import net.sf.briar.api.protocol.TransportUpdate;
+import net.sf.briar.api.messaging.Message;
+import net.sf.briar.api.messaging.MessageFactory;
+import net.sf.briar.api.messaging.MessageVerifier;
+import net.sf.briar.api.messaging.PacketReaderFactory;
+import net.sf.briar.api.messaging.PacketWriterFactory;
+import net.sf.briar.api.messaging.TransportId;
+import net.sf.briar.api.messaging.TransportUpdate;
 import net.sf.briar.api.transport.ConnectionContext;
 import net.sf.briar.api.transport.ConnectionReaderFactory;
 import net.sf.briar.api.transport.ConnectionRecogniser;
@@ -34,9 +34,12 @@ import net.sf.briar.clock.ClockModule;
 import net.sf.briar.crypto.CryptoModule;
 import net.sf.briar.db.DatabaseModule;
 import net.sf.briar.lifecycle.LifecycleModule;
+import net.sf.briar.messaging.MessagingModule;
+import net.sf.briar.messaging.duplex.DuplexMessagingModule;
+import net.sf.briar.messaging.simplex.IncomingSimplexConnection;
+import net.sf.briar.messaging.simplex.OutgoingSimplexConnection;
+import net.sf.briar.messaging.simplex.SimplexMessagingModule;
 import net.sf.briar.plugins.ImmediateExecutor;
-import net.sf.briar.protocol.ProtocolModule;
-import net.sf.briar.protocol.duplex.DuplexProtocolModule;
 import net.sf.briar.serial.SerialModule;
 import net.sf.briar.transport.TransportModule;
 
@@ -47,7 +50,7 @@ import org.junit.Test;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 
-public class SimplexProtocolIntegrationTest extends BriarTestCase {
+public class SimplexMessagingIntegrationTest extends BriarTestCase {
 
 	private static final long CLOCK_DIFFERENCE = 60 * 1000L;
 	private static final long LATENCY = 60 * 1000L;
@@ -61,7 +64,7 @@ public class SimplexProtocolIntegrationTest extends BriarTestCase {
 
 	private Injector alice, bob;
 
-	public SimplexProtocolIntegrationTest() throws Exception {
+	public SimplexMessagingIntegrationTest() throws Exception {
 		super();
 		transportId = new TransportId(TestUtils.getRandomId());
 		// Create matching secrets for Alice and Bob
@@ -81,9 +84,9 @@ public class SimplexProtocolIntegrationTest extends BriarTestCase {
 	private Injector createInjector(File dir) {
 		return Guice.createInjector(new ClockModule(), new CryptoModule(),
 				new DatabaseModule(), new LifecycleModule(),
-				new ProtocolModule(), new SerialModule(),
-				new TestDatabaseModule(dir), new SimplexProtocolModule(),
-				new TransportModule(), new DuplexProtocolModule());
+				new MessagingModule(), new SerialModule(),
+				new TestDatabaseModule(dir), new SimplexMessagingModule(),
+				new TransportModule(), new DuplexMessagingModule());
 	}
 
 	@Test
@@ -124,8 +127,8 @@ public class SimplexProtocolIntegrationTest extends BriarTestCase {
 				alice.getInstance(ConnectionRegistry.class);
 		ConnectionWriterFactory connFactory =
 				alice.getInstance(ConnectionWriterFactory.class);
-		ProtocolWriterFactory protoFactory =
-				alice.getInstance(ProtocolWriterFactory.class);
+		PacketWriterFactory protoFactory =
+				alice.getInstance(PacketWriterFactory.class);
 		TestSimplexTransportWriter transport = new TestSimplexTransportWriter(
 				out, Long.MAX_VALUE, false);
 		ConnectionContext ctx = km.getConnectionContext(contactId, transportId);
@@ -179,8 +182,8 @@ public class SimplexProtocolIntegrationTest extends BriarTestCase {
 				bob.getInstance(ConnectionRegistry.class);
 		ConnectionReaderFactory connFactory =
 				bob.getInstance(ConnectionReaderFactory.class);
-		ProtocolReaderFactory protoFactory =
-				bob.getInstance(ProtocolReaderFactory.class);
+		PacketReaderFactory protoFactory =
+				bob.getInstance(PacketReaderFactory.class);
 		TestSimplexTransportReader transport =
 				new TestSimplexTransportReader(in);
 		IncomingSimplexConnection simplex = new IncomingSimplexConnection(
diff --git a/briar-tests/src/net/sf/briar/protocol/simplex/TestSimplexTransportReader.java b/briar-tests/src/net/sf/briar/messaging/simplex/TestSimplexTransportReader.java
similarity index 94%
rename from briar-tests/src/net/sf/briar/protocol/simplex/TestSimplexTransportReader.java
rename to briar-tests/src/net/sf/briar/messaging/simplex/TestSimplexTransportReader.java
index 1d85ed3ec5..dafa494f07 100644
--- a/briar-tests/src/net/sf/briar/protocol/simplex/TestSimplexTransportReader.java
+++ b/briar-tests/src/net/sf/briar/messaging/simplex/TestSimplexTransportReader.java
@@ -1,4 +1,4 @@
-package net.sf.briar.protocol.simplex;
+package net.sf.briar.messaging.simplex;
 
 import java.io.InputStream;
 
diff --git a/briar-tests/src/net/sf/briar/protocol/simplex/TestSimplexTransportWriter.java b/briar-tests/src/net/sf/briar/messaging/simplex/TestSimplexTransportWriter.java
similarity index 95%
rename from briar-tests/src/net/sf/briar/protocol/simplex/TestSimplexTransportWriter.java
rename to briar-tests/src/net/sf/briar/messaging/simplex/TestSimplexTransportWriter.java
index 7a1524cb57..539da8456e 100644
--- a/briar-tests/src/net/sf/briar/protocol/simplex/TestSimplexTransportWriter.java
+++ b/briar-tests/src/net/sf/briar/messaging/simplex/TestSimplexTransportWriter.java
@@ -1,4 +1,4 @@
-package net.sf.briar.protocol.simplex;
+package net.sf.briar.messaging.simplex;
 
 import java.io.ByteArrayOutputStream;
 import java.io.OutputStream;
diff --git a/briar-tests/src/net/sf/briar/plugins/PluginManagerImplTest.java b/briar-tests/src/net/sf/briar/plugins/PluginManagerImplTest.java
index 3c958e1013..a080b890d6 100644
--- a/briar-tests/src/net/sf/briar/plugins/PluginManagerImplTest.java
+++ b/briar-tests/src/net/sf/briar/plugins/PluginManagerImplTest.java
@@ -10,11 +10,11 @@ import net.sf.briar.api.TransportConfig;
 import net.sf.briar.api.TransportProperties;
 import net.sf.briar.api.android.AndroidExecutor;
 import net.sf.briar.api.db.DatabaseComponent;
+import net.sf.briar.api.messaging.TransportId;
 import net.sf.briar.api.plugins.duplex.DuplexPluginConfig;
 import net.sf.briar.api.plugins.duplex.DuplexPluginFactory;
 import net.sf.briar.api.plugins.simplex.SimplexPluginConfig;
 import net.sf.briar.api.plugins.simplex.SimplexPluginFactory;
-import net.sf.briar.api.protocol.TransportId;
 import net.sf.briar.api.transport.ConnectionDispatcher;
 import net.sf.briar.api.ui.UiCallback;
 import net.sf.briar.plugins.file.RemovableDrivePluginFactory;
diff --git a/briar-tests/src/net/sf/briar/transport/ConnectionRegistryImplTest.java b/briar-tests/src/net/sf/briar/transport/ConnectionRegistryImplTest.java
index af5e853acc..b46ec1fd23 100644
--- a/briar-tests/src/net/sf/briar/transport/ConnectionRegistryImplTest.java
+++ b/briar-tests/src/net/sf/briar/transport/ConnectionRegistryImplTest.java
@@ -6,7 +6,7 @@ import java.util.Collections;
 import net.sf.briar.BriarTestCase;
 import net.sf.briar.TestUtils;
 import net.sf.briar.api.ContactId;
-import net.sf.briar.api.protocol.TransportId;
+import net.sf.briar.api.messaging.TransportId;
 import net.sf.briar.api.transport.ConnectionRegistry;
 
 import org.junit.Test;
diff --git a/briar-tests/src/net/sf/briar/transport/TransportConnectionRecogniserTest.java b/briar-tests/src/net/sf/briar/transport/TransportConnectionRecogniserTest.java
index 9e8739719f..c708316352 100644
--- a/briar-tests/src/net/sf/briar/transport/TransportConnectionRecogniserTest.java
+++ b/briar-tests/src/net/sf/briar/transport/TransportConnectionRecogniserTest.java
@@ -14,7 +14,7 @@ import net.sf.briar.api.ContactId;
 import net.sf.briar.api.crypto.CryptoComponent;
 import net.sf.briar.api.crypto.ErasableKey;
 import net.sf.briar.api.db.DatabaseComponent;
-import net.sf.briar.api.protocol.TransportId;
+import net.sf.briar.api.messaging.TransportId;
 import net.sf.briar.api.transport.ConnectionContext;
 import net.sf.briar.api.transport.TemporarySecret;
 import net.sf.briar.util.ByteUtils;
diff --git a/briar-tests/src/net/sf/briar/transport/TransportIntegrationTest.java b/briar-tests/src/net/sf/briar/transport/TransportIntegrationTest.java
index e2ec072e5e..9780992164 100644
--- a/briar-tests/src/net/sf/briar/transport/TransportIntegrationTest.java
+++ b/briar-tests/src/net/sf/briar/transport/TransportIntegrationTest.java
@@ -1,6 +1,6 @@
 package net.sf.briar.transport;
 
-import static net.sf.briar.api.protocol.ProtocolConstants.MAX_PACKET_LENGTH;
+import static net.sf.briar.api.messaging.MessagingConstants.MAX_PACKET_LENGTH;
 import static net.sf.briar.api.transport.TransportConstants.MIN_CONNECTION_LENGTH;
 import static org.junit.Assert.assertArrayEquals;
 
@@ -16,7 +16,7 @@ import net.sf.briar.api.ContactId;
 import net.sf.briar.api.crypto.AuthenticatedCipher;
 import net.sf.briar.api.crypto.CryptoComponent;
 import net.sf.briar.api.crypto.ErasableKey;
-import net.sf.briar.api.protocol.TransportId;
+import net.sf.briar.api.messaging.TransportId;
 import net.sf.briar.api.transport.ConnectionContext;
 import net.sf.briar.api.transport.ConnectionWriter;
 import net.sf.briar.api.transport.ConnectionWriterFactory;
-- 
GitLab