diff --git a/Source/Core/Rendering/IRenderer2D.cs b/Source/Core/Rendering/IRenderer2D.cs
index 261b688351eda78b1da05e11f8e8d83c7345c75b..0819576d7a4213a69ec5a4b95033758372c1de8f 100644
--- a/Source/Core/Rendering/IRenderer2D.cs
+++ b/Source/Core/Rendering/IRenderer2D.cs
@@ -37,7 +37,8 @@ namespace CodeImp.DoomBuilder.Rendering
 		float Scale { get; }
 		int VertexSize { get; }
 		ViewMode ViewMode { get; }
-		
+		Size ViewportSize { get; } //mxd
+
 		// View methods
 		Vector2D DisplayToMap(Vector2D mousepos);
 		Vector2D MapToDisplay(Vector2D mappos);
diff --git a/Source/Core/Rendering/Renderer.cs b/Source/Core/Rendering/Renderer.cs
index 36e72132a22977819921036cd1ede838a98a6bca..ce8eac55a38c5b4c93c2a131769f1d75ed47d2f7 100644
--- a/Source/Core/Rendering/Renderer.cs
+++ b/Source/Core/Rendering/Renderer.cs
@@ -17,6 +17,7 @@
 #region ================== Namespaces
 
 using System;
+using System.Drawing;
 using CodeImp.DoomBuilder.Map;
 using CodeImp.DoomBuilder.Geometry;
 
@@ -46,6 +47,7 @@ namespace CodeImp.DoomBuilder.Rendering
 		// Disposing
 		public bool IsDisposed { get { return isdisposed; } }
 		public static bool FullBrightness { get { return fullbrightness; } set { fullbrightness = value; } } //mxd
+		public Size ViewportSize { get { return graphics.RenderTarget.Size; } } //mxd
 
 		#endregion
 
diff --git a/Source/Plugins/BuilderModes/BuilderModes.csproj b/Source/Plugins/BuilderModes/BuilderModes.csproj
index 5f9e8676782fc49d1ee2bb6bcf49e0a2cd192a3d..b9e693b0ce29e5ca250f7c9c8ec6d4f817da3675 100644
--- a/Source/Plugins/BuilderModes/BuilderModes.csproj
+++ b/Source/Plugins/BuilderModes/BuilderModes.csproj
@@ -225,6 +225,7 @@
     <Compile Include="ClassicModes\DrawRectangleMode.cs" />
     <Compile Include="ClassicModes\FlatAlignMode.cs" />
     <Compile Include="ClassicModes\FloorAlignMode.cs" />
+    <Compile Include="ErrorChecks\CheckMapSize.cs" />
     <Compile Include="ErrorChecks\CheckMissingFlats.cs" />
     <Compile Include="ErrorChecks\CheckMissingTextures.cs" />
     <Compile Include="ErrorChecks\CheckOverlappingVertices.cs" />
@@ -236,6 +237,7 @@
     <Compile Include="ErrorChecks\CheckUnknownThings.cs" />
     <Compile Include="ErrorChecks\CheckUnusedTextures.cs" />
     <Compile Include="ErrorChecks\CheckUnusedThings.cs" />
+    <Compile Include="ErrorChecks\ResultMapTooBig.cs" />
     <Compile Include="ErrorChecks\ResultMissingFlat.cs" />
     <Compile Include="ErrorChecks\ResultNoErrors.cs" />
     <Compile Include="ErrorChecks\ResultSectorInvalid.cs" />
diff --git a/Source/Plugins/BuilderModes/ClassicModes/DrawCurveMode.cs b/Source/Plugins/BuilderModes/ClassicModes/DrawCurveMode.cs
index d96cda680ae5e4a02884b9c8c923297f129c9780..bd8555cbdb99a032feaf2cb45d5aedf1911084c2 100644
--- a/Source/Plugins/BuilderModes/ClassicModes/DrawCurveMode.cs
+++ b/Source/Plugins/BuilderModes/ClassicModes/DrawCurveMode.cs
@@ -74,9 +74,16 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			DrawnVertex curp = GetCurrentPosition();
 			float vsize = (renderer.VertexSize + 1.0f) / renderer.Scale;
 
