Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDetailPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDetailPanel.java	(revision 12870)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDetailPanel.java	(revision 12871)
@@ -23,4 +23,5 @@
 import javax.swing.AbstractAction;
 import javax.swing.BorderFactory;
+import javax.swing.JButton;
 import javax.swing.JLabel;
 import javax.swing.JOptionPane;
@@ -38,4 +39,5 @@
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.help.HelpUtil;
+import org.openstreetmap.josm.gui.history.OpenChangesetPopupMenu;
 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
@@ -63,4 +65,5 @@
     private final JosmTextField tfClosedOn  = new JosmTextField(20);
 
+    private final OpenChangesetPopupMenuAction   actOpenChangesetPopupMenu   = new OpenChangesetPopupMenuAction();
     private final DownloadChangesetContentAction actDownloadChangesetContent = new DownloadChangesetContentAction(this);
     private final UpdateChangesetAction          actUpdateChangesets         = new UpdateChangesetAction();
@@ -69,4 +72,6 @@
     private final ZoomInCurrentLayerAction       actZoomInCurrentLayerAction = new ZoomInCurrentLayerAction();
     // CHECKSTYLE.ON: SingleSpaceSeparator
+    
+    private JButton btnOpenChangesetPopupMenu;
 
     private transient Changeset currentChangeset;
@@ -77,4 +82,8 @@
         JToolBar tb = new JToolBar(JToolBar.VERTICAL);
         tb.setFloatable(false);
+
+        // -- display changeset
+        btnOpenChangesetPopupMenu = tb.add(actOpenChangesetPopupMenu);
+        actOpenChangesetPopupMenu.initProperties(currentChangeset);
 
         // -- remove from cache action
@@ -259,4 +268,5 @@
             updateView(cs);
         }
+        actOpenChangesetPopupMenu.initProperties(currentChangeset);
         actDownloadChangesetContent.initProperties();
         actUpdateChangesets.initProperties(currentChangeset);
