Index: /CONTRIBUTION
===================================================================
--- /CONTRIBUTION	(revision 40)
+++ /CONTRIBUTION	(revision 41)
@@ -1,3 +1,3 @@
-The XML Parser is JDOM 1.0 and came from www.jdom.org. 
+The XML Parser is JDOM 1.0 and comes from www.jdom.org. 
 It is licensed under "JDOM license", a modified Apache License
 with Aknowledgement removed.
@@ -14,3 +14,2 @@
 
 Imi.
-
Index: /README
===================================================================
--- /README	(revision 40)
+++ /README	(revision 41)
@@ -21,5 +21,5 @@
 To get Java under linux, I recommend downloading the environment 
 directly from Sun at http://java.sun.com. There is a linux 
-binary installer which you have to execute from a java console.
+binary installer which you have to execute from a console.
 
 However, if you run Debian or Ubuntu or any other dpkg-based
@@ -28,5 +28,5 @@
 (replace "stable" with your installation)
 
-http://ftp.debian-unofficial.org/debian/ stable non-free
+deb http://ftp.debian-unofficial.org/debian/ stable non-free
 
 The package is called sun-j2se5.0-jdk-binary.
@@ -39,7 +39,9 @@
 -------------
 
-Microsoft Windows people launch by double clicking on josm-beta.jar.
+Microsoft Windows people launch by double clicking on the jar file.
 If this does not help, open a command shell and type 
