Index: trunk/src/org/openstreetmap/josm/Main.java
===================================================================
--- trunk/src/org/openstreetmap/josm/Main.java	(revision 7099)
+++ trunk/src/org/openstreetmap/josm/Main.java	(revision 7100)
@@ -82,8 +82,8 @@
 import org.openstreetmap.josm.gui.preferences.imagery.ImageryPreference;
 import org.openstreetmap.josm.gui.preferences.map.MapPaintPreference;
-import org.openstreetmap.josm.gui.preferences.map.TaggingPresetPreference;
 import org.openstreetmap.josm.gui.preferences.projection.ProjectionPreference;
 import org.openstreetmap.josm.gui.progress.PleaseWaitProgressMonitor;
 import org.openstreetmap.josm.gui.progress.ProgressMonitorExecutor;
+import org.openstreetmap.josm.gui.tagging.TaggingPresets;
 import org.openstreetmap.josm.gui.util.RedirectInputMap;
 import org.openstreetmap.josm.gui.widgets.JMultilineLabel;
@@ -535,5 +535,5 @@
             @Override
             public void initialize() throws Exception {
-                TaggingPresetPreference.initialize();
+                TaggingPresets.initialize();
             }
         });
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java	(revision 7099)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/RelationChecker.java	(revision 7100)
@@ -24,11 +24,11 @@
 import org.openstreetmap.josm.data.validation.Test;
 import org.openstreetmap.josm.data.validation.TestError;
-import org.openstreetmap.josm.gui.preferences.map.TaggingPresetPreference;
 import org.openstreetmap.josm.gui.tagging.TaggingPreset;
 import org.openstreetmap.josm.gui.tagging.TaggingPresetItem;
+import org.openstreetmap.josm.gui.tagging.TaggingPresetItems.Key;
 import org.openstreetmap.josm.gui.tagging.TaggingPresetItems.Role;
-import org.openstreetmap.josm.gui.tagging.TaggingPresetItems.Key;
 import org.openstreetmap.josm.gui.tagging.TaggingPresetItems.Roles;
 import org.openstreetmap.josm.gui.tagging.TaggingPresetType;
