Index: trunk/src/org/openstreetmap/josm/actions/DownloadAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/DownloadAction.java	(revision 2333)
+++ trunk/src/org/openstreetmap/josm/actions/DownloadAction.java	(revision 2334)
@@ -5,13 +5,8 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import java.awt.BorderLayout;
-import java.awt.Dimension;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
 import java.util.concurrent.Future;
 import java.util.logging.Logger;
-
-import javax.swing.JOptionPane;
-import javax.swing.JPanel;
 
 import org.openstreetmap.josm.Main;
@@ -20,8 +15,6 @@
 import org.openstreetmap.josm.actions.downloadtasks.PostDownloadHandler;
 import org.openstreetmap.josm.data.Bounds;
-import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.download.DownloadDialog;
 import org.openstreetmap.josm.tools.Shortcut;
-import org.openstreetmap.josm.tools.WindowGeometry;
 
 /**
@@ -47,5 +40,5 @@
         if (! dialog.isCanceled()) {
             dialog.rememberSettings();
-            Bounds area = dialog.getSelectedDownloadArea();                
+            Bounds area = dialog.getSelectedDownloadArea();            
             if (dialog.isDownloadOsmData()) {
                 DownloadOsmTask task = new DownloadOsmTask();
Index: trunk/src/org/openstreetmap/josm/data/Preferences.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 2333)
+++ trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 2334)
@@ -60,22 +60,14 @@
      */
     public static class Bookmark implements Comparable<Bookmark> {
-        public String name;
-        public double[] latlon = new double[4]; // minlat, minlon, maxlat, maxlon
+        private String name;
+        private Bounds area;
         
-        public Bookmark() {           
+        public Bookmark() {    
+            area = null;
+            name = null;
         }
         
-        public Bookmark(Bounds b) {
-            if (b == null) {
-                latlon[0] = 0.0;
-                latlon[1] = 0.0;
-                latlon[2] = 0.0;
-                latlon[3] = 0.0;
-            } else {
-                latlon[0] = b.getMin().lat();
-                latlon[1] = b.getMin().lon();
-                latlon[2] = b.getMax().lat();
-                latlon[3] = b.getMax().lon();
-            }
+        public Bookmark(Bounds area) {
+            this.area = area;           
         }
         
@@ -88,6 +80,18 @@
         }
         
-        public Bounds asBounds() {
-            return new Bounds(latlon[0], latlon[1], latlon[2], latlon[3]);
+        public Bounds getArea() { 
+            return area;
+        }
+
+        public String getName() {
+            return name;
+        }
+
+        public void setName(String name) {
+            this.name = name;
+        }
+
+        public void setArea(Bounds area) {
+            this.area = area;
         }
     }
@@ -488,13 +492,21 @@
             // FIXME: legacy code using ',' sign, should be \u001e only
             Matcher m = Pattern.compile("^(.+)[,\u001e](-?\\d+.\\d+)[,\u001e](-?\\d+.\\d+)[,\u001e](-?\\d+.\\d+)[,\u001e](-?\\d+.\\d+)$").matcher(line);
-            if(m.matches())
-            {
-                Bookmark b = new Bookmark();
-                b.name = m.group(1);
-                for (int i = 0; i < b.latlon.length; ++i) {
-                    b.latlon[i] = Double.parseDouble(m.group(i+2));
+            if (!m.matches() || m.groupCount() != 5) {
+                System.err.println(tr("Error: Unexpected line ''{0}'' in bookmark file ''{1}''",line, bookmarkFile.toString()));
+                continue;
+            }
+            Bookmark b = new Bookmark();
+            b.setName(m.group(1));
+            double[] values= new double[4];
+            for (int i = 0; i < 4; ++i) {
+                try {
+                    values[i] = Double.parseDouble(m.group(i+2));
+                } catch(NumberFormatException e) {
+                    System.err.println(tr("Error: Illegal double value ''{0}'' on line ''{1}'' in bookmark file ''{2}''",m.group(i+2),line, bookmarkFile.toString()));
+                    continue;                    
                 }
-                bookmarks.add(b);
-            }
+            }
+            b.setArea(new Bounds(values));
+            bookmarks.add(b);
         }
         in.close();
@@ -511,8 +523,10 @@
                 new FileOutputStream(bookmarkFile), "utf-8"));
         for (Bookmark b : bookmarks) {
-            out.print(b.name+"\u001e");
-            for (int i = 0; i < b.latlon.length; ++i) {
-                out.print(b.latlon[i]+(i<b.latlon.length-1?"\u001e":""));
-            }
+            out.print(b.getName()+ "\u001e");
+            Bounds area = b.getArea();
+            out.print(area.getMin().lat() +"\u001e");
+            out.print(area.getMin().lon() +"\u001e");
+            out.print(area.getMax().lat() +"\u001e");
+            out.print(area.getMax().lon());
             out.println();
         }
