Index: trunk/src/org/openstreetmap/josm/data/projection/ProjectionSubPrefs.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/projection/ProjectionSubPrefs.java	(revision 2272)
+++ trunk/src/org/openstreetmap/josm/data/projection/ProjectionSubPrefs.java	(revision 2272)
@@ -0,0 +1,47 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.projection;
+
+import java.util.Collection;
+
+import javax.swing.JPanel;
+
+public interface ProjectionSubPrefs {
+    /**
+     * Generates the GUI for the given preference and packs them in a JPanel
+     * so they may be displayed if the projection is selected.
+     *
+     * Implementation hints:
+     * <ul>
+     *      <li>Do not return <code>null</code> as it is assumed that if this
+     *      interface is implemented the projection actually has prefs to
+     *      display/save.</li>
+     *      <li>Cache the JPanel in a local variable so that changes are
+     *      persistent even if the user chooses another projection in between.
+     *      Destroy the panel on destroyCachedPanel() so that the pre-selected
+     *      settings may update the preferences are updated from the outside</li>
+     *      </li>
+     * @return
+     */
+    public JPanel getPreferencePanel();
+
+    /**
+     * Will be called if the preference dialog is dismissed.
+     */
+    public Collection<String> getPreferences();
+
+    /**
+     * Return null when code is not part of this projection.
+     */
+    public Collection<String> getPreferencesFromCode(String code);
+
+    /**
+     * Will be called if the preference dialog is dismissed.
+     */
+    public void setPreferences(Collection<String> args);
+
+    /**
+     * Resets all variables related to the projection preferences so they may
+     * update the next time getPreferencePanel is called.
+     */
+    public void destroyCachedPanel();
+}
Index: trunk/src/org/openstreetmap/josm/data/projection/UTM.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/projection/UTM.java	(revision 2114)
+++ trunk/src/org/openstreetmap/josm/data/projection/UTM.java	(revision 2272)
@@ -4,7 +4,17 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.awt.GridBagLayout;
+import java.util.Collection;
+import java.util.Collections;
+
+import javax.swing.JComboBox;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.coor.EastNorth;
 import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.tools.GBC;
 
 /**
@@ -14,5 +24,7 @@
  * code based on JavaScript from Chuck Taylor
  */
-public class UTM implements Projection {
+public class UTM implements Projection, ProjectionSubPrefs {
+
+    private int zone = 33;
 
     final private double UTMScaleFactor = 0.9996;
@@ -336,19 +348,18 @@
 
     @Override public String toString() {
-        return tr("UTM Zone {0}", getzone());
-    }
-
-    /* TODO - support all UTM's not only zone 33 */
+        return tr("UTM");
+    }
+
     public int getzone()
     {
-        return 33;
+        return zone;
     }
 
     public String toCode() {
-        return "EPSG:325833";
+        return "EPSG:"+ (325800 + getzone());
     }
 
     public String getCacheDirectoryName() {
-        return "epsg325833";
+        return "epsg"+ (325800 + getzone());
     }
 
@@ -364,3 +375,47 @@
         return 10;
     }
+
+    private JPanel prefpanel = null;
+    private JComboBox prefcb = null;
+    public JPanel getPreferencePanel() {
+        if(prefpanel != null)
+            return prefpanel;
+
+        prefcb = new JComboBox();
+        for(int i = 1; i <= 60; i++) {
+            prefcb.addItem(i);
+        }
+
+        prefcb.setSelectedIndex(zone - 1);
+        prefpanel = new JPanel(new GridBagLayout());
+        prefpanel.add(new JLabel(tr("UTM Zone")), GBC.std().insets(5,5,0,5));
+        prefpanel.add(GBC.glue(1, 0), GBC.std().fill(GBC.HORIZONTAL));
+        prefpanel.add(prefcb, GBC.eop().fill(GBC.HORIZONTAL));
+        prefpanel.add(GBC.glue(1, 1), GBC.eol().fill(GBC.BOTH));
+        return prefpanel;
+    }
+
+    public Collection<String> getPreferences() {
+        if(prefcb == null)
+            return null;
+        int zone = prefcb.getSelectedIndex() + 1;
+        return Collections.singleton(Integer.toString(zone));
+    }
+
+    public void destroyCachedPanel() {
+        prefpanel = null;
+        prefcb = null;
+    }
+
+    public void setPreferences(Collection<String> args)
+    {
+        /* TODO: parse args instead of fixed value */
+        zone = 33;
+    }
+
+    public Collection<String> getPreferencesFromCode(String code)
+    {
+        /* TODO: implement */
+        return null;
+    }
 }