-			// Update active label position (mxd)
-			if(labels.Count > 0) 
+			// Update label positions (mxd)
+			if(labels.Count > 0)
+			{
+				// Update labels for already drawn lines
+				for(int i = 0; i < labels.Count - 1; i++)
+					SetLabelPosition(labels[i], points[i].pos, points[i + 1].pos);
+
+				// Update label for active line
 				SetLabelPosition(labels[labels.Count - 1], points[points.Count - 1].pos, curp.pos);
+			}
 
 			// Render drawing lines
 			if(renderer.StartOverlay(true)) 
diff --git a/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs b/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs
index 2c516d7b3bd3fc02cc0d41f22eb47e366322400a..5faa5df6158bbf2d4d719f650e388c1d117a18cb 100644
--- a/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs
+++ b/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs
@@ -138,9 +138,16 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			DrawnVertex curp = GetCurrentPosition();
 			float vsize = (renderer.VertexSize + 1.0f) / renderer.Scale;
 
-			// Update active label position (mxd)
-			if (labels.Count > 0)
+			// Update label positions (mxd)
+			if(labels.Count > 0)
+			{
+				// Update labels for already drawn lines
+				for(int i = 0; i < labels.Count - 1; i++) 
+					SetLabelPosition(labels[i], points[i].pos, points[i + 1].pos);
+
+				// Update label for active line
 				SetLabelPosition(labels[labels.Count - 1], points[points.Count - 1].pos, curp.pos);
+			}
 
 			// Render drawing lines
 			if(renderer.StartOverlay(true))
