diff --git a/Source/Plugins/GZDoomEditing/ClassicModes/CeilingAlignMode.cs b/Source/Plugins/GZDoomEditing/ClassicModes/CeilingAlignMode.cs
index 244ef15ea1edd47632036858641a9fca06ba53cd..c787072ac7164c018f9cfb40fd0643abe586cb46 100644
--- a/Source/Plugins/GZDoomEditing/ClassicModes/CeilingAlignMode.cs
+++ b/Source/Plugins/GZDoomEditing/ClassicModes/CeilingAlignMode.cs
@@ -64,7 +64,8 @@ namespace CodeImp.DoomBuilder.GZDoomEditing
 		public override string XOffsetName { get { return "xpanningceiling"; } }
 		public override string YOffsetName { get { return "ypanningceiling"; } }
 		public override string RotationName { get { return "rotationceiling"; } }
-	
+		public override string UndoDescription { get { return "Ceiling Alignment"; } }
+		
 		#endregion
 
 		#region ================== Constructor / Disposer
diff --git a/Source/Plugins/GZDoomEditing/ClassicModes/FlatAlignMode.cs b/Source/Plugins/GZDoomEditing/ClassicModes/FlatAlignMode.cs
index 6668dad9f5ac3eb1fab33de32f989e8bc5196c36..7470a7991d6ca5e831e25f5bd7cd364f28221e95 100644
--- a/Source/Plugins/GZDoomEditing/ClassicModes/FlatAlignMode.cs
+++ b/Source/Plugins/GZDoomEditing/ClassicModes/FlatAlignMode.cs
@@ -126,6 +126,7 @@ namespace CodeImp.DoomBuilder.GZDoomEditing
 		public abstract string XOffsetName { get; }
 		public abstract string YOffsetName { get; }
 		public abstract string RotationName { get; }
+		public abstract string UndoDescription { get; }
 
 		#endregion
 
@@ -613,7 +614,7 @@ namespace CodeImp.DoomBuilder.GZDoomEditing
 			if(selection.Count == 0)
 			{
 				General.Interface.MessageBeep(MessageBeepType.Default);
-				General.Interface.DisplayStatus(StatusType.Info, "A selected sector is required for this action.");
+				General.Interface.DisplayStatus(StatusType.Action, "A selected sector is required for this action.");
 				General.Editing.CancelMode();
 				return;
 			}
@@ -625,7 +626,7 @@ namespace CodeImp.DoomBuilder.GZDoomEditing
 			   (texture.Width <= 0) || (texture.Height <= 0) || !texture.IsImageLoaded)
 			{
 				General.Interface.MessageBeep(MessageBeepType.Default);
-				General.Interface.DisplayStatus(StatusType.Info, "The selected sector must have a loaded texture to align.");
+				General.Interface.DisplayStatus(StatusType.Action, "The selected sector must have a loaded texture to align.");
 				General.Editing.CancelMode();
 				return;
 			}
