diff --git a/Source/Core/Editing/CopyPasteManager.cs b/Source/Core/Editing/CopyPasteManager.cs
index 7aeb848ce77fe2f7b6093e479e9d636900eb3008..59b92c03a6cc7d8afa62b99278dc88373f72504f 100755
--- a/Source/Core/Editing/CopyPasteManager.cs
+++ b/Source/Core/Editing/CopyPasteManager.cs
@@ -238,6 +238,8 @@ namespace CodeImp.DoomBuilder.Editing
 					// that need to be copied.
 					if(General.Editing.Mode.OnCopyBegin())
 					{
+						bool oldmapischanged = General.Map.IsChanged;
+
 						General.MainWindow.DisplayStatus(StatusType.Action, desc);
 
 						// Copy the marked geometry
@@ -269,6 +271,12 @@ namespace CodeImp.DoomBuilder.Editing
 							return false;
 						}
 
+						// General.Map.Map.CloneMarked will set General.Map.IsChanged to true, since it recreated the map. But since this
+						// creation happens in another MapSet, the currently opened map is actually not changed. Force the IsChanged property
+						// to false if the map wasn't changed before doing the copying
+						if (oldmapischanged == false)
+							General.Map.ForceMapIsChangedFalse();
+
 						// Done
 						memstream.Dispose();
 						General.Editing.Mode.OnCopyEnd();
diff --git a/Source/Core/General/MapManager.cs b/Source/Core/General/MapManager.cs
index bc8792ca693353f2f65fc9cae1213e41574ea855..1ff0fd3bee7ebd3663ed5a58c7cfe9fe39975481 100755
--- a/Source/Core/General/MapManager.cs
+++ b/Source/Core/General/MapManager.cs
@@ -2708,6 +2708,17 @@ namespace CodeImp.DoomBuilder
 			renderer2d.GridVisibilityChanged();
 		}
 
+		/// <summary>
+		/// This forces the "changed" variable to "false", which is normally not possible when setting the "IsChanged" property.
+		/// USE WITH CARE! This should only be used in very specific circumstances, where the "IsChanged" property is set to true
+		/// because of internal behavior
+		/// </summary>
+		internal void ForceMapIsChangedFalse()
+		{
+			changed = false;
+			General.MainWindow.UpdateMapChangedStatus();
+		}
+
 		#endregion
 	}
 }
\ No newline at end of file
diff --git a/Source/Core/Windows/LinedefEditForm.cs b/Source/Core/Windows/LinedefEditForm.cs
index 5fff6c6c68bb28ec1ebfca539756f6ac4984506e..c47c002c50114dce32f49ea770b5273c149372c9 100755
--- a/Source/Core/Windows/LinedefEditForm.cs
+++ b/Source/Core/Windows/LinedefEditForm.cs
@@ -42,6 +42,7 @@ namespace CodeImp.DoomBuilder.Windows
 		private List<LinedefProperties> linedefprops; //mxd
 		private bool preventchanges;
 		private bool undocreated; //mxd
