Index: /trunk/src/org/openstreetmap/josm/data/osm/history/HistoryNode.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/history/HistoryNode.java	(revision 2242)
+++ /trunk/src/org/openstreetmap/josm/data/osm/history/HistoryNode.java	(revision 2243)
@@ -4,6 +4,6 @@
 import java.util.Date;
 
+import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
-import org.openstreetmap.josm.data.coor.LatLon;
 
 
@@ -14,9 +14,11 @@
  */
 public class HistoryNode extends HistoryOsmPrimitive {
-    private LatLon coor;
-    public HistoryNode(long id, long version, boolean visible, String user, long uid, long changesetId, Date timestamp,
-    double lat, double lon) {
+    /** the coordinates */
+
+    private LatLon coords;
+
+    public HistoryNode(long id, long version, boolean visible, String user, long uid, long changesetId, Date timestamp, LatLon coords) {
         super(id, version, visible, user, uid, changesetId, timestamp);
-        coor = new LatLon(lat, lon);
+        setCoords(coords);
     }
 
@@ -26,6 +28,10 @@
     }
 
-    public LatLon getCoordinate() {
-        return coor;
+    public LatLon getCoords() {
+        return coords;
+    }
+
+    public void setCoords(LatLon coords) {
+        this.coords = coords;
     }
 }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/HistoryDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/HistoryDialog.java	(revision 2242)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/HistoryDialog.java	(revision 2243)
@@ -110,4 +110,5 @@
             }
         });
+        historyTable.addMouseListener(new ShowHistoryMouseAdapter());
 
         JScrollPane pane = new JScrollPane(historyTable);
@@ -138,22 +139,4 @@
         model.refresh();
     }
