diff --git a/changelog b/changelog
index e3166c2aea61721c566b76903675a4e89b14b1d5..1652fe8f0283474406272b60df342a81959d9292 100644
--- a/changelog
+++ b/changelog
@@ -11,6 +11,11 @@ There's a new member in the info struct used to control context creation,
 ssl_private_key_password, which allows passing into lws the passphrase on
 an SSL cetificate
 
+There's a new member in struct protocols, id, which is ignored by lws but can
+be used by the user code to mark the selected protocol by user-defined version
+or capabliity flag information, for the case multiple versions of a protocol are
+supported.
+
 
 v1.3-chrome37-firefox30
 =======================
diff --git a/lib/libwebsockets.h b/lib/libwebsockets.h
index 203c54e1cbc3b1eaeea23c4cb7fae5064a976939..71b6a65a8fc3d370cdcefe393cca50c53b06128b 100644
--- a/lib/libwebsockets.h
+++ b/lib/libwebsockets.h
@@ -863,6 +863,12 @@ typedef int (extension_callback_function)(struct libwebsocket_context *context,
  *		protocols where you stream big blocks, set to nonzero and use
  *		the return value from libwebsocket_write() to manage how much
  *		got send yourself.
+ * @id:		ignored by lws, but useful to contain user information bound
+ *		to the selected protocol.  For example if this protocol was
+ *		called "myprotocol-v2", you might set id to 2, and the user
+ *		code that acts differently according to the version can do so by
+ *		switch (wsi->protocol->id), user code might use some bits as
+ *		capability flags based on selected protocol version, etc.
  * @owning_server:	the server init call fills in this opaque pointer when
  *		registering this protocol with the server.
  * @protocol_index: which protocol we are starting from zero
@@ -882,6 +888,7 @@ struct libwebsocket_protocols {
 	size_t per_session_data_size;
 	size_t rx_buffer_size;
 	int no_buffer_all_partial_tx;
+	unsigned int id;
 
 	/*
 	 * below are filled in on server init and can be left uninitialized,