Index: trunk/src/org/openstreetmap/josm/data/osm/IPrimitive.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/IPrimitive.java	(revision 13661)
+++ trunk/src/org/openstreetmap/josm/data/osm/IPrimitive.java	(revision 13662)
@@ -101,4 +101,22 @@
 
     /**
+     * Replies true, if this primitive is disabled. (E.g. a filter applies)
+     * @return {@code true} if this object has the "disabled" flag enabled
+     * @since 13662
+     */
+    default boolean isDisabled() {
+        return false;
+    }
+
+    /**
+     * Replies true, if this primitive is disabled and marked as completely hidden on the map.
+     * @return {@code true} if this object has both the "disabled" and "hide if disabled" flags enabled
+     * @since 13662
+     */
+    default boolean isDisabledAndHidden() {
+        return false;
+    }
+
+    /**
      * Replies the id of this primitive.
      *
@@ -251,3 +269,34 @@
         return getType();
     }
+
+    /**
+     * Determines if this object is considered "tagged". To be "tagged", an object
+     * must have one or more "interesting" tags. "created_by" and "source"
+     * are typically considered "uninteresting" and do not make an object "tagged".
+     * @return true if this object is considered "tagged"
+     * @since 13662
+     */
+    boolean isTagged();
+
+    /**
+     * Determines if this object is considered "annotated". To be "annotated", an object
+     * must have one or more "work in progress" tags, such as "note" or "fixme".
+     * @return true if this object is considered "annotated"
+     * @since 13662
+     */
+    boolean isAnnotated();
+
+    /**
+     * true if this object has direction dependent tags (e.g. oneway)
+     * @return {@code true} if this object has direction dependent tags
+     * @since 13662
+     */
+    boolean hasDirectionKeys();
+
+    /**
+     * true if this object has the "reversed direction" flag enabled
+     * @return {@code true} if this object has the "reversed direction" flag enabled
+     * @since 13662
+     */
+    boolean reversedDirection();
 }
Index: trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 13661)
+++ trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 13662)
@@ -445,16 +445,10 @@
     }
 
-    /**
-     * Replies true, if this primitive is disabled. (E.g. a filter applies)
-     * @return {@code true} if this object has the "disabled" flag enabled
-     */
+    @Override
     public boolean isDisabled() {
         return (flags & FLAG_DISABLED) != 0;
     }
 
-    /**
-     * Replies true, if this primitive is disabled and marked as completely hidden on the map.
-     * @return {@code true} if this object has both the "disabled" and "hide if disabled" flags enabled
-     */
+    @Override
     public boolean isDisabledAndHidden() {
         return ((flags & FLAG_DISABLED) != 0) && ((flags & FLAG_HIDE_IF_DISABLED) != 0);
@@ -825,21 +819,10 @@
     }
 
-    /**
-     * Determines if this object is considered "tagged". To be "tagged", an object
-     * must have one or more "interesting" tags. "created_by" and "source"
-     * are typically considered "uninteresting" and do not make an object
-     * "tagged".
-     * @return true if this object is considered "tagged"
-     */
+    @Override
     public boolean isTagged() {
         return (flags & FLAG_TAGGED) != 0;
     }
 
-    /**
-     * Determines if this object is considered "annotated". To be "annotated", an object
-     * must have one or more "work in progress" tags, such as "note" or "fixme".
-     * @return true if this object is considered "annotated"
-     * @since 5754
-     */
+    @Override
     public boolean isAnnotated() {
         return (flags & FLAG_ANNOTATED) != 0;
@@ -861,16 +844,10 @@
     }
 
-    /**
-     * true if this object has direction dependent tags (e.g. oneway)
-     * @return {@code true} if this object has direction dependent tags
-     */
+    @Override
     public boolean hasDirectionKeys() {
         return (flags & FLAG_HAS_DIRECTIONS) != 0;
     }
 
