Index: /trunk/src/org/openstreetmap/josm/Main.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/Main.java	(revision 10485)
+++ /trunk/src/org/openstreetmap/josm/Main.java	(revision 10486)
@@ -1431,5 +1431,8 @@
         if (newValue == null ^ oldValue == null
                 || (newValue != null && oldValue != null && !Objects.equals(newValue.toCode(), oldValue.toCode()))) {
-
+            if (Main.map != null) {
+                // This needs to be called first
+                Main.map.mapView.fixProjection();
+            }
             synchronized (Main.class) {
                 Iterator<WeakReference<ProjectionChangeListener>> it = listeners.iterator();
Index: /trunk/src/org/openstreetmap/josm/gui/MapViewState.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/MapViewState.java	(revision 10485)
+++ /trunk/src/org/openstreetmap/josm/gui/MapViewState.java	(revision 10486)
@@ -100,4 +100,15 @@
     }
 
+    private MapViewState(Projection projection, MapViewState mapViewState) {
+        this.projection = projection;
+        this.scale = mapViewState.scale;
+        this.topLeft = mapViewState.topLeft;
+
+        viewWidth = mapViewState.viewWidth;
+        viewHeight = mapViewState.viewHeight;
+        topLeftInWindow = mapViewState.topLeftInWindow;
+        topLeftOnScreen = mapViewState.topLeftOnScreen;
+    }
+
     /**
      * The scale in east/north units per pixel.
@@ -236,4 +247,18 @@
 
     /**
+     * Creates a state that uses the projection.
+     * @param projection The projection to use.
+     * @return The new state.
+     * @since 10486
+     */
+    public MapViewState usingProjection(Projection projection) {
+        if (projection.equals(this.projection)) {
+            return this;
+        } else {
+            return new MapViewState(projection, this);
+        }
+    }
+
+    /**
      * Create the default {@link MapViewState} object for the given map view. The screen position won't be set so that this method can be used
      * before the view was added to the hirarchy.
Index: /trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 10485)
+++ /trunk/src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 10486)
@@ -51,4 +51,5 @@
 import org.openstreetmap.josm.data.preferences.IntegerProperty;
 import org.openstreetmap.josm.data.projection.Projection;
+import org.openstreetmap.josm.data.projection.ProjectionChangeListener;
 import org.openstreetmap.josm.data.projection.Projections;
 import org.openstreetmap.josm.gui.help.Helpful;
@@ -177,4 +178,11 @@
         setLayout(null);
         state = MapViewState.createDefaultState(getWidth(), getHeight());
+        // uses weak link.
+        Main.addProjectionChangeListener(new ProjectionChangeListener() {
+            @Override
+            public void projectionChanged(Projection oldValue, Projection newValue) {
+                fixProjection();
+            }
+        });
     }
 
@@ -324,4 +332,14 @@
     protected boolean isVisibleOnScreen() {
         return SwingUtilities.getWindowAncestor(this) != null && isShowing();
+    }
+
+    /**
+     * Changes the projection settings used for this map view.
+     * <p>
+     * Made public temporarely, will be made private later.
+     */
+    public void fixProjection() {
+        state = state.usingProjection(Main.getProjection());
+        repaint();
     }
 