@@ -209,6 +216,43 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		//mxd
 		protected void SetLabelPosition(LineLengthLabel label, Vector2D start, Vector2D end)
 		{
+			// Check if start/end point is on screen...
+			Vector2D lt = General.Map.Renderer2D.DisplayToMap(new Vector2D(0.0f, General.Map.Renderer2D.ViewportSize.Height));
+			Vector2D rb = General.Map.Renderer2D.DisplayToMap(new Vector2D(General.Map.Renderer2D.ViewportSize.Width, 0.0f));
+			RectangleF viewport = new RectangleF(lt.x, lt.y, rb.x - lt.x, rb.y - lt.y);
+			bool startvisible = viewport.Contains(start.x, start.y);
+			bool endvisible = viewport.Contains(end.x, end.y);
+
+			// Do this only when one point is visible, an the other isn't 
+			if((!startvisible && endvisible) || (startvisible && !endvisible))
+			{
+				Line2D drawnline = new Line2D(start, end);
+				Line2D[] viewportsides = new[] {
+					new Line2D(lt, rb.x, lt.y), // top
+					new Line2D(lt.x, rb.y, rb.x, rb.y), // bottom
+					new Line2D(lt, lt.x, rb.y), // left
+					new Line2D(rb.x, lt.y, rb.x, rb.y), // right
+				};
+
+				float u;
+				foreach(Line2D side in viewportsides)
+				{
+					// Modify the start point so it stays on screen
+					if(!startvisible && side.GetIntersection(drawnline, out u))
+					{
+						start = drawnline.GetCoordinatesAt(u);
+						break;
+					}
+
+					// Modify the end point so it stays on screen
+					if(!endvisible && side.GetIntersection(drawnline, out u))
+					{
+						end = drawnline.GetCoordinatesAt(u);
+						break;
+					}
+				}
+			}
+			
 			Vector2D perpendicular = (end - start).GetPerpendicular();
 			float angle = perpendicular.GetAngle();
 			float offset = label.TextLabel.TextSize.Width * Math.Abs((float)Math.Sin(angle)) + label.TextLabel.TextSize.Height * Math.Abs((float)Math.Cos(angle));
@@ -560,7 +604,8 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			// Render things
 			if(renderer.StartThings(true))
 			{
-				renderer.RenderThingSet(General.Map.Map.Things, Presentation.THINGS_ALPHA);
+				renderer.RenderThingSet(General.Map.ThingsFilter.SortedHiddenThings, Presentation.THINGS_HIDDEN_ALPHA);
+				renderer.RenderThingSet(General.Map.ThingsFilter.SortedVisibleThings, Presentation.THINGS_ALPHA);
 				renderer.Finish();
 			}
 
@@ -572,7 +617,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		public override void OnMouseMove(MouseEventArgs e)
 		{
 			base.OnMouseMove(e);
-			if(panning) return; //mxd. Skip all this jass while panning
+			if(panning) return; //mxd. Skip all this jazz while panning
 			Update();
 		}
 
diff --git a/Source/Plugins/BuilderModes/ErrorChecks/CheckMapSize.cs b/Source/Plugins/BuilderModes/ErrorChecks/CheckMapSize.cs
new file mode 100644
index 0000000000000000000000000000000000000000..dc6322f4a83738fce4bfa03871cac1e01abd0ee3
--- /dev/null
+++ b/Source/Plugins/BuilderModes/ErrorChecks/CheckMapSize.cs
@@ -0,0 +1,57 @@
+using CodeImp.DoomBuilder.Geometry;
+using CodeImp.DoomBuilder.Map;
+using System.Threading;
+
+namespace CodeImp.DoomBuilder.BuilderModes.ErrorChecks
+{
+	[ErrorChecker("Check map size", true, 50)]
+	public class CheckMapSize : ErrorChecker
+	{
+		private const int PROGRESS_STEP = 1000;
+		internal const int MAXIMUM_DISTANCE = 32767;
+
+		// Constructor
+		public CheckMapSize() 
+		{
+			// Total progress is done when all vertices are checked
+			SetTotalProgress(General.Map.Map.Vertices.Count / PROGRESS_STEP);
+		}
+
+		// This runs the check
+		public override void Run() 
+		{
+			int progress = 0;
+			int stepprogress = 0;
+
+			float minx = int.MaxValue;
+			float maxx = int.MinValue;
+			float miny = int.MaxValue;
+			float maxy = int.MinValue;
+
+			// Go for all vertices
+			foreach(Vertex v in General.Map.Map.Vertices) 
+			{
+				if(v.Position.x < minx) minx = v.Position.x;
+				if(v.Position.x > maxx) maxx = v.Position.x;
+				if(v.Position.y < miny) miny = v.Position.y;
+				if(v.Position.y > maxy) maxy = v.Position.y;
+
+				// Handle thread interruption
+				try { Thread.Sleep(0); } catch(ThreadInterruptedException) { return; }
+
+				// We are making progress!
+				if((++progress / PROGRESS_STEP) > stepprogress) 
+				{
+					stepprogress = (progress / PROGRESS_STEP);
+					AddProgress(1);
+				}
+			}
+
+			// Map elements should not be more than 32767 mu apart
+			if(maxx - minx > MAXIMUM_DISTANCE || maxy - miny > MAXIMUM_DISTANCE)
+			{
+				SubmitResult(new ResultMapTooBig(new Vector2D(minx, miny), new Vector2D(maxx, maxy)));
+			}
+		}
+	}
+}
diff --git a/Source/Plugins/BuilderModes/ErrorChecks/ErrorResult.cs b/Source/Plugins/BuilderModes/ErrorChecks/ErrorResult.cs
index ef0040a409d27e8d5fe03a3229588f9bef7980e7..916b82cc1b6f96b9f442af5cd4d0ffc7ba2c549a 100644
--- a/Source/Plugins/BuilderModes/ErrorChecks/ErrorResult.cs
+++ b/Source/Plugins/BuilderModes/ErrorChecks/ErrorResult.cs
@@ -62,8 +62,6 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		#endregion
 		
 		#region ================== Methods
-
-
 		
 		// When the first button is clicked
 		// Return true when map geometry or things have been added/removed so that the checker can restart
@@ -93,22 +91,18 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		}
 
 		// This is called for rendering
