diff --git a/components/net/sf/briar/protocol/writers/AckWriterImpl.java b/components/net/sf/briar/protocol/writers/AckWriterImpl.java
index a3babc533eb44d6c4ee32681ba906c38081d3f1e..2da1a1cece1614e8aae34890304745029985eea7 100644
--- a/components/net/sf/briar/protocol/writers/AckWriterImpl.java
+++ b/components/net/sf/briar/protocol/writers/AckWriterImpl.java
@@ -14,7 +14,7 @@ import net.sf.briar.api.serial.WriterFactory;
 class AckWriterImpl implements AckWriter {
 
 	private final OutputStream out;
-	private final SerialComponent serial;
+	private final int headerLength, idLength, footerLength;
 	private final Writer w;
 
 	private boolean started = false;
@@ -23,17 +23,19 @@ class AckWriterImpl implements AckWriter {
 	AckWriterImpl(OutputStream out, SerialComponent serial,
 			WriterFactory writerFactory) {
 		this.out = out;
-		this.serial = serial;
+		headerLength = serial.getSerialisedUserDefinedIdLength(Types.ACK)
+		+ serial.getSerialisedListStartLength();
+		idLength = serial.getSerialisedUniqueIdLength(Types.BATCH_ID);
+		footerLength = serial.getSerialisedListEndLength();
 		w = writerFactory.createWriter(out);
 	}
 
 	public boolean writeBatchId(BatchId b) throws IOException {
+		int overhead = started ? footerLength : headerLength + footerLength;
+		if(capacity < idLength + overhead) return false;
 		if(!started) start();
-		int length = serial.getSerialisedUniqueIdLength(Types.BATCH_ID);
-		if(capacity < length + serial.getSerialisedListEndLength())
-			return false;
 		b.writeTo(w);
-		capacity -= length;
+		capacity -= idLength;
 		return true;
 	}
 
@@ -47,9 +49,8 @@ class AckWriterImpl implements AckWriter {
 
 	private void start() throws IOException {
 		w.writeUserDefinedTag(Types.ACK);
-		capacity -= serial.getSerialisedUserDefinedIdLength(Types.ACK);
 		w.writeListStart();
-		capacity -= serial.getSerialisedListStartLength();
+		capacity -= headerLength;
 		started = true;
 	}
 }
diff --git a/components/net/sf/briar/protocol/writers/BatchWriterImpl.java b/components/net/sf/briar/protocol/writers/BatchWriterImpl.java
index 99e668bc5155d0d6584abcac4cfeb1312f61c1df..96c982e6a8c5be2a62e7adf6aaac3529261a1966 100644
--- a/components/net/sf/briar/protocol/writers/BatchWriterImpl.java
+++ b/components/net/sf/briar/protocol/writers/BatchWriterImpl.java
@@ -16,7 +16,7 @@ import net.sf.briar.api.serial.WriterFactory;
 class BatchWriterImpl implements BatchWriter {
 
 	private final DigestOutputStream out;
-	private final SerialComponent serial;
+	private final int headerLength, footerLength;
 	private final Writer w;
 	private final MessageDigest messageDigest;
 
@@ -26,15 +26,17 @@ class BatchWriterImpl implements BatchWriter {
 	BatchWriterImpl(OutputStream out, SerialComponent serial,
 			WriterFactory writerFactory, MessageDigest messageDigest) {
 		this.out = new DigestOutputStream(out, messageDigest);
-		this.serial = serial;
+		headerLength = serial.getSerialisedUserDefinedIdLength(Types.BATCH)
+		+ serial.getSerialisedListStartLength();
+		footerLength = serial.getSerialisedListEndLength();
 		w = writerFactory.createWriter(this.out);
 		this.messageDigest = messageDigest;
 	}
 
 	public boolean writeMessage(byte[] message) throws IOException {
+		int overhead = started ? footerLength : headerLength + footerLength;
+		if(capacity < message.length + overhead) return false;
 		if(!started) start();
-		if(capacity < message.length + serial.getSerialisedListEndLength())
-			return false;
 		// Bypass the writer and write the raw message directly
 		out.write(message);
 		capacity -= message.length;
@@ -53,9 +55,8 @@ class BatchWriterImpl implements BatchWriter {
 	private void start() throws IOException {
 		messageDigest.reset();
 		w.writeUserDefinedTag(Types.BATCH);
-		capacity -= serial.getSerialisedUserDefinedIdLength(Types.BATCH);
 		w.writeListStart();
-		capacity -= serial.getSerialisedListStartLength();
+		capacity -= headerLength;
 		started = true;
 	}
 }
diff --git a/components/net/sf/briar/protocol/writers/OfferWriterImpl.java b/components/net/sf/briar/protocol/writers/OfferWriterImpl.java
index 13baf0258567c5d5b66e94df16e788c47064f2af..40a9221afabf6bf5a2b89427ac8a13a8cd64f1af 100644
--- a/components/net/sf/briar/protocol/writers/OfferWriterImpl.java
+++ b/components/net/sf/briar/protocol/writers/OfferWriterImpl.java
@@ -14,7 +14,7 @@ import net.sf.briar.api.serial.WriterFactory;
 class OfferWriterImpl implements OfferWriter {
 
 	private final OutputStream out;
-	private final SerialComponent serial;
+	private final int headerLength, idLength, footerLength;
 	private final Writer w;
 
 	private boolean started = false;
@@ -23,17 +23,19 @@ class OfferWriterImpl implements OfferWriter {
 	OfferWriterImpl(OutputStream out, SerialComponent serial,
 			WriterFactory writerFactory) {
 		this.out = out;
-		this.serial = serial;
+		headerLength = serial.getSerialisedUserDefinedIdLength(Types.OFFER)
+		+ serial.getSerialisedListStartLength();
+		idLength = serial.getSerialisedUniqueIdLength(Types.MESSAGE_ID);
+		footerLength = serial.getSerialisedListEndLength();
 		w = writerFactory.createWriter(out);
 	}
 
 	public boolean writeMessageId(MessageId m) throws IOException {
+		int overhead = started ? footerLength : headerLength + footerLength;
+		if(capacity < idLength + overhead) return false;
 		if(!started) start();
-		int length = serial.getSerialisedUniqueIdLength(Types.MESSAGE_ID);
-		if(capacity <  length + serial.getSerialisedListEndLength())
-			return false;
 		m.writeTo(w);
-		capacity -= length;
+		capacity -= idLength;
 		return true;
 	}
 
@@ -48,6 +50,7 @@ class OfferWriterImpl implements OfferWriter {
 	private void start() throws IOException {
 		w.writeUserDefinedTag(Types.OFFER);
 		w.writeListStart();
+		capacity -= headerLength;
 		started = true;
 	}
 }