Index: trunk/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java	(revision 9755)
+++ trunk/src/org/openstreetmap/josm/actions/ShowStatusReportAction.java	(revision 9759)
@@ -23,8 +23,8 @@
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.Preferences.Setting;
 import org.openstreetmap.josm.data.Version;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.DatasetConsistencyTest;
+import org.openstreetmap.josm.data.preferences.Setting;
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.widgets.JosmTextArea;
Index: trunk/src/org/openstreetmap/josm/data/CustomConfigurator.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/CustomConfigurator.java	(revision 9755)
+++ trunk/src/org/openstreetmap/josm/data/CustomConfigurator.java	(revision 9759)
@@ -42,9 +42,9 @@
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.Preferences.ListListSetting;
-import org.openstreetmap.josm.data.Preferences.ListSetting;
-import org.openstreetmap.josm.data.Preferences.MapListSetting;
-import org.openstreetmap.josm.data.Preferences.Setting;
-import org.openstreetmap.josm.data.Preferences.StringSetting;
+import org.openstreetmap.josm.data.preferences.ListListSetting;
+import org.openstreetmap.josm.data.preferences.ListSetting;
+import org.openstreetmap.josm.data.preferences.MapListSetting;
+import org.openstreetmap.josm.data.preferences.Setting;
+import org.openstreetmap.josm.data.preferences.StringSetting;
 import org.openstreetmap.josm.gui.io.DownloadFileTask;
 import org.openstreetmap.josm.plugins.PluginDownloadTask;
Index: trunk/src/org/openstreetmap/josm/data/Preferences.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 9755)
+++ trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 9759)
@@ -65,4 +65,10 @@
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.preferences.ColorProperty;
+import org.openstreetmap.josm.data.preferences.ListListSetting;
+import org.openstreetmap.josm.data.preferences.ListSetting;
+import org.openstreetmap.josm.data.preferences.MapListSetting;
+import org.openstreetmap.josm.data.preferences.Setting;
+import org.openstreetmap.josm.data.preferences.SettingVisitor;
+import org.openstreetmap.josm.data.preferences.StringSetting;
 import org.openstreetmap.josm.io.CachedFile;
 import org.openstreetmap.josm.io.OfflineAccessException;
@@ -158,346 +164,4 @@
      */
     protected boolean initSuccessful = false;
