diff --git a/bramble-api/src/main/java/org/briarproject/bramble/api/keyagreement/KeyAgreementConstants.java b/bramble-api/src/main/java/org/briarproject/bramble/api/keyagreement/KeyAgreementConstants.java
index 807055d6e048118cc4482fd878eb0e33808e2680..0bf94a264636802d6a5840c4c97e5eb593ccb23d 100644
--- a/bramble-api/src/main/java/org/briarproject/bramble/api/keyagreement/KeyAgreementConstants.java
+++ b/bramble-api/src/main/java/org/briarproject/bramble/api/keyagreement/KeyAgreementConstants.java
@@ -3,9 +3,9 @@ package org.briarproject.bramble.api.keyagreement;
 public interface KeyAgreementConstants {
 
 	/**
-	 * The current version of the BQP protocol.
+	 * The current version of the BQP protocol. Version number 89 is reserved.
 	 */
-	byte PROTOCOL_VERSION = 3;
+	byte PROTOCOL_VERSION = 4;
 
 	/**
 	 * The length of the record header in bytes.
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/keyagreement/PayloadEncoderImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/keyagreement/PayloadEncoderImpl.java
index b6c3481eeda1e81f7f665b1d9720bbdb2879e71f..66304489886c61c06a24c6542b5a63df17434d34 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/keyagreement/PayloadEncoderImpl.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/keyagreement/PayloadEncoderImpl.java
@@ -29,10 +29,10 @@ class PayloadEncoderImpl implements PayloadEncoder {
 	@Override
 	public byte[] encode(Payload p) {
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
+		out.write(PROTOCOL_VERSION);
 		BdfWriter w = bdfWriterFactory.createWriter(out);
 		try {
 			w.writeListStart(); // Payload start
-			w.writeLong(PROTOCOL_VERSION);
 			w.writeRaw(p.getCommitment());
 			for (TransportDescriptor d : p.getTransportDescriptors())
 				w.writeList(d.getDescriptor());
diff --git a/bramble-core/src/main/java/org/briarproject/bramble/keyagreement/PayloadParserImpl.java b/bramble-core/src/main/java/org/briarproject/bramble/keyagreement/PayloadParserImpl.java
index 334a46f3156b78651c926d4bd0f8c67d207ec588..62dee9e83908bd92f6b1cccc6a7463bfc576e43a 100644
--- a/bramble-core/src/main/java/org/briarproject/bramble/keyagreement/PayloadParserImpl.java
+++ b/bramble-core/src/main/java/org/briarproject/bramble/keyagreement/PayloadParserImpl.java
@@ -40,22 +40,22 @@ class PayloadParserImpl implements PayloadParser {
 	@Override
 	public Payload parse(byte[] raw) throws IOException {
 		ByteArrayInputStream in = new ByteArrayInputStream(raw);
+		// First byte: the protocol version
+		int protocolVersion = in.read();
+		if (protocolVersion == -1) throw new FormatException();
+		if (protocolVersion != PROTOCOL_VERSION)
+			throw new UnsupportedVersionException();
+		// The rest of the payload is a BDF list with one or more elements
 		BdfReader r = bdfReaderFactory.createReader(in);
-		// The payload is a BDF list with two or more elements
 		BdfList payload = r.readList();
-		if (payload.size() < 2) throw new FormatException();
+		if (payload.isEmpty()) throw new FormatException();
 		if (!r.eof()) throw new FormatException();
-		// First element: the protocol version
-		long protocolVersion = payload.getLong(0);
-		if (protocolVersion != PROTOCOL_VERSION) {
-			throw new UnsupportedVersionException();
-		}
-		// Second element: the public key commitment
-		byte[] commitment = payload.getRaw(1);
+		// First element: the public key commitment
+		byte[] commitment = payload.getRaw(0);
 		if (commitment.length != COMMIT_LENGTH) throw new FormatException();
 		// Remaining elements: transport descriptors
 		List<TransportDescriptor> recognised = new ArrayList<>();
-		for (int i = 2; i < payload.size(); i++) {
+		for (int i = 1; i < payload.size(); i++) {
 			BdfList descriptor = payload.getList(i);
 			long transportId = descriptor.getLong(0);
 			if (transportId == TRANSPORT_ID_BLUETOOTH) {