-
-    /**
-     * shows the {@see HistoryBrowserDialog} for a given {@see History}
-     *
-     * @param h the history. Must not be null.
-     * @exception IllegalArgumentException thrown, if h is null
-     */
-    protected void showHistory(History h) throws IllegalArgumentException {
-        if (h == null)
-            throw new IllegalArgumentException(tr("Parameter ''{0}'' must not be null.", "h"));
-        if (HistoryBrowserDialogManager.getInstance().existsDialog(h.getId())) {
-            HistoryBrowserDialogManager.getInstance().show(h.getId());
-        } else {
-            HistoryBrowserDialog dialog = new HistoryBrowserDialog(h);
-            HistoryBrowserDialogManager.getInstance().show(h.getId(), dialog);
-        }
-    }
-
 
     /**
@@ -233,4 +216,8 @@
             }
             return ret;
+        }
+
+        public OsmPrimitive getPrimitive(int row) {
+            return data.get(row);
         }
     }
@@ -286,4 +273,14 @@
     }
 
+    class ShowHistoryMouseAdapter extends MouseAdapter {
+        @Override
+        public void mouseClicked(MouseEvent e) {
+            if (e.getClickCount() == 2 && e.getButton() == MouseEvent.BUTTON1) {
+                int row = historyTable.rowAtPoint(e.getPoint());
+                new ShowHistoryAction().showHistory(Collections.singletonList(model.getPrimitive(row)));
+            }
+        }
+    }
+
     /**
      * The action for showing history information of the current history item.
@@ -307,13 +304,26 @@
         }
 
-        public void actionPerformed(ActionEvent e) {
-            int [] rows = historyTable.getSelectedRows();
-            if (rows == null || rows.length == 0) return;
-
-            final List<OsmPrimitive> selectedItems = model.getPrimitives(rows);
-            List<OsmPrimitive> toLoad = filterPrimitivesWithUnloadedHistory(selectedItems);
+        /**
+         * shows the {@see HistoryBrowserDialog} for a given {@see History}
+         *
+         * @param h the history. Must not be null.
+         * @exception IllegalArgumentException thrown, if h is null
+         */
+        protected void showHistory(History h) throws IllegalArgumentException {
+            if (h == null)
+                throw new IllegalArgumentException(tr("Parameter ''{0}'' must not be null.", "h"));
+            if (HistoryBrowserDialogManager.getInstance().existsDialog(h.getId())) {
+                HistoryBrowserDialogManager.getInstance().show(h.getId());
+            } else {
+                HistoryBrowserDialog dialog = new HistoryBrowserDialog(h);
+                HistoryBrowserDialogManager.getInstance().show(h.getId(), dialog);
+            }
+        }
+
+        public void showHistory(final List<OsmPrimitive> primitives) {
+            List<OsmPrimitive> toLoad = filterPrimitivesWithUnloadedHistory(primitives);
             if (!toLoad.isEmpty()) {
                 HistoryLoadTask task = new HistoryLoadTask();
-                task.add(selectedItems);
+                task.add(primitives);
                 Main.worker.submit(task);
             }
@@ -321,5 +331,5 @@
             Runnable r = new Runnable() {
                 public void run() {
-                    for (OsmPrimitive p : selectedItems) {
+                    for (OsmPrimitive p : primitives) {
                         History h = HistoryDataSet.getInstance().getHistory(p.getId());
                         if (h == null) {
@@ -333,4 +343,10 @@
         }
 
+        public void actionPerformed(ActionEvent e) {
+            int [] rows = historyTable.getSelectedRows();
+            if (rows == null || rows.length == 0) return;
+            showHistory(model.getPrimitives(rows));
+        }
+
         protected void updateEnabledState() {
             setEnabled(historyTable.getSelectedRowCount() > 0);
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 2242)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 2243)
@@ -138,11 +138,4 @@
         });
 
-        buttonPanel.add(new SideButton(marktr("Reload"), "refresh", "SelectionList", tr("Refresh the selection list."),
-                new ActionListener() {
-            public void actionPerformed(ActionEvent e) {
-                selectionChanged(Main.main.getCurrentDataSet().getSelected());
-            }
-        }));
-
         searchButton = new SideButton(marktr("Search"), "search", "SelectionList", tr("Search for objects."),
                 Main.main.menu.search);
Index: /trunk/src/org/openstreetmap/josm/gui/history/CoordinateInfoViewer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/history/CoordinateInfoViewer.java	(revision 2243)
+++ /trunk/src/org/openstreetmap/josm/gui/history/CoordinateInfoViewer.java	(revision 2243)
@@ -0,0 +1,266 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.history;
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Color;
+import java.awt.Graphics;
+import java.awt.Graphics2D;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
+import java.awt.Insets;
+import java.util.Observable;
+import java.util.Observer;
+
+import javax.swing.BorderFactory;
+import javax.swing.JLabel;
+import javax.swing.JPanel;
+
+import org.openstreetmap.josm.data.coor.CoordinateFormat;
+import org.openstreetmap.josm.data.osm.history.HistoryNode;
+import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
+
+/**
+ * An UI widget for displaying differences in the coordinates of two
+ * {@see HistoryNode}s.
+ *
+ */
+public class CoordinateInfoViewer extends JPanel {
+
+    /** background color used when the coordinates are different */
+    public final static Color BGCOLOR_DIFFERENCE = new Color(255,197,197);
+
+    /** the model */
+    private HistoryBrowserModel model;
+    /** the common info panel for the history node in role REFERENCE_POINT_IN_TIME */
+    private VersionInfoPanel referenceInfoPanel;
+    /** the common info panel for the history node in role CURRENT_POINT_IN_TIME */
+    private VersionInfoPanel currentInfoPanel;
+    /** the info panel for coordinates for the node in role REFERENCE_POINT_IN_TIME */
+    private LatLonViewer referenceLatLonViewer;
+    /** the info panel for coordinates for the node in role CURRENT_POINT_IN_TIME */
+    private LatLonViewer currentLatLonViewer;
+
+    protected void build() {
+        setLayout(new GridBagLayout());
+        GridBagConstraints gc = new GridBagConstraints();
+
+        // ---------------------------
+        gc.gridx = 0;
+        gc.gridy = 0;
+        gc.gridwidth = 1;
+        gc.gridheight = 1;
+        gc.weightx = 0.5;
+        gc.weighty = 0.0;
+        gc.insets = new Insets(5,5,5,0);
+        gc.fill = GridBagConstraints.HORIZONTAL;
+        gc.anchor = GridBagConstraints.FIRST_LINE_START;
+        referenceInfoPanel = new VersionInfoPanel(model, PointInTimeType.REFERENCE_POINT_IN_TIME);
+        add(referenceInfoPanel,gc);
+
+        gc.gridx = 1;
+        gc.gridy = 0;
+        gc.fill = GridBagConstraints.HORIZONTAL;
+        gc.weightx = 0.5;
+        gc.weighty = 0.0;
+        gc.anchor = GridBagConstraints.FIRST_LINE_START;
+        currentInfoPanel = new VersionInfoPanel(model, PointInTimeType.CURRENT_POINT_IN_TIME);
+        add(currentInfoPanel,gc);
+
+        // ---------------------------
+        // the two coordinate panels
+        gc.gridx = 0;
+        gc.gridy = 1;
+        gc.weightx = 0.5;
+        gc.weighty = 1.0;
+        gc.fill = GridBagConstraints.BOTH;
+        gc.anchor = GridBagConstraints.NORTHWEST;
+        add(referenceLatLonViewer = new LatLonViewer(model, PointInTimeType.REFERENCE_POINT_IN_TIME), gc);
+
+        gc.gridx = 1;
+        gc.gridy = 1;
+        gc.weightx = 0.5;
+        gc.weighty = 1.0;
+        gc.fill = GridBagConstraints.BOTH;
+        gc.anchor = GridBagConstraints.NORTHWEST;
+        add(currentLatLonViewer = new LatLonViewer(model, PointInTimeType.CURRENT_POINT_IN_TIME), gc);
+    }
+
+    /**
+     * 
+     * @param model the model. Must not be null.
+     * @throws IllegalArgumentException thrown if model is null
+     */
+    public CoordinateInfoViewer(HistoryBrowserModel model) throws IllegalArgumentException{
+        if (model == null)
+            throw new IllegalArgumentException(tr("Parameter ''{0}'' must not be null", "model"));
+        setModel(model);
+        build();
+        registerAsObserver(model);
+    }
+
+    protected void unregisterAsObserver(HistoryBrowserModel model) {
+        if (currentInfoPanel != null) {
+            model.deleteObserver(currentInfoPanel);
+        }
+        if (referenceInfoPanel != null) {
+            model.deleteObserver(referenceInfoPanel);
+        }
+        if (currentLatLonViewer != null) {
+            model.deleteObserver(currentLatLonViewer);
+        }
+        if (referenceLatLonViewer != null) {
+            model.deleteObserver(referenceLatLonViewer);
+        }
+    }
+
+    protected void registerAsObserver(HistoryBrowserModel model) {
+        if (currentInfoPanel != null) {
+            model.addObserver(currentInfoPanel);
+        }
+        if (referenceInfoPanel != null) {
+            model.addObserver(referenceInfoPanel);
+        }
+        if (currentLatLonViewer != null) {
+            model.addObserver(currentLatLonViewer);
+        }
+        if (referenceLatLonViewer != null) {
+            model.addObserver(referenceLatLonViewer);
+        }
+    }
+
+    /**
+     * Sets the model for this viewer
+     * 
+     * @param model the model.
+     */
+    public void setModel(HistoryBrowserModel model) {
+        if (this.model != null) {
+            unregisterAsObserver(model);
+        }
+        this.model = model;
+        if (this.model != null) {
+            registerAsObserver(model);
+        }
+    }
+
+    /**
+     * A UI widgets which displays the Lan/Lon-coordinates of a
+     * {@see HistoryNode}.
+     * 
+     */
+    private static class LatLonViewer extends JPanel implements Observer{
+
+        private JLabel lblLat;
+        private JLabel lblLon;
+        private HistoryBrowserModel model;
+        private PointInTimeType role;
+
+        protected HistoryOsmPrimitive getPrimitive() {
+            if (model == null || role == null)
+                return null;
+            return model.getPointInTime(role);
+        }
+
+        protected HistoryOsmPrimitive getOppositePrimitive() {
+            if (model == null || role == null)
+                return null;
+            return model.getPointInTime(role.opposite());
+        }
+
+        protected void build() {
+            setLayout(new GridBagLayout());
+            setBorder(BorderFactory.createLineBorder(Color.DARK_GRAY));
+            GridBagConstraints gc = new GridBagConstraints();
+
+            // --------
+            gc.gridx = 0;
+            gc.gridy = 0;
+            gc.fill = GridBagConstraints.NONE;
+            gc.weightx = 0.0;
+            gc.insets = new Insets(5,5,5,5);
+            gc.anchor = GridBagConstraints.NORTHWEST;
+            add(new JLabel(tr("Lat: ")), gc);
+
+            // --------
+            gc.gridx = 1;
+            gc.gridy = 0;
+            gc.fill = GridBagConstraints.HORIZONTAL;
+            gc.weightx = 1.0;
+            add(lblLat = new JLabel(), gc);
+            lblLat.setBackground(Color.WHITE);
+            lblLat.setOpaque(true);
+            lblLat.setBorder(BorderFactory.createEmptyBorder(2,2,2,2));
+
+            // --------
+            gc.gridx = 0;
+            gc.gridy = 1;
+            gc.fill = GridBagConstraints.NONE;
+            gc.weightx = 0.0;
+            gc.anchor = GridBagConstraints.NORTHWEST;
+            add(new JLabel(tr("Lon: ")), gc);
+
+            // --------
+            gc.gridx = 1;
+            gc.gridy = 1;
+            gc.fill = GridBagConstraints.HORIZONTAL;
+            gc.weightx = 1.0;
+            add(lblLon = new JLabel(), gc);
+            lblLon.setBackground(Color.WHITE);
+            lblLon.setOpaque(true);
+            lblLon.setBorder(BorderFactory.createEmptyBorder(2,2,2,2));
+
+
+            // fill the remaining space
+            gc.gridx = 0;
+            gc.gridy = 2;
+            gc.gridwidth = 2;
+            gc.fill = GridBagConstraints.BOTH;
+            gc.weightx = 1.0;
+            gc.weighty = 1.0;
+            add(new JPanel(), gc);
+        }
+
+        /**
+         * 
+         * @param model a model
+         * @param role the role for this viewer.
+         */
+        public LatLonViewer(HistoryBrowserModel model, PointInTimeType role) {
+            build();
+            this.model = model;
+            this.role = role;
+        }
+
+        protected void refresh() {
+            HistoryOsmPrimitive p = getPrimitive();
+            HistoryOsmPrimitive  opposite = getOppositePrimitive();
+            if (p == null || ! ( p instanceof HistoryNode)) return;
+            if (opposite == null || ! (opposite instanceof HistoryNode)) return;
+            HistoryNode node = (HistoryNode)p;
+            HistoryNode oppositeNode = (HistoryNode) opposite;
+
+            // display the coordinates
+            //
+            lblLat.setText(node.getCoords().latToString(CoordinateFormat.DECIMAL_DEGREES));
+            lblLon.setText(node.getCoords().lonToString(CoordinateFormat.DECIMAL_DEGREES));
+
+            // update background color to reflect differences in the coordinates
+            //
+            if (node.getCoords().lat() == oppositeNode.getCoords().lat()) {
+                lblLat.setBackground(Color.WHITE);
+            } else {
+                lblLat.setBackground(BGCOLOR_DIFFERENCE);
+            }
+            if (node.getCoords().lon() == oppositeNode.getCoords().lon()) {
+                lblLon.setBackground(Color.WHITE);
+            } else {
+                lblLon.setBackground(BGCOLOR_DIFFERENCE);
+            }
+
+        }
+
+        public void update(Observable o, Object arg) {
+            refresh();
+        }
+    }
+}
Index: unk/src/org/openstreetmap/josm/gui/history/CoordinateTableCellRenderer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/history/CoordinateTableCellRenderer.java	(revision 2242)
+++ 	(revision )
@@ -1,53 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.history;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import java.awt.Color;
-import java.awt.Component;
-
-import javax.swing.JLabel;
-import javax.swing.JTable;
-import javax.swing.table.TableCellRenderer;
-
-/**
- * The {@see TableCellRenderer} for a list of tagsin {@see HistoryBrower}
- *
- */
-public class CoordinateTableCellRenderer extends JLabel implements TableCellRenderer {
-
-    public final static Color BGCOLOR_SELECTED = new Color(143,170,255);
-    public final static Color BGCOLOR_DIFFERENCE = new Color(255,197,197);
-
-    public CoordinateTableCellRenderer() {
-        setOpaque(true);
-        setForeground(Color.BLACK);
-    }
-
-    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus,
-            int row, int column) {
-
-        String key = (String)value;
-        HistoryBrowserModel.CoordinateTableModel model = getCoordinateTableModel(table);
-
-        String text;
-        Color bgColor = Color.WHITE;
-        if(column == 0) // the name column
-            text = row == 0 ? tr("latitude") : tr("longitude");
-        else // the value column
-        {
-            text = (String) model.getValueAt(row, column);
-            if (!model.hasSameValueAsOpposite(row))
-                bgColor = BGCOLOR_DIFFERENCE;
-        }
-        setText(text);
-        setToolTipText(text);
-        setBackground(isSelected ? BGCOLOR_SELECTED : bgColor);
-
-        return this;
-    }
-
-    protected HistoryBrowserModel.CoordinateTableModel getCoordinateTableModel(JTable table) {
-        return (HistoryBrowserModel.CoordinateTableModel) table.getModel();
-    }
-}
Index: unk/src/org/openstreetmap/josm/gui/history/CoordinateTableColumnModel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/history/CoordinateTableColumnModel.java	(revision 2242)
+++ 	(revision )
@@ -1,36 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.history;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
-
-import javax.swing.table.DefaultTableColumnModel;
-import javax.swing.table.TableColumn;
-
-/**
- * The {@see TableColumnModel} for the table with the list of tags
- *
- */
-public class CoordinateTableColumnModel extends DefaultTableColumnModel{
-    protected void createColumns() {
-        TableColumn col = null;
-
-        CoordinateTableCellRenderer renderer = new CoordinateTableCellRenderer();
-
-        // column 0 - Name
-        col = new TableColumn(0);
-        col.setHeaderValue(tr("Name"));
-        col.setCellRenderer(renderer);
-        addColumn(col);
-
-        // column 1 - Value
-        col = new TableColumn(1);
-        col.setHeaderValue(tr("Value"));
-        col.setCellRenderer(renderer);
-        addColumn(col);
-
-    }
-
-    public CoordinateTableColumnModel() {
-        createColumns();
-    }
-}
Index: unk/src/org/openstreetmap/josm/gui/history/CoordinateViewer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/history/CoordinateViewer.java	(revision 2242)
+++ 	(revision )
@@ -1,145 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.history;
-
-import java.awt.GridBagConstraints;
-import java.awt.GridBagLayout;
-import java.awt.Insets;
-
-import javax.swing.JPanel;
-import javax.swing.JScrollPane;
-import javax.swing.JTable;
-import javax.swing.ListSelectionModel;
-
-/**
- * CoordinateViewer is a UI component which displays the list of coordinates of two
- * version of a {@see OsmPrimitive} in a {@see History}.
- *
- * <ul>
- *   <li>on the left, it displays the list of coordinates for the version at {@see PointInTimeType#REFERENCE_POINT_IN_TIME}</li>
- *   <li>on the right, it displays the list of coordinates for the version at {@see PointInTimeType#CURRENT_POINT_IN_TIME}</li>
- * </ul>
- *
- */
-public class CoordinateViewer extends JPanel{
-
-    private HistoryBrowserModel model;
-    private VersionInfoPanel referenceInfoPanel;
-    private VersionInfoPanel currentInfoPanel;
-    private AdjustmentSynchronizer adjustmentSynchronizer;
-    private SelectionSynchronizer selectionSynchronizer;
-
-    protected JScrollPane embeddInScrollPane(JTable table) {
-        JScrollPane pane = new JScrollPane(table);
-        pane.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
-        pane.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
-        adjustmentSynchronizer.participateInSynchronizedScrolling(pane.getVerticalScrollBar());
-        return pane;
-    }
-
-    protected JTable buildReferenceCoordinateTable() {
-        JTable table = new JTable(
-                model.getCoordinateTableModel(PointInTimeType.REFERENCE_POINT_IN_TIME),
-                new CoordinateTableColumnModel()
-        );
-        table.setName("table.referencecoordinatetable");
-        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
-        selectionSynchronizer.participateInSynchronizedSelection(table.getSelectionModel());
-        return table;
-    }
-
-    protected JTable buildCurrentCoordinateTable() {
-        JTable table = new JTable(
-                model.getCoordinateTableModel(PointInTimeType.CURRENT_POINT_IN_TIME),
-                new CoordinateTableColumnModel()
-        );
-        table.setName("table.currentcoordinatetable");
-        table.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
-        selectionSynchronizer.participateInSynchronizedSelection(table.getSelectionModel());
-        return table;
-    }
-
-    protected void build() {
-        setLayout(new GridBagLayout());
-        GridBagConstraints gc = new GridBagConstraints();
-
-        // ---------------------------
-        gc.gridx = 0;
-        gc.gridy = 0;
-        gc.gridwidth = 1;
-        gc.gridheight = 1;
-        gc.weightx = 0.5;
-        gc.weighty = 0.0;
-        gc.insets = new Insets(5,5,5,0);
-        gc.fill = GridBagConstraints.HORIZONTAL;
-        gc.anchor = GridBagConstraints.FIRST_LINE_START;
-        referenceInfoPanel = new VersionInfoPanel(model, PointInTimeType.REFERENCE_POINT_IN_TIME);
-        add(referenceInfoPanel,gc);
-
-        gc.gridx = 1;
-        gc.gridy = 0;
-        gc.gridwidth = 1;
-        gc.gridheight = 1;
-        gc.fill = GridBagConstraints.HORIZONTAL;
-        gc.weightx = 0.5;
-        gc.weighty = 0.0;
-        gc.anchor = GridBagConstraints.FIRST_LINE_START;
-        currentInfoPanel = new VersionInfoPanel(model, PointInTimeType.CURRENT_POINT_IN_TIME);
-        add(currentInfoPanel,gc);
-
-        adjustmentSynchronizer = new AdjustmentSynchronizer();
-        selectionSynchronizer = new SelectionSynchronizer();
-
-        // ---------------------------
-        gc.gridx = 0;
-        gc.gridy = 1;
-        gc.gridwidth = 1;
-        gc.gridheight = 1;
-        gc.weightx = 0.5;
-        gc.weighty = 1.0;
-        gc.fill = GridBagConstraints.BOTH;
-        gc.anchor = GridBagConstraints.NORTHWEST;
-        add(embeddInScrollPane(buildReferenceCoordinateTable()),gc);
-
-        gc.gridx = 1;
-        gc.gridy = 1;
-        gc.gridwidth = 1;
-        gc.gridheight = 1;
-        gc.weightx = 0.5;
-        gc.weighty = 1.0;
-        gc.fill = GridBagConstraints.BOTH;
-        gc.anchor = GridBagConstraints.NORTHWEST;
-        add(embeddInScrollPane(buildCurrentCoordinateTable()),gc);
-    }
-
-    public CoordinateViewer(HistoryBrowserModel model) {
-        setModel(model);
-        build();
-    }
-
-    protected void unregisterAsObserver(HistoryBrowserModel model) {
-        if (currentInfoPanel != null) {
-            model.deleteObserver(currentInfoPanel);
-        }
-        if (referenceInfoPanel != null) {
-            model.deleteObserver(referenceInfoPanel);
-        }
-    }
-    protected void registerAsObserver(HistoryBrowserModel model) {
-        if (currentInfoPanel != null) {
-            model.addObserver(currentInfoPanel);
-        }
-        if (referenceInfoPanel != null) {
-            model.addObserver(referenceInfoPanel);
-        }
-    }
-
-    public void setModel(HistoryBrowserModel model) {
-        if (this.model != null) {
-            unregisterAsObserver(model);
-        }
-        this.model = model;
-        if (this.model != null) {
-            registerAsObserver(model);
-        }
-    }
-}
Index: /trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowser.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowser.java	(revision 2242)
+++ /trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowser.java	(revision 2243)
@@ -13,10 +13,10 @@
 import javax.swing.JTable;
 
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.data.osm.history.History;
-import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 
 /**
  * HistoryBrowser is an UI component which displays history information about an {@see OsmPrimitive}.
- *
+ * 
  *
  */
@@ -25,9 +25,14 @@
     /** the model */
     private HistoryBrowserModel model;
-    private JTabbedPane dataPane;
+    private TagInfoViewer tagInfoViewer;
+    private NodeListViewer nodeListViewer;
+    private RelationMemberListViewer relationMemberListViewer;
+    private CoordinateInfoViewer coordinateInfoViewer;
+    private JTabbedPane tpViewers;
+
 
     /**
      * embedds table in a {@see JScrollPane}
-     *
+     * 
      * @param table the table
      * @return the {@see JScrollPane} with the embedded table
@@ -42,5 +47,5 @@
     /**
      * creates the table which shows the list of versions
-     *
+     * 
      * @return  the panel with the version table
      */
@@ -57,25 +62,20 @@
      * creates the panel which shows information about two different versions
      * of the same {@see OsmPrimitive}.
-     *
+     * 
      * @return the panel
      */
+    protected JPanel createVersionComparePanel() {
+        tpViewers = new JTabbedPane();
 
-    protected JPanel createVersionComparePanel() {
-        dataPane = new JTabbedPane();
-        dataPane.add(new TagInfoViewer(model));
-        dataPane.setTitleAt(0, tr("Tags"));
-
-        dataPane.add(new NodeListViewer(model));
-        dataPane.setTitleAt(1, tr("Nodes"));
-
-        dataPane.add(new RelationMemberListViewer(model));
-        dataPane.setTitleAt(2, tr("Members"));
-
-        dataPane.add(new CoordinateViewer(model));
-        dataPane.setTitleAt(3, tr("Coordinate"));
-
+        // create the viewers, but don't add them yet.
+        // see populate()
+        //
+        tagInfoViewer = new TagInfoViewer(model);
+        nodeListViewer = new NodeListViewer(model);
+        relationMemberListViewer = new RelationMemberListViewer(model);
+        coordinateInfoViewer = new CoordinateInfoViewer(model);
         JPanel pnl = new JPanel();
         pnl.setLayout(new BorderLayout());
-        pnl.add(dataPane, BorderLayout.CENTER);
+        pnl.add(tpViewers, BorderLayout.CENTER);
         return pnl;
     }
@@ -122,32 +122,29 @@
     /**
      * populates the browser with the history of a specific {@see OsmPrimitive}
-     *
+     * 
      * @param history the history
      */
     public void populate(History history) {
         model.setHistory(history);
-        OsmPrimitiveType type = history.getType();
-        if(type != null)
-        {
-            if(type == OsmPrimitiveType.NODE)
-            {
-                dataPane.setEnabledAt(1, false);
-                dataPane.setEnabledAt(2, false);
-            }
-            else if(type == OsmPrimitiveType.WAY)
-            {
-                dataPane.setEnabledAt(2, false);
-                dataPane.setEnabledAt(3, false);
-            }
-            else
-            {
-                dataPane.setEnabledAt(3, false);
-            }
+
+        tpViewers.add(tagInfoViewer);
+        tpViewers.setTitleAt(0, tr("Tags"));
+
+        if (history.getEarliest().getType().equals(OsmPrimitiveType.NODE)) {
+            tpViewers.add(coordinateInfoViewer);
+            tpViewers.setTitleAt(1, tr("Coordinates"));
+        } else if (history.getEarliest().getType().equals(OsmPrimitiveType.WAY)) {
+            tpViewers.add(nodeListViewer);
+            tpViewers.setTitleAt(1, tr("Nodes"));
+        } else if (history.getEarliest().getType().equals(OsmPrimitiveType.RELATION)) {
+            tpViewers.add(relationMemberListViewer);
+            tpViewers.setTitleAt(2, tr("Members"));
         }
+        revalidate();
     }
 
     /**
      * replies the {@see History} currently displayed by this browser
-     *
+     * 
      * @return the current history
      */
Index: /trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java	(revision 2242)
+++ /trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java	(revision 2243)
@@ -62,6 +62,4 @@
     private RelationMemberTableModel currentRelationMemberTableModel;
     private RelationMemberTableModel referenceRelationMemberTableModel;
-    private CoordinateTableModel currentCoordinateTableModel;
-    private CoordinateTableModel referenceCoordinateTableModel;
 
     public HistoryBrowserModel() {
@@ -73,6 +71,4 @@
         currentRelationMemberTableModel = new RelationMemberTableModel(PointInTimeType.CURRENT_POINT_IN_TIME);
         referenceRelationMemberTableModel = new RelationMemberTableModel(PointInTimeType.REFERENCE_POINT_IN_TIME);
-        currentCoordinateTableModel = new CoordinateTableModel(PointInTimeType.CURRENT_POINT_IN_TIME);
-        referenceCoordinateTableModel = new CoordinateTableModel(PointInTimeType.REFERENCE_POINT_IN_TIME);
     }
 
@@ -136,9 +132,4 @@
         currentRelationMemberTableModel.fireTableDataChanged();
         referenceRelationMemberTableModel.fireTableDataChanged();
-    }
-
-    protected void initCoordinateTableModels() {
-        currentCoordinateTableModel.fireTableDataChanged();
-        referenceCoordinateTableModel.fireTableDataChanged();
     }
 
@@ -181,16 +172,4 @@
         else if (pointInTimeType.equals(PointInTimeType.REFERENCE_POINT_IN_TIME))
             return referenceRelationMemberTableModel;
-
-        // should not happen
-        return null;
-    }
-
-    public CoordinateTableModel getCoordinateTableModel(PointInTimeType pointInTimeType) throws IllegalArgumentException {
-        if (pointInTimeType == null)
-            throw new IllegalArgumentException(tr("Parameter ''{0}'' must not be null.", "pointInTimeType"));
-        if (pointInTimeType.equals(PointInTimeType.CURRENT_POINT_IN_TIME))
-            return currentCoordinateTableModel;
-        else if (pointInTimeType.equals(PointInTimeType.REFERENCE_POINT_IN_TIME))
-            return referenceCoordinateTableModel;
 
         // should not happen
@@ -213,5 +192,4 @@
         initNodeListTabeModels();
         initMemberListTableModels();
-        initCoordinateTableModels();
         setChanged();
         notifyObservers();
@@ -232,5 +210,4 @@
         initNodeListTabeModels();
         initMemberListTableModels();
-        initCoordinateTableModels();
         setChanged();
         notifyObservers();
@@ -610,67 +587,3 @@
         }
     }
