diff --git a/api/net/sf/briar/api/protocol/Offer.java b/api/net/sf/briar/api/protocol/Offer.java
index 1f57685a97bbcb012c41df6746e12a0636a56a4d..6ff90d833997557e1f755f39d6ba33fb0492962e 100644
--- a/api/net/sf/briar/api/protocol/Offer.java
+++ b/api/net/sf/briar/api/protocol/Offer.java
@@ -8,9 +8,6 @@ public interface Offer {
 	/** The maximum number of message IDs per offer. */
 	static final int MAX_IDS_PER_OFFER = 29959;
 
-	/** Returns the offer's unique identifier. */
-	OfferId getId();
-
 	/** Returns the message IDs contained in the offer. */
 	Collection<MessageId> getMessageIds();
 }
diff --git a/api/net/sf/briar/api/protocol/OfferId.java b/api/net/sf/briar/api/protocol/OfferId.java
deleted file mode 100644
index 1d235cfe71815f2d49c53b4e59d0cf54ca2866c7..0000000000000000000000000000000000000000
--- a/api/net/sf/briar/api/protocol/OfferId.java
+++ /dev/null
@@ -1,26 +0,0 @@
-package net.sf.briar.api.protocol;
-
-import java.io.IOException;
-import java.util.Arrays;
-
-import net.sf.briar.api.serial.Writer;
-
-/** Type-safe wrapper for a byte array that uniquely identifies an offer. */
-public class OfferId extends UniqueId {
-
-	public OfferId(byte[] id) {
-		super(id);
-	}
-
-	public void writeTo(Writer w) throws IOException {
-		w.writeUserDefinedTag(Tags.OFFER_ID);
-		w.writeBytes(id);
-	}
-
-	@Override
-	public boolean equals(Object o) {
-		if(o instanceof OfferId)
-			return Arrays.equals(id, ((OfferId) o).id);
-		return false;
-	}
-}
diff --git a/api/net/sf/briar/api/protocol/Request.java b/api/net/sf/briar/api/protocol/Request.java
index 9cc8dce438c818e5b989aa8888ecddb8e85676a9..a17023020748cc95dd8a0499ae5047d0d3e29e21 100644
--- a/api/net/sf/briar/api/protocol/Request.java
+++ b/api/net/sf/briar/api/protocol/Request.java
@@ -5,12 +5,6 @@ import java.util.BitSet;
 /** A packet requesting some or all of the messages from an offer. */
 public interface Request {
 
-	/**
-	 * Returns the unique identifier of the offer to which this request
-	 * responds.
-	 */
-	OfferId getOfferId();
-
 	/**
 	 * Returns a sequence of bits corresponding to the sequence of messages in
 	 * the offer, where the i^th bit is set if the i^th message should be sent.
diff --git a/api/net/sf/briar/api/protocol/Tags.java b/api/net/sf/briar/api/protocol/Tags.java
index 7013d9c665f1314527687494cb7eccdcf3d5743b..60b3be884a0d700b3021e00e3613cdfa414eb577 100644
--- a/api/net/sf/briar/api/protocol/Tags.java
+++ b/api/net/sf/briar/api/protocol/Tags.java
@@ -17,7 +17,7 @@ public interface Tags {
 	static final int MESSAGE = 7;
 	static final int MESSAGE_ID = 8;
 	static final int OFFER = 9;
-	static final int OFFER_ID = 10;
+	// FIXME: Renumber
 	static final int REQUEST = 11;
 	static final int SUBSCRIPTION_UPDATE = 12;
 	static final int TRANSPORT_PROPERTIES = 13;
diff --git a/api/net/sf/briar/api/protocol/writers/OfferWriter.java b/api/net/sf/briar/api/protocol/writers/OfferWriter.java
index 9a5b945ae600d67e42ce2d0f222c446a55447110..8faee5bed2fc010b292b74f5f7626106d6255e70 100644
--- a/api/net/sf/briar/api/protocol/writers/OfferWriter.java
+++ b/api/net/sf/briar/api/protocol/writers/OfferWriter.java
@@ -3,7 +3,6 @@ package net.sf.briar.api.protocol.writers;
 import java.io.IOException;
 
 import net.sf.briar.api.protocol.MessageId;
-import net.sf.briar.api.protocol.OfferId;
 
 /** An interface for creating an offer packet. */
 public interface OfferWriter {
@@ -14,6 +13,6 @@ public interface OfferWriter {
 	 */
 	boolean writeMessageId(MessageId m) throws IOException;
 
-	/** Finishes writing the offer and returns its unique identifier. */
-	OfferId finish() throws IOException;
+	/** Finishes writing the offer. */
+	void finish() throws IOException;
 }
diff --git a/api/net/sf/briar/api/protocol/writers/RequestWriter.java b/api/net/sf/briar/api/protocol/writers/RequestWriter.java
index d284f5c0c17e521fd67fe08b90bf6f5a9c8906d2..01f4b0c1179a1f6c17c76b54e38d98ba0497279b 100644
--- a/api/net/sf/briar/api/protocol/writers/RequestWriter.java
+++ b/api/net/sf/briar/api/protocol/writers/RequestWriter.java
@@ -3,11 +3,9 @@ package net.sf.briar.api.protocol.writers;
 import java.io.IOException;
 import java.util.BitSet;
 
-import net.sf.briar.api.protocol.OfferId;
-
 /** An interface for creating a request packet. */
 public interface RequestWriter {
 
 	/** Writes the contents of the request. */
-	void writeRequest(OfferId offerId, BitSet b, int length) throws IOException;
+	void writeRequest(BitSet b, int length) throws IOException;
 }
diff --git a/components/net/sf/briar/db/ReadWriteLockDatabaseComponent.java b/components/net/sf/briar/db/ReadWriteLockDatabaseComponent.java
index 43b382a26caf4f4dbd64b36751ac6e66d7a58437..f0211d04a8738617c0e0389339196b1b413351c1 100644
--- a/components/net/sf/briar/db/ReadWriteLockDatabaseComponent.java
+++ b/components/net/sf/briar/db/ReadWriteLockDatabaseComponent.java
@@ -815,7 +815,7 @@ class ReadWriteLockDatabaseComponent<Txn> extends DatabaseComponentImpl<Txn> {
 							db.abortTransaction(txn);
 							throw e;
 						}
-						r.writeRequest(o.getId(), request, offered.size());
+						r.writeRequest(request, offered.size());
 					} finally {
 						subscriptionLock.readLock().unlock();
 					}
diff --git a/components/net/sf/briar/db/SynchronizedDatabaseComponent.java b/components/net/sf/briar/db/SynchronizedDatabaseComponent.java
index 42048e12a66f104022376692fa4251a7f6c7af54..f27f9f86ffcd24de462fd6228805b5ee3549ffc3 100644
--- a/components/net/sf/briar/db/SynchronizedDatabaseComponent.java
+++ b/components/net/sf/briar/db/SynchronizedDatabaseComponent.java
@@ -627,7 +627,7 @@ class SynchronizedDatabaseComponent<Txn> extends DatabaseComponentImpl<Txn> {
 							db.abortTransaction(txn);
 							throw e;
 						}
-						r.writeRequest(o.getId(), request, offered.size());
+						r.writeRequest(request, offered.size());
 					}
 				}
 			}
