diff --git a/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothTransportConnection.java b/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothTransportConnection.java
index 1fa460cf61a00354e83d855b5d4d889aba9e0a37..bc365fcf78e6185565ec68088313e18a721b2375 100644
--- a/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothTransportConnection.java
+++ b/briar-android/src/org/briarproject/plugins/droidtooth/DroidtoothTransportConnection.java
@@ -34,10 +34,6 @@ class DroidtoothTransportConnection implements DuplexTransportConnection {
 		return socket.getOutputStream();
 	}
 
-	public boolean shouldFlush() {
-		return true;
-	}
-
 	public void dispose(boolean exception, boolean recognised)
 			throws IOException {
 		socket.close();
diff --git a/briar-android/src/org/briarproject/plugins/tor/TorTransportConnection.java b/briar-android/src/org/briarproject/plugins/tor/TorTransportConnection.java
index b211316a993988bf8bc979b54c3931eb870e88ac..14c490d1877f20fda3954724e9630998bee9494d 100644
--- a/briar-android/src/org/briarproject/plugins/tor/TorTransportConnection.java
+++ b/briar-android/src/org/briarproject/plugins/tor/TorTransportConnection.java
@@ -34,10 +34,6 @@ class TorTransportConnection implements DuplexTransportConnection {
 		return socket.getOutputStream();
 	}
 
-	public boolean shouldFlush() {
-		return true;
-	}
-
 	public void dispose(boolean exception, boolean recognised)
 			throws IOException {
 		socket.close();
diff --git a/briar-api/src/org/briarproject/api/messaging/PacketWriter.java b/briar-api/src/org/briarproject/api/messaging/PacketWriter.java
index d5d787a19586cb8510a3ecbc47ddbf9a8e7c9453..f76c45414863213a00743c08f4ad6bbfe9f0589c 100644
--- a/briar-api/src/org/briarproject/api/messaging/PacketWriter.java
+++ b/briar-api/src/org/briarproject/api/messaging/PacketWriter.java
@@ -4,6 +4,8 @@ import java.io.IOException;
 
 public interface PacketWriter {
 
+	int getMaxMessagesForAck(long capacity);
+
 	int getMaxMessagesForRequest(long capacity);
 
 	int getMaxMessagesForOffer(long capacity);
diff --git a/briar-api/src/org/briarproject/api/plugins/duplex/DuplexTransportConnection.java b/briar-api/src/org/briarproject/api/plugins/duplex/DuplexTransportConnection.java
index 2acab4cf1abb18a1644fc4ab3c9276d254bf33c8..7193c0849ae8f57a2fe04b701bc4d2c567e0b35d 100644
--- a/briar-api/src/org/briarproject/api/plugins/duplex/DuplexTransportConnection.java
+++ b/briar-api/src/org/briarproject/api/plugins/duplex/DuplexTransportConnection.java
@@ -23,11 +23,6 @@ public interface DuplexTransportConnection {
 	/** Returns an output stream for writing to the connection. */
 	OutputStream getOutputStream() throws IOException;
 
-	/**
-	 * Returns true if the output stream should be flushed after each packet.
-	 */
-	boolean shouldFlush();
-
 	/**
 	 * Closes the connection and disposes of any associated resources. The
 	 * first argument indicates whether the connection is being closed because
diff --git a/briar-api/src/org/briarproject/api/plugins/simplex/SimplexTransportWriter.java b/briar-api/src/org/briarproject/api/plugins/simplex/SimplexTransportWriter.java
index 76fb20d3f248db28523383d428d28970029f0107..0b50a7898126c235ed784e7499a83705dd0ce73d 100644
--- a/briar-api/src/org/briarproject/api/plugins/simplex/SimplexTransportWriter.java
+++ b/briar-api/src/org/briarproject/api/plugins/simplex/SimplexTransportWriter.java
@@ -21,11 +21,6 @@ public interface SimplexTransportWriter {
 	/** Returns an output stream for writing to the transport. */
 	OutputStream getOutputStream() throws IOException;
 
-	/**
-	 * Returns true if the output stream should be flushed after each packet.
-	 */
-	boolean shouldFlush();
-
 	/**
 	 * Closes the writer and disposes of any associated resources. The
 	 * argument indicates whether the writer is being closed because of an
diff --git a/briar-core/src/org/briarproject/messaging/PacketWriterFactoryImpl.java b/briar-core/src/org/briarproject/messaging/PacketWriterFactoryImpl.java
index dbe4f4613ced7d1c6ae9596cff59a09fd7692448..4c14ef1afbf03fc0ae67cfe9690b05cf3870b4b0 100644
--- a/briar-core/src/org/briarproject/messaging/PacketWriterFactoryImpl.java
+++ b/briar-core/src/org/briarproject/messaging/PacketWriterFactoryImpl.java
@@ -21,8 +21,7 @@ class PacketWriterFactoryImpl implements PacketWriterFactory {
 		this.writerFactory = writerFactory;
 	}
 
-	public PacketWriter createPacketWriter(OutputStream out,
-			boolean flush) {
+	public PacketWriter createPacketWriter(OutputStream out, boolean flush) {
 		return new PacketWriterImpl(serial, writerFactory, out, flush);
 	}
 }
diff --git a/briar-core/src/org/briarproject/messaging/PacketWriterImpl.java b/briar-core/src/org/briarproject/messaging/PacketWriterImpl.java
index 671cc3d7e9848a720f2818a38ad801bf659136c7..bb11ddd459dc852376691678e192d131c2c52c35 100644
--- a/briar-core/src/org/briarproject/messaging/PacketWriterImpl.java
+++ b/briar-core/src/org/briarproject/messaging/PacketWriterImpl.java
@@ -47,19 +47,21 @@ class PacketWriterImpl implements PacketWriter {
 		w = writerFactory.createWriter(out);
 	}
 
+	public int getMaxMessagesForAck(long capacity) {
+		return getMaxMessagesForPacket(capacity, ACK);
+	}
+
 	public int getMaxMessagesForRequest(long capacity) {
-		int packet = (int) Math.min(capacity, MAX_PACKET_LENGTH);
-		int overhead = serial.getSerialisedStructStartLength(ACK)
-				+ serial.getSerialisedListStartLength()
-				+ serial.getSerialisedListEndLength()
-				+ serial.getSerialisedStructEndLength();
-		int idLength = serial.getSerialisedUniqueIdLength();
-		return (packet - overhead) / idLength;
+		return getMaxMessagesForPacket(capacity, REQUEST);
 	}
 
 	public int getMaxMessagesForOffer(long capacity) {
+		return getMaxMessagesForPacket(capacity, OFFER);
+	}
+
+	private int getMaxMessagesForPacket(long capacity, int structId) {
 		int packet = (int) Math.min(capacity, MAX_PACKET_LENGTH);
-		int overhead = serial.getSerialisedStructStartLength(OFFER)
+		int overhead = serial.getSerialisedStructStartLength(structId)
 				+ serial.getSerialisedListStartLength()
 				+ serial.getSerialisedListEndLength()
 				+ serial.getSerialisedStructEndLength();
diff --git a/briar-core/src/org/briarproject/messaging/duplex/DuplexConnection.java b/briar-core/src/org/briarproject/messaging/duplex/DuplexConnection.java
index acb076e73ad97271c8bcc0231edc0ab2949fc421..b3279c3f1917b4e7b2ee6b8faa7a35de86bcc987 100644
--- a/briar-core/src/org/briarproject/messaging/duplex/DuplexConnection.java
+++ b/briar-core/src/org/briarproject/messaging/duplex/DuplexConnection.java
@@ -226,8 +226,7 @@ abstract class DuplexConnection implements EventListener {
 		db.addListener(this);
 		try {
 			OutputStream out = createConnectionWriter().getOutputStream();
-			writer = packetWriterFactory.createPacketWriter(out,
-					transport.shouldFlush());
+			writer = packetWriterFactory.createPacketWriter(out, true);
 			if(LOG.isLoggable(INFO)) LOG.info("Starting to write");
 			// Send the initial packets
 			dbExecutor.execute(new GenerateTransportAcks());
@@ -500,7 +499,7 @@ abstract class DuplexConnection implements EventListener {
 
 		public void run() {
 			assert writer != null;
-			int maxMessages = writer.getMaxMessagesForRequest(Long.MAX_VALUE);
+			int maxMessages = writer.getMaxMessagesForAck(Long.MAX_VALUE);
 			try {
 				Ack a = db.generateAck(contactId, maxMessages);
 				if(LOG.isLoggable(INFO))
diff --git a/briar-core/src/org/briarproject/messaging/simplex/OutgoingSimplexConnection.java b/briar-core/src/org/briarproject/messaging/simplex/OutgoingSimplexConnection.java
index a2c2e14e9b88e045644f6e243deae7e1cb273fa2..1f1b205fd8026ca9dc11e6f84168f6adc49179ec 100644
--- a/briar-core/src/org/briarproject/messaging/simplex/OutgoingSimplexConnection.java
+++ b/briar-core/src/org/briarproject/messaging/simplex/OutgoingSimplexConnection.java
@@ -72,7 +72,7 @@ class OutgoingSimplexConnection {
 			if(conn.getRemainingCapacity() < MAX_PACKET_LENGTH)
 				throw new EOFException();
 			PacketWriter writer = packetWriterFactory.createPacketWriter(out,
-					transport.shouldFlush());
+					false);
 			// Send the initial packets: updates and acks
 			boolean hasSpace = writeTransportAcks(conn, writer);
 			if(hasSpace) hasSpace = writeTransportUpdates(conn, writer);
@@ -82,12 +82,12 @@ class OutgoingSimplexConnection {
 			if(hasSpace) hasSpace = writeRetentionUpdate(conn, writer);
 			// Write acks until you can't write acks no more
 			capacity = conn.getRemainingCapacity();
-			int maxMessages = writer.getMaxMessagesForRequest(capacity);
+			int maxMessages = writer.getMaxMessagesForAck(capacity);
 			Ack a = db.generateAck(contactId, maxMessages);
 			while(a != null) {
 				writer.writeAck(a);
 				capacity = conn.getRemainingCapacity();
-				maxMessages = writer.getMaxMessagesForRequest(capacity);
+				maxMessages = writer.getMaxMessagesForAck(capacity);
 				a = db.generateAck(contactId, maxMessages);
 			}
 			// Write messages until you can't write messages no more
diff --git a/briar-core/src/org/briarproject/plugins/file/FileTransportWriter.java b/briar-core/src/org/briarproject/plugins/file/FileTransportWriter.java
index ca6771e20e1fcbab11b382f1fc781337eb7f0d70..d56dfb72691387680510a56ab929dd23fe020271 100644
--- a/briar-core/src/org/briarproject/plugins/file/FileTransportWriter.java
+++ b/briar-core/src/org/briarproject/plugins/file/FileTransportWriter.java
@@ -43,10 +43,6 @@ class FileTransportWriter implements SimplexTransportWriter {
 		return out;
 	}
 
-	public boolean shouldFlush() {
-		return false;
-	}
-
 	public void dispose(boolean exception) {
 		try {
 			out.close();
diff --git a/briar-core/src/org/briarproject/plugins/tcp/TcpTransportConnection.java b/briar-core/src/org/briarproject/plugins/tcp/TcpTransportConnection.java
index cb97a5570639bfd4e42a61a18b00fc0bf90201c4..6612f95fe593ce8e6446575eabbf922363a9e048 100644
--- a/briar-core/src/org/briarproject/plugins/tcp/TcpTransportConnection.java
+++ b/briar-core/src/org/briarproject/plugins/tcp/TcpTransportConnection.java
@@ -34,10 +34,6 @@ class TcpTransportConnection implements DuplexTransportConnection {
 		return socket.getOutputStream();
 	}
 
-	public boolean shouldFlush() {
-		return true;
-	}
-
 	public void dispose(boolean exception, boolean recognised)
 			throws IOException {
 		socket.close();
diff --git a/briar-desktop/src/org/briarproject/plugins/bluetooth/BluetoothTransportConnection.java b/briar-desktop/src/org/briarproject/plugins/bluetooth/BluetoothTransportConnection.java
index c936a9e4ed60000601b49329d0488180fe864c78..4e99e439c56dde2036ec979e345533e387a0be83 100644
--- a/briar-desktop/src/org/briarproject/plugins/bluetooth/BluetoothTransportConnection.java
+++ b/briar-desktop/src/org/briarproject/plugins/bluetooth/BluetoothTransportConnection.java
@@ -35,10 +35,6 @@ class BluetoothTransportConnection implements DuplexTransportConnection {
 		return stream.openOutputStream();
 	}
 
-	public boolean shouldFlush() {
-		return true;
-	}
-
 	public void dispose(boolean exception, boolean recognised)
 			throws IOException {
 		stream.close();
diff --git a/briar-desktop/src/org/briarproject/plugins/modem/ModemPlugin.java b/briar-desktop/src/org/briarproject/plugins/modem/ModemPlugin.java
index 7d812ce4c5038a976ebbf653c49b4ed9dd9efaea..b3f6312dd58d85e7c10e5a2f18040b812a3922f8 100644
--- a/briar-desktop/src/org/briarproject/plugins/modem/ModemPlugin.java
+++ b/briar-desktop/src/org/briarproject/plugins/modem/ModemPlugin.java
@@ -250,10 +250,6 @@ class ModemPlugin implements DuplexPlugin, Modem.Callback {
 			return modem.getOutputStream();
 		}
 
-		public boolean shouldFlush() {
-			return true;
-		}
-
 		public void dispose(boolean exception, boolean recognised) {
 			if(LOG.isLoggable(INFO)) LOG.info("Call disconnected");
 			try {
diff --git a/briar-tests/src/org/briarproject/messaging/ConstantsTest.java b/briar-tests/src/org/briarproject/messaging/ConstantsTest.java
index 52c40b056ab101ec66d0a41e720b809ea6451007..f72bb57abb95dc41a0b212a0ca20b553cabf4e0b 100644
--- a/briar-tests/src/org/briarproject/messaging/ConstantsTest.java
+++ b/briar-tests/src/org/briarproject/messaging/ConstantsTest.java
@@ -39,6 +39,7 @@ import org.briarproject.api.messaging.MessageId;
 import org.briarproject.api.messaging.Offer;
 import org.briarproject.api.messaging.PacketWriter;
 import org.briarproject.api.messaging.PacketWriterFactory;
+import org.briarproject.api.messaging.Request;
 import org.briarproject.api.messaging.SubscriptionUpdate;
 import org.briarproject.api.messaging.TransportUpdate;
 import org.briarproject.crypto.CryptoModule;
@@ -153,6 +154,16 @@ public class ConstantsTest extends BriarTestCase {
 		testMessageIdsFitIntoOffer(1000);
 	}
 
+	@Test
+	public void testMessageIdsFitIntoLargeRequest() throws Exception {
+		testMessageIdsFitIntoRequest(MAX_PACKET_LENGTH);
+	}
+
+	@Test
+	public void testMessageIdsFitIntoSmallRequest() throws Exception {
+		testMessageIdsFitIntoRequest(1000);
+	}
+
 	@Test
 	public void testPropertiesFitIntoTransportUpdate() throws Exception {
 		// Create the maximum number of properties with the maximum length
@@ -195,24 +206,37 @@ public class ConstantsTest extends BriarTestCase {
 		// Create an ack with as many message IDs as possible
 		ByteArrayOutputStream out = new ByteArrayOutputStream(length);
 		PacketWriter writer = packetWriterFactory.createPacketWriter(out, true);
-		int maxMessages = writer.getMaxMessagesForRequest(length);
-		Collection<MessageId> acked = new ArrayList<MessageId>();
+		int maxMessages = writer.getMaxMessagesForAck(length);
+		Collection<MessageId> ids = new ArrayList<MessageId>();
 		for(int i = 0; i < maxMessages; i++)
-			acked.add(new MessageId(TestUtils.getRandomId()));
-		writer.writeAck(new Ack(acked));
+			ids.add(new MessageId(TestUtils.getRandomId()));
+		writer.writeAck(new Ack(ids));
 		// Check the size of the serialised ack
 		assertTrue(out.size() <= length);
 	}
 
+	private void testMessageIdsFitIntoRequest(int length) throws Exception {
+		// Create a request with as many message IDs as possible
+		ByteArrayOutputStream out = new ByteArrayOutputStream(length);
+		PacketWriter writer = packetWriterFactory.createPacketWriter(out, true);
+		int maxMessages = writer.getMaxMessagesForRequest(length);
+		Collection<MessageId> ids = new ArrayList<MessageId>();
+		for(int i = 0; i < maxMessages; i++)
+			ids.add(new MessageId(TestUtils.getRandomId()));
+		writer.writeRequest(new Request(ids));
+		// Check the size of the serialised request
+		assertTrue(out.size() <= length);
+	}
+
 	private void testMessageIdsFitIntoOffer(int length) throws Exception {
 		// Create an offer with as many message IDs as possible
 		ByteArrayOutputStream out = new ByteArrayOutputStream(length);
 		PacketWriter writer = packetWriterFactory.createPacketWriter(out, true);
 		int maxMessages = writer.getMaxMessagesForOffer(length);
-		Collection<MessageId> offered = new ArrayList<MessageId>();
+		Collection<MessageId> ids = new ArrayList<MessageId>();
 		for(int i = 0; i < maxMessages; i++)
-			offered.add(new MessageId(TestUtils.getRandomId()));
-		writer.writeOffer(new Offer(offered));
+			ids.add(new MessageId(TestUtils.getRandomId()));
+		writer.writeOffer(new Offer(ids));
 		// Check the size of the serialised offer
 		assertTrue(out.size() <= length);
 	}
diff --git a/briar-tests/src/org/briarproject/messaging/simplex/OutgoingSimplexConnectionTest.java b/briar-tests/src/org/briarproject/messaging/simplex/OutgoingSimplexConnectionTest.java
index c01501c92772dbac679d37912ebec82e6e5a653e..55aa1bcc76041d9061e77801afefb1ee59e4460d 100644
--- a/briar-tests/src/org/briarproject/messaging/simplex/OutgoingSimplexConnectionTest.java
+++ b/briar-tests/src/org/briarproject/messaging/simplex/OutgoingSimplexConnectionTest.java
@@ -85,7 +85,7 @@ public class OutgoingSimplexConnectionTest extends BriarTestCase {
 	public void testConnectionTooShort() throws Exception {
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
 		TestSimplexTransportWriter transport = new TestSimplexTransportWriter(
-				out, MAX_PACKET_LENGTH, Long.MAX_VALUE, true);
+				out, MAX_PACKET_LENGTH, Long.MAX_VALUE);
 		ConnectionContext ctx = new ConnectionContext(contactId, transportId,
 				secret, 0, true);
 		OutgoingSimplexConnection connection = new OutgoingSimplexConnection(db,
@@ -103,7 +103,7 @@ public class OutgoingSimplexConnectionTest extends BriarTestCase {
 	public void testNothingToSend() throws Exception {
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
 		TestSimplexTransportWriter transport = new TestSimplexTransportWriter(
-				out, MIN_CONNECTION_LENGTH, Long.MAX_VALUE, true);
+				out, MIN_CONNECTION_LENGTH, Long.MAX_VALUE);
 		ConnectionContext ctx = new ConnectionContext(contactId, transportId,
 				secret, 0, true);
 		OutgoingSimplexConnection connection = new OutgoingSimplexConnection(db,
@@ -152,7 +152,7 @@ public class OutgoingSimplexConnectionTest extends BriarTestCase {
 	public void testSomethingToSend() throws Exception {
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
 		TestSimplexTransportWriter transport = new TestSimplexTransportWriter(
-				out, MIN_CONNECTION_LENGTH, Long.MAX_VALUE, true);
+				out, MIN_CONNECTION_LENGTH, Long.MAX_VALUE);
 		ConnectionContext ctx = new ConnectionContext(contactId, transportId,
 				secret, 0, true);
 		OutgoingSimplexConnection connection = new OutgoingSimplexConnection(db,
diff --git a/briar-tests/src/org/briarproject/messaging/simplex/SimplexMessagingIntegrationTest.java b/briar-tests/src/org/briarproject/messaging/simplex/SimplexMessagingIntegrationTest.java
index 9fa7f371b3cc909a3ee3f3046bd3f5c16ad8324c..bc44c3a5ff821800bbd8d838437322a928827524 100644
--- a/briar-tests/src/org/briarproject/messaging/simplex/SimplexMessagingIntegrationTest.java
+++ b/briar-tests/src/org/briarproject/messaging/simplex/SimplexMessagingIntegrationTest.java
@@ -146,7 +146,7 @@ public class SimplexMessagingIntegrationTest extends BriarTestCase {
 		PacketWriterFactory packetWriterFactory =
 				alice.getInstance(PacketWriterFactory.class);
 		TestSimplexTransportWriter transport = new TestSimplexTransportWriter(
-				out, Long.MAX_VALUE, Long.MAX_VALUE, false);
+				out, Long.MAX_VALUE, Long.MAX_VALUE);
 		ConnectionContext ctx = km.getConnectionContext(contactId, transportId);
 		assertNotNull(ctx);
 		OutgoingSimplexConnection simplex = new OutgoingSimplexConnection(db,
diff --git a/briar-tests/src/org/briarproject/messaging/simplex/TestSimplexTransportWriter.java b/briar-tests/src/org/briarproject/messaging/simplex/TestSimplexTransportWriter.java
index 5ddf2daeef50babafb97b77c94e4dcd960da26b7..39e4a76810813326d5b53886012619688376dfe7 100644
--- a/briar-tests/src/org/briarproject/messaging/simplex/TestSimplexTransportWriter.java
+++ b/briar-tests/src/org/briarproject/messaging/simplex/TestSimplexTransportWriter.java
@@ -11,16 +11,14 @@ class TestSimplexTransportWriter implements SimplexTransportWriter {
 
 	private final ByteArrayOutputStream out;
 	private final long capacity, maxLatency;
-	private final boolean flush;
 
 	private boolean disposed = false, exception = false;
 
 	TestSimplexTransportWriter(ByteArrayOutputStream out, long capacity,
-			long maxLatency, boolean flush) {
+			long maxLatency) {
 		this.out = out;
 		this.capacity = capacity;
 		this.maxLatency = maxLatency;
-		this.flush = flush;
 	}
 
 	public long getCapacity() {
@@ -39,10 +37,6 @@ class TestSimplexTransportWriter implements SimplexTransportWriter {
 		return out;
 	}
 
-	public boolean shouldFlush() {
-		return flush;
-	}
-
 	public void dispose(boolean exception) {
 		assert !disposed;
 		disposed = true;