Index: /trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresets.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresets.java	(revision 18866)
+++ /trunk/src/org/openstreetmap/josm/gui/tagging/presets/TaggingPresets.java	(revision 18867)
@@ -42,5 +42,5 @@
 
     /** The collection of tagging presets */
-    private static final Collection<TaggingPreset> taggingPresets = new ArrayList<>();
+    private static final List<TaggingPreset> TAGGING_PRESETS = new ArrayList<>();
 
     /** cache for key/value pairs found in the preset */
@@ -69,7 +69,7 @@
      */
     public static void readFromPreferences() {
-        taggingPresets.clear();
-        taggingPresets.addAll(TaggingPresetReader.readFromPreferences(false, false));
-        cachePresets(taggingPresets);
+        TAGGING_PRESETS.clear();
+        TAGGING_PRESETS.addAll(TaggingPresetReader.readFromPreferences(false, false));
+        cachePresets(TAGGING_PRESETS);
     }
 
@@ -89,6 +89,6 @@
 
         readFromPreferences();
-        final List<TaggingPreset> activeLayerChangeListeners = new ArrayList<>(taggingPresets.size());
-        for (TaggingPreset tp: taggingPresets) {
+        final List<TaggingPreset> activeLayerChangeListeners = new ArrayList<>(TAGGING_PRESETS.size());
+        for (TaggingPreset tp: TAGGING_PRESETS) {
             if (!(tp instanceof TaggingPresetSeparator)) {
                 MainApplication.getToolbar().register(tp);
@@ -97,9 +97,9 @@
         }
         MainApplication.getLayerManager().addActiveLayerChangeListeners(activeLayerChangeListeners);
-        if (taggingPresets.isEmpty()) {
+        if (TAGGING_PRESETS.isEmpty()) {
             presetsMenu.setVisible(false);
         } else {
             Map<TaggingPresetMenu, JMenu> submenus = new HashMap<>();
-            for (final TaggingPreset p : taggingPresets) {
+            for (final TaggingPreset p : TAGGING_PRESETS) {
                 JMenu m = p.group != null ? submenus.get(p.group) : presetsMenu;
                 if (m == null && p.group != null) {
@@ -127,5 +127,5 @@
             }
         }
-        if (SORT_MENU.get()) {
+        if (Boolean.TRUE.equals(SORT_MENU.get())) {
             TaggingPresetMenu.sortMenu(presetsMenu);
         }
@@ -142,5 +142,5 @@
     public static void destroy() {
         ToolbarPreferences toolBar = MainApplication.getToolbar();
-        for (TaggingPreset tp: taggingPresets) {
+        for (TaggingPreset tp: TAGGING_PRESETS) {
             toolBar.unregister(tp);
             if (!(tp instanceof TaggingPresetSeparator)) {
@@ -148,5 +148,5 @@
             }
         }
-        taggingPresets.clear();
+        TAGGING_PRESETS.clear();
         PRESET_TAG_CACHE.clear();
         PRESET_ROLE_CACHE.clear();
@@ -191,5 +191,5 @@
      */
     public static Collection<TaggingPreset> getTaggingPresets() {
-        return Collections.unmodifiableCollection(taggingPresets);
+        return Collections.unmodifiableList(TAGGING_PRESETS);
     }
 
@@ -264,5 +264,5 @@
      */
     public static void addTaggingPresets(Collection<TaggingPreset> presets) {
-        if (presets != null && taggingPresets.addAll(presets)) {
+        if (presets != null && TAGGING_PRESETS.addAll(presets)) {
             listeners.forEach(TaggingPresetListener::taggingPresetsModified);
         }
Index: /trunk/test/unit/org/openstreetmap/josm/testutils/annotations/TaggingPresets.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/testutils/annotations/TaggingPresets.java	(revision 18867)
+++ /trunk/test/unit/org/openstreetmap/josm/testutils/annotations/TaggingPresets.java	(revision 18867)
@@ -0,0 +1,49 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.testutils.annotations;
+
+import java.lang.annotation.Documented;
+import java.lang.annotation.ElementType;
+import java.lang.annotation.Retention;
+import java.lang.annotation.RetentionPolicy;
+import java.lang.annotation.Target;
+import java.util.Collection;
+
+import org.junit.jupiter.api.extension.BeforeEachCallback;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
+
+/**
+ * Use presets in tests.
+ *
+ * @author Taylor Smock
+ * @see JOSMTestRules#presets()
+ */
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ ElementType.METHOD, ElementType.TYPE })
+@BasicPreferences
+@ExtendWith(TaggingPresets.TaggingPresetsExtension.class)
+public @interface TaggingPresets {
+
+    class TaggingPresetsExtension implements BeforeEachCallback {
+        private static int expectedHashcode = 0;
+
+        @Override
+        public void beforeEach(ExtensionContext extensionContext) {
+            setup();
+        }
+
+        /**
+         * Setup the tagging presets
+         */
+        public static synchronized void setup() {
+            final Collection<TaggingPreset> oldPresets = org.openstreetmap.josm.gui.tagging.presets.TaggingPresets.getTaggingPresets();
+            if (oldPresets.isEmpty() || expectedHashcode != oldPresets.hashCode()) {
+                org.openstreetmap.josm.gui.tagging.presets.TaggingPresets.readFromPreferences();
+                expectedHashcode = org.openstreetmap.josm.gui.tagging.presets.TaggingPresets.getTaggingPresets().hashCode();
+            }
+        }
+    }
+}
