Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java	(revision 4458)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java	(revision 4459)
@@ -21,9 +21,10 @@
 
 import javax.swing.AbstractAction;
+import javax.swing.Action;
 import javax.swing.DefaultListSelectionModel;
 import javax.swing.JCheckBox;
 import javax.swing.JList;
+import javax.swing.JMenuItem;
 import javax.swing.JPanel;
-import javax.swing.JPopupMenu;
 import javax.swing.JScrollPane;
 import javax.swing.ListSelectionModel;
@@ -51,4 +52,5 @@
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.io.CloseChangesetTask;
+import org.openstreetmap.josm.gui.widgets.ListPopupMenu;
 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
 import org.openstreetmap.josm.tools.BugReportExceptionHandler;
@@ -83,4 +85,6 @@
     private CloseOpenChangesetsAction closeChangesetAction;
     private LaunchChangesetManagerAction launchChangesetManagerAction;
+    
+    private ChangesetDialogPopup popupMenu;
 
     protected void buildChangesetsLists() {
@@ -188,30 +192,22 @@
         selectObjectsAction = new SelectObjectsAction();
         cbInSelectionOnly.addItemListener(selectObjectsAction);
-        lstInActiveDataLayer.getSelectionModel().addListSelectionListener(selectObjectsAction);
-        lstInSelection.getSelectionModel().addListSelectionListener(selectObjectsAction);
 
         // -- read changesets action
         readChangesetAction = new ReadChangesetsAction();
         cbInSelectionOnly.addItemListener(readChangesetAction);
-        lstInActiveDataLayer.getSelectionModel().addListSelectionListener(readChangesetAction);
-        lstInSelection.getSelectionModel().addListSelectionListener(readChangesetAction);
 
         // -- close changesets action
         closeChangesetAction = new CloseOpenChangesetsAction();
         cbInSelectionOnly.addItemListener(closeChangesetAction);
-        lstInActiveDataLayer.getSelectionModel().addListSelectionListener(closeChangesetAction);
-        lstInSelection.getSelectionModel().addListSelectionListener(closeChangesetAction);
 
         // -- show info action
         showChangesetInfoAction = new ShowChangesetInfoAction();
         cbInSelectionOnly.addItemListener(showChangesetInfoAction);
-        lstInActiveDataLayer.getSelectionModel().addListSelectionListener(showChangesetInfoAction);
-        lstInSelection.getSelectionModel().addListSelectionListener(showChangesetInfoAction);
 
         // -- launch changeset manager action
         launchChangesetManagerAction = new LaunchChangesetManagerAction();
         cbInSelectionOnly.addItemListener(launchChangesetManagerAction);
-        lstInActiveDataLayer.getSelectionModel().addListSelectionListener(launchChangesetManagerAction);
-        lstInSelection.getSelectionModel().addListSelectionListener(launchChangesetManagerAction);
+        
+        popupMenu = new ChangesetDialogPopup(lstInActiveDataLayer, lstInSelection);
 
         createLayout(pnl, false, Arrays.asList(new SideButton[] {
@@ -536,12 +532,11 @@
                 }
             }
-            ChangesetDialogPopup popup = new ChangesetDialogPopup();
-            popup.show(lst, evt.getX(), evt.getY());
-
-        }
-    }
-
-    class ChangesetDialogPopup extends JPopupMenu {
-        public ChangesetDialogPopup() {
+            popupMenu.show(lst, evt.getX(), evt.getY());
+        }
+    }
+
+    class ChangesetDialogPopup extends ListPopupMenu {
+        public ChangesetDialogPopup(JList ... lists) {
+            super(lists);
             add(selectObjectsAction);
             addSeparator();
@@ -552,3 +547,11 @@
         }
     }
+
+    public void addPopupMenuSeparator() {
+        popupMenu.addSeparator();
+    }
+
+    public JMenuItem addPopupMenuAction(Action a) {
+        return popupMenu.add(a);
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 4458)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 4459)
@@ -5,5 +5,4 @@
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import java.awt.BorderLayout;
 import java.awt.Point;
 import java.awt.event.ActionEvent;
@@ -22,7 +21,8 @@
 import javax.swing.AbstractAction;
 import javax.swing.AbstractListModel;
+import javax.swing.Action;
 import javax.swing.DefaultListSelectionModel;
 import javax.swing.JList;
-import javax.swing.JPopupMenu;
+import javax.swing.JMenuItem;
 import javax.swing.KeyStroke;
 import javax.swing.ListSelectionModel;
@@ -56,4 +56,5 @@
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.widgets.ListPopupMenu;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -142,5 +143,5 @@
         displaylist.getActionMap().put("deleteRelation", deleteAction);
 
-        popupMenu = new RelationDialogPopupMenu();
+        popupMenu = new RelationDialogPopupMenu(displaylist);
     }
 
@@ -777,17 +778,16 @@
     }
 