-
-    /**
-     * The table model for the coordinates of the version at {@see PointInTimeType#REFERENCE_POINT_IN_TIME}
-     * or {@see PointInTimeType#CURRENT_POINT_IN_TIME}
-     *
-     */
-    public class CoordinateTableModel extends DefaultTableModel {
-
-        private LatLon currentCoor = null;
-        private LatLon referenceCoor = null;
-        private PointInTimeType pointInTimeType;
-
-        protected CoordinateTableModel(PointInTimeType type) {
-            pointInTimeType = type;
-        }
-
-        @Override
-        public int getRowCount() {
-            if (current != null && current instanceof HistoryNode)
-                currentCoor = ((HistoryNode)current).getCoordinate();
-            else
-                return 0;
-            if (reference != null && reference instanceof HistoryNode)
-                referenceCoor = ((HistoryNode)reference).getCoordinate();
-            return 2;
-        }
-
-        @Override
-        public Object getValueAt(int row, int column) {
-            if(currentCoor == null)
-                return null;
-            else if (pointInTimeType.equals(PointInTimeType.CURRENT_POINT_IN_TIME))
-                return row == 0 ? currentCoor.latToString(CoordinateFormat.getDefaultFormat())
-                : currentCoor.lonToString(CoordinateFormat.getDefaultFormat());
-            else
-                return row == 0 ? referenceCoor.latToString(CoordinateFormat.getDefaultFormat())
-                : referenceCoor.lonToString(CoordinateFormat.getDefaultFormat());
-        }
-
-        @Override
-        public boolean isCellEditable(int row, int column) {
-            return false;
-        }
-
-        public boolean hasSameValueAsOpposite(int row) {
-            if(currentCoor == null)
-                return false;
-            else if(row == 0)
-                return currentCoor.lat() == referenceCoor.lat();
-            return currentCoor.lon() == referenceCoor.lon();
-        }
-
-        public PointInTimeType getPointInTimeType() {
-            return pointInTimeType;
-        }
-
-        public boolean isCurrentPointInTime() {
-            return pointInTimeType.equals(PointInTimeType.CURRENT_POINT_IN_TIME);
-        }
-
-        public boolean isReferencePointInTime() {
-            return pointInTimeType.equals(PointInTimeType.REFERENCE_POINT_IN_TIME);
-        }
-    }
 }