Index: trunk/src/org/openstreetmap/josm/data/ServerSidePreferences.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/ServerSidePreferences.java	(revision 2333)
+++ trunk/src/org/openstreetmap/josm/data/ServerSidePreferences.java	(revision 2334)
@@ -25,4 +25,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.Preferences.Bookmark;
 import org.openstreetmap.josm.io.OsmConnection;
 import org.openstreetmap.josm.io.XmlWriter;
@@ -191,17 +192,22 @@
             for (String line = in.readLine(); line != null; line = in.readLine()) {
                 StringTokenizer st = new StringTokenizer(line, ",");
-                if (st.countTokens() < 5) {
+                if (st.countTokens() != 5) {
+                    System.err.println(tr("Error: Unexpected line ''{0}'' in bookmark list from server",line));
                     continue;
                 }
                 Bookmark b = new Bookmark();
-                b.name = st.nextToken();
-                try {
-                    for (int i = 0; i < b.latlon.length; ++i) {
-                        b.latlon[i] = Double.parseDouble(st.nextToken());
+                b.setName(st.nextToken());
+                double[] values= new double[4];
+                for (int i = 0; i < 4; ++i) {
+                    String token = st.nextToken();
+                    try {                        
+                        values[i] = Double.parseDouble(token);
+                    } catch(NumberFormatException e) {
+                        System.err.println(tr("Error: Illegal double value ''{0}'' on line ''{1}'' in bookmark list from server",token,line));
+                        continue;                    
                     }
-                    bookmarks.add(b);
-                } catch (NumberFormatException x) {
-                    // line not parsed
-                }
+                }
+                b.setArea(new Bounds(values));
+                bookmarks.add(b);
             }
             in.close();
Index: trunk/src/org/openstreetmap/josm/gui/BookmarkList.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/BookmarkList.java	(revision 2333)
+++ trunk/src/org/openstreetmap/josm/gui/BookmarkList.java	(revision 2334)
@@ -4,4 +4,5 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.awt.Component;
 import java.io.IOException;
 import java.util.Collection;
@@ -9,9 +10,14 @@
 
 import javax.swing.DefaultListModel;
+import javax.swing.JLabel;
 import javax.swing.JList;
 import javax.swing.JOptionPane;
+import javax.swing.ListCellRenderer;
+import javax.swing.UIManager;
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.Preferences;
+import org.openstreetmap.josm.data.Preferences.Bookmark;
 
 /**
@@ -28,4 +34,5 @@
         load();
         setVisibleRowCount(7);
+        setCellRenderer(new BookmarkCellRenderer());
     }
 
@@ -73,3 +80,42 @@
         }
     }
+    
+    class BookmarkCellRenderer extends JLabel implements ListCellRenderer {
+
+        public BookmarkCellRenderer() {
+            setOpaque(true);
+        }
+        
+        protected void renderColor(boolean selected) {
+            if (selected) {
+                setBackground(UIManager.getColor("List.selectionBackground"));
+                setForeground(UIManager.getColor("List.selectionForeground"));
+            } else {
+                setBackground(UIManager.getColor("List.background"));
+                setForeground(UIManager.getColor("List.foreground"));
+            }
+        }
+        
+        protected String buildToolTipText(Bookmark b) {
+            Bounds area = b.getArea();
+            StringBuffer sb = new StringBuffer();
+            sb.append("<html>min[latitude,longitude]=<strong>[")
+            .append(area.getMin().lat()).append(",").append(area.getMin().lon()).append("]</strong>")
+            .append("<br>")
+            .append("max[latitude,longitude]=<strong>[")
+            .append(area.getMax().lat()).append(",").append(area.getMax().lon()).append("]</strong>")
+            .append("</html>");
+            return sb.toString();
+            
+        }
+        public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
+                boolean cellHasFocus) {
+            
+            Bookmark b = (Bookmark) value;
+            renderColor(isSelected);
+            setText(b.getName());
+            setToolTipText(buildToolTipText(b));
+            return this;
+        }        
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/download/BookmarkSelection.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/download/BookmarkSelection.java	(revision 2333)
+++ trunk/src/org/openstreetmap/josm/gui/download/BookmarkSelection.java	(revision 2334)
@@ -4,9 +4,9 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
+import java.awt.GridBagConstraints;
 import java.awt.GridBagLayout;
-import java.awt.GridLayout;
 import java.awt.event.ActionEvent;
-import java.awt.event.ActionListener;
 
+import javax.swing.AbstractAction;
 import javax.swing.DefaultListModel;
 import javax.swing.JButton;
@@ -20,6 +20,7 @@
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.Preferences;
+import org.openstreetmap.josm.data.Preferences.Bookmark;
 import org.openstreetmap.josm.gui.BookmarkList;
-import org.openstreetmap.josm.tools.GBC;
+import org.openstreetmap.josm.tools.ImageProvider;
 
 /**
@@ -34,12 +35,40 @@
 public class BookmarkSelection implements DownloadSelection {
 
-    private Preferences.Bookmark tempBookmark = null;
+    private Bounds currentArea;
     private BookmarkList bookmarks;
+    
+    protected JPanel buildButtonPanel() {
+        JPanel pnl = new JPanel();
+        pnl.setLayout(new GridBagLayout());
+        GridBagConstraints gc = new GridBagConstraints();
+        gc.fill = GridBagConstraints.HORIZONTAL;
+        gc.weightx = 1.0;
+        gc.weighty = 0.0;
+        pnl.add(new JButton(new AddAction()), gc);
 
+        gc.gridy = 1;
+        RemoveAction removeAction = new RemoveAction();
+        bookmarks.addListSelectionListener(removeAction);
+        pnl.add(new JButton(removeAction), gc);
+
+        gc.gridy = 2;
+        RenameAction renameAction = new RenameAction();
+        bookmarks.addListSelectionListener(renameAction);
+        pnl.add(new JButton(renameAction), gc);
+
+        gc.fill = GridBagConstraints.BOTH;
+        gc.weightx = 1.0;
+        gc.weighty = 1.0;
+        gc.gridy = 3;
+        pnl.add(new JPanel(), gc); // just a filler
+        return pnl;
+    }
+ 
     public void addGui(final DownloadDialog gui) {
-
         JPanel dlg = new JPanel(new GridBagLayout());
         gui.addDownloadAreaSelector(dlg, tr("Bookmarks"));
-
+        GridBagConstraints gc = new GridBagConstraints();
+     
+        
         bookmarks = new BookmarkList();
         bookmarks.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
@@ -47,63 +76,121 @@
                 Preferences.Bookmark b = (Preferences.Bookmark)bookmarks.getSelectedValue();
                 if (b != null) {
-                    gui.boundingBoxChanged(b.asBounds(),BookmarkSelection.this);
+                    gui.boundingBoxChanged(b.getArea(),BookmarkSelection.this);
                 }
             }
         });
-        //wc.addListMarker(bookmarks);
-        dlg.add(new JScrollPane(bookmarks), GBC.eol().fill());
-
-        JPanel buttons = new JPanel(new GridLayout(1,2));
-        JButton add = new JButton(tr("Add"));
-        add.addActionListener(new ActionListener(){
-            public void actionPerformed(ActionEvent e) {
-
-                if (tempBookmark == null) {
-                    JOptionPane.showMessageDialog(
-                            Main.parent,
-                            tr("Please enter the desired coordinates first."),
-                            tr("Information"),
-                            JOptionPane.INFORMATION_MESSAGE
-                    );
-                    return;
-                }
-                tempBookmark.name = JOptionPane.showInputDialog(
-                        Main.parent,tr("Please enter a name for the location."),
-                        tr("Name of location"),
-                        JOptionPane.QUESTION_MESSAGE
-                );
-                if (tempBookmark.name != null && !tempBookmark.name.equals("")) {
-                    ((DefaultListModel)bookmarks.getModel()).addElement(tempBookmark);
-                    bookmarks.save();
-                }
-            }
-        });
-        buttons.add(add);
-        JButton remove = new JButton(tr("Remove"));
-        remove.addActionListener(new ActionListener(){
-            public void actionPerformed(ActionEvent e) {
-                Object sel = bookmarks.getSelectedValue();
-                if (sel == null) {
-                    JOptionPane.showMessageDialog(
-                            Main.parent,
-                            tr("Select a bookmark first."),
-                            tr("Information"),
-                            JOptionPane.INFORMATION_MESSAGE
-                    );
-                    return;
-                }
-                ((DefaultListModel)bookmarks.getModel()).removeElement(sel);
-                bookmarks.save();
-            }
-        });
-        buttons.add(remove);
-        dlg.add(buttons, GBC.eop().fill(GBC.HORIZONTAL));
+                
+        gc.fill = GridBagConstraints.VERTICAL;
+        gc.weightx = 0.0;
+        gc.weighty = 1.0;        
+        dlg.add(buildButtonPanel(),gc);
+        
+        gc.fill = GridBagConstraints.BOTH;
+        gc.weightx = 1.0;
+        gc.weighty = 1.0;   
+        gc.gridx = 1;
+        dlg.add(new JScrollPane(bookmarks), gc);        
     }
-
     
     public void setDownloadArea(Bounds area) {
         if (area == null) return;
-        tempBookmark = new Preferences.Bookmark(area);
+        this.currentArea = area;
         bookmarks.clearSelection();
     }
+    
+    class AddAction extends AbstractAction {
+        public AddAction() {
+            //putValue(NAME, tr("Add"));
+            putValue(SMALL_ICON, ImageProvider.get("dialogs", "add"));
+            putValue(SHORT_DESCRIPTION, tr("Add a bookmark for the currently selected download area"));
+        }
+        
+        public void actionPerformed(ActionEvent e) {
+            if (currentArea == null) {
+                JOptionPane.showMessageDialog(
+                        Main.parent,
+                        tr("Currently, there is no download area selected. Please select an area first."),
+                        tr("Information"),
+                        JOptionPane.INFORMATION_MESSAGE
+                );
+                return;
+            }
+            Bookmark b = new Bookmark();
+            b.setName(
+                    JOptionPane.showInputDialog(
+                    Main.parent,tr("Please enter a name for the bookmarked download area."),
+                    tr("Name of location"),
+                    JOptionPane.QUESTION_MESSAGE)
+            );
+            b.setArea(currentArea);
+            if (b.getName() != null && !b.getName().equals("")) {
+                ((DefaultListModel)bookmarks.getModel()).addElement(b);
+                bookmarks.save();
+            }            
+        }
+    }
+    
+    class RemoveAction extends AbstractAction implements ListSelectionListener{
+        public RemoveAction() {
+           //putValue(NAME, tr("Remove"));
+            putValue(SMALL_ICON, ImageProvider.get("dialogs", "delete"));
+            putValue(SHORT_DESCRIPTION, tr("Remove the currently selected bookmarks"));
+            updateEnabledState();
+        }
+        
+        public void actionPerformed(ActionEvent e) {
+            Object[] sels = bookmarks.getSelectedValues();
+            if (sels == null || sels.length == 0) {
+                return;
+            }
+            for (Object sel: sels) {
+                ((DefaultListModel)bookmarks.getModel()).removeElement(sel);
+            }
+            bookmarks.save();
+        }
+        protected void updateEnabledState() {
+            setEnabled(bookmarks.getSelectedIndices().length > 0);
+        }
+        public void valueChanged(ListSelectionEvent e) {
+            updateEnabledState();
+        }       
+    }
+    
+    class RenameAction extends AbstractAction implements ListSelectionListener{
+        public RenameAction() {
+           //putValue(NAME, tr("Remove"));
+            putValue(SMALL_ICON, ImageProvider.get("dialogs", "edit"));
+            putValue(SHORT_DESCRIPTION, tr("Rename the currently selected bookmark"));
+            updateEnabledState();
+        }
+        
+        public void actionPerformed(ActionEvent e) {
+            Object[] sels = bookmarks.getSelectedValues();
+            if (sels == null || sels.length != 1) {
+                return;
+            }
+            Bookmark b = (Bookmark)sels[0];
+            Object value = 
+                    JOptionPane.showInputDialog(
+                    Main.parent,tr("Please enter a name for the bookmarked download area."),
+                    tr("Name of location"),
+                    JOptionPane.QUESTION_MESSAGE,
+                    null,
+                    null,
+                    b.getName()
+                    );
+            if (value != null) {
+                b.setName(value.toString());            
+                bookmarks.save();
+                bookmarks.repaint();
+            }
+        }
+        protected void updateEnabledState() {
+            setEnabled(bookmarks.getSelectedIndices().length == 1);
+        }
+        public void valueChanged(ListSelectionEvent e) {
+            updateEnabledState();
+        }       
+    }
+   
 }
Index: trunk/src/org/openstreetmap/josm/gui/download/BoundingBoxSelection.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/download/BoundingBoxSelection.java	(revision 2333)
+++ trunk/src/org/openstreetmap/josm/gui/download/BoundingBoxSelection.java	(revision 2334)
@@ -14,5 +14,4 @@
 import javax.swing.BorderFactory;
 import javax.swing.JLabel;
-import javax.swing.JOptionPane;
 import javax.swing.JPanel;
 import javax.swing.JTextArea;
@@ -24,5 +23,4 @@
 import javax.swing.text.JTextComponent;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.coor.LatLon;
@@ -183,10 +181,4 @@
             }
             if (!LatLon.isValidLat(value)) {
-                JOptionPane.showMessageDialog(
-                        Main.parent,
-                        tr("Value for latitude in range [-90,90] required.", tfLatValue.getText()),
-                        tr("Error"),
-                        JOptionPane.ERROR_MESSAGE
-               );         
                 setErrorMessage(tr("Value for latitude in range [-90,90] required.", tfLatValue.getText()));
                 return;            
