Index: src/org/openstreetmap/josm/actions/DownloadAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/DownloadAction.java	(revision 42)
+++ src/org/openstreetmap/josm/actions/DownloadAction.java	(revision 43)
@@ -14,4 +14,5 @@
 import javax.swing.JButton;
 import javax.swing.JCheckBox;
+import javax.swing.JDialog;
 import javax.swing.JLabel;
 import javax.swing.JOptionPane;
@@ -74,5 +75,5 @@
 		dlg.add(latlon[2], GBC.std());
 		dlg.add(new JLabel("max lon"), GBC.std().insets(10,0,5,0));
-		dlg.add(latlon[3], GBC.eop());
+		dlg.add(latlon[3], GBC.eol());
 
 		if (Main.main.getMapFrame() != null) {
@@ -159,36 +160,57 @@
 			return;
 		}
-		OsmServerReader osmReader = new OsmServerReader(b.latlon[0], b.latlon[1], b.latlon[2], b.latlon[3]);
-		try {
-			String name = latlon[0].getText()+" "+latlon[1].getText()+" x "+
-					latlon[2].getText()+" "+latlon[3].getText();
-			
-			Layer layer;
-			if (rawGps.isSelected()) {
-				layer = new RawGpsDataLayer(osmReader.parseRawGps(), name);
-			} else {
-				DataSet dataSet = osmReader.parseOsm();
-				if (dataSet == null)
-					return; // user cancelled download
-				if (dataSet.nodes.isEmpty())
-					JOptionPane.showMessageDialog(Main.main, "No data imported.");
-				
-				layer = new OsmDataLayer(dataSet, name);
-			}
-
-			if (Main.main.getMapFrame() == null)
-				Main.main.setMapFrame(name, new MapFrame(layer));
-			else
-				Main.main.getMapFrame().mapView.addLayer(layer);
-		} catch (JDOMException x) {
-			x.printStackTrace();
-			JOptionPane.showMessageDialog(Main.main, x.getMessage());
-		} catch (FileNotFoundException x) {
-			x.printStackTrace();
-			JOptionPane.showMessageDialog(Main.main, "URL nicht gefunden: "+x.getMessage());
-		} catch (IOException x) {
-			x.printStackTrace();
-			JOptionPane.showMessageDialog(Main.main, x.getMessage());
-		}
+		
+		final OsmServerReader osmReader = new OsmServerReader(b.latlon[0], b.latlon[1], b.latlon[2], b.latlon[3]);
+		
+		final JDialog pleaseWaitDlg = createPleaseWaitDialog("Downloading data");
+		
+		new Thread(){
+			@Override
+			public void run() {
+				try {
+					String name = latlon[0].getText() + " "
+							+ latlon[1].getText() + " x " + latlon[2].getText()
+							+ " " + latlon[3].getText();
+
+					Layer layer = null;
+					if (rawGps.isSelected()) {
+						layer = new RawGpsDataLayer(osmReader.parseRawGps(),
+								name);
+					} else {
+						DataSet dataSet = osmReader.parseOsm();
+						if (dataSet == null)
+							return; // user cancelled download
+						if (dataSet.nodes.isEmpty())
+							JOptionPane.showMessageDialog(Main.main,
+									"No data imported.");
+
+						layer = new OsmDataLayer(dataSet, name);
+					}
+
+					if (Main.main.getMapFrame() == null)
+						Main.main.setMapFrame(name, new MapFrame(layer));
+					else
+						Main.main.getMapFrame().mapView.addLayer(layer);
+					pleaseWaitDlg.setVisible(false);
+				} catch (JDOMException x) {
+					pleaseWaitDlg.setVisible(false);
+					x.printStackTrace();
+					JOptionPane.showMessageDialog(Main.main, x.getMessage());
+				} catch (FileNotFoundException x) {
+					pleaseWaitDlg.setVisible(false);
+					x.printStackTrace();
+					JOptionPane.showMessageDialog(Main.main,
+							"URL nicht gefunden: " + x.getMessage());
+				} catch (IOException x) {
+					pleaseWaitDlg.setVisible(false);
+					x.printStackTrace();
+					JOptionPane.showMessageDialog(Main.main, x.getMessage());
+				} finally {
+					pleaseWaitDlg.setVisible(false);
+				}
+			}
+		}.start();
+		
+		pleaseWaitDlg.setVisible(true);
 	}
 	
Index: src/org/openstreetmap/josm/actions/JosmAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/JosmAction.java	(revision 42)
+++ src/org/openstreetmap/josm/actions/JosmAction.java	(revision 43)
@@ -4,5 +4,9 @@
 
 import javax.swing.AbstractAction;
+import javax.swing.BorderFactory;
+import javax.swing.JDialog;
+import javax.swing.JLabel;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.gui.ImageProvider;
 
@@ -30,3 +34,22 @@
 			putValue(ACCELERATOR_KEY, shortCut);
 	}