+		private bool oldmapischanged;
 
 		private struct LinedefProperties //mxd
 		{
@@ -151,6 +152,7 @@ namespace CodeImp.DoomBuilder.Windows
 		public void Setup(ICollection<Linedef> lines)
 		{
 			preventchanges = true;
+			oldmapischanged = General.Map.IsChanged;
 
             argscontrol.Reset();
             undocreated = false;
@@ -464,7 +466,16 @@ namespace CodeImp.DoomBuilder.Windows
 		private void cancel_Click(object sender, EventArgs e)
 		{
 			//mxd. Let's pretend nothing of this really happened...
-			if(undocreated) General.Map.UndoRedo.WithdrawUndo();
+			if (undocreated)
+			{
+				General.Map.UndoRedo.WithdrawUndo();
+
+				// Changing certain properties of the linedef, like textures will set General.Map.IsChanged to true.
+				// But if cancel is pressed and the changes are discarded, and the map was not changed before, we have to force
+				// General.Map.IsChanged back to false
+				if (General.Map.IsChanged && oldmapischanged == false)
+					General.Map.ForceMapIsChangedFalse();
+			}
 			
 			// Be gone
 			this.DialogResult = DialogResult.Cancel;
diff --git a/Source/Core/Windows/LinedefEditFormUDMF.cs b/Source/Core/Windows/LinedefEditFormUDMF.cs
index 7b626a0e87700f717b9e08d2bf3c32e66b6765cf..faab9d4e16019619865f8ef26a150b7a78211a44 100755
--- a/Source/Core/Windows/LinedefEditFormUDMF.cs
+++ b/Source/Core/Windows/LinedefEditFormUDMF.cs
@@ -47,6 +47,7 @@ namespace CodeImp.DoomBuilder.Windows
 		private readonly List<int> keynumbers; //mxd 
 		private readonly List<PairedFieldsControl> frontUdmfControls; //mxd
 		private readonly List<PairedFieldsControl> backUdmfControls; //mxd
+		private bool oldmapischanged;
 
 		private struct LinedefProperties //mxd
 		{
@@ -259,6 +260,7 @@ namespace CodeImp.DoomBuilder.Windows
             }
 
             preventchanges = true;
+			oldmapischanged = General.Map.IsChanged;
             undocreated = false;
             argscontrol.Reset();
             tagsselector.Reset();
@@ -768,7 +770,16 @@ namespace CodeImp.DoomBuilder.Windows
 		private void cancel_Click(object sender, EventArgs e)
 		{
 			//mxd. Let's pretend nothing of this really happened...
-			if(undocreated) General.Map.UndoRedo.WithdrawUndo();
+			if (undocreated)
+			{
+				General.Map.UndoRedo.WithdrawUndo();
+
+				// Changing certain properties of the linedef, like textures will set General.Map.IsChanged to true.
+				// But if cancel is pressed and the changes are discarded, and the map was not changed before, we have to force
+				// General.Map.IsChanged back to false
+				if (General.Map.IsChanged && oldmapischanged == false)
+					General.Map.ForceMapIsChangedFalse();
+			}
 			
 			// Be gone
 			this.DialogResult = DialogResult.Cancel;
diff --git a/Source/Core/Windows/SectorEditForm.cs b/Source/Core/Windows/SectorEditForm.cs
index 234eca0495a4cb2c9947902e1a08f434a9b8a380..989b9d12de0d9c91fd41980a3072f44f8469b31f 100755
--- a/Source/Core/Windows/SectorEditForm.cs
+++ b/Source/Core/Windows/SectorEditForm.cs
@@ -41,6 +41,7 @@ namespace CodeImp.DoomBuilder.Windows
 		private List<SectorProperties> sectorprops; //mxd
 		private bool preventchanges; //mxd
 		private bool undocreated; //mxd
+		private bool oldmapischanged;
 
 		private struct SectorProperties //mxd
 		{
@@ -90,7 +91,8 @@ namespace CodeImp.DoomBuilder.Windows
 		public void Setup(ICollection<Sector> sectors)
 		{
 			preventchanges = true; //mxd
-            undocreated = false;
+			oldmapischanged = General.Map.IsChanged;
+			undocreated = false;
             // Keep this list
             this.sectors = sectors;
 			if(sectors.Count > 1) this.Text = "Edit Sectors (" + sectors.Count + ")";
@@ -345,7 +347,16 @@ namespace CodeImp.DoomBuilder.Windows
 		private void cancel_Click(object sender, EventArgs e)
 		{
 			//mxd. perform undo
-			if(undocreated) General.Map.UndoRedo.WithdrawUndo();
+			if (undocreated)
+			{
+				General.Map.UndoRedo.WithdrawUndo();
+
+				// Changing certain properties of the sector, like floor/ceiling textures will set General.Map.IsChanged to true.
+				// But if cancel is pressed and the changes are discarded, and the map was not changed before, we have to force
+				// General.Map.IsChanged back to false
+				if (General.Map.IsChanged && oldmapischanged == false)
+					General.Map.ForceMapIsChangedFalse();
+			}
 			
 			// And be gone
 			this.DialogResult = DialogResult.Cancel;
diff --git a/Source/Core/Windows/SectorEditFormUDMF.cs b/Source/Core/Windows/SectorEditFormUDMF.cs
index eaa8727f2400937b2d553ccdd308a8fd50d0757f..1005790d172599ae329c1a53eb3841a93e7ecf21 100755
--- a/Source/Core/Windows/SectorEditFormUDMF.cs
+++ b/Source/Core/Windows/SectorEditFormUDMF.cs
@@ -43,6 +43,8 @@ namespace CodeImp.DoomBuilder.Windows
 		private Vector2D globalslopepivot;
 		private Dictionary<Sector, Vector2D> slopepivots;
 
+		private bool oldmapischanged;
+
 		#endregion
 
 		#region ================== Structs
@@ -306,7 +308,8 @@ namespace CodeImp.DoomBuilder.Windows
 		public void Setup(ICollection<Sector> sectors) 
 		{
 			preventchanges = true; //mxd
-            undocreated = false;
+			oldmapischanged = General.Map.IsChanged;
+			undocreated = false;
             // Keep this list
             this.sectors = sectors;
 			if(sectors.Count > 1) this.Text = "Edit Sectors (" + sectors.Count + ")";
@@ -942,7 +945,16 @@ namespace CodeImp.DoomBuilder.Windows
 		private void cancel_Click(object sender, EventArgs e) 
 		{
 			//mxd. Let's pretend nothing of this really happened...
-			if(undocreated) General.Map.UndoRedo.WithdrawUndo();
+			if (undocreated)
+			{
+				General.Map.UndoRedo.WithdrawUndo();
+
+				// Changing certain properties of the sector, like floor/ceiling textures will set General.Map.IsChanged to true.
+				// But if cancel is pressed and the changes are discarded, and the map was not changed before, we have to force
+				// General.Map.IsChanged back to false
+				if (General.Map.IsChanged && oldmapischanged == false)
+					General.Map.ForceMapIsChangedFalse();
+			}
 			
 			// Be gone
 			this.DialogResult = DialogResult.Cancel;
diff --git a/Source/Core/Windows/ThingEditForm.cs b/Source/Core/Windows/ThingEditForm.cs
index 3d506560b6b7283a28f6da86f41173a6a456b514..9fb9832730743ce75ed240ea0622e1cb6158d0f7 100755
--- a/Source/Core/Windows/ThingEditForm.cs
+++ b/Source/Core/Windows/ThingEditForm.cs
@@ -51,6 +51,7 @@ namespace CodeImp.DoomBuilder.Windows
 		private static bool useabsoluteheight; //mxd
 		private List<ThingProperties> thingprops; //mxd
 		private Dictionary<string, string> flagsrename; //mxd
+		private bool oldmapischanged;
 
 		private struct ThingProperties //mxd
 		{
@@ -141,6 +142,7 @@ namespace CodeImp.DoomBuilder.Windows
 		public void Setup(ICollection<Thing> things)
 		{
 			preventchanges = true;
+			oldmapischanged = General.Map.IsChanged;
             undocreated = false;
             argscontrol.Reset();
 
@@ -466,7 +468,16 @@ namespace CodeImp.DoomBuilder.Windows
 		private void cancel_Click(object sender, EventArgs e)
 		{
 			//mxd. Perform undo?
-			if(undocreated) General.Map.UndoRedo.WithdrawUndo();
+			if (undocreated)
+			{
+				General.Map.UndoRedo.WithdrawUndo();
+
+				// Changing certain properties of the thing, like its type, will set General.Map.IsChanged to true.
+				// But if cancel is pressed and the changes are discarded, and the map was not changed before, we have to force
+				// General.Map.IsChanged back to false
+				if (General.Map.IsChanged && oldmapischanged == false)
+					General.Map.ForceMapIsChangedFalse();
+			}
 			
 			// Be gone
 			this.DialogResult = DialogResult.Cancel;
diff --git a/Source/Core/Windows/ThingEditFormUDMF.cs b/Source/Core/Windows/ThingEditFormUDMF.cs
index 4da13896c242243e11f6f59d4e6c3ca47b1b8da1..44fe79febc00ed9b5e6a27405b8c2346361367b9 100755
--- a/Source/Core/Windows/ThingEditFormUDMF.cs
+++ b/Source/Core/Windows/ThingEditFormUDMF.cs
@@ -51,6 +51,7 @@ namespace CodeImp.DoomBuilder.Windows
 		private List<ThingProperties> thingprops; //mxd
 		private readonly string[] renderstyles; //mxd
 		private Dictionary<string, string> flagsrename; //mxd
+		private bool oldmapischanged;
 
 		//mxd. Persistent settings
 		private bool useabsoluteheight;
@@ -164,6 +165,7 @@ namespace CodeImp.DoomBuilder.Windows
 		public void Setup(ICollection<Thing> things) 
 		{
 			preventchanges = true;
+			oldmapischanged = General.Map.IsChanged;
             undocreated = false;
             argscontrol.Reset();
 
@@ -589,7 +591,16 @@ namespace CodeImp.DoomBuilder.Windows
 		private void cancel_Click(object sender, EventArgs e) 
 		{
 			//mxd. Perform undo?
-			if(undocreated) General.Map.UndoRedo.WithdrawUndo();
+			if (undocreated)
+			{
+				General.Map.UndoRedo.WithdrawUndo();
+
+				// Changing certain properties of the sector, like its type, will set General.Map.IsChanged to true.
+				// But if cancel is pressed and the changes are discarded, and the map was not changed before, we have to force
+				// General.Map.IsChanged back to false
+				if (General.Map.IsChanged && oldmapischanged == false)
+					General.Map.ForceMapIsChangedFalse();
+			}
 
 			// Be gone
 			this.DialogResult = DialogResult.Cancel;
diff --git a/Source/Core/Windows/VertexEditForm.cs b/Source/Core/Windows/VertexEditForm.cs
index 3b6e2fe70bbcaf531b51ccb921f76d8ac70dad41..8c051f2fee2cfb1e5c64ae7998114c99d6de9d54 100755
--- a/Source/Core/Windows/VertexEditForm.cs
+++ b/Source/Core/Windows/VertexEditForm.cs
@@ -47,6 +47,7 @@ namespace CodeImp.DoomBuilder.Windows
 		private bool preventchanges; //mxd
 		private bool undocreated; //mxd
 		private List<VertexProperties> vertexprops; //mxd
+		private bool oldmapischanged;
 
 		private struct VertexProperties //mxd
 		{
@@ -118,6 +119,7 @@ namespace CodeImp.DoomBuilder.Windows
 		public void Setup(ICollection<Vertex> vertices, bool allowPositionChange)
 		{
 			preventchanges = true; //mxd
+			oldmapischanged = General.Map.IsChanged;
 			
 			// Keep this list
 			this.vertices = vertices;
@@ -356,7 +358,16 @@ namespace CodeImp.DoomBuilder.Windows
 		private void cancel_Click(object sender, EventArgs e)
 		{
 			//mxd. Perform undo if required
-			if(undocreated) General.Map.UndoRedo.WithdrawUndo();
+			if (undocreated)
+			{
+				General.Map.UndoRedo.WithdrawUndo();
+
+				// Changing certain properties of the vertex, like the position, will set General.Map.IsChanged to true.
+				// But if cancel is pressed and the changes are discarded, and the map was not changed before, we have to force
+				// General.Map.IsChanged back to false
+				if (General.Map.IsChanged && oldmapischanged == false)
+					General.Map.ForceMapIsChangedFalse();
+			}
 			
 			// And close
 			this.DialogResult = DialogResult.Cancel;