diff --git a/briar-api/src/org/briarproject/api/messaging/PacketWriter.java b/briar-api/src/org/briarproject/api/messaging/PacketWriter.java
index f76c45414863213a00743c08f4ad6bbfe9f0589c..bc7b4e1de6d4086956003b46872a508e7a548800 100644
--- a/briar-api/src/org/briarproject/api/messaging/PacketWriter.java
+++ b/briar-api/src/org/briarproject/api/messaging/PacketWriter.java
@@ -29,8 +29,4 @@ public interface PacketWriter {
 	void writeTransportAck(TransportAck a) throws IOException;
 
 	void writeTransportUpdate(TransportUpdate u) throws IOException;
-
-	void flush() throws IOException;
-
-	void close() throws IOException;
 }
diff --git a/briar-api/src/org/briarproject/api/messaging/PacketWriterFactory.java b/briar-api/src/org/briarproject/api/messaging/PacketWriterFactory.java
index 8d75afcb7907c923f101539ea9d3df39ec100676..5c1c5b4ec6a2e8848fb7aa88963a8f91bba04401 100644
--- a/briar-api/src/org/briarproject/api/messaging/PacketWriterFactory.java
+++ b/briar-api/src/org/briarproject/api/messaging/PacketWriterFactory.java
@@ -4,5 +4,5 @@ import java.io.OutputStream;
 
 public interface PacketWriterFactory {
 
-	PacketWriter createPacketWriter(OutputStream out, boolean flush);
+	PacketWriter createPacketWriter(OutputStream out);
 }
diff --git a/briar-core/src/org/briarproject/messaging/PacketWriterFactoryImpl.java b/briar-core/src/org/briarproject/messaging/PacketWriterFactoryImpl.java
index 4c14ef1afbf03fc0ae67cfe9690b05cf3870b4b0..46880fc0c5bbd5b58bc8980f47539acf87b6fe33 100644
--- a/briar-core/src/org/briarproject/messaging/PacketWriterFactoryImpl.java
+++ b/briar-core/src/org/briarproject/messaging/PacketWriterFactoryImpl.java
@@ -21,7 +21,7 @@ class PacketWriterFactoryImpl implements PacketWriterFactory {
 		this.writerFactory = writerFactory;
 	}
 
-	public PacketWriter createPacketWriter(OutputStream out, boolean flush) {
-		return new PacketWriterImpl(serial, writerFactory, out, flush);
+	public PacketWriter createPacketWriter(OutputStream out) {
+		return new PacketWriterImpl(serial, writerFactory, out);
 	}
 }
