Index: src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java	(revision 4437)
+++ src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java	(working copy)
@@ -20,11 +20,12 @@
 import java.util.concurrent.Future;
 
 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;
 import javax.swing.SwingUtilities;
@@ -50,6 +51,7 @@
 import org.openstreetmap.josm.gui.dialogs.changeset.ChangesetsInActiveDataLayerListModel;
 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;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -82,6 +84,8 @@
     private ShowChangesetInfoAction showChangesetInfoAction;
     private CloseOpenChangesetsAction closeChangesetAction;
     private LaunchChangesetManagerAction launchChangesetManagerAction;
+    
+    private ChangesetDialogPopup popupMenu;
 
     protected void buildChangesetsLists() {
         DefaultListSelectionModel selectionModel = new DefaultListSelectionModel();
@@ -187,32 +191,24 @@
         // -- select objects action
         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[] {
             new SideButton(selectObjectsAction, false),
@@ -535,14 +531,13 @@
                     lst.getSelectionModel().addSelectionInterval(idx, idx);
                 }
             }
-            ChangesetDialogPopup popup = new ChangesetDialogPopup();
-            popup.show(lst, evt.getX(), evt.getY());
-
+            popupMenu.show(lst, evt.getX(), evt.getY());
         }
     }
 
-    class ChangesetDialogPopup extends JPopupMenu {
-        public ChangesetDialogPopup() {
+    class ChangesetDialogPopup extends ListPopupMenu {
+        public ChangesetDialogPopup(JList ... lists) {
+            super(lists);
             add(selectObjectsAction);
             addSeparator();
             add(readChangesetAction);
@@ -551,4 +546,12 @@
             add(showChangesetInfoAction);
         }
     }
+
+    public void addPopupMenuSeparator() {
+        popupMenu.addSeparator();
+    }
+
+    public JMenuItem addPopupMenuAction(Action a) {
+        return popupMenu.add(a);
+    }
 }
Index: src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 4437)
+++ src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(working copy)
@@ -4,7 +4,6 @@
 import static org.openstreetmap.josm.gui.help.HelpUtil.ht;
 import static org.openstreetmap.josm.tools.I18n.tr;
 
-import java.awt.BorderLayout;
 import java.awt.Point;
 import java.awt.event.ActionEvent;
 import java.awt.event.KeyEvent;
@@ -21,9 +20,10 @@
 
 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;
 import javax.swing.SwingUtilities;
@@ -55,6 +55,7 @@
 import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
 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;
 
@@ -141,7 +142,7 @@
         displaylist.getInputMap().put(KeyStroke.getKeyStroke(KeyEvent.VK_DELETE,0), "deleteRelation");
         displaylist.getActionMap().put("deleteRelation", deleteAction);
 
-        popupMenu = new RelationDialogPopupMenu();
+        popupMenu = new RelationDialogPopupMenu(displaylist);
     }
 
     @Override public void showNotify() {
@@ -776,46 +777,39 @@
         }
     }
 
-    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();
 
             // -- 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);
+            add(new SelectAction(false));
+            add(new SelectAction(true));
         }
+    }
 
-        public RelationDialogPopupMenu() {
-            build();
-        }
+    public void addPopupMenuSeparator() {
+        popupMenu.addSeparator();
+    }
+
+    public JMenuItem addPopupMenuAction(Action a) {
+        return popupMenu.add(a);
     }
 
     /* ---------------------------------------------------------------------------------- */
Index: src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
===================================================================
--- src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 4437)
+++ src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(working copy)
@@ -23,6 +23,7 @@
 
 import javax.swing.AbstractAction;
 import javax.swing.AbstractListModel;
+import javax.swing.Action;
 import javax.swing.DefaultListSelectionModel;
 import javax.swing.JList;
 import javax.swing.JMenuItem;
@@ -66,6 +67,7 @@
 import org.openstreetmap.josm.gui.dialogs.relation.DownloadRelationMemberTask;
 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;
 import org.openstreetmap.josm.tools.Shortcut;
@@ -86,6 +88,8 @@
     private EditRelationSelection actEditRelationSelection;
     private DownloadSelectedIncompleteMembersAction actDownloadSelectedIncompleteMembers;
 
+    private SelectionPopup popupMenu;
+
     /**
      * Builds the content panel for this dialog
      */
@@ -133,19 +137,14 @@
         model.addListDataListener(actZoomToJOSMSelection);
 
         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);
     }
 
     @Override
@@ -189,7 +188,6 @@
      * The popup menu launcher
      */
     class SelectionPopupMenuLauncher extends PopupMenuLauncher {
-        private SelectionPopup popup = new SelectionPopup();
 
         @Override
         public void launch(MouseEvent evt) {
@@ -198,15 +196,16 @@
                 if (idx < 0) return;
                 model.setSelected(Collections.singleton((OsmPrimitive)model.getElementAt(idx)));
             }
-            popup.show(lstPrimitives, evt.getX(), evt.getY());
+            popupMenu.show(lstPrimitives, evt.getX(), evt.getY());
         }
     }
 
     /**
      * 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);
             addSeparator();
@@ -217,6 +216,14 @@
         }
     }
 
+    public void addPopupMenuSeparator() {
+        popupMenu.addSeparator();
+    }
+
+    public JMenuItem addPopupMenuAction(Action a) {
+        return popupMenu.add(a);
+    }
+
     /**
      * Updates the dialog title with a summary of the current JOSM selection
      */
Index: src/org/openstreetmap/josm/gui/widgets/ListPopupMenu.java
===================================================================
--- src/org/openstreetmap/josm/gui/widgets/ListPopupMenu.java	(revision 0)
+++ src/org/openstreetmap/josm/gui/widgets/ListPopupMenu.java	(revision 0)
@@ -0,0 +1,37 @@
+// 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);
+    }
+}
