Index: trunk/src/org/openstreetmap/josm/Main.java
===================================================================
--- trunk/src/org/openstreetmap/josm/Main.java	(revision 13925)
+++ trunk/src/org/openstreetmap/josm/Main.java	(revision 13926)
@@ -32,4 +32,6 @@
 import org.openstreetmap.josm.data.coor.conversion.ICoordinateFormat;
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.IPrimitive;
+import org.openstreetmap.josm.data.osm.OsmData;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.preferences.JosmBaseDirectories;
@@ -265,10 +267,20 @@
 
     /**
+     * Replies the current selected OSM primitives, from a end-user point of view.
+     * It is not always technically the same collection of primitives than {@link DataSet#getSelected()}.
+     * @return The current selected OSM primitives, from a end-user point of view. Can be {@code null}.
+     * @since 6546
+     */
+    public Collection<OsmPrimitive> getInProgressSelection() {
+        return Collections.emptyList();
+    }
+
+    /**
      * Replies the current selected primitives, from a end-user point of view.
-     * It is not always technically the same collection of primitives than {@link DataSet#getSelected()}.
+     * It is not always technically the same collection of primitives than {@link OsmData#getSelected()}.
      * @return The current selected primitives, from a end-user point of view. Can be {@code null}.
-     * @since 6546
-     */
-    public Collection<OsmPrimitive> getInProgressSelection() {
+     * @since 13926
+     */
+    public Collection<? extends IPrimitive> getInProgressISelection() {
         return Collections.emptyList();
     }
Index: trunk/src/org/openstreetmap/josm/actions/AbstractInfoAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/AbstractInfoAction.java	(revision 13925)
+++ trunk/src/org/openstreetmap/josm/actions/AbstractInfoAction.java	(revision 13926)
@@ -16,4 +16,5 @@
 import org.openstreetmap.josm.data.osm.AbstractPrimitive;
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmData;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
@@ -155,5 +156,5 @@
     @Override
     protected void updateEnabledState() {
-        DataSet ds = getLayerManager().getActiveDataSet();
+        OsmData<?, ?, ?, ?> ds = getLayerManager().getActiveData();
         setEnabled(ds != null && !ds.selectionEmpty());
     }
Index: trunk/src/org/openstreetmap/josm/actions/AutoScaleAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/AutoScaleAction.java	(revision 13925)
+++ trunk/src/org/openstreetmap/josm/actions/AutoScaleAction.java	(revision 13926)
@@ -26,4 +26,6 @@
 import org.openstreetmap.josm.data.conflict.Conflict;
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.IPrimitive;
+import org.openstreetmap.josm.data.osm.OsmData;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
@@ -77,9 +79,9 @@
      */
     public static void zoomToSelection() {
-        DataSet dataSet = MainApplication.getLayerManager().getActiveDataSet();
+        OsmData<?, ?, ?, ?> dataSet = MainApplication.getLayerManager().getActiveData();
         if (dataSet == null) {
             return;
         }
-        Collection<OsmPrimitive> sel = dataSet.getSelected();
+        Collection<? extends IPrimitive> sel = dataSet.getSelected();
         if (sel.isEmpty()) {
             JOptionPane.showMessageDialog(
@@ -97,5 +99,5 @@
      * @param sel The primitives to zoom to, e.g. the current selection.
      */
-    public static void zoomTo(Collection<OsmPrimitive> sel) {
+    public static void zoomTo(Collection<? extends IPrimitive> sel) {
         BoundingXYVisitor bboxCalculator = new BoundingXYVisitor();
         bboxCalculator.computeBoundingBox(sel);
@@ -354,5 +356,5 @@
     @Override
     protected void updateEnabledState() {
-        DataSet ds = getLayerManager().getActiveDataSet();
+        OsmData<?, ?, ?, ?> ds = getLayerManager().getActiveData();
         MapFrame map = MainApplication.getMap();
         switch (mode) {
Index: trunk/src/org/openstreetmap/josm/actions/HistoryInfoAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/HistoryInfoAction.java	(revision 13925)
+++ trunk/src/org/openstreetmap/josm/actions/HistoryInfoAction.java	(revision 13926)
@@ -9,5 +9,5 @@
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmData;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.dialogs.OsmIdSelectionDialog;
@@ -38,5 +38,5 @@
     @Override
     public void actionPerformed(ActionEvent ae) {
-        DataSet set = getLayerManager().getActiveDataSet();
+        OsmData<?, ?, ?, ?> set = getLayerManager().getActiveData();
         if (set != null && !set.selectionEmpty()) {
             HistoryBrowserDialogManager.getInstance().showHistory(set.getAllSelected());
Index: trunk/src/org/openstreetmap/josm/actions/InfoAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/InfoAction.java	(revision 13925)
+++ trunk/src/org/openstreetmap/josm/actions/InfoAction.java	(revision 13926)
@@ -9,5 +9,5 @@
 import java.util.Collection;
 
-import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmData;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.dialogs.InspectPrimitiveDialog;
@@ -34,5 +34,5 @@
     @Override
     public void actionPerformed(ActionEvent ae) {
-        DataSet set = getLayerManager().getActiveDataSet();
+        OsmData<?, ?, ?, ?> set = getLayerManager().getActiveData();
         if (set != null) {
             new InspectPrimitiveDialog(set.getAllSelected(), set).showDialog();
Index: trunk/src/org/openstreetmap/josm/actions/SelectAllAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/SelectAllAction.java	(revision 13925)
+++ trunk/src/org/openstreetmap/josm/actions/SelectAllAction.java	(revision 13926)
@@ -8,6 +8,6 @@
 import java.awt.event.KeyEvent;
 
-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.tools.Shortcut;
 
@@ -30,6 +30,6 @@
         if (!isEnabled())
             return;
-        DataSet ds = getLayerManager().getActiveDataSet();
-        ds.setSelected(ds.getPrimitives(OsmPrimitive::isSelectable));
+        OsmData<?, ?, ?, ?> ds = getLayerManager().getActiveData();
+        ds.setSelected(ds.getPrimitives(IPrimitive::isSelectable));
     }
 
@@ -39,5 +39,5 @@
     @Override
     protected void updateEnabledState() {
-        setEnabled(getLayerManager().getActiveDataSet() != null);
+        setEnabled(getLayerManager().getActiveData() != null);
     }
 }
Index: trunk/src/org/openstreetmap/josm/actions/TaggingPresetSearchAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/TaggingPresetSearchAction.java	(revision 13925)
+++ trunk/src/org/openstreetmap/josm/actions/TaggingPresetSearchAction.java	(revision 13926)
@@ -31,5 +31,5 @@
     public void actionPerformed(ActionEvent e) {
 
-        if (MainApplication.getLayerManager().getActiveDataSet() == null)
+        if (MainApplication.getLayerManager().getActiveData() == null)
             return;
 
Index: trunk/src/org/openstreetmap/josm/actions/UnselectAllAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/UnselectAllAction.java	(revision 13925)
+++ trunk/src/org/openstreetmap/josm/actions/UnselectAllAction.java	(revision 13926)
@@ -30,5 +30,5 @@
         if (!isEnabled())
             return;
-        getLayerManager().getActiveDataSet().setSelected();
+        getLayerManager().getActiveData().setSelected();
     }
 
@@ -38,5 +38,5 @@
     @Override
     protected void updateEnabledState() {
-        setEnabled(getLayerManager().getActiveDataSet() != null);
+        setEnabled(getLayerManager().getActiveData() != null);
     }
 }
Index: trunk/src/org/openstreetmap/josm/actions/WireframeToggleAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/WireframeToggleAction.java	(revision 13925)
+++ trunk/src/org/openstreetmap/josm/actions/WireframeToggleAction.java	(revision 13926)
@@ -38,5 +38,5 @@
     @Override
     protected void updateEnabledState() {
-        setEnabled(getLayerManager().getActiveDataSet() != null);
+        setEnabled(getLayerManager().getActiveData() != null);
     }
 
Index: trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 13925)
+++ trunk/src/org/openstreetmap/josm/actions/mapmode/SelectAction.java	(revision 13926)
@@ -35,4 +35,5 @@
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmData;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Way;
@@ -354,5 +355,5 @@
     private boolean removeHighlighting() {
         boolean needsRepaint = false;
-        DataSet ds = getLayerManager().getActiveDataSet();
+        OsmData<?, ?, ?, ?> ds = getLayerManager().getActiveData();
         if (ds != null && !ds.getHighlightedVirtualNodes().isEmpty()) {
             needsRepaint = true;
Index: trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java	(revision 13925)
+++ trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java	(revision 13926)
@@ -885,5 +885,5 @@
     @Override
     protected void updateEnabledState() {
-        setEnabled(getLayerManager().getActiveDataSet() != null);
+        setEnabled(getLayerManager().getActiveData() != null);
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/MainApplication.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 13925)
+++ trunk/src/org/openstreetmap/josm/gui/MainApplication.java	(revision 13926)
@@ -93,4 +93,6 @@
 import org.openstreetmap.josm.data.oauth.OAuthAccessTokenHolder;
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.IPrimitive;
+import org.openstreetmap.josm.data.osm.OsmData;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.UserInfo;
@@ -523,13 +525,4 @@
     }
 
-    /**
-     * Replies the current selected primitives, from a end-user point of view.
-     * It is not always technically the same collection of primitives than {@link DataSet#getSelected()}.
-     * Indeed, if the user is currently in drawing mode, only the way currently being drawn is returned,
-     * see {@link DrawAction#getInProgressSelection()}.
-     *
-     * @return The current selected primitives, from a end-user point of view. Can be {@code null}.
-     * @since 6546
-     */
     @Override
     public Collection<OsmPrimitive> getInProgressSelection() {
@@ -538,4 +531,15 @@
         } else {
             DataSet ds = layerManager.getActiveDataSet();
+            if (ds == null) return null;
+            return ds.getSelected();
+        }
+    }
+
+    @Override
+    public Collection<? extends IPrimitive> getInProgressISelection() {
+        if (map != null && map.mapMode instanceof DrawAction) {
+            return ((DrawAction) map.mapMode).getInProgressSelection();
+        } else {
+            OsmData<?, ?, ?, ?> ds = layerManager.getActiveData();
             if (ds == null) return null;
             return ds.getSelected();
Index: trunk/src/org/openstreetmap/josm/gui/MapStatus.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/MapStatus.java	(revision 13925)
+++ trunk/src/org/openstreetmap/josm/gui/MapStatus.java	(revision 13926)
@@ -70,4 +70,5 @@
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
+import org.openstreetmap.josm.data.osm.IPrimitive;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -602,7 +603,6 @@
          * @param osm The primitive to derive the colors from
          */
-        private void popupSetLabelColors(JLabel lbl, OsmPrimitive osm) {
-            DataSet ds = MainApplication.getLayerManager().getActiveDataSet();
-            if (ds.isSelected(osm)) {
+        private void popupSetLabelColors(JLabel lbl, IPrimitive osm) {
+            if (osm.isSelected()) {
                 lbl.setBackground(SystemColor.textHighlight);
                 lbl.setForeground(SystemColor.textHighlightText);
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDataText.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDataText.java	(revision 13925)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDataText.java	(revision 13926)
@@ -15,8 +15,11 @@
 import org.openstreetmap.josm.data.osm.BBox;
 import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.INode;
+import org.openstreetmap.josm.data.osm.IPrimitive;
+import org.openstreetmap.josm.data.osm.IRelation;
+import org.openstreetmap.josm.data.osm.IRelationMember;
+import org.openstreetmap.josm.data.osm.IWay;
+import org.openstreetmap.josm.data.osm.OsmData;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.Relation;
-import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.projection.proj.TransverseMercator;
@@ -36,7 +39,7 @@
 
     private final StringBuilder s = new StringBuilder();
-    private final DataSet ds;
-
-    InspectPrimitiveDataText(DataSet ds) {
+    private final OsmData<?, ?, ?, ?> ds;
+
+    InspectPrimitiveDataText(OsmData<?, ?, ?, ?> ds) {
         this.ds = ds;
     }
@@ -63,5 +66,5 @@
      * @param o primitive to add
      */
-    public void addPrimitive(OsmPrimitive o) {
+    public void addPrimitive(IPrimitive o) {
 
         addHeadline(o);
@@ -82,24 +85,26 @@
         addSpecial(o);
         addReferrers(s, o);
-        addConflicts(o);
+        if (o instanceof OsmPrimitive) {
+            addConflicts((OsmPrimitive) o);
+        }
         s.append(NL);
     }
 
-    void addHeadline(OsmPrimitive o) {
+    void addHeadline(IPrimitive o) {
         addType(o);
         addNameAndId(o);
     }
 
-    void addType(OsmPrimitive o) {
-        if (o instanceof Node) {
+    void addType(IPrimitive o) {
+        if (o instanceof INode) {
             s.append(tr("Node: "));
-        } else if (o instanceof Way) {
+        } else if (o instanceof IWay) {
             s.append(tr("Way: "));
-        } else if (o instanceof Relation) {
+        } else if (o instanceof IRelation) {
             s.append(tr("Relation: "));
         }
     }
 
-    void addNameAndId(OsmPrimitive o) {
+    void addNameAndId(IPrimitive o) {
         String name = o.get("name");
         if (name == null) {
@@ -110,5 +115,5 @@
     }
 
-    void addState(OsmPrimitive o) {
+    void addState(IPrimitive o) {
         StringBuilder sb = new StringBuilder(INDENT);
         /* selected state is left out: not interesting as it is always selected */
@@ -141,5 +146,5 @@
     }
 
-    void addCommon(OsmPrimitive o) {
+    void addCommon(IPrimitive o) {
         add(tr("Data Set: "), Integer.toHexString(o.getDataSet().hashCode()));
         add(tr("Edited at: "), o.isTimestampEmpty() ? tr("<new object>")
@@ -151,5 +156,5 @@
     }
 
-    void addAttributes(OsmPrimitive o) {
+    void addAttributes(IPrimitive o) {
         if (o.hasKeys()) {
             add(tr("Tags: "));
@@ -161,22 +166,22 @@
     }
 
-    void addSpecial(OsmPrimitive o) {
-        if (o instanceof Node) {
-            addCoordinates((Node) o);
-        } else if (o instanceof Way) {
+    void addSpecial(IPrimitive o) {
+        if (o instanceof INode) {
+            addCoordinates((INode) o);
+        } else if (o instanceof IWay) {
             addBbox(o);
             add(tr("Centroid: "),
                     toStringCSV(", ", Main.getProjection().eastNorth2latlon(
                             Geometry.getCentroid(((Way) o).getNodes()))));
-            addWayNodes((Way) o);
-        } else if (o instanceof Relation) {
+            addWayNodes((IWay<?>) o);
+        } else if (o instanceof IRelation) {
             addBbox(o);
-            addRelationMembers((Relation) o);
-        }
-    }
-
-    void addRelationMembers(Relation r) {
+            addRelationMembers((IRelation<?>) o);
+        }
+    }
+
+    void addRelationMembers(IRelation<?> r) {
         add(trn("{0} Member: ", "{0} Members: ", r.getMembersCount(), r.getMembersCount()));
-        for (RelationMember m : r.getMembers()) {
+        for (IRelationMember<?> m : r.getMembers()) {
             s.append(INDENT).append(INDENT);
             addHeadline(m.getMember());
@@ -186,7 +191,7 @@
     }
 
-    void addWayNodes(Way w) {
+    void addWayNodes(IWay<?> w) {
         add(tr("{0} Nodes: ", w.getNodesCount()));
-        for (Node n : w.getNodes()) {
+        for (INode n : w.getNodes()) {
             s.append(INDENT).append(INDENT);
             addNameAndId(n);
@@ -195,5 +200,5 @@
     }
 
-    void addBbox(OsmPrimitive o) {
+    void addBbox(IPrimitive o) {
         BBox bbox = o.getBBox();
         if (bbox != null) {
@@ -210,5 +215,5 @@
     }
 
-    void addCoordinates(Node n) {
+    void addCoordinates(INode n) {
         if (n.isLatLonKnown()) {
             add(tr("Coordinates:"), " ",
@@ -225,9 +230,9 @@
     }
 
-    void addReferrers(StringBuilder s, OsmPrimitive o) {
-        List<OsmPrimitive> refs = o.getReferrers();
+    void addReferrers(StringBuilder s, IPrimitive o) {
+        List<? extends IPrimitive> refs = o.getReferrers();
         if (!refs.isEmpty()) {
             add(tr("Part of: "));
-            for (OsmPrimitive p : refs) {
+            for (IPrimitive p : refs) {
                 s.append(INDENT).append(INDENT);
                 addHeadline(p);
@@ -238,5 +243,5 @@
 
     void addConflicts(OsmPrimitive o) {
-        Conflict<?> c = ds.getConflicts().getConflictForMy(o);
+        Conflict<?> c = ((DataSet) ds).getConflicts().getConflictForMy(o);
         if (c != null) {
             add(tr("In conflict with: "));
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java	(revision 13925)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java	(revision 13926)
@@ -22,8 +22,9 @@
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
+import org.openstreetmap.josm.data.osm.IPrimitive;
+import org.openstreetmap.josm.data.osm.OsmData;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.OsmPrimitiveComparator;
+import org.openstreetmap.josm.data.osm.PrimitiveComparator;
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.MainApplication;
@@ -52,5 +53,5 @@
 public class InspectPrimitiveDialog extends ExtendedDialog {
 
-    protected transient List<OsmPrimitive> primitives;
+    protected transient List<IPrimitive> primitives;
     private boolean mappaintTabLoaded;
     private boolean editcountTabLoaded;
@@ -62,5 +63,5 @@
      * @since 12672 (signature)
      */
-    public InspectPrimitiveDialog(final Collection<OsmPrimitive> primitives, DataSet data) {
+    public InspectPrimitiveDialog(final Collection<? extends IPrimitive> primitives, OsmData<?, ?, ?, ?> data) {
         super(Main.parent, tr("Advanced object info"), tr("Close"));
         this.primitives = new ArrayList<>(primitives);
@@ -105,8 +106,8 @@
     }
 
-    protected static String buildDataText(DataSet data, List<OsmPrimitive> primitives) {
+    protected static String buildDataText(OsmData<?, ?, ?, ?> data, List<IPrimitive> primitives) {
         InspectPrimitiveDataText dt = new InspectPrimitiveDataText(data);
         primitives.stream()
-                .sorted(OsmPrimitiveComparator.orderingWaysRelationsNodes().thenComparing(OsmPrimitiveComparator.comparingNames()))
+                .sorted(PrimitiveComparator.orderingWaysRelationsNodes().thenComparing(PrimitiveComparator.comparingNames()))
                 .forEachOrdered(dt::addPrimitive);
         return dt.toString();
@@ -171,9 +172,9 @@
         Count only tagged nodes (so empty way nodes don't inflate counts).
     */
-    protected static String buildListOfEditorsText(Iterable<OsmPrimitive> primitives) {
+    protected static String buildListOfEditorsText(Iterable<? extends IPrimitive> primitives) {
         final Map<String, Integer> editCountByUser = new TreeMap<>(Collator.getInstance(Locale.getDefault()));
 
         // Count who edited each selected object
-        for (OsmPrimitive o : primitives) {
+        for (IPrimitive o : primitives) {
             if (o.getUser() != null) {
                 String username = o.getUser().getName();
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 13925)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 13926)
@@ -344,5 +344,5 @@
 
         protected void setCurrentRelationAsSelection() {
-            MainApplication.getLayerManager().getActiveDataSet().setSelected(displaylist.getSelectedValue());
+            MainApplication.getLayerManager().getActiveData().setSelected(displaylist.getSelectedValue());
         }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 13925)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 13926)
@@ -46,4 +46,5 @@
 import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
 import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmData;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveComparator;
@@ -295,5 +296,5 @@
 
         protected void updateEnabledState() {
-            setEnabled(MainApplication.getLayerManager().getActiveDataSet() != null);
+            setEnabled(MainApplication.getLayerManager().getActiveData() != null);
         }
 
@@ -320,5 +321,5 @@
             Collection<OsmPrimitive> sel = model.getSelected();
             if (sel.isEmpty()) return;
-            DataSet ds = MainApplication.getLayerManager().getActiveDataSet();
+            OsmData<?, ?, ?, ?> ds = MainApplication.getLayerManager().getActiveData();
             if (ds == null) return;
             ds.setSelected(sel);
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java	(revision 13925)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/UserListDialog.java	(revision 13926)
@@ -34,5 +34,6 @@
 import org.openstreetmap.josm.actions.AbstractInfoAction;
 import org.openstreetmap.josm.data.osm.DataSelectionListener;
-import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.IPrimitive;
+import org.openstreetmap.josm.data.osm.OsmData;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.User;
@@ -364,8 +365,8 @@
                 users.add(data.get(index).user);
             }
-            DataSet ds = MainApplication.getLayerManager().getActiveDataSet();
-            Collection<OsmPrimitive> selected = ds.getAllSelected();
-            Collection<OsmPrimitive> byUser = new LinkedList<>();
-            for (OsmPrimitive p : selected) {
+            OsmData<?, ?, ?, ?> ds = MainApplication.getLayerManager().getActiveData();
+            Collection<? extends IPrimitive> selected = ds.getAllSelected();
+            Collection<IPrimitive> byUser = new LinkedList<>();
+            for (IPrimitive p : selected) {
                 if (users.contains(p.getUser())) {
                     byUser.add(p);
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 13925)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 13926)
@@ -63,5 +63,7 @@
 import org.openstreetmap.josm.data.osm.DataSet;
 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.IRelationMember;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -230,5 +232,5 @@
 
     private final PreferenceChangedListener preferenceListener = e -> {
-                if (MainApplication.getLayerManager().getActiveDataSet() != null) {
+                if (MainApplication.getLayerManager().getActiveData() != null) {
                     // Re-load data when display preference change
                     updateSelection();
@@ -488,6 +490,11 @@
         OsmDataLayer layer = MainApplication.getLayerManager().getActiveDataLayer();
         if (!layer.isLocked()) {
-            RelationEditor.getEditor(
-                    layer, relation, ((MemberInfo) membershipData.getValueAt(row, 1)).role).setVisible(true);
+            List<RelationMember> members = new ArrayList<>();
+            for (IRelationMember<?> rm : ((MemberInfo) membershipData.getValueAt(row, 1)).role) {
+                if (rm instanceof RelationMember) {
+                    members.add((RelationMember) rm);
+                }
+            }
+            RelationEditor.getEditor(layer, relation, members).setVisible(true);
         }
     }
@@ -533,5 +540,5 @@
     public void setVisible(boolean b) {
         super.setVisible(b);
-        if (b && MainApplication.getLayerManager().getActiveDataSet() != null) {
+        if (b && MainApplication.getLayerManager().getActiveData() != null) {
             updateSelection();
         }
@@ -559,5 +566,5 @@
 
         // Ignore parameter as we do not want to operate always on real selection here, especially in draw mode
-        Collection<OsmPrimitive> newSel = Optional.ofNullable(Main.main.getInProgressSelection()).orElseGet(Collections::emptyList);
+        Collection<? extends IPrimitive> newSel = Optional.ofNullable(Main.main.getInProgressISelection()).orElseGet(Collections::emptyList);
         String selectedTag;
         Relation selectedRelation = null;
@@ -578,5 +585,5 @@
         valueCount.clear();
         Set<TaggingPresetType> types = EnumSet.noneOf(TaggingPresetType.class);
-        for (OsmPrimitive osm : newSel) {
+        for (IPrimitive osm : newSel) {
             types.add(TaggingPresetType.forPrimitive(osm));
             for (String key : osm.keySet()) {
@@ -610,13 +617,13 @@
         membershipData.setRowCount(0);
 
-        Map<Relation, MemberInfo> roles = new HashMap<>();
-        for (OsmPrimitive primitive: newSel) {
-            for (OsmPrimitive ref: primitive.getReferrers(true)) {
-                if (ref instanceof Relation && !ref.isIncomplete() && !ref.isDeleted()) {
-                    Relation r = (Relation) ref;
+        Map<IRelation<?>, MemberInfo> roles = new HashMap<>();
+        for (IPrimitive primitive: newSel) {
+            for (IPrimitive ref: primitive.getReferrers(true)) {
+                if (ref instanceof IRelation && !ref.isIncomplete() && !ref.isDeleted()) {
+                    IRelation<?> r = (IRelation<?>) ref;
                     MemberInfo mi = Optional.ofNullable(roles.get(r)).orElseGet(() -> new MemberInfo(newSel));
                     roles.put(r, mi);
                     int i = 1;
-                    for (RelationMember m : r.getMembers()) {
+                    for (IRelationMember<?> m : r.getMembers()) {
                         if (m.getMember() == primitive) {
                             mi.add(m, i);
@@ -628,5 +635,5 @@
         }
 
-        List<Relation> sortedRelations = new ArrayList<>(roles.keySet());
+        List<IRelation<?>> sortedRelations = new ArrayList<>(roles.keySet());
         sortedRelations.sort((o1, o2) -> {
             int comp = Boolean.compare(o1.isDisabledAndHidden(), o2.isDisabledAndHidden());
@@ -634,5 +641,5 @@
         });
 
-        for (Relation r: sortedRelations) {
+        for (IRelation<?> r: sortedRelations) {
             membershipData.addRow(new Object[]{r, roles.get(r)});
         }
@@ -888,16 +895,16 @@
 
     static class MemberInfo {
-        private final List<RelationMember> role = new ArrayList<>();
-        private Set<OsmPrimitive> members = new HashSet<>();
+        private final List<IRelationMember<?>> role = new ArrayList<>();
+        private Set<IPrimitive> members = new HashSet<>();
         private List<Integer> position = new ArrayList<>();
-        private Collection<OsmPrimitive> selection;
+        private Collection<? extends IPrimitive> selection;
         private String positionString;
         private String roleString;
 
-        MemberInfo(Collection<OsmPrimitive> selection) {
+        MemberInfo(Collection<? extends IPrimitive> selection) {
             this.selection = selection;
         }
 
-        void add(RelationMember r, Integer p) {
+        void add(IRelationMember<?> r, Integer p) {
             role.add(r);
             members.add(r.getMember());
@@ -921,5 +928,5 @@
         String getRoleString() {
             if (roleString == null) {
-                for (RelationMember r : role) {
+                for (IRelationMember<?> r : role) {
                     if (roleString == null) {
                         roleString = r.getRole();
@@ -1175,5 +1182,5 @@
                 return;
             String key = editHelper.getDataKey(tagTable.getSelectedRow());
-            Collection<OsmPrimitive> sel = Main.main.getInProgressSelection();
+            Collection<? extends IPrimitive> sel = Main.main.getInProgressISelection();
             if (sel.isEmpty())
                 return;
@@ -1183,9 +1190,9 @@
     }
 
-    static SearchSetting createSearchSetting(String key, Collection<OsmPrimitive> sel, boolean sameType) {
+    static SearchSetting createSearchSetting(String key, Collection<? extends IPrimitive> sel, boolean sameType) {
         String sep = "";
         StringBuilder s = new StringBuilder();
         Set<String> consideredTokens = new TreeSet<>();
-        for (OsmPrimitive p : sel) {
+        for (IPrimitive p : sel) {
             String val = p.get(key);
             if (val == null || (!sameType && consideredTokens.contains(val))) {
Index: trunk/src/org/openstreetmap/josm/gui/history/NodeListViewer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/NodeListViewer.java	(revision 13925)
+++ trunk/src/org/openstreetmap/josm/gui/history/NodeListViewer.java	(revision 13926)
@@ -22,5 +22,6 @@
 
 import org.openstreetmap.josm.actions.AutoScaleAction;
-import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.IPrimitive;
+import org.openstreetmap.josm.data.osm.OsmData;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
@@ -247,7 +248,7 @@
             if (!isEnabled())
                 return;
-            OsmPrimitive p = getPrimitiveToZoom();
+            IPrimitive p = getPrimitiveToZoom();
             if (p != null) {
-                DataSet ds = MainApplication.getLayerManager().getActiveDataSet();
+                OsmData<?, ?, ?, ?> ds = MainApplication.getLayerManager().getActiveData();
                 if (ds != null) {
                     ds.setSelected(p.getPrimitiveId());
@@ -262,8 +263,8 @@
         }
 
-        protected OsmPrimitive getPrimitiveToZoom() {
+        protected IPrimitive getPrimitiveToZoom() {
             if (primitiveId == null)
                 return null;
-            DataSet ds = MainApplication.getLayerManager().getActiveDataSet();
+            OsmData<?, ?, ?, ?> ds = MainApplication.getLayerManager().getActiveData();
             if (ds == null)
                 return null;
@@ -272,5 +273,5 @@
 
         public void updateEnabledState() {
-            setEnabled(MainApplication.getLayerManager().getActiveDataSet() != null && getPrimitiveToZoom() != null);
+            setEnabled(MainApplication.getLayerManager().getActiveData() != null && getPrimitiveToZoom() != null);
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/layer/AbstractOsmDataLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/AbstractOsmDataLayer.java	(revision 13926)
+++ trunk/src/org/openstreetmap/josm/gui/layer/AbstractOsmDataLayer.java	(revision 13926)
@@ -0,0 +1,21 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.layer;
+
+import org.openstreetmap.josm.data.osm.OsmData;
+
+/**
+ * Abstraction of {@link OsmDataLayer}.
+ * @since 13926
+ */
+public abstract class AbstractOsmDataLayer extends AbstractModifiableLayer {
+
+    protected AbstractOsmDataLayer(String name) {
+        super(name);
+    }
+
+    /**
+     * Returns the {@link OsmData} behind this layer.
+     * @return the {@link OsmData} behind this layer.
+     */
+    public abstract OsmData<?, ?, ?, ?> getDataSet();
+}
Index: trunk/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java	(revision 13925)
+++ trunk/src/org/openstreetmap/josm/gui/layer/MainLayerManager.java	(revision 13926)
@@ -14,4 +14,5 @@
 
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmData;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.io.AsynchronousUploadPrimitivesTask;
@@ -175,5 +176,10 @@
      * The current active data layer. It might be editable or not, based on its read-only status.
      */
-    private OsmDataLayer dataLayer;
+    private AbstractOsmDataLayer dataLayer;
+
+    /**
+     * The current active OSM data layer. It might be editable or not, based on its read-only status.
+     */
+    private OsmDataLayer osmDataLayer;
 
     private final List<ActiveLayerChangeListener> activeLayerChangeListeners = new CopyOnWriteArrayList<>();
@@ -262,10 +268,13 @@
 
     private void setActiveLayer(Layer layer, boolean forceEditLayerUpdate) {
-        ActiveLayerChangeEvent event = new ActiveLayerChangeEvent(this, dataLayer, activeLayer);
+        ActiveLayerChangeEvent event = new ActiveLayerChangeEvent(this, osmDataLayer, activeLayer);
         activeLayer = layer;
+        if (activeLayer instanceof AbstractOsmDataLayer) {
+            dataLayer = (AbstractOsmDataLayer) layer;
+        }
         if (activeLayer instanceof OsmDataLayer) {
-            dataLayer = (OsmDataLayer) activeLayer;
+            osmDataLayer = (OsmDataLayer) activeLayer;
         } else if (forceEditLayerUpdate) {
-            dataLayer = null;
+            osmDataLayer = null;
         }
         fireActiveLayerChange(event);
@@ -274,5 +283,5 @@
     private void fireActiveLayerChange(ActiveLayerChangeEvent event) {
         GuiHelper.assertCallFromEdt();
-        if (event.getPreviousActiveLayer() != activeLayer || event.getPreviousDataLayer() != dataLayer) {
+        if (event.getPreviousActiveLayer() != activeLayer || event.getPreviousDataLayer() != osmDataLayer) {
             for (ActiveLayerChangeListener l : activeLayerChangeListeners) {
                 l.activeOrEditLayerChanged(event);
@@ -307,5 +316,5 @@
         }
 
-        if (layer == activeLayer || layer == dataLayer) {
+        if (layer == activeLayer || layer == osmDataLayer) {
             Layer nextActive = suggestNextActiveLayer(layer);
             setActiveLayer(nextActive, true);
@@ -376,6 +385,6 @@
      */
     public synchronized OsmDataLayer getEditLayer() {
-        if (dataLayer != null && !dataLayer.isLocked())
-            return dataLayer;
+        if (osmDataLayer != null && !osmDataLayer.isLocked())
+            return osmDataLayer;
         else
             return null;
@@ -390,6 +399,6 @@
      */
     public synchronized OsmDataLayer getActiveDataLayer() {
-        if (dataLayer != null)
-            return dataLayer;
+        if (osmDataLayer != null)
+            return osmDataLayer;
         else
             return null;
@@ -402,5 +411,18 @@
      */
     public synchronized DataSet getEditDataSet() {
-        if (dataLayer != null && !dataLayer.isLocked()) {
+        if (osmDataLayer != null && !osmDataLayer.isLocked()) {
+            return osmDataLayer.getDataSet();
+        } else {
+            return null;
+        }
+    }
+
+    /**
+     * Gets the data set of the active data layer. The dataset can be read-only.
+     * @return That data set, <code>null</code> if there is no active data layer.
+     * @since 13926
+     */
+    public synchronized OsmData<?, ?, ?, ?> getActiveData() {
+        if (dataLayer != null) {
             return dataLayer.getDataSet();
         } else {
@@ -410,5 +432,5 @@
 
     /**
-     * Gets the data set of the active data layer. The dataset can be read-only.
+     * Gets the data set of the active {@link OsmDataLayer}. The dataset can be read-only.
      * @return That data set, <code>null</code> if there is no active data layer.
      * @see #getEditDataSet
@@ -416,6 +438,6 @@
      */
     public synchronized DataSet getActiveDataSet() {
-        if (dataLayer != null) {
-            return dataLayer.getDataSet();
+        if (osmDataLayer != null) {
+            return osmDataLayer.getDataSet();
         } else {
             return null;
@@ -475,6 +497,6 @@
      */
     public void invalidateEditLayer() {
-        if (dataLayer != null) {
-            dataLayer.invalidate();
+        if (osmDataLayer != null) {
+            osmDataLayer.invalidate();
         }
     }
@@ -512,7 +534,7 @@
 
         // Reset only the edit layer as empty
-        if (dataLayer == layer) {
-            ActiveLayerChangeEvent activeLayerChangeEvent = new ActiveLayerChangeEvent(this, dataLayer, activeLayer);
-            dataLayer = null;
+        if (osmDataLayer == layer) {
+            ActiveLayerChangeEvent activeLayerChangeEvent = new ActiveLayerChangeEvent(this, osmDataLayer, activeLayer);
+            osmDataLayer = null;
             fireActiveLayerChange(activeLayerChangeEvent);
         }
@@ -532,7 +554,7 @@
 
         // Set the layer as edit layer if the edit layer is empty.
-        if (dataLayer == null) {
-            ActiveLayerChangeEvent layerChangeEvent = new ActiveLayerChangeEvent(this, dataLayer, activeLayer);
-            dataLayer = layer;
+        if (osmDataLayer == null) {
+            ActiveLayerChangeEvent layerChangeEvent = new ActiveLayerChangeEvent(this, osmDataLayer, activeLayer);
+            osmDataLayer = layer;
             fireActiveLayerChange(layerChangeEvent);
         }
Index: trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 13925)
+++ trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 13926)
@@ -123,5 +123,5 @@
  * @since 17
  */
-public class OsmDataLayer extends AbstractModifiableLayer implements Listener, DataSelectionListener, HighlightUpdateListener {
+public class OsmDataLayer extends AbstractOsmDataLayer implements Listener, DataSelectionListener, HighlightUpdateListener {
     private static final int HATCHED_SIZE = 15;
     /** Property used to know if this layer has to be saved on disk */
@@ -420,4 +420,5 @@
      * @since 13558
      */
+    @Override
     public DataSet getDataSet() {
         return data;
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/MapPaintMenu.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/MapPaintMenu.java	(revision 13925)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/MapPaintMenu.java	(revision 13926)
@@ -67,5 +67,5 @@
         public void updateEnabledState() {
             setEnabled(MainApplication.isDisplayingMapView()
-                    && (MainApplication.getLayerManager().getActiveDataSet() != null || mapHasGpxorMarkerLayer()));
+                    && (MainApplication.getLayerManager().getActiveData() != null || mapHasGpxorMarkerLayer()));
         }
 
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java	(revision 13925)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPreset.java	(revision 13926)
@@ -39,4 +39,5 @@
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.IPrimitive;
+import org.openstreetmap.josm.data.osm.OsmData;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
@@ -495,5 +496,5 @@
             boolean disableApply = false;
             if (!sel.isEmpty()) {
-                DataSet ds = sel.iterator().next().getDataSet();
+                OsmData<?, ?, ?, ?> ds = sel.iterator().next().getDataSet();
                 disableApply = ds != null && ds.isLocked();
             }
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSearchPrimitiveDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSearchPrimitiveDialog.java	(revision 13925)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetSearchPrimitiveDialog.java	(revision 13926)
@@ -43,5 +43,5 @@
         @Override
         public void actionPerformed(ActionEvent e) {
-            if (MainApplication.getLayerManager().getActiveDataSet() != null) {
+            if (MainApplication.getLayerManager().getActiveData() != null) {
                 TaggingPresetSearchPrimitiveDialog.getInstance().showDialog();
             }
@@ -50,5 +50,5 @@
         @Override
         protected void updateEnabledState() {
-            setEnabled(getLayerManager().getActiveDataSet() != null);
+            setEnabled(getLayerManager().getActiveData() != null);
         }
     }