+
+	/**
+	 * @return A dialog labeled "... Please Wait." where ... is the message parameter.
+	 */
+	protected JDialog createPleaseWaitDialog(String msg) {
+		final JDialog pleaseWaitDlg = new JDialog(Main.main, true);
+		pleaseWaitDlg.setUndecorated(true);
+		JLabel l = new JLabel(msg+". Please Wait.");
+		l.setBorder(BorderFactory.createCompoundBorder(
+				BorderFactory.createEtchedBorder(),
+				BorderFactory.createEmptyBorder(20,20,20,20)));
+		pleaseWaitDlg.getContentPane().add(l);
+		pleaseWaitDlg.pack();
+		pleaseWaitDlg.setLocation(Main.main.getWidth()/2-pleaseWaitDlg.getWidth()/2,
+				Main.main.getHeight()/2-pleaseWaitDlg.getHeight()/2);
+		pleaseWaitDlg.setResizable(false);
+		pleaseWaitDlg.setAlwaysOnTop(true);
+		return pleaseWaitDlg;
+	}
 }
Index: src/org/openstreetmap/josm/actions/UploadAction.java
===================================================================
--- src/org/openstreetmap/josm/actions/UploadAction.java	(revision 42)
+++ src/org/openstreetmap/josm/actions/UploadAction.java	(revision 43)
@@ -8,4 +8,5 @@
 import java.util.LinkedList;
 
+import javax.swing.JDialog;
 import javax.swing.JLabel;
 import javax.swing.JList;
@@ -42,6 +43,17 @@
 		Collection<OsmPrimitive> update = new LinkedList<OsmPrimitive>();
 		Collection<OsmPrimitive> delete = new LinkedList<OsmPrimitive>();
