diff --git a/Source/Core/Editing/EditModeInfo.cs b/Source/Core/Editing/EditModeInfo.cs
index 07a0e021974b163cd1237d678fd894af1d7b4d1d..4265477556866c97e1a5fc65f5fea9e548f9af67 100644
--- a/Source/Core/Editing/EditModeInfo.cs
+++ b/Source/Core/Editing/EditModeInfo.cs
@@ -165,8 +165,8 @@ namespace CodeImp.DoomBuilder.Editing
 					// Create instance
 					EditMode newmode = plugin.CreateObject<EditMode>(type);
 					
-					// Switch mode
-					General.Editing.ChangeMode(newmode);
+					//mxd. Switch mode?
+					if(newmode != null) General.Editing.ChangeMode(newmode);
 				}
 			}
 		}
@@ -180,8 +180,8 @@ namespace CodeImp.DoomBuilder.Editing
 				// Create instance
 				EditMode newmode = plugin.CreateObject<EditMode>(type);
 
-				// Switch mode
-				General.Editing.ChangeMode(newmode);
+				//mxd. Switch mode?
+				if(newmode != null) General.Editing.ChangeMode(newmode);
 			}
 		}
 
diff --git a/Source/Core/General/General.cs b/Source/Core/General/General.cs
index 0702f786899ba2f8a777c0cbd90a8cc56e10d5fd..21b50b9cced339c5d73cc084788b7ec68f8a85db 100644
--- a/Source/Core/General/General.cs
+++ b/Source/Core/General/General.cs
@@ -1845,8 +1845,14 @@ namespace CodeImp.DoomBuilder
 		// This shows a message and logs the message
 		public static DialogResult ShowErrorMessage(string message, MessageBoxButtons buttons)
 		{
-			// Log the message
-			WriteLogLine(message);
+			return ShowErrorMessage(message, buttons, true);
+		}
+
+		// This shows a message and logs the message
+		public static DialogResult ShowErrorMessage(string message, MessageBoxButtons buttons, bool log)
+		{
+			//mxd. Log the message?
+			if(log) WriteLogLine(message);
 			
 			// Use normal cursor
 			Cursor oldcursor = Cursor.Current;
@@ -1867,14 +1873,20 @@ namespace CodeImp.DoomBuilder
 		// This shows a message and logs the message
 		public static DialogResult ShowWarningMessage(string message, MessageBoxButtons buttons)
 		{
-			return ShowWarningMessage(message, buttons, MessageBoxDefaultButton.Button1);
+			return ShowWarningMessage(message, buttons, MessageBoxDefaultButton.Button1, true);
 		}
 
 		// This shows a message and logs the message
 		public static DialogResult ShowWarningMessage(string message, MessageBoxButtons buttons, MessageBoxDefaultButton defaultbutton)
 		{
-			// Log the message
-			WriteLogLine(message);
+			return ShowWarningMessage(message, buttons, defaultbutton, true);
+		}
+
+		// This shows a message and logs the message
+		public static DialogResult ShowWarningMessage(string message, MessageBoxButtons buttons, MessageBoxDefaultButton defaultbutton, bool log)
+		{
+			//mxd. Log the message?
+			if(log) WriteLogLine(message);
 
 			// Use normal cursor
 			Cursor oldcursor = Cursor.Current;
diff --git a/Source/Core/General/MapManager.cs b/Source/Core/General/MapManager.cs
index c8ad6fb212089cbd4f7692aa8457e3f7faed7434..edfb163d669e8996020c89e9bdea09157a71d7b0 100644
--- a/Source/Core/General/MapManager.cs
+++ b/Source/Core/General/MapManager.cs
@@ -56,6 +56,7 @@ namespace CodeImp.DoomBuilder
 		// Status
 		private bool changed;
 		private bool scriptschanged;
+		private bool maploading; //mxd
 
 		// Map information
 		private string filetitle;
@@ -101,7 +102,7 @@ namespace CodeImp.DoomBuilder
 		public MapOptions Options { get { return options; } }
 		public MapSet Map { get { return map; } }
 		public DataManager Data { get { return data; } }
-		public bool IsChanged { get { return changed | CheckScriptChanged(); } set { changed |= value; General.MainWindow.UpdateMapChangedStatus(); } }
+		public bool IsChanged { get { return changed | CheckScriptChanged(); } set { changed |= value; if(!maploading) General.MainWindow.UpdateMapChangedStatus(); } }
 		public bool IsDisposed { get { return isdisposed; } }
 		internal D3DDevice Graphics { get { return graphics; } }
 		public IRenderer2D Renderer2D { get { return renderer2d; } }
@@ -166,7 +167,7 @@ namespace CodeImp.DoomBuilder
 		internal bool Dispose() 
 		{
 			// Not already disposed?
-			if (!isdisposed) 
+			if(!isdisposed) 
 			{
 				// Let the plugins know
 				General.Plugins.OnMapCloseBegin();
@@ -184,20 +185,21 @@ namespace CodeImp.DoomBuilder
 				General.Actions.UnbindMethods(this);
 
 				// Dispose
-				if (grid != null) grid.Dispose();
-				if (launcher != null) launcher.Dispose();
-				if (copypaste != null) copypaste.Dispose();
-				if (undoredo != null) undoredo.Dispose();
+				maploading = true; //mxd
+				if(grid != null) grid.Dispose();
+				if(launcher != null) launcher.Dispose();
+				if(copypaste != null) copypaste.Dispose();
+				if(undoredo != null) undoredo.Dispose();
 				General.WriteLogLine("Unloading data resources...");
-				if (data != null) data.Dispose();
+				if(data != null) data.Dispose();
 				General.WriteLogLine("Closing temporary file...");
-				if (tempwad != null) tempwad.Dispose();
+				if(tempwad != null) tempwad.Dispose();
 				General.WriteLogLine("Unloading map data...");
-				if (map != null) map.Dispose();
+				if(map != null) map.Dispose();
 				General.WriteLogLine("Stopping graphics device...");
-				if (renderer2d != null) renderer2d.Dispose();
-				if (renderer3d != null) renderer3d.Dispose();
-				if (graphics != null) graphics.Dispose();
+				if(renderer2d != null) renderer2d.Dispose();
+				if(renderer3d != null) renderer3d.Dispose();
+				if(graphics != null) graphics.Dispose();
 				visualcamera = null;
 				grid = null;
 				launcher = null;
@@ -221,7 +223,7 @@ namespace CodeImp.DoomBuilder
 				{
 					Directory.Delete(temppath, true);
 				} 
-				catch (Exception e) 
+				catch(Exception e) 
 				{
 					General.WriteLogLine(e.GetType().Name + ": " + e.Message);
 					General.WriteLogLine("Failed to remove temporary directory!");
@@ -253,6 +255,7 @@ namespace CodeImp.DoomBuilder
 			// Apply settings
 			this.filetitle = options.CurrentName + ".wad";
 			this.filepathname = "";
+			this.maploading = true; //mxd
 			this.changed = false;
 			this.options = options;
 
@@ -261,7 +264,7 @@ namespace CodeImp.DoomBuilder
 			// Initiate graphics
 			General.WriteLogLine("Initializing graphics device...");
 			graphics = new D3DDevice(General.MainWindow.Display);
-			if (!graphics.Initialize()) return false;
+			if(!graphics.Initialize()) return false;
 
 			// Create renderers
 			renderer2d = new Renderer2D(graphics);
@@ -323,12 +326,13 @@ namespace CodeImp.DoomBuilder
 			this.visualcamera = new VisualCamera();
 			General.Editing.ChangeMode(configinfo.StartMode);
 			ClassicMode cmode = (General.Editing.Mode as ClassicMode);
-			if (cmode != null) cmode.SetZoom(0.5f);
+			if(cmode != null) cmode.SetZoom(0.5f);
 			renderer2d.SetViewMode((ViewMode)General.Settings.DefaultViewMode);
 			General.Settings.SetDefaultThingFlags(config.DefaultThingFlags);
 
 			// Success
 			this.changed = false;
+			this.maploading = false; //mxd
 			General.WriteLogLine("Map creation done");
 			General.MainWindow.UpdateMapChangedStatus(); //mxd
 			return true;
@@ -348,6 +352,7 @@ namespace CodeImp.DoomBuilder
 			this.filetitle = Path.GetFileName(filepathname);
 			this.filepathname = filepathname;
 			this.changed = false;
+			this.maploading = true; //mxd
 			this.options = options;
 
 			General.WriteLogLine("Opening map '" + options.CurrentName + "' with configuration '" + options.ConfigFile + "'");
@@ -355,7 +360,7 @@ namespace CodeImp.DoomBuilder
 			// Initiate graphics
 			General.WriteLogLine("Initializing graphics device...");
 			graphics = new D3DDevice(General.MainWindow.Display);
-			if (!graphics.Initialize()) return false;
+			if(!graphics.Initialize()) return false;
 
 			// Create renderers
 			renderer2d = new Renderer2D(graphics);
@@ -423,7 +428,7 @@ namespace CodeImp.DoomBuilder
 			grid.TranslateBackgroundName(config.UseLongTextureNames);
 
 			//mxd. Sector textures may've been changed 
-			if (nameschanged) data.UpdateUsedTextures();
+			if(nameschanged) data.UpdateUsedTextures();
 
 			// Update structures
 			options.ApplyGridSettings();
@@ -452,6 +457,7 @@ namespace CodeImp.DoomBuilder
 
 			// Success
 			this.changed = maprestored; //mxd
+			this.maploading = false; //mxd
 			General.WriteLogLine("Map loading done");
 			General.MainWindow.UpdateMapChangedStatus(); //mxd
 			return true;
@@ -465,6 +471,7 @@ namespace CodeImp.DoomBuilder
 #endif
 			
 			this.changed = false;
+			this.maploading = true; //mxd
 			this.options = options;
 
 			// Create map data
@@ -540,6 +547,7 @@ namespace CodeImp.DoomBuilder
 
 			// Success
 			this.changed = maprestored;
+			this.maploading = false; //mxd
 			General.WriteLogLine("Map switching done");
 			General.MainWindow.UpdateMapChangedStatus(); //mxd
 			return true;
diff --git a/Source/Core/Plugins/Plugin.cs b/Source/Core/Plugins/Plugin.cs
index d3e0d5b21fc78957ee2b257fa5ea0a8912bf7679..6c7d58a5e386dc74270ba36ddf6fe6545c73eb2e 100644
--- a/Source/Core/Plugins/Plugin.cs
+++ b/Source/Core/Plugins/Plugin.cs
@@ -21,6 +21,7 @@ using System.Collections.Generic;
 using System.Globalization;
 using System.IO;
 using System.Reflection;
+using System.Windows.Forms;
 
 #endregion
 
@@ -174,7 +175,7 @@ namespace CodeImp.DoomBuilder.Plugins
 		public Type FindSingleClass(Type t)
 		{
 			Type[] types = FindClasses(t);
-			if(types.Length > 0) return types[0]; else return null;
+			return (types.Length > 0 ? types[0] : null);
 		}
 		
 		// This creates an instance of a class
@@ -194,13 +195,19 @@ namespace CodeImp.DoomBuilder.Plugins
 			catch(TargetInvocationException e)
 			{
 				// Error!
-				General.ErrorLogger.Add(ErrorType.Error, "Failed to create class instance '" + t.Name + "' from plugin '" + name + "' " + e.InnerException.GetType().Name + " at target: " + e.InnerException.Message);
+				string error = "Failed to create class instance '" + t.Name + "' from plugin '" + name + "'.";
+				General.ShowErrorMessage(error + Environment.NewLine + Environment.NewLine + "See the error log for more details", MessageBoxButtons.OK, false);
+				General.WriteLogLine(error + " " + e.InnerException.GetType().Name + " at target: " 
+					+ e.InnerException.Message + Environment.NewLine + "Stacktrace: " + e.InnerException.StackTrace.Trim());
 				return default(T);
 			}
 			catch(Exception e)
 			{
 				// Error!
-				General.ErrorLogger.Add(ErrorType.Error, "Failed to create class instance '" + t.Name + "' from plugin '" + name + "' " + e.GetType().Name + ": " + e.Message);
+				string error = "Failed to create class instance '" + t.Name + "' from plugin '" + name + "'.";
+				General.ShowErrorMessage(error + Environment.NewLine + Environment.NewLine + "See the error log for more details", MessageBoxButtons.OK, false);
+				General.WriteLogLine(error + " " + e.GetType().Name + ": " + e.Message + Environment.NewLine
+					+ "Stacktrace: " + e.StackTrace.Trim());
 				return default(T);
 			}
 		}
diff --git a/Source/Core/Windows/MainForm.Designer.cs b/Source/Core/Windows/MainForm.Designer.cs
index 2f9b40393124fe67e5b1b9cf8b3f1da3cc56b5d4..fd9cb2fa722542f099d651e66996e8477b45229b 100644
--- a/Source/Core/Windows/MainForm.Designer.cs
+++ b/Source/Core/Windows/MainForm.Designer.cs
@@ -137,6 +137,7 @@ namespace CodeImp.DoomBuilder.Windows
 			this.menuhelp = new System.Windows.Forms.ToolStripMenuItem();
 			this.itemhelprefmanual = new System.Windows.Forms.ToolStripMenuItem();
 			this.itemShortcutReference = new System.Windows.Forms.ToolStripMenuItem();
+			this.itemopenconfigfolder = new System.Windows.Forms.ToolStripMenuItem();
 			this.itemhelpeditmode = new System.Windows.Forms.ToolStripMenuItem();
 			this.itemhelpcheckupdates = new System.Windows.Forms.ToolStripMenuItem();
 			this.seperatorhelpmanual = new System.Windows.Forms.ToolStripSeparator();
@@ -1144,6 +1145,7 @@ namespace CodeImp.DoomBuilder.Windows
 			this.menuhelp.DropDownItems.AddRange(new System.Windows.Forms.ToolStripItem[] {
             this.itemhelprefmanual,
             this.itemShortcutReference,
+			this.itemopenconfigfolder,
             this.itemhelpeditmode,
             this.itemhelpcheckupdates,
             this.seperatorhelpmanual,
@@ -1169,6 +1171,15 @@ namespace CodeImp.DoomBuilder.Windows
 			this.itemShortcutReference.Text = "Keyboard Shortcuts Reference";
 			this.itemShortcutReference.Click += new System.EventHandler(this.itemShortcutReference_Click);
 			// 
+			// itemopenconfigfolder
+			//
+			this.itemopenconfigfolder.Image = global::CodeImp.DoomBuilder.Properties.Resources.FolderExplore;
+			this.itemopenconfigfolder.Name = "itemopenconfigfolder";
+			this.itemopenconfigfolder.Size = new System.Drawing.Size(232, 22);
+			this.itemopenconfigfolder.Tag = "";
+			this.itemopenconfigfolder.Text = "Program Configuration Folder";
+			this.itemopenconfigfolder.Click += new System.EventHandler(this.itemopenconfigfolder_Click);
+			// 
 			// itemhelpeditmode
 			// 
 			this.itemhelpeditmode.Image = global::CodeImp.DoomBuilder.Properties.Resources.Question;
@@ -2636,6 +2647,7 @@ namespace CodeImp.DoomBuilder.Windows
 		private System.Windows.Forms.ToolStripMenuItem screenshotToolStripMenuItem;
 		private System.Windows.Forms.ToolStripMenuItem editAreaScreenshotToolStripMenuItem;
 		private System.Windows.Forms.ToolStripMenuItem itemShortcutReference;
+		private System.Windows.Forms.ToolStripMenuItem itemopenconfigfolder;
 		private System.Windows.Forms.ToolStripMenuItem itemopenmapincurwad;
 		private System.Windows.Forms.ToolStripMenuItem itemgrid1;
 		private System.Windows.Forms.ToolStripMenuItem itemzoom400;
diff --git a/Source/Core/Windows/MainForm.cs b/Source/Core/Windows/MainForm.cs
index 71e581f3d3daf0b468515a4a08df9cd241d2fb4c..2455eb0cbe099b097f71becdb59c611c373a9381 100644
--- a/Source/Core/Windows/MainForm.cs
+++ b/Source/Core/Windows/MainForm.cs
@@ -3060,6 +3060,14 @@ namespace CodeImp.DoomBuilder.Windows
 			DisplayStatus(StatusType.Info, "Shortcut reference saved to '" + path + "'");
 			Process.Start(path);
 		}
+
+		//mxd
+		private void itemopenconfigfolder_Click(object sender, EventArgs e)
+		{
+			if(Directory.Exists(General.SettingsPath)) Process.Start(General.SettingsPath);
+			else General.ShowErrorMessage("Huh? Where did Settings folder go?.." + Environment.NewLine 
+				+ "I swear it was here: '" + General.SettingsPath + "'!", MessageBoxButtons.OK); // I don't think this will ever happen
+		}
 		
 		#endregion