-		public virtual void PlotSelection(IRenderer2D renderer)
-		{
-		}
+		public virtual void PlotSelection(IRenderer2D renderer) { }
 
-		// This is called for rendering
-		public virtual void RenderThingsSelection(IRenderer2D renderer)
+		// This is called for rendering (mxd. And never used!)
+		/*public virtual void RenderThingsSelection(IRenderer2D renderer)
 		{
-		}
+		}*/
 
 		// This is called for rendering
-		public virtual void RenderOverlaySelection(IRenderer2D renderer)
-		{
-		}
+		public virtual void RenderOverlaySelection(IRenderer2D renderer) { }
 		
 		// Call this to zoom in on the given selection
-		public RectangleF GetZoomArea()
+		public virtual RectangleF GetZoomArea()
 		{
 			List<Vector2D> points = new List<Vector2D>();
 			RectangleF area = MapSet.CreateEmptyArea();
diff --git a/Source/Plugins/BuilderModes/ErrorChecks/ResultMapTooBig.cs b/Source/Plugins/BuilderModes/ErrorChecks/ResultMapTooBig.cs
new file mode 100644
index 0000000000000000000000000000000000000000..977d0ba5c5eaefc26e98cb2e23e3aff6239d5407
--- /dev/null
+++ b/Source/Plugins/BuilderModes/ErrorChecks/ResultMapTooBig.cs
@@ -0,0 +1,65 @@
+#region ================== Namespaces
+
+using System.Drawing;
+using CodeImp.DoomBuilder.Geometry;
+
+#endregion
+
+namespace CodeImp.DoomBuilder.BuilderModes.ErrorChecks
+{
+	public class ResultMapTooBig : ErrorResult
+	{
+		#region ================== Variables
+
+		private readonly bool toowide;
+		private readonly bool toohigh;
+		private readonly Vector2D min;
+		private readonly Vector2D max;
+
+		#endregion
+		
+		#region ================== Properties
+
+		public override int Buttons { get { return 0; } }
+
+		#endregion
+
+		#region ================== Constructor / Destructor
+
+		public ResultMapTooBig(Vector2D min, Vector2D max) 
+		{
+			// Initialize
+			this.min = min;
+			this.max = max;
+			this.toowide = max.x - min.x > CheckMapSize.MAXIMUM_DISTANCE;
+			this.toohigh = max.y - min.y > CheckMapSize.MAXIMUM_DISTANCE;
+			description = "Map is too big.";
+		}
+
+		#endregion
+
+		#region ================== Methods
+
+		public override RectangleF GetZoomArea()
+		{
+			const float scaler = 0.5f;
+			return new RectangleF(min.x * scaler, min.y * scaler, (max.x - min.x) * scaler, (max.y - min.y) * scaler);
+		}
+
+		// This sets if this result is displayed in ErrorCheckForm (mxd)
+		internal override void Hide(bool hide)
+		{
+			hidden = hide;
+		}
+
+		// This must return the string that is displayed in the listbox
+		public override string ToString()
+		{
+			if(toowide && toohigh) return "Map's width and height is bigger than " + CheckMapSize.MAXIMUM_DISTANCE + " m.u. This can cause rendering and physics issues.";
+			if(toowide) return "Map is wider than than " + CheckMapSize.MAXIMUM_DISTANCE + " m.u. This can cause rendering and physics issues.";
+			return "Map is taller than " + CheckMapSize.MAXIMUM_DISTANCE + " m.u. This can cause rendering and physics issues.";
+		}
+
+		#endregion
+	}
+}