Index: trunk/src/org/openstreetmap/josm/actions/AbstractInfoAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/AbstractInfoAction.java	(revision 2043)
+++ trunk/src/org/openstreetmap/josm/actions/AbstractInfoAction.java	(revision 2044)
@@ -32,5 +32,5 @@
      * @return the base URL, i.e. http://api.openstreetmap.org/browse
      */
-    protected String getBaseBrowseUrl() {
+    static public String getBaseBrowseUrl() {
         String baseUrl = Main.pref.get("osm-server.url", "http://api.openstreetmap.org/api");
         Pattern pattern = Pattern.compile("/api/?$");
@@ -51,5 +51,5 @@
      * @return the base URL, i.e. http://ww.openstreetmap.org/user
      */
-    protected String getBaseUserUrl() {
+    static public String getBaseUserUrl() {
         String baseUrl = Main.pref.get("osm-server.url", "http://api.openstreetmap.org/api");
         Pattern pattern = Pattern.compile("/api/?$");
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 2043)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/relation/GenericRelationEditor.java	(revision 2044)
@@ -11,6 +11,4 @@
 import java.awt.Insets;
 import java.awt.event.ActionEvent;
-import java.awt.event.ComponentAdapter;
-import java.awt.event.ComponentEvent;
 import java.awt.event.FocusAdapter;
 import java.awt.event.FocusEvent;
Index: trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java	(revision 2043)
+++ trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserModel.java	(revision 2044)
@@ -296,4 +296,8 @@
             return p.equals(reference);
         }
+
+        public HistoryOsmPrimitive getPrimitive(int row) {
+            return history.get(row);
+        }
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java	(revision 2043)
+++ trunk/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java	(revision 2044)
@@ -5,4 +5,6 @@
 
 import java.awt.BorderLayout;
+import java.awt.event.ActionEvent;
+import java.awt.event.MouseEvent;
 import java.text.SimpleDateFormat;
 import java.util.Observable;
@@ -12,5 +14,7 @@
 import javax.swing.JPanel;
 
+import org.openstreetmap.josm.actions.AbstractInfoAction;
 import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
+import org.openstreetmap.josm.tools.ImageProvider;
 
 /**
@@ -42,9 +46,11 @@
         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></html>",
+                "<html>Version <strong>{0}</strong> created on <strong>{1}</strong> by <strong>{2}</strong> in changeset <strong>{3}</strong>",
                 Long.toString(primitive.getVersion()),
                 new SimpleDateFormat().format(primitive.getTimestamp()),
-                primitive.getUser()
+                primitive.getUser(),
+                primitive.getChangesetId()
         );
         return text;
Index: trunk/src/org/openstreetmap/josm/gui/history/VersionTable.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/VersionTable.java	(revision 2043)
+++ trunk/src/org/openstreetmap/josm/gui/history/VersionTable.java	(revision 2044)
@@ -2,4 +2,7 @@
 package org.openstreetmap.josm.gui.history;
 
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.event.ActionEvent;
 import java.awt.event.MouseAdapter;
 import java.awt.event.MouseEvent;
@@ -9,8 +12,13 @@
 
 import javax.swing.DefaultListSelectionModel;
+import javax.swing.JPopupMenu;
 import javax.swing.JTable;
 import javax.swing.ListSelectionModel;
 import javax.swing.event.ListSelectionEvent;
 import javax.swing.event.ListSelectionListener;
+
+import org.openstreetmap.josm.actions.AbstractInfoAction;
+import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
+import org.openstreetmap.josm.tools.ImageProvider;
 
 /**
@@ -22,4 +30,5 @@
 
     private static Logger logger = Logger.getLogger(VersionTable.class.getName());
+    private VersionTablePopupMenu popupMenu;
 
     protected void build() {
@@ -27,4 +36,6 @@
         addMouseListener(new MouseHandler());
         getSelectionModel().addListSelectionListener(new SelectionHandler());
+        popupMenu = new VersionTablePopupMenu();
+        addMouseListener(new PopupMenuTrigger());
     }
 
@@ -36,12 +47,12 @@
 
     protected void handleSelectReferencePointInTime(int row) {
-        getVesionTableModel().setReferencePointInTime(row);
+        getVersionTableModel().setReferencePointInTime(row);
     }
 
     protected void handleSelectCurrentPointInTime(int row) {
-        getVesionTableModel().setCurrentPointInTime(row);
+        getVersionTableModel().setCurrentPointInTime(row);
     }
 
-    protected HistoryBrowserModel.VersionTableModel getVesionTableModel() {
+    protected HistoryBrowserModel.VersionTableModel getVersionTableModel() {
         return (HistoryBrowserModel.VersionTableModel) getModel();
     }
@@ -73,3 +84,78 @@
         repaint();
     }
+
+    protected void showPopupMenu(MouseEvent evt) {
+        HistoryBrowserModel.VersionTableModel model = getVersionTableModel();
+        int row = getSelectedRow();
+        if (row == -1) {
+            row = rowAtPoint(evt.getPoint());
+        }
+        HistoryOsmPrimitive primitive = model.getPrimitive(row);
+        popupMenu.prepare(primitive);
+        popupMenu.show(evt.getComponent(), evt.getX(), evt.getY());
+    }
+
+    class PopupMenuTrigger extends MouseAdapter {
+        @Override
+        public void mousePressed(MouseEvent e) {
+            showPopup(e);
+        }
+        @Override
+        public void mouseReleased(MouseEvent e) {
+            showPopup(e);
+        }
+        private void showPopup(MouseEvent e) {
+            if (e.isPopupTrigger()) {
+                showPopupMenu(e);
+            }
+        }
+    }
+
+    class ChangesetInfoAction extends AbstractInfoAction {
+        private HistoryOsmPrimitive primitive;
+
+        public ChangesetInfoAction() {
+            putValue(NAME, tr("Changeset info"));
+            putValue(SHORT_DESCRIPTION, tr("Launch browser with information about the changeset"));
+            putValue(SMALL_ICON, ImageProvider.get("about"));
+        }
+
+        @Override
+        protected String createInfoUrl(Object infoObject) {
+            HistoryOsmPrimitive primitive = (HistoryOsmPrimitive) infoObject;
+            return getBaseBrowseUrl() + "/changeset/" + primitive.getChangesetId();
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            if (!isEnabled())
+                return;
+            String url = createInfoUrl(primitive);
+            launchBrowser(url);
+        }
+
+        public void prepare(HistoryOsmPrimitive primitive) {
+            putValue(NAME, tr("Show changeset {0}", primitive.getChangesetId()));
+            this.primitive = primitive;
+        }
+    }
+
+    class VersionTablePopupMenu extends JPopupMenu {
+
+        private ChangesetInfoAction changesetInfoAction;
+
+        protected void build() {
+            changesetInfoAction = new ChangesetInfoAction();
+            add(changesetInfoAction);
+        }
+        public VersionTablePopupMenu() {
+            super();
+            build();
+        }
+
+        public void prepare(HistoryOsmPrimitive primitive) {
+            changesetInfoAction.prepare(primitive);
+            invalidate();
+        }
+    }
 }
