Index: trunk/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java	(revision 13956)
+++ trunk/src/org/openstreetmap/josm/actions/CreateMultipolygonAction.java	(revision 13957)
@@ -168,5 +168,7 @@
             } else if (multipolygonRelation.hasIncompleteMembers()) {
                 MainApplication.worker.submit(new DownloadRelationMemberTask(multipolygonRelation,
-                        DownloadSelectedIncompleteMembersAction.buildSetOfIncompleteMembers(Collections.singleton(multipolygonRelation)),
+                        Utils.filteredCollection(
+                            DownloadSelectedIncompleteMembersAction.buildSetOfIncompleteMembers(
+                                    Collections.singleton(multipolygonRelation)), OsmPrimitive.class),
                         editLayer));
             }
Index: trunk/src/org/openstreetmap/josm/actions/IPrimitiveAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/IPrimitiveAction.java	(revision 13957)
+++ trunk/src/org/openstreetmap/josm/actions/IPrimitiveAction.java	(revision 13957)
@@ -0,0 +1,21 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.actions;
+
+import java.util.Collection;
+
+import javax.swing.Action;
+
+import org.openstreetmap.josm.data.osm.IPrimitive;
+
+/**
+ * Interface used to enable/disable all primitive-related actions, even those registered by plugins.
+ * @since 13957
+ */
+public interface IPrimitiveAction extends Action {
+
+    /**
+     * Specifies the working set of primitives.
+     * @param primitives The new working set of primitives. Can be null or empty
+     */
+    void setPrimitives(Collection<? extends IPrimitive> primitives);
+}
Index: trunk/src/org/openstreetmap/josm/actions/OsmPrimitiveAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/OsmPrimitiveAction.java	(revision 13956)
+++ trunk/src/org/openstreetmap/josm/actions/OsmPrimitiveAction.java	(revision 13957)
@@ -11,5 +11,7 @@
  * Interface used to enable/disable all primitive-related actions, even those registered by plugins.
  * @since 5821
+ * @deprecated Use {@link IPrimitiveAction} instead
  */
