diff --git a/Source/Editing/EditModeInfo.cs b/Source/Editing/EditModeInfo.cs
index c8d7fc9b..5ffa0ccc 100644
--- a/Source/Editing/EditModeInfo.cs
+++ b/Source/Editing/EditModeInfo.cs
@@ -27,6 +27,7 @@ using System.Reflection;
 using CodeImp.DoomBuilder.Actions;
 using CodeImp.DoomBuilder.Plugins;
 using System.Drawing;
+using CodeImp.DoomBuilder.VisualModes;
 
 #endregion
 
@@ -140,22 +141,31 @@ namespace CodeImp.DoomBuilder.Editing
 		public void UserSwitchToMode()
 		{
 			EditMode newmode;
-
+			
 			// Only when a map is opened
 			if(General.Map != null)
 			{
 				// Not switching from volatile mode to volatile mode?
 				if((General.Editing.Mode == null) || !General.Editing.Mode.Attributes.Volatile || !this.attribs.Volatile)
 				{
-					// Create instance
-					newmode = plugin.CreateObject<EditMode>(type);
-
-					// Switch mode
-					General.Editing.ChangeMode(newmode);
+					// When in VisualMode and switching to the same VisualMode, then we switch back to the previous classic mode
+					if((General.Editing.Mode is VisualMode) && (type == General.Editing.Mode.GetType()))
+					{
+						// Switch back to last classic mode
+						General.Editing.ChangeMode(General.Editing.PreviousClassicMode.Name);
+					}
+					else
+					{
+						// Create instance
+						newmode = plugin.CreateObject<EditMode>(type);
+						
+						// Switch mode
+						General.Editing.ChangeMode(newmode);
+					}
 				}
 			}
 		}
-
+		
 		// This switches to the mode
 		public void SwitchToMode()
 		{
diff --git a/Source/Editing/EditingManager.cs b/Source/Editing/EditingManager.cs
index f6b89ed6..20f64b8b 100644
--- a/Source/Editing/EditingManager.cs
+++ b/Source/Editing/EditingManager.cs
@@ -32,6 +32,7 @@ using System.Diagnostics;
 using CodeImp.DoomBuilder.Actions;
 using CodeImp.DoomBuilder.Geometry;
 using CodeImp.DoomBuilder.Plugins;
+using CodeImp.DoomBuilder.VisualModes;
 
 #endregion
 
@@ -56,6 +57,7 @@ namespace CodeImp.DoomBuilder.Editing
 		private EditMode newmode;
 		private Type prevmode;
 		private Type prevstablemode;
+		private Type prevclassicmode;
 
 		// Disposing
 		private bool isdisposed = false;
@@ -69,6 +71,7 @@ namespace CodeImp.DoomBuilder.Editing
 		public EditMode NewMode { get { return newmode; } }
 		public Type PreviousMode { get { return prevmode; } }
 		public Type PreviousStableMode { get { return prevstablemode; } }
+		public Type PreviousClassicMode { get { return prevclassicmode; } }
 		public bool IsDisposed { get { return isdisposed; } }
 		
 		#endregion
@@ -122,10 +125,44 @@ namespace CodeImp.DoomBuilder.Editing
 			}
 		}
 		
+		#endregion
+
+		#region ================== Switch Actions
+		
+		// This unbinds all editing mode switch actions
+		private void UnbindSwitchActions()
+		{
+			foreach(EditModeInfo emi in allmodes)
+			{
+				emi.UnbindSwitchAction();
+			}
+		}
+		
+		// This binds all editing mode switch actions for the available modes only
+		private void BindAvailableSwitchActions()
+		{
+			// In case of VisualMode, we only bind the switch action
+			// of the VisualMode to switch back to the previous mode
+			if(mode is VisualMode)
+			{
+				// Bind only the switch action for this mode
+				EditModeInfo info = GetEditModeInfo(mode.GetType());
+				info.BindSwitchAction();
+			}
+			else
+			{
+				// Bind all available mode swtich actions
+				foreach(EditModeInfo emi in usedmodes)
+				{
+					emi.BindSwitchAction();
+				}
+			}
+		}
+		
 		#endregion
 		
 		#region ================== Methods
-		
+
 		// This returns specific editing mode info by name
 		internal EditModeInfo GetEditModeInfo(string editmodename)
 		{
@@ -140,12 +177,25 @@ namespace CodeImp.DoomBuilder.Editing
 			return null;
 		}
 		
+		// This returns specific editing mode info by name
+		internal EditModeInfo GetEditModeInfo(Type modetype)
+		{
+			// Find the edit mode
+			foreach(EditModeInfo emi in usedmodes)
+			{
+				// Mode matches class name?
+				if(emi.Type == modetype) return emi;
+			}
+			
+			// No such mode found
+			return null;
+		}
+		
 		// This is called when the editing modes must update
 		internal void UpdateCurrentEditModes()
 		{
 			// Unbind editing mode switch actions
-			foreach(EditModeInfo emi in allmodes)
-				emi.UnbindSwitchAction();
+			UnbindSwitchActions();
 			
 			// Rebuild list of used modes
 			usedmodes.Clear();
@@ -160,11 +210,13 @@ namespace CodeImp.DoomBuilder.Editing
 					{
 						// Add the mode to be used and bind switch action
 						usedmodes.Add(emi);
-						emi.BindSwitchAction();
 					}
 				}
 			}
 			
+			// Bind switch action for used modes
+			BindAvailableSwitchActions();
+			
 			// Remove editing mode buttons from interface
 			General.MainWindow.RemoveEditModeButtons();
 			
@@ -219,44 +271,50 @@ namespace CodeImp.DoomBuilder.Editing
 			{
 				General.WriteLogLine("Stopping edit mode...");
 			}
-
+			
 			// Remember previous mode
 			newmode = nextmode;
 			if(mode != null)
 			{
 				prevmode = mode.GetType();
 				if(!mode.Attributes.Volatile) prevstablemode = prevmode;
+				if(mode is ClassicMode) prevclassicmode = prevmode;
 			}
 			else
 			{
 				prevmode = null;
 				prevstablemode = null;
+				prevclassicmode = null;
 			}
-
+			
 			// Let the plugins know beforehand and check if not cancelled
 			if(General.Plugins.ModeChanges(oldmode, newmode))
 			{
 				// Disenagage old mode
 				if(oldmode != null) oldmode.OnDisengage();
-
+				
 				// Reset cursor
 				General.Interface.SetCursor(Cursors.Default);
-
+				
 				// Apply new mode
 				mode = newmode;
-
+				
 				// Engage new mode
 				if(newmode != null) newmode.OnEngage();
-
+				
+				// Bind new switch actions
+				UnbindSwitchActions();
+				BindAvailableSwitchActions();
+				
 				// Update the interface
 				General.MainWindow.EditModeChanged();
-
+				
 				// Dispose old mode
 				if(oldmode != null) oldmode.Dispose();
-
+				
 				// Done switching
 				newmode = null;
-
+				
 				// Redraw the display
 				General.MainWindow.RedrawDisplay();
 				return true;