-"java -jar josm-beta.jar" in the directory that holds the file.
+"java -jar josm-latest.jar" in the directory that holds the file.
+(Please replace josm-latest.jar with the name of your jar file, if
+you don't used the latest version.)
 
 Under Linux open a shell, go to the file directory and type
@@ -56,13 +58,15 @@
 
 Download it directly from the subversion at 
-http://www.eigenheimstrasse.de/svn/josm.
+http://www.eigenheimstrasse.de/svn/josm. To use the command line
+subverion client, type
+
+svn co http://www.eigenheimstrasse.de/svn/josm
 
 
 
-And gimme feedback: immanuel.scholz@gmx.de (start your mail subject 
+And gimme feedback: josm@eigenheimstrasse.de (start your mail subject 
 with "JOSM", so my spam filter will not eat you)
 
-Have fun.
 
 
-Imi.
+Ciao, Imi.
Index: /src/org/openstreetmap/josm/actions/DownloadAction.java
===================================================================
--- /src/org/openstreetmap/josm/actions/DownloadAction.java	(revision 40)
+++ /src/org/openstreetmap/josm/actions/DownloadAction.java	(revision 41)
@@ -1,4 +1,5 @@
 package org.openstreetmap.josm.actions;
 
+import java.awt.Dimension;
 import java.awt.GridBagLayout;
 import java.awt.GridLayout;
@@ -30,4 +31,5 @@
 import org.openstreetmap.josm.gui.MapFrame;
 import org.openstreetmap.josm.gui.MapView;
+import org.openstreetmap.josm.gui.WorldChooser;
 import org.openstreetmap.josm.gui.BookmarkList.Bookmark;
 import org.openstreetmap.josm.gui.layer.Layer;
@@ -60,6 +62,9 @@
 	public void actionPerformed(ActionEvent e) {
 		JPanel dlg = new JPanel(new GridBagLayout());
+		
+		WorldChooser wc = new WorldChooser();
+		dlg.add(wc, GBC.eop());
+
 		dlg.add(new JLabel("Bounding box"), GBC.eol());
-
 		dlg.add(new JLabel("min lat"), GBC.std().insets(10,0,5,0));
 		dlg.add(latlon[0], GBC.std());
@@ -139,4 +144,7 @@
 		dlg.add(buttons, GBC.eop().fill(GBC.HORIZONTAL));
 		
+		Dimension d = dlg.getPreferredSize();
+		wc.setPreferredSize(new Dimension(d.width, d.width/2));
+		
 		int r = JOptionPane.showConfirmDialog(Main.main, dlg, "Choose an area", 
 				JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
Index: /src/org/openstreetmap/josm/data/GeoPoint.java
===================================================================
--- /src/org/openstreetmap/josm/data/GeoPoint.java	(revision 40)
+++ /src/org/openstreetmap/josm/data/GeoPoint.java	(revision 41)
@@ -35,4 +35,14 @@
 		this.lat = lat;
 		this.lon = lon;
+	}
+
+	/**
+	 * Construct the point with all values available.
+	 */
+	public GeoPoint(double lat, double lon, double x, double y) {
+		this.lat = lat;
+		this.lon = lon;
+		this.x = x;
+		this.y = y;
 	}
 
Index: /src/org/openstreetmap/josm/data/Preferences.java
===================================================================
--- /src/org/openstreetmap/josm/data/Preferences.java	(revision 40)
+++ /src/org/openstreetmap/josm/data/Preferences.java	(revision 41)
@@ -55,5 +55,5 @@
 	 * Base URL to the osm data server
 	 */
-	public String osmDataServer = "http://www.openstreetmap.org/api/0.1";
+	public String osmDataServer = "http://www.openstreetmap.org/api/0.2";
 	/**
 	 * The username to the osm server
Index: /src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java
===================================================================
--- /src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java	(revision 40)
+++ /src/org/openstreetmap/josm/data/osm/visitor/SimplePaintVisitor.java	(revision 41)
@@ -9,5 +9,5 @@
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.Track;
-import org.openstreetmap.josm.gui.MapView;
+import org.openstreetmap.josm.gui.NavigatableComponent;
 
 /**
@@ -29,5 +29,5 @@
 	 * MapView to get screen coordinates.
 	 */
-	private final MapView mv;
+	private final NavigatableComponent nc;
 	
 	/**
@@ -36,7 +36,7 @@
 	 * @param mv  The view to get screen coordinates from.
 	 */
-	public SimplePaintVisitor(Graphics g, MapView mv) {
+	public SimplePaintVisitor(Graphics g, NavigatableComponent mv) {
 		this.g = g;
-		this.mv = mv;
+		this.nc = mv;
 	}
 	
@@ -83,5 +83,5 @@
 	 */
 	private void drawNode(Node n, Color color) {
-		Point p = mv.getScreenPoint(n.coor);
+		Point p = nc.getScreenPoint(n.coor);
 		g.setColor(color);
 		g.drawRect(p.x-1, p.y-1, 2, 2);
@@ -95,6 +95,6 @@
 			col = Color.WHITE;
 		g.setColor(col);
-		Point p1 = mv.getScreenPoint(ls.start.coor);
-		Point p2 = mv.getScreenPoint(ls.end.coor);
+		Point p1 = nc.getScreenPoint(ls.start.coor);
+		Point p2 = nc.getScreenPoint(ls.end.coor);
 		g.drawLine(p1.x, p1.y, p2.x, p2.y);
 	}
Index: /src/org/openstreetmap/josm/data/projection/Projection.java
===================================================================
--- /src/org/openstreetmap/josm/data/projection/Projection.java	(revision 40)
+++ /src/org/openstreetmap/josm/data/projection/Projection.java	(revision 41)
@@ -19,6 +19,6 @@
 abstract public class Projection implements Cloneable {
 
-	public static double MAX_LAT = 85; // yep - JOSM cannot cartograph the poles.
-	public static double MAX_LON = 179.99999;
+	public static double MAX_LAT = 85;
+	public static double MAX_LON = 180;
 
 	/**
Index: /src/org/openstreetmap/josm/gui/BookmarkList.java
===================================================================
--- /src/org/openstreetmap/josm/gui/BookmarkList.java	(revision 40)
+++ /src/org/openstreetmap/josm/gui/BookmarkList.java	(revision 41)
@@ -44,5 +44,5 @@
 		setModel(new DefaultListModel());
 		load();
-		setVisibleRowCount(10);
+		setVisibleRowCount(7);
 		setCellRenderer(new DefaultListCellRenderer(){
 			@Override
Index: /src/org/openstreetmap/josm/gui/ImageProvider.java
===================================================================
--- /src/org/openstreetmap/josm/gui/ImageProvider.java	(revision 40)
+++ /src/org/openstreetmap/josm/gui/ImageProvider.java	(revision 41)
@@ -30,5 +30,5 @@
 	 * The icon cache
 	 */
-	private static Map<URL, Icon> cache = new HashMap<URL, Icon>();
+	private static Map<URL, ImageIcon> cache = new HashMap<URL, ImageIcon>();
 	
 	/**
@@ -39,11 +39,11 @@
 	 * @return	The requested ImageIcon.
 	 */
-	public static Icon get(String subdir, String name) {
+	public static ImageIcon get(String subdir, String name) {
 		if (subdir != "")
 			subdir += "/";
 		URL path = Main.class.getResource("/images/"+subdir+name+".png");
-		Icon icon = cache.get(path);
+		ImageIcon icon = cache.get(path);
 		if (icon == null) {
-			icon = new ImageIcon(Main.class.getResource("/images/"+subdir+name+".png"));
+			icon = new ImageIcon(path);
 			cache.put(path, icon);
 		}
@@ -54,5 +54,5 @@
 	 * Shortcut for get("", name);
 	 */
-	public static Icon get(String name) {
+	public static ImageIcon get(String name) {
 		return get("", name);
 	}
Index: /src/org/openstreetmap/josm/gui/MapMover.java
===================================================================
--- /src/org/openstreetmap/josm/gui/MapMover.java	(revision 40)
+++ /src/org/openstreetmap/josm/gui/MapMover.java	(revision 41)
@@ -26,5 +26,5 @@
 	 * The map to move around.
 	 */
-	private final MapView mv;
+	private final NavigatableComponent nc;
 	/**
 	 * The old cursor when we changed it to movement cursor.
@@ -36,9 +36,9 @@
 	 * @param mapView The map that should be moved.
 	 */
-	public MapMover(MapView mapView) {
-		this.mv = mapView;
-		mv.addMouseListener(this);
-		mv.addMouseMotionListener(this);
-		mv.addMouseWheelListener(this);
+	public MapMover(NavigatableComponent mapView) {
+		this.nc = mapView;
+		nc.addMouseListener(this);
+		nc.addMouseMotionListener(this);
+		nc.addMouseWheelListener(this);
 	}
 	
@@ -51,10 +51,10 @@
 			if (mousePosMove == null)
 				startMovement(e);
-			GeoPoint center = mv.getCenter();
-			GeoPoint mouseCenter = mv.getPoint(e.getX(), e.getY(), false);
+			GeoPoint center = nc.getCenter();
+			GeoPoint mouseCenter = nc.getPoint(e.getX(), e.getY(), false);
 			GeoPoint p = new GeoPoint();
 			p.x = mousePosMove.x + center.x - mouseCenter.x;  
 			p.y = mousePosMove.y + center.y - mouseCenter.y;
-			mv.zoomTo(p, mv.getScale());
+			nc.zoomTo(p, nc.getScale());
 		} else
 			endMovement();
@@ -86,7 +86,7 @@
 	 */
 	private void startMovement(MouseEvent e) {
-		mousePosMove = mv.getPoint(e.getX(), e.getY(), false);
-		oldCursor = mv.getCursor();
-		mv.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
+		mousePosMove = nc.getPoint(e.getX(), e.getY(), false);
+		oldCursor = nc.getCursor();
+		nc.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR));
 	}
 	
@@ -96,7 +96,7 @@
 	private void endMovement() {
 		if (oldCursor != null)
-			mv.setCursor(oldCursor);
+			nc.setCursor(oldCursor);
 		else
-			mv.setCursor(Cursor.getDefaultCursor());
+			nc.setCursor(Cursor.getDefaultCursor());
 		mousePosMove = null;
 		oldCursor = null;
@@ -109,5 +109,5 @@
 	public void mouseWheelMoved(MouseWheelEvent e) {
 		double zoom = Math.max(0.1, 1 + e.getWheelRotation()/5.0);
-		mv.zoomTo(mv.getCenter(), mv.getScale()*zoom);
+		nc.zoomTo(nc.getCenter(), nc.getScale()*zoom);
 	}
 
Index: /src/org/openstreetmap/josm/gui/MapView.java
===================================================================
--- /src/org/openstreetmap/josm/gui/MapView.java	(revision 40)
+++ /src/org/openstreetmap/josm/gui/MapView.java	(revision 41)
@@ -14,5 +14,4 @@
 import java.util.LinkedList;
 
-import javax.swing.JComponent;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
@@ -43,5 +42,5 @@
  * @author imi
  */
-public class MapView extends JComponent implements ChangeListener, PropertyChangeListener {
+public class MapView extends NavigatableComponent implements ChangeListener, PropertyChangeListener  {
 
 	/**
@@ -59,13 +58,4 @@
 	 */
 	boolean autoScale = true;
-
-	/**
-	 * The scale factor in meter per pixel.
-	 */
-	private double scale;
-	/**
-	 * Center n/e coordinate of the desired screen center.
-	 */
-	private GeoPoint center;
 
 	/**
@@ -169,49 +159,4 @@
 		else
 			layers.add(pos, layer);
-	}
-
-	/**
-	 * Get geographic coordinates from a specific pixel coordination
-	 * on the screen.
-	 * 
-	 * If you don't need it, provide false at third parameter to speed
-	 * up the calculation.
-	 *  
-	 * @param x X-Pixelposition to get coordinate from
-	 * @param y Y-Pixelposition to get coordinate from
-	 * @param latlon If set, the return value will also have the 
-	 * 				 latitude/longitude filled.
-	 * 
-	 * @return The geographic coordinate, filled with x/y (northing/easting)
-	 * 		settings and, if requested with latitude/longitude.
-	 */
-	public GeoPoint getPoint(int x, int y, boolean latlon) {
-		GeoPoint p = new GeoPoint();
-		p.x = (x - getWidth()/2.0)*scale + center.x;
-		p.y = (getHeight()/2.0 - y)*scale + center.y;
-		if (latlon)
-			Main.pref.getProjection().xy2latlon(p);
-		return p;
-	}
-	
-	/**
-	 * Return the point on the screen where this GeoPoint would be.
-	 * @param point The point, where this geopoint would be drawn.
-	 * @return The point on screen where "point" would be drawn, relative
-	 * 		to the own top/left.
-	 */
-	public Point getScreenPoint(GeoPoint point) {
-		GeoPoint p;
-		if (!Double.isNaN(point.x) && !Double.isNaN(point.y))
-			p = point;
-		else {
-			if (Double.isNaN(point.lat) || Double.isNaN(point.lon))
-				throw new IllegalArgumentException("point: Either lat/lon or x/y must be set.");
-			p = point.clone();
-			Main.pref.getProjection().latlon2xy(p);
-		}
-		int x = ((int)Math.round((p.x-center.x) / scale + getWidth()/2));
-		int y = ((int)Math.round((center.y-p.y) / scale + getHeight()/2));
-		return new Point(x,y);
 	}
 
@@ -358,28 +303,4 @@
 	
 	/**
-	 * Zoom to the given coordinate.
-	 * @param centerX The center x-value (easting) to zoom to.
-	 * @param centerY The center y-value (northing) to zoom to.
-	 * @param scale The scale to use.
-	 */
-	public void zoomTo(GeoPoint newCenter, double scale) {
-		boolean oldAutoScale = autoScale;
-		GeoPoint oldCenter = center;
-		double oldScale = this.scale;
-		
-		autoScale = false;
-		center = newCenter.clone();
-		Main.pref.getProjection().xy2latlon(center);
-		this.scale = scale;
-		recalculateCenterScale();
-
-		firePropertyChange("center", oldCenter, center);
-		if (oldAutoScale != autoScale)
-			firePropertyChange("autoScale", oldAutoScale, autoScale);
-		if (oldScale != scale)
-			firePropertyChange("scale", oldScale, scale);
-	}
-
-	/**
 	 * Draw the component.
 	 */
@@ -394,7 +315,7 @@
 				l.paint(g, this);
 		}
-		
+
 		// draw world borders
-		g.setColor(Color.DARK_GRAY);
+		g.setColor(Color.WHITE);
 		Bounds b = new Bounds();
 		Point min = getScreenPoint(b.min);
@@ -404,25 +325,6 @@
 		int x2 = Math.max(min.x, max.x);
 		int y2 = Math.max(min.y, max.y);
-		g.drawRect(x1, y1, x2-x1+1, y2-y1+1);
-	}
-
-	/**
-	 * Notify from the projection, that something has changed.
-	 * @param e
-	 */
-	public void stateChanged(ChangeEvent e) {
-		// reset all datasets.
-		Projection p = Main.pref.getProjection();
-		for (Node n : Main.main.ds.nodes)
-			p.latlon2xy(n.coor);
-		recalculateCenterScale();
-	}
-
-	/**
-	 * Return the current scale value.
-	 * @return The scale value currently used in display
-	 */
-	public double getScale() {
-		return scale;
+		if (x1 > 0 || y1 > 0 || x2 < getWidth() || y2 < getHeight())
+			g.drawRect(x1, y1, x2-x1+1, y2-y1+1);
 	}
 
@@ -444,32 +346,4 @@
 		}
 	}
-	/**
-	 * @return Returns the center point. A copy is returned, so users cannot
-	 * 		change the center by accessing the return value. Use zoomTo instead.
-	 */
-	public GeoPoint getCenter() {
-		return center.clone();
-	}
-
-	
-	/**
-	 * Change to the new projection. Recalculate the dataset and zoom, if autoZoom
-	 * is active.
-	 * @param oldProjection The old projection. Unregister from this.
-	 * @param newProjection	The new projection. Register as state change listener.
-	 */
-	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);
-
-			stateChanged(new ChangeEvent(this));
-		}
-	}
-	
 	/**
 	 * Set the new dimension to the projection class. Also adjust the components 
@@ -581,3 +455,55 @@
 		return editLayer;
 	}
+
+	/**
+	 * In addition to the base class funcitonality, this keep trak of the autoscale
+	 * feature.
+	 */
+	@Override
+	public void zoomTo(GeoPoint newCenter, double scale) {
+		boolean oldAutoScale = autoScale;
+		GeoPoint oldCenter = center;
+		double oldScale = this.scale;
+		autoScale = false;
+
+		super.zoomTo(newCenter, scale);
+		
+		recalculateCenterScale();
+		
+		firePropertyChange("center", oldCenter, center);
+		if (oldAutoScale != autoScale)
+			firePropertyChange("autoScale", oldAutoScale, autoScale);
+		if (oldScale != scale)
+			firePropertyChange("scale", oldScale, scale);
+	}
+
+	/**
+	 * Notify from the projection, that something has changed.
+	 */
+	public void stateChanged(ChangeEvent e) {
+		// reset all datasets.
+		Projection p = Main.pref.getProjection();
+		for (Node n : Main.main.ds.nodes)
+			p.latlon2xy(n.coor);
+		recalculateCenterScale();
+	}
+
+	/**
+	 * Change to the new projection. Recalculate the dataset and zoom, if autoZoom
+	 * is active.
+	 * @param oldProjection The old projection. Unregister from this.
+	 * @param newProjection	The new projection. Register as state change listener.
+	 */
+	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);
+	
+			stateChanged(new ChangeEvent(this));
+		}
+	}
 }