@@ -322,4 +332,24 @@
         public void initProperties(Changeset cs) {
             setEnabled(cs != null && !Main.isOffline(OnlineResource.OSM_API));
+        }
+    }
+
+    /**
+     * The action for opening {@link OpenChangesetPopupMenu}
+     */
+    class OpenChangesetPopupMenuAction extends AbstractAction {
+        OpenChangesetPopupMenuAction() {
+            putValue(NAME, tr("View changeset"));
+            new ImageProvider("help/internet").getResource().attachImageIcon(this);
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent evt) {
+            if (currentChangeset != null)
+                new OpenChangesetPopupMenu(currentChangeset.getId()).show(btnOpenChangesetPopupMenu);
+        }
+
+        void initProperties(Changeset cs) {
+            setEnabled(cs != null);
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/history/OpenChangesetPopupMenu.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/OpenChangesetPopupMenu.java	(revision 12871)
+++ trunk/src/org/openstreetmap/josm/gui/history/OpenChangesetPopupMenu.java	(revision 12871)
@@ -0,0 +1,100 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.history;
+
+import static org.openstreetmap.josm.tools.I18n.tr;
+
+import java.awt.Rectangle;
+import java.awt.event.ActionEvent;
+import java.text.MessageFormat;
+import java.util.Arrays;
+import java.util.List;
+
+import javax.swing.AbstractAction;
+import javax.swing.Action;
+import javax.swing.JComponent;
+import javax.swing.JPopupMenu;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.StructUtils;
+import org.openstreetmap.josm.data.StructUtils.StructEntry;
+import org.openstreetmap.josm.spi.preferences.Config;
+import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.OpenBrowser;
+
+/**
+ * A menu displaying links to external history viewers for a changeset.
+ *
+ * @since 12871
+ */
+public class OpenChangesetPopupMenu extends JPopupMenu {
+
+    /**
+     * Constructs a new {@code OpenChangesetPopupMenu} for the given changeset id.
+     *
+     * @param changesetId the changeset id
+     */
+    public OpenChangesetPopupMenu(final long changesetId) {
+        StructUtils.getListOfStructs(Config.getPref(), "history-dialog.tools", DEFAULT_ENTRIES, ChangesetViewerEntry.class)
+                .stream()
+                .map(entry -> entry.toAction(changesetId))
+                .forEach(this::add);
+    }
+
+    /**
+     * Displays the popup menu at the lower-left corner of {@code parent}.
+     *
+     * @param parent the parent component to use for positioning this menu
+     */
+    public void show(final JComponent parent) {
+        final Rectangle r = parent.getBounds();
+        show(parent.getParent(), r.x, r.y + r.height);
+    }
+
+    private static final List<ChangesetViewerEntry> DEFAULT_ENTRIES = Arrays.asList(
+            new ChangesetViewerEntry(tr("View changeset in web browser"), Main.getBaseBrowseUrl() + "/changeset/{0}"),
+            new ChangesetViewerEntry(tr("Open {0}", "OSM History Viewer"), "http://osmhv.openstreetmap.de/changeset.jsp?id={0}"),
+            new ChangesetViewerEntry(tr("Open {0}", "achavi (Augmented OSM Change Viewer)"), "https://overpass-api.de/achavi/?changeset={0}")
+    );
+
+    /**
+     * Auxiliary class to save a link to a history viewer in the preferences.
+     */
+    public static class ChangesetViewerEntry {
+        @StructEntry
+        public String name;
+        @StructEntry
+        public String url;
+
+        /**
+         * Constructs a new {@code ChangesetViewerEntry}.
+         */
+        public ChangesetViewerEntry() {
+        }
+
+        ChangesetViewerEntry(String name, String url) {
+            this.name = name;
+            this.url = url;
+        }
+
+        Action toAction(final long changesetId) {
+            final String url = MessageFormat.format(this.url, Long.toString(changesetId));
+            return new OpenBrowserAction(name, url);
+        }
+    }
+
+    static class OpenBrowserAction extends AbstractAction {
+        final String url;
+
+        OpenBrowserAction(String name, String url) {
+            super(name);
+            putValue(SHORT_DESCRIPTION, tr("Open {0}", url));
+            new ImageProvider("help/internet").getResource().attachImageIcon(this, true);
+            this.url = url;
+        }
+
+        @Override
+        public void actionPerformed(ActionEvent e) {
+            OpenBrowser.displayUrl(url);
+        }
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java	(revision 12870)
+++ trunk/src/org/openstreetmap/josm/gui/history/VersionInfoPanel.java	(revision 12871)
@@ -16,4 +16,5 @@
 
 import javax.swing.AbstractAction;
+import javax.swing.AbstractButton;
 import javax.swing.JButton;
 import javax.swing.JComponent;
@@ -23,4 +24,5 @@
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
+import javax.swing.plaf.basic.BasicArrowButton;
 
 import org.openstreetmap.josm.Main;
@@ -109,6 +111,16 @@
         pnlUserAndChangeset.add(lblUser, GBC.eol().insets(5, 0, 0, 0).weight(1, 0));
 
+        final JPanel changesetPanel = new JPanel(new BorderLayout());
         changesetButton.setMargin(new Insets(0, 0, 0, 2));
-        pnlUserAndChangeset.add(changesetButton, GBC.std().fill().weight(0, 0));
+        changesetPanel.add(changesetButton, BorderLayout.CENTER);
+        final BasicArrowButton arrowButton = new BasicArrowButton(BasicArrowButton.SOUTH);
+        arrowButton.addActionListener(action -> {
+            final OpenChangesetPopupMenu popupMenu = new OpenChangesetPopupMenu(changesetDialogAction.id);
+            popupMenu.insert(changesetDialogAction, 0);
+            ((AbstractButton) popupMenu.getComponent(0)).setText(tr("Open Changeset Manager"));
+            popupMenu.show(arrowButton);
+        });
+        changesetPanel.add(arrowButton, BorderLayout.EAST);
+        pnlUserAndChangeset.add(changesetPanel, GBC.std().fill().weight(0, 0));
 
         lblChangeset = new UrlLabel("", 2);