@@ -688,29 +689,33 @@ namespace CodeImp.DoomBuilder.GZDoomEditing
 		{
 			base.OnAccept();
 
-			// Restore original values
-			RestoreSectors();
-			General.Map.Map.Update();
-
-			// Make undo
-			General.Map.UndoRedo.CreateUndo("Flat Alignment");
+			if(!modealreadyswitching)
+			{
+				modealreadyswitching = true;
+				
+				// Restore original values
+				RestoreSectors();
+				General.Map.Map.Update();
 
-			// Resume normal undo/redo recording
-			General.Map.UndoRedo.IgnorePropChanges = false;
+				// Make undo
+				General.Map.UndoRedo.CreateUndo(UndoDescription);
 
-			// Apply changes
-			UpdateSectors();
-			General.Map.Map.Update();
+				// Resume normal undo/redo recording
+				General.Map.UndoRedo.IgnorePropChanges = false;
 
-			// Clear selection
-			if(selection.Count == 1)
-				General.Map.Map.ClearAllSelected();
+				// Apply changes
+				UpdateSectors();
+				General.Map.Map.Update();
 
-			// Done
-			General.Map.IsChanged = true;
+				// Clear selection
+				if(selection.Count == 1)
+					General.Map.Map.ClearAllSelected();
 
-			if(!modealreadyswitching)
-			{
+				// Done
+				General.Map.IsChanged = true;
+				selection = null;
+				sectorinfo = null;
+				
 				// Return to previous stable mode
 				General.Editing.ChangeMode(General.Editing.PreviousStableMode.Name);
 			}
@@ -720,6 +725,7 @@ namespace CodeImp.DoomBuilder.GZDoomEditing
 		public override void OnCancel()
 		{
 			base.OnCancel();
+			modealreadyswitching = true;
 			
 			// Restore original values
 			RestoreSectors();
@@ -865,7 +871,8 @@ namespace CodeImp.DoomBuilder.GZDoomEditing
 		// This redraws the display
 		public override void OnRedrawDisplay()
 		{
-			UpdateRectangleComponents();
+			if(sectorinfo != null)
+				UpdateRectangleComponents();
 
 			renderer.RedrawSurface();
 
@@ -886,41 +893,44 @@ namespace CodeImp.DoomBuilder.GZDoomEditing
 			}
 
 			// Render overlay
-			if(renderer.StartOverlay(true))
+			if(sectorinfo != null)
 			{
-				// Rectangle
-				PixelColor rectcolor = General.Colors.Highlight.WithAlpha(RECTANGLE_ALPHA);
-				renderer.RenderGeometry(cornerverts, null, true);
-				if(extensionline.GetLengthSq() > 0.0f)
-					renderer.RenderLine(extensionline.v1, extensionline.v2, 1, General.Colors.Indication.WithAlpha(EXTENSION_LINE_ALPHA), true);
-				renderer.RenderLine(corners[0], corners[1], 4, rectcolor, true);
-				renderer.RenderLine(corners[1], corners[2], 4, rectcolor, true);
-				renderer.RenderLine(corners[2], corners[3], 4, rectcolor, true);
-				renderer.RenderLine(corners[3], corners[0], 4, rectcolor, true);
-
-				// Lines
-				renderer.RenderLine(corners[0], extends[0], 1f, General.Colors.Highlight, true);
-				renderer.RenderLine(corners[0], extends[1], 1f, General.Colors.Highlight, true);
-				renderer.RenderLine(corners[1], corners[2], 0.5f, General.Colors.Highlight, true);
-				renderer.RenderLine(corners[2], corners[3], 0.5f, General.Colors.Highlight, true);
-
-				// Handles
-				renderer.RenderRectangleFilled(rotategrips[0], General.Colors.Background, true);
-				renderer.RenderRectangleFilled(rotategrips[1], General.Colors.Background, true);
-				renderer.RenderRectangle(rotategrips[0], 2f, General.Colors.Indication, true);
-				renderer.RenderRectangle(rotategrips[1], 2f, General.Colors.Indication, true);
-				renderer.RenderRectangleFilled(resizegrips[0], General.Colors.Background, true);
-				renderer.RenderRectangleFilled(resizegrips[1], General.Colors.Background, true);
-				renderer.RenderRectangle(resizegrips[0], 2f, General.Colors.Highlight, true);
-				renderer.RenderRectangle(resizegrips[1], 2f, General.Colors.Highlight, true);
-
-				// Rotate/align point
-				if(showalignoffset)
-					renderer.RenderRectangleFilled(alignrect, General.Colors.Selection, true);
-				
-				renderer.Finish();
+				if(renderer.StartOverlay(true))
+				{
+					// Rectangle
+					PixelColor rectcolor = General.Colors.Highlight.WithAlpha(RECTANGLE_ALPHA);
+					renderer.RenderGeometry(cornerverts, null, true);
+					if(extensionline.GetLengthSq() > 0.0f)
+						renderer.RenderLine(extensionline.v1, extensionline.v2, 1, General.Colors.Indication.WithAlpha(EXTENSION_LINE_ALPHA), true);
+					renderer.RenderLine(corners[0], corners[1], 4, rectcolor, true);
+					renderer.RenderLine(corners[1], corners[2], 4, rectcolor, true);
+					renderer.RenderLine(corners[2], corners[3], 4, rectcolor, true);
+					renderer.RenderLine(corners[3], corners[0], 4, rectcolor, true);
+
+					// Lines
+					renderer.RenderLine(corners[0], extends[0], 1f, General.Colors.Highlight, true);
+					renderer.RenderLine(corners[0], extends[1], 1f, General.Colors.Highlight, true);
+					renderer.RenderLine(corners[1], corners[2], 0.5f, General.Colors.Highlight, true);
+					renderer.RenderLine(corners[2], corners[3], 0.5f, General.Colors.Highlight, true);
+
+					// Handles
+					renderer.RenderRectangleFilled(rotategrips[0], General.Colors.Background, true);
+					renderer.RenderRectangleFilled(rotategrips[1], General.Colors.Background, true);
+					renderer.RenderRectangle(rotategrips[0], 2f, General.Colors.Indication, true);
+					renderer.RenderRectangle(rotategrips[1], 2f, General.Colors.Indication, true);
+					renderer.RenderRectangleFilled(resizegrips[0], General.Colors.Background, true);
+					renderer.RenderRectangleFilled(resizegrips[1], General.Colors.Background, true);
+					renderer.RenderRectangle(resizegrips[0], 2f, General.Colors.Highlight, true);
+					renderer.RenderRectangle(resizegrips[1], 2f, General.Colors.Highlight, true);
+
+					// Rotate/align point
+					if(showalignoffset)
+						renderer.RenderRectangleFilled(alignrect, General.Colors.Selection, true);
+
+					renderer.Finish();
+				}
 			}
-
+			
 			renderer.Present();
 		}
 
diff --git a/Source/Plugins/GZDoomEditing/ClassicModes/FloorAlignMode.cs b/Source/Plugins/GZDoomEditing/ClassicModes/FloorAlignMode.cs
index 789e37bf8a31b44e9978e698a1b11709e55e3318..9c779eb428b291154cacb13d915a913e64a5cdb0 100644
--- a/Source/Plugins/GZDoomEditing/ClassicModes/FloorAlignMode.cs
+++ b/Source/Plugins/GZDoomEditing/ClassicModes/FloorAlignMode.cs
@@ -64,6 +64,7 @@ namespace CodeImp.DoomBuilder.GZDoomEditing
 		public override string XOffsetName { get { return "xpanningfloor"; } }
 		public override string YOffsetName { get { return "ypanningfloor"; } }
 		public override string RotationName { get { return "rotationfloor"; } }
+		public override string UndoDescription { get { return "Floor Alignment"; } }
 
 		#endregion
 
diff --git a/Source/Plugins/GZDoomEditing/VisualModes/VisualCeiling.cs b/Source/Plugins/GZDoomEditing/VisualModes/VisualCeiling.cs
index 9c7087d1dc86c0b917f513d973fbc96e7394278e..05a98794790c12877c1974070087a3a8875fbe2b 100644
--- a/Source/Plugins/GZDoomEditing/VisualModes/VisualCeiling.cs
+++ b/Source/Plugins/GZDoomEditing/VisualModes/VisualCeiling.cs
@@ -169,6 +169,7 @@ namespace CodeImp.DoomBuilder.GZDoomEditing
 			float oldy = Sector.Sector.Fields.GetValue("ypanningceiling", 0.0f);
 			Sector.Sector.Fields["xpanningceiling"] = new UniValue(UniversalType.Float, oldx + (float)xy.X);
 			Sector.Sector.Fields["ypanningceiling"] = new UniValue(UniversalType.Float, oldy + (float)xy.Y);
+			Sector.Sector.UpdateNeeded = true;
 		}
 
 		// Paste texture
diff --git a/Source/Plugins/GZDoomEditing/VisualModes/VisualFloor.cs b/Source/Plugins/GZDoomEditing/VisualModes/VisualFloor.cs
index 3430d1f1220243147273a4f0ac93aee88e87f77b..a811a979649569bb4d4c8f674e97a2289cd7412d 100644
--- a/Source/Plugins/GZDoomEditing/VisualModes/VisualFloor.cs
+++ b/Source/Plugins/GZDoomEditing/VisualModes/VisualFloor.cs
@@ -168,6 +168,7 @@ namespace CodeImp.DoomBuilder.GZDoomEditing
 			float oldy = Sector.Sector.Fields.GetValue("ypanningfloor", 0.0f);
 			Sector.Sector.Fields["xpanningfloor"] = new UniValue(UniversalType.Float, oldx + (float)xy.X);
 			Sector.Sector.Fields["ypanningfloor"] = new UniValue(UniversalType.Float, oldy + (float)xy.Y);
+			Sector.Sector.UpdateNeeded = true;
 		}
 		
 		// Paste texture