Index: org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
===================================================================
--- org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 4054)
+++ org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(working copy)
@@ -131,6 +131,7 @@
         pnl.add(selectButton);
         BasicArrowButton selectionHistoryMenuButton = createArrowButton(selectButton);
         selectionHistoryMenuButton.addActionListener(new ActionListener() {
+            @Override
             public void actionPerformed(ActionEvent e) {
                 SelectionHistoryPopup.launch(selectButton, model.getSelectionHistory());
             }
@@ -142,6 +143,7 @@
 
         BasicArrowButton searchHistoryMenuButton = createArrowButton(searchButton);
         searchHistoryMenuButton.addActionListener(new ActionListener() {
+            @Override
             public void actionPerformed(ActionEvent e) {
                 SearchPopupMenu.launch(searchButton);
             }
@@ -282,14 +284,17 @@
             setTitle(model.getJOSMSelectionSummary());
         }
 
+        @Override
         public void contentsChanged(ListDataEvent e) {
             updateTitle();
         }
 
+        @Override
         public void intervalAdded(ListDataEvent e) {
             updateTitle();
         }
 
+        @Override
         public void intervalRemoved(ListDataEvent e) {
             updateTitle();
         }
@@ -306,6 +311,7 @@
             updateEnabledState();
         }
 
+        @Override
         public void actionPerformed(ActionEvent e) {
             if (!isEnabled()) return;
             org.openstreetmap.josm.actions.search.SearchAction.search();
@@ -315,6 +321,7 @@
             setEnabled(Main.main != null && Main.main.getEditLayer() != null);
         }
 
+        @Override
         public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
             updateEnabledState();
         }
@@ -332,6 +339,7 @@
             updateEnabledState();
         }
 
+        @Override
         public void actionPerformed(ActionEvent e) {
             Collection<OsmPrimitive> sel = model.getSelected();
             if (sel.isEmpty())return;
@@ -343,6 +351,7 @@
             setEnabled(!model.getSelected().isEmpty());
         }
 
+        @Override
         public void valueChanged(ListSelectionEvent e) {
             updateEnabledState();
         }
@@ -361,6 +370,7 @@
             updateEnabledState();
         }
 
+        @Override
         public void actionPerformed(ActionEvent e) {
             AutoScaleAction.autoScale("selection");
         }
@@ -369,14 +379,17 @@
             setEnabled(model.getSize() > 0);
         }
 
+        @Override
         public void contentsChanged(ListDataEvent e) {
             updateEnabledState();
         }
 
+        @Override
         public void intervalAdded(ListDataEvent e) {
             updateEnabledState();
         }
 
+        @Override
         public void intervalRemoved(ListDataEvent e) {
             updateEnabledState();
         }
@@ -395,6 +408,7 @@
             updateEnabledState();
         }
 
+        @Override
         public void actionPerformed(ActionEvent e) {
             BoundingXYVisitor box = new BoundingXYVisitor();
             Collection<OsmPrimitive> sel = model.getSelected();
@@ -410,6 +424,7 @@
             setEnabled(!model.getSelected().isEmpty());
         }
 
+        @Override
         public void valueChanged(ListSelectionEvent e) {
             updateEnabledState();
         }
@@ -455,6 +470,7 @@
             updateEnabledState();
         }
 
+        @Override
         public void actionPerformed(ActionEvent e) {
             Relation relation = (Relation)model.getSelected().toArray()[0];
             Main.map.relationListDialog.selectRelation(relation);
@@ -465,6 +481,7 @@
             setEnabled(sel.length == 1 && sel[0] instanceof Relation);
         }
 
+        @Override
         public void valueChanged(ListSelectionEvent e) {
             updateEnabledState();
         }
@@ -481,7 +498,8 @@
 
         private static final int SELECTION_HISTORY_SIZE = 10;
 
-        private final LinkedList<Collection<? extends OsmPrimitive>> history = new LinkedList<Collection<? extends OsmPrimitive>>();
+        // Variable to store history from currentDataSet()
+        private LinkedList<Collection<? extends OsmPrimitive>> history;
         private final List<OsmPrimitive> selection = new ArrayList<OsmPrimitive>();
         private DefaultListSelectionModel selectionModel;
 
@@ -552,10 +570,12 @@
             history.clear();
         }
 
+        @Override
         public Object getElementAt(int index) {
             return selection.get(index);
         }
 
+        @Override
         public int getSize() {
             return selection.size();
         }
@@ -686,6 +706,7 @@
         /* ------------------------------------------------------------------------ */
         /* interface EditLayerChangeListener                                        */
         /* ------------------------------------------------------------------------ */
