Index: src/org/openstreetmap/josm/data/osm/visitor/paint/AbstractMapRenderer.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/visitor/paint/AbstractMapRenderer.java	(revision 13657)
+++ src/org/openstreetmap/josm/data/osm/visitor/paint/AbstractMapRenderer.java	(working copy)
@@ -61,6 +61,9 @@
     /** Preference: minimum space (displayed way length) to display segment numbers */
     protected int segmentNumberSpace;
 
+    /** Performs slow operations by default. Can be disabled when fast partial rendering is required */
+    protected boolean doSlowOperations;
+
     /**
      * <p>Creates an abstract paint visitor</p>
      *
@@ -240,4 +243,13 @@
             }
         }
     }
+
+    /**
+     * Sets whether slow operations such as text rendering must be performed (true by default).
+     * @param enable whether slow operations such as text rendering must be performed
+     * @since xxx
+     */
+    public final void enableSlowOperations(boolean enable) {
+        doSlowOperations = enable;
+    }
 }
Index: src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(revision 13657)
+++ src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(working copy)
@@ -557,7 +557,7 @@
      * @param bs The text and it's alignment.
      */
     public void drawBoxText(Node n, BoxTextElement bs) {
-        if (!isShowNames() || bs == null)
+        if (!isShowNames() || bs == null || !doSlowOperations)
             return;
 
         MapViewPoint p = mapState.getPointFor(n);
@@ -1090,7 +1090,7 @@
      * @since 11722
      */
     public void drawText(OsmPrimitive osm, TextLabel text, PositionForAreaStrategy labelPositionStrategy) {
-        if (!isShowNames()) {
+        if (!isShowNames() || !doSlowOperations) {
             return;
         }
         String name = text.getString(osm);
Index: src/org/openstreetmap/josm/gui/MapMover.java
===================================================================
--- src/org/openstreetmap/josm/gui/MapMover.java	(revision 13657)
+++ src/org/openstreetmap/josm/gui/MapMover.java	(working copy)
@@ -18,12 +18,13 @@
 import org.openstreetmap.gui.jmapviewer.JMapViewer;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.mapmode.SelectAction;
-import org.openstreetmap.josm.spi.preferences.PreferenceChangeEvent;
-import org.openstreetmap.josm.spi.preferences.PreferenceChangedListener;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.preferences.BooleanProperty;
 import org.openstreetmap.josm.gui.MapViewState.MapViewPoint;
+import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.spi.preferences.Config;
+import org.openstreetmap.josm.spi.preferences.PreferenceChangeEvent;
+import org.openstreetmap.josm.spi.preferences.PreferenceChangedListener;
 import org.openstreetmap.josm.tools.Destroyable;
 import org.openstreetmap.josm.tools.Pair;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -157,7 +158,12 @@
         registeredShortcuts.add(new Pair<>(action, shortcut));
     }
 
-    private boolean movementInProgress() {
+    /**
+     * Determines if a map move is in progress.
+     * @return {@code true} if a map move is in progress
+     * @since xxx
+     */
+    public boolean movementInProgress() {
         return mousePosMoveStart != null;
     }
 
@@ -237,6 +243,7 @@
         }
         nc.resetCursor(this);
         mousePosMoveStart = null;
+        MainApplication.getLayerManager().getLayers().forEach(Layer::invalidate);
     }
 
     /**
Index: src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 13657)
+++ src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(working copy)
@@ -63,24 +63,24 @@
 import org.openstreetmap.josm.data.osm.DataIntegrityProblemException;
 import org.openstreetmap.josm.data.osm.DataSelectionListener;
 import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.DownloadPolicy;
-import org.openstreetmap.josm.data.osm.UploadPolicy;
 import org.openstreetmap.josm.data.osm.DataSetMerger;
 import org.openstreetmap.josm.data.osm.DatasetConsistencyTest;
+import org.openstreetmap.josm.data.osm.DownloadPolicy;
 import org.openstreetmap.josm.data.osm.HighlightUpdateListener;
 import org.openstreetmap.josm.data.osm.IPrimitive;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveComparator;
 import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.UploadPolicy;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
 import org.openstreetmap.josm.data.osm.event.DataSetListenerAdapter;
 import org.openstreetmap.josm.data.osm.event.DataSetListenerAdapter.Listener;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
 import org.openstreetmap.josm.data.osm.visitor.OsmPrimitiveVisitor;
+import org.openstreetmap.josm.data.osm.visitor.paint.AbstractMapRenderer;
 import org.openstreetmap.josm.data.osm.visitor.paint.MapRendererFactory;
-import org.openstreetmap.josm.data.osm.visitor.paint.Rendering;
 import org.openstreetmap.josm.data.osm.visitor.paint.relations.MultipolygonCache;
 import org.openstreetmap.josm.data.preferences.IntegerProperty;
 import org.openstreetmap.josm.data.preferences.NamedColorProperty;
@@ -490,7 +490,8 @@
             g.fill(a);
         }
 
-        Rendering painter = MapRendererFactory.getInstance().createActiveRenderer(g, mv, inactive);
+        AbstractMapRenderer painter = MapRendererFactory.getInstance().createActiveRenderer(g, mv, inactive);
+        painter.enableSlowOperations(mv.getMapMover() == null || !mv.getMapMover().movementInProgress());
         painter.render(data, virtual, box);
         MainApplication.getMap().conflictDialog.paintConflicts(g, mv);
     }
