diff --git a/docs/zandronum-history.txt b/docs/zandronum-history.txt
--- a/docs/zandronum-history.txt
+++ b/docs/zandronum-history.txt
@@ -45,7 +45,7 @@
 +	- The authentication mechanism for non-map related lumps now allows Freedoom 0.10/Doom clients to join Doom/Freedoom 0.10 servers. [Torr Samaho] 
 !	- Spectators may now move freely even when the game has ended and players are frozen in place. [Dusk]
 !	- The "wrong protocol version" network error now shows the full server and client version. [Torr Samaho]
-!	- Since the only purpose of the CVAR sv_useticbuffer is to debug problems with the client movement buffer, it is now restricted to testing binaries. [Torr Samaho]
+!	- Since the only purpose of the CVARs sv_useticbuffer and sv_limitcommands is for debug, they are now restricted to testing binaries. [Torr Samaho, Dusk]
 !	- 'SR50 + turning' movement commands are now clamped to 'SR50' on client and server. [Circunei Z]
 !	- Joypad strafing movements are now capped at SR40 speed. [Leonard]
 !	- Dropping is now allowed in competitive gamemodes, unless sv_nodrop explicitly disallows it. [Dusk]
diff --git a/src/c_cvars.cpp b/src/c_cvars.cpp
--- a/src/c_cvars.cpp
+++ b/src/c_cvars.cpp
@@ -88,6 +88,14 @@
 
 FBaseCVar::FBaseCVar (const char *var_name, DWORD flags, void (*callback)(FBaseCVar &))
 {
+	// [TP] Support for constants
+	if ( flags & CVAR_CONSTANT )
+	{
+		flags |= CVAR_NOSET;
+		var_name = NULL;
+		EnableNoSet();
+	}
+
 	FBaseCVar *var;
 
 	var = FindCVar (var_name, NULL);
diff --git a/src/c_cvars.h b/src/c_cvars.h
--- a/src/c_cvars.h
+++ b/src/c_cvars.h
@@ -72,6 +72,9 @@
 
 	// [BB] This cvar may not be changed by ConsoleCommand.
 	CVAR_NOSETBYACS = 131072,
+
+	// [TP] The CVar acts as a constant and doesn't exist in the console.
+	CVAR_CONSTANT = 262144,
 };
 
 union UCVarValue
diff --git a/src/sv_main.cpp b/src/sv_main.cpp
--- a/src/sv_main.cpp
+++ b/src/sv_main.cpp
@@ -271,9 +271,7 @@
 CVAR( Int, sv_maxclientsperip, 2, CVAR_ARCHIVE )
 CVAR( Int, sv_afk2spec, 0, CVAR_ARCHIVE ) // [K6]
 CVAR( Bool, sv_forcelogintojoin, false, CVAR_ARCHIVE|CVAR_NOSETBYACS )
-#if (BUILD_ID != BUILD_RELEASE)
-CVAR( Bool, sv_useticbuffer, true, CVAR_ARCHIVE|CVAR_NOSETBYACS )
-#endif
+CVAR( Bool, sv_useticbuffer, true, CVAR_ARCHIVE|CVAR_NOSETBYACS|CVAR_DEBUGONLY )
 
 CUSTOM_CVAR( String, sv_adminlistfile, "adminlist.txt", CVAR_ARCHIVE|CVAR_NOSETBYACS )
 {
@@ -366,7 +364,7 @@
 // [TP] Whether to enforce command limits. Set this false to disable
 // flood protection.
 //
-CUSTOM_CVAR( Bool, sv_limitcommands, true, CVAR_ARCHIVE | CVAR_NOSETBYACS | CVAR_SERVERINFO )
+CUSTOM_CVAR( Bool, sv_limitcommands, true, CVAR_ARCHIVE | CVAR_NOSETBYACS | CVAR_SERVERINFO | CVAR_DEBUGONLY )
 {
 	// [TP] The client also enforces command limits so this cvar must be synced.
 	if ( NETWORK_GetState() == NETSTATE_SERVER )
@@ -4658,9 +4656,7 @@
 {
 	CommandType *cmd = new CommandType ( pByteStream );
 
-#if (BUILD_ID != BUILD_RELEASE)
 	if ( sv_useticbuffer )
-#endif
 	{
 		g_aClients[g_lCurrentClient].MoveCMDs.Push ( cmd );
 		return false;
diff --git a/src/version.h b/src/version.h
--- a/src/version.h
+++ b/src/version.h
@@ -152,6 +152,14 @@
 // [BC] This is what's displayed as the title for server windows.
 #define	SERVERCONSOLE_TITLESTRING	GAMENAME " v" DOTVERSIONSTR " Server"
 
+// [TP] Convenience CVAR flag for CVAR_CONSTANT -- needs to be defined here because version.h isn't included
+// everywhere where c_cvars.h is.
+#if BUILD_ID != BUILD_RELEASE
+# define CVAR_DEBUGONLY 0
+#else
+# define CVAR_DEBUGONLY CVAR_CONSTANT
+#endif
+
 #ifdef unix
 #define HOME_DIR "~/." GAMENAMELOWERCASE
 #define GAME_DIR "." GAMENAMELOWERCASE
