Index: trunk/src/org/openstreetmap/josm/data/coor/LatLon.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/coor/LatLon.java	(revision 1107)
+++ trunk/src/org/openstreetmap/josm/data/coor/LatLon.java	(revision 1108)
@@ -2,6 +2,11 @@
 package org.openstreetmap.josm.data.coor;
 
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.projection.Projection;
+
+import java.text.DecimalFormat;
 import java.text.NumberFormat;
 
@@ -15,28 +20,70 @@
 public class LatLon extends Coordinate {
 
-	public LatLon(double lat, double lon) {
-		super(lon, lat);
-	}
+    private static DecimalFormat cDmsMinuteFormatter = new DecimalFormat("00");
+    private static DecimalFormat cDmsSecondFormatter = new DecimalFormat("00.0");
+    private static DecimalFormat cDdFormatter = new DecimalFormat("###0.0000");
+    
+    /** 
+     * Possible ways to display coordinates 
+     */ 
+    public enum CoordinateFormat { 
+        DECIMAL_DEGREES {public String toString() {return tr("Decimal Degrees");}},  
+        DEGREES_MINUTES_SECONDS {public String toString() {return tr("Degrees Minutes Seconds");}}; 
+    } 
+    
+    public static String dms(double pCoordinate) { 
 
-	public double lat() {
-		return y;
-	}
+        double tAbsCoord = Math.abs(pCoordinate);
+        int tDegree = (int) tAbsCoord;
+        double tTmpMinutes = (tAbsCoord - tDegree) * 60;
+        int tMinutes = (int) tTmpMinutes;
+        double tSeconds = (tTmpMinutes - tMinutes) * 60;
 
-	public double lon() {
-		return x;
-	}
+        return tDegree + "\u00B0" + cDmsMinuteFormatter.format(tMinutes) + "\'" 
+            + cDmsSecondFormatter.format(tSeconds) + "\"";
+    } 
 
-	/**
-	 * @return <code>true</code> if the other point has almost the same lat/lon
-	 * values, only differing by no more than
-	 * 1 / {@link org.openstreetmap.josm.data.projection.Projection#MAX_SERVER_PRECISION MAX_SERVER_PRECISION}.
-	 */
-	public boolean equalsEpsilon(LatLon other) {
-		final double p = 1/Projection.MAX_SERVER_PRECISION;
-		return Math.abs(lat()-other.lat()) <= p && Math.abs(lon()-other.lon()) <= p;
-	}
+    public LatLon(double lat, double lon) {
+        super(lon, lat);
+    }
 
-	/**
-	 * @return <code>true</code>, if the coordinate is outside the world, compared
+    public double lat() {
+        return y;
+    }
+    
+    public String latToString(CoordinateFormat d) {
+        switch(d) {
+        case DECIMAL_DEGREES: return cDdFormatter.format(y);
+        case DEGREES_MINUTES_SECONDS: return dms(y) + ((y < 0) ? tr("S") : tr("N"));
+        default: return "ERR";
+        }
+    }
+    
+    public double lon() {
+        return x;
+    }
+    
+    public String lonToString(CoordinateFormat d) {
+        switch(d) {
+        case DECIMAL_DEGREES: return cDdFormatter.format(x);
+        case DEGREES_MINUTES_SECONDS: return dms(x) + ((x < 0) ? tr("W") : tr("E"));
+        default: return "ERR";
+        }
+    }
+    
+  
+
+    /**
+     * @return <code>true</code> if the other point has almost the same lat/lon
+     * values, only differing by no more than
+     * 1 / {@link org.openstreetmap.josm.data.projection.Projection#MAX_SERVER_PRECISION MAX_SERVER_PRECISION}.
+     */
+    public boolean equalsEpsilon(LatLon other) {
+        final double p = 1/Projection.MAX_SERVER_PRECISION;
+        return Math.abs(lat()-other.lat()) <= p && Math.abs(lon()-other.lon()) <= p;
+    }
+
+    /**
+     * @return <code>true</code>, if the coordinate is outside the world, compared
 	 * by using lat/lon.
 	 */
Index: trunk/src/org/openstreetmap/josm/data/osm/Node.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Node.java	(revision 1107)
+++ trunk/src/org/openstreetmap/josm/data/osm/Node.java	(revision 1108)
@@ -9,4 +9,5 @@
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.coor.EastNorth;
+import org.openstreetmap.josm.data.coor.LatLon.CoordinateFormat;
 import org.openstreetmap.josm.data.osm.visitor.Visitor;
 
@@ -21,4 +22,14 @@
 	public LatLon coor;
 	public volatile EastNorth eastNorth;
+    
+    private static CoordinateFormat mCord;
+    
+    static {
+        try {
+            mCord = LatLon.CoordinateFormat.valueOf(Main.pref.get("coordinates"));
+        } catch (IllegalArgumentException iae) {
+            mCord =LatLon.CoordinateFormat.DECIMAL_DEGREES;
+        }
+    }
 
 	/**
@@ -78,10 +89,8 @@
 			name = tr("incomplete");
 		} else {
-			NumberFormat latLonFormat = new DecimalFormat("###0.0000000");
-
 			name = get("name");
 			if (name == null)
 				name = id == 0 ? "" : ""+id;
-			name += " ("+latLonFormat.format(coor.lat())+", "+latLonFormat.format(coor.lon())+")";
+			name += " (" + coor.latToString(mCord) + ", " + coor.lonToString(mCord) + ")";
 		}
 		return name;
Index: trunk/src/org/openstreetmap/josm/gui/MapStatus.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapStatus.java	(revision 1107)
+++ trunk/src/org/openstreetmap/josm/gui/MapStatus.java	(revision 1108)
@@ -89,9 +89,10 @@
 	}
 
-    DecimalFormat latlon = new DecimalFormat("###0.0000");
-    ImageLabel lonText = new ImageLabel("lon", tr("The geographic longitude at the mouse pointer."), 8);
+	LatLon.CoordinateFormat mCord;
+
+    ImageLabel lonText = new ImageLabel("lon", tr("The geographic longitude at the mouse pointer."), 11);
     ImageLabel nameText = new ImageLabel("name", tr("The name of the object at the mouse pointer."), 20);
     JTextField helpText = new JTextField();
-    ImageLabel latText = new ImageLabel("lat", tr("The geographic latitude at the mouse pointer."), 7);
+    ImageLabel latText = new ImageLabel("lat", tr("The geographic latitude at the mouse pointer."), 10);
     ImageLabel angleText = new ImageLabel("angle", tr("The angle between the previous and the current way segment."), 6);
     ImageLabel headingText = new ImageLabel("heading", tr("The (compass) heading of the line segment being drawn."), 6);
@@ -254,5 +255,10 @@
 	public MapStatus(final MapFrame mapFrame) {
 		this.mv = mapFrame.mapView;
-
+		
+        try {
+            mCord = LatLon.CoordinateFormat.valueOf(Main.pref.get("coordinates"));
+        } catch (IllegalArgumentException iae) {
+            mCord =LatLon.CoordinateFormat.DECIMAL_DEGREES;
+        }
 		// Listen for mouse movements and set the position text field
 		mv.addMouseMotionListener(new MouseMotionListener(){
@@ -263,9 +269,9 @@
 				if (mv.center == null)
 					return;
-				// Do not update the view, if ctrl is pressed.
+				// Do not update the view if ctrl is pressed.
 				if ((e.getModifiersEx() & MouseEvent.CTRL_DOWN_MASK) == 0) {
 					LatLon p = mv.getLatLon(e.getX(),e.getY());
-					latText.setText(latlon.format(p.lat()));
-					lonText.setText(latlon.format(p.lon()));
+					latText.setText(p.latToString(mCord));
+					lonText.setText(p.lonToString(mCord));
 				}
 			}
Index: trunk/src/org/openstreetmap/josm/gui/preferences/ProjectionPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/ProjectionPreference.java	(revision 1107)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/ProjectionPreference.java	(revision 1108)
@@ -14,4 +14,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.projection.Projection;
+import org.openstreetmap.josm.data.coor.LatLon.CoordinateFormat;
 import org.openstreetmap.josm.tools.GBC;
 
@@ -22,13 +23,24 @@
 	 */
 	private JComboBox projectionCombo = new JComboBox(Projection.allProjections);
+	private JComboBox coordinatesCombo = new JComboBox(CoordinateFormat.values());
 
 	public void addGui(PreferenceDialog gui) {
-		for (int i = 0; i < projectionCombo.getItemCount(); ++i) {
-			if (projectionCombo.getItemAt(i).getClass().getName().equals(Main.pref.get("projection"))) {
-				projectionCombo.setSelectedIndex(i);
-				break;
-			}
-		}
+		
+	    for (int i = 0; i < projectionCombo.getItemCount(); ++i) {
+	        if (projectionCombo.getItemAt(i).getClass().getName().equals(Main.pref.get("projection"))) {
+	            projectionCombo.setSelectedIndex(i);
+	            break;
+	        }
+	    }
+
+	    for (int i = 0; i < coordinatesCombo.getItemCount(); ++i) {
+	        if (((CoordinateFormat)coordinatesCombo.getItemAt(i)).name().equals(Main.pref.get("coordinates"))) {
+	            coordinatesCombo.setSelectedIndex(i);
+	            break;
+	        }
+	    }
+
 		projectionCombo.addActionListener(gui.requireRestartAction);
+        coordinatesCombo.addActionListener(gui.requireRestartAction);
 		
 		JPanel projPanel = new JPanel();
@@ -38,4 +50,7 @@
 		projPanel.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
 		projPanel.add(projectionCombo, GBC.eop().fill(GBC.HORIZONTAL).insets(0,5,5,5));
+	    projPanel.add(new JLabel(tr("Display coordinates as")), GBC.std().insets(5,5,0,5));
+	    projPanel.add(GBC.glue(5,0), GBC.std().fill(GBC.HORIZONTAL));
+	    projPanel.add(coordinatesCombo, GBC.eop().fill(GBC.HORIZONTAL).insets(0,5,5,5));
 		gui.map.add(projPanel, GBC.eol().insets(0,0,0,10).fill(GBC.HORIZONTAL));
     }
@@ -43,4 +58,5 @@
 	public void ok() {
 		Main.pref.put("projection", projectionCombo.getSelectedItem().getClass().getName());
+		Main.pref.put("coordinates", ((CoordinateFormat)coordinatesCombo.getSelectedItem()).name());
     }
 }
