diff --git a/bramble-core/src/main/java/org/briarproject/bramble/record/RecordReaderImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/record/RecordReaderImpl.java
index 92fb696ae54eae284083b10a2dcf37864ed206dd..12aac514ca3b67d68622eef507e2b9985a6bd115 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/record/RecordReaderImpl.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/record/RecordReaderImpl.java
@@ -4,8 +4,8 @@ import org.briarproject.bramble.api.FormatException;
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
 import org.briarproject.bramble.api.record.Record;
 import org.briarproject.bramble.api.record.RecordReader;
+import org.briarproject.bramble.util.ByteUtils;
 
-import java.io.BufferedInputStream;
 import java.io.DataInputStream;
 import java.io.IOException;
 import java.io.InputStream;
@@ -13,22 +13,25 @@ import java.io.InputStream;
 import javax.annotation.concurrent.NotThreadSafe;
 
 import static org.briarproject.bramble.api.record.Record.MAX_RECORD_PAYLOAD_BYTES;
+import static org.briarproject.bramble.api.record.Record.RECORD_HEADER_BYTES;
 
 @NotThreadSafe
 @NotNullByDefault
 class RecordReaderImpl implements RecordReader {
 
 	private final DataInputStream in;
+	private final byte[] header = new byte[RECORD_HEADER_BYTES];
 
 	RecordReaderImpl(InputStream in) {
-		this.in = new DataInputStream(new BufferedInputStream(in, 1024));
+		this.in = new DataInputStream(in);
 	}
 
 	@Override
 	public Record readRecord() throws IOException {
-		byte protocolVersion = in.readByte();
-		byte recordType = in.readByte();
-		int payloadLength = in.readShort() & 0xFFFF; // Convert to unsigned
+		in.readFully(header);
+		byte protocolVersion = header[0];
+		byte recordType = header[1];
+		int payloadLength = ByteUtils.readUint16(header, 2);
 		if (payloadLength < 0 || payloadLength > MAX_RECORD_PAYLOAD_BYTES)
 			throw new FormatException();
 		byte[] payload = new byte[payloadLength];
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/record/RecordWriterImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/record/RecordWriterImpl.java
index 281b3c6382c1257e48140dbdaa83c3afe168a461..ec9f5c0c026746652c537838f47db7fa4451b614 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/record/RecordWriterImpl.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/record/RecordWriterImpl.java
@@ -3,30 +3,33 @@ package org.briarproject.bramble.record;
 import org.briarproject.bramble.api.nullsafety.NotNullByDefault;
 import org.briarproject.bramble.api.record.Record;
 import org.briarproject.bramble.api.record.RecordWriter;
+import org.briarproject.bramble.util.ByteUtils;
 
-import java.io.BufferedOutputStream;
-import java.io.DataOutputStream;
 import java.io.IOException;
 import java.io.OutputStream;
 
 import javax.annotation.concurrent.NotThreadSafe;
 
+import static org.briarproject.bramble.api.record.Record.RECORD_HEADER_BYTES;
+
 @NotThreadSafe
 @NotNullByDefault
 class RecordWriterImpl implements RecordWriter {
 
-	private final DataOutputStream out;
+	private final OutputStream out;
+	private final byte[] header = new byte[RECORD_HEADER_BYTES];
 
 	RecordWriterImpl(OutputStream out) {
-		this.out = new DataOutputStream(new BufferedOutputStream(out, 1024));
+		this.out = out;
 	}
 
 	@Override
 	public void writeRecord(Record r) throws IOException {
-		out.write(r.getProtocolVersion());
-		out.write(r.getRecordType());
 		byte[] payload = r.getPayload();
-		out.writeShort(payload.length);
+		header[0] = r.getProtocolVersion();
+		header[1] = r.getRecordType();
+		ByteUtils.writeUint16(payload.length, header, 2);
+		out.write(header);
 		out.write(payload);
 	}