diff --git a/src/command.c b/src/command.c
index 399714bd0d65758489634477a8bf84b2444ff659..8f9166361d35f9893160d6a2ca54f88e40b1147a 100644
--- a/src/command.c
+++ b/src/command.c
@@ -1988,7 +1988,7 @@ static void CV_SetCVar(consvar_t *var, const char *value, boolean stealth)
 	if (!var->string)
 		I_Error("CV_Set: %s no string set!\n", var->name);
 #endif
-	if (!var || !var->string || !value || !stricmp(var->string, value))
+	if (!var || !var->string || !value || (var->can_change == NULL && !stricmp(var->string, value)))
 		return; // no changes
 
 	if (var->flags & CV_NETVAR)
diff --git a/src/netcode/d_netcmd.c b/src/netcode/d_netcmd.c
index 64feeeda314e6423354fbca9635fa30d6769db51..961de44c2dd8a5987f6f0e0bdd37032d8ec41ce1 100644
--- a/src/netcode/d_netcmd.c
+++ b/src/netcode/d_netcmd.c
@@ -4910,14 +4910,16 @@ static void Name2_OnChange(void)
 
 static boolean Skin_CanChange(const char *valstr)
 {
-	(void)valstr;
-
 	if (!Playing())
 		return true; // do whatever you want
 
 	if (!(multiplayer || netgame)) // In single player.
 		return true;
 
+	// You already are that skin.
+	if (stricmp(skins[players[consoleplayer].skin]->name, valstr) == 0)
+		return false;
+
 	if (CanChangeSkin(consoleplayer) && !P_PlayerMoving(consoleplayer))
 		return true;
 	else
@@ -4929,11 +4931,13 @@ static boolean Skin_CanChange(const char *valstr)
 
 static boolean Skin2_CanChange(const char *valstr)
 {
-	(void)valstr;
-
 	if (!Playing() || !splitscreen)
 		return true; // do whatever you want
 
+	// You already are that skin.
+	if (stricmp(skins[players[secondarydisplayplayer].skin]->name, valstr) == 0)
+		return false;
+
 	if (CanChangeSkin(secondarydisplayplayer) && !P_PlayerMoving(secondarydisplayplayer))
 		return true;
 	else