diff --git a/src/org/openstreetmap/josm/Main.java b/src/org/openstreetmap/josm/Main.java
index fddff1a..7d028d4 100644
--- a/src/org/openstreetmap/josm/Main.java
+++ b/src/org/openstreetmap/josm/Main.java
@@ -1430,7 +1430,10 @@ public abstract class Main {
     private static void fireProjectionChanged(Projection oldValue, Projection newValue, Bounds oldBounds) {
         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();
                 while (it.hasNext()) {
diff --git a/src/org/openstreetmap/josm/gui/MapViewState.java b/src/org/openstreetmap/josm/gui/MapViewState.java
index 982ccf7..6d143d7 100644
--- a/src/org/openstreetmap/josm/gui/MapViewState.java
+++ b/src/org/openstreetmap/josm/gui/MapViewState.java
@@ -99,6 +99,17 @@ public final class MapViewState {
         topLeftOnScreen = position.getLocationOnScreen();
     }
 
+    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.
      * @return The scale.
@@ -235,6 +246,19 @@ public final class MapViewState {
     }
 
     /**
+     * Creates a state that uses the projection.
+     * @param projection The projection to use.
+     * @return The new state.
+     */
+    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.
      * @param width The view width
diff --git a/src/org/openstreetmap/josm/gui/NavigatableComponent.java b/src/org/openstreetmap/josm/gui/NavigatableComponent.java
index b6a15e5..3fcd541 100644
--- a/src/org/openstreetmap/josm/gui/NavigatableComponent.java
+++ b/src/org/openstreetmap/josm/gui/NavigatableComponent.java
@@ -50,6 +50,7 @@ import org.openstreetmap.josm.data.preferences.BooleanProperty;
 import org.openstreetmap.josm.data.preferences.DoubleProperty;
 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;
 import org.openstreetmap.josm.gui.layer.NativeScaleLayer;
@@ -176,6 +177,13 @@ public class NavigatableComponent extends JComponent implements Helpful {
     public NavigatableComponent() {
         setLayout(null);
         state = MapViewState.createDefaultState(getWidth(), getHeight());
+        // uses weak link.
+        Main.addProjectionChangeListener(new ProjectionChangeListener() {
+            @Override
+            public void projectionChanged(Projection oldValue, Projection newValue) {
+                fixProjection();
+            }
+        });
     }
 
     @Override
@@ -326,6 +334,16 @@ public class NavigatableComponent extends JComponent implements Helpful {
     }
 
     /**
+     * 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();
+    }
+
+    /**
      * Gets the current view state. This includes the scale, the current view area and the position.
      * @return The current state.
      */
