diff --git a/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs b/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs
index 950c717166c9f55aeb5e07ea6fdd91532c5e2bff..a3ab3a128ebf53982343b089ed30f3328e013058 100755
--- a/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs
+++ b/Source/Plugins/BuilderModes/ClassicModes/DrawGeometryMode.cs
@@ -331,9 +331,15 @@ namespace CodeImp.DoomBuilder.BuilderModes
 			Vector2D scaledPerpendicular = delta.GetPerpendicular().GetNormal().GetScaled(18f / renderer.Scale);
 			renderer.RenderLine(middlePoint, new Vector2D(middlePoint.x - scaledPerpendicular.x, middlePoint.y - scaledPerpendicular.y), LINE_THICKNESS, color, true);
 		}
-		
+
 		// This returns the aligned and snapped draw position
 		public static DrawnVertex GetCurrentPosition(Vector2D mousemappos, bool snaptonearest, bool snaptogrid, bool snaptocardinal, bool usefourcardinaldirections, IRenderer2D renderer, List<DrawnVertex> points)
+		{
+			return GetCurrentPosition(mousemappos, snaptonearest, snaptogrid, snaptocardinal, usefourcardinaldirections, renderer, points, null);
+		}
+
+		// This returns the aligned and snapped draw position
+		public static DrawnVertex GetCurrentPosition(Vector2D mousemappos, bool snaptonearest, bool snaptogrid, bool snaptocardinal, bool usefourcardinaldirections, IRenderer2D renderer, List<DrawnVertex> points, BlockMap<BlockEntry> blockmap)
 		{
 			DrawnVertex p = new DrawnVertex();
 			p.stitch = true; //mxd. Setting these to false seems to be a good way to create invalid geometry...
@@ -380,8 +386,22 @@ namespace CodeImp.DoomBuilder.BuilderModes
 					}
 				}
 
+				List<Vertex> vertices = new List<Vertex>();
+				Vertex nv = null;
+
+				// If we got a blockmap get the veritces that are in range only
+				if (blockmap != null)
+				{
+					HashSet<BlockEntry> blocks = blockmap.GetSquareRange(vm.x - vrange, vm.y - vrange, vrange * 2, vrange * 2);
+					foreach (BlockEntry be in blocks)
+						vertices.AddRange(be.Vertices);
+
+					nv = MapSet.NearestVertexSquareRange(vertices, vm, vrange);
+				}
+				else
+					nv = General.Map.Map.NearestVertexSquareRange(vm, vrange);
+
 				// Try the nearest vertex
-				Vertex nv = General.Map.Map.NearestVertexSquareRange(vm, vrange);
 				if(nv != null)
 				{
 					//mxd. Line angle must stay the same
@@ -402,7 +422,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 				}
 
 				// Try the nearest linedef. mxd. We'll need much bigger stitch distance when snapping to cardinal directions
-				Linedef nl = General.Map.Map.NearestLinedefRange(vm, BuilderPlug.Me.StitchRange / renderer.Scale);
+				Linedef nl = blockmap != null ? MapSet.NearestLinedefRange(blockmap, vm, BuilderPlug.Me.StitchRange / renderer.Scale) : General.Map.Map.NearestLinedefRange(vm, BuilderPlug.Me.StitchRange / renderer.Scale);
 				if(nl != null)
 				{
 					//mxd. Line angle must stay the same
diff --git a/Source/Plugins/BuilderModes/ClassicModes/LinedefsMode.cs b/Source/Plugins/BuilderModes/ClassicModes/LinedefsMode.cs
index cbd3261fcf86706df1a0bce77f1630a35f058931..a6ac58fff43bf2cd8ca39e565365ae67cc6f8055 100755
--- a/Source/Plugins/BuilderModes/ClassicModes/LinedefsMode.cs
+++ b/Source/Plugins/BuilderModes/ClassicModes/LinedefsMode.cs
@@ -23,13 +23,11 @@ using System.Linq;
 using System.Windows.Forms;
 using CodeImp.DoomBuilder.Actions;
 using CodeImp.DoomBuilder.BuilderModes.Interface;
-using CodeImp.DoomBuilder.Config;
 using CodeImp.DoomBuilder.Data;
 using CodeImp.DoomBuilder.Editing;
 using CodeImp.DoomBuilder.Geometry;
 using CodeImp.DoomBuilder.Map;
 using CodeImp.DoomBuilder.Rendering;
-using CodeImp.DoomBuilder.Types;
 using CodeImp.DoomBuilder.Windows;
 
 #endregion
@@ -921,6 +919,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		public override void OnMouseMove(MouseEventArgs e)
 		{
 			base.OnMouseMove(e);
+
 			if(panning) return; //mxd. Skip all this jazz while panning
 
 			//mxd
@@ -978,18 +977,39 @@ namespace CodeImp.DoomBuilder.BuilderModes
 				{
 					bool snaptogrid = General.Interface.ShiftState ^ General.Interface.SnapToGrid;
 					bool snaptonearest = General.Interface.CtrlState ^ General.Interface.AutoMerge;
-					Vector2D v = DrawGeometryMode.GetCurrentPosition(mousemappos, snaptonearest, snaptogrid, false, false, renderer, new List<DrawnVertex>()).pos;
 
-					if(v != insertpreview)
+					Vector2D v = DrawGeometryMode.GetCurrentPosition(mousemappos, snaptonearest, snaptogrid, false, false, renderer, new List<DrawnVertex>(), blockmap).pos;
+
+					if (v != insertpreview)
 					{
 						insertpreview = v;
-						General.Interface.RedrawDisplay();
+
+						// Render preview. Do not redraw the whole display for performance reasons
+						if(renderer.StartOverlay(true))
+						{
+							double dist = Math.Min(Vector2D.Distance(mousemappos, insertpreview), BuilderPlug.Me.HighlightRange);
+							byte alpha = (byte)(255 - (dist / BuilderPlug.Me.HighlightRange) * 128);
+							float vsize = (renderer.VertexSize + 1.0f) / renderer.Scale;
+							renderer.RenderRectangleFilled(new RectangleF((float)(insertpreview.x - vsize), (float)(insertpreview.y - vsize), vsize * 2.0f, vsize * 2.0f), General.Colors.InfoLine.WithAlpha(alpha), true);
+							renderer.Finish();
+							renderer.Present();
+						}
 					}
 				} 
 				else if(insertpreview.IsFinite()) 
 				{
 					insertpreview.x = float.NaN;
-					General.Interface.RedrawDisplay();
+
+					// Render preview. Do not redraw the whole display for performance reasons
+					if (renderer.StartOverlay(true))
+					{
+						double dist = Math.Min(Vector2D.Distance(mousemappos, insertpreview), BuilderPlug.Me.HighlightRange);
+						byte alpha = (byte)(255 - (dist / BuilderPlug.Me.HighlightRange) * 128);
+						float vsize = (renderer.VertexSize + 1.0f) / renderer.Scale;
+						renderer.RenderRectangleFilled(new RectangleF((float)(insertpreview.x - vsize), (float)(insertpreview.y - vsize), vsize * 2.0f, vsize * 2.0f), General.Colors.InfoLine.WithAlpha(alpha), true);
+						renderer.Finish();
+						renderer.Present();
+					}
 				}
 
 				// Highlight if not the same
@@ -1023,7 +1043,7 @@ namespace CodeImp.DoomBuilder.BuilderModes
 		protected override void BeginViewPan() 
 		{
 			// We don't want vertex preview while panning
-			insertpreview.x = float.NaN;
+			insertpreview.x = double.NaN;
 			base.BeginViewPan();
 		}