Index: trunk/src/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreference.java	(revision 11374)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/projection/ProjectionPreference.java	(revision 12306)
@@ -16,4 +16,5 @@
 
 import javax.swing.BorderFactory;
+import javax.swing.JButton;
 import javax.swing.JLabel;
 import javax.swing.JOptionPane;
@@ -22,4 +23,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.ExpertToggleAction;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.SystemOfMeasurement;
@@ -29,4 +31,5 @@
 import org.openstreetmap.josm.data.projection.CustomProjection;
 import org.openstreetmap.josm.data.projection.Projection;
+import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.preferences.PreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.PreferenceSettingFactory;
@@ -67,6 +70,6 @@
     }
 
-    private static List<ProjectionChoice> projectionChoices = new ArrayList<>();
-    private static Map<String, ProjectionChoice> projectionChoicesById = new HashMap<>();
+    private static final List<ProjectionChoice> projectionChoices = new ArrayList<>();
+    private static final Map<String, ProjectionChoice> projectionChoicesById = new HashMap<>();
 
     /**
@@ -269,7 +272,10 @@
     }
 
-    private static final StringProperty PROP_PROJECTION = new StringProperty("projection", mercator.getId());
+    private static String projectionChoice;
+    private static final Map<String, Collection<String>> projectionChoicesSub = new HashMap<>();
+    
+    private static final StringProperty PROP_PROJECTION_DEFAULT = new StringProperty("projection.default", mercator.getId());
     private static final StringProperty PROP_COORDINATES = new StringProperty("coordinates", null);
-    private static final CollectionProperty PROP_SUB_PROJECTION = new CollectionProperty("projection.sub", null);
+    private static final CollectionProperty PROP_SUB_PROJECTION_DEFAULT = new CollectionProperty("projection.default.sub", null);
     public static final StringProperty PROP_SYSTEM_OF_MEASUREMENT = new StringProperty("system_of_measurement", "Metric");
     private static final String[] unitsValues = ALL_SYSTEMS.keySet().toArray(new String[ALL_SYSTEMS.size()]);
@@ -324,5 +330,5 @@
     @Override
     public void addGui(PreferenceTabbedPane gui) {
-        ProjectionChoice pc = setupProjectionCombo();
+        final ProjectionChoice pc = setupProjectionCombo();
 
         for (int i = 0; i < coordinatesCombo.getItemCount(); ++i) {
@@ -358,4 +364,21 @@
         projectionNameLabel.setLabelFor(projectionName);
 
+        JButton btnSetAsDefault = new JButton(tr("Set as default"));
+        projPanel.add(btnSetAsDefault, GBC.eol().insets(5, 10, 5, 5));
+        btnSetAsDefault.addActionListener(e -> {
+            ProjectionChoice pc2 = (ProjectionChoice) projectionCombo.getSelectedItem();
+            String id = pc2.getId();
+            Collection<String> prefs = pc2.getPreferences(projSubPrefPanel);
+            setProjection(id, prefs, true);
+            pc2.setPreferences(prefs);
+            Projection proj = pc2.getProjection();
+            new ExtendedDialog(gui, tr("Default projection"), tr("OK"))
+                    .setButtonIcons("ok")
+                    .setIcon(JOptionPane.INFORMATION_MESSAGE)
+                    .setContent(tr("Default projection has been set to ''{0}''", proj.toCode()))
+                    .showDialog();
+        });
+        ExpertToggleAction.addVisibilitySwitcher(btnSetAsDefault);
+
         projPanel.add(new JSeparator(), GBC.eol().fill(GBC.HORIZONTAL).insets(0, 5, 0, 10));
         projPanel.add(new JLabel(tr("Display coordinates as")), GBC.std().insets(5, 5, 0, 5));
@@ -402,5 +425,5 @@
         Collection<String> prefs = pc.getPreferences(projSubPrefPanel);
 
-        setProjection(id, prefs);
+        setProjection(id, prefs, false);
 
         if (PROP_COORDINATES.put(((CoordinateFormat) coordinatesCombo.getSelectedItem()).name())) {
@@ -415,8 +438,16 @@
 
     public static void setProjection() {
-        setProjection(PROP_PROJECTION.get(), PROP_SUB_PROJECTION.get());
-    }
-
-    public static void setProjection(String id, Collection<String> pref) {
+        setProjection(PROP_PROJECTION_DEFAULT.get(), PROP_SUB_PROJECTION_DEFAULT.get(), false);
+    }
+
+    /**
+     * Set projection.
+     * @param id id of the selected projection choice
+     * @param pref the configuration for the selected projection choice
+     * @param makeDefault true, if it is to be set as permanent default
+     * false, if it is to be set for the current session
+     * @since 12306
+     */
+    public static void setProjection(String id, Collection<String> pref, boolean makeDefault) {
         ProjectionChoice pc = projectionChoicesById.get(id);
 
@@ -432,7 +463,12 @@
         }
         id = pc.getId();
-        PROP_PROJECTION.put(id);
-        PROP_SUB_PROJECTION.put(pref);
-        Main.pref.putCollection("projection.sub."+id, pref);
+        if (makeDefault) {
+            PROP_PROJECTION_DEFAULT.put(id);
+            PROP_SUB_PROJECTION_DEFAULT.put(pref);
+            Main.pref.putCollection("projection.default.sub."+id, pref);
+        } else {
+            projectionChoice = id;
+            projectionChoicesSub.put(id, pref);
+        }
         pc.setPreferences(pref);
         Projection proj = pc.getProjection();
@@ -467,9 +503,10 @@
      */
     private ProjectionChoice setupProjectionCombo() {
+        String pcId = projectionChoice != null ? projectionChoice : PROP_PROJECTION_DEFAULT.get();
         ProjectionChoice pc = null;
         for (int i = 0; i < projectionCombo.getItemCount(); ++i) {
             ProjectionChoice pc1 = projectionCombo.getItemAt(i);
             pc1.setPreferences(getSubprojectionPreference(pc1));
-            if (pc1.getId().equals(PROP_PROJECTION.get())) {
+            if (pc1.getId().equals(pcId)) {
                 projectionCombo.setSelectedIndex(i);
                 selectedProjectionChanged(pc1);
@@ -490,5 +527,8 @@
 
     private static Collection<String> getSubprojectionPreference(ProjectionChoice pc) {
-        return Main.pref.getCollection("projection.sub."+pc.getId(), null);
+        Collection<String> sessionValue = projectionChoicesSub.get(pc.getId());
+        if (sessionValue != null)
+            return sessionValue;
+        return Main.pref.getCollection("projection.default.sub."+pc.getId(), null);
     }
 
