diff --git a/nq/source/host.c b/nq/source/host.c
index 5efd0dca8..705a0f577 100644
--- a/nq/source/host.c
+++ b/nq/source/host.c
@@ -112,6 +112,8 @@ cvar_t     *pausable;
 
 cvar_t     *temp1;
 
+cvar_t     *cl_demospeed;
+
 extern cvar_t *cl_writecfg;
 extern int  fps_count;
 
@@ -249,6 +251,10 @@ Host_InitLocal (void)
 	pausable = Cvar_Get ("pausable", "1", CVAR_NONE, NULL, "None");
 	temp1 = Cvar_Get ("temp1", "0", CVAR_NONE, NULL, "None");
 
+	cl_demospeed = Cvar_Get ("cl_demospeed", "1.0", CVAR_NONE, NULL,
+							 "adjust demo playback speed. 1.0 = normal, "
+							 "< 1 slow-mo, > 1 timelapse");
+
 	Host_FindMaxClients ();
 
 	host_time = 1.0;				// so a think at time 0 won't get called
@@ -495,9 +501,19 @@ Host_ClearMemory (void)
 qboolean
 Host_FilterTime (float time)
 {
+	float       timedifference;
+	float       timescale = 1.0;
+
+	if (cls.demoplayback) {
+		timescale = max (0, cl_demospeed->value);
+		time *= timescale;
+	}
+
 	realtime += time;
 
-	if (!cls.timedemo && realtime - oldrealtime < 1.0 / 72.0)
+	timedifference = (timescale / 72.0) - (realtime - oldrealtime);
+
+	if (!cls.timedemo && (timedifference > 0))
 		return false;					// framerate is too high
 
 	host_frametime = realtime - oldrealtime;