diff --git a/src/http-mserv.c b/src/http-mserv.c
index db81ee1e7a30abedc9bd70bf64affc341e0f2390..a9009bd24dfd74d546d8dc6fb7e7f63f9ba888f5 100644
--- a/src/http-mserv.c
+++ b/src/http-mserv.c
@@ -44,6 +44,11 @@ consvar_t cv_masterserver_debug = {
 	MasterServer_Debug_OnChange, 0, NULL, NULL, 0, 0, NULL/* C90 moment */
 };
 
+consvar_t cv_masterserver_token = {
+	"masterserver_token", "", CV_SAVE, NULL,
+	NULL, 0, NULL, NULL, 0, 0, NULL/* C90 moment */
+};
+
 static int hms_started;
 
 static char *hms_api;
@@ -100,7 +105,9 @@ HMS_connect (const char *format, ...)
 	va_list ap;
 	CURL *curl;
 	char *url;
+	char *quack_token;
 	size_t seek;
+	size_t token_length;
 	struct HMS_buffer *buffer;
 
 	if (! hms_started)
@@ -127,6 +134,17 @@ HMS_connect (const char *format, ...)
 		return NULL;
 	}
 
+	if (cv_masterserver_token.string[0])
+	{
+		quack_token = curl_easy_escape(curl, cv_masterserver_token.string, 0);
+		token_length = ( sizeof "?token="-1 )+ strlen(quack_token);
+	}
+	else
+	{
+		quack_token = NULL;
+		token_length = 0;
+	}
+
 #ifdef HAVE_THREADS
 	I_lock_mutex(&hms_api_mutex);
 #endif
@@ -134,7 +152,7 @@ HMS_connect (const char *format, ...)
 	seek = strlen(hms_api) + 1;/* + '/' */
 
 	va_start (ap, format);
-	url = malloc(seek + vsnprintf(0, 0, format, ap) + 1);
+	url = malloc(seek + vsnprintf(0, 0, format, ap) + token_length + 1);
 	va_end (ap);
 
 	sprintf(url, "%s/", hms_api);
@@ -144,9 +162,12 @@ HMS_connect (const char *format, ...)
 #endif
 
 	va_start (ap, format);
-	vsprintf(&url[seek], format, ap);
+	seek += vsprintf(&url[seek], format, ap);
 	va_end (ap);
 
+	if (quack_token)
+		sprintf(&url[seek], "?token=%s", quack_token);
+
 	CONS_Printf("HMS: connecting '%s'...\n", url);
 
 	buffer = malloc(sizeof *buffer);
@@ -174,6 +195,7 @@ HMS_connect (const char *format, ...)
 	curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, HMS_on_read);
 	curl_easy_setopt(curl, CURLOPT_WRITEDATA, buffer);
 
+	curl_free(quack_token);
 	free(url);
 
 	return buffer;
diff --git a/src/mserv.c b/src/mserv.c
index 99224ce233935ea99b6883c4557b30cce66dbde4..f3d414c92909d859c0acdc9a0ebafcab452b9d3d 100644
--- a/src/mserv.c
+++ b/src/mserv.c
@@ -89,6 +89,7 @@ void AddMServCommands(void)
 	CV_RegisterVar(&cv_masterserver_update_rate);
 	CV_RegisterVar(&cv_masterserver_timeout);
 	CV_RegisterVar(&cv_masterserver_debug);
+	CV_RegisterVar(&cv_masterserver_token);
 	CV_RegisterVar(&cv_servername);
 	COM_AddCommand("listserv", Command_Listserv_f);
 #endif
diff --git a/src/mserv.h b/src/mserv.h
index 943a80d08c805e4025fb158ee5a7c956e310dba5..9269c408ac4afab51ee56076fb05b91cb44a9545 100644
--- a/src/mserv.h
+++ b/src/mserv.h
@@ -68,6 +68,7 @@ extern consvar_t cv_masterserver, cv_servername;
 extern consvar_t cv_masterserver_update_rate;
 extern consvar_t cv_masterserver_timeout;
 extern consvar_t cv_masterserver_debug;
+extern consvar_t cv_masterserver_token;
 
 // < 0 to not connect (usually -1) (offline mode)
 // == 0 to show all rooms, not a valid hosting room