Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/OffsetIterator.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/OffsetIterator.java	(revision 13918)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/OffsetIterator.java	(revision 13919)
@@ -7,5 +7,5 @@
 import java.util.stream.Collectors;
 
-import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.INode;
 import org.openstreetmap.josm.gui.MapViewState;
 import org.openstreetmap.josm.gui.MapViewState.MapViewPoint;
@@ -55,7 +55,7 @@
      * @param offset The offset of the line.
      */
-    public OffsetIterator(MapViewState mapState, List<Node> nodes, double offset) {
+    public OffsetIterator(MapViewState mapState, List<? extends INode> nodes, double offset) {
         this.mapState = mapState;
-        this.nodes = nodes.stream().filter(Node::isLatLonKnown).map(mapState::getPointFor).collect(Collectors.toList());
+        this.nodes = nodes.stream().filter(INode::isLatLonKnown).map(mapState::getPointFor).collect(Collectors.toList());
         this.offset = offset;
     }
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(revision 13918)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(revision 13919)
@@ -49,4 +49,5 @@
 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.Node;
@@ -55,5 +56,4 @@
 import org.openstreetmap.josm.data.osm.OsmUtils;
 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.osm.WaySegment;
@@ -526,5 +526,5 @@
      * @since 12285
      */
-    public void drawArea(Way w, Color color, MapImage fillImage, Float extent, Float extentThreshold, boolean disabled) {
+    public void drawArea(IWay<?> w, Color color, MapImage fillImage, Float extent, Float extentThreshold, boolean disabled) {
         Path2D.Double pfClip = null;
         if (extent != null) {
@@ -561,5 +561,5 @@
      * @param bs The text and it's alignment.
      */
-    public void drawBoxText(Node n, BoxTextElement bs) {
+    public void drawBoxText(INode n, BoxTextElement bs) {
         if (!isShowNames() || bs == null)
             return;
@@ -631,5 +631,5 @@
      * @param align alignment of the image. The top, center or bottom edge can be aligned with the way.
      */
-    public void drawRepeatImage(Way way, MapImage pattern, boolean disabled, double offset, double spacing, double phase,
+    public void drawRepeatImage(IWay<?> way, MapImage pattern, boolean disabled, double offset, double spacing, double phase,
             LineImageAlignment align) {
         final int imgWidth = pattern.getWidth();
@@ -730,5 +730,5 @@
      * @param theta the angle of rotation in radians
      */
-    public void drawNodeIcon(Node n, MapImage img, boolean disabled, boolean selected, boolean member, double theta) {
+    public void drawNodeIcon(INode n, MapImage img, boolean disabled, boolean selected, boolean member, double theta) {
         MapViewPoint p = mapState.getPointFor(n);
 
@@ -821,5 +821,5 @@
      * @param strokeColor The color to use for the outer corner of the symbol
      */
-    public void drawNodeSymbol(Node n, Symbol s, Color fillColor, Color strokeColor) {
+    public void drawNodeSymbol(INode n, Symbol s, Color fillColor, Color strokeColor) {
         MapViewPoint p = mapState.getPointFor(n);
 
@@ -853,5 +853,5 @@
      * @param clr The color to use for drawing the text.
      */
-    public void drawOrderNumber(Node n1, Node n2, int orderNumber, Color clr) {
+    public void drawOrderNumber(INode n1, INode n2, int orderNumber, Color clr) {
         MapViewPoint p1 = mapState.getPointFor(n1);
         MapViewPoint p2 = mapState.getPointFor(n2);
@@ -929,16 +929,16 @@
      * @param disabled draw using disabled style
      */
-    public void drawRestriction(Relation r, MapImage icon, boolean disabled) {
-        Way fromWay = null;
-        Way toWay = null;
-        OsmPrimitive via = null;
+    public void drawRestriction(IRelation<?> r, MapImage icon, boolean disabled) {
+        IWay<?> fromWay = null;
+        IWay<?> toWay = null;
+        IPrimitive via = null;
 
         /* find the "from", "via" and "to" elements */
-        for (RelationMember m : r.getMembers()) {
+        for (IRelationMember<?> m : r.getMembers()) {
             if (m.getMember().isIncomplete())
                 return;
             else {
                 if (m.isWay()) {
-                    Way w = m.getWay();
+                    IWay<?> w = (IWay<?>) m.getMember();
                     if (w.getNodesCount() < 2) {
                         continue;
@@ -964,5 +964,5 @@
                     }
                 } else if (m.isNode()) {
-                    Node n = m.getNode();
+                    INode n = (INode) m.getMember();
                     if (via == null && "via".equals(m.getRole())) {
                         via = n;
@@ -1007,5 +1007,5 @@
 
         /* find the "direct" nodes before the via node */
-        Node fromNode;
+        INode fromNode;
         if (fromWay.firstNode() == via) {
             fromNode = fromWay.getNode(1);
@@ -1227,5 +1227,5 @@
      * @param onewayReversed for oneway=-1 and similar
      */
-    public void drawWay(Way way, Color color, BasicStroke line, BasicStroke dashes, Color dashedColor, float offset,
+    public void drawWay(IWay<?> way, Color color, BasicStroke line, BasicStroke dashes, Color dashedColor, float offset,
             boolean showOrientation, boolean showHeadArrowOnly,
             boolean showOneway, boolean onewayReversed) {
@@ -1241,5 +1241,5 @@
         }
 
-        List<Node> wayNodes = way.getNodes();
+        List<? extends INode> wayNodes = way.getNodes();
         if (wayNodes.size() < 2) return;
 
@@ -1410,5 +1410,5 @@
     }
 
-    private MapViewPath getPath(Way w) {
+    private MapViewPath getPath(IWay<?> w) {
         MapViewPath path = new MapViewPath(mapState);
         if (w.isClosed()) {
@@ -1420,5 +1420,5 @@
     }
 
-    private static Path2D.Double getPFClip(Way w, double extent) {
+    private static Path2D.Double getPFClip(IWay<?> w, double extent) {
         Path2D.Double clip = new Path2D.Double();
         buildPFClip(clip, w.getNodes(), extent);
@@ -1451,7 +1451,7 @@
      * @param extent the extent
      */
-    private static void buildPFClip(Path2D.Double clip, List<Node> nodes, double extent) {
+    private static void buildPFClip(Path2D.Double clip, List<? extends INode> nodes, double extent) {
         boolean initial = true;
-        for (Node n : nodes) {
+        for (INode n : nodes) {
             EastNorth p = n.getEastNorth();
             if (p != null) {
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/AreaElement.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/AreaElement.java	(revision 13918)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/AreaElement.java	(revision 13919)
@@ -8,6 +8,6 @@
 
 import org.openstreetmap.josm.data.osm.IPrimitive;
+import org.openstreetmap.josm.data.osm.IWay;
 import org.openstreetmap.josm.data.osm.Relation;
-import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.visitor.paint.MapPaintSettings;
 import org.openstreetmap.josm.data.osm.visitor.paint.StyledMapRenderer;
@@ -123,5 +123,5 @@
             boolean selected, boolean outermember, boolean member) {
         Color myColor = color;
-        if (osm instanceof Way) {
+        if (osm instanceof IWay) {
             if (color != null) {
                 if (selected) {
@@ -131,5 +131,5 @@
                 }
             }
-            painter.drawArea((Way) osm, myColor, fillImage, extent, extentThreshold, painter.isInactiveMode() || osm.isDisabled());
+            painter.drawArea((IWay<?>) osm, myColor, fillImage, extent, extentThreshold, painter.isInactiveMode() || osm.isDisabled());
         } else if (osm instanceof Relation) {
             if (color != null && (selected || outermember)) {
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/BoxTextElement.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/BoxTextElement.java	(revision 13918)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/BoxTextElement.java	(revision 13919)
@@ -7,4 +7,5 @@
 import java.util.Objects;
 
+import org.openstreetmap.josm.data.osm.INode;
 import org.openstreetmap.josm.data.osm.IPrimitive;
 import org.openstreetmap.josm.data.osm.Node;
@@ -284,6 +285,6 @@
     public void paintPrimitive(IPrimitive osm, MapPaintSettings settings, StyledMapRenderer painter,
             boolean selected, boolean outermember, boolean member) {
-        if (osm instanceof Node) {
-            painter.drawBoxText((Node) osm, this);
+        if (osm instanceof INode) {
+            painter.drawBoxText((INode) osm, this);
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/LineElement.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/LineElement.java	(revision 13918)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/LineElement.java	(revision 13919)
@@ -8,6 +8,7 @@
 import java.util.Optional;
 
+import org.openstreetmap.josm.data.osm.INode;
 import org.openstreetmap.josm.data.osm.IPrimitive;
-import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.IWay;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.visitor.paint.MapPaintSettings;
@@ -128,5 +129,5 @@
         the direction should be shown at all and not only because it's selected */
         boolean showOnlyHeadArrowOnly = showOrientation && !selected && paintSettings.isShowHeadArrowOnly();
-        Node lastN;
+        INode lastN;
 
         Color myDashedColor = dashesBackground;
@@ -155,6 +156,6 @@
         }
 
-        if (primitive instanceof Way) {
-            Way w = (Way) primitive;
+        if (primitive instanceof IWay) {
+            IWay<?> w = (IWay<?>) primitive;
             painter.drawWay(w, myColor, myLine, myDashLine, myDashedColor, offset, showOrientation,
                     showOnlyHeadArrowOnly, showOneway, onewayReversed);
@@ -164,5 +165,5 @@
                 int orderNumber = 0;
                 lastN = null;
-                for (Node n : w.getNodes()) {
+                for (INode n : w.getNodes()) {
                     if (lastN != null) {
                         orderNumber++;
@@ -245,5 +246,5 @@
 
     /**
-     * Creates a simple line with default widt.
+     * Creates a simple line with default width.
      * @param color The color to use
      * @param isAreaEdge If this is an edge for an area. Edges are drawn at lower Z-Index.
@@ -259,6 +260,5 @@
             c.put(Z_INDEX, -3f);
         }
-        Way w = new Way();
-        return createLine(new Environment(w, mc, "default", null));
+        return createLine(new Environment(new Way(), mc, "default", null));
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/NodeElement.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/NodeElement.java	(revision 13918)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/NodeElement.java	(revision 13919)
@@ -10,7 +10,7 @@
 import java.util.stream.IntStream;
 
+import org.openstreetmap.josm.data.osm.INode;
 import org.openstreetmap.josm.data.osm.IPrimitive;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.IRelation;
 import org.openstreetmap.josm.data.osm.visitor.paint.MapPaintSettings;
 import org.openstreetmap.josm.data.osm.visitor.paint.StyledMapRenderer;
@@ -269,6 +269,6 @@
     public void paintPrimitive(IPrimitive primitive, MapPaintSettings settings, StyledMapRenderer painter,
             boolean selected, boolean outermember, boolean member) {
-        if (primitive instanceof Node) {
-            Node n = (Node) primitive;
+        if (primitive instanceof INode) {
+            INode n = (INode) primitive;
             if (mapImage != null && painter.isShowIcons()) {
                 painter.drawNodeIcon(n, mapImage, painter.isInactiveMode() || n.isDisabled(), selected, member,
@@ -314,11 +314,11 @@
 
             }
-        } else if (primitive instanceof Relation && mapImage != null) {
-            painter.drawRestriction((Relation) primitive, mapImage, painter.isInactiveMode() || primitive.isDisabled());
+        } else if (primitive instanceof IRelation && mapImage != null) {
+            painter.drawRestriction((IRelation<?>) primitive, mapImage, painter.isInactiveMode() || primitive.isDisabled());
         }
     }
 
     private void paintWithSymbol(MapPaintSettings settings, StyledMapRenderer painter, boolean selected, boolean member,
-            Node n) {
+            INode n) {
         Color fillColor = symbol.fillColor;
         if (fillColor != null) {
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/RepeatImageElement.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/RepeatImageElement.java	(revision 13918)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/RepeatImageElement.java	(revision 13919)
@@ -5,5 +5,5 @@
 
 import org.openstreetmap.josm.data.osm.IPrimitive;
-import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.osm.IWay;
 import org.openstreetmap.josm.data.osm.visitor.paint.MapPaintSettings;
 import org.openstreetmap.josm.data.osm.visitor.paint.StyledMapRenderer;
@@ -122,6 +122,6 @@
     public void paintPrimitive(IPrimitive primitive, MapPaintSettings paintSettings, StyledMapRenderer painter,
             boolean selected, boolean outermember, boolean member) {
-        if (primitive instanceof Way) {
-            Way w = (Way) primitive;
+        if (primitive instanceof IWay) {
+            IWay<?> w = (IWay<?>) primitive;
             painter.drawRepeatImage(w, pattern, painter.isInactiveMode() || w.isDisabled(), offset, spacing, phase, align);
         }
Index: trunk/src/org/openstreetmap/josm/tools/SubclassFilteredCollection.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/SubclassFilteredCollection.java	(revision 13918)
+++ trunk/src/org/openstreetmap/josm/tools/SubclassFilteredCollection.java	(revision 13919)
@@ -6,4 +6,5 @@
 import java.util.Iterator;
 import java.util.NoSuchElementException;
+import java.util.Objects;
 import java.util.function.Predicate;
 
@@ -76,6 +77,6 @@
      */
     public SubclassFilteredCollection(Collection<? extends S> collection, Predicate<? super S> predicate) {
-        this.collection = collection;
-        this.predicate = predicate;
+        this.collection = Objects.requireNonNull(collection);
+        this.predicate = Objects.requireNonNull(predicate);
     }
 