-    /**
-     * true if this object has the "reversed diretion" flag enabled
-     * @return {@code true} if this object has the "reversed diretion" flag enabled
-     */
+    @Override
     public boolean reversedDirection() {
         return (flags & FLAG_DIRECTION_REVERSED) != 0;
Index: trunk/src/org/openstreetmap/josm/data/osm/PrimitiveData.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/PrimitiveData.java	(revision 13661)
+++ trunk/src/org/openstreetmap/josm/data/osm/PrimitiveData.java	(revision 13662)
@@ -134,4 +134,24 @@
 
     @Override
+    public boolean isTagged() {
+        return hasKeys();
+    }
+
+    @Override
+    public boolean isAnnotated() {
+        return false;
+    }
+
+    @Override
+    public boolean hasDirectionKeys() {
+        return false;
+    }
+
+    @Override
+    public boolean reversedDirection() {
+        return false;
+    }
+
+    @Override
     public StyleCache getCachedStyle() {
         return null;
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(revision 13661)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(revision 13662)
@@ -47,4 +47,5 @@
 import org.openstreetmap.josm.data.osm.BBox;
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.IPrimitive;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -754,5 +755,5 @@
      * @since 11670
      */
-    public void drawAreaIcon(OsmPrimitive osm, MapImage img, boolean disabled, boolean selected, boolean member, double theta,
+    public void drawAreaIcon(IPrimitive osm, MapImage img, boolean disabled, boolean selected, boolean member, double theta,
             PositionForAreaStrategy iconPosition) {
         Rectangle2D.Double iconRect = new Rectangle2D.Double(-img.getWidth() / 2.0, -img.getHeight() / 2.0, img.getWidth(), img.getHeight());
@@ -1090,5 +1091,5 @@
      * @since 11722
      */
-    public void drawText(OsmPrimitive osm, TextLabel text, PositionForAreaStrategy labelPositionStrategy) {
+    public void drawText(IPrimitive osm, TextLabel text, PositionForAreaStrategy labelPositionStrategy) {
         if (!isShowNames()) {
             return;
@@ -1126,5 +1127,5 @@
     }
 
-    private void displayText(OsmPrimitive osm, TextLabel text, String name, Rectangle2D nb,
+    private void displayText(IPrimitive osm, TextLabel text, String name, Rectangle2D nb,
             MapViewPositionAndRotation center) {
         AffineTransform at = new AffineTransform();
@@ -1182,5 +1183,5 @@
      * @param consumer The consumer to call.
      */
-    private void forEachPolygon(OsmPrimitive osm, Consumer<MapViewPath> consumer) {
+    private void forEachPolygon(IPrimitive osm, Consumer<MapViewPath> consumer) {
         if (osm instanceof Way) {
             consumer.accept(getPath((Way) osm));
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/AreaElement.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/AreaElement.java	(revision 13661)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/AreaElement.java	(revision 13662)
@@ -7,5 +7,5 @@
 import java.util.Objects;
 
-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.data.osm.Way;
@@ -120,5 +120,5 @@
 
     @Override
-    public void paintPrimitive(OsmPrimitive osm, MapPaintSettings paintSettings, StyledMapRenderer painter,
+    public void paintPrimitive(IPrimitive osm, MapPaintSettings paintSettings, StyledMapRenderer painter,
             boolean selected, boolean outermember, boolean member) {
         Color myColor = color;
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/AreaIconElement.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/AreaIconElement.java	(revision 13661)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/AreaIconElement.java	(revision 13662)
@@ -4,5 +4,5 @@
 import java.util.Objects;
 
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.IPrimitive;
 import org.openstreetmap.josm.data.osm.visitor.paint.MapPaintSettings;
 import org.openstreetmap.josm.data.osm.visitor.paint.StyledMapRenderer;
@@ -43,5 +43,5 @@
 
     @Override
-    public void paintPrimitive(OsmPrimitive osm, MapPaintSettings paintSettings, StyledMapRenderer painter,
+    public void paintPrimitive(IPrimitive osm, MapPaintSettings paintSettings, StyledMapRenderer painter,
             boolean selected, boolean outermember, boolean member) {
         if (painter.isShowIcons()) {
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/BoxTextElement.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/BoxTextElement.java	(revision 13661)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/BoxTextElement.java	(revision 13662)
@@ -7,6 +7,6 @@
 import java.util.Objects;
 
+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.visitor.paint.MapPaintSettings;
 import org.openstreetmap.josm.data.osm.visitor.paint.PaintColors;
@@ -282,5 +282,5 @@
 
     @Override
-    public void paintPrimitive(OsmPrimitive osm, MapPaintSettings settings, StyledMapRenderer painter,
+    public void paintPrimitive(IPrimitive osm, MapPaintSettings settings, StyledMapRenderer painter,
             boolean selected, boolean outermember, boolean member) {
         if (osm instanceof Node) {
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/LineElement.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/LineElement.java	(revision 13661)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/LineElement.java	(revision 13662)
@@ -8,6 +8,6 @@
 import java.util.Optional;
 
+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.Way;
 import org.openstreetmap.josm.data.osm.visitor.paint.MapPaintSettings;
@@ -110,5 +110,5 @@
 
     @Override
-    public void paintPrimitive(OsmPrimitive primitive, MapPaintSettings paintSettings, StyledMapRenderer painter,
+    public void paintPrimitive(IPrimitive primitive, MapPaintSettings paintSettings, StyledMapRenderer painter,
             boolean selected, boolean outermember, boolean member) {
         /* show direction arrows, if draw.segment.relevant_directions_only is not set,
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/NodeElement.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/NodeElement.java	(revision 13661)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/NodeElement.java	(revision 13662)
@@ -10,6 +10,6 @@
 import java.util.stream.IntStream;
 
+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.visitor.paint.MapPaintSettings;
@@ -267,5 +267,5 @@
 
     @Override
-    public void paintPrimitive(OsmPrimitive primitive, MapPaintSettings settings, StyledMapRenderer painter,
+    public void paintPrimitive(IPrimitive primitive, MapPaintSettings settings, StyledMapRenderer painter,
             boolean selected, boolean outermember, boolean member) {
         if (primitive instanceof Node) {
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/RepeatImageElement.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/RepeatImageElement.java	(revision 13661)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/RepeatImageElement.java	(revision 13662)
@@ -4,5 +4,5 @@
 import java.util.Objects;
 
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.IPrimitive;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.visitor.paint.MapPaintSettings;
@@ -120,5 +120,5 @@
 
     @Override
-    public void paintPrimitive(OsmPrimitive primitive, MapPaintSettings paintSettings, StyledMapRenderer painter,
+    public void paintPrimitive(IPrimitive primitive, MapPaintSettings paintSettings, StyledMapRenderer painter,
             boolean selected, boolean outermember, boolean member) {
         if (primitive instanceof Way) {
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/StyleElement.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/StyleElement.java	(revision 13661)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/StyleElement.java	(revision 13662)
@@ -7,4 +7,5 @@
 import java.util.Objects;
 
+import org.openstreetmap.josm.data.osm.IPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.visitor.paint.MapPaintSettings;
@@ -88,6 +89,7 @@
      * @param outermember true, if primitive is not selected and outer member of a selected multipolygon relation
      * @param member true, if primitive is not selected and member of a selected relation
-     */
-    public abstract void paintPrimitive(OsmPrimitive primitive, MapPaintSettings paintSettings, StyledMapRenderer painter,
+     * @since 13662 (signature)
+     */
+    public abstract void paintPrimitive(IPrimitive primitive, MapPaintSettings paintSettings, StyledMapRenderer painter,
             boolean selected, boolean outermember, boolean member);
 
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/TextElement.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/TextElement.java	(revision 13661)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/TextElement.java	(revision 13662)
@@ -4,5 +4,5 @@
 import java.util.Objects;
 
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.IPrimitive;
 import org.openstreetmap.josm.data.osm.visitor.paint.MapPaintSettings;
 import org.openstreetmap.josm.data.osm.visitor.paint.PaintColors;
@@ -88,5 +88,5 @@
 
     @Override
-    public void paintPrimitive(OsmPrimitive primitive, MapPaintSettings paintSettings, StyledMapRenderer painter,
+    public void paintPrimitive(IPrimitive primitive, MapPaintSettings paintSettings, StyledMapRenderer painter,
             boolean selected, boolean outermember, boolean member) {
         painter.drawText(primitive, text, getLabelPositionStrategy());
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/TextLabel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/TextLabel.java	(revision 13661)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/TextLabel.java	(revision 13662)
@@ -7,4 +7,5 @@
 import java.util.Objects;
 
+import org.openstreetmap.josm.data.osm.IPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.mappaint.Cascade;
@@ -184,5 +185,5 @@
      * derived for {@code osm}
      */
-    public String getString(OsmPrimitive osm) {
+    public String getString(IPrimitive osm) {
         if (labelCompositionStrategy == null) return null;
         return labelCompositionStrategy.compose(osm);