+		boolean acceptedTracks = false;
 		for (OsmPrimitive osm : Main.main.ds.allPrimitives()) {
-			if (osm instanceof Track) {
+			boolean doSomething = true;
+			if (osm.id == 0 && !osm.isDeleted())
+				add.add(osm);
+			else if ((osm.modified || osm.modifiedProperties) && !osm.isDeleted())
+				update.add(osm);
+			else if (osm.isDeleted() && osm.id != 0)
+				delete.add(osm);
+			else
+				doSomething = false;
+
+			if (osm instanceof Track && doSomething && !acceptedTracks) {
 				int answer = JOptionPane.showConfirmDialog(Main.main, 
 						"The server currently does not understand the concept of Tracks.\n" +
@@ -50,11 +62,6 @@
 				if (answer != JOptionPane.YES_OPTION)
 					return;
+				acceptedTracks = true;
 			}
-			if (osm.id == 0 && !osm.isDeleted())
-				add.add(osm);
-			else if ((osm.modified || osm.modifiedProperties) && !osm.isDeleted())
-				update.add(osm);
-			else if (osm.isDeleted() && osm.id != 0)
-				delete.add(osm);
 		}
 
@@ -62,17 +69,30 @@
 			return;
 
-		OsmServerWriter server = new OsmServerWriter();
-		try {
-			Collection<OsmPrimitive> all = new LinkedList<OsmPrimitive>();
-			all.addAll(add);
-			all.addAll(update);
-			all.addAll(delete);
-			server.uploadOsm(all);
-			// finished without errors -> clean dataset
-			Main.main.getMapFrame().mapView.editLayer().cleanData();
-		} catch (JDOMException x) {
-			x.printStackTrace();
-			JOptionPane.showMessageDialog(Main.main, x.getMessage());
-		}
+		final OsmServerWriter server = new OsmServerWriter();
+		final Collection<OsmPrimitive> all = new LinkedList<OsmPrimitive>();
+		all.addAll(add);
+		all.addAll(update);
+		all.addAll(delete);
+		
+		final JDialog dlg = createPleaseWaitDialog("Uploading data");
+		new Thread(){
+			@Override
+			public void run() {
+				try {
+					server.uploadOsm(all);
+				} catch (JDOMException x) {
+					dlg.setVisible(false);
+					x.printStackTrace();
+					JOptionPane.showMessageDialog(Main.main, x.getMessage());
+				} finally {
+					dlg.setVisible(false);
+				}
+			}
+		}.start();
+		
+		dlg.setVisible(true);
+		
+		// finished without errors -> clean dataset
+		Main.main.getMapFrame().mapView.editLayer().cleanData();
 	}
 	
Index: src/org/openstreetmap/josm/data/Preferences.java
===================================================================
--- src/org/openstreetmap/josm/data/Preferences.java	(revision 42)
+++ src/org/openstreetmap/josm/data/Preferences.java	(revision 43)
@@ -21,5 +21,4 @@
 import org.openstreetmap.josm.data.projection.Mercator;
 import org.openstreetmap.josm.data.projection.Projection;
-import org.openstreetmap.josm.data.projection.UTM;
 
 
@@ -39,5 +38,5 @@
 	 * The convertor used to translate lat/lon points to screen points.
 	 */
-	private Projection projection = new UTM();
+	private Projection projection = new Epsg4263();
 
 
@@ -78,7 +77,6 @@
 	 */
 	public static final Projection[] allProjections = new Projection[]{
-		new Mercator(),
-		new UTM(),
-		new Epsg4263()
+		new Epsg4263(),
+		new Mercator()
 	};
 
@@ -124,5 +122,5 @@
 			// projection
 			Class<?> projectionClass = Class.forName(root.getChildText("projection"));
-			projection = allProjections[0]; // defaults to UTM
+			projection = allProjections[0];
 			for (Projection p : allProjections) {
 				if (p.getClass() == projectionClass) {
Index: src/org/openstreetmap/josm/data/projection/Epsg4263.java
===================================================================
--- src/org/openstreetmap/josm/data/projection/Epsg4263.java	(revision 42)
+++ src/org/openstreetmap/josm/data/projection/Epsg4263.java	(revision 43)
@@ -1,5 +1,3 @@
 package org.openstreetmap.josm.data.projection;
-
-import javax.swing.JComponent;
 
 import org.openstreetmap.josm.data.GeoPoint;
@@ -10,7 +8,6 @@
  * @author imi
  */
-public class Epsg4263 extends Projection {
+public class Epsg4263 implements Projection {
 
-	@Override
 	public void latlon2xy(GeoPoint p) {
 		p.x = p.lon;
@@ -18,5 +15,4 @@
 	}
 
-	@Override
 	public void xy2latlon(GeoPoint p) {
 		p.lat = p.y;
@@ -28,12 +24,3 @@
 		return "EPSG:4263";
 	}
-
-	@Override
-	public JComponent getConfigurationPanel() {
-		return null;
-	}
-
-	@Override
-	public void commitConfigurationPanel() {
-	}
 }
Index: src/org/openstreetmap/josm/data/projection/Mercator.java
===================================================================
--- src/org/openstreetmap/josm/data/projection/Mercator.java	(revision 42)
+++ src/org/openstreetmap/josm/data/projection/Mercator.java	(revision 43)
@@ -1,5 +1,3 @@
 package org.openstreetmap.josm.data.projection;
-
-import javax.swing.JComponent;
 
 import org.openstreetmap.josm.data.GeoPoint;
@@ -14,7 +12,6 @@
  * @author imi
  */
-public class Mercator extends Projection {
+public class Mercator implements Projection {
 
-	@Override
 	public void latlon2xy(GeoPoint p) {
 		p.x = p.lon*Math.PI/180;
@@ -22,5 +19,4 @@
 	}
 
-	@Override
 	public void xy2latlon(GeoPoint p) {
 		p.lon = p.x*180/Math.PI;
@@ -32,12 +28,3 @@
 		return "Mercator";
 	}
-
-	@Override
-	public JComponent getConfigurationPanel() {
-		return null;
-	}
-
-	@Override
-	public void commitConfigurationPanel() {
-	}
 }
Index: src/org/openstreetmap/josm/data/projection/Projection.java
===================================================================
--- src/org/openstreetmap/josm/data/projection/Projection.java	(revision 42)
+++ src/org/openstreetmap/josm/data/projection/Projection.java	(revision 43)
@@ -1,12 +1,4 @@
 package org.openstreetmap.josm.data.projection;
 
-import java.util.LinkedList;
-import java.util.List;
-
-import javax.swing.JComponent;
-import javax.swing.event.ChangeEvent;
-import javax.swing.event.ChangeListener;
-
-import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.GeoPoint;
 
@@ -17,13 +9,8 @@
  * @author imi
  */
-abstract public class Projection implements Cloneable {
+public interface Projection {
 
 	public static double MAX_LAT = 85;
 	public static double MAX_LON = 180;
-
-	/**
-	 * The event list with all state chaned listener
-	 */
-	List<ChangeListener> listener = new LinkedList<ChangeListener>();
 	
 	/**
@@ -32,5 +19,5 @@
 	 * @param p		The geo point to convert. x/y members of the point are filled.
 	 */
-	abstract public void latlon2xy(GeoPoint p);
+	void latlon2xy(GeoPoint p);
 	
 	/**
@@ -39,5 +26,5 @@
 	 * @param p		The geo point to convert. lat/lon members of the point are filled.
 	 */
-	abstract public void xy2latlon(GeoPoint p);
+	void xy2latlon(GeoPoint p);
 
 	
@@ -47,69 +34,4 @@
 	 * Describe the projection converter in one or two words.
 	 */
-	@Override
-	abstract public String toString();
-	
-	// miscellous functions
-	
-	/**
-	 * If the projection supports any configuration, this function return
-	 * the configuration panel. If no configuration needed, 
-	 * return <code>null</code>.
-	 * 
-	 * The items on the configuration panel should not update the configuration
-	 * directly, but remember changed settings so a call to commitConfigurationPanel
-	 * can set them.
-	 * 
-	 * This function also rolls back all changes to the configuration panel interna
-	 * components.
-	 */
-	abstract public JComponent getConfigurationPanel();
-	/**
-	 * Commits any changes from components created by addToConfigurationPanel.
-	 * The projection should now obtain the new settings. If any setting has
-	 * changed, the implementation have to call to fireStateChanged to inform
-	 * the listeners.
-	 */
-	abstract public void commitConfigurationPanel();
-
-	/**
-	 * Initialize itself with the given bounding rectangle (regarding lat/lon).
-	 * 
-	 * This function should initialize own parameters needed to do the
-	 * projection at best effort.
-	 * 
-	 * Init must not fire an state changed event, since it is usually called
-	 * during the initialization of the mapFrame.
-	 *
-	 * This implementation does nothing. It is provided only for subclasses
-	 * to initialize their data members.
-	 */
-	public void init(Bounds b) {}
-	
-	/**
-	 * Add an event listener to the state changed event queue. If passed 
-	 * <code>null</code>, nothing happens.
-	 */
-	public final void addChangeListener(ChangeListener l) {
-		if (l != null)
-			listener.add(l);
-	}
-	/**
-	 * Remove an event listener from the event queue. If passed 
-	 * <code>null</code>, nothing happens.
-	 */
-	public final void removeChangeListener(ChangeListener l) {
-		listener.remove(l);
-	}
-	/**
-	 * Fire an ChangeEvent to every listener on the queue.
-	 */
-	public final void fireStateChanged() {
-		ChangeEvent e = null;
-		for(ChangeListener l : listener) {
-			if (e == null)
-				e = new ChangeEvent(this);
-			l.stateChanged(e);
-		}
-	}
+	String toString();
 }
Index: src/org/openstreetmap/josm/data/projection/UTM.java
===================================================================
--- src/org/openstreetmap/josm/data/projection/UTM.java	(revision 42)
+++ 	(revision )
@@ -1,298 +1,0 @@
-package org.openstreetmap.josm.data.projection;
-
-import java.awt.Font;
-import java.awt.GridBagLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
-
-import javax.swing.JButton;
-import javax.swing.JComboBox;
-import javax.swing.JComponent;
-import javax.swing.JLabel;
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
-import javax.swing.JSpinner;
-import javax.swing.SpinnerNumberModel;
-
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.Bounds;
-import org.openstreetmap.josm.data.GeoPoint;
-import org.openstreetmap.josm.gui.GBC;
-
-/**
- * A java port of a ruby port of a C port of a Projection from the 
- * Defense Mapping agency. ;-)
- * 
- * The whole dataset is interpreted as beeing in one zone. This 
- * zone is initially taken from the center lat/lon value but can
- * be configured to any other zone. Same is for the hemisphere.
- * 
- * C code by Chuck Gantz
- * Ruby port by Ben Gimpert
- * modified Java port by imi (myself)
- *
- * @author imi
- */
-public class UTM extends Projection {
-
-	public final static double DEG_TO_RAD = Math.PI / 180;
-	public final static double RAD_TO_DEG = 180 / Math.PI;
-
-	public final static double k0 = 0.9996012717;
-	
-	/**
-	 * A reference ellipsoid used in Projections
-	 */
-	public static class Ellipsoid {
-		String name;
-		double a, ecc_squared;
-		Ellipsoid(String name, double a, double ecc_squared) {
-			this.name = name;
-			this.a = a;
-			this.ecc_squared = ecc_squared;
-		}
-		@Override
-		public String toString() {
-			return name;
-		}
-	}
-
-	/**
-	 * All available reference ellipsoids.
-	 */
-	public final static Ellipsoid[] allEllipsoids = new Ellipsoid[] {
-		new Ellipsoid("Airy", 6377563, 0.00667054),
-		new Ellipsoid("Australian National", 6378160, 0.006694542),
-		new Ellipsoid("Bessel 1841", 6377397, 0.006674372),
-		new Ellipsoid("Clarke 1866", 6378206, 0.006768658),
-		new Ellipsoid("Clarke 1880", 6378249, 0.006803511),
-		new Ellipsoid("Everest", 6377276, 0.006637847),
-		new Ellipsoid("Fischer Mercury 1960", 6378166, 0.006693422),
-		new Ellipsoid("Fischer 1968", 6378150, 0.006693422),
-		new Ellipsoid("GRS 1967", 6378160, 0.006694605),
-		new Ellipsoid("GRS 1980", 6378137, 0.00669438),
-		new Ellipsoid("Helmert 1906", 6378200, 0.006693422),
-		new Ellipsoid("Hough", 6378270, 0.00672267),
-		new Ellipsoid("Krassovsky", 6378245, 0.006693422),
-		new Ellipsoid("WGS-60", 6378165, 0.006693422),
-		new Ellipsoid("WGS-66", 6378145, 0.006694542),
-		new Ellipsoid("WGS-72", 6378135, 0.006694318),
-		new Ellipsoid("WGS-84", 6378137, 0.00669438)
-	};
-
-	private enum Hemisphere {north, south}
-
-	/**
-	 * What hemisphere the whole map is in.
-	 */
-	private Hemisphere hemisphere = Hemisphere.north;
-	/**
-	 * What zone the whole map is in.
-	 */
-	private int zone = 0; // 0 means not initialized
-	/**
-	 * Reference ellipsoid used in projection
-	 */
-	protected Ellipsoid ellipsoid = allEllipsoids[allEllipsoids.length-1];
-
-	/**
-	 * Combobox with all ellipsoids for the configuration panel
-	 */
-	private JComboBox ellipsoidCombo;
-	/**
-	 * Spinner with all possible zones for the configuration panel
-	 */
-	JSpinner zoneSpinner;
-	/**
-	 * Hemisphere combo for the configuration panel
-	 */
-	JComboBox hemisphereCombo;
-
-	
-	@Override
-	public void latlon2xy(GeoPoint p) {
-		// converts lat/long to UTM coords. Equations from USGS Bulletin 1532
-		// North latitudes are positive, South latitudes are negative
-		// East longitudes are positive, West longitudes are negative
-		// lat and long are in decimal degrees
-		// Written by Chuck Gantz- chuck.gantz@globalstar.com
-		// ported to Ruby by Ben Gimpert- ben@somethingmodern.com
-		double lat_rad = p.lat * DEG_TO_RAD;
-		double long_temp = (p.lon + 180) - (Math.floor((p.lon + 180) / 360) * 360) - 180;
-		double long_rad = long_temp * DEG_TO_RAD;
-		
-		double long_origin = (zone - 1)*6 - 180 + 3;  // +3 puts origin in middle of zone
-		double long_origin_rad = long_origin * DEG_TO_RAD;
-		
-		double ecc_prime_squared = ellipsoid.ecc_squared / (1 - ellipsoid.ecc_squared);
-		
-		double n = ellipsoid.a / Math.sqrt(1 - ellipsoid.ecc_squared * Math.sin(lat_rad) * Math.sin(lat_rad));
-		double t = Math.tan(lat_rad) * Math.tan(lat_rad);
-		double c = ecc_prime_squared * Math.cos(lat_rad) * Math.cos(lat_rad);
-		double a = Math.cos(lat_rad) * (long_rad - long_origin_rad);
-
-		double e2 = ellipsoid.ecc_squared*ellipsoid.ecc_squared;
-		double e3 = e2*ellipsoid.ecc_squared;
-		double m = ellipsoid.a * (((1 - ellipsoid.ecc_squared/4 - 3*e2/64 - 5*e3/256)*lat_rad) - ((3*ellipsoid.ecc_squared/8 + 3*e2/32 + 45*e3/1024)*Math.sin(2*lat_rad)) + ((15*e2/256 + 45*e3/1024)*Math.sin(4*lat_rad)) - ((35*e3/3072)*Math.sin(6*lat_rad)));
-
-		p.x = k0*n*(a+(1-t+c)*a*a*a/6 + (5-18*t+t*t+72*c-58*ecc_prime_squared)*a*a*a*a*a/120) + 500000.0;
-		p.y = k0*(m+n*Math.tan(lat_rad)*(a*a/2+(5-t+9*c+4*c*c)*a*a*a*a/24 + (61-58*t+t*t+600*c-330*ecc_prime_squared)*a*a*a*a*a*a/720));
-		if (p.lat < 0)
-			p.y += 10000000.0; // offset for southern hemisphere
-    }
-
-	@Override
-	public void xy2latlon(GeoPoint p) {
-		// converts UTM coords to lat/long.  Equations from USGS Bulletin 1532 
-		// East longitudes are positive, West longitudes are negative. 
-		// North latitudes are positive, South latitudes are negative
-		// lat and long are in decimal degrees. 
-		// Written by Chuck Gantz- chuck.gantz@globalstar.com
-		// ported to Ruby by Ben Gimpert- ben@somethingmodern.com
-		double e1 = (1-Math.sqrt(1-ellipsoid.ecc_squared))/(1+Math.sqrt(1-ellipsoid.ecc_squared));
-		double x = p.x - 500000.0;
-		double y = p.y;
-		if (hemisphere == Hemisphere.south)
-			y -= 10000000.0;
-		
-		double long_origin = (zone - 1)*6 - 180 + 3;  // +3 puts origin in middle of zone
-		double ecc_prime_squared = ellipsoid.ecc_squared / (1 - ellipsoid.ecc_squared);
-		double m = y / k0;
-		double mu = m / (ellipsoid.a*(1-ellipsoid.ecc_squared/4-3*ellipsoid.ecc_squared*ellipsoid.ecc_squared/64-5*ellipsoid.ecc_squared*ellipsoid.ecc_squared*ellipsoid.ecc_squared/256));
-		
-		double phi1_rad = mu + (3*e1/2-27*e1*e1*e1/32)*Math.sin(2*mu) + (21*e1*e1/16-55*e1*e1*e1*e1/32)*Math.sin(4*mu) +(151*e1*e1*e1/96)*Math.sin(6*mu);
-		
-		double n1 = ellipsoid.a/Math.sqrt(1-ellipsoid.ecc_squared*Math.sin(phi1_rad)*Math.sin(phi1_rad));
-		double t1 = Math.tan(phi1_rad)*Math.tan(phi1_rad);
-		double c1 = ecc_prime_squared*Math.cos(phi1_rad)*Math.cos(phi1_rad);
-		double r1 = ellipsoid.a*(1-ellipsoid.ecc_squared)/Math.pow((1-ellipsoid.ecc_squared*Math.sin(phi1_rad)*Math.sin(phi1_rad)), 1.5);
-		double d = x / (n1*k0);
-		
-		p.lat = phi1_rad - (n1*Math.tan(phi1_rad)/r1)*(d*d/2-(5+3*t1+10*c1-4*c1*c1-9*ecc_prime_squared)*d*d*d*d/24 + (61+90*t1+298*c1+45*t1*t1-252*ecc_prime_squared-3*c1*c1)*d*d*d*d*d*d/720);
-		p.lat = p.lat * RAD_TO_DEG;
-		
-		p.lon = (d-(1+2*t1+c1)*d*d*d/6+(5-2*c1+28*t1-3*c1*c1+8*ecc_prime_squared+24*t1*t1)*d*d*d*d*d/120)/Math.cos(phi1_rad);
-		p.lon = long_origin + (p.lon * RAD_TO_DEG);
-	}
-
-	@Override
-	public String toString() {
-		return "UTM";
-	}
-
-	/**
-	 * Helper class for the zone detection
-	 * @author imi
-	 */
-	private static class ZoneData {
-		int zone = 0;
-		Hemisphere hemisphere = Hemisphere.north;
-	}
-	/**
-	 * Try to autodetect the zone and hemisphere from the dataset.
-	 * @return The zone data extrakted from the dataset.
-	 */
-	ZoneData autoDetect(Bounds b) {
-		ZoneData zd = new ZoneData();
-		GeoPoint center = b.centerLatLon();
-		double lat = center.lat;
-		double lon = center.lon;
-		// make sure the longitude is between -180.00 .. 179.9
-		double long_temp = (lon + 180) - (Math.floor((lon + 180) / 360) * 360) - 180;
-		
-		zd.zone = (int)((long_temp + 180) / 6) + 1;
-		if ((lat >= 56.0) && (lat < 64.0) && (long_temp >= 3.0) && (long_temp < 12.0))
-			zd.zone = 32; 
-		// special zones for Svalbard
-		if ((lat >= 72.0) && (lat < 84.0))
-		{
-			if ((long_temp >= 0.0) && (long_temp < 9.0))
-				zd.zone = 31;
-			else if ((long_temp >= 9.0) && (long_temp < 21.0))
-				zd.zone = 33;
-			else if ((long_temp >= 21.0) && (long_temp < 33.0))
-				zd.zone = 35;
-			else if ((long_temp >= 33.0) && (long_temp < 42.0))
-				zd.zone = 37;
-		}
-		zd.hemisphere = lat > 0 ? Hemisphere.north : Hemisphere.south;
-		return zd;
-	}
-	
-	/**
-	 * If the zone is not already set, calculate it from this dataset. 
-	 * If the dataset span over more than one zone, take the middle one 
-	 * (the zone of the middle lat/lon).
-	 * Also, calculate the hemisphere (northern/southern).
-	 */
-	@Override
-	public void init(Bounds b) {
-		if (zone == 0) {
-			ZoneData zd = autoDetect(b);
-			zone = zd.zone;
-			hemisphere = zd.hemisphere;
-		}
-	}
-
-	@Override
-	public JComponent getConfigurationPanel() {
-		JPanel panel = new JPanel(new GridBagLayout());
-		GBC gbc = GBC.std().insets(0,0,5,0);
-		
-		// ellipsoid
-		if (ellipsoidCombo == null)
-			ellipsoidCombo = new JComboBox(allEllipsoids);
-		panel.add(new JLabel("Ellipsoid"), gbc);
-		panel.add(ellipsoidCombo, GBC.eol());
-		ellipsoidCombo.setSelectedItem(ellipsoid);
-		
-		// zone
-		if (zoneSpinner == null)
-			zoneSpinner = new JSpinner(new SpinnerNumberModel(1,1,60,1));
-		panel.add(new JLabel("Zone"), gbc);
-		panel.add(zoneSpinner, GBC.eol().insets(0,5,0,5));
-		if (zone != 0)
-			zoneSpinner.setValue(zone);
-		
-		// hemisphere
-		if (hemisphereCombo == null)
-			hemisphereCombo = new JComboBox(Hemisphere.values());
-		panel.add(new JLabel("Hemisphere"), gbc);
-		panel.add(hemisphereCombo, GBC.eop());
-		hemisphereCombo.setSelectedItem(hemisphere);
-
-		// Autodetect
-		JButton autoDetect = new JButton("Detect");
-		autoDetect.addActionListener(new ActionListener(){
-			public void actionPerformed(ActionEvent e) {
-				if (Main.main.getMapFrame() != null) {
-					ZoneData zd = autoDetect(Main.main.ds.getBoundsLatLon());
-					if (zd.zone == 0)
-						JOptionPane.showMessageDialog(Main.main, "Autodetection failed. Maybe the data set contain too few information.");
-					else {
-						zoneSpinner.setValue(zd.zone);
-						hemisphereCombo.setSelectedItem(zd.hemisphere);
-					}
-				} else {
-					JOptionPane.showMessageDialog(Main.main, "No data loaded. Please open a data set first.");
-				}
-			}
-		});
-		JLabel descLabel = new JLabel("Autodetect parameter based on loaded data");
-		descLabel.setFont(descLabel.getFont().deriveFont(Font.ITALIC));
-		panel.add(descLabel, GBC.eol().fill(GBC.HORIZONTAL));
-		panel.add(autoDetect, GBC.eol().anchor(GBC.CENTER));
-		
-		return panel;
-	}
-
-	@Override
-	public void commitConfigurationPanel() {
-		if (ellipsoidCombo != null && zoneSpinner != null && hemisphereCombo != null) {
-			ellipsoid = (Ellipsoid)ellipsoidCombo.getSelectedItem();
-			zone = (Integer)zoneSpinner.getValue();
-			hemisphere = (Hemisphere)hemisphereCombo.getSelectedItem();
-			fireStateChanged();
-		}
-	}
-}
Index: src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- src/org/openstreetmap/josm/gui/MapView.java	(revision 42)
+++ src/org/openstreetmap/josm/gui/MapView.java	(revision 43)
@@ -20,5 +20,4 @@
 import org.openstreetmap.josm.data.GeoPoint;
 import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.projection.Projection;
 import org.openstreetmap.josm.gui.layer.Layer;
@@ -97,8 +96,4 @@
 	 */
 	public void addLayer(Layer layer) {
-		// initialize the projection if it is the first layer
-		if (layers.isEmpty())
-			getProjection().init(layer.getBoundsLatLon());
-
 		// reinitialize layer's data
 		layer.init(getProjection());
@@ -339,6 +334,6 @@
 		// reset all datasets.
 		Projection p = getProjection();
-		for (Node n : Main.main.ds.nodes)
-			p.latlon2xy(n.coor);
+		for (Layer l : layers)
+			l.init(p);
 		recalculateCenterScale();
 	}
@@ -351,14 +346,6 @@
 	 */
 	public void propertyChange(PropertyChangeEvent evt) {
-		if (!evt.getPropertyName().equals("projection"))
-			return;
-		if (evt.getOldValue() != null)
-			((Projection)evt.getOldValue()).removeChangeListener(this);
-		if (evt.getNewValue() != null) {
-			Projection p = (Projection)evt.getNewValue();
-			p.addChangeListener(this);
-	
+		if (evt.getPropertyName().equals("projection"))
 			stateChanged(new ChangeEvent(this));
-		}
 	}
 }
Index: src/org/openstreetmap/josm/gui/PreferenceDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/PreferenceDialog.java	(revision 42)
+++ src/org/openstreetmap/josm/gui/PreferenceDialog.java	(revision 43)
@@ -15,5 +15,4 @@
 import javax.swing.JCheckBox;
 import javax.swing.JComboBox;
-import javax.swing.JComponent;
 import javax.swing.JDialog;
 import javax.swing.JLabel;
@@ -51,7 +50,5 @@
 		public void actionPerformed(ActionEvent e) {
 			Main.pref.laf = (LookAndFeelInfo)lafCombo.getSelectedItem();
-			Projection projection = (Projection)projectionCombo.getSelectedItem();
-			projection.commitConfigurationPanel();
-			Main.pref.setProjection(projection);
+			Main.pref.setProjection((Projection)projectionCombo.getSelectedItem());
 			Main.pref.osmDataServer = osmDataServer.getText();
 			Main.pref.osmDataUsername = osmDataUsername.getText();
@@ -99,5 +96,5 @@
 	 * Combobox with all projections available
 	 */
-	JComboBox projectionCombo = new JComboBox(Preferences.allProjections.clone());
+	JComboBox projectionCombo = new JComboBox(Preferences.allProjections);
 	/**
 	 * The main tab panel.
@@ -160,24 +157,4 @@
 			}
 		}
-		JButton projectionDetail = new JButton("Configure");
-		projectionDetail.addActionListener(new ActionListener(){
-			public void actionPerformed(ActionEvent e) {
-				Projection p = (Projection)projectionCombo.getSelectedItem();
-				JComponent configurationPanel = p.getConfigurationPanel();
-				if (configurationPanel == null) {
-					JOptionPane.showMessageDialog(PreferenceDialog.this,
-							"This projection does not need any configuration.");
-					return;
-				}
-				JPanel detail = new JPanel(new GridBagLayout());
-				detail.setLayout(new GridBagLayout());
-				detail.add(configurationPanel, GBC.eop().fill());
-				int result = JOptionPane.showConfirmDialog(
-						PreferenceDialog.this, detail, "Configuration of "+p, 
-						JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
-				if (result != JOptionPane.OK_OPTION)
-					p.getConfigurationPanel(); // rollback
-			}
-		});
 		
 		// drawRawGpsLines
@@ -242,7 +219,4 @@
 		map.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
 		map.add(projectionCombo, GBC.eol().fill(GBC.HORIZONTAL).insets(0,0,0,5));
-		map.add(new JLabel("Projection details:"), GBC.std());
-		map.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
-		map.add(projectionDetail, GBC.eop());
 		map.add(Box.createVerticalGlue(), GBC.eol().fill(GBC.VERTICAL));
 
Index: src/org/openstreetmap/josm/gui/WorldChooser.java
===================================================================
--- src/org/openstreetmap/josm/gui/WorldChooser.java	(revision 42)
+++ src/org/openstreetmap/josm/gui/WorldChooser.java	(revision 43)
@@ -13,5 +13,4 @@
 
 import javax.swing.ImageIcon;
-import javax.swing.JComponent;
 import javax.swing.JTextField;
 import javax.swing.SwingUtilities;
@@ -63,10 +62,8 @@
 		new MapMover(this);
 		projection = new Projection(){
-			@Override
 			public void latlon2xy(GeoPoint p) {
 				p.x = (p.lon+180) / 360 * world.getIconWidth();
 				p.y = (p.lat+90) / 180 * world.getIconHeight();
 			}
-			@Override
 			public void xy2latlon(GeoPoint p) {
 				p.lon = p.x*360/world.getIconWidth() - 180;
@@ -76,11 +73,4 @@
 			public String toString() {
 				return "WorldChooser";
-			}
-			@Override
-			public JComponent getConfigurationPanel() {
-				return null;
-			}
-			@Override
-			public void commitConfigurationPanel() {
 			}
 		};
Index: src/org/openstreetmap/josm/io/OsmServerWriter.java
===================================================================
--- src/org/openstreetmap/josm/io/OsmServerWriter.java	(revision 42)
+++ src/org/openstreetmap/josm/io/OsmServerWriter.java	(revision 43)
@@ -8,5 +8,7 @@
 import java.net.HttpURLConnection;
 import java.net.URL;
+import java.net.UnknownHostException;
 import java.util.Collection;
+import java.util.HashMap;
 
 import org.jdom.Document;
@@ -56,7 +58,7 @@
 	 * Upload a single node.
 	 */
-	@SuppressWarnings("unchecked")
 	public void visit(Node n) {
 		if (n.id == 0 && !n.isDeleted()) {
+			setCredits(n);
 			sendRequest("PUT", "newnode", n, true);
 		} else if (n.isDeleted()) {
@@ -67,6 +69,10 @@
 	}
 
+	/**
+	 * Upload a line segment (without the nodes).
+	 */
 	public void visit(LineSegment ls) {
 		if (ls.id == 0 && !ls.isDeleted()) {
+			setCredits(ls);
 			sendRequest("PUT", "newsegment", ls, true);
 		} else if (ls.isDeleted()) {
@@ -75,4 +81,15 @@
 			sendRequest("PUT", "segment/" + ls.id, ls, true);
 		}
+	}
+
+	/**
+	 * Add the created_by - property to indicate that JOSM was the
+	 * creating application.
+	 * @param osm The primitive to add the credits to
+	 */
+	private void setCredits(OsmPrimitive osm) {
+		if (osm.keys == null)
+			osm.keys = new HashMap<Key, String>();
+		osm.keys.put(Key.get("created_by"), "JOSM");
 	}
 
@@ -130,4 +147,6 @@
 				osm.id = readId(con.getInputStream());
 			con.disconnect();
+		} catch (UnknownHostException e) {
+			throw new RuntimeException("Unknown host: "+e.getMessage(), e);
 		} catch (Exception e) {
 			throw new RuntimeException(e.getMessage(), e);