Index: /trunk/src/org/openstreetmap/josm/gui/history/NodeListViewer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/history/NodeListViewer.java	(revision 2242)
+++ /trunk/src/org/openstreetmap/josm/gui/history/NodeListViewer.java	(revision 2243)
@@ -143,4 +143,3 @@
         }
     }
-
 }
Index: /trunk/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java	(revision 2242)
+++ /trunk/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java	(revision 2243)
@@ -4,7 +4,7 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import java.awt.BorderLayout;
-import java.awt.event.ActionEvent;
-import java.awt.event.MouseEvent;
+import java.awt.FlowLayout;
+import java.awt.GridBagConstraints;
+import java.awt.GridBagLayout;
 import java.text.SimpleDateFormat;
 import java.util.Observable;
@@ -16,10 +16,10 @@
 import org.openstreetmap.josm.actions.AbstractInfoAction;
 import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
-import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.UrlLabel;
 
 /**
  * VersionInfoPanel is an UI component which displays the basic properties of a version
  * of a {@see OsmPrimitive}.
- *
+ * 
  */
 public class VersionInfoPanel extends JPanel implements Observer{
@@ -28,10 +28,32 @@
     private HistoryBrowserModel model;
     private JLabel lblInfo;
+    private UrlLabel lblUser;
+    private UrlLabel lblChangeset;
 
     protected void build() {
-        setLayout(new BorderLayout());
+        JPanel pnl1 = new JPanel();
+        pnl1.setLayout(new FlowLayout(FlowLayout.LEFT));
         lblInfo = new JLabel();
         lblInfo.setHorizontalAlignment(JLabel.LEFT);
-        add(lblInfo, BorderLayout.CENTER);
+        pnl1.add(lblInfo);
+
+        JPanel pnl2 = new JPanel();
+        pnl2.setLayout(new FlowLayout(FlowLayout.LEFT));
+        lblUser = new UrlLabel();
+        pnl2.add(new JLabel(tr("User")));
+        pnl2.add(lblUser);
+        pnl2.add(new JLabel(tr("Changeset")));
+        lblChangeset = new UrlLabel();
+        pnl2.add(lblChangeset);
+
+        setLayout(new GridBagLayout());
+        GridBagConstraints gc = new GridBagConstraints();
+        gc.anchor = GridBagConstraints.NORTHWEST;
+        gc.fill = GridBagConstraints.HORIZONTAL;
+        gc.weightx = 1.0;
+        gc.weighty = 0.0;
+        add(pnl1, gc);
+        gc.gridy = 1;
+        add(pnl2, gc);
     }
 
@@ -46,11 +68,8 @@
         if (primitive == null)
             return "";
-        String url = AbstractInfoAction.getBaseBrowseUrl() + "/changeset/" + primitive.getChangesetId();
         String text = tr(
-                "<html>Version <strong>{0}</strong> created on <strong>{1}</strong> by <strong>{2}</strong> in changeset <strong>{3}</strong></html>",
+                "<html>Version <strong>{0}</strong> created on <strong>{1}</strong>",
                 Long.toString(primitive.getVersion()),
-                new SimpleDateFormat().format(primitive.getTimestamp()),
-                primitive.getUser().replace("<", "&lt;").replace(">", "&gt;"),
-                primitive.getChangesetId()
+                new SimpleDateFormat().format(primitive.getTimestamp())
         );
         return text;
@@ -65,5 +84,5 @@
     /**
      * constructor
-     *
+     * 
      * @param model  the model (must not be null)
      * @param pointInTimeType the point in time this panel visualizes (must not be null)
@@ -86,4 +105,12 @@
     public void update(Observable o, Object arg) {
         lblInfo.setText(getInfoText());
+
+        String url = AbstractInfoAction.getBaseBrowseUrl() + "/changeset/" + getPrimitive().getChangesetId();
+        lblChangeset.setUrl(url);
+        lblChangeset.setDescription(tr("{0}", getPrimitive().getChangesetId()));
+
+        url = AbstractInfoAction.getBaseUserUrl() + "/" + getPrimitive().getUser();
+        lblUser.setUrl(url);
+        lblUser.setDescription(tr("{0}", getPrimitive().getUser()));
     }
 }
Index: /trunk/src/org/openstreetmap/josm/io/OsmHistoryReader.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/OsmHistoryReader.java	(revision 2242)
+++ /trunk/src/org/openstreetmap/josm/io/OsmHistoryReader.java	(revision 2243)
@@ -12,4 +12,5 @@
 import javax.xml.parsers.SAXParserFactory;
 
+import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
@@ -80,44 +81,10 @@
         }
 
-        protected long getAttributeLong(Attributes attr, String name, long defaultValue) throws SAXException{
-            String v = attr.getValue(name);
-            if (v == null) {
-                return defaultValue;
-            }
-            Long l = 0l;
-            try {
-                l = Long.parseLong(v);
-            } catch(NumberFormatException e) {
-                throwException(tr("Illegal value for mandatory attribute ''{0}'' of type long. Got ''{1}''.", name, v));
-            }
-            if (l < 0) {
-                throwException(tr("Illegal value for mandatory attribute ''{0}'' of type long (>=0). Got ''{1}''.", name, v));
-            }
-            return l;
-        }
-
-        protected int getMandatoryAttributeInt(Attributes attr, String name) throws SAXException{
-            String v = attr.getValue(name);
-            if (v == null) {
-                throwException(tr("Missing mandatory attribute ''{0}''.", name));
-            }
-            Integer i = 0;
-            try {
-                i = Integer.parseInt(v);
-            } catch(NumberFormatException e) {
-                throwException(tr("Illegal value for mandatory attribute ''{0}'' of type int. Got ''{1}''.", name, v));
-            }
-            if (i < 0) {
-                throwException(tr("Illegal value for mandatory attribute ''{0}'' of type int (>=0). Got ''{1}''.", name, v));
-            }
-            return i;
-        }
-
-        protected double getMandatoryAttributeDouble(Attributes attr, String name) throws SAXException{
-            String v = attr.getValue(name);
-            if (v == null) {
-                throwException(tr("Missing mandatory attribute ''{0}''.", name));
-            }
-            double d = 0.0;
+        protected Double getMandatoryAttributeDouble(Attributes attr, String name) throws SAXException{
+            String v = attr.getValue(name);
+            if (v == null) {
+                throwException(tr("Missing mandatory attribute ''{0}''.", name));
+            }
+            double d = 0;
             try {
                 d = Double.parseDouble(v);
@@ -125,4 +92,7 @@
                 throwException(tr("Illegal value for mandatory attribute ''{0}'' of type double. Got ''{1}''.", name, v));
             }
+            if (d < 0) {
+                throwException(tr("Illegal value for mandatory attribute ''{0}'' of type double (>=0). Got ''{1}''.", name, v));
+            }
             return d;
         }
@@ -133,11 +103,4 @@
                 throwException(tr("Missing mandatory attribute ''{0}''.", name));
             }
-            return v;
-        }
-
-        protected String getAttributeString(Attributes attr, String name, String defaultValue) {
-            String v = attr.getValue(name);
-            if (v == null)
-                v = defaultValue;
             return v;
         }
@@ -157,9 +120,9 @@
         protected  HistoryOsmPrimitive createPrimitive(Attributes atts, OsmPrimitiveType type) throws SAXException {
             long id = getMandatoryAttributeLong(atts,"id");
-            long version = getMandatoryAttributeLong(atts, "version");
-            long changesetId = getMandatoryAttributeLong(atts, "changeset");
-            boolean visible = getMandatoryAttributeBoolean(atts, "visible");
-            long uid = getAttributeLong(atts, "uid", -1);
-            String user = getAttributeString(atts, "user", tr("<anonymous>"));
+            long version = getMandatoryAttributeLong(atts,"version");
+            long changesetId = getMandatoryAttributeLong(atts,"changeset");
+            boolean visible= getMandatoryAttributeBoolean(atts, "visible");
+            long uid = getMandatoryAttributeLong(atts, "uid");
+            String user = getMandatoryAttributeString(atts, "user");
             String v = getMandatoryAttributeString(atts, "timestamp");
             Date timestamp = DateUtils.fromString(v);
@@ -169,6 +132,7 @@
                 double lon = getMandatoryAttributeDouble(atts, "lon");
                 primitive = new HistoryNode(
-                        id,version,visible,user,uid,changesetId,timestamp,lat,lon
+                        id,version,visible,user,uid,changesetId,timestamp, new LatLon(lat,lon)
                 );
+
             } else if (type.equals(OsmPrimitiveType.WAY)) {
                 primitive = new HistoryWay(
Index: /trunk/src/org/openstreetmap/josm/tools/UrlLabel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/UrlLabel.java	(revision 2242)
+++ /trunk/src/org/openstreetmap/josm/tools/UrlLabel.java	(revision 2243)
@@ -12,5 +12,12 @@
 public class UrlLabel extends JEditorPane implements HyperlinkListener {
 
-    private final String url;
+    private String url = "";
+    private String description = "";
+
+    public UrlLabel() {
+        addHyperlinkListener(this);
+        setEditable(false);
+        setOpaque(false);
+    }
 
     public UrlLabel(String url) {
@@ -19,11 +26,14 @@
 
     public UrlLabel(String url, String description) {
-        this.url = url;
+        this();
+        setUrl(url);
+        setDescription(description);
+        refresh();
+    }
+
+    protected void refresh() {
         setContentType("text/html");
         setText("<html><a href=\""+url+"\">"+description+"</a></html>");
         setToolTipText(url);
-        setEditable(false);
-        setOpaque(false);
-        addHyperlinkListener(this);
     }
 
@@ -33,3 +43,13 @@
         }
     }
+
+    public void setUrl(String url) {
+        this.url = url == null ? "" : url;
+        refresh();
+    }
+
+    public void setDescription(String description) {
+        this.description = description == null? "" : description;
+        refresh();
+    }
 }