diff --git a/components/net/sf/briar/protocol/OfferFactory.java b/components/net/sf/briar/protocol/OfferFactory.java
index c9a1c33cc790be75f19dc6cf93a607dc18196762..6f19d4e29192edd0eadd298b67d398f050391337 100644
--- a/components/net/sf/briar/protocol/OfferFactory.java
+++ b/components/net/sf/briar/protocol/OfferFactory.java
@@ -4,9 +4,8 @@ import java.util.Collection;
 
 import net.sf.briar.api.protocol.MessageId;
 import net.sf.briar.api.protocol.Offer;
-import net.sf.briar.api.protocol.OfferId;
 
 interface OfferFactory {
 
-	Offer createOffer(OfferId id, Collection<MessageId> offered);
+	Offer createOffer(Collection<MessageId> offered);
 }
diff --git a/components/net/sf/briar/protocol/OfferFactoryImpl.java b/components/net/sf/briar/protocol/OfferFactoryImpl.java
index f76802c2053216a7fb36830afd499dab595b5071..075527d14768faa86d022cfe308f8f7eda203b4b 100644
--- a/components/net/sf/briar/protocol/OfferFactoryImpl.java
+++ b/components/net/sf/briar/protocol/OfferFactoryImpl.java
@@ -4,11 +4,10 @@ import java.util.Collection;
 
 import net.sf.briar.api.protocol.MessageId;
 import net.sf.briar.api.protocol.Offer;
