From 72be34768b1e0abe6da2995913693932fc9f857d Mon Sep 17 00:00:00 2001
From: akwizgran <akwizgran@users.sourceforge.net>
Date: Mon, 14 Nov 2011 22:14:52 +0000
Subject: [PATCH] Minor refactoring.

---
 .../sf/briar/api/db/DatabaseComponent.java    | 12 ++---
 .../{writers => }/MessageEncoder.java         |  6 +--
 .../briar/api/protocol/ProtocolConstants.java |  6 +--
 .../api/protocol/writers/AuthorWriter.java    | 11 -----
 .../api/protocol/writers/GroupWriter.java     | 11 -----
 .../writers/ProtocolWriterFactory.java        |  4 +-
 ...ter.java => SubscriptionUpdateWriter.java} |  2 +-
 ...Writer.java => TransportUpdateWriter.java} |  2 +-
 .../sf/briar/db/DatabaseComponentImpl.java    | 10 ++---
 .../sf/briar/protocol/MessageEncoderImpl.java | 29 +++++++-----
 .../net/sf/briar/protocol/ProtocolModule.java |  2 +-
 .../protocol/writers/AuthorWriterImpl.java    | 17 -------
 .../protocol/writers/GroupWriterImpl.java     | 19 --------
 .../writers/ProtocolWriterFactoryImpl.java    | 13 +++---
 .../writers/ProtocolWritersModule.java        |  4 --
 ...java => SubscriptionUpdateWriterImpl.java} | 20 ++++++---
 ...pl.java => TransportUpdateWriterImpl.java} |  6 +--
 .../batch/OutgoingBatchConnection.java        | 11 ++---
 .../transport/stream/StreamConnection.java    | 36 +++++++--------
 .../net/sf/briar/ProtocolIntegrationTest.java | 13 +++---
 .../sf/briar/db/DatabaseComponentTest.java    | 44 +++++++++----------
 .../briar/protocol/ProtocolReadWriteTest.java | 12 ++---
 .../briar/protocol/writers/ConstantsTest.java | 15 ++++---
 .../batch/BatchConnectionReadWriteTest.java   |  2 +-
 24 files changed, 130 insertions(+), 177 deletions(-)
 rename api/net/sf/briar/api/protocol/{writers => }/MessageEncoder.java (85%)
 delete mode 100644 api/net/sf/briar/api/protocol/writers/AuthorWriter.java
 delete mode 100644 api/net/sf/briar/api/protocol/writers/GroupWriter.java
 rename api/net/sf/briar/api/protocol/writers/{SubscriptionWriter.java => SubscriptionUpdateWriter.java} (88%)
 rename api/net/sf/briar/api/protocol/writers/{TransportWriter.java => TransportUpdateWriter.java} (89%)
 delete mode 100644 components/net/sf/briar/protocol/writers/AuthorWriterImpl.java
 delete mode 100644 components/net/sf/briar/protocol/writers/GroupWriterImpl.java
 rename components/net/sf/briar/protocol/writers/{SubscriptionWriterImpl.java => SubscriptionUpdateWriterImpl.java} (60%)
 rename components/net/sf/briar/protocol/writers/{TransportWriterImpl.java => TransportUpdateWriterImpl.java} (80%)

diff --git a/api/net/sf/briar/api/db/DatabaseComponent.java b/api/net/sf/briar/api/db/DatabaseComponent.java
index 1e1402b1f1..857e6c1e5e 100644
--- a/api/net/sf/briar/api/db/DatabaseComponent.java
+++ b/api/net/sf/briar/api/db/DatabaseComponent.java
@@ -26,8 +26,8 @@ import net.sf.briar.api.protocol.writers.AckWriter;
 import net.sf.briar.api.protocol.writers.BatchWriter;
 import net.sf.briar.api.protocol.writers.OfferWriter;
 import net.sf.briar.api.protocol.writers.RequestWriter;
-import net.sf.briar.api.protocol.writers.SubscriptionWriter;
-import net.sf.briar.api.protocol.writers.TransportWriter;
+import net.sf.briar.api.protocol.writers.SubscriptionUpdateWriter;
+import net.sf.briar.api.protocol.writers.TransportUpdateWriter;
 import net.sf.briar.api.transport.ConnectionWindow;
 
 /**
@@ -102,12 +102,12 @@ public interface DatabaseComponent {
 	throws DbException, IOException;
 
 	/** Generates a subscription update for the given contact. */
-	void generateSubscriptionUpdate(ContactId c, SubscriptionWriter s) throws
-	DbException, IOException;
+	void generateSubscriptionUpdate(ContactId c, SubscriptionUpdateWriter s)
+	throws DbException, IOException;
 
 	/** Generates a transport update for the given contact. */
-	void generateTransportUpdate(ContactId c, TransportWriter t) throws
-	DbException, IOException;
+	void generateTransportUpdate(ContactId c, TransportUpdateWriter t)
+	throws DbException, IOException;
 
 	/** Returns the configuration for the given transport. */
 	TransportConfig getConfig(TransportId t) throws DbException;
diff --git a/api/net/sf/briar/api/protocol/writers/MessageEncoder.java b/api/net/sf/briar/api/protocol/MessageEncoder.java
similarity index 85%
rename from api/net/sf/briar/api/protocol/writers/MessageEncoder.java
rename to api/net/sf/briar/api/protocol/MessageEncoder.java
index bb144720ef..f587c0c1b2 100644
--- a/api/net/sf/briar/api/protocol/writers/MessageEncoder.java
+++ b/api/net/sf/briar/api/protocol/MessageEncoder.java
@@ -1,13 +1,9 @@
-package net.sf.briar.api.protocol.writers;
+package net.sf.briar.api.protocol;
 
 import java.io.IOException;
 import java.security.GeneralSecurityException;
 import java.security.PrivateKey;
 
