Index: trunk/src/org/openstreetmap/josm/Main.java
===================================================================
--- trunk/src/org/openstreetmap/josm/Main.java	(revision 12630)
+++ trunk/src/org/openstreetmap/josm/Main.java	(revision 12631)
@@ -124,5 +124,5 @@
     @Deprecated
     public static boolean isDisplayingMapView() {
-        return map != null && map.mapView != null;
+        return MainApplication.isDisplayingMapView();
     }
 
@@ -681,11 +681,7 @@
      */
     public Collection<OsmPrimitive> getInProgressSelection() {
-        if (map != null && map.mapMode instanceof DrawAction) {
-            return ((DrawAction) map.mapMode).getInProgressSelection();
-        } else {
-            DataSet ds = getLayerManager().getEditDataSet();
-            if (ds == null) return null;
-            return ds.getSelected();
-        }
+        DataSet ds = getLayerManager().getEditDataSet();
+        if (ds == null) return null;
+        return ds.getSelected();
     }
 
@@ -906,7 +902,4 @@
             ImageProvider.shutdown(false);
             JCSCacheManager.shutdown();
-        }
-        if (map != null) {
-            map.rememberToggleDialogWidth();
         }
         // Remove all layers because somebody may rely on layerRemoved events (like AutosaveTask)
@@ -1090,5 +1083,5 @@
     /**
      * The projection method used.
-     * use {@link #getProjection()} and {@link #setProjection(Projection)} for access.
+     * Use {@link #getProjection()} and {@link #setProjection(Projection)} for access.
      * Use {@link #setProjection(Projection)} in order to trigger a projection change event.
      */
@@ -1112,7 +1105,26 @@
         CheckParameterUtil.ensureParameterNotNull(p);
         Projection oldValue = proj;
-        Bounds b = isDisplayingMapView() ? map.mapView.getRealBounds() : null;
+        Bounds b = main != null ? main.getRealBounds() : null;
         proj = p;
         fireProjectionChanged(oldValue, proj, b);
+    }
+
+    /**
+     * Returns the bounds for the current projection. Used for projection events.
+     * @return the bounds for the current projection
+     * @see #restoreOldBounds
+     */
+    protected Bounds getRealBounds() {
+        // To be overriden
+        return null;
+    }
+
+    /**
+     * Restore clean state corresponding to old bounds after a projection change event.
+     * @param oldBounds bounds previously returned by {@link #getRealBounds}, before the change of projection
+     * @see #getRealBounds
+     */
+    protected void restoreOldBounds(Bounds oldBounds) {
+        // To be overriden
     }
 
@@ -1139,6 +1151,6 @@
                 }
             }
-            if (newValue != null && oldBounds != null) {
-                MainApplication.getMap().mapView.zoomTo(oldBounds);
+            if (newValue != null && oldBounds != null && main != null) {
+                main.restoreOldBounds(oldBounds);
             }
             /* TODO - remove layers with fixed projection */
Index: trunk/src/org/openstreetmap/josm/gui/MainApplication.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 12630)
+++ trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 12631)
@@ -51,7 +51,10 @@
 import org.openstreetmap.josm.actions.PreferencesAction;
 import org.openstreetmap.josm.actions.RestartAction;
+import org.openstreetmap.josm.actions.mapmode.DrawAction;
 import org.openstreetmap.josm.data.AutosaveTask;
+import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.CustomConfigurator;
 import org.openstreetmap.josm.data.Version;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.validation.OsmValidator;
 import org.openstreetmap.josm.gui.ProgramArguments.Option;
@@ -220,5 +223,29 @@
             mainFrame.storeState();
         }
+        if (map != null) {
+            map.rememberToggleDialogWidth();
+        }
         super.shutdown();
+    }
+
+    @Override
+    protected Bounds getRealBounds() {
+        return isDisplayingMapView() ? map.mapView.getRealBounds() : null;
+    }
+
+    @Override
+    protected void restoreOldBounds(Bounds oldBounds) {
+        if (isDisplayingMapView()) {
+            map.mapView.zoomTo(oldBounds);
+        }
+    }
+
+    @Override
+    public Collection<OsmPrimitive> getInProgressSelection() {
+        if (map != null && map.mapMode instanceof DrawAction) {
+            return ((DrawAction) map.mapMode).getInProgressSelection();
+        } else {
+            return super.getInProgressSelection();
+        }
     }
 