diff --git a/briar-core/src/org/briarproject/messaging/PacketWriterImpl.java b/briar-core/src/org/briarproject/messaging/PacketWriterImpl.java
index f17d45cf1db7e3683eca5cae368986105df2fbdb..4b0efd4a7ea5fcec06f1be25205502458717b7bf 100644
--- a/briar-core/src/org/briarproject/messaging/PacketWriterImpl.java
+++ b/briar-core/src/org/briarproject/messaging/PacketWriterImpl.java
@@ -36,14 +36,12 @@ class PacketWriterImpl implements PacketWriter {
 
 	private final SerialComponent serial;
 	private final OutputStream out;
-	private final boolean flush;
 	private final Writer w;
 
 	PacketWriterImpl(SerialComponent serial, WriterFactory writerFactory,
-			OutputStream out, boolean flush) {
+			OutputStream out) {
 		this.serial = serial;
 		this.out = out;
-		this.flush = flush;
 		w = writerFactory.createWriter(out);
 	}
 
@@ -75,12 +73,10 @@ class PacketWriterImpl implements PacketWriter {
 		for(MessageId m : a.getMessageIds()) w.writeBytes(m.getBytes());
 		w.writeListEnd();
 		w.writeStructEnd();
-		if(flush) out.flush();
 	}
 
 	public void writeMessage(byte[] raw) throws IOException {
 		out.write(raw);
-		if(flush) out.flush();
 	}
 
 	public void writeOffer(Offer o) throws IOException {
@@ -89,7 +85,6 @@ class PacketWriterImpl implements PacketWriter {
 		for(MessageId m : o.getMessageIds()) w.writeBytes(m.getBytes());
 		w.writeListEnd();
 		w.writeStructEnd();
-		if(flush) out.flush();
 	}
 
 	public void writeRequest(Request r) throws IOException {
@@ -98,14 +93,12 @@ class PacketWriterImpl implements PacketWriter {
 		for(MessageId m : r.getMessageIds()) w.writeBytes(m.getBytes());
 		w.writeListEnd();
 		w.writeStructEnd();
-		if(flush) out.flush();
 	}
 
 	public void writeRetentionAck(RetentionAck a) throws IOException {
 		w.writeStructStart(RETENTION_ACK);
 		w.writeInteger(a.getVersion());
 		w.writeStructEnd();
-		if(flush) out.flush();
 	}
 
 	public void writeRetentionUpdate(RetentionUpdate u) throws IOException {
@@ -113,14 +106,12 @@ class PacketWriterImpl implements PacketWriter {
 		w.writeInteger(u.getRetentionTime());
 		w.writeInteger(u.getVersion());
 		w.writeStructEnd();
-		if(flush) out.flush();
 	}
 
 	public void writeSubscriptionAck(SubscriptionAck a) throws IOException {
 		w.writeStructStart(SUBSCRIPTION_ACK);
 		w.writeInteger(a.getVersion());
 		w.writeStructEnd();
-		if(flush) out.flush();
 	}
 
 	public void writeSubscriptionUpdate(SubscriptionUpdate u)
@@ -136,7 +127,6 @@ class PacketWriterImpl implements PacketWriter {
 		w.writeListEnd();
 		w.writeInteger(u.getVersion());
 		w.writeStructEnd();
-		if(flush) out.flush();
 	}
 
 	public void writeTransportAck(TransportAck a) throws IOException {
@@ -144,7 +134,6 @@ class PacketWriterImpl implements PacketWriter {
 		w.writeString(a.getId().getString());
 		w.writeInteger(a.getVersion());
 		w.writeStructEnd();
-		if(flush) out.flush();
 	}
 
 	public void writeTransportUpdate(TransportUpdate u) throws IOException {
@@ -153,14 +142,5 @@ class PacketWriterImpl implements PacketWriter {
 		w.writeMap(u.getProperties());
 		w.writeInteger(u.getVersion());
 		w.writeStructEnd();
-		if(flush) out.flush();
-	}
-
-	public void flush() throws IOException {
-		out.flush();
-	}
-
-	public void close() throws IOException {
-		out.close();
 	}
 }
diff --git a/briar-core/src/org/briarproject/messaging/ReactiveOutgoingSession.java b/briar-core/src/org/briarproject/messaging/ReactiveOutgoingSession.java
index c3eae51056073fa352e5d6df0b37c4cdd5fb20ff..3dc7d38c8988b0d22e8b1bd8ccd4e62f2ed77443 100644
--- a/briar-core/src/org/briarproject/messaging/ReactiveOutgoingSession.java
+++ b/briar-core/src/org/briarproject/messaging/ReactiveOutgoingSession.java
@@ -100,7 +100,7 @@ class ReactiveOutgoingSession implements MessagingSession, EventListener {
 			StreamWriter streamWriter = streamWriterFactory.createStreamWriter(
 					out, maxFrameLength, ctx);
 			out = streamWriter.getOutputStream();
-			packetWriter = packetWriterFactory.createPacketWriter(out, true);
+			packetWriter = packetWriterFactory.createPacketWriter(out);
 			// Start a query for each type of packet, in order of urgency
 			dbExecutor.execute(new GenerateTransportAcks());
 			dbExecutor.execute(new GenerateTransportUpdates());
@@ -118,8 +118,8 @@ class ReactiveOutgoingSession implements MessagingSession, EventListener {
 					ThrowingRunnable<IOException> task = writerTasks.take();
 					if(task == CLOSE) break;
 					task.run();
+					if(writerTasks.isEmpty()) out.flush();
 				}
-				out.flush();
 				out.close();
 			} catch(InterruptedException e) {
 				LOG.info("Interrupted while waiting for a packet to write");
diff --git a/briar-core/src/org/briarproject/messaging/SinglePassOutgoingSession.java b/briar-core/src/org/briarproject/messaging/SinglePassOutgoingSession.java
index c09829a92044d11ca1b3254a5fcdb513f55f187c..75f991317cf8b94e6f8b483b567902e1699190d3 100644
--- a/briar-core/src/org/briarproject/messaging/SinglePassOutgoingSession.java
+++ b/briar-core/src/org/briarproject/messaging/SinglePassOutgoingSession.java
@@ -83,7 +83,7 @@ class SinglePassOutgoingSession implements MessagingSession {
 		streamWriter = streamWriterFactory.createStreamWriter(out,
 				maxFrameLength, ctx);
 		out = streamWriter.getOutputStream();
-		packetWriter = packetWriterFactory.createPacketWriter(out, false);
+		packetWriter = packetWriterFactory.createPacketWriter(out);
 		// Start a query for each type of packet, in order of urgency
 		dbExecutor.execute(new GenerateTransportAcks());
 		dbExecutor.execute(new GenerateTransportUpdates());
diff --git a/briar-tests/src/org/briarproject/ProtocolIntegrationTest.java b/briar-tests/src/org/briarproject/ProtocolIntegrationTest.java
index 8cbc75befd6f6970ffc181ea48a36c46aabdd8e7..6165c9c164efe21feceaf02b6ed29c85ea94e445 100644
--- a/briar-tests/src/org/briarproject/ProtocolIntegrationTest.java
+++ b/briar-tests/src/org/briarproject/ProtocolIntegrationTest.java
@@ -125,8 +125,8 @@ public class ProtocolIntegrationTest extends BriarTestCase {
 		StreamWriter streamWriter = streamWriterFactory.createStreamWriter(out,
 				MAX_FRAME_LENGTH, ctx);
 		OutputStream out1 = streamWriter.getOutputStream();
-		PacketWriter packetWriter = packetWriterFactory.createPacketWriter(out1,
-				false);
+		PacketWriter packetWriter =
+				packetWriterFactory.createPacketWriter(out1);
 
 		packetWriter.writeAck(new Ack(messageIds));
 
@@ -144,7 +144,7 @@ public class ProtocolIntegrationTest extends BriarTestCase {
 				transportProperties, 1);
 		packetWriter.writeTransportUpdate(tu);
 
-		packetWriter.flush();
+		out1.flush();
 		return out.toByteArray();
 	}
 
diff --git a/briar-tests/src/org/briarproject/messaging/ConstantsTest.java b/briar-tests/src/org/briarproject/messaging/ConstantsTest.java
index 1aee065e1f325972074c82e0915b4a8e2a899d20..785ee0e3c35a282d14b9556b24ef55d5082d52cf 100644
--- a/briar-tests/src/org/briarproject/messaging/ConstantsTest.java
+++ b/briar-tests/src/org/briarproject/messaging/ConstantsTest.java
@@ -179,7 +179,7 @@ public class ConstantsTest extends BriarTestCase {
 		TransportUpdate u = new TransportUpdate(id, p, Long.MAX_VALUE);
 		// Serialise the update
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		PacketWriter writer = packetWriterFactory.createPacketWriter(out, true);
+		PacketWriter writer = packetWriterFactory.createPacketWriter(out);
 		writer.writeTransportUpdate(u);
 		// Check the size of the serialised transport update
 		assertTrue(out.size() <= MAX_PACKET_LENGTH);
@@ -197,7 +197,7 @@ public class ConstantsTest extends BriarTestCase {
 		SubscriptionUpdate u = new SubscriptionUpdate(groups, Long.MAX_VALUE);
 		// Serialise the update
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
-		PacketWriter writer = packetWriterFactory.createPacketWriter(out, true);
+		PacketWriter writer = packetWriterFactory.createPacketWriter(out);
 		writer.writeSubscriptionUpdate(u);
 		// Check the size of the serialised subscription update
 		assertTrue(out.size() <= MAX_PACKET_LENGTH);
@@ -206,7 +206,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);
-		PacketWriter writer = packetWriterFactory.createPacketWriter(out, true);
+		PacketWriter writer = packetWriterFactory.createPacketWriter(out);
 		int maxMessages = writer.getMaxMessagesForAck(length);
 		Collection<MessageId> ids = new ArrayList<MessageId>();
 		for(int i = 0; i < maxMessages; i++)
@@ -219,7 +219,7 @@ public class ConstantsTest extends BriarTestCase {
 	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);
+		PacketWriter writer = packetWriterFactory.createPacketWriter(out);
 		int maxMessages = writer.getMaxMessagesForRequest(length);
 		Collection<MessageId> ids = new ArrayList<MessageId>();
 		for(int i = 0; i < maxMessages; i++)
@@ -232,7 +232,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);
-		PacketWriter writer = packetWriterFactory.createPacketWriter(out, true);
+		PacketWriter writer = packetWriterFactory.createPacketWriter(out);
 		int maxMessages = writer.getMaxMessagesForOffer(length);
 		Collection<MessageId> ids = new ArrayList<MessageId>();
 		for(int i = 0; i < maxMessages; i++)