Index: trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 18691)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 18692)
@@ -2,4 +2,5 @@
 package org.openstreetmap.josm.gui.dialogs.properties;
 
+import static org.openstreetmap.josm.actions.search.SearchAction.searchStateless;
 import static org.openstreetmap.josm.tools.I18n.tr;
 
@@ -109,4 +110,5 @@
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetType;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets;
+import org.openstreetmap.josm.gui.tagging.presets.items.KeyedItem;
 import org.openstreetmap.josm.gui.util.AbstractTag2LinkPopupListener;
 import org.openstreetmap.josm.gui.util.HighlightHelper;
@@ -355,6 +357,6 @@
         tagRowSorter.setComparator(1, (o1, o2) -> {
             if (o1 instanceof Map && o2 instanceof Map) {
-                final String v1 = ((Map) o1).size() == 1 ? (String) ((Map) o1).keySet().iterator().next() : tr("<different>");
-                final String v2 = ((Map) o2).size() == 1 ? (String) ((Map) o2).keySet().iterator().next() : tr("<different>");
+                final String v1 = ((Map) o1).size() == 1 ? (String) ((Map) o1).keySet().iterator().next() : KeyedItem.DIFFERENT_I18N;
+                final String v2 = ((Map) o2).size() == 1 ? (String) ((Map) o2).keySet().iterator().next() : KeyedItem.DIFFERENT_I18N;
                 return AlphanumComparator.getInstance().compare(v1, v2);
             } else {
@@ -773,5 +775,5 @@
             tagData.addRow(new Object[]{e.getKey(), e.getValue()});
             tags.put(e.getKey(), e.getValue().size() == 1
-                    ? e.getValue().keySet().iterator().next() : tr("<different>"));
+                    ? e.getValue().keySet().iterator().next() : KeyedItem.DIFFERENT_I18N);
         }
 
@@ -1200,5 +1202,5 @@
                         roleString = r.getRole();
                     } else if (!roleString.equals(r.getRole())) {
-                        roleString = tr("<different>");
+                        roleString = KeyedItem.DIFFERENT_I18N;
                         break;
                     }
@@ -1210,8 +1212,5 @@
         @Override
         public String toString() {
-            return "MemberInfo{" +
-                    "roles='" + roleString + '\'' +
-                    ", positions='" + positionString + '\'' +
-                    '}';
+            return String.format("MemberInfo{roles='%s', positions='%s'}", roleString, positionString);
         }
     }
@@ -1466,5 +1465,5 @@
                 return;
             final SearchSetting ss = createSearchSetting(key, sel, sameType);
-            org.openstreetmap.josm.actions.search.SearchAction.searchStateless(ss);
+            searchStateless(ss);
         }
     }
@@ -1489,5 +1488,5 @@
                 t = "type:relation ";
             }
-            String token = new StringBuilder(t).append(val).toString();
+            String token = t + val;
             if (consideredTokens.add(token)) {
                 s.append(sep).append('(').append(t).append(SearchCompiler.buildSearchStringForTag(key, val)).append(')');
@@ -1510,6 +1509,6 @@
             try {
                 tagRowSorter.convertRowIndexToModel(tagTable.getSelectedRow());
-            } catch (IndexOutOfBoundsException ignore) {
-                Logging.trace(ignore);
+            } catch (IndexOutOfBoundsException e) {
+                Logging.trace(e);
                 Logging.trace("Clearing tagTable selection");
                 tagTable.clearSelection();
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/properties/RelationRoleEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/properties/RelationRoleEditor.java	(revision 18691)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/properties/RelationRoleEditor.java	(revision 18692)
@@ -15,4 +15,5 @@
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.gui.MainApplication;
+import org.openstreetmap.josm.gui.tagging.presets.items.KeyedItem;
 import org.openstreetmap.josm.tools.Utils;
 
@@ -42,5 +43,5 @@
                 formatter.formatAsHtmlUnorderedList(relation)),
                 oldRole);
