Index: trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetSelector.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetSelector.java	(revision 7411)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetSelector.java	(revision 7412)
@@ -16,4 +16,5 @@
 import java.awt.event.MouseEvent;
 import java.util.ArrayList;
+import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
@@ -22,4 +23,5 @@
 import java.util.Iterator;
 import java.util.List;
+import java.util.Objects;
 
 import javax.swing.AbstractAction;
@@ -69,12 +71,14 @@
     private static final BooleanProperty ONLY_APPLICABLE  = new BooleanProperty("taggingpreset.dialog.only-applicable-to-selection", true);
 
-    private JosmTextField edSearchText;
-    private JList<TaggingPreset> lsResult;
-    private JCheckBox ckOnlyApplicable;
-    private JCheckBox ckSearchInTags;
+    private final JosmTextField edSearchText;
+    private final JList<TaggingPreset> lsResult;
+    private final JCheckBox ckOnlyApplicable;
+    private final JCheckBox ckSearchInTags;
     private final EnumSet<TaggingPresetType> typesInSelection = EnumSet.noneOf(TaggingPresetType.class);
     private boolean typesInSelectionDirty = true;
     private final PresetClassifications classifications = new PresetClassifications();
-    private ResultListModel lsResultModel = new ResultListModel();
+    private final ResultListModel lsResultModel = new ResultListModel();
+
+    private final List<ListSelectionListener> listSelectionListeners = new ArrayList<>();
 
     private ActionListener dblClickListener;
@@ -96,21 +100,21 @@
         private List<PresetClassification> presets = new ArrayList<>();
 
-        public void setPresets(List<PresetClassification> presets) {
+        public synchronized void setPresets(List<PresetClassification> presets) {
             this.presets = presets;
             fireContentsChanged(this, 0, Integer.MAX_VALUE);
         }
 
-        public List<PresetClassification> getPresets() {
-            return presets;
-        }
-
         @Override
-        public TaggingPreset getElementAt(int index) {
+        public synchronized TaggingPreset getElementAt(int index) {
             return presets.get(index).preset;
         }
 
         @Override
-        public int getSize() {
+        public synchronized int getSize() {
             return presets.size();
+        }
+
+        public synchronized boolean isEmpty() {
+            return presets.isEmpty();
         }
     }
@@ -246,6 +250,5 @@
         add(edSearchText, BorderLayout.NORTH);
 
-        lsResult = new JList<>();
-        lsResult.setModel(lsResultModel);
+        lsResult = new JList<>(lsResultModel);
         lsResult.setCellRenderer(new ResultListCellRenderer());
         lsResult.addMouseListener(new MouseAdapter() {
@@ -276,4 +279,6 @@
                 }
             });
+        } else {
+            ckOnlyApplicable = null;
         }
 
@@ -289,4 +294,6 @@
             });
             pnChecks.add(ckSearchInTags);
+        } else {
+            ckSearchInTags = null;
         }
 
@@ -306,5 +313,5 @@
     }
 
-    private void selectPreset(int newIndex) {
+    private synchronized void selectPreset(int newIndex) {
         if (newIndex < 0) {
             newIndex = 0;
@@ -320,5 +327,5 @@
      * Search expression can be in form: "group1/group2/name" where names can contain multiple words
      */
-    private void filterPresets() {
+    private synchronized void filterPresets() {
         //TODO Save favorites to file
         String text = edSearchText.getText().toLowerCase();
@@ -331,6 +338,15 @@
                 text, onlyApplicable, inTags, getTypesInSelection(), selected);
 
+        TaggingPreset oldPreset = getSelectedPreset();
         lsResultModel.setPresets(result);
-
+        TaggingPreset newPreset = getSelectedPreset();
+        if (!Objects.equals(oldPreset, newPreset)) {
+            int[] indices = lsResult.getSelectedIndices();
+            System.out.println(newPreset + " / "+Arrays.toString(indices));
+            for (ListSelectionListener listener : listSelectionListeners) {
+                listener.valueChanged(new ListSelectionEvent(lsResult, lsResult.getSelectedIndex(),
+                        indices.length > 0 ? indices[indices.length-1] : -1, false));
+            }
+        }
     }
 
@@ -456,9 +472,10 @@
     }
 
-    public void init() {
+    public synchronized void init() {
         if (ckOnlyApplicable != null) {
             ckOnlyApplicable.setEnabled(!getTypesInSelection().isEmpty());
             ckOnlyApplicable.setSelected(!getTypesInSelection().isEmpty() && ONLY_APPLICABLE.get());
         }
+        listSelectionListeners.clear();
         edSearchText.setText("");
         filterPresets();
@@ -471,5 +488,5 @@
     }
 
-    public void clearSelection() {
+    public synchronized void clearSelection() {
         lsResult.getSelectionModel().clearSelection();
     }
@@ -491,12 +508,11 @@
      * @return selected preset (as action)
      */
-    public TaggingPreset getSelectedPreset() {
-        List<PresetClassification> presets = lsResultModel.getPresets();
-        if (presets.isEmpty()) return null;
+    public synchronized TaggingPreset getSelectedPreset() {
+        if (lsResultModel.isEmpty()) return null;
         int idx = lsResult.getSelectedIndex();
-        if (idx == -1) {
+        if (idx < 0 || idx >= lsResultModel.getSize()) {
             idx = 0;
         }
-        TaggingPreset preset = presets.get(idx).preset;
+        TaggingPreset preset = lsResultModel.getElementAt(idx);
         for (PresetClassification pc: classifications) {
             if (pc.preset == preset) {
@@ -509,9 +525,9 @@
     }
 
-    public void setSelectedPreset(TaggingPreset p) {
+    public synchronized void setSelectedPreset(TaggingPreset p) {
         lsResult.setSelectedValue(p, true);
     }
 
-    public int getItemCount() {
+    public synchronized int getItemCount() {
         return lsResultModel.getSize();
     }
@@ -525,12 +541,22 @@
     }
 
-    public void addSelectionListener(final ActionListener selectListener) {
-        lsResult.getSelectionModel().addListSelectionListener(new ListSelectionListener() {
-            @Override
-            public void valueChanged(ListSelectionEvent e) {
-                if (!e.getValueIsAdjusting())
-                    selectListener.actionPerformed(null);
-            }
-        });
+    /**
+     * Adds a selection listener to the presets list.
+     * @param selectListener The list selection listener
+     * @since 7412
+     */
+    public synchronized void addSelectionListener(ListSelectionListener selectListener) {
+        lsResult.getSelectionModel().addListSelectionListener(selectListener);
+        listSelectionListeners.add(selectListener);
+    }
+
+    /**
+     * Removes a selection listener from the presets list.
+     * @param selectListener The list selection listener
+     * @since 7412
+     */
+    public synchronized void removeSelectionListener(ListSelectionListener selectListener) {
+        listSelectionListeners.remove(selectListener);
+        lsResult.getSelectionModel().removeListSelectionListener(selectListener);
     }
 }