+import org.openstreetmap.josm.gui.tagging.TaggingPresets;
 
 /**
@@ -46,6 +46,6 @@
     protected static final int RELATION_UNKNOWN  = 1707;
     protected static final int RELATION_EMPTY    = 1708;
-    
-    /** 
+
+    /**
      * Error message used to group errors related to role problems.
      * @since 6731
@@ -73,12 +73,9 @@
      */
     public void initializePresets() {
-        Collection<TaggingPreset> presets = TaggingPresetPreference.taggingPresets;
-        if (presets != null) {
-            for (TaggingPreset p : presets) {
-                for (TaggingPresetItem i : p.data) {
-                    if (i instanceof Roles) {
-                        relationpresets.add(p);
-                        break;
-                    }
+        for (TaggingPreset p : TaggingPresets.getTaggingPresets()) {
+            for (TaggingPresetItem i : p.data) {
+                if (i instanceof Roles) {
+                    relationpresets.add(p);
+                    break;
                 }
             }
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java	(revision 7099)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/TagChecker.java	(revision 7100)
@@ -41,5 +41,4 @@
 import org.openstreetmap.josm.data.validation.TestError;
 import org.openstreetmap.josm.data.validation.util.Entities;
-import org.openstreetmap.josm.gui.preferences.map.TaggingPresetPreference;
 import org.openstreetmap.josm.gui.preferences.validator.ValidatorPreference;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
@@ -49,4 +48,5 @@
 import org.openstreetmap.josm.gui.tagging.TaggingPresetItems.CheckGroup;
 import org.openstreetmap.josm.gui.tagging.TaggingPresetItems.KeyedItem;
+import org.openstreetmap.josm.gui.tagging.TaggingPresets;
 import org.openstreetmap.josm.gui.widgets.EditableList;
 import org.openstreetmap.josm.io.MirroredInputStream;
@@ -61,5 +61,5 @@
  */
 public class TagChecker extends Test.TagTest {
-    
+
     /** The default data file of tagchecker rules */
     public static final String DATA_FILE = "resource://data/validator/tagchecker.cfg";
@@ -161,5 +161,5 @@
 
         spellCheckKeyData = new HashMap<>();
-        
+
         String errorSources = "";
         for (String source : Main.pref.getCollection(PREF_SOURCES, DEFAULT_SOURCES)) {
@@ -256,6 +256,6 @@
             return;
 
-        Collection<TaggingPreset> presets = TaggingPresetPreference.taggingPresets;
-        if (presets != null) {
+        Collection<TaggingPreset> presets = TaggingPresets.getTaggingPresets();
+        if (!presets.isEmpty()) {
             presetsValueData = new MultiMap<>();
             for (String a : OsmPrimitive.getUninterestingKeys()) {
Index: trunk/src/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreference.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreference.java	(revision 7099)
+++ trunk/src/org/openstreetmap/josm/gui/preferences/map/TaggingPresetPreference.java	(revision 7100)
@@ -17,9 +17,6 @@
 import javax.swing.JCheckBox;
 import javax.swing.JLabel;
-import javax.swing.JMenu;
-import javax.swing.JMenuItem;
 import javax.swing.JOptionPane;
 import javax.swing.JPanel;
-import javax.swing.JSeparator;
 
 import org.openstreetmap.josm.Main;
@@ -36,9 +33,5 @@
 import org.openstreetmap.josm.gui.preferences.SubPreferenceSetting;
 import org.openstreetmap.josm.gui.preferences.TabPreferenceSetting;
-import org.openstreetmap.josm.gui.tagging.TaggingPreset;
-import org.openstreetmap.josm.gui.tagging.TaggingPresetMenu;
 import org.openstreetmap.josm.gui.tagging.TaggingPresetReader;
-import org.openstreetmap.josm.gui.tagging.TaggingPresetSeparator;
-import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager;
 import org.openstreetmap.josm.tools.GBC;
 import org.xml.sax.SAXException;
@@ -65,9 +58,5 @@
 
     private static final List<SourceProvider> presetSourceProviders = new ArrayList<>();
-    
-    /**
-     * The collection of tagging presets.
-     */
-    public static Collection<TaggingPreset> taggingPresets;
+
     private SourceEditor sources;
     private JCheckBox sortMenu;
@@ -274,48 +263,4 @@
 
     /**
-     * Initializes tagging presets from preferences.
-     */
-    public static void readFromPreferences() {
-        taggingPresets = TaggingPresetReader.readFromPreferences(false, false);
-    }
-
-    /**
-     * Initialize the tagging presets (load and may display error)
-     */
-    public static void initialize() {
-        readFromPreferences();
-        for (TaggingPreset tp: taggingPresets) {
-            if (!(tp instanceof TaggingPresetSeparator)) {
-                Main.toolbar.register(tp);
-            }
-        }
-        if (taggingPresets.isEmpty()) {
-            Main.main.menu.presetsMenu.setVisible(false);
-        } else {
-            AutoCompletionManager.cachePresets(taggingPresets);
-            HashMap<TaggingPresetMenu,JMenu> submenus = new HashMap<>();
-            for (final TaggingPreset p : taggingPresets) {
-                JMenu m = p.group != null ? submenus.get(p.group) : Main.main.menu.presetsMenu;
-                if (p instanceof TaggingPresetSeparator) {
-                    m.add(new JSeparator());
-                } else if (p instanceof TaggingPresetMenu) {
-                    JMenu submenu = new JMenu(p);
-                    submenu.setText(p.getLocaleName());
-                    ((TaggingPresetMenu)p).menu = submenu;
-                    submenus.put((TaggingPresetMenu)p, submenu);
-                    m.add(submenu);
-                } else {
-                    JMenuItem mi = new JMenuItem(p);
-                    mi.setText(p.getLocaleName());
-                    m.add(mi);
-                }
-            }
-        }
-        if (Main.pref.getBoolean("taggingpreset.sortmenu")) {
-            TaggingPresetMenu.sortMenu(Main.main.menu.presetsMenu);
-        }
-    }
-
-    /**
      * Helper class for tagging presets preferences.
      */
Index: trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java	(revision 7099)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java	(revision 7100)
@@ -44,5 +44,4 @@
 import org.openstreetmap.josm.gui.layer.Layer;
 import org.openstreetmap.josm.gui.preferences.ToolbarPreferences;
-import org.openstreetmap.josm.gui.preferences.map.TaggingPresetPreference;
 import org.openstreetmap.josm.gui.tagging.TaggingPresetItems.Link;
 import org.openstreetmap.josm.gui.tagging.TaggingPresetItems.Role;
@@ -199,6 +198,5 @@
     private static class PresetPanel extends JPanel {
         boolean hasElements = false;
-        PresetPanel()
-        {
+        PresetPanel() {
             super(new GridBagLayout());
         }
@@ -262,8 +260,6 @@
     }
 
-    public boolean isShowable()
-    {
-        for(TaggingPresetItem i : data)
-        {
+    public boolean isShowable() {
+        for(TaggingPresetItem i : data) {
             if(!(i instanceof TaggingPresetItems.Optional || i instanceof TaggingPresetItems.Space || i instanceof TaggingPresetItems.Key))
                 return true;
@@ -495,5 +491,5 @@
 
     public static Collection<TaggingPreset> getMatchingPresets(final Collection<TaggingPresetType> t, final Map<String, String> tags, final boolean onlyShowable) {
-        return Utils.filter(TaggingPresetPreference.taggingPresets, new Predicate<TaggingPreset>() {
+        return Utils.filter(TaggingPresets.getTaggingPresets(), new Predicate<TaggingPreset>() {
             @Override
             public boolean evaluate(TaggingPreset object) {
@@ -508,4 +504,8 @@
     public class ToolbarButtonAction extends AbstractAction {
         private final int toolbarIndex;
+
+        /**
+         * Constructs a new {@code ToolbarButtonAction}.
+         */
         public ToolbarButtonAction() {
             super("", ImageProvider.get("styles/standard/waypoint","pin"));
@@ -524,8 +524,6 @@
 
     public String getToolbarString() {
-        ToolbarPreferences.ActionDefinition aDef
-            = new ToolbarPreferences.ActionDefinition(this);
         ToolbarPreferences.ActionParser actionParser = new ToolbarPreferences.ActionParser(null);
-        return actionParser.saveAction(aDef);
+        return actionParser.saveAction(new ToolbarPreferences.ActionDefinition(this));
     }
 }
Index: trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java	(revision 7099)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java	(revision 7100)
@@ -50,5 +50,4 @@
 import org.openstreetmap.josm.data.preferences.BooleanProperty;
 import org.openstreetmap.josm.gui.dialogs.properties.PresetListPanel;
-import org.openstreetmap.josm.gui.preferences.map.TaggingPresetPreference;
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletingTextField;
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionItemPriority;
@@ -402,5 +401,5 @@
         boolean addToPanel(JPanel p, Collection<OsmPrimitive> sel, boolean presetInitiallyMatches) {
             final String presetName = preset_name;
-            final TaggingPreset t = Utils.filter(TaggingPresetPreference.taggingPresets, new Predicate<TaggingPreset>() {
+            final TaggingPreset t = Utils.filter(TaggingPresets.getTaggingPresets(), new Predicate<TaggingPreset>() {
                 @Override
                 public boolean evaluate(TaggingPreset object) {
Index: trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetListener.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetListener.java	(revision 7100)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetListener.java	(revision 7100)
@@ -0,0 +1,14 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.tagging;
+
+/**
+ * Notification of tagging presets events.
+ * @since 7100
+ */
+public interface TaggingPresetListener {
+
+    /**
+     * Called after list of tagging presets has been modified.
+     */
+    public void taggingPresetsModified();
+}
Index: trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetSelector.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetSelector.java	(revision 7099)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetSelector.java	(revision 7100)
@@ -47,5 +47,4 @@
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.preferences.BooleanProperty;
-import org.openstreetmap.josm.gui.preferences.map.TaggingPresetPreference;
 import org.openstreetmap.josm.gui.tagging.TaggingPresetItems.Key;
 import org.openstreetmap.josm.gui.tagging.TaggingPresetItems.KeyedItem;
@@ -60,5 +59,5 @@
  */
 public class TaggingPresetSelector extends JPanel implements SelectionChangedListener {
-    
+
     private static final int CLASSIFICATION_IN_FAVORITES = 300;
     private static final int CLASSIFICATION_NAME_MATCH = 300;
@@ -68,5 +67,5 @@
     private static final BooleanProperty SEARCH_IN_TAGS = new BooleanProperty("taggingpreset.dialog.search-in-tags", true);
     private static final BooleanProperty ONLY_APPLICABLE  = new BooleanProperty("taggingpreset.dialog.only-applicable-to-selection", true);
-    
+
     private JosmTextField edSearchText;
     private JList<TaggingPreset> lsResult;
@@ -208,8 +207,6 @@
     public TaggingPresetSelector(boolean displayOnlyApplicable, boolean displaySearchInTags) {
         super(new BorderLayout());
-        if (TaggingPresetPreference.taggingPresets!=null) {
-            loadPresets(TaggingPresetPreference.taggingPresets);
-        }
-        
+        loadPresets(TaggingPresets.getTaggingPresets());
+
         edSearchText = new JosmTextField();
         edSearchText.getDocument().addDocumentListener(new DocumentListener() {
@@ -304,5 +301,5 @@
         lsResult.addMouseListener(new PopupMenuLauncher(popupMenu));
     }
-    
+
     private void selectPreset(int newIndex) {
         if (newIndex < 0) {
@@ -389,5 +386,5 @@
 
     }
-    
+
     private EnumSet<TaggingPresetType> getTypesInSelection() {
         if (typesInSelectionDirty) {
@@ -412,5 +409,5 @@
         return typesInSelection;
     }
-    
+
     @Override
     public void selectionChanged(Collection<? extends OsmPrimitive> newSelection) {
@@ -426,5 +423,5 @@
         filterPresets();
     }
-    
+
     public void init(Collection<TaggingPreset> presets) {
         classifications.clear();
@@ -432,9 +429,9 @@
         init();
     }
-    
+
     public void clearSelection() {
         lsResult.getSelectionModel().clearSelection();
     }
-    
+
     /**
      * Save checkbox values in preferences for future reuse
@@ -448,5 +445,5 @@
         }
     }
-    
+
     /**
      * Determines, which preset is selected at the current moment
@@ -483,17 +480,17 @@
         lsResult.setSelectedValue(p, true);
     }
-    
+
     public int getItemCount() {
         return lsResultModel.getSize();
     }
-    
+
     public void setDblClickListener(ActionListener dblClickListener) {
         this.dblClickListener = dblClickListener;
     }
-    
+
     public void setClickListener(ActionListener clickListener) {
         this.clickListener = clickListener;
     }
-    
+
     public void addSelectionListener(final ActionListener selectListener) {
         lsResult.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
Index: trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresets.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresets.java	(revision 7100)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresets.java	(revision 7100)
@@ -0,0 +1,117 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.tagging;
+
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.HashMap;
+
+import javax.swing.JMenu;
+import javax.swing.JMenuItem;
+import javax.swing.JSeparator;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager;
+
+/**
+ * Class holding Tagging Presets and allowing to manage them.
+ * @since 7100
+ */
+public final class TaggingPresets {
+
+    /** The collection of tagging presets */
+    private static final Collection<TaggingPreset> taggingPresets = new ArrayList<>();
+
+    /** The collection of listeners */
+    private static final Collection<TaggingPresetListener> listeners = new ArrayList<>();
+
+    private TaggingPresets() {
+        // Hide constructor for utility classes
+    }
+
+    /**
+     * Initializes tagging presets from preferences.
+     */
+    public static void readFromPreferences() {
+        taggingPresets.clear();
+        taggingPresets.addAll(TaggingPresetReader.readFromPreferences(false, false));
+    }
+
+    /**
+     * Initialize the tagging presets (load and may display error)
+     */
+    public static void initialize() {
+        readFromPreferences();
+        for (TaggingPreset tp: taggingPresets) {
+            if (!(tp instanceof TaggingPresetSeparator)) {
+                Main.toolbar.register(tp);
+            }
+        }
+        if (taggingPresets.isEmpty()) {
+            Main.main.menu.presetsMenu.setVisible(false);
+        } else {
+            AutoCompletionManager.cachePresets(taggingPresets);
+            HashMap<TaggingPresetMenu,JMenu> submenus = new HashMap<>();
+            for (final TaggingPreset p : taggingPresets) {
+                JMenu m = p.group != null ? submenus.get(p.group) : Main.main.menu.presetsMenu;
+                if (p instanceof TaggingPresetSeparator) {
+                    m.add(new JSeparator());
+                } else if (p instanceof TaggingPresetMenu) {
+                    JMenu submenu = new JMenu(p);
+                    submenu.setText(p.getLocaleName());
+                    ((TaggingPresetMenu)p).menu = submenu;
+                    submenus.put((TaggingPresetMenu)p, submenu);
+                    m.add(submenu);
+                } else {
+                    JMenuItem mi = new JMenuItem(p);
+                    mi.setText(p.getLocaleName());
+                    m.add(mi);
+                }
+            }
+        }
+        if (Main.pref.getBoolean("taggingpreset.sortmenu")) {
+            TaggingPresetMenu.sortMenu(Main.main.menu.presetsMenu);
+        }
+    }
+
+    /**
+     * Replies a new collection containing all tagging presets.
+     * @return a new collection containing all tagging presets. Empty if presets are not initialized (never null)
+     */
+    public static Collection<TaggingPreset> getTaggingPresets() {
+        return new ArrayList<>(taggingPresets);
+    }
+
+    /**
+     * Adds a list of tagging presets to the current list.
+     * @param presets The tagging presets to add
+     */
+    public static void addTaggingPresets(Collection<TaggingPreset> presets) {
+        if (presets != null) {
+            if (taggingPresets.addAll(presets)) {
+                for (TaggingPresetListener listener : listeners) {
+                    listener.taggingPresetsModified();
+                }
+            }
+        }
+    }
+
+    /**
+     * Adds a tagging preset listener.
+     * @param listener The listener to add
+     */
+    public static void addListener(TaggingPresetListener listener) {
+        if (listener != null) {
+            listeners.add(listener);
+        }
+    }
+
+    /**
+     * Removes a tagging preset listener.
+     * @param listener The listener to remove
+     */
+    public static void removeListener(TaggingPresetListener listener) {
+        if (listener != null) {
+            listeners.remove(listener);
+        }
+    }
+}
Index: trunk/src/org/openstreetmap/josm/tools/TaggingPresetNameTemplateList.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/TaggingPresetNameTemplateList.java	(revision 7099)
+++ trunk/src/org/openstreetmap/josm/tools/TaggingPresetNameTemplateList.java	(revision 7100)
@@ -7,27 +7,41 @@
 import java.util.List;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.gui.preferences.map.TaggingPresetPreference;
 import org.openstreetmap.josm.gui.tagging.TaggingPreset;
+import org.openstreetmap.josm.gui.tagging.TaggingPresetListener;
 import org.openstreetmap.josm.gui.tagging.TaggingPresetType;
+import org.openstreetmap.josm.gui.tagging.TaggingPresets;
 
 /**
  * List of tagging presets with name templates, allows to find appropriate template based on existing primitive
  */
-public final class TaggingPresetNameTemplateList {
+public final class TaggingPresetNameTemplateList implements TaggingPresetListener {
 
     private static TaggingPresetNameTemplateList instance;
 
+    /**
+     * Replies the unique instance.
+     * @return the unique instance
+     */
     public static TaggingPresetNameTemplateList getInstance() {
         if (instance == null) {
             instance = new TaggingPresetNameTemplateList();
+            TaggingPresets.addListener(instance);
         }
         return instance;
     }
+
     private final List<TaggingPreset> presetsWithPattern = new LinkedList<>();
 
     private TaggingPresetNameTemplateList() {
-        if (TaggingPresetPreference.taggingPresets != null) {
-            for (TaggingPreset tp : TaggingPresetPreference.taggingPresets) {
+        buildPresetsWithPattern();
+    }
+
+    private void buildPresetsWithPattern() {
+        synchronized(this) {
+            Main.debug("Building list of presets with name template");
+            presetsWithPattern.clear();
+            for (TaggingPreset tp : TaggingPresets.getTaggingPresets()) {
                 if (tp.nameTemplate != null) {
                     presetsWithPattern.add(tp);
@@ -37,17 +51,23 @@
     }
 
+    /**
+     * Finds and returns the first occurence of preset with template name matching the given primitive
+     * @param primitive The primitive to match
+     * @return the first occurence of preset with template name matching the primitive
+     */
     public TaggingPreset findPresetTemplate(OsmPrimitive primitive) {
-
-        for (TaggingPreset t : presetsWithPattern) {
-            Collection<TaggingPresetType> type = Collections.singleton(TaggingPresetType.forPrimitive(primitive));
-            if (t.typeMatches(type)) {
-                if (t.nameTemplateFilter != null) {
-                    if (t.nameTemplateFilter.match(primitive))
+        synchronized(this) {
+            for (TaggingPreset t : presetsWithPattern) {
+                Collection<TaggingPresetType> type = Collections.singleton(TaggingPresetType.forPrimitive(primitive));
+                if (t.typeMatches(type)) {
+                    if (t.nameTemplateFilter != null) {
+                        if (t.nameTemplateFilter.match(primitive))
+                            return t;
+                        else {
+                            continue;
+                        }
+                    } else if (t.matches(type, primitive.getKeys(), false)) {
                         return t;
-                    else {
-                        continue;
                     }
-                } else if (t.matches(type, primitive.getKeys(), false)) {
-                    return t;
                 }
             }
@@ -55,3 +75,8 @@
         return null;
     }
+
+    @Override
+    public void taggingPresetsModified() {
+        buildPresetsWithPattern();
+    }
 }