-        if (newRole == null || oldRole.equals(newRole) || tr("<different>").equals(newRole)) {
+        if (newRole == null || oldRole.equals(newRole) || KeyedItem.DIFFERENT_I18N.equals(newRole)) {
             return;
         }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java	(revision 18691)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/properties/TagEditHelper.java	(revision 18692)
@@ -89,4 +89,5 @@
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompListener;
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager;
+import org.openstreetmap.josm.gui.tagging.presets.items.KeyedItem;
 import org.openstreetmap.josm.gui.util.GuiHelper;
 import org.openstreetmap.josm.gui.util.WindowGeometry;
@@ -538,5 +539,5 @@
             List<AutoCompletionItem> valueList = autocomplete.getTagValues(getAutocompletionKeys(key), usedValuesAwareComparator);
 
-            final String selection = m.size() != 1 ? tr("<different>") : m.entrySet().iterator().next().getKey();
+            final String selection = m.size() != 1 ? KeyedItem.DIFFERENT_I18N : m.entrySet().iterator().next().getKey();
 
             values = new AutoCompComboBox<>();
@@ -586,5 +587,5 @@
                 value = null; // delete the key instead
             }
-            if (key.equals(newkey) && tr("<different>").equals(value))
+            if (key.equals(newkey) && KeyedItem.DIFFERENT_I18N.equals(value))
                 return;
             if (key.equals(newkey) || value == null) {
@@ -606,5 +607,5 @@
                 Collection<Command> commands = new ArrayList<>();
                 commands.add(new ChangePropertyCommand(sel, key, null));
-                if (value.equals(tr("<different>"))) {
+                if (value.equals(KeyedItem.DIFFERENT_I18N)) {
                     String newKey = newkey;
                     sel.stream()
Index: trunk/src/org/openstreetmap/josm/gui/tagging/ac/MaxLengthDocumentFilter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/ac/MaxLengthDocumentFilter.java	(revision 18691)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/ac/MaxLengthDocumentFilter.java	(revision 18692)
@@ -1,6 +1,4 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.gui.tagging.ac;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
 
 import javax.swing.text.AttributeSet;
@@ -8,4 +6,6 @@
 import javax.swing.text.DocumentFilter;
 import javax.swing.text.StyleConstants;
+
+import org.openstreetmap.josm.gui.tagging.presets.items.KeyedItem;
 
 /**
@@ -16,10 +16,9 @@
     /** the document will not accept text longer than this. -1 to disable */
     private int maxLength = -1;
-    private static final String DIFFERENT = tr("<different>");
 
     /**
      * Sets the maximum text length.
      *
-     * @param length the maximum no. of charactes allowed in this document. -1 to disable
+     * @param length the maximum no. of characters allowed in this document. -1 to disable
      */
     public void setMaxLength(int length) {
@@ -45,5 +44,5 @@
     private boolean mustInsertOrReplace(FilterBypass fb, int length, String string, AttributeSet attr) {
         int newLen = fb.getDocument().getLength() - length + ((string == null) ? 0 : string.length());
-        return (maxLength == -1 || newLen <= maxLength || DIFFERENT.equals(string) ||
+        return (maxLength == -1 || newLen <= maxLength || KeyedItem.DIFFERENT_I18N.equals(string) ||
                 // allow longer text while composing characters or it will be hard to compose
                 // the last characters before the limit
Index: trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/KeyedItem.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/KeyedItem.java	(revision 18691)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/presets/items/KeyedItem.java	(revision 18692)
@@ -30,5 +30,5 @@
     protected static final String DIFFERENT = "<different>";
     /** Translation of {@code "<different>"}. */
-    protected static final String DIFFERENT_I18N = tr(DIFFERENT);
+    public static final String DIFFERENT_I18N = tr("<different>");
 
     /** True if the default value should also be set on primitives that already have tags.  */