Index: /src/org/openstreetmap/josm/gui/NavigatableComponent.java
===================================================================
--- /src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 41)
+++ /src/org/openstreetmap/josm/gui/NavigatableComponent.java	(revision 41)
@@ -0,0 +1,101 @@
+package org.openstreetmap.josm.gui;
+
+import java.awt.Point;
+
+import javax.swing.JComponent;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.GeoPoint;
+
+/**
+ * An component that can be navigated by a mapmover. Used as map view and for the
+ * zoomer in the download dialog.
+ * 
+ * @author imi
+ */
+public class NavigatableComponent extends JComponent {
+
+	/**
+	 * The scale factor in meter per pixel.
+	 */
+	protected double scale;
+	/**
+	 * Center n/e coordinate of the desired screen center.
+	 */
+	protected GeoPoint center;
+
+	/**
+	 * Return the current scale value.
+	 * @return The scale value currently used in display
+	 */
+	public double getScale() {
+		return scale;
+	}
+
+	/**
+	 * @return Returns the center point. A copy is returned, so users cannot
+	 * 		change the center by accessing the return value. Use zoomTo instead.
+	 */
+	public GeoPoint getCenter() {
+		return center.clone();
+	}
+
+	/**
+	 * Get geographic coordinates from a specific pixel coordination
+	 * on the screen.
+	 * 
+	 * If you don't need it, provide false at third parameter to speed
+	 * up the calculation.
+	 *  
+	 * @param x X-Pixelposition to get coordinate from
+	 * @param y Y-Pixelposition to get coordinate from
+	 * @param latlon If set, the return value will also have the 
+	 * 				 latitude/longitude filled.
+	 * 
+	 * @return The geographic coordinate, filled with x/y (northing/easting)
+	 * 		settings and, if requested with latitude/longitude.
+	 */
+	public GeoPoint getPoint(int x, int y, boolean latlon) {
+		GeoPoint p = new GeoPoint();
+		p.x = (x - getWidth()/2.0)*scale + center.x;
+		p.y = (getHeight()/2.0 - y)*scale + center.y;
+		if (latlon)
+			Main.pref.getProjection().xy2latlon(p);
+		return p;
+	}
+
+	/**
+	 * Return the point on the screen where this GeoPoint would be.
+	 * @param point The point, where this geopoint would be drawn.
+	 * @return The point on screen where "point" would be drawn, relative
+	 * 		to the own top/left.
+	 */
+	public Point getScreenPoint(GeoPoint point) {
+		GeoPoint p;
+		if (!Double.isNaN(point.x) && !Double.isNaN(point.y))
+			p = point;
+		else {
+			if (Double.isNaN(point.lat) || Double.isNaN(point.lon))
+				throw new IllegalArgumentException("point: Either lat/lon or x/y must be set.");
+			p = point.clone();
+			Main.pref.getProjection().latlon2xy(p);
+		}
+		int x = ((int)Math.round((p.x-center.x) / scale + getWidth()/2));
+		int y = ((int)Math.round((center.y-p.y) / scale + getHeight()/2));
+		return new Point(x,y);
+	}
+
+	/**
+	 * Zoom to the given coordinate.
+	 * @param centerX The center x-value (easting) to zoom to.
+	 * @param centerY The center y-value (northing) to zoom to.
+	 * @param scale The scale to use.
+	 */
+	public void zoomTo(GeoPoint newCenter, double scale) {
+		System.out.println(scale);
+		center = newCenter.clone();
+		Main.pref.getProjection().xy2latlon(center);
+		this.scale = scale;
+		repaint();
+	}
+}
Index: /src/org/openstreetmap/josm/gui/WorldChooser.java
===================================================================
--- /src/org/openstreetmap/josm/gui/WorldChooser.java	(revision 41)
+++ /src/org/openstreetmap/josm/gui/WorldChooser.java	(revision 41)
@@ -0,0 +1,99 @@
+package org.openstreetmap.josm.gui;
+
+import java.awt.Color;
+import java.awt.Dimension;
+import java.awt.Graphics;
+import java.net.URL;
+
+import javax.swing.ImageIcon;
+import javax.swing.event.ListSelectionEvent;
+import javax.swing.event.ListSelectionListener;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.GeoPoint;
+import org.openstreetmap.josm.gui.BookmarkList.Bookmark;
+
+/**
+ * A component that let the user select a lat/lon bounding box from zooming
+ * into the world as a picture and selecting a region.
+ *
+ * The component has to be of the aspect ration 2:1 to look good.
+ *
+ * @author imi
+ */
+public class WorldChooser extends NavigatableComponent {
+
+	/**
+	 * The world as picture.
+	 */
+	private ImageIcon world;
+
+	/**
+	 * Mark this rectangle (lat/lon values) when painting.
+	 */
+	protected double[] markerRect;
+
+	/**
+	 * Create the chooser component.
+	 */
+	public WorldChooser() {
+		URL path = Main.class.getResource("/images/world.jpg");
+		world = new ImageIcon(path);
+		center = new GeoPoint(0,0,30,165);
+		setPreferredSize(new Dimension(200, 100));
+		//new MapMover(this);
+	}
+
+
+	/**
+	 * Set the scale as well as the preferred size.
+	 */
+	@Override
+	public void setPreferredSize(Dimension preferredSize) {
+		super.setPreferredSize(preferredSize);
+		scale = 60/preferredSize.getWidth();
+	}
+
+
+	/**
+	 * Draw the current selected region.
+	 */
+	@Override
+	public void paint(Graphics g) {
+		int x1 = getScreenPoint(new GeoPoint(0,0,0,180)).x;
+		int y1 = getScreenPoint(new GeoPoint(0,0,0,180)).y;
+		int x2 = getScreenPoint(new GeoPoint(0,0,360,0)).x;
+		int y2 = getScreenPoint(new GeoPoint(0,0,360,0)).y;
+		System.out.println(x1+" "+y1+" "+x2+" "+y2);
+		System.out.println(center.x+" "+center.y+" "+(scale*getWidth()));
+		g.drawImage(world.getImage(),0,0,getWidth(),getHeight(),x1,y1,x2,y2, null);
+		g.setColor(Color.WHITE);
+		
+		// draw marker rect
+		//TODO
+	}
+
+
+	@Override
+	public void zoomTo(GeoPoint newCenter, double scale) {
+		if (getWidth() != 0 && scale < 60.0/getWidth())
+			scale = 60.0/getWidth();
+		super.zoomTo(newCenter, scale);
+	}
+	
+	/**
+	 * Show the selection bookmark in the world.
+	 */
+	public void addListMarker(final BookmarkList list) {
+		list.addListSelectionListener(new ListSelectionListener(){
+			public void valueChanged(ListSelectionEvent e) {
+				Bookmark b = (Bookmark)list.getSelectedValue();
+				if (b != null)
+					markerRect = b.latlon;
+				else
+					markerRect = null;
+				repaint();
+			}
+		});
+	}
+}
Index: /src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
===================================================================
--- /src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 40)
+++ /src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 41)
@@ -2,4 +2,6 @@
 
 import java.awt.Graphics;
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
 import java.util.Collection;
 import java.util.Iterator;
