Index: trunk/src/org/openstreetmap/josm/actions/mapmode/ParallelWayAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/ParallelWayAction.java	(revision 12107)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/ParallelWayAction.java	(revision 12108)
@@ -44,6 +44,6 @@
 import org.openstreetmap.josm.gui.Notification;
 import org.openstreetmap.josm.gui.draw.MapViewPath;
+import org.openstreetmap.josm.gui.layer.AbstractMapViewPaintable;
 import org.openstreetmap.josm.gui.layer.Layer;
-import org.openstreetmap.josm.gui.layer.MapViewPaintable;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.util.ModifierListener;
@@ -90,5 +90,5 @@
  * @author Ole Jørgen Brønner (olejorgenb)
  */
-public class ParallelWayAction extends MapMode implements ModifierListener, MapViewPaintable {
+public class ParallelWayAction extends MapMode implements ModifierListener {
 
     private static final CachingProperty<BasicStroke> HELPER_LINE_STROKE = new StrokeProperty(prefKey("stroke.hepler-line"), "1").cached();
@@ -145,4 +145,6 @@
     private EastNorth helperLineEnd;
 
+    private final ParallelWayLayer temporaryLayer = new ParallelWayLayer();
+
     /**
      * Constructs a new {@code ParallelWayAction}.
@@ -168,5 +170,5 @@
         mv.addMouseListener(this);
         mv.addMouseMotionListener(this);
-        mv.addTemporaryLayer(this);
+        mv.addTemporaryLayer(temporaryLayer);
 
         //// Needed to update the mouse cursor if modifiers are changed when the mouse is motionless
@@ -183,5 +185,5 @@
         mv.removeMouseListener(this);
         mv.removeMouseMotionListener(this);
-        mv.removeTemporaryLayer(this);
+        mv.removeTemporaryLayer(temporaryLayer);
         Main.map.statusLine.setDist(-1);
         Main.map.statusLine.repaint();
@@ -334,5 +336,5 @@
         setMode(Mode.NORMAL);
         resetMouseTrackingState();
-        mv.repaint();
+        temporaryLayer.invalidate();
     }
 
@@ -431,5 +433,5 @@
         Main.map.statusLine.setDist(Math.abs(snappedRealD));
         Main.map.statusLine.repaint();
-        mv.repaint();
+        temporaryLayer.invalidate();
     }
 
@@ -450,27 +452,4 @@
         }
         return spec.entrySet().stream().allMatch(entry -> modifiers.contains(entry.getKey()) == entry.getValue().booleanValue());
-    }
-
-    @Override
-    public void paint(Graphics2D g, MapView mv, Bounds bbox) {
-        if (mode == Mode.DRAGGING) {
-            CheckParameterUtil.ensureParameterNotNull(mv, "mv");
-
-            Color mainColor = MAIN_COLOR.get();
-            // FIXME: should clip the line (gets insanely slow when zoomed in on a very long line
-            g.setStroke(REF_LINE_STROKE.get());
-            g.setColor(mainColor);
-            MapViewPath line = new MapViewPath(mv);
-            line.moveTo(referenceSegment.getFirstNode());
-            line.lineTo(referenceSegment.getSecondNode());
-            g.draw(line.computeClippedLine(g.getStroke()));
-
-            g.setStroke(HELPER_LINE_STROKE.get());
-            g.setColor(mainColor);
-            line = new MapViewPath(mv);
-            line.moveTo(helperLineStart);
-            line.lineTo(helperLineEnd);
-            g.draw(line.computeClippedLine(g.getStroke()));
-        }
     }
 
@@ -633,3 +612,27 @@
         }
     }
+
+    private class ParallelWayLayer extends AbstractMapViewPaintable {
+        @Override
+        public void paint(Graphics2D g, MapView mv, Bounds bbox) {
+            if (mode == Mode.DRAGGING) {
+                CheckParameterUtil.ensureParameterNotNull(mv, "mv");
+
+                Color mainColor = MAIN_COLOR.get();
+                g.setStroke(REF_LINE_STROKE.get());
+                g.setColor(mainColor);
+                MapViewPath line = new MapViewPath(mv);
+                line.moveTo(referenceSegment.getFirstNode());
+                line.lineTo(referenceSegment.getSecondNode());
+                g.draw(line.computeClippedLine(g.getStroke()));
+
+                g.setStroke(HELPER_LINE_STROKE.get());
+                g.setColor(mainColor);
+                line = new MapViewPath(mv);
+                line.moveTo(helperLineStart);
+                line.lineTo(helperLineEnd);
+                g.draw(line.computeClippedLine(g.getStroke()));
+            }
+        }
+    }
 }
