diff --git a/doc/publican/sources/Protocol.xml b/doc/publican/sources/Protocol.xml
index 33df6a9e..74f2aea1 100644
--- a/doc/publican/sources/Protocol.xml
+++ b/doc/publican/sources/Protocol.xml
@@ -196,10 +196,16 @@
Creating Objects
- Each object has a unique ID. The IDs are allocated by the
- client, from a range of IDs. The server tracks how many
- IDs are left in the current range and sends a new range
- when the client is about to run out.
+ Each object has a unique ID. The IDs are allocated by the entity
+ creating the object (either client or server). IDs allocated by the
+ client are in the range [1, 0xfeffffff] while IDs allocated by the
+ server are in the range [0xff000000, 0xffffffff]. The 0 ID is
+ reserved to represent a null or non-existant object.
+
+ For efficiency purposes, the IDs are densely packed in the sense that
+ the ID N will not be used until N-1 has been used. Any ID allocation
+ algorithm that does not maintain this property is incompatible with
+ the implementation in libwayland.