-    class RelationDialogPopupMenu extends JPopupMenu {
-        protected void build() {
+    class RelationDialogPopupMenu extends ListPopupMenu {
+
+        public RelationDialogPopupMenu(JList list) {
+            super(list);
+            
             // -- download members action
             //
-            DownloadMembersAction downloadMembersAction = new DownloadMembersAction();
-            displaylist.addListSelectionListener(downloadMembersAction);
-            add(downloadMembersAction);
+            add(new DownloadMembersAction());
 
             // -- download incomplete members action
             //
-            DownloadSelectedIncompleteMembersAction downloadSelectedIncompleteMembers = new DownloadSelectedIncompleteMembersAction();
-            displaylist.addListSelectionListener(downloadSelectedIncompleteMembers);
-            add(downloadSelectedIncompleteMembers);
+            add(new DownloadSelectedIncompleteMembersAction());
 
             addSeparator();
@@ -795,26 +795,20 @@
             // -- select members action
             //
-            SelectMembersAction selectMembersAction = new SelectMembersAction(false);
-            displaylist.addListSelectionListener(selectMembersAction);
-            add(selectMembersAction);
-
-            selectMembersAction = new SelectMembersAction(true);
-            displaylist.addListSelectionListener(selectMembersAction);
-            add(selectMembersAction);
+            add(new SelectMembersAction(false));
+            add(new SelectMembersAction(true));
 
             // -- select action
             //
-            SelectAction selectAction = new SelectAction(false);
-            displaylist.addListSelectionListener(selectAction);
-            add(selectAction);
-
-            selectAction = new SelectAction(true);
-            displaylist.addListSelectionListener(selectAction);
-            add(selectAction);
-        }
-
-        public RelationDialogPopupMenu() {
-            build();
-        }
+            add(new SelectAction(false));
+            add(new SelectAction(true));
+        }
+    }
+
+    public void addPopupMenuSeparator() {
+        popupMenu.addSeparator();
+    }
+
+    public JMenuItem addPopupMenuAction(Action a) {
+        return popupMenu.add(a);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 4458)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 4459)
@@ -24,4 +24,5 @@
 import javax.swing.AbstractAction;
 import javax.swing.AbstractListModel;
+import javax.swing.Action;
 import javax.swing.DefaultListSelectionModel;
 import javax.swing.JList;
@@ -67,4 +68,5 @@
 import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
+import org.openstreetmap.josm.gui.widgets.ListPopupMenu;
 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -86,4 +88,6 @@
     private EditRelationSelection actEditRelationSelection;
     private DownloadSelectedIncompleteMembersAction actDownloadSelectedIncompleteMembers;
+
+    private SelectionPopup popupMenu;
 
     /**
@@ -134,17 +138,12 @@
 
         actZoomToListSelection = new ZoomToListSelection();
-        lstPrimitives.getSelectionModel().addListSelectionListener(actZoomToListSelection);
-
         actSetRelationSelection = new SetRelationSelection();
-        lstPrimitives.getSelectionModel().addListSelectionListener(actSetRelationSelection);
-
         actEditRelationSelection = new EditRelationSelection();
-        lstPrimitives.getSelectionModel().addListSelectionListener(actEditRelationSelection);
-
         actDownloadSelectedIncompleteMembers = new DownloadSelectedIncompleteMembersAction();
-        lstPrimitives.getSelectionModel().addListSelectionListener(actDownloadSelectedIncompleteMembers);
 
         lstPrimitives.addMouseListener(new SelectionPopupMenuLauncher());
         lstPrimitives.addMouseListener(new DblClickHandler());
+        
+        popupMenu = new SelectionPopup(lstPrimitives);
     }
 
@@ -190,5 +189,4 @@
      */
     class SelectionPopupMenuLauncher extends PopupMenuLauncher {
-        private SelectionPopup popup = new SelectionPopup();
 
         @Override
@@ -199,5 +197,5 @@
                 model.setSelected(Collections.singleton((OsmPrimitive)model.getElementAt(idx)));
             }
-            popup.show(lstPrimitives, evt.getX(), evt.getY());
+            popupMenu.show(lstPrimitives, evt.getX(), evt.getY());
         }
     }
@@ -206,6 +204,7 @@
      * The popup menu for the selection list
      */
-    class SelectionPopup extends JPopupMenu {
-        public SelectionPopup() {
+    class SelectionPopup extends ListPopupMenu {
+        public SelectionPopup(JList list) {
+            super(list);
             add(actZoomToJOSMSelection);
             add(actZoomToListSelection);
@@ -216,4 +215,12 @@
             add(actDownloadSelectedIncompleteMembers);
         }
+    }
+
+    public void addPopupMenuSeparator() {
+        popupMenu.addSeparator();
+    }
+
+    public JMenuItem addPopupMenuAction(Action a) {
+        return popupMenu.add(a);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/widgets/ListPopupMenu.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/widgets/ListPopupMenu.java	(revision 4459)
+++ trunk/src/org/openstreetmap/josm/gui/widgets/ListPopupMenu.java	(revision 4459)
@@ -0,0 +1,34 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.widgets;
+
+import javax.swing.Action;
+import javax.swing.JList;
+import javax.swing.JMenuItem;
+import javax.swing.JPopupMenu;
+import javax.swing.event.ListSelectionListener;
+
+/**
+ * @author Vincent
+ *
+ */
+public class ListPopupMenu extends JPopupMenu {
+    
+    private JList[] lists;
+
+    public ListPopupMenu(JList ... lists) {
+        this.lists = lists;
+    }
+
+    /* (non-Javadoc)
+     * @see javax.swing.JPopupMenu#add(javax.swing.Action)
+     */
+    @Override
+    public JMenuItem add(Action a) {
+        if (lists != null && a instanceof ListSelectionListener) {
+            for (JList list : lists) {
+                list.addListSelectionListener((ListSelectionListener) a);
+            }
+        }
+        return super.add(a);
+    }
+}
