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 b0703abbbf1cd952c440f8aa8a0b56ae6db81ba1..e1ebbf512e3152a31bc140cf9159104b1f015466 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 0932c53595947a76de7d3f89d0014370b04ea1f6..5bd99e5371acc70c8f9b260bd2b5401271e394bf 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 dc5b4e529600be60f6f140d492058cc9de93f366..313377ab0191424163fbe252aabb63dab668b083 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 a3395ef27e76c09377251f6dec4e5a9abb612f77..aec11c50f2de58b730c96822132b42e984f74a20 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 6458ad54bd869f1763b919eb8e3dc18087455111..afb2f4a2680b0378df9cbef597fcc5b3fa391f24 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 75156882292478155b0ef2b3c29e30511c5e6f8b..02d5b6b3b24c15b5620857fdea7c963ccfbf1ef1 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 2b7dd98a267a578282ed6ff6244cf22ccdc5e490..3381b63da81e0b25a0ee39a03e4b61fe66bdd753 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 8a39f38a98080eb42798f549813250c3188b0676..562ccb5fe900c44a7161a23d45e04238ae3c3dce 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 1532155c32ccb733c09b21d207fcb4e8bd9c7698..3621fbd84f063f4a0b6ba57b25d7571525dbe7e6 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 59c21df227662d45ef9c8fc1bd9399ed3b190384..d1708340a5cc296ab7d76702ed034b81230ea377 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 3d572d5adaa52397f2b300f67d25228d4b277e98..25360a3255f1f7ac94942a3cdf2b48e0d6f8c535 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 2887c8478ac870af952f52bcbfac707a6ef273a2..3e1bf6466ff9894a03820b26084fb00a58f8a80b 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 b1db22d6dbb1eb39b276a5ed0f44dc1f883bd332..4d85ed88b70b38707009211abe941a47ade8c2c6 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 b530f8c2f5ab5217a5bbd22fe7a95edb1f4c15ab..ea2eb546b4b2949795a9762aa8261d88aad10b35 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 c5dca006efe5419b42c19eae0794848b9dc32b0d..5140ffc0e93a5919e83d3d6a1b725ca94b6aeafd 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 2c9dbe50e230b3ca09ddf9be78b79de66b691eb7..ee1682315360226bb579719d053ab906ab7f30b2 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 88cdb1c3128aec40ebbbb0a91461331002cc4f7b..e0acc7d7a1bcce4bab9d3df235244126fea25d5c 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 f99b3487546d98c0e26ee8d9e896b3647ff9aae4..3f666631a1bfac5dbb60415654f59843bd3982ef 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 5dffe995c7ffe984b4ea3655e9aed1cc1dd92690..e95c7462f1c0e58be3e2e7d6bf299da6bf3b0f1f 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 d3be3b55e1872e06df98079db79376a82f2d8d41..9f107c73e42005f03fd2fd7f19d11341a52ed754 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 12f675b5bdb3d1cf46aba7c30430e193f2a64619..1f13497c98f3477dd1e293672714e8757af258d0 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 0000000000000000000000000000000000000000..40aa880fa3b6e406c6712a5a9784f4b24bad0bcc
--- /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 f2d9fa2b6dc7b3c8228bda415c9a8245a3eaf8b6..94b6a44bb5e36089ef903361d486b67535f93b3c 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 0000000000000000000000000000000000000000..371fe7cb07ab844a41e76ceea7f7f0db25f9debd
--- /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 7e5d86fdd5e248f7b3e891a2c41787038695fd27..e789b4f353290829086f1cdaf946d46b3afa7579 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 7b87f0db676df0002461ab18e6d31dab1a1a3977..faae81bf6d9c754778fcb8ed01de1050d3a7dc19 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 bdfee3e066d45141c04d3f32ea5caf24258f8846..5815b0650cc1af4e358a351c733893fe8ffb6923 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 caacca97f8a92110a4a93123249108bb8c35f4f3..5ef2664e98ba94adb4b08b77a49cd2d22e14ffcb 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 00e797184fa279c8ada588213127d0a823c76b07..337d23b9910e99763debea1d3ba2c12a8127d60f 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 2ccfd9c3611f165323058c2ba9b3e487db764774..f336945569aade80f37691656a95862223c1b93e 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 8f295683dd9b11ee685149a3a56296800d5a08a7..3d546f4cba2473aa0536a818826e9d4647dc1e2f 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 28e3a4cb1f1e5b10ad69b149b2040c94da64c876..56ed14f2ad8b04e39553cc740edd203d8dff1e18 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 eefa685cf6b6bd07132696d81530049c95f42275..a141c071c9c7c696802545df831345ffc7c288a6 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 819c0810ad782a2f405ca1f8dde282e20376bee4..a15573e9aa01d3f4a517cf12c698d998cdda758d 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 8d46431f86db03a6473343038e9cd749951f6982..cf1fcf2ce4e6356fd228bb4788f233e93d9d0d76 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 90a20d7c53e82280e8e24973887a142d20b04492..18e7da9661fda51b47e9e4198dfbd99a732ac30b 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 c7504f376e81ea019e7a8145ed65e66ce0706c5c..8b85de2a6540540c880aa34f0c9f97e196d5668e 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 fa8d2c021f25de08e604ed0803de38c77d41352f..6f39db80ed3c0f88ba7175c196ef2bdf3dea8e0c 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 c6284ca92dd33575311fa07a251b7e65ce9d9a5d..f76833a39fa6fcc5b970182bf8e03c020fc3eab0 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 4919f9fc2346d984ddadc0e956c9fc5fd4f9bd60..5cdd8e768322001c5bc0a9e8e3cd0af298f294fc 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 f6a9f2ea866ad67974800993674bc7e5ce7428b9..5a842fdc1c95d35ec77fa657da128513e5b15cec 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 2eb1a75187894ea9dffd3bb0e96c8221db9d5656..0000000000000000000000000000000000000000
--- 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 8c0d465ebf2f3dd08fac8a60fef58888562bd10f..0000000000000000000000000000000000000000
--- 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 dac9544982794e71f00a203756f206ba8cb02401..ad7c329d210f3553d4ab0df4567f4872891d95fe 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 4e7dbd793dab7a8bc2cc71557258d33f8d8c07b8..a11b28ef2c53b541617379fac20c312bb3bd9dd6 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 69e53b39f6fc17e755fc099537f95f3cb15e9ae0..12f6ce1b7ac5b2e4e98a2a45a729ccb0b17c781e 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 f9b3489cbfb3982e9f36a16a807babbaad976ac5..2983fff39cc0dc50fd82dcefc9b01b123167956b 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 3e1590e919b54634569cdfa08a49a62dff4a0dff..0b66b6477618192eeb7aefa5c6a096caa953f501 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 4fc8110e03b9fa0358df267e8fa1f1eed914cd5b..60d10dabbdc3af10db7960c1866be7c88ea77775 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 9fa585ff380f004daa4bb661c3bb6c2fd64daafa..ea1b8e65cb262d24232bab3deb91034b8c60941b 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 2cd5149a72d9ce361bf6dbf01aef2eff451db5b5..251373efe79cfb9f28cdb5772a6ae6c62ad0d3d5 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 4423030ac7c936b88917f60690fbd0ddea75c03f..fced9675b2f80a2b072796344faf3bbd502223bb 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 0e4d6fa6684cb89e32e3543a7f550f6e09f100dd..7cb201a848b26326135a4b0a866edf34e00d0734 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 41fa3d7826ca4bc21db8405ec70bf55ccdcf4ede..407cc9ebb491a82ff3a38f0fd58481b594e31d89 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 d8d392503d43b2faf4daa5cd537c9e1f4cb07fac..410fdbb772d6798c93a239fd6bdb125160f9c0ac 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 893ba9cc987991149b5e3cc61f39c0f2f74fcbbc..6ceeee6a1d35c0c4202da168ebff2dae51961b04 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 3cfc9d908c6398649788349b7b850c2befa85fd7..c594a7f6ff7a5ecf636bd84055fd6f35529fe06a 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 4bbcdff101108bb1560ee8b86f76931457cc3a07..c6c6011b462cadd842da85d4de0d9d70be5f74ec 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 3b6c739c23fda76de5137ab5c8766a008feec6e8..e7090a9612dcbf17067131b0308298e02a259ceb 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 8c6eb2d4061abb85b7fc5a38e79a97b6de4f68d3..7fa93c2d698d84e38b10367c2ca69f87b5c58396 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 cb445a8c9b4091c1b04e24a103a82f6e0173996b..1296481152f6b38ada4945a93319d6d854ace09f 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 9d32b9ef19be0ae010917e0c2da501e4002da30e..573a3f32b39b548b7f791c74c266f4314732b7a7 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 ac1af5728f5aded0919c4c31b97ab68fe388b08d..624e8506ce54aa134c895ef251e60894d6ba2652 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 2e49cb2b6bad638f5e9c187d29a77defe5d147fa..cdd5bdcbb48227b6b00f9070999a239079441366 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 0000000000000000000000000000000000000000..3d80c3b3abe76c4b3a154a5ae7a0c31254dd6524
--- /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 3a9a813fa0d8c2552e99f593308a843f29e82832..0e54cec9b92ca5e2909bb5f880441bea79d01676 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 5c209944869cb49abf919fd868762e29b1f51713..cfbae5675afe944c24bb8be3519e2cdb8215ac09 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 0a50becb93fa1aa6f44926cd7a4789f5efe74b38..9c02e1ed4c4c5fe90bc9a464c0503cbf74d64909 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 e60f9c0be77be259a9d12a5e70cf10ee1df3d969..5230475c9d019cbaaf5a3c55e4aa778feb330739 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 1ba18df14b28537b1e2282678a9a816640831917..ef699482433fa94db9a6a32e5d655e3f3f97400d 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 2f5b006eca01c265e974961491724bb0693c0182..f9aba80b8a35c0d8400594e90bfcec2a5c04f859 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 4b67f433fb5996aa1f7fa618d9a92b4f140581c3..06418f78b9d49cc85de62819fcdb1332cc8a2b91 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 f922a56fbb24c54cddcfa117e269e33307f672b0..9d48be59587b5d18ee75cc2435c57634206f17cf 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 e32bf287ff7cc47e3dd365ca17b1ca33edabbc35..21ac4b0f33ea50a9b29816d46fb3005c45cf162b 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 6f6736ca3cbefb740c685ceea6ebd25b15516894..c06f35e586040b61405ff080d97a0b5767e68846 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 45ec2a9d1467cfcb77bbe8d1d5980a341746a7fd..b69086258b2c48b4b4c139aaedb8f9af65f48f45 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 697b84346ce1d94b04cff33533c07c408cf1bf64..c11c4fcd6e13ec323c21bf4f3fe4575c869c13f2 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 a8a4b4e1052377c60da45f46e0b320bec2241a30..6f185e31a0bcdbe9ae61708fa7f7050c71c244cb 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 94fbdd06a0bf34e3040746fdf7db0acd1b91b31f..2d909bc5ff0942e236a98707d34837915b0a9385 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 95e9fa0219738d57ae0e351993c8c51a76f1e9cb..ea7dc74b2a42c8b1b1188a96c8e6d3adf463447f 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 cb9d0e1f64d27959c5a97229d173bd6f8ed61a4f..501944d4d24e4bf67dbbb18ebf9d0b02b204865b 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 9e95cc865e01cbf078ab177449e14a8a22e7de26..a647c1507cd3ffe46b8c4bc3518be422afa7c2c9 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 3a36160a172dd9e28891b48bde99e4598097ef70..ed5594027bf534acb4bdf51203fc0a78ab6e4138 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 5404a106f4749db200966f8b5f12fad90e17453c..49184a8c482614d55d3b29f64a4bc2552184d20b 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 7b845fd801031bd34d0518dd328081b9e80a2ab9..cf5c2eb531c42a65ab126b45864f4efd37f178fa 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 dc515219c70963781f389fe4688645f2d80a1132..243488a32d5b989a273d6ee58bf52086f7e20176 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 8c938e2c3043db84c1f79d38da4a70dee92cd0ae..9a930c15a331ad2eb0e21d41bdc9837107ee240c 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 264c3906e550b9ed4548b7a1e3c1bc67f0320474..dd688c10141fb4376e3af94b3daad7e8a6f72068 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 f40d357dc11532077a59720ad2a5c2d0baa608cf..8adbc2cc1b61516b055544d0767b44411d162baf 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 71d60b47bf10ef3b6be7d0a9cb21ae2939229919..325e6e277b9046ce74cd9168bf6209f94bf32fdc 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 dc87cf2ab919ce9e3d59a0cc5508cbb063c2a945..c5eb7ba00f2459dd0be20cb2a846e18f0e7e2693 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 a2d40759e4fecc5b83303cf02af388eb9bca7cb7..0000000000000000000000000000000000000000
--- 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 950be7be1389e86511399c5ef1adeb1e068840e4..bf64c7fd2e486237183cd243782a1c598b4e5234 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 220e36d8f89f61d60b0858902d1dfdb4328898b0..c8e0de79b0944a24d78895fcae48aedc97168eb2 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 73492ed3c5e0e41fbef0338da8ed6401ab9919b2..f86b651447cb04ac8c7e921dc79bd4bd82da8f65 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 4b84551eba7c19a159806e12ae81719bc668fc15..ffa0c2c97bf549931314cb5daf7729061b30760c 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 53b1e7e4f29bed360479a6db75542e1380203961..d9abc385ded94d195d0dfcb9f12c2c554c438225 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 dfada60a59e3485baed940d4c1372d780fd51bb2..761f846a390a433d18fa3c403f8fd373003c7f6f 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 8bbb88e7d7b34823b21c5735759142ccf23c37d9..62f7292bf137ce78a828f592630adfb86f583b4e 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 5abda455f96690a371d5f4602e0cf0b6f56ae2ac..dcb14d8047f46d1447a37021390224f7079e7ae2 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 c66abc8bb064e7bfae7eb99358d96640c3dd746c..881b02777a95167b750f8381790df831d4985cc1 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 e5c4f6cfe231e52535f32b75d12a551a250911ff..21c4beff9334ffe07d2e604767cf5bc9c287ed7f 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 8f74e5cd1f76fc632b7ced1abfd5f0b397b22bec..c7322c84ab37e77339d34d229d4af2e3c2a4f054 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 4db3417016a5e3b06ef350ca4bc788e1156691b9..fa7b1ec7dcd0f0e486677e3e6021b6114ee99aff 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 3b06c4b49ad864ec34abbb3fa372aec62be062bd..91209dadcbcfd7a1d706b712fe7bd41b46fd844e 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 0bb89d6d29a3fe4e0a79e9bd2b561691fd978cdb..0432c699ddd01d4746f6e26dbc3acda7fe20a4a9 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 15339e20baeeeba69184530f2cc6c686f4422b3f..cb6309fae2bfe6718c4447cfb5ef2d337fcdbd6d 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 7e842171790addce32e12200755ba47a7db3d3fd..5a691ee2e7589dc025767d7d0bf7e867497a6481 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 7098c6d90e08a8d205d9464980497b6d0aa59103..9be90a38d541bfc49a562397176b71a82f6d26c5 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 7731790ff02364195f6abc81f07dc8a74bf49854..72c36ea2d8e739d96394c71bcc104e8c15ae7bc4 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 1d85ed3ec57599ea7e3e49b273bf1e09313c4db3..dafa494f076c73316dadcab6016b1b206e55bde9 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 7a1524cb5761d6e43899a4f1e6860183dd4451c2..539da8456e61ab6727e9c59f84ab769a92ffe01d 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 3c958e10135944e25fb0ec997a26a12708844b92..a080b890d6f300d95cf8eca1561e2a561eb8ca65 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 af5e853acc9181ed6c771eab4481c3e356c6307f..b46ec1fd23f69065eab250a939f623bf9808eeb3 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 9e8739719f36298aed0509a38530cb26c0489283..c70831635287ab833f29c840d573de717ca336a3 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 e2ec072e5e46a0703b87cbdb6a4655927d21bfa6..9780992164e9a59127af1d2cda5581765464bfd8 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;