diff --git a/Source/Plugins/GZDoomEditing/Resources/Actions.cfg b/Source/Plugins/GZDoomEditing/Resources/Actions.cfg
index 95693cfd7410410c02633c33a3104029eaa2d76c..c8320a1f027d90b8dd8be9d7e6cef81213c973e2 100644
--- a/Source/Plugins/GZDoomEditing/Resources/Actions.cfg
+++ b/Source/Plugins/GZDoomEditing/Resources/Actions.cfg
@@ -33,4 +33,14 @@ ceilingalignmode
 	allowscroll = true;
 }
 
+togglegzdoomrenderingeffects
+{
+	title = "Toggle GZDoom rendering effects";
+	category = "visual";
+	description = "Toggles rendering of GZDoom rendering effects (slopes, 3D-floors etc.) in GZDoom Visual mode.";
+	allowkeys = true;
+	allowmouse = true;
+	allowscroll = false;
+	default = 9; //Tab
+}
 
diff --git a/Source/Plugins/GZDoomEditing/VisualModes/BaseVisualMode.cs b/Source/Plugins/GZDoomEditing/VisualModes/BaseVisualMode.cs
index 7d3a0aed925fb1aa7e6848ebe1643289d2438463..81760bf5a6c96c5d19739ae60dcb1c856eeb32c7 100644
--- a/Source/Plugins/GZDoomEditing/VisualModes/BaseVisualMode.cs
+++ b/Source/Plugins/GZDoomEditing/VisualModes/BaseVisualMode.cs
@@ -91,6 +91,7 @@ namespace CodeImp.DoomBuilder.GZDoomEditing
 		private List<IVisualEventReceiver> selectedobjects;
         //mxd. Used in Cut/PasteSelection actions
         private List<ThingCopyData> copyBuffer;
+        private static bool gzdoomRenderingEffects = true; //mxd
 		
 		#endregion
 		
@@ -561,9 +562,18 @@ namespace CodeImp.DoomBuilder.GZDoomEditing
 		// This requires that the blockmap is up-to-date!
 		internal void RebuildElementData()
 		{
-			Dictionary<int, List<Sector>> sectortags = new Dictionary<int, List<Sector>>();
-			sectordata = new Dictionary<Sector, SectorData>(General.Map.Map.Sectors.Count);
-			thingdata = new Dictionary<Thing,ThingData>(General.Map.Map.Things.Count);
+            //mxd
+            if (!gzdoomRenderingEffects && sectordata != null && sectordata.Count > 0) {
+                //rebuild sectors with effects
+                foreach (KeyValuePair<Sector, SectorData> group in sectordata)
+                    group.Value.Reset();
+            }
+
+            Dictionary<int, List<Sector>> sectortags = new Dictionary<int, List<Sector>>();
+            sectordata = new Dictionary<Sector, SectorData>(General.Map.Map.Sectors.Count);
+            thingdata = new Dictionary<Thing, ThingData>(General.Map.Map.Things.Count);
+
+            if (!gzdoomRenderingEffects) return; //mxd
 			
 			// Find all sector who's tag is not 0 and hash them so that we can find them quicly
 			foreach(Sector s in General.Map.Map.Sectors)
@@ -1832,6 +1842,15 @@ namespace CodeImp.DoomBuilder.GZDoomEditing
 
             PostAction();
         }
+
+        //mxd
+        [BeginAction("togglegzdoomrenderingeffects")]
+        public void ToggleGZDoomRenderingEffects() {
+            gzdoomRenderingEffects = !gzdoomRenderingEffects;
+            RebuildElementData();
+            UpdateChangedObjects();
+            General.Interface.DisplayStatus(StatusType.Info, "(G)ZDoom rendering effects are " + (gzdoomRenderingEffects ? "ENABLED" : "DISABLED"));
+        }
 		
 		#endregion
 	}
diff --git a/Source/Plugins/GZDoomEditing/VisualModes/EffectUDMFVertexOffset.cs b/Source/Plugins/GZDoomEditing/VisualModes/EffectUDMFVertexOffset.cs
index ae61270742a10c265226f5f062dfa83d75737ab7..f045d87dd0b8aadb5ea470af0b961ff46886e004 100644
--- a/Source/Plugins/GZDoomEditing/VisualModes/EffectUDMFVertexOffset.cs
+++ b/Source/Plugins/GZDoomEditing/VisualModes/EffectUDMFVertexOffset.cs
@@ -45,13 +45,14 @@ namespace CodeImp.DoomBuilder.GZDoomEditing {
                 //check ceiling
                 if (vertices[index].Fields.ContainsKey("zceiling")) {
                     //yes, some things work in strange and mysterious ways in zdoom...
-                    ceilingVerts[index].z = floorVerts[index].z + (float)vertices[index].Fields["zceiling"].Value;
+                    ceilingVerts[index].z = (float)vertices[index].Fields["zceiling"].Value;
                     ceilingChanged = true;
                 }
 
                 //and floor ceiling
                 if (vertices[index].Fields.ContainsKey("zfloor")) {
-                    floorVerts[index].z += (float)vertices[index].Fields["zfloor"].Value;
+                    //yes, some things work in strange and mysterious ways in zdoom...
+                    floorVerts[index].z = (float)vertices[index].Fields["zfloor"].Value;
                     floorChanged = true;
                 }