Index: trunk/src/org/openstreetmap/josm/data/Preferences.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 12839)
+++ trunk/src/org/openstreetmap/josm/data/Preferences.java	(revision 12840)
@@ -56,7 +56,8 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.preferences.AbstractPreferences;
 import org.openstreetmap.josm.data.preferences.BooleanProperty;
 import org.openstreetmap.josm.data.preferences.ColorProperty;
-import org.openstreetmap.josm.data.preferences.DoubleProperty;
+import org.openstreetmap.josm.data.preferences.IPreferences;
 import org.openstreetmap.josm.data.preferences.IntegerProperty;
 import org.openstreetmap.josm.data.preferences.ListListSetting;
@@ -104,5 +105,5 @@
  * @since 74
  */
-public class Preferences {
+public class Preferences extends AbstractPreferences {
 
     private static final String COLOR_PREFIX = "color.";
@@ -255,4 +256,5 @@
      * @param listener The listener to add
      */
+    @Override
     public void addPreferenceChangeListener(PreferenceChangedListener listener) {
         if (listener != null) {
@@ -265,4 +267,5 @@
      * @param listener The listener to remove
      */
+    @Override
     public void removePreferenceChangeListener(PreferenceChangedListener listener) {
         listeners.removeListener(listener);
@@ -275,4 +278,5 @@
      * @since 10824
      */
+    @Override
     public void addKeyPreferenceChangeListener(String key, PreferenceChangedListener listener) {
         listenersForKey(key).addListener(listener);
@@ -303,4 +307,5 @@
      * @param listener The listener to add.
      */
+    @Override
     public void removeKeyPreferenceChangeListener(String key, PreferenceChangedListener listener) {
         Optional.ofNullable(keyListeners.get(key)).orElseThrow(
@@ -480,24 +485,4 @@
 
     /**
-     * Get settings value for a certain key.
-     * @param key the identifier for the setting
-     * @return "" if there is nothing set for the preference key, the corresponding value otherwise. The result is not null.
-     */
-    public synchronized String get(final String key) {
-        String value = get(key, null);
-        return value == null ? "" : value;
-    }
-
-    /**
-     * Get settings value for a certain key and provide default a value.
-     * @param key the identifier for the setting
-     * @param def the default value. For each call of get() with a given key, the default value must be the same.
-     * @return the corresponding value if the property has been set before, {@code def} otherwise
-     */
-    public synchronized String get(final String key, final String def) {
-        return getSetting(key, new StringSetting(def), StringSetting.class).getValue();
-    }
-
-    /**
      * Gets all normal (string) settings that have a key starting with the prefix
      * @param prefix The start of the key
@@ -552,26 +537,4 @@
 
     /**
-     * Gets a boolean preference
-     * @param key The preference key
-     * @return The boolean or <code>false</code> if it could not be parsed
-     * @see IntegerProperty#get()
-     */
-    public synchronized boolean getBoolean(final String key) {
-        String s = get(key, null);
-        return s != null && Boolean.parseBoolean(s);
-    }
-
-    /**
-     * Gets a boolean preference
-     * @param key The preference key
-     * @param def The default value to use
-     * @return The boolean, <code>false</code> if it could not be parsed, the default value if it is unset
-     * @see IntegerProperty#get()
-     */
-    public synchronized boolean getBoolean(final String key, final boolean def) {
-        return Boolean.parseBoolean(get(key, Boolean.toString(def)));
-    }
-
-    /**
      * Gets an boolean that may be specialized
      * @param key The basic key
@@ -591,14 +554,4 @@
 
     /**
-     * Set a value for a certain setting.
-     * @param key the unique identifier for the setting
-     * @param value the value of the setting. Can be null or "" which both removes the key-value entry.
-     * @return {@code true}, if something has changed (i.e. value is different than before)
-     */
-    public boolean put(final String key, String value) {
-        return putSetting(key, value == null || value.isEmpty() ? null : new StringSetting(value));
-    }
-
-    /**
      * Set a boolean value for a certain setting.
      * @param key the unique identifier for the setting
@@ -606,5 +559,7 @@
      * @return {@code true}, if something has changed (i.e. value is different than before)
      * @see BooleanProperty
-     */
+     * @deprecated use {@link IPreferences#putBoolean(String, boolean)}
+     */
+    @Deprecated
     public boolean put(final String key, final boolean value) {
         return put(key, Boolean.toString(value));
@@ -617,5 +572,7 @@
      * @return {@code true}, if something has changed (i.e. value is different than before)
      * @see IntegerProperty#put(Integer)
-     */
+     * @deprecated use {@link IPreferences#putInt(String, int)}
+     */
+    @Deprecated
     public boolean putInteger(final String key, final Integer value) {
         return put(key, Integer.toString(value));
@@ -628,5 +585,7 @@
      * @return {@code true}, if something has changed (i.e. value is different than before)
      * @see DoubleProperty#put(Double)
-     */
+     * @deprecated use {@link IPreferences#putDouble(java.lang.String, double)}
+     */
+    @Deprecated
     public boolean putDouble(final String key, final Double value) {
         return put(key, Double.toString(value));
@@ -663,5 +622,5 @@
         if (!defaults) {
             /* currently unused, but may help to fix configuration issues in future */
-            putInteger("josm.version", Version.getInstance().getVersion());
+            putInt("josm.version", Version.getInstance().getVersion());
 
             updateSystemProperties();
@@ -974,5 +933,7 @@
      * @return The integer
      * @see IntegerProperty#get()
-     */
+     * @deprecated use {@link IPreferences#getInt(String, int)}
+     */
+    @Deprecated
     public synchronized int getInteger(String key, int def) {
         String v = get(key, Integer.toString(def));
@@ -1034,30 +995,11 @@
 
     /**
-     * Gets a double preference
-     * @param key The preference key
-     * @param def The default value to use
-     * @return The double value or the default value if it could not be parsed
-     * @see LongProperty#get()
-     */
-    public synchronized double getDouble(String key, double def) {
-        String v = get(key, Double.toString(def));
-        if (null == v)
-            return def;
-
-        try {
-            return Double.parseDouble(v);
-        } catch (NumberFormatException e) {
-            // fall out
-            Logging.trace(e);
-        }
-        return def;
-    }
-
-    /**
      * Get a list of values for a certain key
      * @param key the identifier for the setting
      * @param def the default value.
      * @return the corresponding value if the property has been set before, {@code def} otherwise
-     */
+     * @deprecated use {@link IPreferences#getList(java.lang.String, java.util.List)}
+     */
+    @Deprecated
     public Collection<String> getCollection(String key, Collection<String> def) {
         return getSetting(key, ListSetting.create(def), ListSetting.class).getValue();
@@ -1068,7 +1010,9 @@
      * @param key the identifier for the setting
      * @return the corresponding value if the property has been set before, an empty collection otherwise.
-     */
+     * @deprecated use {@link IPreferences#getList(java.lang.String)}
+     */
+    @Deprecated
     public Collection<String> getCollection(String key) {
-        Collection<String> val = getCollection(key, null);
+        Collection<String> val = getList(key, null);
         return val == null ? Collections.<String>emptyList() : val;
     }
@@ -1078,10 +1022,10 @@
      * @param key The preference key the collection is stored with
      * @param value The value that should be removed in the collection
-     * @see #getCollection(String)
+     * @see #getList(String)
      */
     public synchronized void removeFromCollection(String key, String value) {
-        List<String> a = new ArrayList<>(getCollection(key, Collections.<String>emptyList()));
+        List<String> a = new ArrayList<>(getList(key, Collections.<String>emptyList()));
         a.remove(value);
-        putCollection(key, a);
+        putList(key, a);
     }
 
@@ -1093,4 +1037,5 @@
      * @return {@code true}, if something has changed (i.e. value is different than before)
      */
+    @Override
     public boolean putSetting(final String key, Setting<?> setting) {
         CheckParameterUtil.ensureParameterNotNull(key);
@@ -1146,4 +1091,5 @@
      */
     @SuppressWarnings("unchecked")
+    @Override
     public synchronized <T extends Setting<?>> T getSetting(String key, T def, Class<T> klass) {
         CheckParameterUtil.ensureParameterNotNull(key);
@@ -1172,5 +1118,7 @@
      * @param value value
      * @return {@code true}, if something has changed (i.e. value is different than before)
-     */
+     * @deprecated use {@link IPreferences#putList(java.lang.String, java.util.List)}
+     */
+    @Deprecated
     public boolean putCollection(String key, Collection<String> value) {
         return putSetting(key, value == null ? null : ListSetting.create(value));
@@ -1185,5 +1133,5 @@
      */
     public boolean putCollectionBounded(String key, int maxsize, Collection<String> val) {
-        Collection<String> newCollection = new ArrayList<>(Math.min(maxsize, val.size()));
+        List<String> newCollection = new ArrayList<>(Math.min(maxsize, val.size()));
         for (String i : val) {
             if (newCollection.size() >= maxsize) {
@@ -1192,5 +1140,5 @@
             newCollection.add(i);
         }
-        return putCollection(key, newCollection);
+        return putList(key, newCollection);
     }
 
@@ -1212,5 +1160,7 @@
      * @param key The key
      * @return The collection of string collections or an empty collection as default
-     */
+     * @deprecated use {@link IPreferences#getListOfLists(java.lang.String)}
+     */
+    @Deprecated
     public Collection<Collection<String>> getArray(String key) {
         Collection<Collection<String>> res = getArray(key, null);
@@ -1223,5 +1173,7 @@
      * @param value value
      * @return {@code true}, if something has changed (i.e. value is different than before)
-     */
+     * @deprecated use {@link IPreferences#putListOfLists(java.lang.String, java.util.List)}
+     */
+    @Deprecated
     public boolean putArray(String key, Collection<Collection<String>> value) {
         return putSetting(key, value == null ? null : ListListSetting.create(value));
@@ -1233,5 +1185,7 @@
      * @param def The default value to use
      * @return The stored value or the default one if it could not be parsed
-     */
+     * @deprecated use {@link IPreferences#getListOfMaps(java.lang.String, java.util.List)}
+     */
+    @Deprecated
     public Collection<Map<String, String>> getListOfStructs(String key, Collection<Map<String, String>> def) {
         return getSetting(key, new MapListSetting(def == null ? null : new ArrayList<>(def)), MapListSetting.class).getValue();
@@ -1243,6 +1197,8 @@
      * @param value A list of key/value maps
      * @return <code>true</code> if the value was changed
-     * @see #getListOfStructs(String, Collection)
-     */
+     * @see #getListOfMaps(String, Collection)
+     * @deprecated use {@link IPreferences#putListOfMaps(java.lang.String, java.util.List)}
+     */
+    @Deprecated
     public boolean putListOfStructs(String key, Collection<Map<String, String>> value) {
         return putSetting(key, value == null ? null : new MapListSetting(new ArrayList<>(value)));
@@ -1290,6 +1246,6 @@
      */
     public <T> List<T> getListOfStructs(String key, Collection<T> def, Class<T> klass) {
-        Collection<Map<String, String>> prop =
-            getListOfStructs(key, def == null ? null : serializeListOfStructs(def, klass));
+        List<Map<String, String>> prop =
+            getListOfMaps(key, def == null ? null : serializeListOfStructs(def, klass));
         if (prop == null)
             return def == null ? null : new ArrayList<>(def);
@@ -1314,11 +1270,11 @@
      */
     public <T> boolean putListOfStructs(String key, Collection<T> val, Class<T> klass) {
-        return putListOfStructs(key, serializeListOfStructs(val, klass));
-    }
-
-    private static <T> Collection<Map<String, String>> serializeListOfStructs(Collection<T> l, Class<T> klass) {
+        return putListOfMaps(key, serializeListOfStructs(val, klass));
+    }
+
+    private static <T> List<Map<String, String>> serializeListOfStructs(Collection<T> l, Class<T> klass) {
         if (l == null)
             return null;
-        Collection<Map<String, String>> vals = new ArrayList<>();
+        List<Map<String, String>> vals = new ArrayList<>();
         for (T struct : l) {
             if (struct != null) {
@@ -1575,5 +1531,5 @@
      */
     public Collection<String> getPluginSites() {
-        return getCollection("pluginmanager.sites", Collections.singleton(Main.getJOSMWebsite()+"/pluginicons%<?plugins=>"));
+        return getList("pluginmanager.sites", Collections.singletonList(Main.getJOSMWebsite()+"/pluginicons%<?plugins=>"));
     }
 
@@ -1602,5 +1558,5 @@
      */
     public void setPluginSites(Collection<String> sites) {
-        putCollection("pluginmanager.sites", sites);
+        putList("pluginmanager.sites", new ArrayList<>(sites));
     }
 
@@ -1702,5 +1658,5 @@
                 }
                 if (modified) {
-                    putListOfStructs(key, l);
+                    putListOfMaps(key, l);
                 }
             }
@@ -1718,5 +1674,5 @@
                     l.add(helper.serialize(val.get()));
                 }
-                putListOfStructs(key, l);
+                putListOfMaps(key, l);
             }
         }
Index: trunk/src/org/openstreetmap/josm/data/preferences/AbstractPreferences.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/preferences/AbstractPreferences.java	(revision 12840)
+++ trunk/src/org/openstreetmap/josm/data/preferences/AbstractPreferences.java	(revision 12840)
@@ -0,0 +1,124 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.preferences;
+
+import java.util.List;
+import java.util.Map;
+
+import org.openstreetmap.josm.tools.Logging;
+
+/**
+ * Abstract implementation of the {@link IPreferences} interface.
+ * @since 12840
+ */
+public abstract class AbstractPreferences implements IPreferences {
+
+    @Override
+    public synchronized String get(final String key, final String def) {
+        return getSetting(key, new StringSetting(def), StringSetting.class).getValue();
+    }
+
+    @Override
+    public boolean put(final String key, String value) {
+        return putSetting(key, value == null || value.isEmpty() ? null : new StringSetting(value));
+    }
+
+    @Override
+    public boolean getBoolean(final String key, final boolean def) {
+        return Boolean.parseBoolean(get(key, Boolean.toString(def)));
+    }
+
+    @Override
+    public boolean putBoolean(final String key, final boolean value) {
+        return put(key, Boolean.toString(value));
+    }
+
+    @Override
+    public synchronized int getInt(String key, int def) {
+        String v = get(key, Integer.toString(def));
+        if (v.isEmpty())
+            return def;
+
+        try {
+            return Integer.parseInt(v);
+        } catch (NumberFormatException e) {
+            // fall out
+            Logging.trace(e);
+        }
+        return def;
+    }
+
+    @Override
+    public boolean putInt(String key, int value) {
+        return put(key, Integer.toString(value));
+    }
+
+    @Override
+    public synchronized double getDouble(String key, double def) {
+        String v = get(key, Double.toString(def));
+        if (null == v)
+            return def;
+
+        try {
+            return Double.parseDouble(v);
+        } catch (NumberFormatException e) {
+            // fall out
+            Logging.trace(e);
+        }
+        return def;
+    }
+
+    @Override
+    public boolean putDouble(final String key, final double value) {
+        return put(key, Double.toString(value));
+    }
+
+    @Override
+    public List<String> getList(String key, List<String> def) {
+        return getSetting(key, new ListSetting(def), ListSetting.class).getValue();
+    }
+
+    @Override
+    public boolean putList(String key, List<String> value) {
+        return putSetting(key, value == null ? null : new ListSetting(value));
+    }
+
+    @Override
+    public List<List<String>> getListOfLists(String key, List<List<String>> def) {
+        return getSetting(key, new ListListSetting(def), ListListSetting.class).getValue();
+    }
+
+    @Override
+    public boolean putListOfLists(String key, List<List<String>> value) {
+        return putSetting(key, value == null ? null : new ListListSetting(value));
+    }
+
+    @Override
+    public List<Map<String, String>> getListOfMaps(String key, List<Map<String, String>> def) {
+        return getSetting(key, new MapListSetting(def), MapListSetting.class).getValue();
+    }
+
+    @Override
+    public boolean putListOfMaps(String key, List<Map<String, String>> value) {
+        return putSetting(key, value == null ? null : new MapListSetting(value));
+    }
+
+    /**
+     * Set a value for a certain setting. The changed setting is saved to the preference file immediately.
+     * Due to caching mechanisms on modern operating systems and hardware, this shouldn't be a performance problem.
+     * @param key the unique identifier for the setting
+     * @param setting the value of the setting. In case it is null, the key-value entry will be removed.
+     * @return {@code true}, if something has changed (i.e. value is different than before)
+     */
+    public abstract boolean putSetting(final String key, Setting<?> setting);
+
+    /**
+     * Get settings value for a certain key and provide default a value.
+     * @param <T> the setting type
+     * @param key the identifier for the setting
+     * @param def the default value. For each call of getSetting() with a given key, the default value must be the same.
+     * <code>def</code> must not be null, but the value of <code>def</code> can be null.
+     * @param klass the setting type (same as T)
+     * @return the corresponding value if the property has been set before, {@code def} otherwise
+     */
+    public abstract <T extends Setting<?>> T getSetting(String key, T def, Class<T> klass);
+}
Index: trunk/src/org/openstreetmap/josm/data/preferences/CollectionProperty.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/preferences/CollectionProperty.java	(revision 12839)
+++ trunk/src/org/openstreetmap/josm/data/preferences/CollectionProperty.java	(revision 12840)
@@ -8,5 +8,7 @@
 /**
  * A property containing a {@code Collection} of {@code String} as value.
+ * @deprecated use {@link ListProperty}
  */
+@Deprecated
 public class CollectionProperty extends AbstractProperty<Collection<String>> {
 
Index: trunk/src/org/openstreetmap/josm/data/preferences/IPreferences.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/preferences/IPreferences.java	(revision 12840)
+++ trunk/src/org/openstreetmap/josm/data/preferences/IPreferences.java	(revision 12840)
@@ -0,0 +1,222 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.preferences;
+
+import java.util.Collections;
+import java.util.List;
+import java.util.Map;
+
+import org.openstreetmap.josm.data.Preferences.PreferenceChangedListener;
+
+/**
+ * Interface for preference handling.
+ *
+ * Allows to save and retrieve user defined settings. The backend storage depends
+ * on the implementation.
+ * @since 12840
+ */
+public interface IPreferences {
+
+    /**
+     * Adds a new preferences listener.
+     * @param listener The listener to add
+     */
+    void addPreferenceChangeListener(PreferenceChangedListener listener);
+
+    /**
+     * Removes a preferences listener.
+     * @param listener The listener to remove
+     */
+    void removePreferenceChangeListener(PreferenceChangedListener listener);
+
+    /**
+     * Adds a listener that only listens to changes in one preference
+     * @param key The preference key to listen to
+     * @param listener The listener to add.
+     */
+    void addKeyPreferenceChangeListener(String key, PreferenceChangedListener listener);
+
+    /**
+     * Removes a listener that only listens to changes in one preference
+     * @param key The preference key to listen to
+     * @param listener The listener to add.
+     */
+    void removeKeyPreferenceChangeListener(String key, PreferenceChangedListener listener);
+
+    /**
+     * Get settings value for a certain key and provide a default value.
+     * @param key the identifier for the setting
+     * @param def the default value. For each call of get() with a given key, the
+     * default value must be the same. {@code def} may be null.
+     * @return the corresponding value if the property has been set before, {@code def} otherwise
+     */
+    String get(String key, String def);
+
+    /**
+     * Get settings value for a certain key.
+     * @param key the identifier for the setting
+     * @return "" if there is nothing set for the preference key, the corresponding value otherwise. The result is not null.
+     */
+    default String get(final String key) {
+        return get(key, "");
+    }
+
+   /**
+     * Set a value for a certain setting.
+     * @param key the unique identifier for the setting
+     * @param value the value of the setting. Can be null or "" which both removes the key-value entry.
+     * @return {@code true}, if something has changed (i.e. value is different than before)
+     */
+    boolean put(String key, String value);
+
+    /**
+     * Gets a boolean preference
+     * @param key The preference key
+     * @param def The default value to use
+     * @return The boolean, <code>false</code> if it could not be parsed, the default value if it is unset
+     */
+    boolean getBoolean(String key, boolean def);
+
+    /**
+     * Gets a boolean preference
+     * @param key The preference key
+     * @return The boolean or <code>false</code> if it could not be parsed
+     */
+    default boolean getBoolean(String key) {
+        return getBoolean(key, false);
+    }
+
+    /**
+     * Set a boolean value for a certain setting.
+     * @param key the unique identifier for the setting
+     * @param value The new value
+     * @return {@code true}, if something has changed (i.e. value is different than before)
+     * @since 12840
+     */
+    boolean putBoolean(String key, boolean value);
+
+   /**
+     * Gets an integer preference
+     * @param key The preference key
+     * @param def The default value to use
+     * @return The integer
+     * @since 12840
+     */
+    int getInt(String key, int def);
+
+    /**
+     * Set a boolean value for a certain setting.
+     * @param key the unique identifier for the setting
+     * @param value The new value
+     * @return {@code true}, if something has changed (i.e. value is different than before)
+     * @since 12840
+     */
+    boolean putInt(String key, int value);
+
+    /**
+     * Gets a double preference
+     * @param key The preference key
+     * @param def The default value to use
+     * @return The double value or the default value if it could not be parsed
+     */
+    double getDouble(String key, double def);
+
+    /**
+     * Set a boolean value for a certain setting.
+     * @param key the unique identifier for the setting
+     * @param value The new value
+     * @return {@code true}, if something has changed (i.e. value is different than before)
+     * @since 12840
+     */
+    boolean putDouble(String key, double value);
+
+    /**
+     * Get a list of values for a certain key
+     * @param key the identifier for the setting
+     * @param def the default value.
+     * @return the corresponding value if the property has been set before, {@code def} otherwise
+     * @since 12840
+     */
+    List<String> getList(String key, List<String> def);
+
+    /**
+     * Get a list of values for a certain key
+     * @param key the identifier for the setting
+     * @return the corresponding value if the property has been set before, an
+     * empty list otherwise.
+     * @since 12840
+     */
+    default List<String> getList(String key) {
+        List<String> val = getList(key, null);
+        return val == null ? Collections.emptyList() : val;
+    }
+
+    /**
+     * Set a list of values for a certain key.
+     * @param key the identifier for the setting
+     * @param value The new value
+     * @return {@code true}, if something has changed (i.e. value is different than before)
+     * @since 12840
+     */
+    boolean putList(String key, List<String> value);
+
+    /**
+     * Get an array of values (list of lists) for a certain key
+     * @param key the identifier for the setting
+     * @param def the default value.
+     * @return the corresponding value if the property has been set before, {@code def} otherwise
+     * @since 12840
+     */
+    List<List<String>> getListOfLists(String key, List<List<String>> def);
+
+    /**
+     * Get an array of values (list of lists) for a certain key
+     * @param key the identifier for the setting
+     * @return the corresponding value if the property has been set before, an
+     * empty list otherwise
+     * @since 12840
+     */
+    default List<List<String>> getListOfLists(String key) {
+        List<List<String>> val = getListOfLists(key, null);
+        return val == null ? Collections.emptyList() : val;
+    }
+
+    /**
+     * Set an array of values (list of lists) for a certain key.
+     * @param key the identifier for the setting
+     * @param value the new value
+     * @return {@code true}, if something has changed (i.e. value is different than before)
+     * @since 12840
+     */
+    boolean putListOfLists(String key, List<List<String>> value);
+
+    /**
+     * Gets a list of key/value maps.
+     * @param key the key to search at
+     * @param def the default value to use
+     * @return the corresponding value if the property has been set before, {@code def} otherwise
+     * @since 12840
+     */
+    List<Map<String, String>> getListOfMaps(String key, List<Map<String, String>> def);
+
+    /**
+     * Gets a list of key/value maps.
+     * @param key the key to search at
+     * @return the corresponding value if the property has been set before, an
+     * empty list otherwise
+     * @since 12840
+     */
+    default List<Map<String, String>> getListOfMaps(String key) {
+        List<Map<String, String>> val = getListOfMaps(key, null);
+        return val == null ? Collections.emptyList() : val;
+    }
+
+    /**
+     * Set an a list of key/value maps.
+     * @param key the key to store the list in
+     * @param value a list of key/value maps
+     * @return <code>true</code> if the value was changed
+     * @since 12840
+     */
+    boolean putListOfMaps(String key, List<Map<String, String>> value);
+
+}
Index: trunk/src/org/openstreetmap/josm/data/preferences/ListProperty.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/preferences/ListProperty.java	(revision 12840)
+++ trunk/src/org/openstreetmap/josm/data/preferences/ListProperty.java	(revision 12840)
@@ -0,0 +1,34 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.preferences;
+
+import java.util.List;
+
+import org.openstreetmap.josm.Main;
+
+/**
+ * A property containing a {@code List} of {@code String} as value.
+ */
+public class ListProperty extends AbstractProperty<List<String>> {
+
+    /**
+     * Constructs a new {@code CollectionProperty}.
+     * @param key The property key
+     * @param defaultValue The default value
+     */
+    public ListProperty(String key, List<String> defaultValue) {
+        super(key, defaultValue);
+        if (Main.pref != null) {
+            get();
+        }
+    }
+
+    @Override
+    public List<String> get() {
+        return getPreferences().getList(getKey(), getDefaultValue());
+    }
+
+    @Override
+    public boolean put(List<String> value) {
+        return getPreferences().putList(getKey(), value);
+    }
+}
