diff --git a/src/d_netcmd.c b/src/d_netcmd.c
index 374fbe9690902b38fd55b92c2332e4cf7cc7aef3..b2b6028f172a6a71090b2b2f7c739d986c447568 100644
--- a/src/d_netcmd.c
+++ b/src/d_netcmd.c
@@ -854,6 +854,7 @@ void D_RegisterClientCommands(void)
 	CV_RegisterVar(&cv_fullscreen);
 	CV_RegisterVar(&cv_renderview);
 	CV_RegisterVar(&cv_renderwalls);
+	CV_RegisterVar(&cv_renderfloors);
 	CV_RegisterVar(&cv_renderer);
 	CV_RegisterVar(&cv_scr_depth);
 	CV_RegisterVar(&cv_scr_width);
diff --git a/src/hardware/hw_main.c b/src/hardware/hw_main.c
index 466c6653869fd887df25e2989e41fcbc42062d48..e281b8a4cbf7334fbfe90d32bf8df5fe78b05e6d 100644
--- a/src/hardware/hw_main.c
+++ b/src/hardware/hw_main.c
@@ -585,6 +585,9 @@ static void HWR_RenderPlane(subsector_t *subsector, extrasubsector_t *xsub, bool
 		PolyFlags |= PF_ColorMapped;
 	}
 
+	if (!cv_renderfloors.value)
+		return;
+
 	HWR_ProcessPolygon(&Surf, planeVerts, nrPlaneVerts, PolyFlags, shader, false);
 
 	if (subsector)
diff --git a/src/r_plane.c b/src/r_plane.c
index ea4dfa4e8a8c13d4aad4ed8260d6da37e8fea00a..135282b83381698b36b7336d0905a8e16848af67 100644
--- a/src/r_plane.c
+++ b/src/r_plane.c
@@ -576,6 +576,9 @@ void R_ExpandPlane(visplane_t *pl, INT32 start, INT32 stop)
 //
 void R_MakeSpans(INT32 x, INT32 t1, INT32 b1, INT32 t2, INT32 b2)
 {
+	if (!cv_renderfloors.value)
+		return;
+
 	//    Alam: from r_splats's R_RasterizeFloorSplat
 	if (t1 >= vid.height) t1 = vid.height-1;
 	if (b1 >= vid.height) b1 = vid.height-1;
diff --git a/src/screen.c b/src/screen.c
index 5576cc51491bb4e1e28180f3b935301dbeebfce0..d653f5273795a43901431a797a208dacd34ebf41 100644
--- a/src/screen.c
+++ b/src/screen.c
@@ -69,6 +69,7 @@ consvar_t cv_scr_height = CVAR_INIT ("scr_height", "800", CV_SAVE, CV_Unsigned,
 consvar_t cv_scr_depth = CVAR_INIT ("scr_depth", "16 bits", CV_SAVE, scr_depth_cons_t, NULL);
 consvar_t cv_renderview = CVAR_INIT ("renderview", "On", 0, CV_OnOff, NULL);
 consvar_t cv_renderwalls = CVAR_INIT ("renderwalls", "On", 0, CV_OnOff, NULL);
+consvar_t cv_renderfloors = CVAR_INIT ("renderfloors", "On", 0, CV_OnOff, NULL);
 
 CV_PossibleValue_t cv_renderer_t[] = {
 	{1, "Software"},
diff --git a/src/screen.h b/src/screen.h
index 003a1032d7257ec3ee1035c4563d0c86776ff4be..c41b32077dbc0d40db16fae7c734bd61de97dc9a 100644
--- a/src/screen.h
+++ b/src/screen.h
@@ -189,7 +189,7 @@ extern CV_PossibleValue_t cv_renderer_t[];
 extern INT32 scr_bpp;
 extern UINT8 *scr_borderpatch; // patch used to fill the view borders
 
-extern consvar_t cv_scr_width, cv_scr_height, cv_scr_depth, cv_renderview, cv_renderwalls, cv_renderer, cv_fullscreen;
+extern consvar_t cv_scr_width, cv_scr_height, cv_scr_depth, cv_renderview, cv_renderwalls, cv_renderfloors, cv_renderer, cv_fullscreen;
 // wait for page flipping to end or not
 extern consvar_t cv_vidwait;