Index: /trunk/src/org/openstreetmap/josm/data/projection/ProjectionSubPrefs.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/projection/ProjectionSubPrefs.java	(revision 2490)
+++ /trunk/src/org/openstreetmap/josm/data/projection/ProjectionSubPrefs.java	(revision 2491)
@@ -37,4 +37,5 @@
     /**
      * Will be called if the preference dialog is dismissed.
+     * argument may be null to reset everything
      */
     public void setPreferences(Collection<String> args);
Index: /trunk/src/org/openstreetmap/josm/data/projection/UTM.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/projection/UTM.java	(revision 2490)
+++ /trunk/src/org/openstreetmap/josm/data/projection/UTM.java	(revision 2491)
@@ -26,5 +26,6 @@
 public class UTM implements Projection, ProjectionSubPrefs {
 
-    private int zone = 33;
+    public static final int DEFAULT_ZONE = 30;
+    private int zone = DEFAULT_ZONE;
 
     final private double UTMScaleFactor = 0.9996;
@@ -410,11 +411,29 @@
     public void setPreferences(Collection<String> args)
     {
-        /* TODO: parse args instead of fixed value */
-        zone = 33;
+        zone = DEFAULT_ZONE;
+        try {
+            for(String s : args)
+            {
+                zone = Integer.parseInt(s);
+                if(zone <= 0 || zone > 60)
+                    zone = DEFAULT_ZONE;
+                break;
+            }
+        } catch(NumberFormatException e) {}
     }
 
     public Collection<String> getPreferencesFromCode(String code)
     {
-        /* TODO: implement */
+        if(code.startsWith("EPSG:3258"))
+        {
+            try {
+                String zonestring = code.substring(9);
+                int zoneval = Integer.parseInt(zonestring);
+                if(zoneval > 0 && zone <= 60)
+                {
+                    return Collections.singleton(zonestring);
+                }
+            } catch(NumberFormatException e) {}
+        }
         return null;
     }
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/ProjectionPreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/ProjectionPreference.java	(revision 2490)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/ProjectionPreference.java	(revision 2491)
@@ -164,4 +164,5 @@
             coll = null;
             Main.proj = new Mercator();
+            name = Main.proj.getClass().getName();
         }
         if(!Main.proj.equals(oldProj) && b != null)
@@ -171,5 +172,7 @@
         }
         Main.pref.putCollection("projection.sub", coll);
-        if(coll != null && projHasPrefs(Main.proj))
+        String sname = name.substring(name.lastIndexOf(".")+1);
+        Main.pref.putCollection("projection.sub."+sname, coll);
+        if(projHasPrefs(Main.proj))
             ((ProjectionSubPrefs) Main.proj).setPreferences(coll);
     }
@@ -205,5 +208,9 @@
         for (int i = 0; i < projectionCombo.getItemCount(); ++i) {
             Projection proj = (Projection)projectionCombo.getItemAt(i);
-            if (proj.getClass().getName().equals(Main.pref.get("projection", Mercator.class.getName()))) {
+            String name = proj.getClass().getName();
+            String sname = name.substring(name.lastIndexOf(".")+1);
+            if(projHasPrefs(proj))
+                ((ProjectionSubPrefs) proj).setPreferences(Main.pref.getCollection("projection.sub."+sname, null));
+            if (name.equals(Main.pref.get("projection", Mercator.class.getName()))) {
                 projectionCombo.setSelectedIndex(i);
                 selectedProjectionChanged(proj);