+@Deprecated
 public interface OsmPrimitiveAction extends Action {
 
Index: trunk/src/org/openstreetmap/josm/actions/relation/AbstractRelationAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/relation/AbstractRelationAction.java	(revision 13956)
+++ trunk/src/org/openstreetmap/josm/actions/relation/AbstractRelationAction.java	(revision 13957)
@@ -8,9 +8,9 @@
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.actions.OsmPrimitiveAction;
-import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.actions.IPrimitiveAction;
 import org.openstreetmap.josm.data.osm.DownloadPolicy;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.IPrimitive;
+import org.openstreetmap.josm.data.osm.IRelation;
+import org.openstreetmap.josm.data.osm.OsmData;
 import org.openstreetmap.josm.io.OnlineResource;
 import org.openstreetmap.josm.tools.SubclassFilteredCollection;
@@ -20,8 +20,9 @@
  * to be disabled if the collection is empty
  * @since 5793
+ * @since 13957 (signature)
  */
-public abstract class AbstractRelationAction extends AbstractAction implements OsmPrimitiveAction {
+public abstract class AbstractRelationAction extends AbstractAction implements IPrimitiveAction {
     /** relation collection */
-    protected transient Collection<Relation> relations = Collections.<Relation>emptySet();
+    protected transient Collection<IRelation<?>> relations = Collections.<IRelation<?>>emptySet();
 
     /**
@@ -30,14 +31,14 @@
      * @return the relation contained in {@code primitives}
      */
-    protected static final Collection<Relation> getRelations(Collection<? extends OsmPrimitive> primitives) {
+    protected static final Collection<IRelation<?>> getRelations(Collection<? extends IPrimitive> primitives) {
         if (primitives == null || primitives.isEmpty()) {
-            return Collections.<Relation>emptySet();
+            return Collections.<IRelation<?>>emptySet();
         } else {
-            return new SubclassFilteredCollection<>(primitives, Relation.class::isInstance);
+            return new SubclassFilteredCollection<>(primitives, IRelation.class::isInstance);
         }
     }
 
     @Override
-    public void setPrimitives(Collection<? extends OsmPrimitive> primitives) {
+    public void setPrimitives(Collection<? extends IPrimitive> primitives) {
         this.relations = getRelations(primitives);
         updateEnabledState();
@@ -55,5 +56,5 @@
             return false;
         }
-        DataSet ds = relations.iterator().next().getDataSet();
+        OsmData<?, ?, ?, ?> ds = relations.iterator().next().getDataSet();
         return !Main.isOffline(OnlineResource.OSM_API)
             && ds != null && !ds.isLocked() && !DownloadPolicy.BLOCKED.equals(ds.getDownloadPolicy());
Index: trunk/src/org/openstreetmap/josm/actions/relation/AddSelectionToRelations.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/relation/AddSelectionToRelations.java	(revision 13956)
+++ trunk/src/org/openstreetmap/josm/actions/relation/AddSelectionToRelations.java	(revision 13957)
@@ -14,6 +14,6 @@
 import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.osm.DataSelectionListener;
-import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.IPrimitive;
+import org.openstreetmap.josm.data.osm.OsmData;
 import org.openstreetmap.josm.data.osm.OsmUtils;
 import org.openstreetmap.josm.data.osm.Relation;
@@ -23,4 +23,5 @@
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -40,5 +41,5 @@
     public void actionPerformed(ActionEvent e) {
         Collection<Command> cmds = new LinkedList<>();
-        for (Relation orig : relations) {
+        for (Relation orig : Utils.filteredCollection(relations, Relation.class)) {
             Command c = GenericRelationEditor.addPrimitivesToRelation(orig, MainApplication.getLayerManager().getActiveDataSet().getSelected());
             if (c != null) {
@@ -61,5 +62,5 @@
         int size = relations.size();
         putValue(NAME, trn("Add selection to {0} relation", "Add selection to {0} relations", size, size));
-        DataSet ds = MainApplication.getLayerManager().getActiveDataSet();
+        OsmData<?, ?, ?, ?> ds = MainApplication.getLayerManager().getActiveData();
         if (ds != null) {
             selectionChanged(ds.getSelected());
@@ -69,5 +70,5 @@
     }
 
-    private void selectionChanged(final Collection<? extends OsmPrimitive> newSelection) {
+    private void selectionChanged(final Collection<? extends IPrimitive> newSelection) {
         GuiHelper.runInEDT(() -> setEnabled(newSelection != null && !newSelection.isEmpty()
                 && OsmUtils.isOsmCollectionEditable(relations)));
Index: trunk/src/org/openstreetmap/josm/actions/relation/DeleteRelationsAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/relation/DeleteRelationsAction.java	(revision 13956)
+++ trunk/src/org/openstreetmap/josm/actions/relation/DeleteRelationsAction.java	(revision 13957)
@@ -14,4 +14,5 @@
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -46,5 +47,5 @@
         if (!isEnabled())
             return;
-        deleteRelation(relations);
+        deleteRelation(Utils.filteredCollection(relations, Relation.class));
     }
 
Index: trunk/src/org/openstreetmap/josm/actions/relation/DownloadMembersAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/relation/DownloadMembersAction.java	(revision 13956)
+++ trunk/src/org/openstreetmap/josm/actions/relation/DownloadMembersAction.java	(revision 13957)
@@ -8,9 +8,11 @@
 import java.util.Collection;
 
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.IPrimitive;
+import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.dialogs.relation.DownloadRelationTask;
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.SubclassFilteredCollection;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -33,9 +35,10 @@
     public void actionPerformed(ActionEvent e) {
         if (!isEnabled() || relations.isEmpty() || !MainApplication.isDisplayingMapView()) return;
-        MainApplication.worker.submit(new DownloadRelationTask(relations, MainApplication.getLayerManager().getEditLayer()));
+        MainApplication.worker.submit(new DownloadRelationTask(
+                Utils.filteredCollection(relations, Relation.class), MainApplication.getLayerManager().getEditLayer()));
     }
 
     @Override
-    public void setPrimitives(Collection<? extends OsmPrimitive> primitives) {
+    public void setPrimitives(Collection<? extends IPrimitive> primitives) {
         // selected non-new relations
         this.relations = SubclassFilteredCollection.filter(getRelations(primitives), r -> !r.isNew());
Index: trunk/src/org/openstreetmap/josm/actions/relation/DownloadSelectedIncompleteMembersAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/relation/DownloadSelectedIncompleteMembersAction.java	(revision 13956)
+++ trunk/src/org/openstreetmap/josm/actions/relation/DownloadSelectedIncompleteMembersAction.java	(revision 13957)
@@ -9,4 +9,6 @@
 import java.util.Set;
 
+import org.openstreetmap.josm.data.osm.IPrimitive;
+import org.openstreetmap.josm.data.osm.IRelation;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
@@ -15,4 +17,5 @@
 import org.openstreetmap.josm.tools.ImageProvider;
 import org.openstreetmap.josm.tools.SubclassFilteredCollection;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -22,5 +25,5 @@
 public class DownloadSelectedIncompleteMembersAction extends AbstractRelationAction {
 
-    private transient Collection<OsmPrimitive> incompleteMembers;
+    private transient Collection<IPrimitive> incompleteMembers;
 
     /**
@@ -38,7 +41,7 @@
      * @return The set of incomplete members of the given relations.
      */
-    public static Set<OsmPrimitive> buildSetOfIncompleteMembers(Collection<Relation> rels) {
-        Set<OsmPrimitive> ret = new HashSet<>();
-        for (Relation r : rels) {
+    public static Set<IPrimitive> buildSetOfIncompleteMembers(Collection<IRelation<?>> rels) {
+        Set<IPrimitive> ret = new HashSet<>();
+        for (IRelation<?> r : rels) {
             ret.addAll(SubclassFilteredCollection.filter(r.getIncompleteMembers(), osm -> !osm.isNew()));
         }
@@ -50,13 +53,13 @@
         if (!isEnabled() || relations.isEmpty() || !MainApplication.isDisplayingMapView()) return;
         MainApplication.worker.submit(new DownloadRelationMemberTask(
-                relations,
-                incompleteMembers,
+                Utils.filteredCollection(relations, Relation.class),
+                Utils.filteredCollection(incompleteMembers, OsmPrimitive.class),
                 MainApplication.getLayerManager().getEditLayer()));
     }
 
     @Override
-    public void setPrimitives(Collection<? extends OsmPrimitive> primitives) {
+    public void setPrimitives(Collection<? extends IPrimitive> primitives) {
         // selected relations with incomplete members
-        this.relations = SubclassFilteredCollection.filter(getRelations(primitives), Relation::hasIncompleteMembers);
+        this.relations = SubclassFilteredCollection.filter(getRelations(primitives), IRelation::hasIncompleteMembers);
         this.incompleteMembers = buildSetOfIncompleteMembers(relations);
         updateEnabledState();
Index: trunk/src/org/openstreetmap/josm/actions/relation/DuplicateRelationAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/relation/DuplicateRelationAction.java	(revision 13956)
+++ trunk/src/org/openstreetmap/josm/actions/relation/DuplicateRelationAction.java	(revision 13957)
@@ -6,4 +6,5 @@
 import java.awt.event.ActionEvent;
 
+import org.openstreetmap.josm.data.osm.IRelation;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.gui.MainApplication;
@@ -45,6 +46,8 @@
         if (!isEnabled() || relations.isEmpty())
             return;
-        Relation r = relations.iterator().next();
-        duplicateRelationAndLaunchEditor(r);
+        IRelation<?> r = relations.iterator().next();
+        if (r instanceof Relation) {
+            duplicateRelationAndLaunchEditor((Relation) r);
+        }
     }
 
@@ -52,5 +55,7 @@
     protected void updateEnabledState() {
         // only one selected relation can be edited
-        setEnabled(relations.size() == 1 && !relations.iterator().next().getDataSet().isLocked());
+        setEnabled(relations.size() == 1
+                && relations.iterator().next() instanceof Relation
+                && !relations.iterator().next().getDataSet().isLocked());
     }
 }
Index: trunk/src/org/openstreetmap/josm/actions/relation/EditRelationAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/relation/EditRelationAction.java	(revision 13956)
+++ trunk/src/org/openstreetmap/josm/actions/relation/EditRelationAction.java	(revision 13957)
@@ -13,4 +13,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.IRelation;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmUtils;
@@ -22,4 +23,6 @@
 import org.openstreetmap.josm.spi.preferences.Config;
 import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.SubclassFilteredCollection;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -71,15 +74,16 @@
     @Override
     public void actionPerformed(ActionEvent e) {
-        if (!isEnabled() || relations.isEmpty()) return;
-        if (relations.size() > Config.getPref().getInt("warn.open.maxrelations", 5) &&
+        SubclassFilteredCollection<IRelation<?>, Relation> filteredRelations = Utils.filteredCollection(relations, Relation.class);
+        if (!isEnabled() || filteredRelations.isEmpty()) return;
+        if (filteredRelations.size() > Config.getPref().getInt("warn.open.maxrelations", 5) &&
             /* I18N english text for value 1 makes no real sense, never called for values <= maxrel (usually 5) */
             JOptionPane.OK_OPTION != JOptionPane.showConfirmDialog(Main.parent,
                     "<html>"+trn("You are about to open <b>{0}</b> different relation editor simultaneously.<br/>Do you want to continue?",
                             "You are about to open <b>{0}</b> different relation editors simultaneously.<br/>Do you want to continue?",
-                            relations.size(), relations.size())+"</html>",
+                            filteredRelations.size(), filteredRelations.size())+"</html>",
                     tr("Confirmation"), JOptionPane.OK_CANCEL_OPTION, JOptionPane.WARNING_MESSAGE)) {
             return;
         }
-        for (Relation r : relations) {
+        for (Relation r : filteredRelations) {
             launchEditor(r);
         }
@@ -89,6 +93,7 @@
     protected void updateEnabledState() {
         boolean enabled = false;
-        if (OsmUtils.isOsmCollectionEditable(relations)) {
-            for (Relation r : relations) {
+        SubclassFilteredCollection<IRelation<?>, Relation> filteredRelations = Utils.filteredCollection(relations, Relation.class);
+        if (OsmUtils.isOsmCollectionEditable(filteredRelations)) {
+            for (Relation r : filteredRelations) {
                 if (!r.isDeleted()) {
                     enabled = true;
Index: trunk/src/org/openstreetmap/josm/actions/relation/ExportRelationToGpxAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/relation/ExportRelationToGpxAction.java	(revision 13956)
+++ trunk/src/org/openstreetmap/josm/actions/relation/ExportRelationToGpxAction.java	(revision 13957)
@@ -23,10 +23,10 @@
 
 import org.openstreetmap.josm.actions.GpxExportAction;
-import org.openstreetmap.josm.actions.OsmPrimitiveAction;
+import org.openstreetmap.josm.actions.IPrimitiveAction;
 import org.openstreetmap.josm.data.gpx.GpxData;
 import org.openstreetmap.josm.data.gpx.ImmutableGpxTrack;
 import org.openstreetmap.josm.data.gpx.WayPoint;
+import org.openstreetmap.josm.data.osm.IPrimitive;
 import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
@@ -47,5 +47,5 @@
  */
 public class ExportRelationToGpxAction extends GpxExportAction
-    implements OsmPrimitiveAction {
+    implements IPrimitiveAction {
 
     /** Enumeration of export variants */
@@ -235,5 +235,5 @@
 
     @Override
-    public void setPrimitives(Collection<? extends OsmPrimitive> primitives) {
+    public void setPrimitives(Collection<? extends IPrimitive> primitives) {
         relations = Collections.<Relation>emptySet();
         if (primitives != null && !primitives.isEmpty()) {
Index: trunk/src/org/openstreetmap/josm/actions/relation/SelectMembersAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/relation/SelectMembersAction.java	(revision 13956)
+++ trunk/src/org/openstreetmap/josm/actions/relation/SelectMembersAction.java	(revision 13957)
@@ -8,6 +8,6 @@
 import java.util.Set;
 
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.IPrimitive;
+import org.openstreetmap.josm.data.osm.IRelation;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -38,12 +38,12 @@
         if (!isEnabled() || relations.isEmpty() || !MainApplication.isDisplayingMapView()) return;
 
-        Set<OsmPrimitive> members = new HashSet<>();
-        for (Relation r: relations) {
+        Set<IPrimitive> members = new HashSet<>();
+        for (IRelation<?> r: relations) {
             members.addAll(r.getMemberPrimitivesList());
         }
         if (add) {
-            MainApplication.getLayerManager().getActiveDataSet().addSelected(members);
+            MainApplication.getLayerManager().getActiveData().addSelected(members);
         } else {
-            MainApplication.getLayerManager().getActiveDataSet().setSelected(members);
+            MainApplication.getLayerManager().getActiveData().setSelected(members);
         }
     }
Index: trunk/src/org/openstreetmap/josm/actions/relation/SelectRelationAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/relation/SelectRelationAction.java	(revision 13956)
+++ trunk/src/org/openstreetmap/josm/actions/relation/SelectRelationAction.java	(revision 13957)
@@ -6,5 +6,5 @@
 import java.awt.event.ActionEvent;
 
-import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmData;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -34,5 +34,5 @@
     public void actionPerformed(ActionEvent e) {
         if (!isEnabled() || relations.isEmpty()) return;
-        DataSet ds = MainApplication.getLayerManager().getActiveDataSet();
+        OsmData<?, ?, ?, ?> ds = MainApplication.getLayerManager().getActiveData();
         if (ds == null) return;
         if (add) {
Index: trunk/src/org/openstreetmap/josm/data/osm/IRelation.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/IRelation.java	(revision 13956)
+++ trunk/src/org/openstreetmap/josm/data/osm/IRelation.java	(revision 13957)
@@ -2,5 +2,10 @@
 package org.openstreetmap.josm.data.osm;
 
+import java.util.Collection;
+import java.util.HashSet;
 import java.util.List;
+import java.util.Set;
+
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -93,3 +98,29 @@
         return "multipolygon".equals(get("type")) || isBoundary();
     }
+
+    /**
+     * Returns an unmodifiable list of the {@link OsmPrimitive}s referred to by at least one member of this relation.
+     * @return an unmodifiable list of the primitives
+     * @since 13957
+     */
+    default List<? extends IPrimitive> getMemberPrimitivesList() {
+        return Utils.transform(getMembers(), IRelationMember::getMember);
+    }
+
+    /**
+     * Replies a collection with the incomplete children this relation refers to.
+     *
+     * @return the incomplete children. Empty collection if no children are incomplete.
+     * @since 13957
+     */
+    default Collection<? extends IPrimitive> getIncompleteMembers() {
+        Set<IPrimitive> ret = new HashSet<>();
+        for (M rm : getMembers()) {
+            if (!rm.getMember().isIncomplete()) {
+                continue;
+            }
+            ret.add(rm.getMember());
+        }
+        return ret;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/data/osm/OsmUtils.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/OsmUtils.java	(revision 13956)
+++ trunk/src/org/openstreetmap/josm/data/osm/OsmUtils.java	(revision 13957)
@@ -162,8 +162,9 @@
      * @return {@code true} if the given collection is not empty and does not contain any primitive in a locked layer.
      * @since 13611
+     * @since 13957 (signature)
      */
-    public static boolean isOsmCollectionEditable(Collection<? extends OsmPrimitive> collection) {
+    public static boolean isOsmCollectionEditable(Collection<? extends IPrimitive> collection) {
         return collection != null && !collection.isEmpty()
-            && collection.stream().map(OsmPrimitive::getDataSet).filter(Objects::nonNull).noneMatch(DataSet::isLocked);
+            && collection.stream().map(IPrimitive::getDataSet).filter(Objects::nonNull).noneMatch(OsmData::isLocked);
     }
 }
Index: trunk/src/org/openstreetmap/josm/data/osm/Relation.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 13956)
+++ trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 13957)
@@ -405,4 +405,5 @@
      * @return an unmodifiable list of the primitives
      */
+    @Override
     public List<OsmPrimitive> getMemberPrimitivesList() {
         return Utils.transform(getMembers(), RelationMember::getMember);
@@ -505,4 +506,5 @@
      * @return the incomplete children. Empty collection if no children are incomplete.
      */
+    @Override
     public Collection<OsmPrimitive> getIncompleteMembers() {
         Set<OsmPrimitive> ret = new HashSet<>();
Index: trunk/src/org/openstreetmap/josm/gui/PopupMenuHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/PopupMenuHandler.java	(revision 13956)
+++ trunk/src/org/openstreetmap/josm/gui/PopupMenuHandler.java	(revision 13957)
@@ -13,6 +13,6 @@
 import javax.swing.event.PopupMenuListener;
 
-import org.openstreetmap.josm.actions.OsmPrimitiveAction;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.actions.IPrimitiveAction;
+import org.openstreetmap.josm.data.osm.IPrimitive;
 
 /**
@@ -23,5 +23,5 @@
 
     // Set of enabled osm primitives actions
-    private final Set<OsmPrimitiveAction> primitiveActions = new HashSet<>();
+    private final Set<IPrimitiveAction> primitiveActions = new HashSet<>();
     // Managed menu
     private final JPopupMenu menu;
@@ -53,6 +53,6 @@
     public JMenuItem addAction(Action a) {
         if (a != null) {
-            if (a instanceof OsmPrimitiveAction) {
-                primitiveActions.add((OsmPrimitiveAction) a);
+            if (a instanceof IPrimitiveAction) {
+                primitiveActions.add((IPrimitiveAction) a);
             }
             return menu.add(a);
@@ -69,5 +69,5 @@
     public void removeAction(Action a) {
         if (a != null) {
-            if (a instanceof OsmPrimitiveAction) {
+            if (a instanceof IPrimitiveAction) {
                 primitiveActions.remove(a);
             }
@@ -106,6 +106,7 @@
      * @return All primitive actions that have been added.
      * @see #addAction(Action)
+     * @since 13957 (signature)
      */
-    public Collection<OsmPrimitiveAction> getPrimitiveActions() {
+    public Collection<IPrimitiveAction> getPrimitiveActions() {
         return Collections.unmodifiableCollection(primitiveActions);
     }
@@ -114,8 +115,9 @@
      * Specifies the working set of primitives for all primitive actions.
      * @param primitives The new working set of primitives. Can be null or empty
-     * @see OsmPrimitiveAction#setPrimitives
+     * @see IPrimitiveAction#setPrimitives
+     * @since 13957 (signature)
      */
-    public void setPrimitives(Collection<? extends OsmPrimitive> primitives) {
-        for (OsmPrimitiveAction action : primitiveActions) {
+    public void setPrimitives(Collection<? extends IPrimitive> primitives) {
+        for (IPrimitiveAction action : primitiveActions) {
             action.setPrimitives(primitives);
         }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 13956)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 13957)
@@ -35,5 +35,5 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.actions.ExpertToggleAction;
-import org.openstreetmap.josm.actions.OsmPrimitiveAction;
+import org.openstreetmap.josm.actions.IPrimitiveAction;
 import org.openstreetmap.josm.actions.relation.AddSelectionToRelations;
 import org.openstreetmap.josm.actions.relation.DeleteRelationsAction;
@@ -50,4 +50,6 @@
 import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
 import org.openstreetmap.josm.data.osm.IPrimitive;
+import org.openstreetmap.josm.data.osm.IRelation;
+import org.openstreetmap.josm.data.osm.OsmData;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
@@ -72,5 +74,4 @@
 import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
-import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.layer.LayerManager.LayerAddEvent;
 import org.openstreetmap.josm.gui.layer.LayerManager.LayerChangeListener;
@@ -79,5 +80,4 @@
 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeEvent;
 import org.openstreetmap.josm.gui.layer.MainLayerManager.ActiveLayerChangeListener;
-import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.util.HighlightHelper;
 import org.openstreetmap.josm.gui.widgets.CompileSearchTextDecorator;
@@ -90,4 +90,5 @@
 import org.openstreetmap.josm.tools.Shortcut;
 import org.openstreetmap.josm.tools.SubclassFilteredCollection;
+import org.openstreetmap.josm.tools.Utils;
 
 /**
@@ -100,5 +101,5 @@
         implements DataSetListener, NavigatableComponent.ZoomChangeListener, ExpertToggleAction.ExpertModeChangeListener {
     /** The display list. */
-    private final JList<Relation> displaylist;
+    private final JList<IRelation<?>> displaylist;
     /** the list model used */
     private final RelationListModel model;
@@ -222,5 +223,5 @@
     // inform all actions about list of relations they need
     private void updateActionsRelationLists() {
-        List<Relation> sel = model.getSelectedRelations();
+        List<IRelation<?>> sel = model.getSelectedRelations();
         popupMenuHandler.setPrimitives(sel);
 
@@ -228,5 +229,6 @@
 
         //update highlights
-        if (highlightEnabled && focused == displaylist && MainApplication.isDisplayingMapView() && highlightHelper.highlightOnly(sel)) {
+        if (highlightEnabled && focused == displaylist && MainApplication.isDisplayingMapView()
+                && highlightHelper.highlightOnly(Utils.filteredCollection(sel, Relation.class))) {
             MainApplication.getMap().mapView.repaint();
         }
@@ -261,18 +263,18 @@
 
     /**
-     * Initializes the relation list dialog from a layer. If <code>layer</code> is null
-     * or if it isn't an {@link OsmDataLayer} the dialog is reset to an empty dialog.
+     * Initializes the relation list dialog from a dataset. If <code>data</code> is null
+     * the dialog is reset to an empty dialog.
      * Otherwise it is initialized with the list of non-deleted and visible relations
-     * in the layer's dataset.
+     * in the dataset.
      *
-     * @param layer the layer. May be null.
-     */
-    protected void initFromLayer(Layer layer) {
-        if (!(layer instanceof OsmDataLayer)) {
+     * @param data the dataset. May be null.
+     * @since 13957
+     */
+    protected void initFromData(OsmData<?, ?, ?, ?> data) {
+        if (data == null) {
             model.setRelations(null);
             return;
         }
-        OsmDataLayer l = (OsmDataLayer) layer;
-        model.setRelations(l.data.getRelations());
+        model.setRelations(data.getRelations());
         model.updateTitle();
         updateActionsRelationLists();
@@ -282,5 +284,5 @@
      * @return The selected relation in the list
      */
-    private Relation getSelected() {
+    private IRelation<?> getSelected() {
         if (model.getSize() == 1) {
             displaylist.setSelectedIndex(0);
@@ -301,6 +303,7 @@
      * Selects the relations in the list of relations.
      * @param relations  the relations to be selected
-     */
-    public void selectRelations(Collection<Relation> relations) {
+     * @since 13957 (signature)
+     */
+    public void selectRelations(Collection<? extends IRelation<?>> relations) {
         if (relations == null || relations.isEmpty()) {
             model.setSelectedRelations(null);
@@ -348,5 +351,8 @@
 
         protected void editCurrentRelation() {
-            EditRelationAction.launchEditor(getSelected());
+            IRelation<?> rel = getSelected();
+            if (rel instanceof Relation) {
+                EditRelationAction.launchEditor((Relation) rel);
+            }
         }
 
@@ -412,7 +418,7 @@
      * The list model for the list of relations displayed in the relation list dialog.
      */
-    private class RelationListModel extends AbstractListModel<Relation> {
-        private final transient List<Relation> relations = new ArrayList<>();
-        private transient List<Relation> filteredRelations;
+    private class RelationListModel extends AbstractListModel<IRelation<?>> {
+        private final transient List<IRelation<?>> relations = new ArrayList<>();
+        private transient List<IRelation<?>> filteredRelations;
         private final DefaultListSelectionModel selectionModel;
         private transient SearchCompiler.Match filter;
@@ -439,10 +445,10 @@
         }
 
-        private boolean isValid(Relation r) {
+        private boolean isValid(IRelation<?> r) {
             return !r.isDeleted() && !r.isIncomplete();
         }
 
-        public void setRelations(Collection<Relation> relations) {
-            List<Relation> sel = getSelectedRelations();
+        public void setRelations(Collection<? extends IRelation<?>> relations) {
+            List<IRelation<?>> sel = getSelectedRelations();
             this.relations.clear();
             this.filteredRelations = null;
@@ -452,5 +458,5 @@
                 return;
             }
-            for (Relation r: relations) {
+            for (IRelation<?> r: relations) {
                 if (isValid(r)) {
                     this.relations.add(r);
@@ -487,5 +493,5 @@
             }
             if (added) {
-                List<Relation> sel = getSelectedRelations();
+                List<IRelation<?>> sel = getSelectedRelations();
                 sort();
                 updateFilteredRelations();
@@ -520,5 +526,5 @@
             }
             if (size != relations.size()) {
-                List<Relation> sel = getSelectedRelations();
+                List<IRelation<?>> sel = getSelectedRelations();
                 sort();
                 fireContentsChanged(this, 0, getSize());
@@ -538,5 +544,5 @@
             this.filter = filter;
             updateFilteredRelations();
-            List<Relation> sel = getSelectedRelations();
+            List<IRelation<?>> sel = getSelectedRelations();
             fireContentsChanged(this, 0, getSize());
             setSelectedRelations(sel);
@@ -544,9 +550,9 @@
         }
 
-        private List<Relation> getVisibleRelations() {
+        private List<IRelation<?>> getVisibleRelations() {
             return filteredRelations == null ? relations : filteredRelations;
         }
 
-        private Relation getVisibleRelation(int index) {
+        private IRelation<?> getVisibleRelation(int index) {
             if (index < 0 || index >= getVisibleRelations().size()) return null;
             return getVisibleRelations().get(index);
@@ -554,5 +560,5 @@
 
         @Override
-        public Relation getElementAt(int index) {
+        public IRelation<?> getElementAt(int index) {
             return getVisibleRelation(index);
         }
@@ -568,7 +574,8 @@
          *
          * @return the list of selected, non-new relations.
+         * @since 13957 (signature)
          */
-        public List<Relation> getSelectedRelations() {
-            List<Relation> ret = new ArrayList<>();
+        public List<IRelation<?>> getSelectedRelations() {
+            List<IRelation<?>> ret = new ArrayList<>();
             for (int i = 0; i < getSize(); i++) {
                 if (!selectionModel.isSelectedIndex(i)) {
@@ -584,6 +591,7 @@
          *
          * @param sel the list of selected relations
+         * @since 13957 (signature)
          */
-        public void setSelectedRelations(Collection<Relation> sel) {
+        public void setSelectedRelations(Collection<? extends IRelation<?>> sel) {
             selectionModel.setValueIsAdjusting(true);
             selectionModel.clearSelection();
@@ -592,5 +600,5 @@
                     resetFilter();
                 }
-                for (Relation r: sel) {
+                for (IRelation<?> r: sel) {
                     Integer i = getVisibleRelationIndex(r);
                     if (i != null) {
@@ -602,5 +610,5 @@
         }
 
-        private Integer getVisibleRelationIndex(Relation rel) {
+        private Integer getVisibleRelationIndex(IRelation<?> rel) {
             int i = getVisibleRelations().indexOf(rel);
             if (i < 0)
@@ -655,5 +663,5 @@
             public void popupMenuWillBecomeVisible(PopupMenuEvent e) {
                 for (JMenuItem mi: checkDisabled) {
-                    mi.setVisible(((OsmPrimitiveAction) mi.getAction()).isEnabled());
+                    mi.setVisible(((IPrimitiveAction) mi.getAction()).isEnabled());
 
                     Component sep = popupMenu.getComponent(
@@ -692,6 +700,7 @@
      * Replies the list of selected relations. Empty list, if there are no selected relations.
      * @return the list of selected, non-new relations.
-     */
-    public Collection<Relation> getSelectedRelations() {
+     * @since 13957 (signature)
+     */
+    public Collection<IRelation<?>> getSelectedRelations() {
         return model.getSelectedRelations();
     }
@@ -725,5 +734,5 @@
     @Override
     public void relationMembersChanged(final RelationMembersChangedEvent event) {
-        List<Relation> sel = model.getSelectedRelations();
+        List<IRelation<?>> sel = model.getSelectedRelations();
         model.sort();
         model.setSelectedRelations(sel);
@@ -737,5 +746,5 @@
             return;
         // trigger a sort of the relation list because the display name may have changed
-        List<Relation> sel = model.getSelectedRelations();
+        List<IRelation<?>> sel = model.getSelectedRelations();
         model.sort();
         model.setSelectedRelations(sel);
@@ -745,5 +754,5 @@
     @Override
     public void dataChanged(DataChangedEvent event) {
-        initFromLayer(MainApplication.getLayerManager().getActiveDataLayer());
+        initFromData(MainApplication.getLayerManager().getActiveData());
     }
 
