Index: src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManager.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManager.java	(revision 17256)
+++ src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManager.java	(working copy)
@@ -274,7 +274,7 @@
         tblChangesets.setRowSorter(new ChangesetCacheTableRowSorter(model));
         tblChangesets.addMouseListener(new MouseEventHandler());
         InputMapUtils.addEnterAction(tblChangesets, new ShowDetailAction(model));
-        model.getSelectionModel().addListSelectionListener(new ChangesetDetailViewSynchronizer(model));
+        model.getSelectionModel().addListSelectionListener(new ChangesetDetailViewSynchronizer());
 
         // activate DEL on the table
         tblChangesets.getInputMap(JComponent.WHEN_FOCUSED).put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE, 0), "removeFromCache");
@@ -283,7 +283,7 @@
         tblChangesets.setTransferHandler(new TransferHandler() {
             @Override
             public void exportToClipboard(JComponent comp, Clipboard clip, int action) {
-                List<Changeset> changesets = model.getSelectedChangesets();
+                List<Changeset> changesets = getSelectedChangesets();
                 ChangesetTransferable transferable = new ChangesetTransferable(changesets);
                 ClipboardUtils.copy(transferable);
             }
@@ -302,10 +302,10 @@
         cp.setLayout(new BorderLayout());
 
         model = buildModel();
-        actRemoveFromCacheAction = new RemoveFromCacheAction(model);
-        actCloseSelectedChangesetsAction = new CloseSelectedChangesetsAction(model);
-        actDownloadSelectedChangesets = new DownloadSelectedChangesetsAction(model);
-        actDownloadSelectedContent = new DownloadSelectedChangesetContentAction(model);
+        actRemoveFromCacheAction = new RemoveFromCacheAction();
+        actCloseSelectedChangesetsAction = new CloseSelectedChangesetsAction();
+        actDownloadSelectedChangesets = new DownloadSelectedChangesetsAction();
+        actDownloadSelectedContent = new DownloadSelectedChangesetContentAction();
         actDownloadSelectedChangesetObjects = new DownloadSelectedChangesetObjectsAction();
 
         cp.add(buildToolbarPanel(), BorderLayout.NORTH);
@@ -425,24 +425,22 @@
      * Removes the selected changesets from the local changeset cache
      *
      */
-    static class RemoveFromCacheAction extends AbstractAction implements ListSelectionListener {
-        private final ChangesetCacheManagerModel model;
+    class RemoveFromCacheAction extends AbstractAction implements ListSelectionListener {
 
-        RemoveFromCacheAction(ChangesetCacheManagerModel model) {
+        RemoveFromCacheAction() {
             putValue(NAME, tr("Remove from cache"));
             new ImageProvider("dialogs", "delete").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Remove the selected changesets from the local cache"));
-            this.model = model;
             updateEnabledState();
         }
 
         @Override
         public void actionPerformed(ActionEvent e) {
-            ChangesetCache.getInstance().remove(model.getSelectedChangesets());
+            ChangesetCache.getInstance().remove(getSelectedChangesets());
         }
 
         protected void updateEnabledState() {
-            setEnabled(model.hasSelectedChangesets());
+            setEnabled(hasSelectedChangesets());
         }
 
         @Override
@@ -456,24 +454,22 @@
      * Closes the selected changesets
      *
      */
-    static class CloseSelectedChangesetsAction extends AbstractAction implements ListSelectionListener {
-        private final ChangesetCacheManagerModel model;
+    class CloseSelectedChangesetsAction extends AbstractAction implements ListSelectionListener {
 
-        CloseSelectedChangesetsAction(ChangesetCacheManagerModel model) {
+        CloseSelectedChangesetsAction() {
             putValue(NAME, tr("Close"));
             new ImageProvider("closechangeset").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Close the selected changesets"));
-            this.model = model;
             updateEnabledState();
         }
 
         @Override
         public void actionPerformed(ActionEvent e) {
-            MainApplication.worker.submit(new CloseChangesetTask(model.getSelectedChangesets()));
+            MainApplication.worker.submit(new CloseChangesetTask(getSelectedChangesets()));
         }
 
         protected void updateEnabledState() {
-            List<Changeset> selected = model.getSelectedChangesets();
+            List<Changeset> selected = getSelectedChangesets();
             UserIdentityManager im = UserIdentityManager.getInstance();
             for (Changeset cs: selected) {
                 if (cs.isOpen()) {
@@ -501,14 +497,12 @@
      * Downloads the selected changesets
      *
      */
-    static class DownloadSelectedChangesetsAction extends AbstractAction implements ListSelectionListener {
-        private final ChangesetCacheManagerModel model;
+    class DownloadSelectedChangesetsAction extends AbstractAction implements ListSelectionListener {
 
-        DownloadSelectedChangesetsAction(ChangesetCacheManagerModel model) {
+        DownloadSelectedChangesetsAction() {
             putValue(NAME, tr("Update changeset"));
             new ImageProvider("dialogs/changeset", "updatechangeset").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Updates the selected changesets with current data from the OSM server"));
-            this.model = model;
             updateEnabledState();
         }
 
@@ -516,12 +510,12 @@
         public void actionPerformed(ActionEvent e) {
             if (!GraphicsEnvironment.isHeadless()) {
                 ChangesetCacheManager.getInstance().runDownloadTask(
-                        ChangesetHeaderDownloadTask.buildTaskForChangesets(GuiHelper.getWindowAncestorFor(e), model.getSelectedChangesets()));
+                        ChangesetHeaderDownloadTask.buildTaskForChangesets(GuiHelper.getWindowAncestorFor(e), getSelectedChangesets()));
             }
         }
 
         protected void updateEnabledState() {
-            setEnabled(model.hasSelectedChangesets() && !NetworkManager.isOffline(OnlineResource.OSM_API));
+            setEnabled(hasSelectedChangesets() && !NetworkManager.isOffline(OnlineResource.OSM_API));
         }
 
         @Override
@@ -535,14 +529,12 @@
      * Downloads the content of selected changesets from the OSM server
      *
      */
-    static class DownloadSelectedChangesetContentAction extends AbstractAction implements ListSelectionListener {
-        private final ChangesetCacheManagerModel model;
+    class DownloadSelectedChangesetContentAction extends AbstractAction implements ListSelectionListener {
 
-        DownloadSelectedChangesetContentAction(ChangesetCacheManagerModel model) {
+        DownloadSelectedChangesetContentAction() {
             putValue(NAME, tr("Download changeset content"));
             new ImageProvider("dialogs/changeset", "downloadchangesetcontent").getResource().attachImageIcon(this);
             putValue(SHORT_DESCRIPTION, tr("Download the content of the selected changesets from the server"));
-            this.model = model;
             updateEnabledState();
         }
 
@@ -549,13 +541,15 @@
         @Override
         public void actionPerformed(ActionEvent e) {
             if (!GraphicsEnvironment.isHeadless()) {
+                Set<Integer> selectedIds = getSelectedChangesets().stream().map(Changeset::getId).collect(Collectors.toSet());
+
                 ChangesetCacheManager.getInstance().runDownloadTask(
-                        new ChangesetContentDownloadTask(GuiHelper.getWindowAncestorFor(e), model.getSelectedChangesetIds()));
+                        new ChangesetContentDownloadTask(GuiHelper.getWindowAncestorFor(e), selectedIds));
             }
         }
 
         protected void updateEnabledState() {
-            setEnabled(model.hasSelectedChangesets() && !NetworkManager.isOffline(OnlineResource.OSM_API));
+            setEnabled(hasSelectedChangesets() && !NetworkManager.isOffline(OnlineResource.OSM_API));
         }
 
         @Override
@@ -580,10 +574,10 @@
         @Override
         public void actionPerformed(ActionEvent e) {
             if (!GraphicsEnvironment.isHeadless()) {
-                if (model.getSelectedChangesets().stream().anyMatch(cs -> !cs.hasContent() || cs.isOpen()))
+                if (getSelectedChangesets().stream().anyMatch(cs -> !cs.hasContent() || cs.isOpen()))
                     actDownloadSelectedContent.actionPerformed(e);
                 MainApplication.worker.submit(() -> {
-                    final List<PrimitiveId> primitiveIds = model.getSelectedChangesets().stream()
+                    final List<PrimitiveId> primitiveIds = getSelectedChangesets().stream()
                             .map(Changeset::getContent)
                             .filter(Objects::nonNull)
                             .flatMap(content -> content.getIds().stream())
@@ -595,7 +589,7 @@
         }
 
         protected void updateEnabledState() {
-            setEnabled(model.hasSelectedChangesets() && !NetworkManager.isOffline(OnlineResource.OSM_API));
+            setEnabled(hasSelectedChangesets() && !NetworkManager.isOffline(OnlineResource.OSM_API));
         }
 
         @Override
@@ -605,7 +599,7 @@
         }
     }
 
-    static class ShowDetailAction extends AbstractAction {
+    class ShowDetailAction extends AbstractAction {
         private final ChangesetCacheManagerModel model;
 
         ShowDetailAction(ChangesetCacheManagerModel model) {
@@ -613,7 +607,7 @@
         }
 
         protected void showDetails() {
-            List<Changeset> selected = model.getSelectedChangesets();
+            List<Changeset> selected = getSelectedChangesets();
             if (selected.size() == 1) {
                 model.setChangesetInDetailView(selected.get(0));
             }
@@ -685,19 +679,14 @@
         }
     }
 
-    static class ChangesetDetailViewSynchronizer implements ListSelectionListener {
-        private final ChangesetCacheManagerModel model;
+    class ChangesetDetailViewSynchronizer implements ListSelectionListener {
 
-        ChangesetDetailViewSynchronizer(ChangesetCacheManagerModel model) {
-            this.model = model;
-        }
-
         @Override
         public void valueChanged(ListSelectionEvent e) {
             if (e != null && e.getValueIsAdjusting())
                 return;
 
-            List<Changeset> selected = model.getSelectedChangesets();
+            List<Changeset> selected = getSelectedChangesets();
             if (selected.size() == 1) {
                 model.setChangesetInDetailView(selected.get(0));
             } else {
@@ -716,6 +705,25 @@
     }
 
     /**
+     * Replies true if there is at least one selected changeset
+     *
+     * @return true if there is at least one selected changeset
+     */
+    public boolean hasSelectedChangesets() {
+        return tblChangesets != null && tblChangesets.getSelectedRowCount() >= 0;
+    }
+
+    /**
+     * Replies the list of selected changesets
+     *
+     * @return the list of selected changesets
+     */
+    public List<Changeset> getSelectedChangesets() {
+        return model.getSelectedChangesets(tblChangesets);
+    }
+
+
+    /**
      * Selects the changesets  in <code>changests</code>, provided the
      * respective changesets are already present in the local changeset cache.
      *
Index: src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManagerModel.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManagerModel.java	(revision 17256)
+++ src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManagerModel.java	(working copy)
@@ -4,14 +4,16 @@
 import java.beans.PropertyChangeListener;
 import java.beans.PropertyChangeSupport;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
 import java.util.Comparator;
 import java.util.List;
-import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
 import javax.swing.DefaultListSelectionModel;
+import javax.swing.JTable;
 import javax.swing.table.AbstractTableModel;
 
 import org.openstreetmap.josm.data.osm.Changeset;
@@ -73,40 +75,21 @@
     }
 
     /**
-     * Replies true if there is at least one selected changeset
-     *
-     * @return true if there is at least one selected changeset
-     */
-    public boolean hasSelectedChangesets() {
-        return selectionModel.getMinSelectionIndex() >= 0;
-    }
-
-    /**
      * Replies the list of selected changesets
+     * @param table the JTable used with this model
      *
      * @return the list of selected changesets
      */
-    public List<Changeset> getSelectedChangesets() {
-        List<Changeset> ret = new ArrayList<>();
-        for (int i = 0; i < data.size(); i++) {
-            Changeset cs = data.get(i);
-            if (selectionModel.isSelectedIndex(i)) {
-                ret.add(cs);
-            }
-        }
-        return ret;
+    public List<Changeset> getSelectedChangesets(JTable table) {
+        if (table == null)
+            return Collections.emptyList();
+        int[] selection = table.getSelectedRows();
+        return Arrays.stream(selection)
+                .mapToObj(i -> data.get(table.convertRowIndexToModel(i)))
+                .collect(Collectors.toList());
     }
 
     /**
-     * Replies a set of ids of the selected changesets
-     *
-     * @return a set of ids of the selected changesets
-     */
-    public Set<Integer> getSelectedChangesetIds() {
-        return getSelectedChangesets().stream().map(Changeset::getId).collect(Collectors.toSet());
-    }
-
-    /**
      * Selects the changesets in <code>selected</code>.
      *
      * @param selected the collection of changesets to select. Ignored if empty.
@@ -136,12 +119,10 @@
      */
     public void init() {
         ChangesetCache cc = ChangesetCache.getInstance();
-        List<Changeset> selected = getSelectedChangesets();
         data.clear();
         data.addAll(cc.getChangesets());
         sort();
         fireTableDataChanged();
-        setSelectedChangesets(selected);
 
         cc.addChangesetCacheListener(this);
     }
@@ -170,7 +151,6 @@
     /* ------------------------------------------------------------------------------ */
     @Override
     public void changesetCacheUpdated(ChangesetCacheEvent event) {
-        List<Changeset> selected = getSelectedChangesets();
         data.addAll(event.getAddedChangesets());
         data.removeAll(event.getRemovedChangesets());
         for (Changeset cs: event.getUpdatedChangesets()) {
@@ -185,7 +165,6 @@
         GuiHelper.runInEDT(() -> {
             sort();
             fireTableDataChanged();
-            setSelectedChangesets(selected);
         });
     }
 }