+        @Override
         public void editLayerChanged(OsmDataLayer oldLayer, OsmDataLayer newLayer) {
             if (newLayer == null) {
                 setJOSMSelection(null);
@@ -697,6 +718,7 @@
         /* ------------------------------------------------------------------------ */
         /* interface SelectionChangeListener                                        */
         /* ------------------------------------------------------------------------ */
+        @Override
         public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
             setJOSMSelection(newSelection);
         }
@@ -704,37 +726,46 @@
         /* ------------------------------------------------------------------------ */
         /* interface DataSetListener                                                */
         /* ------------------------------------------------------------------------ */
+        @Override
         public void dataChanged(DataChangedEvent event) {
+            history = event.getDataset().getSelectionHistory();
             // refresh the whole list
             fireContentsChanged(this, 0, getSize());
         }
 
+        @Override
         public void nodeMoved(NodeMovedEvent event) {
             // may influence the display name of primitives, update the data
             update(event.getPrimitives());
         }
 
+        @Override
         public void otherDatasetChange(AbstractDatasetChangedEvent event) {
             // may influence the display name of primitives, update the data
             update(event.getPrimitives());
         }
 
+        @Override
         public void relationMembersChanged(RelationMembersChangedEvent event) {
             // may influence the display name of primitives, update the data
             update(event.getPrimitives());
         }
 
+        @Override
         public void tagsChanged(TagsChangedEvent event) {
             // may influence the display name of primitives, update the data
             update(event.getPrimitives());
         }
 
+        @Override
         public void wayNodesChanged(WayNodesChangedEvent event) {
             // may influence the display name of primitives, update the data
             update(event.getPrimitives());
         }
 
+        @Override
         public void primtivesAdded(PrimitivesAddedEvent event) {/* ignored - handled by SelectionChangeListener */}
+        @Override
         public void primtivesRemoved(PrimitivesRemovedEvent event) {/* ignored - handled by SelectionChangeListener*/}
     }
 
@@ -752,6 +783,7 @@
             addActionListener(this);
         }
 
+        @Override
         public void actionPerformed(ActionEvent e) {
             org.openstreetmap.josm.actions.search.SearchAction.searchWithoutHistory(s);
         }
@@ -827,6 +859,7 @@
             addActionListener(this);
         }
 
+        @Override
         public void actionPerformed(ActionEvent e) {
             Main.main.getCurrentDataSet().setSelected(sel);
         }
@@ -871,6 +904,7 @@
             return ret;
         }
 
+        @Override
         public void actionPerformed(ActionEvent e) {
             if (!isEnabled())
                 return;
@@ -887,6 +921,7 @@
             setEnabled(!model.getSelectedRelationsWithIncompleteMembers().isEmpty());
         }
 
+        @Override
         public void valueChanged(ListSelectionEvent e) {
             updateEnabledState();
         }
@@ -910,6 +945,7 @@
             setEnabled(!model.getSelected().isEmpty());
         }
 
+        @Override
         public void valueChanged(ListSelectionEvent e) {
             updateEnabledState();
         }
@@ -953,6 +989,7 @@
             return -1;
         }
 
+        @Override
         public int compare(OsmPrimitive a, OsmPrimitive b) {
             if (a.getType().equals(b.getType()))
                 return compareName(a, b);
@@ -981,6 +1018,7 @@
             return -1;
         }
 
+        @Override
         public int compare(OsmPrimitive a, OsmPrimitive b) {
             if (a.getType().equals(b.getType()))
                 return compareId(a, b);
Index: org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- org/openstreetmap/josm/data/osm/DataSet.java	(revision 4054)
+++ org/openstreetmap/josm/data/osm/DataSet.java	(working copy)
@@ -95,10 +95,12 @@
 
     private static class IdHash implements Hash<PrimitiveId,OsmPrimitive> {
 
+        @Override
         public int getHashCode(PrimitiveId k) {
             return (int)k.getUniqueId() ^ k.getType().hashCode();
         }
 
+        @Override
         public boolean equals(PrimitiveId key, OsmPrimitive value) {
             if (key == null || value == null) return false;
             return key.getUniqueId() == value.getUniqueId() && key.getType() == value.getType();
@@ -133,6 +135,18 @@
     }
 
     /**
+     * History of selections - shared by plugins and SelectionListDialog
+     */
+    private final LinkedList<Collection<? extends OsmPrimitive>> selectionHistory = new LinkedList<Collection<? extends OsmPrimitive>>();
+
+    /**
+     * Gets history of selections
+     */
+    public LinkedList<Collection<? extends OsmPrimitive>> getSelectionHistory() {
+        return selectionHistory;
+    } 
+
+    /**
      * Maintain a list of used tags for autocompletion
      */
     private AutoCompletionManager autocomplete;