-
-    /**
-     * Interface for a preference value.
-     *
-     * Implementations must provide a proper <code>equals</code> method.
-     *
-     * @param <T> the data type for the value
-     */
-    public interface Setting<T> {
-        /**
-         * Returns the value of this setting.
-         *
-         * @return the value of this setting
-         */
-        T getValue();
-
-        /**
-         * Check if the value of this Setting object is equal to the given value.
-         * @param otherVal the other value
-         * @return true if the values are equal
-         */
-        boolean equalVal(T otherVal);
-
-        /**
-         * Clone the current object.
-         * @return an identical copy of the current object
-         */
-        Setting<T> copy();
-
-        /**
-         * Enable usage of the visitor pattern.
-         *
-         * @param visitor the visitor
-         */
-        void visit(SettingVisitor visitor);
-
-        /**
-         * Returns a setting whose value is null.
-         *
-         * Cannot be static, because there is no static inheritance.
-         * @return a Setting object that isn't null itself, but returns null
-         * for {@link #getValue()}
-         */
-        Setting<T> getNullInstance();
-    }
-
-    /**
-     * Base abstract class of all settings, holding the setting value.
-     *
-     * @param <T> The setting type
-     */
-    public abstract static class AbstractSetting<T> implements Setting<T> {
-        protected final T value;
-        /**
-         * Constructs a new {@code AbstractSetting} with the given value
-         * @param value The setting value
-         */
-        public AbstractSetting(T value) {
-            this.value = value;
-        }
-
-        @Override
-        public T getValue() {
-            return value;
-        }
-
-        @Override
-        public String toString() {
-            return value != null ? value.toString() : "null";
-        }
-
-        @Override
-        public int hashCode() {
-            return Objects.hash(value);
-        }
-
-        @Override
-        public boolean equals(Object obj) {
-            if (this == obj) return true;
-            if (obj == null || getClass() != obj.getClass()) return false;
-            AbstractSetting<?> that = (AbstractSetting<?>) obj;
-            return Objects.equals(value, that.value);
-        }
-    }
-
-    /**
-     * Setting containing a {@link String} value.
-     */
-    public static class StringSetting extends AbstractSetting<String> {
-        /**
-         * Constructs a new {@code StringSetting} with the given value
-         * @param value The setting value
-         */
-        public StringSetting(String value) {
-            super(value);
-        }
-
-        @Override
-        public boolean equalVal(String otherVal) {
-            if (value == null) return otherVal == null;
-            return value.equals(otherVal);
-        }
-
-        @Override
-        public StringSetting copy() {
-            return new StringSetting(value);
-        }
-
-        @Override
-        public void visit(SettingVisitor visitor) {
-            visitor.visit(this);
-        }
-
-        @Override
-        public StringSetting getNullInstance() {
-            return new StringSetting(null);
-        }
-
-        @Override
-        public boolean equals(Object other) {
-            if (!(other instanceof StringSetting)) return false;
-            return equalVal(((StringSetting) other).getValue());
-        }
-    }
-
-    /**
-     * Setting containing a {@link List} of {@link String} values.
-     */
-    public static class ListSetting extends AbstractSetting<List<String>> {
-        /**
-         * Constructs a new {@code ListSetting} with the given value
-         * @param value The setting value
-         */
-        public ListSetting(List<String> value) {
-            super(value);
-            consistencyTest();
-        }
-
-        /**
-         * Convenience factory method.
-         * @param value the value
-         * @return a corresponding ListSetting object
-         */
-        public static ListSetting create(Collection<String> value) {
-            return new ListSetting(value == null ? null : Collections.unmodifiableList(new ArrayList<>(value)));
-        }
-
-        @Override
-        public boolean equalVal(List<String> otherVal) {
-            return Utils.equalCollection(value, otherVal);
-        }
-
-        @Override
-        public ListSetting copy() {
-            return ListSetting.create(value);
-        }
-
-        private void consistencyTest() {
-            if (value != null && value.contains(null))
-                throw new RuntimeException("Error: Null as list element in preference setting");
-        }
-
-        @Override
-        public void visit(SettingVisitor visitor) {
-            visitor.visit(this);
-        }
-
-        @Override
-        public ListSetting getNullInstance() {
-            return new ListSetting(null);
-        }
-
-        @Override
-        public boolean equals(Object other) {
-            if (!(other instanceof ListSetting)) return false;
-            return equalVal(((ListSetting) other).getValue());
-        }
-    }
-
-    /**
-     * Setting containing a {@link List} of {@code List}s of {@link String} values.
-     */
-    public static class ListListSetting extends AbstractSetting<List<List<String>>> {
-
-        /**
-         * Constructs a new {@code ListListSetting} with the given value
-         * @param value The setting value
-         */
-        public ListListSetting(List<List<String>> value) {
-            super(value);
-            consistencyTest();
-        }
-
-        /**
-         * Convenience factory method.
-         * @param value the value
-         * @return a corresponding ListListSetting object
-         */
-        public static ListListSetting create(Collection<Collection<String>> value) {
-            if (value != null) {
-                List<List<String>> valueList = new ArrayList<>(value.size());
-                for (Collection<String> lst : value) {
-                    valueList.add(new ArrayList<>(lst));
-                }
-                return new ListListSetting(valueList);
-            }
-            return new ListListSetting(null);
-        }
-
-        @Override
-        public boolean equalVal(List<List<String>> otherVal) {
-            if (value == null) return otherVal == null;
-            if (otherVal == null) return false;
-            if (value.size() != otherVal.size()) return false;
-            Iterator<List<String>> itA = value.iterator();
-            Iterator<List<String>> itB = otherVal.iterator();
-            while (itA.hasNext()) {
-                if (!Utils.equalCollection(itA.next(), itB.next())) return false;
-            }
-            return true;
-        }
-
-        @Override
-        public ListListSetting copy() {
-            if (value == null) return new ListListSetting(null);
-
-            List<List<String>> copy = new ArrayList<>(value.size());
-            for (Collection<String> lst : value) {
-                List<String> lstCopy = new ArrayList<>(lst);
-                copy.add(Collections.unmodifiableList(lstCopy));
-            }
-            return new ListListSetting(Collections.unmodifiableList(copy));
-        }
-
-        private void consistencyTest() {
-            if (value == null) return;
-            if (value.contains(null)) throw new RuntimeException("Error: Null as list element in preference setting");
-            for (Collection<String> lst : value) {
-                if (lst.contains(null)) throw new RuntimeException("Error: Null as inner list element in preference setting");
-            }
-        }
-
-        @Override
-        public void visit(SettingVisitor visitor) {
-            visitor.visit(this);
-        }
-
-        @Override
-        public ListListSetting getNullInstance() {
-            return new ListListSetting(null);
-        }
-
-        @Override
-        public boolean equals(Object other) {
-            if (!(other instanceof ListListSetting)) return false;
-            return equalVal(((ListListSetting) other).getValue());
-        }
-    }
-
-    /**
-     * Setting containing a {@link List} of {@link Map}s of {@link String} values.
-     */
-    public static class MapListSetting extends AbstractSetting<List<Map<String, String>>> {
-
-        /**
-         * Constructs a new {@code MapListSetting} with the given value
-         * @param value The setting value
-         */
-        public MapListSetting(List<Map<String, String>> value) {
-            super(value);
-            consistencyTest();
-        }
-
-        @Override
-        public boolean equalVal(List<Map<String, String>> otherVal) {
-            if (value == null) return otherVal == null;
-            if (otherVal == null) return false;
-            if (value.size() != otherVal.size()) return false;
-            Iterator<Map<String, String>> itA = value.iterator();
-            Iterator<Map<String, String>> itB = otherVal.iterator();
-            while (itA.hasNext()) {
-                if (!equalMap(itA.next(), itB.next())) return false;
-            }
-            return true;
-        }
-
-        private static boolean equalMap(Map<String, String> a, Map<String, String> b) {
-            if (a == null) return b == null;
-            if (b == null) return false;
-            if (a.size() != b.size()) return false;
-            for (Entry<String, String> e : a.entrySet()) {
-                if (!Objects.equals(e.getValue(), b.get(e.getKey()))) return false;
-            }
-            return true;
-        }
-
-        @Override
-        public MapListSetting copy() {
-            if (value == null) return new MapListSetting(null);
-            List<Map<String, String>> copy = new ArrayList<>(value.size());
-            for (Map<String, String> map : value) {
-                Map<String, String> mapCopy = new LinkedHashMap<>(map);
-                copy.add(Collections.unmodifiableMap(mapCopy));
-            }
-            return new MapListSetting(Collections.unmodifiableList(copy));
-        }
-
-        private void consistencyTest() {
-            if (value == null) return;
-            if (value.contains(null)) throw new RuntimeException("Error: Null as list element in preference setting");
-            for (Map<String, String> map : value) {
-                if (map.keySet().contains(null)) throw new RuntimeException("Error: Null as map key in preference setting");
-                if (map.values().contains(null)) throw new RuntimeException("Error: Null as map value in preference setting");
-            }
-        }
-
-        @Override
-        public void visit(SettingVisitor visitor) {
-            visitor.visit(this);
-        }
-
-        @Override
-        public MapListSetting getNullInstance() {
-            return new MapListSetting(null);
-        }
-
-        @Override
-        public boolean equals(Object other) {
-            if (!(other instanceof MapListSetting)) return false;
-            return equalVal(((MapListSetting) other).getValue());
-        }
-    }
-
-    public interface SettingVisitor {
-        void visit(StringSetting setting);
-
-        void visit(ListSetting value);
-
-        void visit(ListListSetting value);
-
-        void visit(MapListSetting value);
-    }
 
     /**
Index: trunk/src/org/openstreetmap/josm/data/preferences/AbstractSetting.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/preferences/AbstractSetting.java	(revision 9759)
+++ trunk/src/org/openstreetmap/josm/data/preferences/AbstractSetting.java	(revision 9759)
@@ -0,0 +1,45 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.preferences;
+
+import java.util.Objects;
+
+/**
+ * Base abstract class of all settings, holding the setting value.
+ *
+ * @param <T> The setting type
+ * @since 9759
+ */
+public abstract class AbstractSetting<T> implements Setting<T> {
+    protected final T value;
+    /**
+     * Constructs a new {@code AbstractSetting} with the given value
+     * @param value The setting value
+     */
+    public AbstractSetting(T value) {
+        this.value = value;
+    }
+
+    @Override
+    public T getValue() {
+        return value;
+    }
+
+    @Override
+    public String toString() {
+        return value != null ? value.toString() : "null";
+    }
+
+    @Override
+    public int hashCode() {
+        return Objects.hash(value);
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (obj == null || getClass() != obj.getClass())
+            return false;
+        return Objects.equals(value, ((AbstractSetting<?>) obj).value);
+    }
+}
Index: trunk/src/org/openstreetmap/josm/data/preferences/ListListSetting.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/preferences/ListListSetting.java	(revision 9759)
+++ trunk/src/org/openstreetmap/josm/data/preferences/ListListSetting.java	(revision 9759)
@@ -0,0 +1,101 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.preferences;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.List;
+
+import org.openstreetmap.josm.tools.Utils;
+
+/**
+ * Setting containing a {@link List} of {@code List}s of {@link String} values.
+ * @since 9759
+ */
+public class ListListSetting extends AbstractSetting<List<List<String>>> {
+
+    /**
+     * Constructs a new {@code ListListSetting} with the given value
+     * @param value The setting value
+     */
+    public ListListSetting(List<List<String>> value) {
+        super(value);
+        consistencyTest();
+    }
+
+    /**
+     * Convenience factory method.
+     * @param value the value
+     * @return a corresponding ListListSetting object
+     */
+    public static ListListSetting create(Collection<Collection<String>> value) {
+        if (value != null) {
+            List<List<String>> valueList = new ArrayList<>(value.size());
+            for (Collection<String> lst : value) {
+                valueList.add(new ArrayList<>(lst));
+            }
+            return new ListListSetting(valueList);
+        }
+        return new ListListSetting(null);
+    }
+
+    @Override
+    public boolean equalVal(List<List<String>> otherVal) {
+        if (value == null)
+            return otherVal == null;
+        if (otherVal == null)
+            return false;
+        if (value.size() != otherVal.size())
+            return false;
+        Iterator<List<String>> itA = value.iterator();
+        Iterator<List<String>> itB = otherVal.iterator();
+        while (itA.hasNext()) {
+            if (!Utils.equalCollection(itA.next(), itB.next()))
+                return false;
+        }
+        return true;
+    }
+
+    @Override
+    public ListListSetting copy() {
+        if (value == null)
+            return new ListListSetting(null);
+
+        List<List<String>> copy = new ArrayList<>(value.size());
+        for (Collection<String> lst : value) {
+            List<String> lstCopy = new ArrayList<>(lst);
+            copy.add(Collections.unmodifiableList(lstCopy));
+        }
+        return new ListListSetting(Collections.unmodifiableList(copy));
+    }
+
+    private void consistencyTest() {
+        if (value != null) {
+            if (value.contains(null))
+                throw new RuntimeException("Error: Null as list element in preference setting");
+            for (Collection<String> lst : value) {
+                if (lst.contains(null)) {
+                    throw new RuntimeException("Error: Null as inner list element in preference setting");
+                }
+            }
+        }
+    }
+
+    @Override
+    public void visit(SettingVisitor visitor) {
+        visitor.visit(this);
+    }
+
+    @Override
+    public ListListSetting getNullInstance() {
+        return new ListListSetting(null);
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (!(other instanceof ListListSetting))
+            return false;
+        return equalVal(((ListListSetting) other).getValue());
+    }
+}
Index: trunk/src/org/openstreetmap/josm/data/preferences/ListSetting.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/preferences/ListSetting.java	(revision 9759)
+++ trunk/src/org/openstreetmap/josm/data/preferences/ListSetting.java	(revision 9759)
@@ -0,0 +1,65 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.preferences;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.Collections;
+import java.util.List;
+
+import org.openstreetmap.josm.tools.Utils;
+
+/**
+ * Setting containing a {@link List} of {@link String} values.
+ * @since 9759
+ */
+public class ListSetting extends AbstractSetting<List<String>> {
+    /**
+     * Constructs a new {@code ListSetting} with the given value
+     * @param value The setting value
+     */
+    public ListSetting(List<String> value) {
+        super(value);
+        consistencyTest();
+    }
+
+    /**
+     * Convenience factory method.
+     * @param value the value
+     * @return a corresponding ListSetting object
+     */
+    public static ListSetting create(Collection<String> value) {
+        return new ListSetting(value == null ? null : Collections.unmodifiableList(new ArrayList<>(value)));
+    }
+
+    @Override
+    public boolean equalVal(List<String> otherVal) {
+        return Utils.equalCollection(value, otherVal);
+    }
+
+    @Override
+    public ListSetting copy() {
+        return ListSetting.create(value);
+    }
+
+    private void consistencyTest() {
+        if (value != null && value.contains(null))
+            throw new RuntimeException("Error: Null as list element in preference setting");
+    }
+
+    @Override
+    public void visit(SettingVisitor visitor) {
+        visitor.visit(this);
+    }
+
+    @Override
+    public ListSetting getNullInstance() {
+        return new ListSetting(null);
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (!(other instanceof ListSetting))
+            return false;
+        return equalVal(((ListSetting) other).getValue());
+    }
+}
Index: trunk/src/org/openstreetmap/josm/data/preferences/MapListSetting.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/preferences/MapListSetting.java	(revision 9759)
+++ trunk/src/org/openstreetmap/josm/data/preferences/MapListSetting.java	(revision 9759)
@@ -0,0 +1,100 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.preferences;
+
+import java.util.ArrayList;
+import java.util.Collections;
+import java.util.Iterator;
+import java.util.LinkedHashMap;
+import java.util.List;
+import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Objects;
+
+/**
+ * Setting containing a {@link List} of {@link Map}s of {@link String} values.
+ * @since 9759
+ */
+public class MapListSetting extends AbstractSetting<List<Map<String, String>>> {
+
+    /**
+     * Constructs a new {@code MapListSetting} with the given value
+     * @param value The setting value
+     */
+    public MapListSetting(List<Map<String, String>> value) {
+        super(value);
+        consistencyTest();
+    }
+
+    @Override
+    public boolean equalVal(List<Map<String, String>> otherVal) {
+        if (value == null)
+            return otherVal == null;
+        if (otherVal == null)
+            return false;
+        if (value.size() != otherVal.size())
+            return false;
+        Iterator<Map<String, String>> itA = value.iterator();
+        Iterator<Map<String, String>> itB = otherVal.iterator();
+        while (itA.hasNext()) {
+            if (!equalMap(itA.next(), itB.next()))
+                return false;
+        }
+        return true;
+    }
+
+    private static boolean equalMap(Map<String, String> a, Map<String, String> b) {
+        if (a == null)
+            return b == null;
+        if (b == null)
+            return false;
+        if (a.size() != b.size())
+            return false;
+        for (Entry<String, String> e : a.entrySet()) {
+            if (!Objects.equals(e.getValue(), b.get(e.getKey())))
+                return false;
+        }
+        return true;
+    }
+
+    @Override
+    public MapListSetting copy() {
+        if (value == null)
+            return new MapListSetting(null);
+        List<Map<String, String>> copy = new ArrayList<>(value.size());
+        for (Map<String, String> map : value) {
+            Map<String, String> mapCopy = new LinkedHashMap<>(map);
+            copy.add(Collections.unmodifiableMap(mapCopy));
+        }
+        return new MapListSetting(Collections.unmodifiableList(copy));
+    }
+
+    private void consistencyTest() {
+        if (value == null)
+            return;
+        if (value.contains(null))
+            throw new RuntimeException("Error: Null as list element in preference setting");
+        for (Map<String, String> map : value) {
+            if (map.keySet().contains(null))
+                throw new RuntimeException("Error: Null as map key in preference setting");
+            if (map.values().contains(null))
+                throw new RuntimeException("Error: Null as map value in preference setting");
+        }
+    }
+
+    @Override
+    public void visit(SettingVisitor visitor) {
+        visitor.visit(this);
+    }
+
+    @Override
+    public MapListSetting getNullInstance() {
+        return new MapListSetting(null);
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (!(other instanceof MapListSetting))
+            return false;
+        return equalVal(((MapListSetting) other).getValue());
+    }
+}
Index: trunk/src/org/openstreetmap/josm/data/preferences/Setting.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/preferences/Setting.java	(revision 9759)
+++ trunk/src/org/openstreetmap/josm/data/preferences/Setting.java	(revision 9759)
@@ -0,0 +1,48 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.preferences;
+
+/**
+ * Interface for a preference value.
+ *
+ * Implementations must provide a proper <code>equals</code> method.
+ *
+ * @param <T> the data type for the value
+ * @since 9759
+ */
+public interface Setting<T> {
+    /**
+     * Returns the value of this setting.
+     *
+     * @return the value of this setting
+     */
+    T getValue();
+
+    /**
+     * Check if the value of this Setting object is equal to the given value.
+     * @param otherVal the other value
+     * @return true if the values are equal
+     */
+    boolean equalVal(T otherVal);
+
+    /**
+     * Clone the current object.
+     * @return an identical copy of the current object
+     */
+    Setting<T> copy();
+
+    /**
+     * Enable usage of the visitor pattern.
+     *
+     * @param visitor the visitor
+     */
+    void visit(SettingVisitor visitor);
+
+    /**
+     * Returns a setting whose value is null.
+     *
+     * Cannot be static, because there is no static inheritance.
+     * @return a Setting object that isn't null itself, but returns null
+     * for {@link #getValue()}
+     */
+    Setting<T> getNullInstance();
+}
Index: trunk/src/org/openstreetmap/josm/data/preferences/SettingVisitor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/preferences/SettingVisitor.java	(revision 9759)
+++ trunk/src/org/openstreetmap/josm/data/preferences/SettingVisitor.java	(revision 9759)
@@ -0,0 +1,32 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.preferences;
+
+/**
+ * Visitor interface for {@link Setting} implementations.
+ * @since 9759
+ */
+public interface SettingVisitor {
+    /**
+     * Visitor call for {@link StringSetting}.
+     * @param value string setting
+     */
+    void visit(StringSetting value);
+
+    /**
+     * Visitor call for {@link ListSetting}.
+     * @param value list setting
+     */
+    void visit(ListSetting value);
+
+    /**
+     * Visitor call for {@link ListListSetting}.
+     * @param value list list setting
+     */
+    void visit(ListListSetting value);
+
+    /**
+     * Visitor call for {@link MapListSetting}.
+     * @param value map list setting
+     */
+    void visit(MapListSetting value);
+}
Index: trunk/src/org/openstreetmap/josm/data/preferences/StringSetting.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/preferences/StringSetting.java	(revision 9759)
+++ trunk/src/org/openstreetmap/josm/data/preferences/StringSetting.java	(revision 9759)
@@ -0,0 +1,45 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.preferences;
+
+/**
+ * Setting containing a {@link String} value.
+ * @since 9759
+ */
+public class StringSetting extends AbstractSetting<String> {
+    /**
+     * Constructs a new {@code StringSetting} with the given value
+     * @param value The setting value
+     */
+    public StringSetting(String value) {
+        super(value);
+    }
+
+    @Override
+    public boolean equalVal(String otherVal) {
+        if (value == null)
+            return otherVal == null;
+        return value.equals(otherVal);
+    }
+
+    @Override
+    public StringSetting copy() {
+        return new StringSetting(value);
+    }
+
+    @Override
+    public void visit(SettingVisitor visitor) {
+        visitor.visit(this);
+    }
+
+    @Override
+    public StringSetting getNullInstance() {
+        return new StringSetting(null);
+    }
+
+    @Override
+    public boolean equals(Object other) {
+        if (!(other instanceof StringSetting))
+            return false;
+        return equalVal(((StringSetting) other).getValue());
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/JosmUserIdentityManager.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/JosmUserIdentityManager.java	(revision 9755)
+++ trunk/src/org/openstreetmap/josm/gui/JosmUserIdentityManager.java	(revision 9759)
@@ -9,7 +9,7 @@
 import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
 import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
-import org.openstreetmap.josm.data.Preferences.StringSetting;
 import org.openstreetmap.josm.data.osm.User;
 import org.openstreetmap.josm.data.osm.UserInfo;
+import org.openstreetmap.josm.data.preferences.StringSetting;
 import org.openstreetmap.josm.gui.preferences.server.OAuthAccessTokenHolder;
 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
Index: trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java	(revision 9755)
+++ trunk/src/org/openstreetmap/josm/gui/io/UploadDialog.java	(revision 9759)
@@ -41,9 +41,9 @@
 import org.openstreetmap.josm.data.Preferences.PreferenceChangeEvent;
 import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
-import org.openstreetmap.josm.data.Preferences.Setting;
 import org.openstreetmap.josm.data.Version;
 import org.openstreetmap.josm.data.osm.Changeset;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.preferences.Setting;
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.HelpAwareOptionPane;
Index: trunk/src/org/openstreetmap/josm/gui/preferences/advanced/AdvancedPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/advanced/AdvancedPreference.java	(revision 9755)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/advanced/AdvancedPreference.java	(revision 9759)
@@ -40,5 +40,6 @@
 import org.openstreetmap.josm.data.CustomConfigurator;
 import org.openstreetmap.josm.data.Preferences;
-import org.openstreetmap.josm.data.Preferences.Setting;
+import org.openstreetmap.josm.data.preferences.Setting;
+import org.openstreetmap.josm.data.preferences.StringSetting;
 import org.openstreetmap.josm.gui.dialogs.LogShowDialog;
 import org.openstreetmap.josm.gui.preferences.DefaultTabPreferenceSetting;
@@ -241,5 +242,5 @@
         for (PrefEntry p: table.getSelectedItems()) {
             // preferences with default values are not saved
-            if (!(p.getValue() instanceof Preferences.StringSetting)) {
+            if (!(p.getValue() instanceof StringSetting)) {
                 hasLists = true; // => append and replace differs
             }
Index: trunk/src/org/openstreetmap/josm/gui/preferences/advanced/ExportProfileAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/advanced/ExportProfileAction.java	(revision 9755)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/advanced/ExportProfileAction.java	(revision 9759)
@@ -20,5 +20,5 @@
 import org.openstreetmap.josm.data.CustomConfigurator;
 import org.openstreetmap.josm.data.Preferences;
-import org.openstreetmap.josm.data.Preferences.Setting;
+import org.openstreetmap.josm.data.preferences.Setting;
 import org.openstreetmap.josm.gui.widgets.AbstractFileChooser;
 import org.openstreetmap.josm.tools.Utils;
Index: trunk/src/org/openstreetmap/josm/gui/preferences/advanced/ListEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/advanced/ListEditor.java	(revision 9755)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/advanced/ListEditor.java	(revision 9759)
@@ -16,5 +16,5 @@
 import javax.swing.table.AbstractTableModel;
 
-import org.openstreetmap.josm.data.Preferences.ListSetting;
+import org.openstreetmap.josm.data.preferences.ListSetting;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
 import org.openstreetmap.josm.tools.GBC;
Index: trunk/src/org/openstreetmap/josm/gui/preferences/advanced/ListListEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/advanced/ListListEditor.java	(revision 9755)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/advanced/ListListEditor.java	(revision 9759)
@@ -12,5 +12,5 @@
 import javax.swing.table.AbstractTableModel;
 
-import org.openstreetmap.josm.data.Preferences.ListListSetting;
+import org.openstreetmap.josm.data.preferences.ListListSetting;
 
 /**
Index: trunk/src/org/openstreetmap/josm/gui/preferences/advanced/MapListEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/advanced/MapListEditor.java	(revision 9755)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/advanced/MapListEditor.java	(revision 9759)
@@ -16,5 +16,5 @@
 import javax.swing.table.AbstractTableModel;
 
-import org.openstreetmap.josm.data.Preferences.MapListSetting;
+import org.openstreetmap.josm.data.preferences.MapListSetting;
 
 /**
Index: trunk/src/org/openstreetmap/josm/gui/preferences/advanced/PrefEntry.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/advanced/PrefEntry.java	(revision 9755)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/advanced/PrefEntry.java	(revision 9759)
@@ -2,5 +2,5 @@
 package org.openstreetmap.josm.gui.preferences.advanced;
 
-import org.openstreetmap.josm.data.Preferences.Setting;
+import org.openstreetmap.josm.data.preferences.Setting;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 
Index: trunk/src/org/openstreetmap/josm/gui/preferences/advanced/PreferencesTable.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/advanced/PreferencesTable.java	(revision 9755)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/advanced/PreferencesTable.java	(revision 9759)
@@ -29,9 +29,9 @@
 
 import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.Preferences.ListListSetting;
-import org.openstreetmap.josm.data.Preferences.ListSetting;
-import org.openstreetmap.josm.data.Preferences.MapListSetting;
-import org.openstreetmap.josm.data.Preferences.Setting;
-import org.openstreetmap.josm.data.Preferences.StringSetting;
+import org.openstreetmap.josm.data.preferences.ListListSetting;
+import org.openstreetmap.josm.data.preferences.ListSetting;
+import org.openstreetmap.josm.data.preferences.MapListSetting;
+import org.openstreetmap.josm.data.preferences.Setting;
+import org.openstreetmap.josm.data.preferences.StringSetting;
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.util.GuiHelper;
Index: trunk/src/org/openstreetmap/josm/gui/preferences/advanced/StringEditor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/advanced/StringEditor.java	(revision 9755)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/advanced/StringEditor.java	(revision 9759)
@@ -10,5 +10,5 @@
 import javax.swing.JPanel;
 
-import org.openstreetmap.josm.data.Preferences.StringSetting;
+import org.openstreetmap.josm.data.preferences.StringSetting;
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.gui.widgets.JosmTextField;
