diff --git a/Source/Core/Editing/EditMode.cs b/Source/Core/Editing/EditMode.cs
index e6b12ececbeee9543261f24d87a0cb45323f4839..6e7a62550287f9c466075f8eec2aa2728f105af8 100644
--- a/Source/Core/Editing/EditMode.cs
+++ b/Source/Core/Editing/EditMode.cs
@@ -224,8 +224,8 @@ namespace CodeImp.DoomBuilder.Editing
 		// Return false to cancel undo action
 		public virtual bool OnUndoBegin() { return true; }
 		public virtual bool OnRedoBegin() { return true; }
-		public virtual void OnUndoEnd() { }
-		public virtual void OnRedoEnd() { }
+		public virtual void OnUndoEnd() { General.Map.Renderer2D.UpdateExtraFloorFlag(); } //mxd
+		public virtual void OnRedoEnd() { General.Map.Renderer2D.UpdateExtraFloorFlag(); } //mxd
 		
 		// Interface events
 		public virtual void OnMouseClick(MouseEventArgs e) { }
diff --git a/Source/Core/Map/Sector.cs b/Source/Core/Map/Sector.cs
index 4f9da353add575aa894ad39aa31f46420bc5877e..6341c010102cbd52eb2d0f5979e2cb075312573e 100644
--- a/Source/Core/Map/Sector.cs
+++ b/Source/Core/Map/Sector.cs
@@ -520,7 +520,7 @@ namespace CodeImp.DoomBuilder.Map
 		// This checks if the given point is inside the sector polygon
 		public bool Intersect(Vector2D p) 
 		{
-			if (MapSet.GetCSFieldBits(p, bbox) != 0) return false; //mxd. Check bounding box
+			if(!bbox.Contains(p.x, p.y)) return false; //mxd. Check bounding box first
 			
 			uint c = 0;
 			
diff --git a/Source/Plugins/BuilderModes/ClassicModes/BaseClassicMode.cs b/Source/Plugins/BuilderModes/ClassicModes/BaseClassicMode.cs
index 614a885bcb47fc1a7698f292be739ad35252f41b..427da14e4469699ee633d7a883e0cd5d5df92ef7 100644
--- a/Source/Plugins/BuilderModes/ClassicModes/BaseClassicMode.cs
+++ b/Source/Plugins/BuilderModes/ClassicModes/BaseClassicMode.cs
@@ -147,20 +147,6 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			marqueSelectionIncludesThings = General.Interface.AltState;
 		}
 
-		//mxd
-		public override void OnUndoEnd() 
-		{
-			General.Map.Renderer2D.UpdateExtraFloorFlag();
-			base.OnUndoEnd();
-		}
-
-		//mxd
-		public override void OnRedoEnd() 
-		{
-			General.Map.Renderer2D.UpdateExtraFloorFlag();
-			base.OnRedoEnd();
-		}
-
 		//mxd
 		public override void OnMapTestEnd(bool testFromCurrentPosition) 
 		{
diff --git a/Source/Plugins/BuilderModes/ClassicModes/SectorsMode.cs b/Source/Plugins/BuilderModes/ClassicModes/SectorsMode.cs
index 5751554de278d6a6c12bbb9a19c0368c5c0b929e..ba056a0612b78504e6edd60190b290d882fd522b 100644
--- a/Source/Plugins/BuilderModes/ClassicModes/SectorsMode.cs
+++ b/Source/Plugins/BuilderModes/ClassicModes/SectorsMode.cs
@@ -529,7 +529,6 @@ namespace CodeImp.DoomBuilder.BuilderModes
 					{
 						foreach(Thing t in General.Map.ThingsFilter.VisibleThings) 
 						{
-							t.DetermineSector();
 							if(t.Sector != s) continue;
 							t.Selected = s.Selected;
 						}
@@ -658,6 +657,9 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			//mxd. Update the tooltip
 			BuilderPlug.Me.MenusForm.SyncronizeThingEditButton.ToolTipText = "Synchronized Things Editing" + Environment.NewLine + BuilderPlug.Me.MenusForm.SyncronizeThingEditSectorsItem.ToolTipText;
 
+			//mxd. Determine thing sectors. Cause SyncronizeThingEdit requires that
+			foreach(Thing t in General.Map.Map.Things) t.DetermineSector();
+
 			//mxd. Select things as well?
 			if(BuilderPlug.Me.SyncronizeThingEdit)
 			{
@@ -666,7 +668,6 @@ namespace CodeImp.DoomBuilder.BuilderModes
 				{
 					foreach(Thing t in General.Map.Map.Things)
 					{
-						t.DetermineSector();
 						if(!t.Selected && t.Sector != null && sectors.Contains(t.Sector))
 							t.Selected = true;
 					}
@@ -1180,7 +1181,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 					new Line2D(selectionrect.Left, selectionrect.Bottom, selectionrect.Left, selectionrect.Top)
 				};
 				
-				//mxd. collect changed sectors
+				//mxd. (de)select sectors
 				switch(marqueSelectionMode) 
 				{
 					case MarqueSelectionMode.SELECT:
diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualMiddle3D.cs b/Source/Plugins/BuilderModes/VisualModes/VisualMiddle3D.cs
index 96877be431e269ceb49e694e5bff8d964bfcf8d3..9809707a3de7c06af49391715c40f975a7a9e888 100644
--- a/Source/Plugins/BuilderModes/VisualModes/VisualMiddle3D.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/VisualMiddle3D.cs
@@ -63,10 +63,14 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		public override bool Setup() { return this.Setup(this.extrafloor); }
 		public bool Setup(Effect3DFloor extrafloor)
 		{
-			Vector2D vl, vr;
 			Sidedef sourceside = extrafloor.Linedef.Front;
 			this.extrafloor = extrafloor;
 
+			//mxd. Extrafloor may've become invalid during undo/redo...
+			if(sourceside == null) return false;
+
+			Vector2D vl, vr;
+
 			//mxd. lightfog flag support
 			int lightvalue;
 			bool lightabsolute;
diff --git a/Source/Plugins/BuilderModes/VisualModes/VisualMiddleBack.cs b/Source/Plugins/BuilderModes/VisualModes/VisualMiddleBack.cs
index eacdd5719316b3810dd70eab94bf67db6db536e7..b98f555cd133ced0e563a3770669245e6d786795 100644
--- a/Source/Plugins/BuilderModes/VisualModes/VisualMiddleBack.cs
+++ b/Source/Plugins/BuilderModes/VisualModes/VisualMiddleBack.cs
@@ -40,11 +40,14 @@ namespace CodeImp.DoomBuilder.BuilderModes {
 		public override bool Setup() { return this.Setup(this.extrafloor); }
 		public bool Setup(Effect3DFloor extrafloor)
 		{
-			Vector2D vl, vr;
-
 			Sidedef sourceside = extrafloor.Linedef.Front;
 			this.extrafloor = extrafloor;
 
+			//mxd. Extrafloor may've become invalid during undo/redo...
+			if(sourceside == null) return false;
+
+			Vector2D vl, vr;
+
 			//mxd. lightfog flag support
 			int lightvalue;
 			bool lightabsolute;