-import net.sf.briar.api.protocol.Author;
-import net.sf.briar.api.protocol.Group;
-import net.sf.briar.api.protocol.Message;
-import net.sf.briar.api.protocol.MessageId;
 
 public interface MessageEncoder {
 
diff --git a/api/net/sf/briar/api/protocol/ProtocolConstants.java b/api/net/sf/briar/api/protocol/ProtocolConstants.java
index 29f31df899..7e23d247a0 100644
--- a/api/net/sf/briar/api/protocol/ProtocolConstants.java
+++ b/api/net/sf/briar/api/protocol/ProtocolConstants.java
@@ -12,10 +12,10 @@ public interface ProtocolConstants {
 	static final int MAX_PACKET_LENGTH =
 		TransportConstants.MIN_CONNECTION_LENGTH - 1024;
 
-	/** The maximum number of transport plugins a node may support. */
+	/** The maximum number of transports a node may support. */
 	static final int MAX_TRANSPORTS = 50;
 
-	/** The maximum number of properties per transport plugin. */
+	/** The maximum number of properties per transport. */
 	static final int MAX_PROPERTIES_PER_TRANSPORT = 100;
 
 	/** The maximum length of a property's key or value in UTF-8 bytes. */
@@ -27,7 +27,7 @@ public interface ProtocolConstants {
 	/** The maximum length of a group's name in UTF-8 bytes. */
 	static final int MAX_GROUP_NAME_LENGTH = 50;
 
-	/** The maximum length of a serialised public key in bytes. */
+	/** The maximum length of a public key in bytes. */
 	static final int MAX_PUBLIC_KEY_LENGTH = 100;
 
 	/** The maximum length of an author's name in UTF-8 bytes. */
diff --git a/api/net/sf/briar/api/protocol/writers/AuthorWriter.java b/api/net/sf/briar/api/protocol/writers/AuthorWriter.java
deleted file mode 100644
index 702b0963ce..0000000000
--- a/api/net/sf/briar/api/protocol/writers/AuthorWriter.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package net.sf.briar.api.protocol.writers;
-
-import java.io.IOException;
-
-import net.sf.briar.api.protocol.Author;
-import net.sf.briar.api.serial.Writer;
-
-public interface AuthorWriter {
-
-	void writeAuthor(Writer w, Author a) throws IOException;
-}
diff --git a/api/net/sf/briar/api/protocol/writers/GroupWriter.java b/api/net/sf/briar/api/protocol/writers/GroupWriter.java
deleted file mode 100644
index 40d595b1a7..0000000000
--- a/api/net/sf/briar/api/protocol/writers/GroupWriter.java
+++ /dev/null
@@ -1,11 +0,0 @@
-package net.sf.briar.api.protocol.writers;
-
-import java.io.IOException;
-
-import net.sf.briar.api.protocol.Group;
-import net.sf.briar.api.serial.Writer;
-
-public interface GroupWriter {
-
-	void writeGroup(Writer w, Group g) throws IOException;
-}
diff --git a/api/net/sf/briar/api/protocol/writers/ProtocolWriterFactory.java b/api/net/sf/briar/api/protocol/writers/ProtocolWriterFactory.java
index 480ac550b4..a0e88b4faa 100644
--- a/api/net/sf/briar/api/protocol/writers/ProtocolWriterFactory.java
+++ b/api/net/sf/briar/api/protocol/writers/ProtocolWriterFactory.java
@@ -12,7 +12,7 @@ public interface ProtocolWriterFactory {
 
 	RequestWriter createRequestWriter(OutputStream out);
 
-	SubscriptionWriter createSubscriptionWriter(OutputStream out);
+	SubscriptionUpdateWriter createSubscriptionUpdateWriter(OutputStream out);
 
-	TransportWriter createTransportWriter(OutputStream out);
+	TransportUpdateWriter createTransportUpdateWriter(OutputStream out);
 }
diff --git a/api/net/sf/briar/api/protocol/writers/SubscriptionWriter.java b/api/net/sf/briar/api/protocol/writers/SubscriptionUpdateWriter.java
similarity index 88%
rename from api/net/sf/briar/api/protocol/writers/SubscriptionWriter.java
rename to api/net/sf/briar/api/protocol/writers/SubscriptionUpdateWriter.java
index 2fd582caca..87c0ae5cd7 100644
--- a/api/net/sf/briar/api/protocol/writers/SubscriptionWriter.java
+++ b/api/net/sf/briar/api/protocol/writers/SubscriptionUpdateWriter.java
@@ -6,7 +6,7 @@ import java.util.Map;
 import net.sf.briar.api.protocol.Group;
 
 /** An interface for creating a subscription update. */
-public interface SubscriptionWriter {
+public interface SubscriptionUpdateWriter {
 
 	/** Writes the contents of the update. */
 	void writeSubscriptions(Map<Group, Long> subs, long timestamp)
diff --git a/api/net/sf/briar/api/protocol/writers/TransportWriter.java b/api/net/sf/briar/api/protocol/writers/TransportUpdateWriter.java
similarity index 89%
rename from api/net/sf/briar/api/protocol/writers/TransportWriter.java
rename to api/net/sf/briar/api/protocol/writers/TransportUpdateWriter.java
index fb5a88bffe..e3ea608380 100644
--- a/api/net/sf/briar/api/protocol/writers/TransportWriter.java
+++ b/api/net/sf/briar/api/protocol/writers/TransportUpdateWriter.java
@@ -6,7 +6,7 @@ import java.util.Collection;
 import net.sf.briar.api.protocol.Transport;
 
 /** An interface for creating a transport update. */
-public interface TransportWriter {
+public interface TransportUpdateWriter {
 
 	/** Writes the contents of the update. */
 	void writeTransports(Collection<Transport> transports, long timestamp)
diff --git a/components/net/sf/briar/db/DatabaseComponentImpl.java b/components/net/sf/briar/db/DatabaseComponentImpl.java
index 23b3ae4e14..f3a8281788 100644
--- a/components/net/sf/briar/db/DatabaseComponentImpl.java
+++ b/components/net/sf/briar/db/DatabaseComponentImpl.java
@@ -58,8 +58,8 @@ import net.sf.briar.api.protocol.writers.AckWriter;
 import net.sf.briar.api.protocol.writers.BatchWriter;
 import net.sf.briar.api.protocol.writers.OfferWriter;
 import net.sf.briar.api.protocol.writers.RequestWriter;
-import net.sf.briar.api.protocol.writers.SubscriptionWriter;
-import net.sf.briar.api.protocol.writers.TransportWriter;
+import net.sf.briar.api.protocol.writers.SubscriptionUpdateWriter;
+import net.sf.briar.api.protocol.writers.TransportUpdateWriter;
 import net.sf.briar.api.transport.ConnectionWindow;
 
 import com.google.inject.Inject;
@@ -602,8 +602,8 @@ DatabaseCleaner.Callback {
 		return sent;
 	}
 
-	public void generateSubscriptionUpdate(ContactId c, SubscriptionWriter s)
-	throws DbException, IOException {
+	public void generateSubscriptionUpdate(ContactId c,
+			SubscriptionUpdateWriter s) throws DbException, IOException {
 		Map<Group, Long> subs = null;
 		long timestamp = 0L;
 		contactLock.readLock().lock();
@@ -644,7 +644,7 @@ DatabaseCleaner.Callback {
 		return now - sent >= DatabaseConstants.MAX_UPDATE_INTERVAL;
 	}
 
-	public void generateTransportUpdate(ContactId c, TransportWriter t)
+	public void generateTransportUpdate(ContactId c, TransportUpdateWriter t)
 	throws DbException, IOException {
 		Collection<Transport> transports = null;
 		long timestamp = 0L;
diff --git a/components/net/sf/briar/protocol/MessageEncoderImpl.java b/components/net/sf/briar/protocol/MessageEncoderImpl.java
index 821e530166..5d5d68dd4f 100644
--- a/components/net/sf/briar/protocol/MessageEncoderImpl.java
+++ b/components/net/sf/briar/protocol/MessageEncoderImpl.java
@@ -14,12 +14,10 @@ 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.MessageEncoder;
 import net.sf.briar.api.protocol.MessageId;
 import net.sf.briar.api.protocol.ProtocolConstants;
 import net.sf.briar.api.protocol.Types;
-import net.sf.briar.api.protocol.writers.AuthorWriter;
-import net.sf.briar.api.protocol.writers.GroupWriter;
-import net.sf.briar.api.protocol.writers.MessageEncoder;
 import net.sf.briar.api.serial.Consumer;
 import net.sf.briar.api.serial.Writer;
 import net.sf.briar.api.serial.WriterFactory;
@@ -32,19 +30,14 @@ class MessageEncoderImpl implements MessageEncoder {
 	private final SecureRandom random;
 	private final MessageDigest messageDigest;
 	private final WriterFactory writerFactory;
-	private final AuthorWriter authorWriter;
-	private final GroupWriter groupWriter;
 
 	@Inject
-	MessageEncoderImpl(CryptoComponent crypto, WriterFactory writerFactory,
-			AuthorWriter authorWriter, GroupWriter groupWriter) {
+	MessageEncoderImpl(CryptoComponent crypto, WriterFactory writerFactory) {
 		authorSignature = crypto.getSignature();
 		groupSignature = crypto.getSignature();
 		random = crypto.getSecureRandom();
 		messageDigest = crypto.getMessageDigest();
 		this.writerFactory = writerFactory;
-		this.authorWriter = authorWriter;
-		this.groupWriter = groupWriter;
 	}
 
 	public Message encodeMessage(MessageId parent, String subject, byte[] body)
@@ -111,9 +104,9 @@ class MessageEncoderImpl implements MessageEncoder {
 		if(parent == null) w.writeNull();
 		else w.writeBytes(parent.getBytes());
 		if(group == null) w.writeNull();
-		else groupWriter.writeGroup(w, group);
+		else writeGroup(w, group);
 		if(author == null) w.writeNull();
-		else authorWriter.writeAuthor(w, author);
+		else writeAuthor(w, author);
 		w.writeString(subject);
 		long timestamp = System.currentTimeMillis();
 		w.writeInt64(timestamp);
@@ -151,4 +144,18 @@ class MessageEncoderImpl implements MessageEncoder {
 		return new MessageImpl(id, parent, groupId, authorId, subject,
 				timestamp, raw, bodyStart, body.length);
 	}
+
+	private void writeGroup(Writer w, Group g) throws IOException {
+		w.writeUserDefinedId(Types.GROUP);
+		w.writeString(g.getName());
+		byte[] publicKey = g.getPublicKey();
+		if(publicKey == null) w.writeNull();
+		else w.writeBytes(publicKey);
+	}
+
+	private void writeAuthor(Writer w, Author a) throws IOException {
+		w.writeUserDefinedId(Types.AUTHOR);
+		w.writeString(a.getName());
+		w.writeBytes(a.getPublicKey());
+	}
 }
diff --git a/components/net/sf/briar/protocol/ProtocolModule.java b/components/net/sf/briar/protocol/ProtocolModule.java
index aa9c033f25..b19a08f865 100644
--- a/components/net/sf/briar/protocol/ProtocolModule.java
+++ b/components/net/sf/briar/protocol/ProtocolModule.java
@@ -9,13 +9,13 @@ import net.sf.briar.api.protocol.BatchId;
 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.MessageEncoder;
 import net.sf.briar.api.protocol.MessageId;
 import net.sf.briar.api.protocol.Offer;
 import net.sf.briar.api.protocol.ProtocolReaderFactory;
 import net.sf.briar.api.protocol.Request;
 import net.sf.briar.api.protocol.SubscriptionUpdate;
 import net.sf.briar.api.protocol.TransportUpdate;
-import net.sf.briar.api.protocol.writers.MessageEncoder;
 import net.sf.briar.api.serial.ObjectReader;
 
 import com.google.inject.AbstractModule;
diff --git a/components/net/sf/briar/protocol/writers/AuthorWriterImpl.java b/components/net/sf/briar/protocol/writers/AuthorWriterImpl.java
deleted file mode 100644
index eb1d16e90a..0000000000
--- a/components/net/sf/briar/protocol/writers/AuthorWriterImpl.java
+++ /dev/null
@@ -1,17 +0,0 @@
-package net.sf.briar.protocol.writers;
-
-import java.io.IOException;
-
-import net.sf.briar.api.protocol.Author;
-import net.sf.briar.api.protocol.Types;
-import net.sf.briar.api.protocol.writers.AuthorWriter;
-import net.sf.briar.api.serial.Writer;
-
-class AuthorWriterImpl implements AuthorWriter {
-
-	public void writeAuthor(Writer w, Author a) throws IOException {
-		w.writeUserDefinedId(Types.AUTHOR);
-		w.writeString(a.getName());
-		w.writeBytes(a.getPublicKey());
-	}
-}
diff --git a/components/net/sf/briar/protocol/writers/GroupWriterImpl.java b/components/net/sf/briar/protocol/writers/GroupWriterImpl.java
deleted file mode 100644
index 44974a1f60..0000000000
--- a/components/net/sf/briar/protocol/writers/GroupWriterImpl.java
+++ /dev/null
@@ -1,19 +0,0 @@
-package net.sf.briar.protocol.writers;
-
-import java.io.IOException;
-
-import net.sf.briar.api.protocol.Group;
-import net.sf.briar.api.protocol.Types;
-import net.sf.briar.api.protocol.writers.GroupWriter;
-import net.sf.briar.api.serial.Writer;
-
-class GroupWriterImpl implements GroupWriter {
-
-	public void writeGroup(Writer w, Group g) throws IOException {
-		w.writeUserDefinedId(Types.GROUP);
-		w.writeString(g.getName());
-		byte[] publicKey = g.getPublicKey();
-		if(publicKey == null) w.writeNull();
-		else w.writeBytes(publicKey);
-	}
-}
diff --git a/components/net/sf/briar/protocol/writers/ProtocolWriterFactoryImpl.java b/components/net/sf/briar/protocol/writers/ProtocolWriterFactoryImpl.java
index b0e3647799..ed6b558448 100644
--- a/components/net/sf/briar/protocol/writers/ProtocolWriterFactoryImpl.java
+++ b/components/net/sf/briar/protocol/writers/ProtocolWriterFactoryImpl.java
@@ -9,8 +9,8 @@ import net.sf.briar.api.protocol.writers.BatchWriter;
 import net.sf.briar.api.protocol.writers.OfferWriter;
 import net.sf.briar.api.protocol.writers.ProtocolWriterFactory;
 import net.sf.briar.api.protocol.writers.RequestWriter;
-import net.sf.briar.api.protocol.writers.SubscriptionWriter;
-import net.sf.briar.api.protocol.writers.TransportWriter;
+import net.sf.briar.api.protocol.writers.SubscriptionUpdateWriter;
+import net.sf.briar.api.protocol.writers.TransportUpdateWriter;
 import net.sf.briar.api.serial.SerialComponent;
 import net.sf.briar.api.serial.WriterFactory;
 
@@ -46,11 +46,12 @@ class ProtocolWriterFactoryImpl implements ProtocolWriterFactory {
 		return new RequestWriterImpl(out, writerFactory);
 	}
 
-	public SubscriptionWriter createSubscriptionWriter(OutputStream out) {
-		return new SubscriptionWriterImpl(out, writerFactory);
+	public SubscriptionUpdateWriter createSubscriptionUpdateWriter(
+			OutputStream out) {
+		return new SubscriptionUpdateWriterImpl(out, writerFactory);
 	}
 
-	public TransportWriter createTransportWriter(OutputStream out) {
-		return new TransportWriterImpl(out, writerFactory);
+	public TransportUpdateWriter createTransportUpdateWriter(OutputStream out) {
+		return new TransportUpdateWriterImpl(out, writerFactory);
 	}
 }
diff --git a/components/net/sf/briar/protocol/writers/ProtocolWritersModule.java b/components/net/sf/briar/protocol/writers/ProtocolWritersModule.java
index 1afe708d9b..7e83b36b05 100644
--- a/components/net/sf/briar/protocol/writers/ProtocolWritersModule.java
+++ b/components/net/sf/briar/protocol/writers/ProtocolWritersModule.java
@@ -1,7 +1,5 @@
 package net.sf.briar.protocol.writers;
 
-import net.sf.briar.api.protocol.writers.AuthorWriter;
-import net.sf.briar.api.protocol.writers.GroupWriter;
 import net.sf.briar.api.protocol.writers.ProtocolWriterFactory;
 
 import com.google.inject.AbstractModule;
@@ -10,8 +8,6 @@ public class ProtocolWritersModule extends AbstractModule {
 
 	@Override
 	protected void configure() {
-		bind(AuthorWriter.class).to(AuthorWriterImpl.class);
-		bind(GroupWriter.class).to(GroupWriterImpl.class);
 		bind(ProtocolWriterFactory.class).to(ProtocolWriterFactoryImpl.class);
 	}
 }
diff --git a/components/net/sf/briar/protocol/writers/SubscriptionWriterImpl.java b/components/net/sf/briar/protocol/writers/SubscriptionUpdateWriterImpl.java
similarity index 60%
rename from components/net/sf/briar/protocol/writers/SubscriptionWriterImpl.java
rename to components/net/sf/briar/protocol/writers/SubscriptionUpdateWriterImpl.java
index cf1d8ff60c..1856d08e6f 100644
--- a/components/net/sf/briar/protocol/writers/SubscriptionWriterImpl.java
+++ b/components/net/sf/briar/protocol/writers/SubscriptionUpdateWriterImpl.java
@@ -7,21 +7,19 @@ import java.util.Map.Entry;
 
 import net.sf.briar.api.protocol.Group;
 import net.sf.briar.api.protocol.Types;
-import net.sf.briar.api.protocol.writers.GroupWriter;
-import net.sf.briar.api.protocol.writers.SubscriptionWriter;
+import net.sf.briar.api.protocol.writers.SubscriptionUpdateWriter;
 import net.sf.briar.api.serial.Writer;
 import net.sf.briar.api.serial.WriterFactory;
 
-class SubscriptionWriterImpl implements SubscriptionWriter {
+class SubscriptionUpdateWriterImpl implements SubscriptionUpdateWriter {
 
 	private final OutputStream out;
 	private final Writer w;
-	private final GroupWriter groupWriter;
 
-	SubscriptionWriterImpl(OutputStream out, WriterFactory writerFactory) {
+	SubscriptionUpdateWriterImpl(OutputStream out,
+			WriterFactory writerFactory) {
 		this.out = out;
 		w = writerFactory.createWriter(out);
-		groupWriter = new GroupWriterImpl();
 	}
 
 	public void writeSubscriptions(Map<Group, Long> subs, long timestamp)
@@ -29,11 +27,19 @@ class SubscriptionWriterImpl implements SubscriptionWriter {
 		w.writeUserDefinedId(Types.SUBSCRIPTION_UPDATE);
 		w.writeMapStart();
 		for(Entry<Group, Long> e : subs.entrySet()) {
-			groupWriter.writeGroup(w, e.getKey());
+			writeGroup(w, e.getKey());
 			w.writeInt64(e.getValue());
 		}
 		w.writeMapEnd();
 		w.writeInt64(timestamp);
 		out.flush();
 	}
+
+	private void writeGroup(Writer w, Group g) throws IOException {
+		w.writeUserDefinedId(Types.GROUP);
+		w.writeString(g.getName());
+		byte[] publicKey = g.getPublicKey();
+		if(publicKey == null) w.writeNull();
+		else w.writeBytes(publicKey);
+	}
 }
diff --git a/components/net/sf/briar/protocol/writers/TransportWriterImpl.java b/components/net/sf/briar/protocol/writers/TransportUpdateWriterImpl.java
similarity index 80%
rename from components/net/sf/briar/protocol/writers/TransportWriterImpl.java
rename to components/net/sf/briar/protocol/writers/TransportUpdateWriterImpl.java
index aa58385e49..dad8368356 100644
--- a/components/net/sf/briar/protocol/writers/TransportWriterImpl.java
+++ b/components/net/sf/briar/protocol/writers/TransportUpdateWriterImpl.java
@@ -6,16 +6,16 @@ import java.util.Collection;
 
 import net.sf.briar.api.protocol.Transport;
 import net.sf.briar.api.protocol.Types;
-import net.sf.briar.api.protocol.writers.TransportWriter;
+import net.sf.briar.api.protocol.writers.TransportUpdateWriter;
 import net.sf.briar.api.serial.Writer;
 import net.sf.briar.api.serial.WriterFactory;
 
-class TransportWriterImpl implements TransportWriter {
+class TransportUpdateWriterImpl implements TransportUpdateWriter {
 
 	private final OutputStream out;
 	private final Writer w;
 
-	TransportWriterImpl(OutputStream out, WriterFactory writerFactory) {
+	TransportUpdateWriterImpl(OutputStream out, WriterFactory writerFactory) {
 		this.out = out;
 		w = writerFactory.createWriter(out);
 	}
diff --git a/components/net/sf/briar/transport/batch/OutgoingBatchConnection.java b/components/net/sf/briar/transport/batch/OutgoingBatchConnection.java
index 59207076c3..810a4e7899 100644
--- a/components/net/sf/briar/transport/batch/OutgoingBatchConnection.java
+++ b/components/net/sf/briar/transport/batch/OutgoingBatchConnection.java
@@ -14,8 +14,8 @@ import net.sf.briar.api.protocol.TransportIndex;
 import net.sf.briar.api.protocol.writers.AckWriter;
 import net.sf.briar.api.protocol.writers.BatchWriter;
 import net.sf.briar.api.protocol.writers.ProtocolWriterFactory;
-import net.sf.briar.api.protocol.writers.SubscriptionWriter;
-import net.sf.briar.api.protocol.writers.TransportWriter;
+import net.sf.briar.api.protocol.writers.SubscriptionUpdateWriter;
+import net.sf.briar.api.protocol.writers.TransportUpdateWriter;
 import net.sf.briar.api.transport.BatchTransportWriter;
 import net.sf.briar.api.transport.ConnectionWriter;
 import net.sf.briar.api.transport.ConnectionWriterFactory;
@@ -56,13 +56,14 @@ class OutgoingBatchConnection {
 			long capacity = conn.getRemainingCapacity();
 			if(capacity < MAX_PACKET_LENGTH) throw new IOException();
 			// Write a transport update
-			TransportWriter t = protoFactory.createTransportWriter(out);
+			TransportUpdateWriter t =
+				protoFactory.createTransportUpdateWriter(out);
 			db.generateTransportUpdate(contactId, t);
 			// If there's space, write a subscription update
 			capacity = conn.getRemainingCapacity();
 			if(capacity >= MAX_PACKET_LENGTH) {
-				SubscriptionWriter s =
-					protoFactory.createSubscriptionWriter(out);
+				SubscriptionUpdateWriter s =
+					protoFactory.createSubscriptionUpdateWriter(out);
 				db.generateSubscriptionUpdate(contactId, s);
 			}
 			// Write acks until you can't write acks no more
diff --git a/components/net/sf/briar/transport/stream/StreamConnection.java b/components/net/sf/briar/transport/stream/StreamConnection.java
index 126e69c4b4..90d026b63b 100644
--- a/components/net/sf/briar/transport/stream/StreamConnection.java
+++ b/components/net/sf/briar/transport/stream/StreamConnection.java
@@ -36,8 +36,8 @@ import net.sf.briar.api.protocol.writers.BatchWriter;
 import net.sf.briar.api.protocol.writers.OfferWriter;
 import net.sf.briar.api.protocol.writers.ProtocolWriterFactory;
 import net.sf.briar.api.protocol.writers.RequestWriter;
-import net.sf.briar.api.protocol.writers.SubscriptionWriter;
-import net.sf.briar.api.protocol.writers.TransportWriter;
+import net.sf.briar.api.protocol.writers.SubscriptionUpdateWriter;
+import net.sf.briar.api.protocol.writers.TransportUpdateWriter;
 import net.sf.briar.api.transport.ConnectionReader;
 import net.sf.briar.api.transport.ConnectionReaderFactory;
 import net.sf.briar.api.transport.ConnectionWriter;
@@ -194,13 +194,13 @@ abstract class StreamConnection implements DatabaseListener {
 			OfferWriter offerWriter = protoWriterFactory.createOfferWriter(out);
 			RequestWriter requestWriter =
 				protoWriterFactory.createRequestWriter(out);
-			SubscriptionWriter subscriptionWriter =
-				protoWriterFactory.createSubscriptionWriter(out);
-			TransportWriter transportWriter =
-				protoWriterFactory.createTransportWriter(out);
+			SubscriptionUpdateWriter subscriptionUpdateWriter =
+				protoWriterFactory.createSubscriptionUpdateWriter(out);
+			TransportUpdateWriter transportUpdateWriter =
+				protoWriterFactory.createTransportUpdateWriter(out);
 			// Send the initial packets: transports, subs, any waiting acks
-			sendTransports(transportWriter);
-			sendSubscriptions(subscriptionWriter);
+			sendTransportUpdate(transportUpdateWriter);
+			sendSubscriptionUpdate(subscriptionUpdateWriter);
 			sendAcks(ackWriter);
 			State state = State.SEND_OFFER;
 			// Main loop
@@ -234,10 +234,10 @@ abstract class StreamConnection implements DatabaseListener {
 						return;
 					}
 					if((flags & Flags.TRANSPORTS_UPDATED) != 0) {
-						sendTransports(transportWriter);
+						sendTransportUpdate(transportUpdateWriter);
 					}
 					if((flags & Flags.SUBSCRIPTIONS_UPDATED) != 0) {
-						sendSubscriptions(subscriptionWriter);
+						sendSubscriptionUpdate(subscriptionUpdateWriter);
 					}
 					if((flags & Flags.BATCH_RECEIVED) != 0) {
 						sendAcks(ackWriter);
@@ -274,10 +274,10 @@ abstract class StreamConnection implements DatabaseListener {
 						return;
 					}
 					if((flags & Flags.TRANSPORTS_UPDATED) != 0) {
-						sendTransports(transportWriter);
+						sendTransportUpdate(transportUpdateWriter);
 					}
 					if((flags & Flags.SUBSCRIPTIONS_UPDATED) != 0) {
-						sendSubscriptions(subscriptionWriter);
+						sendSubscriptionUpdate(subscriptionUpdateWriter);
 					}
 					if((flags & Flags.BATCH_RECEIVED) != 0) {
 						sendAcks(ackWriter);
@@ -305,10 +305,10 @@ abstract class StreamConnection implements DatabaseListener {
 						return;
 					}
 					if((flags & Flags.TRANSPORTS_UPDATED) != 0) {
-						sendTransports(transportWriter);
+						sendTransportUpdate(transportUpdateWriter);
 					}
 					if((flags & Flags.SUBSCRIPTIONS_UPDATED) != 0) {
-						sendSubscriptions(subscriptionWriter);
+						sendSubscriptionUpdate(subscriptionUpdateWriter);
 					}
 					if((flags & Flags.BATCH_RECEIVED) != 0) {
 						sendAcks(ackWriter);
@@ -388,13 +388,13 @@ abstract class StreamConnection implements DatabaseListener {
 		db.receiveOffer(contactId, o, r);
 	}
 
-	private void sendTransports(TransportWriter t) throws DbException,
-	IOException {
+	private void sendTransportUpdate(TransportUpdateWriter t)
+	throws DbException, IOException {
 		db.generateTransportUpdate(contactId, t);
 	}
 
-	private void sendSubscriptions(SubscriptionWriter s) throws DbException,
-	IOException {
+	private void sendSubscriptionUpdate(SubscriptionUpdateWriter s)
+	throws DbException, IOException {
 		db.generateSubscriptionUpdate(contactId, s);
 	}
 }
diff --git a/test/net/sf/briar/ProtocolIntegrationTest.java b/test/net/sf/briar/ProtocolIntegrationTest.java
index 9f47b2af65..262625603d 100644
--- a/test/net/sf/briar/ProtocolIntegrationTest.java
+++ b/test/net/sf/briar/ProtocolIntegrationTest.java
@@ -24,6 +24,7 @@ import net.sf.briar.api.protocol.BatchId;
 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.MessageEncoder;
 import net.sf.briar.api.protocol.MessageId;
 import net.sf.briar.api.protocol.Offer;
 import net.sf.briar.api.protocol.ProtocolReader;
@@ -37,12 +38,11 @@ import net.sf.briar.api.protocol.TransportUpdate;
 import net.sf.briar.api.protocol.UniqueId;
 import net.sf.briar.api.protocol.writers.AckWriter;
 import net.sf.briar.api.protocol.writers.BatchWriter;
-import net.sf.briar.api.protocol.writers.MessageEncoder;
 import net.sf.briar.api.protocol.writers.OfferWriter;
 import net.sf.briar.api.protocol.writers.ProtocolWriterFactory;
 import net.sf.briar.api.protocol.writers.RequestWriter;
-import net.sf.briar.api.protocol.writers.SubscriptionWriter;
-import net.sf.briar.api.protocol.writers.TransportWriter;
+import net.sf.briar.api.protocol.writers.SubscriptionUpdateWriter;
+import net.sf.briar.api.protocol.writers.TransportUpdateWriter;
 import net.sf.briar.api.transport.ConnectionReader;
 import net.sf.briar.api.transport.ConnectionReaderFactory;
 import net.sf.briar.api.transport.ConnectionWriter;
@@ -167,15 +167,16 @@ public class ProtocolIntegrationTest extends TestCase {
 		requested.set(3);
 		r.writeRequest(requested, 4);
 
-		SubscriptionWriter s =
-			protocolWriterFactory.createSubscriptionWriter(out1);
+		SubscriptionUpdateWriter s =
+			protocolWriterFactory.createSubscriptionUpdateWriter(out1);
 		// Use a LinkedHashMap for predictable iteration order
 		Map<Group, Long> subs = new LinkedHashMap<Group, Long>();
 		subs.put(group, 0L);
 		subs.put(group1, 0L);
 		s.writeSubscriptions(subs, timestamp);
 
-		TransportWriter t = protocolWriterFactory.createTransportWriter(out1);
+		TransportUpdateWriter t =
+			protocolWriterFactory.createTransportUpdateWriter(out1);
 		t.writeTransports(transports, timestamp);
 
 		out1.close();
diff --git a/test/net/sf/briar/db/DatabaseComponentTest.java b/test/net/sf/briar/db/DatabaseComponentTest.java
index 8cabf9a2c1..cf68411585 100644
--- a/test/net/sf/briar/db/DatabaseComponentTest.java
+++ b/test/net/sf/briar/db/DatabaseComponentTest.java
@@ -40,8 +40,8 @@ import net.sf.briar.api.protocol.writers.AckWriter;
 import net.sf.briar.api.protocol.writers.BatchWriter;
 import net.sf.briar.api.protocol.writers.OfferWriter;
 import net.sf.briar.api.protocol.writers.RequestWriter;
-import net.sf.briar.api.protocol.writers.SubscriptionWriter;
-import net.sf.briar.api.protocol.writers.TransportWriter;
+import net.sf.briar.api.protocol.writers.SubscriptionUpdateWriter;
+import net.sf.briar.api.protocol.writers.TransportUpdateWriter;
 import net.sf.briar.api.transport.ConnectionWindow;
 
 import org.jmock.Expectations;
@@ -488,10 +488,10 @@ public abstract class DatabaseComponentTest extends TestCase {
 		final AckWriter ackWriter = context.mock(AckWriter.class);
 		final BatchWriter batchWriter = context.mock(BatchWriter.class);
 		final OfferWriter offerWriter = context.mock(OfferWriter.class);
-		final SubscriptionWriter subscriptionWriter =
-			context.mock(SubscriptionWriter.class);
-		final TransportWriter transportWriter =
-			context.mock(TransportWriter.class);
+		final SubscriptionUpdateWriter subscriptionUpdateWriter =
+			context.mock(SubscriptionUpdateWriter.class);
+		final TransportUpdateWriter transportUpdateWriter =
+			context.mock(TransportUpdateWriter.class);
 		final Ack ack = context.mock(Ack.class);
 		final Batch batch = context.mock(Batch.class);
 		final Offer offer = context.mock(Offer.class);
@@ -537,12 +537,12 @@ public abstract class DatabaseComponentTest extends TestCase {
 		} catch(NoSuchContactException expected) {}
 
 		try {
-			db.generateSubscriptionUpdate(contactId, subscriptionWriter);
+			db.generateSubscriptionUpdate(contactId, subscriptionUpdateWriter);
 			fail();
 		} catch(NoSuchContactException expected) {}
 
 		try {
-			db.generateTransportUpdate(contactId, transportWriter);
+			db.generateTransportUpdate(contactId, transportUpdateWriter);
 			fail();
 		} catch(NoSuchContactException expected) {}
 
@@ -771,8 +771,8 @@ public abstract class DatabaseComponentTest extends TestCase {
 		@SuppressWarnings("unchecked")
 		final Database<Object> database = context.mock(Database.class);
 		final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
-		final SubscriptionWriter subscriptionWriter =
-			context.mock(SubscriptionWriter.class);
+		final SubscriptionUpdateWriter subscriptionUpdateWriter =
+			context.mock(SubscriptionUpdateWriter.class);
 		context.checking(new Expectations() {{
 			allowing(database).startTransaction();
 			will(returnValue(txn));
@@ -787,7 +787,7 @@ public abstract class DatabaseComponentTest extends TestCase {
 		}});
 		DatabaseComponent db = createDatabaseComponent(database, cleaner);
 
-		db.generateSubscriptionUpdate(contactId, subscriptionWriter);
+		db.generateSubscriptionUpdate(contactId, subscriptionUpdateWriter);
 
 		context.assertIsSatisfied();
 	}
@@ -802,8 +802,8 @@ public abstract class DatabaseComponentTest extends TestCase {
 		@SuppressWarnings("unchecked")
 		final Database<Object> database = context.mock(Database.class);
 		final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
-		final SubscriptionWriter subscriptionWriter =
-			context.mock(SubscriptionWriter.class);
+		final SubscriptionUpdateWriter subscriptionUpdateWriter =
+			context.mock(SubscriptionUpdateWriter.class);
 		context.checking(new Expectations() {{
 			allowing(database).startTransaction();
 			will(returnValue(txn));
@@ -821,13 +821,13 @@ public abstract class DatabaseComponentTest extends TestCase {
 			oneOf(database).setSubscriptionsSent(with(txn), with(contactId),
 					with(any(long.class)));
 			// Add the subscriptions to the writer
-			oneOf(subscriptionWriter).writeSubscriptions(
+			oneOf(subscriptionUpdateWriter).writeSubscriptions(
 					with(Collections.singletonMap(group, 0L)),
 					with(any(long.class)));
 		}});
 		DatabaseComponent db = createDatabaseComponent(database, cleaner);
 
-		db.generateSubscriptionUpdate(contactId, subscriptionWriter);
+		db.generateSubscriptionUpdate(contactId, subscriptionUpdateWriter);
 
 		context.assertIsSatisfied();
 	}
@@ -839,8 +839,8 @@ public abstract class DatabaseComponentTest extends TestCase {
 		@SuppressWarnings("unchecked")
 		final Database<Object> database = context.mock(Database.class);
 		final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
-		final TransportWriter transportWriter =
-			context.mock(TransportWriter.class);
+		final TransportUpdateWriter transportUpdateWriter =
+			context.mock(TransportUpdateWriter.class);
 		context.checking(new Expectations() {{
 			allowing(database).startTransaction();
 			will(returnValue(txn));
@@ -855,7 +855,7 @@ public abstract class DatabaseComponentTest extends TestCase {
 		}});
 		DatabaseComponent db = createDatabaseComponent(database, cleaner);
 
-		db.generateTransportUpdate(contactId, transportWriter);
+		db.generateTransportUpdate(contactId, transportUpdateWriter);
 
 		context.assertIsSatisfied();
 	}
@@ -870,8 +870,8 @@ public abstract class DatabaseComponentTest extends TestCase {
 		@SuppressWarnings("unchecked")
 		final Database<Object> database = context.mock(Database.class);
 		final DatabaseCleaner cleaner = context.mock(DatabaseCleaner.class);
-		final TransportWriter transportWriter =
-			context.mock(TransportWriter.class);
+		final TransportUpdateWriter transportUpdateWriter =
+			context.mock(TransportUpdateWriter.class);
 		context.checking(new Expectations() {{
 			allowing(database).startTransaction();
 			will(returnValue(txn));
@@ -889,12 +889,12 @@ public abstract class DatabaseComponentTest extends TestCase {
 			oneOf(database).setTransportsSent(with(txn), with(contactId),
 					with(any(long.class)));
 			// Add the properties to the writer
-			oneOf(transportWriter).writeTransports(with(transports),
+			oneOf(transportUpdateWriter).writeTransports(with(transports),
 					with(any(long.class)));
 		}});
 		DatabaseComponent db = createDatabaseComponent(database, cleaner);
 
-		db.generateTransportUpdate(contactId, transportWriter);
+		db.generateTransportUpdate(contactId, transportUpdateWriter);
 
 		context.assertIsSatisfied();
 	}
diff --git a/test/net/sf/briar/protocol/ProtocolReadWriteTest.java b/test/net/sf/briar/protocol/ProtocolReadWriteTest.java
index 5efbfdc1aa..d196ab368f 100644
--- a/test/net/sf/briar/protocol/ProtocolReadWriteTest.java
+++ b/test/net/sf/briar/protocol/ProtocolReadWriteTest.java
@@ -15,6 +15,7 @@ import net.sf.briar.api.protocol.BatchId;
 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.MessageEncoder;
 import net.sf.briar.api.protocol.Offer;
 import net.sf.briar.api.protocol.ProtocolReader;
 import net.sf.briar.api.protocol.ProtocolReaderFactory;
@@ -26,12 +27,11 @@ import net.sf.briar.api.protocol.TransportIndex;
 import net.sf.briar.api.protocol.TransportUpdate;
 import net.sf.briar.api.protocol.writers.AckWriter;
 import net.sf.briar.api.protocol.writers.BatchWriter;
-import net.sf.briar.api.protocol.writers.MessageEncoder;
 import net.sf.briar.api.protocol.writers.OfferWriter;
 import net.sf.briar.api.protocol.writers.ProtocolWriterFactory;
 import net.sf.briar.api.protocol.writers.RequestWriter;
-import net.sf.briar.api.protocol.writers.SubscriptionWriter;
-import net.sf.briar.api.protocol.writers.TransportWriter;
+import net.sf.briar.api.protocol.writers.SubscriptionUpdateWriter;
+import net.sf.briar.api.protocol.writers.TransportUpdateWriter;
 import net.sf.briar.crypto.CryptoModule;
 import net.sf.briar.protocol.writers.ProtocolWritersModule;
 import net.sf.briar.serial.SerialModule;
@@ -99,10 +99,12 @@ public class ProtocolReadWriteTest extends TestCase {
 		RequestWriter r = writerFactory.createRequestWriter(out);
 		r.writeRequest(bitSet, 10);
 
-		SubscriptionWriter s = writerFactory.createSubscriptionWriter(out);
+		SubscriptionUpdateWriter s =
+			writerFactory.createSubscriptionUpdateWriter(out);
 		s.writeSubscriptions(subscriptions, timestamp);
 
-		TransportWriter t = writerFactory.createTransportWriter(out);
+		TransportUpdateWriter t =
+			writerFactory.createTransportUpdateWriter(out);
 		t.writeTransports(transports, timestamp);
 
 		// Read
diff --git a/test/net/sf/briar/protocol/writers/ConstantsTest.java b/test/net/sf/briar/protocol/writers/ConstantsTest.java
index d158040b39..387cd6d1e6 100644
--- a/test/net/sf/briar/protocol/writers/ConstantsTest.java
+++ b/test/net/sf/briar/protocol/writers/ConstantsTest.java
@@ -27,6 +27,7 @@ import net.sf.briar.api.protocol.BatchId;
 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.MessageEncoder;
 import net.sf.briar.api.protocol.MessageId;
 import net.sf.briar.api.protocol.Transport;
 import net.sf.briar.api.protocol.TransportId;
@@ -34,10 +35,9 @@ import net.sf.briar.api.protocol.TransportIndex;
 import net.sf.briar.api.protocol.UniqueId;
 import net.sf.briar.api.protocol.writers.AckWriter;
 import net.sf.briar.api.protocol.writers.BatchWriter;
-import net.sf.briar.api.protocol.writers.MessageEncoder;
 import net.sf.briar.api.protocol.writers.OfferWriter;
-import net.sf.briar.api.protocol.writers.SubscriptionWriter;
-import net.sf.briar.api.protocol.writers.TransportWriter;
+import net.sf.briar.api.protocol.writers.SubscriptionUpdateWriter;
+import net.sf.briar.api.protocol.writers.TransportUpdateWriter;
 import net.sf.briar.api.serial.SerialComponent;
 import net.sf.briar.api.serial.WriterFactory;
 import net.sf.briar.crypto.CryptoModule;
@@ -61,8 +61,7 @@ public class ConstantsTest extends TestCase {
 	public ConstantsTest() throws Exception {
 		super();
 		Injector i = Guice.createInjector(new CryptoModule(),
-				new ProtocolModule(), new ProtocolWritersModule(),
-				new SerialModule());
+				new ProtocolModule(), new SerialModule());
 		writerFactory = i.getInstance(WriterFactory.class);
 		crypto = i.getInstance(CryptoComponent.class);
 		serial = i.getInstance(SerialComponent.class);
@@ -191,7 +190,8 @@ public class ConstantsTest extends TestCase {
 		// Add the subscriptions to an update
 		ByteArrayOutputStream out =
 			new ByteArrayOutputStream(MAX_PACKET_LENGTH);
-		SubscriptionWriter s = new SubscriptionWriterImpl(out, writerFactory);
+		SubscriptionUpdateWriter s =
+			new SubscriptionUpdateWriterImpl(out, writerFactory);
 		s.writeSubscriptions(subs, Long.MAX_VALUE);
 		// Check the size of the serialised update
 		assertTrue(out.size() > MAX_GROUPS *
@@ -218,7 +218,8 @@ public class ConstantsTest extends TestCase {
 		// Add the transports to an update
 		ByteArrayOutputStream out =
 			new ByteArrayOutputStream(MAX_PACKET_LENGTH);
-		TransportWriter t = new TransportWriterImpl(out, writerFactory);
+		TransportUpdateWriter t =
+			new TransportUpdateWriterImpl(out, writerFactory);
 		t.writeTransports(transports, Long.MAX_VALUE);
 		// Check the size of the serialised update
 		assertTrue(out.size() > MAX_TRANSPORTS * (UniqueId.LENGTH + 4 +
diff --git a/test/net/sf/briar/transport/batch/BatchConnectionReadWriteTest.java b/test/net/sf/briar/transport/batch/BatchConnectionReadWriteTest.java
index c3e17d8d31..74b739f891 100644
--- a/test/net/sf/briar/transport/batch/BatchConnectionReadWriteTest.java
+++ b/test/net/sf/briar/transport/batch/BatchConnectionReadWriteTest.java
@@ -19,12 +19,12 @@ import net.sf.briar.api.db.event.DatabaseEvent;
 import net.sf.briar.api.db.event.DatabaseListener;
 import net.sf.briar.api.db.event.MessagesAddedEvent;
 import net.sf.briar.api.protocol.Message;
+import net.sf.briar.api.protocol.MessageEncoder;
 import net.sf.briar.api.protocol.ProtocolReaderFactory;
 import net.sf.briar.api.protocol.Transport;
 import net.sf.briar.api.protocol.TransportId;
 import net.sf.briar.api.protocol.TransportIndex;
 import net.sf.briar.api.protocol.TransportUpdate;
-import net.sf.briar.api.protocol.writers.MessageEncoder;
 import net.sf.briar.api.protocol.writers.ProtocolWriterFactory;
 import net.sf.briar.api.transport.BatchTransportReader;
 import net.sf.briar.api.transport.BatchTransportWriter;
-- 
GitLab