-import net.sf.briar.api.protocol.OfferId;
 
 class OfferFactoryImpl implements OfferFactory {
 
-	public Offer createOffer(OfferId id, Collection<MessageId> offered) {
-		return new OfferImpl(id, offered);
+	public Offer createOffer(Collection<MessageId> offered) {
+		return new OfferImpl(offered);
 	}
 }
diff --git a/components/net/sf/briar/protocol/OfferIdReader.java b/components/net/sf/briar/protocol/OfferIdReader.java
deleted file mode 100644
index 3c1fe80aad2d418ab8aedc4ba406f19e3f6f51e4..0000000000000000000000000000000000000000
--- a/components/net/sf/briar/protocol/OfferIdReader.java
+++ /dev/null
@@ -1,20 +0,0 @@
-package net.sf.briar.protocol;
-
-import java.io.IOException;
-
-import net.sf.briar.api.FormatException;
-import net.sf.briar.api.protocol.OfferId;
-import net.sf.briar.api.protocol.Tags;
-import net.sf.briar.api.protocol.UniqueId;
-import net.sf.briar.api.serial.ObjectReader;
-import net.sf.briar.api.serial.Reader;
-
-class OfferIdReader implements ObjectReader<OfferId> {
-
-	public OfferId readObject(Reader r) throws IOException {
-		r.readUserDefinedTag(Tags.OFFER_ID);
-		byte[] b = r.readBytes(UniqueId.LENGTH);
-		if(b.length != UniqueId.LENGTH) throw new FormatException();
-		return new OfferId(b);
-	}
-}
diff --git a/components/net/sf/briar/protocol/OfferImpl.java b/components/net/sf/briar/protocol/OfferImpl.java
index 0ce2e6bfe943e60c55e0e8e95739b1e82557c84b..de892202e64c2fc1fe435767993734920aeda5cf 100644
--- a/components/net/sf/briar/protocol/OfferImpl.java
+++ b/components/net/sf/briar/protocol/OfferImpl.java
@@ -4,22 +4,15 @@ import java.util.Collection;
 
 import net.sf.briar.api.protocol.MessageId;
 import net.sf.briar.api.protocol.Offer;
-import net.sf.briar.api.protocol.OfferId;
 
 class OfferImpl implements Offer {
 
-	private final OfferId id;
 	private final Collection<MessageId> offered;
 
-	OfferImpl(OfferId id, Collection<MessageId> offered) {
-		this.id = id;
+	OfferImpl(Collection<MessageId> offered) {
 		this.offered = offered;
 	}
 
-	public OfferId getId() {
-		return id;
-	}
-
 	public Collection<MessageId> getMessageIds() {
 		return offered;
 	}
diff --git a/components/net/sf/briar/protocol/OfferReader.java b/components/net/sf/briar/protocol/OfferReader.java
index 5dc7e9754673a4e01efb1cf549ad24db3a429785..970b96453c9a2ab153baa9cabe7ffc3e0569c0c4 100644
--- a/components/net/sf/briar/protocol/OfferReader.java
+++ b/components/net/sf/briar/protocol/OfferReader.java
@@ -1,14 +1,11 @@
 package net.sf.briar.protocol;
 
 import java.io.IOException;
-import java.security.MessageDigest;
 import java.util.Collection;
 
 import net.sf.briar.api.FormatException;
-import net.sf.briar.api.crypto.CryptoComponent;
 import net.sf.briar.api.protocol.MessageId;
 import net.sf.briar.api.protocol.Offer;
-import net.sf.briar.api.protocol.OfferId;
 import net.sf.briar.api.protocol.ProtocolConstants;
 import net.sf.briar.api.protocol.Tags;
 import net.sf.briar.api.serial.Consumer;
@@ -17,36 +14,29 @@ import net.sf.briar.api.serial.Reader;
 
 class OfferReader implements ObjectReader<Offer> {
 
-	private final MessageDigest messageDigest;
 	private final ObjectReader<MessageId> messageIdReader;
 	private final OfferFactory offerFactory;
 
-	OfferReader(CryptoComponent crypto, ObjectReader<MessageId> messageIdReader,
+	OfferReader(ObjectReader<MessageId> messageIdReader,
 			OfferFactory offerFactory) {
-		messageDigest = crypto.getMessageDigest();
 		this.messageIdReader = messageIdReader;
 		this.offerFactory = offerFactory;
 	}
 
 	public Offer readObject(Reader r) throws IOException {
-		// Initialise the consumers
+		// Initialise the consumer
 		Consumer counting =
 			new CountingConsumer(ProtocolConstants.MAX_PACKET_LENGTH);
-		DigestingConsumer digesting = new DigestingConsumer(messageDigest);
-		messageDigest.reset();
 		// Read the data
 		r.addConsumer(counting);
-		r.addConsumer(digesting);
 		r.readUserDefinedTag(Tags.OFFER);
 		r.addObjectReader(Tags.MESSAGE_ID, messageIdReader);
 		Collection<MessageId> messages = r.readList(MessageId.class);
 		if(messages.size() > Offer.MAX_IDS_PER_OFFER)
 			throw new FormatException();
 		r.removeObjectReader(Tags.MESSAGE_ID);
-		r.removeConsumer(digesting);
 		r.removeConsumer(counting);
 		// Build and return the offer
-		OfferId id = new OfferId(messageDigest.digest());
-		return offerFactory.createOffer(id, messages);
+		return offerFactory.createOffer(messages);
 	}
 }
diff --git a/components/net/sf/briar/protocol/ProtocolModule.java b/components/net/sf/briar/protocol/ProtocolModule.java
index 79d4bac5867c3dae02210951d8c2b7194e535492..6d36d8efb38cc18522aa7a1f9d5a7f83dcb95c53 100644
--- a/components/net/sf/briar/protocol/ProtocolModule.java
+++ b/components/net/sf/briar/protocol/ProtocolModule.java
@@ -12,7 +12,6 @@ import net.sf.briar.api.protocol.Message;
 import net.sf.briar.api.protocol.MessageEncoder;
 import net.sf.briar.api.protocol.MessageId;
 import net.sf.briar.api.protocol.Offer;
-import net.sf.briar.api.protocol.OfferId;
 import net.sf.briar.api.protocol.ProtocolReaderFactory;
 import net.sf.briar.api.protocol.Request;
 import net.sf.briar.api.protocol.SubscriptionUpdate;
@@ -82,21 +81,14 @@ public class ProtocolModule extends AbstractModule {
 	}
 
 	@Provides
-	ObjectReader<OfferId> getOfferIdReader() {
-		return new OfferIdReader();
-	}
-
-	@Provides
-	ObjectReader<Offer> getOfferReader(CryptoComponent crypto,
-			ObjectReader<MessageId> messageIdReader,
+	ObjectReader<Offer> getOfferReader(ObjectReader<MessageId> messageIdReader,
 			OfferFactory offerFactory) {
-		return new OfferReader(crypto, messageIdReader, offerFactory);
+		return new OfferReader(messageIdReader, offerFactory);
 	}
 
 	@Provides
-	ObjectReader<Request> getRequestReader(ObjectReader<OfferId> offerIdReader,
-			RequestFactory requestFactory) {
-		return new RequestReader(offerIdReader, requestFactory);
+	ObjectReader<Request> getRequestReader(RequestFactory requestFactory) {
+		return new RequestReader(requestFactory);
 	}
 
 	@Provides
diff --git a/components/net/sf/briar/protocol/RequestFactory.java b/components/net/sf/briar/protocol/RequestFactory.java
index 09459765a69e7c3a9eaa7ee57944ef6e865c5df7..005982b826a5c32ae72efceb1fe563d24d6406ec 100644
--- a/components/net/sf/briar/protocol/RequestFactory.java
+++ b/components/net/sf/briar/protocol/RequestFactory.java
@@ -2,10 +2,9 @@ package net.sf.briar.protocol;
 
 import java.util.BitSet;
 
-import net.sf.briar.api.protocol.OfferId;
 import net.sf.briar.api.protocol.Request;
 
 interface RequestFactory {
 
-	Request createRequest(OfferId offerId, BitSet requested);
+	Request createRequest(BitSet requested);
 }
diff --git a/components/net/sf/briar/protocol/RequestFactoryImpl.java b/components/net/sf/briar/protocol/RequestFactoryImpl.java
index 68cce91c54c76c5a595490d3a09f4337cfbd6bd4..0c2c77cb1cd324c4f292adeba8da1125dfbd21f2 100644
--- a/components/net/sf/briar/protocol/RequestFactoryImpl.java
+++ b/components/net/sf/briar/protocol/RequestFactoryImpl.java
@@ -2,12 +2,11 @@ package net.sf.briar.protocol;
 
 import java.util.BitSet;
 
-import net.sf.briar.api.protocol.OfferId;
 import net.sf.briar.api.protocol.Request;
 
 class RequestFactoryImpl implements RequestFactory {
 
-	public Request createRequest(OfferId offerId, BitSet requested) {
-		return new RequestImpl(offerId, requested);
+	public Request createRequest(BitSet requested) {
+		return new RequestImpl(requested);
 	}
 }
diff --git a/components/net/sf/briar/protocol/RequestImpl.java b/components/net/sf/briar/protocol/RequestImpl.java
index 42d3247ee94965b0eb7bac502198322831436575..ddb31898aeb2f4f02ae581ce889eaebf22894d09 100644
--- a/components/net/sf/briar/protocol/RequestImpl.java
+++ b/components/net/sf/briar/protocol/RequestImpl.java
@@ -2,23 +2,16 @@ package net.sf.briar.protocol;
 
 import java.util.BitSet;
 
-import net.sf.briar.api.protocol.OfferId;
 import net.sf.briar.api.protocol.Request;
 
 class RequestImpl implements Request {
 
-	private final OfferId offerId;
 	private final BitSet requested;
 
-	RequestImpl(OfferId offerId, BitSet requested) {
-		this.offerId = offerId;
+	RequestImpl(BitSet requested) {
 		this.requested = requested;
 	}
 
-	public OfferId getOfferId() {
-		return offerId;
-	}
-
 	public BitSet getBitmap() {
 		return requested;
 	}
diff --git a/components/net/sf/briar/protocol/RequestReader.java b/components/net/sf/briar/protocol/RequestReader.java
index 77594c650922d73c92ef7bbf3feaa5c25048137e..88ebec391b77f1a4c8f523632e26e96c1872e5e1 100644
--- a/components/net/sf/briar/protocol/RequestReader.java
+++ b/components/net/sf/briar/protocol/RequestReader.java
@@ -3,7 +3,6 @@ package net.sf.briar.protocol;
 import java.io.IOException;
 import java.util.BitSet;
 
-import net.sf.briar.api.protocol.OfferId;
 import net.sf.briar.api.protocol.ProtocolConstants;
 import net.sf.briar.api.protocol.Request;
 import net.sf.briar.api.protocol.Tags;
@@ -13,12 +12,9 @@ import net.sf.briar.api.serial.Reader;
 
 class RequestReader implements ObjectReader<Request> {
 
-	private final ObjectReader<OfferId> offerIdReader;
 	private final RequestFactory requestFactory;
 
-	RequestReader(ObjectReader<OfferId> offerIdReader,
-			RequestFactory requestFactory) {
-		this.offerIdReader = offerIdReader;
+	RequestReader(RequestFactory requestFactory) {
 		this.requestFactory = requestFactory;
 	}
 
@@ -29,8 +25,6 @@ class RequestReader implements ObjectReader<Request> {
 		// Read the data
 		r.addConsumer(counting);
 		r.readUserDefinedTag(Tags.REQUEST);
-		r.addObjectReader(Tags.OFFER_ID, offerIdReader);
-		OfferId offerId = r.readUserDefined(Tags.OFFER_ID, OfferId.class);
 		byte[] bitmap = r.readBytes(ProtocolConstants.MAX_PACKET_LENGTH);
 		r.removeConsumer(counting);
 		// Convert the bitmap into a BitSet
@@ -41,6 +35,6 @@ class RequestReader implements ObjectReader<Request> {
 				if((bitmap[i] & bit) != 0) b.set(i * 8 + j);
 			}
 		}
-		return requestFactory.createRequest(offerId, b);
+		return requestFactory.createRequest(b);
 	}
 }
diff --git a/components/net/sf/briar/protocol/writers/OfferWriterImpl.java b/components/net/sf/briar/protocol/writers/OfferWriterImpl.java
index 424a021ebd6344c7e08ef1d3073b86fd40e14119..f606172ea009c723e6c61c5f7885e2a63d6811dc 100644
--- a/components/net/sf/briar/protocol/writers/OfferWriterImpl.java
+++ b/components/net/sf/briar/protocol/writers/OfferWriterImpl.java
@@ -2,12 +2,9 @@ package net.sf.briar.protocol.writers;
 
 import java.io.IOException;
 import java.io.OutputStream;
-import java.security.DigestOutputStream;
-import java.security.MessageDigest;
 
 import net.sf.briar.api.protocol.MessageId;
 import net.sf.briar.api.protocol.Offer;
-import net.sf.briar.api.protocol.OfferId;
 import net.sf.briar.api.protocol.Tags;
 import net.sf.briar.api.protocol.writers.OfferWriter;
 import net.sf.briar.api.serial.Writer;
@@ -17,21 +14,17 @@ class OfferWriterImpl implements OfferWriter {
 
 	private final OutputStream out;
 	private final Writer w;
-	private final MessageDigest messageDigest;
 
 	private boolean started = false;
 	private int idsWritten = 0;
 
-	OfferWriterImpl(OutputStream out, WriterFactory writerFactory,
-			MessageDigest messageDigest) {
-		this.out = new DigestOutputStream(out, messageDigest);
+	OfferWriterImpl(OutputStream out, WriterFactory writerFactory) {
+		this.out = out;
 		w = writerFactory.createWriter(out);
-		this.messageDigest = messageDigest;
 	}
 
 	public boolean writeMessageId(MessageId m) throws IOException {
 		if(!started) {
-			messageDigest.reset();
 			w.writeUserDefinedTag(Tags.OFFER);
 			w.writeListStart();
 			started = true;
@@ -42,9 +35,8 @@ class OfferWriterImpl implements OfferWriter {
 		return true;
 	}
 
-	public OfferId finish() throws IOException {
+	public void finish() throws IOException {
 		if(!started) {
-			messageDigest.reset();
 			w.writeUserDefinedTag(Tags.OFFER);
 			w.writeListStart();
 			started = true;
@@ -52,6 +44,5 @@ class OfferWriterImpl implements OfferWriter {
 		w.writeListEnd();
 		out.flush();
 		started = false;
-		return new OfferId(messageDigest.digest());
 	}
 }
diff --git a/components/net/sf/briar/protocol/writers/ProtocolWriterFactoryImpl.java b/components/net/sf/briar/protocol/writers/ProtocolWriterFactoryImpl.java
index ce14908f1caee20b48565609407d37cf2af20950..25999403679a4406a1246f38cb61ebd77d4035c9 100644
--- a/components/net/sf/briar/protocol/writers/ProtocolWriterFactoryImpl.java
+++ b/components/net/sf/briar/protocol/writers/ProtocolWriterFactoryImpl.java
@@ -36,7 +36,7 @@ class ProtocolWriterFactoryImpl implements ProtocolWriterFactory {
 	}
 
 	public OfferWriter createOfferWriter(OutputStream out) {
-		return new OfferWriterImpl(out, writerFactory, messageDigest);
+		return new OfferWriterImpl(out, writerFactory);
 	}
 
 	public RequestWriter createRequestWriter(OutputStream out) {
diff --git a/components/net/sf/briar/protocol/writers/RequestWriterImpl.java b/components/net/sf/briar/protocol/writers/RequestWriterImpl.java
index d50909dabb849489df723087de4f26a77a5f2813..6e6ce137ad48018cd1f1a45313132c8b5021ea16 100644
--- a/components/net/sf/briar/protocol/writers/RequestWriterImpl.java
+++ b/components/net/sf/briar/protocol/writers/RequestWriterImpl.java
@@ -4,7 +4,6 @@ import java.io.IOException;
 import java.io.OutputStream;
 import java.util.BitSet;
 
-import net.sf.briar.api.protocol.OfferId;
 import net.sf.briar.api.protocol.Tags;
 import net.sf.briar.api.protocol.writers.RequestWriter;
 import net.sf.briar.api.serial.Writer;
@@ -20,11 +19,9 @@ class RequestWriterImpl implements RequestWriter {
 		w = writerFactory.createWriter(out);
 	}
 
-	public void writeRequest(OfferId offerId, BitSet b, int length)
+	public void writeRequest(BitSet b, int length)
 	throws IOException {
 		w.writeUserDefinedTag(Tags.REQUEST);
-		w.writeUserDefinedTag(Tags.OFFER_ID);
-		w.writeBytes(offerId.getBytes());
 		// If the number of bits isn't a multiple of 8, round up to a byte
 		int bytes = length % 8 == 0 ? length / 8 : length / 8 + 1;
 		byte[] bitmap = new byte[bytes];
diff --git a/test/net/sf/briar/FileReadWriteTest.java b/test/net/sf/briar/FileReadWriteTest.java
index fa54fd4a3a929af906ff270f550dcd6aed66e828..de0dfd619b61d48bbc77e93d136be7eeb4f3a2bb 100644
--- a/test/net/sf/briar/FileReadWriteTest.java
+++ b/test/net/sf/briar/FileReadWriteTest.java
@@ -27,7 +27,6 @@ import net.sf.briar.api.protocol.Message;
 import net.sf.briar.api.protocol.MessageEncoder;
 import net.sf.briar.api.protocol.MessageId;
 import net.sf.briar.api.protocol.Offer;
-import net.sf.briar.api.protocol.OfferId;
 import net.sf.briar.api.protocol.ProtocolReader;
 import net.sf.briar.api.protocol.ProtocolReaderFactory;
 import net.sf.briar.api.protocol.Request;
@@ -79,7 +78,6 @@ public class FileReadWriteTest extends TestCase {
 	private final Message message, message1, message2, message3;
 	private final String authorName = "Alice";
 	private final String messageBody = "Hello world";
-	private final OfferId offerId;
 	private final Map<String, Map<String, String>> transports;
 
 	public FileReadWriteTest() throws Exception {
@@ -120,7 +118,6 @@ public class FileReadWriteTest extends TestCase {
 		message3 = messageEncoder.encodeMessage(MessageId.NONE, group1,
 				groupKeyPair.getPrivate(), author, authorKeyPair.getPrivate(),
 				messageBody.getBytes("UTF-8"));
-		offerId = new OfferId(TestUtils.getRandomId());
 		transports = Collections.singletonMap("foo",
 				Collections.singletonMap("bar", "baz"));
 	}
@@ -160,7 +157,7 @@ public class FileReadWriteTest extends TestCase {
 		BitSet requested = new BitSet(4);
 		requested.set(1);
 		requested.set(3);
-		r.writeRequest(offerId, requested, 4);
+		r.writeRequest(requested, 4);
 
 		SubscriptionWriter s =
 			protocolWriterFactory.createSubscriptionWriter(out);
@@ -229,7 +226,6 @@ public class FileReadWriteTest extends TestCase {
 		// Read the request
 		assertTrue(protocolReader.hasRequest());
 		Request req = protocolReader.readRequest();
-		assertEquals(offerId, req.getOfferId());
 		BitSet requested = req.getBitmap();
 		assertFalse(requested.get(0));
 		assertTrue(requested.get(1));
diff --git a/test/net/sf/briar/db/DatabaseComponentTest.java b/test/net/sf/briar/db/DatabaseComponentTest.java
index 9454785c95a135ed999a99f4575ddc5055f6079d..04297083df6d9fdefafcbc5ab65094d67d6f5f98 100644
--- a/test/net/sf/briar/db/DatabaseComponentTest.java
+++ b/test/net/sf/briar/db/DatabaseComponentTest.java
@@ -25,7 +25,6 @@ import net.sf.briar.api.protocol.GroupId;
 import net.sf.briar.api.protocol.Message;
 import net.sf.briar.api.protocol.MessageId;
 import net.sf.briar.api.protocol.Offer;
-import net.sf.briar.api.protocol.OfferId;
 import net.sf.briar.api.protocol.SubscriptionUpdate;
 import net.sf.briar.api.protocol.TransportUpdate;
 import net.sf.briar.api.protocol.writers.AckWriter;
@@ -50,7 +49,6 @@ public abstract class DatabaseComponentTest extends TestCase {
 	protected final ContactId contactId;
 	protected final GroupId groupId;
 	protected final MessageId messageId, parentId;
-	protected final OfferId offerId;
 	private final long timestamp;
 	private final int size;
 	private final byte[] raw;
@@ -67,7 +65,6 @@ public abstract class DatabaseComponentTest extends TestCase {
 		groupId = new GroupId(TestUtils.getRandomId());
 		messageId = new MessageId(TestUtils.getRandomId());
 		parentId = new MessageId(TestUtils.getRandomId());
-		offerId = new OfferId(TestUtils.getRandomId());
 		timestamp = System.currentTimeMillis();
 		size = 1234;
 		raw = new byte[size];
@@ -1036,9 +1033,7 @@ public abstract class DatabaseComponentTest extends TestCase {
 			will(returnValue(true)); // Visible - do not request message # 1
 			oneOf(database).setStatusSeenIfVisible(txn, contactId, messageId2);
 			will(returnValue(false)); // Not visible - request message # 2
-			oneOf(offer).getId();
-			will(returnValue(offerId));
-			oneOf(requestWriter).writeRequest(offerId, expectedRequest, 3);
+			oneOf(requestWriter).writeRequest(expectedRequest, 3);
 		}});
 		DatabaseComponent db = createDatabaseComponent(database, cleaner);
 
diff --git a/test/net/sf/briar/protocol/ProtocolReadWriteTest.java b/test/net/sf/briar/protocol/ProtocolReadWriteTest.java
index 537da36b5e1eb32c0bb852f783294cd2a8363d27..393a86816fff98df3f9b8c426b96fdb9dbfdf555 100644
--- a/test/net/sf/briar/protocol/ProtocolReadWriteTest.java
+++ b/test/net/sf/briar/protocol/ProtocolReadWriteTest.java
@@ -17,7 +17,6 @@ import net.sf.briar.api.protocol.Message;
 import net.sf.briar.api.protocol.MessageEncoder;
 import net.sf.briar.api.protocol.MessageId;
 import net.sf.briar.api.protocol.Offer;
-import net.sf.briar.api.protocol.OfferId;
 import net.sf.briar.api.protocol.ProtocolReader;
 import net.sf.briar.api.protocol.ProtocolReaderFactory;
 import net.sf.briar.api.protocol.Request;
@@ -47,7 +46,6 @@ public class ProtocolReadWriteTest extends TestCase {
 	private final Group group;
 	private final Message message;
 	private final String messageBody = "Hello world";
-	private final OfferId offerId;
 	private final BitSet bitSet;
 	private final Map<Group, Long> subscriptions;
 	private final Map<String, Map<String, String>> transports;
@@ -65,7 +63,6 @@ public class ProtocolReadWriteTest extends TestCase {
 		MessageEncoder messageEncoder = i.getInstance(MessageEncoder.class);
 		message = messageEncoder.encodeMessage(MessageId.NONE, group,
 				messageBody.getBytes("UTF-8"));
-		offerId = new OfferId(TestUtils.getRandomId());
 		bitSet = new BitSet();
 		bitSet.set(3);
 		bitSet.set(7);
@@ -92,7 +89,7 @@ public class ProtocolReadWriteTest extends TestCase {
 		o.finish();
 
 		RequestWriter r = writerFactory.createRequestWriter(out);
-		r.writeRequest(offerId, bitSet, 10);
+		r.writeRequest(bitSet, 10);
 
 		SubscriptionWriter s = writerFactory.createSubscriptionWriter(out);
 		s.writeSubscriptions(subscriptions, timestamp);
diff --git a/test/net/sf/briar/protocol/RequestReaderTest.java b/test/net/sf/briar/protocol/RequestReaderTest.java
index 8be4c17049b808a2f7357cfd73c359796cfdb379..d93ec834a668a8246462879be445b0a72777d60c 100644
--- a/test/net/sf/briar/protocol/RequestReaderTest.java
+++ b/test/net/sf/briar/protocol/RequestReaderTest.java
@@ -6,11 +6,9 @@ import java.util.BitSet;
 
 import junit.framework.TestCase;
 import net.sf.briar.api.FormatException;
-import net.sf.briar.api.protocol.OfferId;
 import net.sf.briar.api.protocol.ProtocolConstants;
 import net.sf.briar.api.protocol.Request;
 import net.sf.briar.api.protocol.Tags;
-import net.sf.briar.api.protocol.UniqueId;
 import net.sf.briar.api.serial.Reader;
 import net.sf.briar.api.serial.ReaderFactory;
 import net.sf.briar.api.serial.Writer;
@@ -41,8 +39,7 @@ public class RequestReaderTest extends TestCase {
 	@Test
 	public void testFormatExceptionIfRequestIsTooLarge() throws Exception {
 		RequestFactory requestFactory = context.mock(RequestFactory.class);
-		RequestReader requestReader =
-			new RequestReader(new OfferIdReader(), requestFactory);
+		RequestReader requestReader = new RequestReader(requestFactory);
 
 		byte[] b = createRequest(true);
 		ByteArrayInputStream in = new ByteArrayInputStream(b);
@@ -60,12 +57,10 @@ public class RequestReaderTest extends TestCase {
 	public void testNoFormatExceptionIfRequestIsMaximumSize() throws Exception {
 		final RequestFactory requestFactory =
 			context.mock(RequestFactory.class);
-		RequestReader requestReader =
-			new RequestReader(new OfferIdReader(), requestFactory);
+		RequestReader requestReader = new RequestReader(requestFactory);
 		final Request request = context.mock(Request.class);
 		context.checking(new Expectations() {{
-			oneOf(requestFactory).createRequest(with(any(OfferId.class)),
-					with(any(BitSet.class)));
+			oneOf(requestFactory).createRequest(with(any(BitSet.class)));
 			will(returnValue(request));
 		}});
 
@@ -101,8 +96,8 @@ public class RequestReaderTest extends TestCase {
 			// Deserialise the request
 			ByteArrayInputStream in = new ByteArrayInputStream(b);
 			Reader reader = readerFactory.createReader(in);
-			RequestReader requestReader = new RequestReader(new OfferIdReader(),
-						new RequestFactoryImpl());
+			RequestReader requestReader =
+				new RequestReader(new RequestFactoryImpl());
 			reader.addObjectReader(Tags.REQUEST, requestReader);
 			Request r = reader.readUserDefined(Tags.REQUEST, Request.class);
 			BitSet decoded = r.getBitmap();
@@ -121,14 +116,9 @@ public class RequestReaderTest extends TestCase {
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
 		Writer w = writerFactory.createWriter(out);
 		w.writeUserDefinedTag(Tags.REQUEST);
-		w.writeUserDefinedTag(Tags.OFFER_ID);
-		w.writeBytes(new byte[UniqueId.LENGTH]);
-		// Allow one byte for the REQUEST tag, one byte for the OFFER_ID tag,
-		// one byte for the BYTES tag, one byte for the length as a uint7,
-		// UniqueID.LENGTH bytes for the offer ID, one byte for the BYTES tag,
+		// Allow one byte for the REQUEST tag, one byte for the BYTES tag,
 		// and five bytes for the length as an int32
-		int overhead = UniqueId.LENGTH + 10;
-		int size = ProtocolConstants.MAX_PACKET_LENGTH - overhead;
+		int size = ProtocolConstants.MAX_PACKET_LENGTH - 7;
 		if(tooBig) size++;
 		w.writeBytes(new byte[size]);
 		assertEquals(tooBig, out.size() > ProtocolConstants.MAX_PACKET_LENGTH);
@@ -139,8 +129,6 @@ public class RequestReaderTest extends TestCase {
 		ByteArrayOutputStream out = new ByteArrayOutputStream();
 		Writer w = writerFactory.createWriter(out);
 		w.writeUserDefinedTag(Tags.REQUEST);
-		w.writeUserDefinedTag(Tags.OFFER_ID);
-		w.writeBytes(new byte[UniqueId.LENGTH]);
 		w.writeBytes(bitmap);
 		return out.toByteArray();
 	}
diff --git a/test/net/sf/briar/protocol/writers/ConstantsTest.java b/test/net/sf/briar/protocol/writers/ConstantsTest.java
index 1a57de911366b383ae6658b9aada4e61390f30af..45b08284dd12802a6bb9930a9136922979e79935 100644
--- a/test/net/sf/briar/protocol/writers/ConstantsTest.java
+++ b/test/net/sf/briar/protocol/writers/ConstantsTest.java
@@ -108,8 +108,7 @@ public class ConstantsTest extends TestCase {
 		// Create an offer with the maximum number of message IDs
 		ByteArrayOutputStream out = new ByteArrayOutputStream(
 				ProtocolConstants.MAX_PACKET_LENGTH);
-		OfferWriter o = new OfferWriterImpl(out, writerFactory,
-				crypto.getMessageDigest());
+		OfferWriter o = new OfferWriterImpl(out, writerFactory);
 		for(int i = 0; i < Offer.MAX_IDS_PER_OFFER; i++) {
 			assertTrue(o.writeMessageId(new MessageId(
 					TestUtils.getRandomId())));
diff --git a/test/net/sf/briar/protocol/writers/RequestWriterImplTest.java b/test/net/sf/briar/protocol/writers/RequestWriterImplTest.java
index e7e5d7e73f3577cc18fba3bad26003a6a3efa749..c9a5f178fee289eaa3df84b50d40dc73e1adc384 100644
--- a/test/net/sf/briar/protocol/writers/RequestWriterImplTest.java
+++ b/test/net/sf/briar/protocol/writers/RequestWriterImplTest.java
@@ -5,8 +5,6 @@ import java.io.IOException;
 import java.util.BitSet;
 
 import junit.framework.TestCase;
-import net.sf.briar.api.protocol.OfferId;
-import net.sf.briar.api.protocol.UniqueId;
 import net.sf.briar.api.protocol.writers.RequestWriter;
 import net.sf.briar.api.serial.WriterFactory;
 import net.sf.briar.serial.SerialModule;
@@ -20,13 +18,11 @@ import com.google.inject.Injector;
 public class RequestWriterImplTest extends TestCase {
 
 	private final WriterFactory writerFactory;
-	private final OfferId offerId;
 
 	public RequestWriterImplTest() {
 		super();
 		Injector i = Guice.createInjector(new SerialModule());
 		writerFactory = i.getInstance(WriterFactory.class);
-		offerId = new OfferId(new byte[UniqueId.LENGTH]);
 	}
 
 	@Test
@@ -45,14 +41,10 @@ public class RequestWriterImplTest extends TestCase {
 		b.set(11);
 		b.set(12);
 		b.set(15);
-		r.writeRequest(offerId, b, 16);
-		// Short user tag 11, short user tag 10, bytes with length 32 as a
-		// uint7, 32 zero bytes, short bytes with length 2, 0xD959
+		r.writeRequest(b, 16);
+		// Short user tag 11, short bytes with length 2, 0xD959
 		byte[] output = out.toByteArray();
-		assertEquals("CB" + "CA" + "F6" + "20"
-				+ "00000000000000000000000000000000"
-				+ "00000000000000000000000000000000"
-				+ "92" + "D959", StringUtils.toHexString(output));
+		assertEquals("CB" + "92" + "D959", StringUtils.toHexString(output));
 	}
 
 	@Test
@@ -70,13 +62,9 @@ public class RequestWriterImplTest extends TestCase {
 		b.set(9);
 		b.set(11);
 		b.set(12);
-		r.writeRequest(offerId, b, 13);
-		// Short user tag 11, short user tag 10, bytes with length 32 as a
-		// uint7, 32 zero bytes, short bytes with length 2, 0x59D8
+		r.writeRequest(b, 13);
+		// Short user tag 11, short bytes with length 2, 0x59D8
 		byte[] output = out.toByteArray();
-		assertEquals("CB" + "CA" + "F6" + "20"
-				+ "00000000000000000000000000000000"
-				+ "00000000000000000000000000000000"
-				+ "92" + "59D8", StringUtils.toHexString(output));
+		assertEquals("CB" + "92" + "59D8", StringUtils.toHexString(output));
 	}
 }