Index: /trunk/src/org/openstreetmap/josm/actions/PurgeAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/PurgeAction.java	(revision 13563)
+++ /trunk/src/org/openstreetmap/josm/actions/PurgeAction.java	(revision 13564)
@@ -30,8 +30,9 @@
 import org.openstreetmap.josm.command.PurgeCommand;
 import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.IPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.ConditionalOptionPaneUtil;
 import org.openstreetmap.josm.gui.MainApplication;
-import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
+import org.openstreetmap.josm.gui.PrimitiveRenderer;
 import org.openstreetmap.josm.gui.help.HelpUtil;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
@@ -76,8 +77,8 @@
 
     /** force selection to be active for all entries */
-    static class SelectionForcedOsmPrimitivRenderer extends OsmPrimitivRenderer {
+    static class SelectionForcedPrimitiveRenderer extends PrimitiveRenderer {
         @Override
-        public Component getListCellRendererComponent(JList<? extends OsmPrimitive> list,
-                OsmPrimitive value, int index, boolean isSelected, boolean cellHasFocus) {
+        public Component getListCellRendererComponent(JList<? extends IPrimitive> list,
+                IPrimitive value, int index, boolean isSelected, boolean cellHasFocus) {
             return super.getListCellRendererComponent(list, value, index, true, false);
         }
@@ -151,5 +152,5 @@
             JList<OsmPrimitive> list = new JList<>(toPurgeAdditionally.toArray(new OsmPrimitive[0]));
             /* force selection to be active for all entries */
-            list.setCellRenderer(new SelectionForcedOsmPrimitivRenderer());
+            list.setCellRenderer(new SelectionForcedPrimitiveRenderer());
             JScrollPane scroll = new JScrollPane(list);
             scroll.setPreferredSize(new Dimension(250, 300));
Index: /trunk/src/org/openstreetmap/josm/actions/upload/RelationUploadOrderHook.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/upload/RelationUploadOrderHook.java	(revision 13563)
+++ /trunk/src/org/openstreetmap/josm/actions/upload/RelationUploadOrderHook.java	(revision 13564)
@@ -21,5 +21,5 @@
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.gui.ExtendedDialog;
-import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
+import org.openstreetmap.josm.gui.PrimitiveRenderer;
 import org.openstreetmap.josm.gui.util.WindowGeometry;
 
@@ -55,5 +55,5 @@
         }
         JTable tbl = new JTable(model);
-        OsmPrimitivRenderer renderer = new OsmPrimitivRenderer();
+        PrimitiveRenderer renderer = new PrimitiveRenderer();
         tbl.getColumnModel().getColumn(0).setCellRenderer(renderer);
         tbl.getColumnModel().getColumn(1).setCellRenderer(renderer);
Index: /trunk/src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java	(revision 13563)
+++ /trunk/src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java	(revision 13564)
@@ -316,12 +316,4 @@
     public PrimitiveId getPrimitiveId() {
         return new SimplePrimitiveId(getUniqueId(), getType());
-    }
-
-    /**
-     * Gets the type this primitive is displayed at
-     * @return A {@link OsmPrimitiveType}
-     */
-    public OsmPrimitiveType getDisplayType() {
-        return getType();
     }
 
Index: /trunk/src/org/openstreetmap/josm/data/osm/DefaultNameFormatter.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/DefaultNameFormatter.java	(revision 13563)
+++ /trunk/src/org/openstreetmap/josm/data/osm/DefaultNameFormatter.java	(revision 13564)
@@ -34,7 +34,8 @@
 import org.openstreetmap.josm.tools.I18n;
 import org.openstreetmap.josm.tools.Utils;
+import org.openstreetmap.josm.tools.template_engine.TemplateEngineDataProvider;
 
 /**
- * This is the default implementation of a {@link NameFormatter} for names of {@link OsmPrimitive}s
+ * This is the default implementation of a {@link NameFormatter} for names of {@link IPrimitive}s
  * and {@link HistoryOsmPrimitive}s.
  * @since 12663 (moved from {@code gui} package)
@@ -129,17 +130,18 @@
 
     /**
-     * Formats a name for an {@link OsmPrimitive}.
+     * Formats a name for an {@link IPrimitive}.
      *
      * @param osm the primitive
      * @return the name
      * @since 10991
-     */
-    public String format(OsmPrimitive osm) {
-        if (osm instanceof Node) {
-            return format((Node) osm);
-        } else if (osm instanceof Way) {
-            return format((Way) osm);
-        } else if (osm instanceof Relation) {
-            return format((Relation) osm);
+     * @since 13564 (signature)
+     */
+    public String format(IPrimitive osm) {
+        if (osm instanceof INode) {
+            return format((INode) osm);
+        } else if (osm instanceof IWay) {
+            return format((IWay) osm);
+        } else if (osm instanceof IRelation) {
+            return format((IRelation) osm);
         }
         return null;
@@ -147,5 +149,5 @@
 
     @Override
-    public String format(Node node) {
+    public String format(INode node) {
         StringBuilder name = new StringBuilder();
         if (node.isIncomplete()) {
@@ -153,5 +155,5 @@
         } else {
             TaggingPreset preset = TaggingPresetNameTemplateList.getInstance().findPresetTemplate(node);
-            if (preset == null) {
+            if (preset == null || !(node instanceof TemplateEngineDataProvider)) {
                 String n;
                 if (Config.getPref().getBoolean("osm-primitives.localize-name", true)) {
@@ -184,5 +186,5 @@
                 name.append(n);
             } else {
-                preset.nameTemplate.appendText(name, node);
+                preset.nameTemplate.appendText(name, (TemplateEngineDataProvider) node);
             }
             if (node.isLatLonKnown() && Config.getPref().getBoolean("osm-primitives.showcoor")) {
@@ -204,13 +206,13 @@
     }
 
-    private final Comparator<Node> nodeComparator = (n1, n2) -> format(n1).compareTo(format(n2));
-
-    @Override
-    public Comparator<Node> getNodeComparator() {
+    private final Comparator<INode> nodeComparator = (n1, n2) -> format(n1).compareTo(format(n2));
+
+    @Override
+    public Comparator<INode> getNodeComparator() {
         return nodeComparator;
     }
 
     @Override
-    public String format(Way way) {
+    public String format(IWay way) {
         StringBuilder name = new StringBuilder();
 
@@ -231,5 +233,5 @@
         } else {
             TaggingPreset preset = TaggingPresetNameTemplateList.getInstance().findPresetTemplate(way);
-            if (preset == null) {
+            if (preset == null || !(way instanceof TemplateEngineDataProvider)) {
                 String n;
                 if (Config.getPref().getBoolean("osm-primitives.localize-name", true)) {
@@ -274,5 +276,5 @@
                 name.append(n);
             } else {
-                preset.nameTemplate.appendText(name, way);
+                preset.nameTemplate.appendText(name, (TemplateEngineDataProvider) way);
             }
 
@@ -296,13 +298,13 @@
     }
 
-    private final Comparator<Way> wayComparator = (w1, w2) -> format(w1).compareTo(format(w2));
-
-    @Override
-    public Comparator<Way> getWayComparator() {
+    private final Comparator<IWay> wayComparator = (w1, w2) -> format(w1).compareTo(format(w2));
+
+    @Override
+    public Comparator<IWay> getWayComparator() {
         return wayComparator;
     }
 
     @Override
-    public String format(Relation relation) {
+    public String format(IRelation relation) {
         StringBuilder name = new StringBuilder();
         if (relation.isIncomplete()) {
@@ -334,6 +336,6 @@
     }
 
-    private static StringBuilder formatRelationNameAndType(Relation relation, StringBuilder result, TaggingPreset preset) {
-        if (preset == null) {
+    private static StringBuilder formatRelationNameAndType(IRelation relation, StringBuilder result, TaggingPreset preset) {
+        if (preset == null || !(relation instanceof TemplateEngineDataProvider)) {
             result.append(getRelationTypeName(relation));
             String relationName = getRelationName(relation);
@@ -345,5 +347,5 @@
             result.append(" (").append(relationName).append(", ");
         } else {
-            preset.nameTemplate.appendText(result, relation);
+            preset.nameTemplate.appendText(result, (TemplateEngineDataProvider) relation);
             result.append('(');
         }
@@ -351,5 +353,5 @@
     }
 
-    private final Comparator<Relation> relationComparator = (r1, r2) -> {
+    private final Comparator<IRelation> relationComparator = (r1, r2) -> {
         //TODO This doesn't work correctly with formatHooks
 
@@ -394,5 +396,5 @@
 
     @Override
-    public Comparator<Relation> getRelationComparator() {
+    public Comparator<IRelation> getRelationComparator() {
         return relationComparator;
     }
Index: /trunk/src/org/openstreetmap/josm/data/osm/INode.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/INode.java	(revision 13563)
+++ /trunk/src/org/openstreetmap/josm/data/osm/INode.java	(revision 13564)
@@ -29,3 +29,8 @@
      */
     void setEastNorth(EastNorth eastNorth);
+
+    @Override
+    default String getDisplayName(NameFormatter formatter) {
+        return formatter.format(this);
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/data/osm/IPrimitive.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/IPrimitive.java	(revision 13563)
+++ /trunk/src/org/openstreetmap/josm/data/osm/IPrimitive.java	(revision 13564)
@@ -233,3 +233,21 @@
      */
     String getLocalName();
+
+    /**
+     * Replies the display name of a primitive formatted by <code>formatter</code>
+     * @param formatter formatter to use
+     *
+     * @return the display name
+     * @since 13564
+     */
+    String getDisplayName(NameFormatter formatter);
+
+    /**
+     * Gets the type this primitive is displayed at
+     * @return A {@link OsmPrimitiveType}
+     * @since 13564
+     */
+    default OsmPrimitiveType getDisplayType() {
+        return getType();
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/data/osm/IRelation.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/IRelation.java	(revision 13563)
+++ /trunk/src/org/openstreetmap/josm/data/osm/IRelation.java	(revision 13564)
@@ -34,3 +34,18 @@
      */
     OsmPrimitiveType getMemberType(int idx);
+
+    /**
+     * Determines if at least one child primitive is incomplete.
+     *
+     * @return true if at least one child primitive is incomplete
+     * @since 13564
+     */
+    default boolean hasIncompleteMembers() {
+        return false;
+    }
+
+    @Override
+    default String getDisplayName(NameFormatter formatter) {
+        return formatter.format(this);
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/data/osm/IWay.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/IWay.java	(revision 13563)
+++ /trunk/src/org/openstreetmap/josm/data/osm/IWay.java	(revision 13564)
@@ -16,4 +16,19 @@
 
     /**
+     * Replies the real number of nodes in this way (full number of nodes minus one if this way is closed)
+     *
+     * @return the real number of nodes in this way.
+     *
+     * @see #getNodesCount()
+     * @see #isClosed()
+     * @since 5847
+     * @since 13564 (IWay)
+     */
+    default int getRealNodesCount() {
+        int count = getNodesCount();
+        return isClosed() ? count-1 : count;
+    }
+
+    /**
      * Returns id of the node at given index.
      * @param idx node index
@@ -27,3 +42,8 @@
      */
     boolean isClosed();
+
+    @Override
+    default String getDisplayName(NameFormatter formatter) {
+        return formatter.format(this);
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/data/osm/NameFormatter.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/NameFormatter.java	(revision 13563)
+++ /trunk/src/org/openstreetmap/josm/data/osm/NameFormatter.java	(revision 13564)
@@ -5,5 +5,5 @@
 
 /**
- * Formats a name for a {@link OsmPrimitive}.
+ * Formats a name for an {@link IPrimitive}.
  * @since 1990
  */
@@ -11,26 +11,29 @@
 
     /**
-     * Formats a name for a {@link Node}.
+     * Formats a name for a {@link INode}.
      *
      * @param node the node
      * @return the name
+     * @since 13564 (signature)
      */
-    String format(Node node);
+    String format(INode node);
 
     /**
-     * Formats a name for a {@link Way}.
+     * Formats a name for a {@link IWay}.
      *
      * @param way the way
      * @return the name
+     * @since 13564 (signature)
      */
-    String format(Way way);
+    String format(IWay way);
 
     /**
-     * Formats a name for a {@link Relation}.
+     * Formats a name for a {@link IRelation}.
      *
      * @param relation the relation
      * @return the name
+     * @since 13564 (signature)
      */
-    String format(Relation relation);
+    String format(IRelation relation);
 
     /**
@@ -45,17 +48,20 @@
      * Gets a comparator that sorts the nodes by the string that this formatter would create for them
      * @return That comparator
+     * @since 13564 (signature)
      */
-    Comparator<Node> getNodeComparator();
+    Comparator<INode> getNodeComparator();
 
     /**
      * Gets a comparator that sorts the ways by the string that this formatter would create for them
      * @return That comparator
+     * @since 13564 (signature)
      */
-    Comparator<Way> getWayComparator();
+    Comparator<IWay> getWayComparator();
 
     /**
      * Gets a comparator that sorts the relations by the string that this formatter would create for them
      * @return That comparator
+     * @since 13564 (signature)
      */
-    Comparator<Relation> getRelationComparator();
+    Comparator<IRelation> getRelationComparator();
 }
Index: /trunk/src/org/openstreetmap/josm/data/osm/Node.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/Node.java	(revision 13563)
+++ /trunk/src/org/openstreetmap/josm/data/osm/Node.java	(revision 13564)
@@ -317,9 +317,4 @@
 
     @Override
-    public String getDisplayName(NameFormatter formatter) {
-        return formatter.format(this);
-    }
-
-    @Override
     public OsmPrimitiveType getType() {
         return OsmPrimitiveType.NODE;
Index: /trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 13563)
+++ /trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 13564)
@@ -1365,12 +1365,4 @@
     }
 
-    /**
-     * Replies the display name of a primitive formatted by <code>formatter</code>
-     * @param formatter formatter to use
-     *
-     * @return the display name
-     */
-    public abstract String getDisplayName(NameFormatter formatter);
-
     @Override
     public Collection<String> getTemplateKeys() {
Index: /trunk/src/org/openstreetmap/josm/data/osm/Relation.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 13563)
+++ /trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 13564)
@@ -395,9 +395,4 @@
     }
 
-    @Override
-    public String getDisplayName(NameFormatter formatter) {
-        return formatter.format(this);
-    }
-
     /**
      * Replies the set of  {@link OsmPrimitive}s referred to by at least one
@@ -525,9 +520,5 @@
     }
 
-    /**
-     * Determines if at least one child primitive is incomplete.
-     *
-     * @return true if at least one child primitive is incomplete
-     */
+    @Override
     public boolean hasIncompleteMembers() {
         RelationMember[] members = this.members;
Index: /trunk/src/org/openstreetmap/josm/data/osm/Way.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 13563)
+++ /trunk/src/org/openstreetmap/josm/data/osm/Way.java	(revision 13564)
@@ -105,18 +105,4 @@
 
     /**
-     * Replies the real number of nodes in this way (full number of nodes minus one if this way is closed)
-     *
-     * @return the real number of nodes in this way.
-     *
-     * @see #getNodesCount()
-     * @see #isClosed()
-     * @since 5847
-     */
-    public int getRealNodesCount() {
-        int count = getNodesCount();
-        return isClosed() ? count-1 : count;
-    }
-
-    /**
      * Replies the node at position <code>index</code>.
      *
@@ -576,9 +562,4 @@
         }
         return false;
-    }
-
-    @Override
-    public String getDisplayName(NameFormatter formatter) {
-        return formatter.format(this);
     }
 
Index: /trunk/src/org/openstreetmap/josm/gui/OsmPrimitivRenderer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/OsmPrimitivRenderer.java	(revision 13563)
+++ /trunk/src/org/openstreetmap/josm/gui/OsmPrimitivRenderer.java	(revision 13564)
@@ -26,5 +26,7 @@
  * @author imi
  * @author Frederik Ramm
+ * @deprecated since 13564. Use {@link PrimitiveRenderer} instead
  */
+@Deprecated
 public class OsmPrimitivRenderer implements ListCellRenderer<OsmPrimitive>, TableCellRenderer {
     private final DefaultNameFormatter formatter = DefaultNameFormatter.getInstance();
Index: /trunk/src/org/openstreetmap/josm/gui/PrimitiveRenderer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/PrimitiveRenderer.java	(revision 13564)
+++ /trunk/src/org/openstreetmap/josm/gui/PrimitiveRenderer.java	(revision 13564)
@@ -0,0 +1,129 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui;
+
+import java.awt.Component;
+
+import javax.swing.DefaultListCellRenderer;
+import javax.swing.ImageIcon;
+import javax.swing.JLabel;
+import javax.swing.JList;
+import javax.swing.JTable;
+import javax.swing.ListCellRenderer;
+import javax.swing.table.DefaultTableCellRenderer;
+import javax.swing.table.TableCellRenderer;
+
+import org.openstreetmap.josm.data.osm.DefaultNameFormatter;
+import org.openstreetmap.josm.data.osm.IPrimitive;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
+import org.openstreetmap.josm.tools.ImageProvider;
+import org.openstreetmap.josm.tools.Logging;
+
+/**
+ * Renderer that renders the objects from an {@link IPrimitive} as data.
+ *
+ * Can be used in lists and tables.
+ *
+ * @author imi
+ * @author Frederik Ramm
+ * @since 13564 (successor to {@link OsmPrimitivRenderer}
+ */
+public class PrimitiveRenderer implements ListCellRenderer<IPrimitive>, TableCellRenderer {
+    private final DefaultNameFormatter formatter = DefaultNameFormatter.getInstance();
+
+    /**
+     * Default list cell renderer - delegate for ListCellRenderer operation
+     */
+    private final DefaultListCellRenderer defaultListCellRenderer = new DefaultListCellRenderer();
+
+    /**
+     * Default table cell renderer - delegate for TableCellRenderer operation
+     */
+    private final DefaultTableCellRenderer defaultTableCellRenderer = new DefaultTableCellRenderer();
+
+    /**
+     * Adapter method supporting the ListCellRenderer interface.
+     */
+    @Override
+    public Component getListCellRendererComponent(JList<? extends IPrimitive> list, IPrimitive value, int index,
+            boolean isSelected, boolean cellHasFocus) {
+        Component def = defaultListCellRenderer.getListCellRendererComponent(list, null, index, isSelected, cellHasFocus);
+        return renderer(def, value, list.getModel().getSize() > 1000);
+    }
+
+    /**
+     * Adapter method supporting the TableCellRenderer interface.
+     */
+    @Override
+    public Component getTableCellRendererComponent(JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column) {
+        Component def = defaultTableCellRenderer.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column);
+        if (value instanceof IPrimitive)
+            return renderer(def, (IPrimitive) value, table.getModel().getRowCount() > 1000);
+        else if (value instanceof HistoryOsmPrimitive)
+            return renderer(def, (HistoryOsmPrimitive) value);
+        else
+            return def;
+    }
+
+    /**
+     * Internal method that stuffs information into the rendering component
+     * provided that it's a kind of JLabel.
+     * @param def the rendering component
+     * @param value the IPrimitive to render
+     * @param fast whether the icons should be loaded fast since many items are being displayed
+     * @return the modified rendering component
+     */
+    private Component renderer(Component def, IPrimitive value, boolean fast) {
+        if (value != null && def instanceof JLabel) {
+            ((JLabel) def).setText(getComponentText(value));
+            final ImageIcon icon = (fast || !(value instanceof OsmPrimitive))
+                    ? ImageProvider.get(value.getType())
+                    : ImageProvider.getPadded((OsmPrimitive) value,
+                        // Height of component no yet known, assume the default 16px.
+                        ImageProvider.ImageSizes.SMALLICON.getImageDimension());
+            if (icon != null) {
+                ((JLabel) def).setIcon(icon);
+            } else {
+                Logging.warn("Null icon for "+value.getDisplayType());
+            }
+            ((JLabel) def).setToolTipText(getComponentToolTipText(value));
+        }
+        return def;
+    }
+
+    /**
+     * Internal method that stuffs information into the rendering component
+     * provided that it's a kind of JLabel.
+     * @param def the rendering component
+     * @param value the HistoryOsmPrimitive to render
+     * @return the modified rendering component
+     */
+    private Component renderer(Component def, HistoryOsmPrimitive value) {
+        if (value != null && def instanceof JLabel) {
+            ((JLabel) def).setText(value.getDisplayName(DefaultNameFormatter.getInstance()));
+            ((JLabel) def).setIcon(ImageProvider.get(value.getType()));
+            ((JLabel) def).setToolTipText(formatter.buildDefaultToolTip(value));
+        }
+        return def;
+    }
+
+    /**
+     * Returns the text representing an OSM primitive in a component.
+     * Can be overridden to customize the text
+     * @param value OSM primitive
+     * @return text representing the OSM primitive
+     */
+    protected String getComponentText(IPrimitive value) {
+        return value.getDisplayName(DefaultNameFormatter.getInstance());
+    }
+
+    /**
+     * Returns the text representing an OSM primitive in a tooltip.
+     * Can be overridden to customize the ToolTipText
+     * @param value OSM primitive
+     * @return text representing the OSM primitive
+     */
+    protected String getComponentToolTipText(IPrimitive value) {
+        return formatter.buildDefaultToolTip(value);
+    }
+}
Index: /trunk/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolverColumnModel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolverColumnModel.java	(revision 13563)
+++ /trunk/src/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolverColumnModel.java	(revision 13564)
@@ -12,5 +12,5 @@
 import javax.swing.table.TableColumn;
 
-import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
+import org.openstreetmap.josm.gui.PrimitiveRenderer;
 import org.openstreetmap.josm.gui.conflict.ConflictColors;
 import org.openstreetmap.josm.gui.conflict.pair.relation.RelationMemberTable;
@@ -22,5 +22,5 @@
 public class RelationMemberConflictResolverColumnModel extends DefaultTableColumnModel {
 
-    static final class MemberRenderer extends OsmPrimitivRenderer {
+    static final class MemberRenderer extends PrimitiveRenderer {
         @Override
         public Component getTableCellRendererComponent(JTable table,
@@ -33,5 +33,5 @@
     private final DefaultTableCellRenderer defaultTableCellRenderer = new DefaultTableCellRenderer();
 
-    private final transient OsmPrimitivRenderer primitiveRenderer = new MemberRenderer();
+    private final transient PrimitiveRenderer primitiveRenderer = new MemberRenderer();
 
     private final transient TableCellRenderer tableRenderer = (table, value, isSelected, hasFocus, row, column)
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java	(revision 13563)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java	(revision 13564)
@@ -57,5 +57,5 @@
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.NavigatableComponent;
-import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
+import org.openstreetmap.josm.gui.PrimitiveRenderer;
 import org.openstreetmap.josm.gui.PopupMenuHandler;
 import org.openstreetmap.josm.gui.SideButton;
@@ -127,5 +127,5 @@
             lstConflicts = new JList<>(model);
             lstConflicts.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
-            lstConflicts.setCellRenderer(new OsmPrimitivRenderer());
+            lstConflicts.setCellRenderer(new PrimitiveRenderer());
             lstConflicts.addMouseListener(new MouseEventHandler());
         }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/DeleteFromRelationConfirmationDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/DeleteFromRelationConfirmationDialog.java	(revision 13563)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/DeleteFromRelationConfirmationDialog.java	(revision 13564)
@@ -37,5 +37,5 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.RelationToChildReference;
-import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
+import org.openstreetmap.josm.gui.PrimitiveRenderer;
 import org.openstreetmap.josm.gui.help.ContextSensitiveHelpAction;
 import org.openstreetmap.josm.gui.help.HelpUtil;
@@ -296,5 +296,5 @@
             col.setWidth(100);
             col.setPreferredWidth(100);
-            col.setCellRenderer(new OsmPrimitivRenderer());
+            col.setCellRenderer(new PrimitiveRenderer());
             addColumn(col);
 
@@ -305,5 +305,5 @@
             col.setWidth(100);
             col.setPreferredWidth(100);
-            col.setCellRenderer(new OsmPrimitivRenderer());
+            col.setCellRenderer(new PrimitiveRenderer());
             addColumn(col);
 
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 13563)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 13564)
@@ -49,4 +49,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.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
@@ -66,6 +67,6 @@
 import org.openstreetmap.josm.gui.MapView;
 import org.openstreetmap.josm.gui.NavigatableComponent;
-import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
 import org.openstreetmap.josm.gui.PopupMenuHandler;
+import org.openstreetmap.josm.gui.PrimitiveRenderer;
 import org.openstreetmap.josm.gui.SideButton;
 import org.openstreetmap.josm.gui.dialogs.relation.RelationEditor;
@@ -322,7 +323,7 @@
     }
 
-    static final class NoTooltipOsmRenderer extends OsmPrimitivRenderer {
-        @Override
-        protected String getComponentToolTipText(OsmPrimitive value) {
+    static final class NoTooltipOsmRenderer extends PrimitiveRenderer {
+        @Override
+        protected String getComponentToolTipText(IPrimitive value) {
             // Don't show the default tooltip in the relation list
             return null;
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 13563)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 13564)
@@ -65,5 +65,5 @@
 import org.openstreetmap.josm.data.osm.visitor.BoundingXYVisitor;
 import org.openstreetmap.josm.gui.MainApplication;
-import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
+import org.openstreetmap.josm.gui.PrimitiveRenderer;
 import org.openstreetmap.josm.gui.PopupMenuHandler;
 import org.openstreetmap.josm.gui.SideButton;
@@ -113,5 +113,5 @@
         lstPrimitives.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
         lstPrimitives.setSelectionModel(selectionModel);
-        lstPrimitives.setCellRenderer(new OsmPrimitivRenderer());
+        lstPrimitives.setCellRenderer(new PrimitiveRenderer());
         lstPrimitives.setTransferHandler(new SelectionTransferHandler());
         if (!GraphicsEnvironment.isHeadless()) {
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentTableCellRenderer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentTableCellRenderer.java	(revision 13563)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentTableCellRenderer.java	(revision 13564)
@@ -13,5 +13,5 @@
 /**
  * The table cell renderer used in the changeset content table, except for the "name"
- * column in which we use a {@link org.openstreetmap.josm.gui.OsmPrimitivRenderer}.
+ * column in which we use a {@link org.openstreetmap.josm.gui.PrimitiveRenderer}.
  */
 public class ChangesetContentTableCellRenderer extends AbstractCellRenderer {
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentTableColumnModel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentTableColumnModel.java	(revision 13563)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentTableColumnModel.java	(revision 13564)
@@ -7,5 +7,5 @@
 import javax.swing.table.TableColumn;
 
-import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
+import org.openstreetmap.josm.gui.PrimitiveRenderer;
 
 /**
@@ -48,5 +48,5 @@
         col.setResizable(true);
         col.setPreferredWidth(200);
-        col.setCellRenderer(new OsmPrimitivRenderer());
+        col.setCellRenderer(new PrimitiveRenderer());
         addColumn(col);
     }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/ReferringRelationsBrowser.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/ReferringRelationsBrowser.java	(revision 13563)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/relation/ReferringRelationsBrowser.java	(revision 13564)
@@ -24,5 +24,5 @@
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.gui.MainApplication;
-import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
+import org.openstreetmap.josm.gui.PrimitiveRenderer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.gui.progress.swing.PleaseWaitProgressMonitor;
@@ -59,5 +59,5 @@
         setLayout(new BorderLayout());
         referrers = new JList<>(model);
-        referrers.setCellRenderer(new OsmPrimitivRenderer());
+        referrers.setCellRenderer(new PrimitiveRenderer());
         add(new JScrollPane(referrers), BorderLayout.CENTER);
         referrers.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
Index: /trunk/src/org/openstreetmap/josm/gui/io/UploadSelectionDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/io/UploadSelectionDialog.java	(revision 13563)
+++ /trunk/src/org/openstreetmap/josm/gui/io/UploadSelectionDialog.java	(revision 13564)
@@ -36,5 +36,5 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
-import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
+import org.openstreetmap.josm.gui.PrimitiveRenderer;
 import org.openstreetmap.josm.gui.help.ContextSensitiveHelpAction;
 import org.openstreetmap.josm.gui.help.HelpUtil;
@@ -196,5 +196,5 @@
         protected void init() {
             setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);
-            setCellRenderer(new OsmPrimitivRenderer());
+            setCellRenderer(new PrimitiveRenderer());
         }
 
Index: /trunk/src/org/openstreetmap/josm/gui/io/UploadedObjectsSummaryPanel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/io/UploadedObjectsSummaryPanel.java	(revision 13563)
+++ /trunk/src/org/openstreetmap/josm/gui/io/UploadedObjectsSummaryPanel.java	(revision 13564)
@@ -18,5 +18,5 @@
 
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
+import org.openstreetmap.josm.gui.PrimitiveRenderer;
 
 /**
@@ -52,5 +52,5 @@
     protected void build() {
         setLayout(new GridBagLayout());
-        OsmPrimitivRenderer renderer = new OsmPrimitivRenderer();
+        PrimitiveRenderer renderer = new PrimitiveRenderer();
         // initialize the three lists for uploaded primitives, but don't add them to the dialog yet, see setUploadedPrimitives()
         //
Index: /trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetNameTemplateList.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetNameTemplateList.java	(revision 13563)
+++ /trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetNameTemplateList.java	(revision 13564)
@@ -7,5 +7,5 @@
 import java.util.List;
 
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.IPrimitive;
 import org.openstreetmap.josm.tools.Logging;
 
@@ -52,5 +52,5 @@
      * @return the first occurence of preset with template name matching the primitive
      */
-    public TaggingPreset findPresetTemplate(OsmPrimitive primitive) {
+    public TaggingPreset findPresetTemplate(IPrimitive primitive) {
         synchronized (this) {
             for (TaggingPreset t : presetsWithPattern) {
Index: /trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetType.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetType.java	(revision 13563)
+++ /trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresetType.java	(revision 13564)
@@ -2,5 +2,5 @@
 package org.openstreetmap.josm.gui.tagging.presets;
 
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.IPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 
@@ -49,5 +49,5 @@
      * @return the {@code TaggingPresetType} of {@code p}
      */
-    public static TaggingPresetType forPrimitive(OsmPrimitive p) {
+    public static TaggingPresetType forPrimitive(IPrimitive p) {
         return forPrimitiveType(p.getDisplayType());
     }
Index: /trunk/test/unit/org/openstreetmap/josm/actions/mapmode/DrawActionTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/actions/mapmode/DrawActionTest.java	(revision 13563)
+++ /trunk/test/unit/org/openstreetmap/josm/actions/mapmode/DrawActionTest.java	(revision 13564)
@@ -24,5 +24,5 @@
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.MapFrame;
-import org.openstreetmap.josm.gui.OsmPrimitivRenderer;
+import org.openstreetmap.josm.gui.PrimitiveRenderer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.testutils.JOSMTestRules;
@@ -44,5 +44,5 @@
     /**
      * Non regression test case for bug #12011.
-     * Add a new node in the middle of way then undo. The rendering of the node, selected, must not cause any crash in OsmPrimitivRenderer.
+     * Add a new node in the middle of way then undo. The rendering of the node, selected, must not cause any crash in PrimitiveRenderer.
      * @throws SecurityException see {@link Class#getDeclaredField} for details
      * @throws NoSuchFieldException see {@link Class#getDeclaredField} for details
@@ -82,5 +82,5 @@
 
             JList<OsmPrimitive> lstPrimitives = new JList<>();
-            OsmPrimitivRenderer renderer = new OsmPrimitivRenderer();
+            PrimitiveRenderer renderer = new PrimitiveRenderer();
 
             assertEquals(3, w.getNodesCount());
Index: /trunk/test/unit/org/openstreetmap/josm/data/osm/DefaultNameFormatterTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/data/osm/DefaultNameFormatterTest.java	(revision 13563)
+++ /trunk/test/unit/org/openstreetmap/josm/data/osm/DefaultNameFormatterTest.java	(revision 13564)
@@ -63,5 +63,5 @@
         TaggingPresets.addTaggingPresets(TaggingPresetReader.readAll("http://localhost:" + wireMockRule.port() + "/" + source, true));
 
-        Comparator<Relation> comparator = DefaultNameFormatter.getInstance().getRelationComparator();
+        Comparator<IRelation> comparator = DefaultNameFormatter.getInstance().getRelationComparator();
 
         try (InputStream is = TestUtils.getRegressionDataStream(9632, "data.osm.zip")) {