@@ -54,4 +56,11 @@
 		super(name);
 		this.data = data;
+		Main.pref.addPropertyChangeListener(new PropertyChangeListener() {
+			public void propertyChange(PropertyChangeEvent evt) {
+				if (evt.getPropertyName().equals("projection"))
+					for (Node n : OsmDataLayer.this.data.nodes)
+						((Projection)evt.getNewValue()).latlon2xy(n.coor);
+			}
+		});
 	}
 
Index: /src/org/openstreetmap/josm/io/OsmServerReader.java
===================================================================
--- /src/org/openstreetmap/josm/io/OsmServerReader.java	(revision 40)
+++ /src/org/openstreetmap/josm/io/OsmServerReader.java	(revision 41)
@@ -78,7 +78,5 @@
 	 */
 	public DataSet parseOsm() throws JDOMException, IOException {
-		long start = System.currentTimeMillis();
 		Reader r = getReader(Main.pref.osmDataServer+"/map?bbox="+lon1+","+lat1+","+lon2+","+lat2);
-		System.out.println(System.currentTimeMillis() - start);
 		if (r == null)
 			return null;
Index: /src/org/openstreetmap/josm/io/OsmServerWriter.java
===================================================================
--- /src/org/openstreetmap/josm/io/OsmServerWriter.java	(revision 40)
+++ /src/org/openstreetmap/josm/io/OsmServerWriter.java	(revision 41)
@@ -123,5 +123,4 @@
 				Document doc = new Document(root);
 				xmlOut.output(doc, out);
-				xmlOut.output(doc, System.out);
 				out.close();
 			}
