diff --git a/engine/server/sv_user.c b/engine/server/sv_user.c
index 436b37d85..966ad79a3 100644
--- a/engine/server/sv_user.c
+++ b/engine/server/sv_user.c
@@ -3508,6 +3508,12 @@ void AddAllEntsToPmove (void)
 
 int SV_PMTypeForClient (client_t *cl)
 {
+	if (sv.demostatevalid)
+	{	//force noclip... This does create problems for closing demos.
+		if (cl->zquake_extensions & Z_EXT_PM_TYPE_NEW)
+			return PM_SPECTATOR;
+		return PM_OLD_SPECTATOR;
+	}
 	if (cl->edict->v.movetype == MOVETYPE_NOCLIP)
 	{
 		if (cl->zquake_extensions & Z_EXT_PM_TYPE_NEW)
@@ -4139,7 +4145,7 @@ haveannothergo:
 			o[1] = MSG_ReadCoord();
 			o[2] = MSG_ReadCoord();
 			// only allowed by spectators
-			if (host_client->spectator) {
+			if (host_client->spectator||sv.mvdplayback) {
 				VectorCopy(o, sv_player->v.origin);
 				SV_LinkEdict(sv_player, false);
 			}