From b36f2b6a17304490e8f5876125eb3686753fa751 Mon Sep 17 00:00:00 2001
From: Taylor Smock <tsmock@fb.com>
Date: Thu, 1 Jul 2021 13:22:36 -0600
Subject: [PATCH 1/2] JUnit5 Extension: Add utilities for basic preferences

Also, move many tests that rely solely on
* JOSMTestRules#preferences
* JOSMTestRules#timeout
* JOSMTestRules#i18n
* JOSMTestRules with no further calls

Signed-off-by: Taylor Smock <tsmock@fb.com>
---
 .../josm/actions/ExpertToggleActionTest.java  |  15 +--
 .../josm/command/AddCommandTest.java          |  18 +--
 .../command/AddPrimitivesCommandTest.java     |  18 +--
 .../josm/command/ChangeCommandTest.java       |  21 ++--
 .../command/ChangeMembersCommandTest.java     |  19 ++--
 .../josm/command/ChangeNodesCommandTest.java  |  21 ++--
 .../command/ChangePropertyCommandTest.java    |  19 ++--
 .../command/ChangePropertyKeyCommandTest.java |  19 ++--
 .../ChangeRelationMemberRoleCommandTest.java  |  19 ++--
 .../josm/command/CommandTest.java             |  18 +--
 .../josm/command/DeleteCommandTest.java       |  21 ++--
 .../josm/command/PurgeCommandTest.java        |  16 +--
 .../josm/command/RemoveNodesCommandTest.java  |  17 +--
 .../josm/command/SelectCommandTest.java       |  19 +---
 .../josm/command/SequenceCommandTest.java     |  17 +--
 .../josm/data/PreferencesUtilsTest.java       |  17 +--
 .../josm/data/UserIdentityManagerTest.java    | 103 ++++++------------
 .../josm/data/cache/JCSCacheManagerTest.java  |  19 +---
 .../josm/data/osm/TagCollectionTest.java      |  15 +--
 .../osm/event/SelectionEventManagerTest.java  |  13 +--
 .../data/osm/search/SearchCompilerTest.java   |  20 ++--
 .../preferences/NamedColorPropertyTest.java   |  16 +--
 .../preferences/PreferencesWriterTest.java    |  12 +-
 .../data/preferences/StrokePropertyTest.java  |  15 +--
 .../data/projection/CustomProjectionTest.java |  15 +--
 .../josm/data/protobuf/ProtobufTest.java      |   7 +-
 .../tests/DuplicateRelationTest.java          |  15 +--
 .../validation/tests/OpeningHourTestTest.java |  18 +--
 .../data/validation/util/EntitiesTest.java    |  14 +--
 .../util/MultipleNameVisitorTest.java         |  15 +--
 .../josm/data/vector/VectorRelationTest.java  |  16 ++-
 .../josm/data/vector/VectorWayTest.java       |  27 +++--
 .../gui/autofilter/AutoFilterRuleTest.java    |  17 +--
 .../josm/gui/bbox/SizeButtonTest.java         |  15 +--
 .../bugreport/BugReportSettingsPanelTest.java |  13 +--
 .../gui/bugreport/DebugTextDisplayTest.java   |  14 +--
 .../conflict/pair/ConflictResolverTest.java   |  15 +--
 .../pair/nodes/NodeListMergeModelTest.java    |  18 +--
 .../pair/nodes/NodeListMergerTest.java        |  15 +--
 .../properties/PropertiesMergeModelTest.java  |  19 +---
 .../pair/properties/PropertiesMergerTest.java |  15 +--
 .../relation/RelationMemberMergerTest.java    |  15 +--
 .../RelationMemberTableCellEditorTest.java    |  15 +--
 .../RelationMemberTableCellRendererTest.java  |  15 +--
 .../conflict/pair/tags/TagMergeItemTest.java  |  16 +--
 .../conflict/pair/tags/TagMergeModelTest.java |  16 +--
 .../gui/conflict/pair/tags/TagMergerTest.java |  15 +--
 .../tags/MultiValueCellEditorTest.java        |  12 --
 .../tags/MultiValueCellRendererTest.java      |  15 +--
 .../PasteTagsConflictResolverDialogTest.java  |  16 +--
 ...lationMemberConflictResolverModelTest.java |  16 +--
 .../RelationMemberConflictResolverTest.java   |  15 +--
 .../tags/TagConflictResolutionUtilTest.java   |  14 +--
 .../gui/datatransfer/ClipboardUtilsTest.java  |  13 +--
 .../PrimitiveTransferableTest.java            |  17 +--
 .../RelationMemberTransferableTest.java       |  18 +--
 .../gui/datatransfer/TagTransferableTest.java |  15 +--
 .../data/PrimitiveTagTransferDataTest.java    |  15 +--
 .../importers/OsmLinkPasterTest.java          |  12 +-
 .../josm/gui/dialogs/NotesDialogTest.java     |  15 +--
 .../changeset/ChangesetCacheManagerTest.java  |  22 +---
 .../ChangesetCacheTableColumnModelTest.java   |  12 --
 .../changeset/ChangesetContentPanelTest.java  |   6 +-
 .../changeset/ChangesetDetailPanelTest.java   |  15 +--
 .../ChangesetDiscussionPanelTest.java         |  15 +--
 .../changeset/ChangesetTagsPanelTest.java     |  15 +--
 .../AdvancedChangesetQueryPanelTest.java      |  15 +--
 .../query/BasicChangesetQueryPanelTest.java   |  15 +--
 .../query/UrlBasedQueryPanelTest.java         |  15 +--
 .../dialogs/layer/DuplicateActionTest.java    |  15 +--
 .../properties/PropertiesDialogTest.java      |  15 +--
 .../properties/RecentTagCollectionTest.java   |  15 +--
 .../relation/ChildRelationBrowserTest.java    |  15 +--
 .../MemberTableLinkedCellRendererTest.java    |  15 +--
 .../MemberTableMemberCellRendererTest.java    |  15 +--
 .../relation/MemberTableModelTest.java        |  15 +--
 .../MemberTableRoleCellRendererTest.java      |  15 +--
 .../ReferringRelationsBrowserTest.java        |  15 +--
 .../RelationTreeCellRendererTest.java         |  15 +--
 .../SelectionTableCellRendererTest.java       |  15 +--
 .../validator/ValidatorTreePanelTest.java     |  15 +--
 .../gui/download/BookmarkSelectionTest.java   |  15 +--
 .../download/BoundingBoxSelectionTest.java    |  15 +--
 .../josm/gui/download/PlaceSelectionTest.java |  15 +--
 .../josm/gui/download/TileSelectionTest.java  |  15 +--
 .../josm/gui/help/HyperlinkHandlerTest.java   |  15 +--
 .../gui/history/CoordinateInfoViewerTest.java |  15 +--
 .../josm/gui/history/NodeListViewerTest.java  |  15 +--
 .../gui/io/BasicUploadSettingsPanelTest.java  |  15 +--
 .../gui/io/ChangesetCellRendererTest.java     |  13 +--
 .../gui/io/ChangesetManagementPanelTest.java  |  14 +--
 .../josm/gui/io/CredentialDialogTest.java     |  14 +--
 .../josm/gui/io/CustomConfiguratorTest.java   |  14 +--
 .../io/LayerNameAndFilePathTableCellTest.java |  13 +--
 .../josm/gui/io/UploadDialogTest.java         |  14 +--
 .../io/UploadParameterSummaryPanelTest.java   |  14 +--
 .../io/UploadTextComponentValidatorTest.java  |  14 +--
 .../josm/gui/layer/ImageryLayerTest.java      |  14 +--
 .../gui/layer/geoimage/GeoImageLayerTest.java |  14 +--
 .../gui/layer/geoimage/ImageDisplayTest.java  |  13 +--
 .../gui/layer/geoimage/ThumbsLoaderTest.java  |  12 +-
 .../geoimage/WikimediaCommonsLoaderTest.java  |  16 +--
 .../gpx/DownloadAlongTrackActionTest.java     |  14 +--
 .../mappaint/mapcss/ConditionFactoryTest.java |  13 +--
 .../gui/mappaint/mapcss/ConditionTest.java    |  13 +--
 .../FullyAutomaticAuthorizationUITest.java    |  15 +--
 .../FullyAutomaticPropertiesPanelTest.java    |  14 +--
 .../gui/oauth/ManualAuthorizationUITest.java  |  14 +--
 .../SemiAutomaticAuthorizationUITest.java     |  14 +--
 .../imagery/AddTMSLayerPanelTest.java         |  16 +--
 .../imagery/AddWMSLayerPanelTest.java         |  16 +--
 .../imagery/AddWMTSLayerPanelTest.java        |  15 +--
 .../server/ProxyPreferenceTest.java           |  17 +--
 .../server/ServerAccessPreferenceTest.java    |  19 +---
 .../josm/gui/util/WindowGeometryTest.java     |  52 ++-------
 .../josm/io/CertificateAmendmentTest.java     |  15 +--
 .../josm/io/ChangesetQueryTest.java           |  13 +--
 .../josm/io/DiffResultProcessorTest.java      |  15 +--
 .../josm/io/GeoJSONReaderTest.java            |  14 +--
 .../openstreetmap/josm/io/GpxReaderTest.java  |  19 +---
 .../openstreetmap/josm/io/GpxWriterTest.java  |  15 +--
 .../MultiFetchOverpassObjectReaderTest.java   |  14 +--
 .../josm/io/OsmApiExceptionTest.java          |  14 +--
 .../josm/io/OsmChangeBuilderTest.java         |  15 +--
 .../josm/io/OsmChangeReaderTest.java          |  15 +--
 .../io/OsmChangesetContentParserTest.java     |  14 +--
 .../josm/io/OsmChangesetParserTest.java       |  13 +--
 .../josm/io/OsmJsonReaderTest.java            |  15 +--
 .../openstreetmap/josm/io/OsmReaderTest.java  |  15 +--
 .../openstreetmap/josm/io/OsmWriterTest.java  |  16 +--
 .../josm/io/ParseWithChangesetReaderTest.java |  15 +--
 .../auth/CredentialsAgentExceptionTest.java   |  12 --
 .../io/remotecontrol/AddTagsDialogTest.java   |  13 +--
 .../handler/AddWayHandlerTest.java            |  14 +--
 .../handler/ImageryHandlerTest.java           |  16 +--
 .../handler/LoadAndZoomHandlerTest.java       |  14 +--
 .../handler/LoadObjectHandlerTest.java        |  15 +--
 .../handler/RequestHandlerTest.java           |  13 +--
 .../plugins/PluginDownloadExceptionTest.java  |  12 --
 .../josm/plugins/PluginExceptionTest.java     |  12 --
 .../josm/plugins/PluginHandlerTest.java       |  15 +--
 .../plugins/PluginListParseExceptionTest.java |  12 --
 .../spi/preferences/ListListSettingTest.java  |  13 +--
 .../josm/spi/preferences/ListSettingTest.java |  13 +--
 .../spi/preferences/MapListSettingTest.java   |  13 +--
 .../spi/preferences/StringSettingTest.java    |  13 +--
 .../annotations/AnnotationUtils.java          |  82 ++++++++++++++
 .../annotations/BasicPreferences.java         |  77 +++++++++++++
 .../annotations/FullPreferences.java          |  61 +++++++++++
 .../josm/tools/CheckParameterUtilTest.java    |  14 +--
 .../josm/tools/FontsManagerTest.java          |  14 +--
 .../josm/tools/ImageResizeModeTest.java       |  14 +--
 .../josm/tools/KeyboardUtilsTest.java         |  11 --
 .../tools/ListenableWeakReferenceTest.java    |  10 --
 .../josm/tools/OptionParserTest.java          |  16 +--
 .../josm/tools/OsmUrlToBoundsTest.java        |  15 +--
 .../josm/tools/StreamUtilsTest.java           |  14 +--
 .../josm/tools/Tag2LinkTest.java              |  13 +--
 .../josm/tools/TextTagParserTest.java         |  14 +--
 .../openstreetmap/josm/tools/UtilsTest.java   |  13 +--
 .../josm/tools/XmlUtilsTest.java              |  35 +++---
 .../BugReportExceptionHandlerTest.java        |  11 --
 .../josm/tools/bugreport/BugReportTest.java   |  14 +--
 163 files changed, 800 insertions(+), 1966 deletions(-)
 create mode 100644 test/unit/org/openstreetmap/josm/testutils/annotations/AnnotationUtils.java
 create mode 100644 test/unit/org/openstreetmap/josm/testutils/annotations/BasicPreferences.java
 create mode 100644 test/unit/org/openstreetmap/josm/testutils/annotations/FullPreferences.java

diff --git a/test/unit/org/openstreetmap/josm/actions/ExpertToggleActionTest.java b/test/unit/org/openstreetmap/josm/actions/ExpertToggleActionTest.java
index c6518f066..13f41f103 100644
--- a/test/unit/org/openstreetmap/josm/actions/ExpertToggleActionTest.java
+++ b/test/unit/org/openstreetmap/josm/actions/ExpertToggleActionTest.java
@@ -8,26 +8,19 @@ import java.util.concurrent.atomic.AtomicBoolean;
 
 import javax.swing.JPanel;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.actions.ExpertToggleAction.ExpertModeChangeListener;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Test {@link ExpertToggleAction}
  * @author Michael Zangl
  * @since 11224
  */
+// We need prefs to store expert mode state.
+@BasicPreferences
 class ExpertToggleActionTest {
-    /**
-     * We need prefs to store expert mode state.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Test {@link ExpertToggleAction#addVisibilitySwitcher(java.awt.Component)}
      * and {@link ExpertToggleAction#removeVisibilitySwitcher(java.awt.Component)}
diff --git a/test/unit/org/openstreetmap/josm/command/AddCommandTest.java b/test/unit/org/openstreetmap/josm/command/AddCommandTest.java
index 0ea16321b..526bc57ab 100644
--- a/test/unit/org/openstreetmap/josm/command/AddCommandTest.java
+++ b/test/unit/org/openstreetmap/josm/command/AddCommandTest.java
@@ -6,8 +6,6 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.util.ArrayList;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -17,24 +15,20 @@ import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.User;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
+import org.openstreetmap.josm.testutils.annotations.I18n;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import nl.jqno.equalsverifier.EqualsVerifier;
 import nl.jqno.equalsverifier.Warning;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link AddCommand} class.
  */
+@I18n
+// We need prefs for nodes.
+@BasicPreferences
 class AddCommandTest {
-
-    /**
-     * We need prefs for nodes.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences().i18n();
-
     /**
      * Test if the add command is executed correctly and sets the modified flag.
      */
diff --git a/test/unit/org/openstreetmap/josm/command/AddPrimitivesCommandTest.java b/test/unit/org/openstreetmap/josm/command/AddPrimitivesCommandTest.java
index df9ef62f9..4610aba31 100644
--- a/test/unit/org/openstreetmap/josm/command/AddPrimitivesCommandTest.java
+++ b/test/unit/org/openstreetmap/josm/command/AddPrimitivesCommandTest.java
@@ -11,8 +11,6 @@ import java.util.Arrays;
 import java.util.HashSet;
 import java.util.List;
 
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -24,24 +22,20 @@ import org.openstreetmap.josm.data.osm.User;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.WayData;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
+import org.openstreetmap.josm.testutils.annotations.I18n;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import nl.jqno.equalsverifier.EqualsVerifier;
 import nl.jqno.equalsverifier.Warning;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link AddPrimitivesCommand} class.
  */
+@I18n
+// We need prefs for nodes.
+@BasicPreferences
 class AddPrimitivesCommandTest {
-
-    /**
-     * We need prefs for nodes.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences().i18n();
-
     /**
      * Test if the add command is executed correctly and does not set the modified flag.
      */
diff --git a/test/unit/org/openstreetmap/josm/command/ChangeCommandTest.java b/test/unit/org/openstreetmap/josm/command/ChangeCommandTest.java
index be41fa58b..aaf4a2ac9 100644
--- a/test/unit/org/openstreetmap/josm/command/ChangeCommandTest.java
+++ b/test/unit/org/openstreetmap/josm/command/ChangeCommandTest.java
@@ -4,16 +4,13 @@ package org.openstreetmap.josm.command;
 import static org.junit.jupiter.api.Assertions.assertArrayEquals;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNull;
-import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.util.ArrayList;
 import java.util.Collections;
 import java.util.List;
 
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.command.CommandTest.CommandTestData;
 import org.openstreetmap.josm.data.coor.LatLon;
@@ -25,23 +22,21 @@ import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.User;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
+import org.openstreetmap.josm.testutils.annotations.I18n;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import nl.jqno.equalsverifier.EqualsVerifier;
 import nl.jqno.equalsverifier.Warning;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link ChangeCommand} class.
  */
+@I18n
+// We need prefs for nodes.
+@BasicPreferences
 class ChangeCommandTest {
-
-    /**
-     * We need prefs for nodes.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences().i18n();
     private CommandTestData testData;
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/command/ChangeMembersCommandTest.java b/test/unit/org/openstreetmap/josm/command/ChangeMembersCommandTest.java
index ade6c9a2d..672fa6b5c 100644
--- a/test/unit/org/openstreetmap/josm/command/ChangeMembersCommandTest.java
+++ b/test/unit/org/openstreetmap/josm/command/ChangeMembersCommandTest.java
@@ -7,9 +7,6 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 import java.util.Collections;
 import java.util.List;
 
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.command.CommandTest.CommandTestDataWithRelation;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -18,23 +15,21 @@ import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.User;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
+import org.openstreetmap.josm.testutils.annotations.I18n;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import nl.jqno.equalsverifier.EqualsVerifier;
 import nl.jqno.equalsverifier.Warning;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link ChangeMembersCommand} class.
  */
+@I18n
+// We need prefs for nodes.
+@BasicPreferences
 class ChangeMembersCommandTest {
-
-    /**
-     * We need prefs for nodes.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences().i18n();
     private CommandTestDataWithRelation testData;
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/command/ChangeNodesCommandTest.java b/test/unit/org/openstreetmap/josm/command/ChangeNodesCommandTest.java
index 0cd482a5a..673ef3779 100644
--- a/test/unit/org/openstreetmap/josm/command/ChangeNodesCommandTest.java
+++ b/test/unit/org/openstreetmap/josm/command/ChangeNodesCommandTest.java
@@ -4,17 +4,14 @@ package org.openstreetmap.josm.command;
 import static org.junit.jupiter.api.Assertions.assertArrayEquals;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.command.CommandTest.CommandTestData;
 import org.openstreetmap.josm.data.coor.LatLon;
@@ -24,23 +21,21 @@ import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.User;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
+import org.openstreetmap.josm.testutils.annotations.I18n;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import nl.jqno.equalsverifier.EqualsVerifier;
 import nl.jqno.equalsverifier.Warning;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link ChangeNodesCommand} class.
  */
+@I18n
+// We need prefs for nodes.
+@BasicPreferences
 class ChangeNodesCommandTest {
-
-    /**
-     * We need prefs for nodes.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences().i18n();
     private CommandTestData testData;
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/command/ChangePropertyCommandTest.java b/test/unit/org/openstreetmap/josm/command/ChangePropertyCommandTest.java
index 3ee4de8ae..a9eabd794 100644
--- a/test/unit/org/openstreetmap/josm/command/ChangePropertyCommandTest.java
+++ b/test/unit/org/openstreetmap/josm/command/ChangePropertyCommandTest.java
@@ -13,9 +13,6 @@ import java.util.Collection;
 import java.util.HashMap;
 import java.util.List;
 
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.command.CommandTest.CommandTestData;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -26,23 +23,21 @@ import org.openstreetmap.josm.data.osm.TagMap;
 import org.openstreetmap.josm.data.osm.User;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
+import org.openstreetmap.josm.testutils.annotations.I18n;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import nl.jqno.equalsverifier.EqualsVerifier;
 import nl.jqno.equalsverifier.Warning;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link ChangePropertyCommand} class.
  */
+@I18n
+// We need prefs for nodes.
+@BasicPreferences
 class ChangePropertyCommandTest {
-
-    /**
-     * We need prefs for nodes.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences().i18n();
     private CommandTestData testData;
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/command/ChangePropertyKeyCommandTest.java b/test/unit/org/openstreetmap/josm/command/ChangePropertyKeyCommandTest.java
index d5be8e9e2..876fc2031 100644
--- a/test/unit/org/openstreetmap/josm/command/ChangePropertyKeyCommandTest.java
+++ b/test/unit/org/openstreetmap/josm/command/ChangePropertyKeyCommandTest.java
@@ -10,9 +10,6 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.Collection;
 
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.command.CommandTest.CommandTestData;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -20,23 +17,21 @@ import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.User;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
+import org.openstreetmap.josm.testutils.annotations.I18n;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import nl.jqno.equalsverifier.EqualsVerifier;
 import nl.jqno.equalsverifier.Warning;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link ChangePropertyKeyCommand} class.
  */
+@I18n
+// We need prefs for nodes.
+@BasicPreferences
 class ChangePropertyKeyCommandTest {
-
-    /**
-     * We need prefs for nodes.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences().i18n();
     private CommandTestData testData;
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/command/ChangeRelationMemberRoleCommandTest.java b/test/unit/org/openstreetmap/josm/command/ChangeRelationMemberRoleCommandTest.java
index 1bd3066bc..80a792153 100644
--- a/test/unit/org/openstreetmap/josm/command/ChangeRelationMemberRoleCommandTest.java
+++ b/test/unit/org/openstreetmap/josm/command/ChangeRelationMemberRoleCommandTest.java
@@ -9,9 +9,6 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.util.ArrayList;
 
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.command.CommandTest.CommandTestDataWithRelation;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -19,23 +16,21 @@ import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.User;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
+import org.openstreetmap.josm.testutils.annotations.I18n;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import nl.jqno.equalsverifier.EqualsVerifier;
 import nl.jqno.equalsverifier.Warning;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link ChangeRelationMemberRoleCommand} class.
  */
+@I18n
+// We need prefs for nodes.
+@BasicPreferences
 class ChangeRelationMemberRoleCommandTest {
-
-    /**
-     * We need prefs for nodes.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences().i18n();
     private CommandTestDataWithRelation testData;
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/command/CommandTest.java b/test/unit/org/openstreetmap/josm/command/CommandTest.java
index 30986bebc..302b81953 100644
--- a/test/unit/org/openstreetmap/josm/command/CommandTest.java
+++ b/test/unit/org/openstreetmap/josm/command/CommandTest.java
@@ -3,8 +3,6 @@ package org.openstreetmap.josm.command;
 
 import java.util.Arrays;
 
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -15,24 +13,20 @@ import org.openstreetmap.josm.data.osm.User;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
+import org.openstreetmap.josm.testutils.annotations.I18n;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import nl.jqno.equalsverifier.EqualsVerifier;
 import nl.jqno.equalsverifier.Warning;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link Command} class.
  */
+@I18n
+// We need prefs for nodes / data sets.
+@BasicPreferences
 public class CommandTest {
-
-    /**
-     * We need prefs for nodes / data sets.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences().i18n();
-
     /**
      * Unit test of methods {@link Command#equals} and {@link Command#hashCode}.
      */
diff --git a/test/unit/org/openstreetmap/josm/command/DeleteCommandTest.java b/test/unit/org/openstreetmap/josm/command/DeleteCommandTest.java
index 448e65556..02e541e7a 100644
--- a/test/unit/org/openstreetmap/josm/command/DeleteCommandTest.java
+++ b/test/unit/org/openstreetmap/josm/command/DeleteCommandTest.java
@@ -4,8 +4,8 @@ package org.openstreetmap.josm.command;
 import static org.junit.jupiter.api.Assertions.assertArrayEquals;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -13,9 +13,6 @@ import java.util.Collection;
 import java.util.List;
 import java.util.NoSuchElementException;
 
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.command.CommandTest.CommandTestDataWithRelation;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -26,23 +23,21 @@ import org.openstreetmap.josm.data.osm.User;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.data.osm.WaySegment;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
+import org.openstreetmap.josm.testutils.annotations.I18n;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import nl.jqno.equalsverifier.EqualsVerifier;
 import nl.jqno.equalsverifier.Warning;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link DeleteCommand} class.
  */
+// We need prefs for nodes.
+@BasicPreferences
+@I18n
 class DeleteCommandTest {
-
-    /**
-     * We need prefs for nodes.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences().i18n();
     private CommandTestDataWithRelation testData;
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/command/PurgeCommandTest.java b/test/unit/org/openstreetmap/josm/command/PurgeCommandTest.java
index 86a6df45e..2d65a6368 100644
--- a/test/unit/org/openstreetmap/josm/command/PurgeCommandTest.java
+++ b/test/unit/org/openstreetmap/josm/command/PurgeCommandTest.java
@@ -12,9 +12,6 @@ import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.command.CommandTest.CommandTestDataWithRelation;
 import org.openstreetmap.josm.data.conflict.Conflict;
@@ -27,22 +24,19 @@ import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Storage;
 import org.openstreetmap.josm.data.osm.User;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import nl.jqno.equalsverifier.EqualsVerifier;
 import nl.jqno.equalsverifier.Warning;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link PurgeCommand} class.
  */
+// We need prefs for nodes.
+@BasicPreferences
 class PurgeCommandTest {
-    /**
-     * We need prefs for nodes.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
     private CommandTestDataWithRelation testData;
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/command/RemoveNodesCommandTest.java b/test/unit/org/openstreetmap/josm/command/RemoveNodesCommandTest.java
index dc8662c33..4dacadcbe 100644
--- a/test/unit/org/openstreetmap/josm/command/RemoveNodesCommandTest.java
+++ b/test/unit/org/openstreetmap/josm/command/RemoveNodesCommandTest.java
@@ -8,9 +8,6 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 import java.util.ArrayList;
 import java.util.Collections;
 
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.command.CommandTest.CommandTestDataWithRelation;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -18,23 +15,19 @@ import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.User;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import nl.jqno.equalsverifier.EqualsVerifier;
 import nl.jqno.equalsverifier.Warning;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link RemoveNodesCommand} class.
  */
+// We need prefs for nodes.
+@BasicPreferences
 class RemoveNodesCommandTest {
-
-    /**
-     * We need prefs for nodes.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
     private CommandTestDataWithRelation testData;
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/command/SelectCommandTest.java b/test/unit/org/openstreetmap/josm/command/SelectCommandTest.java
index 8304ea28e..c61e85892 100644
--- a/test/unit/org/openstreetmap/josm/command/SelectCommandTest.java
+++ b/test/unit/org/openstreetmap/josm/command/SelectCommandTest.java
@@ -3,39 +3,32 @@ package org.openstreetmap.josm.command;
 
 import static org.junit.jupiter.api.Assertions.assertArrayEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.util.ArrayList;
 import java.util.Arrays;
 import java.util.List;
 
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.command.CommandTest.CommandTestDataWithRelation;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.User;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import nl.jqno.equalsverifier.EqualsVerifier;
 import nl.jqno.equalsverifier.Warning;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link SelectCommand} class.
  */
+// We need prefs for nodes.
+@BasicPreferences
 class SelectCommandTest {
-
-    /**
-     * We need prefs for nodes.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
     private CommandTestDataWithRelation testData;
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/command/SequenceCommandTest.java b/test/unit/org/openstreetmap/josm/command/SequenceCommandTest.java
index 7945c60fb..71b7941ff 100644
--- a/test/unit/org/openstreetmap/josm/command/SequenceCommandTest.java
+++ b/test/unit/org/openstreetmap/josm/command/SequenceCommandTest.java
@@ -18,9 +18,6 @@ import java.util.Arrays;
 import java.util.Collection;
 import java.util.Collections;
 
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.command.CommandTest.CommandTestDataWithRelation;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -28,24 +25,20 @@ import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.User;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 import org.openstreetmap.josm.tools.bugreport.ReportedException;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import nl.jqno.equalsverifier.EqualsVerifier;
 import nl.jqno.equalsverifier.Warning;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link SequenceCommand} class.
  */
+// We need prefs for nodes.
+@BasicPreferences
 class SequenceCommandTest {
-
-    /**
-     * We need prefs for nodes.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
     private CommandTestDataWithRelation testData;
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/data/PreferencesUtilsTest.java b/test/unit/org/openstreetmap/josm/data/PreferencesUtilsTest.java
index dc2b77b2e..4066a13ab 100644
--- a/test/unit/org/openstreetmap/josm/data/PreferencesUtilsTest.java
+++ b/test/unit/org/openstreetmap/josm/data/PreferencesUtilsTest.java
@@ -3,26 +3,17 @@ package org.openstreetmap.josm.data;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import net.trajano.commons.testing.UtilityClassTestUtil;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests for class {@link PreferencesUtils}.
  */
+@BasicPreferences
 class PreferencesUtilsTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Setup test.
      */
diff --git a/test/unit/org/openstreetmap/josm/data/UserIdentityManagerTest.java b/test/unit/org/openstreetmap/josm/data/UserIdentityManagerTest.java
index 538575877..4bb4d5fd3 100644
--- a/test/unit/org/openstreetmap/josm/data/UserIdentityManagerTest.java
+++ b/test/unit/org/openstreetmap/josm/data/UserIdentityManagerTest.java
@@ -6,30 +6,29 @@ import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertSame;
-import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import java.util.function.Function;
+import java.util.stream.Stream;
 
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.data.osm.User;
 import org.openstreetmap.josm.data.osm.UserInfo;
 import org.openstreetmap.josm.spi.preferences.Config;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.Arguments;
+import org.junit.jupiter.params.provider.MethodSource;
 
 /**
  * Unit tests of {@link UserIdentityManager} class.
  */
+@BasicPreferences
 class UserIdentityManagerTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     private static UserInfo newUserInfo() {
         return newUserInfo(1, "a description");
     }
@@ -179,36 +178,26 @@ class UserIdentityManagerTest {
         assertThrows(IllegalArgumentException.class, () -> UserIdentityManager.getInstance().setFullyIdentified("test", null));
     }
 
-    /**
-     * Preferences include neither an url nor a user name => we have an anonymous user
-     */
-    @Test
-    void testInitFromPreferences1() {
-        UserIdentityManager im = UserIdentityManager.getInstance();
-
-        // reset it
-        im.setAnonymous();
-
-        // for this test we disable the listener
-        Config.getPref().removePreferenceChangeListener(im);
-
-        try {
-            Config.getPref().put("osm-server.url", null);
-            Config.getPref().put("osm-server.username", null);
-
-            im.initFromPreferences();
-
-            assertTrue(im.isAnonymous());
-        } finally {
-            Config.getPref().addPreferenceChangeListener(im);
-        }
+    static Stream<Arguments> testInitFromPreferences() {
+        return Stream.of(
+          Arguments.of((Function<UserIdentityManager, Boolean>) UserIdentityManager::isAnonymous,
+            new String[] {"osm-server.url", null, "osm-server.username", null},
+            "Preferences include neither an url nor a user name => we have an anonymous user"),
+          Arguments.of((Function<UserIdentityManager, Boolean>) UserIdentityManager::isAnonymous,
+            new String[] {"osm-server.url", "http://api.openstreetmap.org", "osm-server.username", null},
+            "Preferences include neither an url nor a user name => we have an anonymous user"),
+          Arguments.of((Function<UserIdentityManager, Boolean>) UserIdentityManager::isPartiallyIdentified,
+            new String[] {"osm-server.url", "http://api.openstreetmap.org", "osm-server.username", "test"},
+            "Preferences include an user name => we have a partially identified user")
+        );
     }
 
-    /**
-     * Preferences include neither an url nor a user name => we have an anonymous user
-     */
-    @Test
-    void testInitFromPreferences2() {
+    @ParameterizedTest
+    @MethodSource
+    void testInitFromPreferences(Function<UserIdentityManager, Boolean> verifier, String[] config, String failureMessage) {
+        if (config.length % 2 != 0) {
+            fail("The arguments must be paired");
+        }
         UserIdentityManager im = UserIdentityManager.getInstance();
 
         // reset it
@@ -218,37 +207,13 @@ class UserIdentityManagerTest {
         Config.getPref().removePreferenceChangeListener(im);
 
         try {
-            Config.getPref().put("osm-server.url", "http://api.openstreetmap.org");
-            Config.getPref().put("osm-server.username", null);
-
-            im.initFromPreferences();
-
-            assertTrue(im.isAnonymous());
-        } finally {
-            Config.getPref().addPreferenceChangeListener(im);
-        }
-    }
-
-    /**
-     * Preferences include an user name => we have a partially identified user
-     */
-    @Test
-    void testInitFromPreferences3() {
-        UserIdentityManager im = UserIdentityManager.getInstance();
-
-        // for this test we disable the listener
-        Config.getPref().removePreferenceChangeListener(im);
-
-        try {
-            // reset it
-            im.setAnonymous();
-
-            Config.getPref().put("osm-server.url", "http://api.openstreetmap.org");
-            Config.getPref().put("osm-server.username", "test");
+            for (int i = 0; i < config.length / 2; i++) {
+                Config.getPref().put(config[2 * i], config[2 * i + 1]);
+            }
 
             im.initFromPreferences();
 
-            assertTrue(im.isPartiallyIdentified());
+            assertTrue(verifier.apply(im), failureMessage);
         } finally {
             Config.getPref().addPreferenceChangeListener(im);
         }
@@ -258,6 +223,8 @@ class UserIdentityManagerTest {
      * Preferences include an user name which is different from the current
      * user name and we are currently fully identifed => josm user becomes
      * partially identified
+     *
+     * Note: Test #4 since the other three are parameterized
      */
     @Test
     void testInitFromPreferences4() {
diff --git a/test/unit/org/openstreetmap/josm/data/cache/JCSCacheManagerTest.java b/test/unit/org/openstreetmap/josm/data/cache/JCSCacheManagerTest.java
index 4157a945a..b07c2d483 100644
--- a/test/unit/org/openstreetmap/josm/data/cache/JCSCacheManagerTest.java
+++ b/test/unit/org/openstreetmap/josm/data/cache/JCSCacheManagerTest.java
@@ -8,27 +8,20 @@ import java.io.FileOutputStream;
 import java.io.IOException;
 import java.util.logging.Logger;
 
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
+
+import net.trajano.commons.testing.UtilityClassTestUtil;
 import org.apache.commons.jcs3.access.CacheAccess;
 import org.apache.commons.jcs3.auxiliary.disk.block.BlockDiskCacheAttributes;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-import net.trajano.commons.testing.UtilityClassTestUtil;
+import org.junit.jupiter.api.Timeout;
 
 /**
  * Unit tests for class {@link JCSCacheManager}.
  */
+@Timeout(20)
+@BasicPreferences
 class JCSCacheManagerTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences().timeout(20000);
-
     /**
      * Tests that {@code JCSCacheManager} satisfies utility class criteria.
      * @throws ReflectiveOperationException if an error occurs
diff --git a/test/unit/org/openstreetmap/josm/data/osm/TagCollectionTest.java b/test/unit/org/openstreetmap/josm/data/osm/TagCollectionTest.java
index 1d82e2e80..759bd5093 100644
--- a/test/unit/org/openstreetmap/josm/data/osm/TagCollectionTest.java
+++ b/test/unit/org/openstreetmap/josm/data/osm/TagCollectionTest.java
@@ -16,16 +16,16 @@ import java.util.Set;
 import java.util.stream.Collectors;
 import java.util.stream.Stream;
 
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Tests of {@link TagCollection}.
  * @author Michael Zangl
  */
+// We need prefs for using primitives
+@BasicPreferences
 class TagCollectionTest {
     private final Tag tagA = new Tag("k", "v");
     private final Tag tagB = new Tag("k", "b");
@@ -35,13 +35,6 @@ class TagCollectionTest {
     private final Tag tagNullKey = new Tag(null, "b");
     private final Tag tagNullValue = new Tag("k2", null);
 
-    /**
-     * We need prefs for using primitives
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     private void assertTagCounts(TagCollection collection, int a, int b, int c, int d) {
         assertEquals(a, collection.getTagOccurrence(tagA));
         assertEquals(b, collection.getTagOccurrence(tagB));
diff --git a/test/unit/org/openstreetmap/josm/data/osm/event/SelectionEventManagerTest.java b/test/unit/org/openstreetmap/josm/data/osm/event/SelectionEventManagerTest.java
index cbae3921b..96eea98ac 100644
--- a/test/unit/org/openstreetmap/josm/data/osm/event/SelectionEventManagerTest.java
+++ b/test/unit/org/openstreetmap/josm/data/osm/event/SelectionEventManagerTest.java
@@ -8,22 +8,21 @@ import java.util.Collection;
 import java.util.HashSet;
 import java.util.List;
 
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.command.CommandTest.CommandTestDataWithRelation;
 import org.openstreetmap.josm.data.osm.DataSelectionListener;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.util.GuiHelper;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Tests the {@link SelectionEventManager}
  * @author Michael Zangl
  * @since 12048
  */
+@BasicPreferences
 class SelectionEventManagerTest {
     private final class SelectionListener implements DataSelectionListener {
         private Collection<? extends OsmPrimitive> newSelection;
@@ -39,12 +38,6 @@ class SelectionEventManagerTest {
         }
     }
 
-    /**
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Tests that events in the active layer are propagated.
      */
diff --git a/test/unit/org/openstreetmap/josm/data/osm/search/SearchCompilerTest.java b/test/unit/org/openstreetmap/josm/data/osm/search/SearchCompilerTest.java
index b8f4f2a73..9545c88cd 100644
--- a/test/unit/org/openstreetmap/josm/data/osm/search/SearchCompilerTest.java
+++ b/test/unit/org/openstreetmap/josm/data/osm/search/SearchCompilerTest.java
@@ -18,9 +18,6 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.Set;
 
-import org.junit.Assert;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -42,25 +39,22 @@ import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetMenu;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetType;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets;
 import org.openstreetmap.josm.gui.tagging.presets.items.Key;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 import org.openstreetmap.josm.tools.Logging;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import nl.jqno.equalsverifier.EqualsVerifier;
 import nl.jqno.equalsverifier.Warning;
+import org.junit.Assert;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.Timeout;
 
 /**
  * Unit tests for class {@link SearchCompiler}.
  */
+// We need prefs for this. We access preferences when creating OSM primitives
+@BasicPreferences
+@Timeout(30)
 class SearchCompilerTest {
-
-    /**
-     * We need prefs for this. We access preferences when creating OSM primitives.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences().timeout(30000);
-
     private static final class SearchContext {
         final DataSet ds = new DataSet();
         final Node n1 = new Node(LatLon.ZERO);
diff --git a/test/unit/org/openstreetmap/josm/data/preferences/NamedColorPropertyTest.java b/test/unit/org/openstreetmap/josm/data/preferences/NamedColorPropertyTest.java
index bba3ef891..23418b471 100644
--- a/test/unit/org/openstreetmap/josm/data/preferences/NamedColorPropertyTest.java
+++ b/test/unit/org/openstreetmap/josm/data/preferences/NamedColorPropertyTest.java
@@ -10,26 +10,20 @@ import java.util.Collections;
 
 import javax.swing.UIManager;
 
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.data.Preferences;
 import org.openstreetmap.josm.spi.preferences.Config;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 /**
  * Test {@link NamedColorProperty}
  * @author Michael Zangl
  */
+// This is a preference test
+@BasicPreferences
 class NamedColorPropertyTest {
-    /**
-     * This is a preference test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
     private NamedColorProperty base;
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/data/preferences/PreferencesWriterTest.java b/test/unit/org/openstreetmap/josm/data/preferences/PreferencesWriterTest.java
index e9a56df73..b9bb49fae 100644
--- a/test/unit/org/openstreetmap/josm/data/preferences/PreferencesWriterTest.java
+++ b/test/unit/org/openstreetmap/josm/data/preferences/PreferencesWriterTest.java
@@ -12,18 +12,22 @@ import java.util.Map;
 import java.util.SortedMap;
 import java.util.TreeMap;
 
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.Version;
-import org.openstreetmap.josm.spi.preferences.Setting;
+import org.openstreetmap.josm.spi.preferences.AbstractSetting;
 import org.openstreetmap.josm.spi.preferences.ListListSetting;
 import org.openstreetmap.josm.spi.preferences.ListSetting;
-import org.openstreetmap.josm.spi.preferences.AbstractSetting;
-import org.openstreetmap.josm.spi.preferences.StringSetting;
 import org.openstreetmap.josm.spi.preferences.MapListSetting;
+import org.openstreetmap.josm.spi.preferences.Setting;
+import org.openstreetmap.josm.spi.preferences.StringSetting;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
+
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests for class {@link PreferencesWriter}.
  */
+// This is a preference test
+@BasicPreferences
 class PreferencesWriterTest {
 
     private static <T extends AbstractSetting<?>> T setting(T s, long time) {
diff --git a/test/unit/org/openstreetmap/josm/data/preferences/StrokePropertyTest.java b/test/unit/org/openstreetmap/josm/data/preferences/StrokePropertyTest.java
index 65eaab5d3..d4f81bfe1 100644
--- a/test/unit/org/openstreetmap/josm/data/preferences/StrokePropertyTest.java
+++ b/test/unit/org/openstreetmap/josm/data/preferences/StrokePropertyTest.java
@@ -6,25 +6,18 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.awt.BasicStroke;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.spi.preferences.Config;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Test {@link StrokeProperty}
  * @author Michael Zangl
  */
+// This is a preference test
+@BasicPreferences
 class StrokePropertyTest {
-    /**
-     * This is a preference test
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Test {@link StrokeProperty#get()}
      */
diff --git a/test/unit/org/openstreetmap/josm/data/projection/CustomProjectionTest.java b/test/unit/org/openstreetmap/josm/data/projection/CustomProjectionTest.java
index b2966474b..1b8ae7654 100644
--- a/test/unit/org/openstreetmap/josm/data/projection/CustomProjectionTest.java
+++ b/test/unit/org/openstreetmap/josm/data/projection/CustomProjectionTest.java
@@ -7,26 +7,19 @@ import static org.junit.jupiter.api.Assertions.fail;
 
 import java.util.stream.Stream;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.projection.CustomProjection.Polarity;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Tests for {@link CustomProjection}.
  * @author Michael Zangl
  */
+// Need pref to load pref
+@BasicPreferences
 class CustomProjectionTest {
-    /**
-     * Need pref to load pref.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Test {@link CustomProjection#parseAngle(String, String)}
      * @throws ProjectionConfigurationException in case of error
diff --git a/test/unit/org/openstreetmap/josm/data/protobuf/ProtobufTest.java b/test/unit/org/openstreetmap/josm/data/protobuf/ProtobufTest.java
index 21f610f36..0844c6ebd 100644
--- a/test/unit/org/openstreetmap/josm/data/protobuf/ProtobufTest.java
+++ b/test/unit/org/openstreetmap/josm/data/protobuf/ProtobufTest.java
@@ -31,10 +31,9 @@ import org.openstreetmap.josm.data.vector.VectorDataSet;
 import org.openstreetmap.josm.data.vector.VectorNode;
 import org.openstreetmap.josm.data.vector.VectorWay;
 import org.openstreetmap.josm.io.Compression;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 
 /**
  * Test class for {@link ProtobufParser} and {@link ProtobufRecord}
@@ -59,9 +58,6 @@ class ProtobufTest {
         return byteArray;
     }
 
-    @RegisterExtension
-    JOSMTestRules josmTestRules = new JOSMTestRules().preferences();
-
     private Number bytesToVarInt(int... bytes) {
         byte[] byteArray = new byte[bytes.length];
         for (int i = 0; i < bytes.length; i++) {
@@ -107,6 +103,7 @@ class ProtobufTest {
         assertEquals(0, Integer.parseInt(testSequence.getTags().get("pano")));
     }
 
+    @BasicPreferences
     @Test
     void testRead_17_26028_50060() throws IOException {
         File vectorTile = Paths.get(TestUtils.getTestDataRoot(), "pbf", "openinframap", "17", "26028", "50060.pbf")
diff --git a/test/unit/org/openstreetmap/josm/data/validation/tests/DuplicateRelationTest.java b/test/unit/org/openstreetmap/josm/data/validation/tests/DuplicateRelationTest.java
index e36485922..c6676b105 100644
--- a/test/unit/org/openstreetmap/josm/data/validation/tests/DuplicateRelationTest.java
+++ b/test/unit/org/openstreetmap/josm/data/validation/tests/DuplicateRelationTest.java
@@ -3,8 +3,6 @@ package org.openstreetmap.josm.data.validation.tests;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -12,22 +10,15 @@ import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.validation.TestError;
 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * JUnit Test of "Duplicate relation" validation test.
  */
+@BasicPreferences
 class DuplicateRelationTest {
-
-    /**
-     * Setup test by initializing JOSM preferences and projection.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     static class ExpectedResult {
         final int code;
         final boolean fixable;
diff --git a/test/unit/org/openstreetmap/josm/data/validation/tests/OpeningHourTestTest.java b/test/unit/org/openstreetmap/josm/data/validation/tests/OpeningHourTestTest.java
index 646df05d5..b021ff219 100644
--- a/test/unit/org/openstreetmap/josm/data/validation/tests/OpeningHourTestTest.java
+++ b/test/unit/org/openstreetmap/josm/data/validation/tests/OpeningHourTestTest.java
@@ -16,9 +16,6 @@ import java.util.List;
 import java.util.Locale;
 import java.util.Set;
 
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.command.ChangePropertyCommand;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -31,23 +28,20 @@ import org.openstreetmap.josm.gui.tagging.presets.TaggingPreset;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetItem;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetReader;
 import org.openstreetmap.josm.gui.tagging.presets.items.KeyedItem;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
+import org.openstreetmap.josm.testutils.annotations.I18n;
 import org.openstreetmap.josm.tools.Logging;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 /**
  * JUnit Test of "Opening hours" validation test.
  * @see OpeningHourTest
  */
+@I18n
+@BasicPreferences
 class OpeningHourTestTest {
-    /**
-     * We need preferences for this. We check strings so we need i18n.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences().i18n();
-
     private OpeningHourTest openingHourTest;
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/data/validation/util/EntitiesTest.java b/test/unit/org/openstreetmap/josm/data/validation/util/EntitiesTest.java
index 9efebd1a5..f48f89f6f 100644
--- a/test/unit/org/openstreetmap/josm/data/validation/util/EntitiesTest.java
+++ b/test/unit/org/openstreetmap/josm/data/validation/util/EntitiesTest.java
@@ -1,25 +1,13 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.data.validation.util;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import net.trajano.commons.testing.UtilityClassTestUtil;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests for class {@link Entities}.
  */
 class EntitiesTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     /**
      * Tests that {@code Entities} satisfies utility class criteria.
      * @throws ReflectiveOperationException if an error occurs
diff --git a/test/unit/org/openstreetmap/josm/data/validation/util/MultipleNameVisitorTest.java b/test/unit/org/openstreetmap/josm/data/validation/util/MultipleNameVisitorTest.java
index e12d1e23a..89e4a544b 100644
--- a/test/unit/org/openstreetmap/josm/data/validation/util/MultipleNameVisitorTest.java
+++ b/test/unit/org/openstreetmap/josm/data/validation/util/MultipleNameVisitorTest.java
@@ -5,26 +5,17 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.util.Arrays;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests for class {@link MultipleNameVisitor}.
  */
+@BasicPreferences
 class MultipleNameVisitorTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Non-regression test for bug #11967.
      */
diff --git a/test/unit/org/openstreetmap/josm/data/vector/VectorRelationTest.java b/test/unit/org/openstreetmap/josm/data/vector/VectorRelationTest.java
index 57a724dad..2367dbe35 100644
--- a/test/unit/org/openstreetmap/josm/data/vector/VectorRelationTest.java
+++ b/test/unit/org/openstreetmap/josm/data/vector/VectorRelationTest.java
@@ -1,27 +1,25 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.data.vector;
 
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import java.util.Arrays;
-
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertSame;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
+import java.util.Arrays;
+
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
+
+import org.junit.jupiter.api.Test;
+
 /**
  * Test class for {@link VectorRelation}
  * @author Taylor Smock
  * @since 17862
  */
+@BasicPreferences
 class VectorRelationTest {
-    @RegisterExtension
-    JOSMTestRules rule = new JOSMTestRules();
-
     @Test
     void testMembers() {
         VectorNode node1 = new VectorNode("test");
diff --git a/test/unit/org/openstreetmap/josm/data/vector/VectorWayTest.java b/test/unit/org/openstreetmap/josm/data/vector/VectorWayTest.java
index 508fb4a24..2dbf5f6cb 100644
--- a/test/unit/org/openstreetmap/josm/data/vector/VectorWayTest.java
+++ b/test/unit/org/openstreetmap/josm/data/vector/VectorWayTest.java
@@ -1,7 +1,18 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.data.vector;
 
-import org.junit.jupiter.api.Test;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertFalse;
+import static org.junit.jupiter.api.Assertions.assertNull;
+import static org.junit.jupiter.api.Assertions.assertSame;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.Collections;
+import java.util.List;
+
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.BBox;
 import org.openstreetmap.josm.data.osm.INode;
@@ -9,18 +20,9 @@ import org.openstreetmap.josm.data.osm.IRelation;
 import org.openstreetmap.josm.data.osm.IWay;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.data.osm.visitor.PrimitiveVisitor;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import java.util.ArrayList;
-import java.util.Arrays;
-import java.util.Collections;
-import java.util.List;
-
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertNull;
-import static org.junit.jupiter.api.Assertions.assertSame;
-import static org.junit.jupiter.api.Assertions.assertTrue;
-import static org.junit.jupiter.api.Assertions.fail;
+import org.junit.jupiter.api.Test;
 
 /**
  * Test class for {@link VectorWay}
@@ -49,6 +51,7 @@ class VectorWayTest {
     }
 
     @Test
+    @BasicPreferences
     void testNodes() {
         VectorNode node1 = new VectorNode("test");
         VectorNode node2 = new VectorNode("test");
diff --git a/test/unit/org/openstreetmap/josm/gui/autofilter/AutoFilterRuleTest.java b/test/unit/org/openstreetmap/josm/gui/autofilter/AutoFilterRuleTest.java
index 52b0b790d..d68b4bcae 100644
--- a/test/unit/org/openstreetmap/josm/gui/autofilter/AutoFilterRuleTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/autofilter/AutoFilterRuleTest.java
@@ -8,26 +8,19 @@ import java.util.NoSuchElementException;
 import java.util.stream.Collectors;
 import java.util.stream.IntStream;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmUtils;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
+import org.openstreetmap.josm.testutils.annotations.I18n;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link AutoFilterRule} class.
  */
+@BasicPreferences
+@I18n
 class AutoFilterRuleTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().i18n();
-
     /**
      * Unit test of {@link AutoFilterRule#getTagValuesForPrimitive}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/bbox/SizeButtonTest.java b/test/unit/org/openstreetmap/josm/gui/bbox/SizeButtonTest.java
index f0105178b..b54306338 100644
--- a/test/unit/org/openstreetmap/josm/gui/bbox/SizeButtonTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/bbox/SizeButtonTest.java
@@ -5,26 +5,17 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.gui.bbox.SizeButton.AccessibleSizeButton;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link SizeButton} class.
  */
+@BasicPreferences
 class SizeButtonTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link SizeButton#SizeButton}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/bugreport/BugReportSettingsPanelTest.java b/test/unit/org/openstreetmap/josm/gui/bugreport/BugReportSettingsPanelTest.java
index 755a05c20..d11ae1d79 100644
--- a/test/unit/org/openstreetmap/josm/gui/bugreport/BugReportSettingsPanelTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/bugreport/BugReportSettingsPanelTest.java
@@ -3,25 +3,14 @@ package org.openstreetmap.josm.gui.bugreport;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
 import org.openstreetmap.josm.tools.bugreport.BugReport;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Tests the {@link BugReportSettingsPanel} class.
  */
 class BugReportSettingsPanelTest {
-
-    /**
-     * Setup test
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     /**
      * Test {@link BugReportSettingsPanel}
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/bugreport/DebugTextDisplayTest.java b/test/unit/org/openstreetmap/josm/gui/bugreport/DebugTextDisplayTest.java
index 3d97f6a02..302363a31 100644
--- a/test/unit/org/openstreetmap/josm/gui/bugreport/DebugTextDisplayTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/bugreport/DebugTextDisplayTest.java
@@ -3,24 +3,16 @@ package org.openstreetmap.josm.gui.bugreport;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.gui.datatransfer.ClipboardUtils;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit test of {@link DebugTextDisplay} class.
  */
+@BasicPreferences
 class DebugTextDisplayTest {
-    /**
-     * Setup test
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Test {@link DebugTextDisplay#getCodeText}
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/conflict/pair/ConflictResolverTest.java b/test/unit/org/openstreetmap/josm/gui/conflict/pair/ConflictResolverTest.java
index 2b663acb5..017c77c07 100644
--- a/test/unit/org/openstreetmap/josm/gui/conflict/pair/ConflictResolverTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/conflict/pair/ConflictResolverTest.java
@@ -6,8 +6,6 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.util.NoSuchElementException;
 
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.command.SequenceCommand;
 import org.openstreetmap.josm.data.conflict.Conflict;
 import org.openstreetmap.josm.data.coor.LatLon;
@@ -15,22 +13,15 @@ import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link ConflictResolver} class.
  */
+@BasicPreferences
 class ConflictResolverTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link ConflictResolver#buildResolveCommand} - empty case.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMergeModelTest.java b/test/unit/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMergeModelTest.java
index 68f130aa0..3e885f138 100644
--- a/test/unit/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMergeModelTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMergeModelTest.java
@@ -1,10 +1,10 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.gui.conflict.pair.nodes;
 
-import static org.junit.jupiter.api.Assertions.fail;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
+import static org.junit.jupiter.api.Assertions.fail;
 
 import java.beans.PropertyChangeEvent;
 import java.beans.PropertyChangeListener;
@@ -18,33 +18,25 @@ import java.util.Set;
 
 import javax.swing.DefaultListSelectionModel;
 
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.conflict.pair.AbstractListMergeModel;
 import org.openstreetmap.josm.testutils.DatasetFactory;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 import org.openstreetmap.josm.tools.Logging;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link NodeListMergeModel}.
  */
+// Needed to due to OSM primitive dependencies
+@BasicPreferences
 class NodeListMergeModelTest {
-
     private final DatasetFactory my = new DatasetFactory();
     private final DatasetFactory their = new DatasetFactory();
 
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     @SuppressWarnings("unchecked")
     protected List<Node> inspectNodeList(NodeListMergeModel model, String name) {
         try {
diff --git a/test/unit/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMergerTest.java b/test/unit/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMergerTest.java
index 04445952b..353192466 100644
--- a/test/unit/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMergerTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMergerTest.java
@@ -3,24 +3,15 @@ package org.openstreetmap.josm.gui.conflict.pair.nodes;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link NodeListMerger} class.
  */
+@BasicPreferences
 class NodeListMergerTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link NodeListMerger#NodeListMerger}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergeModelTest.java b/test/unit/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergeModelTest.java
index 8e550f60a..d148716a2 100644
--- a/test/unit/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergeModelTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergeModelTest.java
@@ -8,9 +8,6 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 import javax.swing.event.ChangeEvent;
 import javax.swing.event.ChangeListener;
 
-import org.junit.jupiter.api.BeforeEach;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.data.conflict.Conflict;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -19,13 +16,16 @@ import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.conflict.pair.MergeDecisionType;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.BeforeEach;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link PropertiesMergeModel}.
  */
+// Needed to due to OSM primitive dependencies
+@BasicPreferences
 class PropertiesMergeModelTest {
 
     private abstract static class TestChangeListener implements ChangeListener {
@@ -46,18 +46,11 @@ class PropertiesMergeModelTest {
 
     PropertiesMergeModel model;
 
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     /**
      * Setup test.
      */
     @BeforeEach
-    public void setUp() {
+    void setUp() {
         model = new PropertiesMergeModel();
     }
 
diff --git a/test/unit/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergerTest.java b/test/unit/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergerTest.java
index 7df01ce16..743f3c129 100644
--- a/test/unit/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergerTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergerTest.java
@@ -3,25 +3,16 @@ package org.openstreetmap.josm.gui.conflict.pair.properties;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.TestUtils;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link PropertiesMerger} class.
  */
+@BasicPreferences
 class PropertiesMergerTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link PropertiesMerger#PropertiesMerger}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberMergerTest.java b/test/unit/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberMergerTest.java
index f97effb2e..4a1167e0b 100644
--- a/test/unit/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberMergerTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberMergerTest.java
@@ -3,24 +3,15 @@ package org.openstreetmap.josm.gui.conflict.pair.relation;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link RelationMemberMerger} class.
  */
+@BasicPreferences
 class RelationMemberMergerTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link RelationMemberMerger#RelationMemberMerger}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberTableCellEditorTest.java b/test/unit/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberTableCellEditorTest.java
index f064d6b39..d6db80f39 100644
--- a/test/unit/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberTableCellEditorTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberTableCellEditorTest.java
@@ -7,26 +7,17 @@ import static org.junit.jupiter.api.Assertions.assertNull;
 
 import java.awt.Component;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.RelationMember;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link RelationMemberTableCellEditor} class.
  */
+@BasicPreferences
 class RelationMemberTableCellEditorTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link RelationMemberTableCellEditor#RelationMemberTableCellEditor}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberTableCellRendererTest.java b/test/unit/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberTableCellRendererTest.java
index 408eb2ec4..988ea6f07 100644
--- a/test/unit/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberTableCellRendererTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberTableCellRendererTest.java
@@ -5,28 +5,19 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import javax.swing.JTable;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.gui.conflict.pair.ListRole;
 import org.openstreetmap.josm.gui.conflict.pair.nodes.NodeListMergeModel;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link RelationMemberTableCellRenderer} class.
  */
+@BasicPreferences
 class RelationMemberTableCellRendererTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link RelationMemberTableCellRenderer#RelationMemberTableCellRenderer}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergeItemTest.java b/test/unit/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergeItemTest.java
index 9d7c80066..6d848e410 100644
--- a/test/unit/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergeItemTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergeItemTest.java
@@ -5,27 +5,19 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.fail;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.gui.conflict.pair.MergeDecisionType;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 import org.openstreetmap.josm.tools.Logging;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link TagMergeItem} class.
  */
+// Needed to due to OSM primitive dependencies
+@BasicPreferences
 class TagMergeItemTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     @Test
     void testTagMergeItem() {
         TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
diff --git a/test/unit/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergeModelTest.java b/test/unit/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergeModelTest.java
index dbbb3c6d0..54ff26515 100644
--- a/test/unit/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergeModelTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergeModelTest.java
@@ -8,28 +8,20 @@ import java.beans.PropertyChangeListener;
 import java.util.List;
 import java.util.Set;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.gui.conflict.pair.MergeDecisionType;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link TagMergeModel} class.
  */
 @SuppressWarnings("unchecked")
+// Needed to due to OSM primitive dependencies
+@BasicPreferences
 class TagMergeModelTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     protected Set<PropertyChangeListener> getListeners(TagMergeModel model) throws ReflectiveOperationException {
         return (Set<PropertyChangeListener>) TestUtils.getPrivateField(model, "listeners");
     }
diff --git a/test/unit/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergerTest.java b/test/unit/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergerTest.java
index eb74174ad..5db9db9f6 100644
--- a/test/unit/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergerTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergerTest.java
@@ -3,24 +3,15 @@ package org.openstreetmap.josm.gui.conflict.pair.tags;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link TagMerger} class.
  */
+@BasicPreferences
 class TagMergerTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link TagMerger#TagMerger}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/conflict/tags/MultiValueCellEditorTest.java b/test/unit/org/openstreetmap/josm/gui/conflict/tags/MultiValueCellEditorTest.java
index 0b42626bd..8309ff5d0 100644
--- a/test/unit/org/openstreetmap/josm/gui/conflict/tags/MultiValueCellEditorTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/conflict/tags/MultiValueCellEditorTest.java
@@ -3,24 +3,12 @@ package org.openstreetmap.josm.gui.conflict.tags;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
  * Unit tests of {@link MultiValueCellEditor} class.
  */
 class MultiValueCellEditorTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     /**
      * Unit test of {@link MultiValueCellEditor#MultiValueCellEditor}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/conflict/tags/MultiValueCellRendererTest.java b/test/unit/org/openstreetmap/josm/gui/conflict/tags/MultiValueCellRendererTest.java
index 534a3a679..34aaee285 100644
--- a/test/unit/org/openstreetmap/josm/gui/conflict/tags/MultiValueCellRendererTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/conflict/tags/MultiValueCellRendererTest.java
@@ -9,26 +9,17 @@ import java.util.Collections;
 
 import javax.swing.JTable;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.osm.Tag;
 import org.openstreetmap.josm.data.osm.TagCollection;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link MultiValueCellRenderer} class.
  */
+@BasicPreferences
 class MultiValueCellRendererTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link MultiValueCellRenderer#MultiValueCellRenderer}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/conflict/tags/PasteTagsConflictResolverDialogTest.java b/test/unit/org/openstreetmap/josm/gui/conflict/tags/PasteTagsConflictResolverDialogTest.java
index f915d1b20..a38e8a67a 100644
--- a/test/unit/org/openstreetmap/josm/gui/conflict/tags/PasteTagsConflictResolverDialogTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/conflict/tags/PasteTagsConflictResolverDialogTest.java
@@ -8,28 +8,20 @@ import static org.junit.jupiter.api.Assertions.assertNull;
 
 import java.awt.Insets;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.gui.conflict.tags.PasteTagsConflictResolverDialog.StatisticsInfo;
 import org.openstreetmap.josm.gui.conflict.tags.PasteTagsConflictResolverDialog.StatisticsInfoTable;
 import org.openstreetmap.josm.gui.conflict.tags.PasteTagsConflictResolverDialog.StatisticsTableModel;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link PasteTagsConflictResolverDialog} class.
  */
+// Needed to due to OSM primitive dependencies
+@BasicPreferences
 class PasteTagsConflictResolverDialogTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     /**
      * Unit test of {@link PasteTagsConflictResolverDialog#PANE_TITLES}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolverModelTest.java b/test/unit/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolverModelTest.java
index 5da656c75..201c6a6ae 100644
--- a/test/unit/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolverModelTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolverModelTest.java
@@ -9,30 +9,22 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link RelationMemberConflictResolverModel} class.
  */
+// Only needed for OSM primitives
+@BasicPreferences
 class RelationMemberConflictResolverModelTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     List<Way> buildTestDataSet() {
         final DataSet ds = new DataSet();
         final Node n1 = new Node(new LatLon(1, 1));
diff --git a/test/unit/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolverTest.java b/test/unit/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolverTest.java
index df2e94516..deef3d2cb 100644
--- a/test/unit/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolverTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/conflict/tags/RelationMemberConflictResolverTest.java
@@ -3,24 +3,15 @@ package org.openstreetmap.josm.gui.conflict.tags;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link RelationMemberConflictResolver} class.
  */
+@BasicPreferences
 class RelationMemberConflictResolverTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test for {@link RelationMemberConflictResolver#RelationMemberConflictResolver}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/conflict/tags/TagConflictResolutionUtilTest.java b/test/unit/org/openstreetmap/josm/gui/conflict/tags/TagConflictResolutionUtilTest.java
index dfc54348d..7656eb377 100644
--- a/test/unit/org/openstreetmap/josm/gui/conflict/tags/TagConflictResolutionUtilTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/conflict/tags/TagConflictResolutionUtilTest.java
@@ -14,29 +14,23 @@ import java.util.List;
 import java.util.regex.PatternSyntaxException;
 import java.util.stream.Collectors;
 
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.data.osm.Tag;
 import org.openstreetmap.josm.data.osm.TagCollection;
 import org.openstreetmap.josm.gui.conflict.tags.TagConflictResolutionUtil.AutomaticChoice;
 import org.openstreetmap.josm.gui.conflict.tags.TagConflictResolutionUtil.AutomaticChoiceGroup;
 import org.openstreetmap.josm.gui.conflict.tags.TagConflictResolutionUtil.AutomaticCombine;
 import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
 /**
  * Unit tests of {@link TagConflictResolutionUtil} class.
  */
+@BasicPreferences
 class TagConflictResolutionUtilTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     private static HashSet<String> newHashSet(String... values) {
         return Arrays.stream(values).collect(Collectors.toCollection(HashSet::new));
     }
diff --git a/test/unit/org/openstreetmap/josm/gui/datatransfer/ClipboardUtilsTest.java b/test/unit/org/openstreetmap/josm/gui/datatransfer/ClipboardUtilsTest.java
index 77270e8dc..5af5a3876 100644
--- a/test/unit/org/openstreetmap/josm/gui/datatransfer/ClipboardUtilsTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/datatransfer/ClipboardUtilsTest.java
@@ -16,12 +16,8 @@ import java.awt.datatransfer.Transferable;
 import java.awt.datatransfer.UnsupportedFlavorException;
 import java.io.IOException;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import net.trajano.commons.testing.UtilityClassTestUtil;
+import org.junit.jupiter.api.Test;
 
 /**
  * Basic tests for the clipboard utils class.
@@ -66,13 +62,6 @@ class ClipboardUtilsTest {
         }
     }
 
-    /**
-     * No dependencies
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     /**
      * Test {@link ClipboardUtils#getClipboard()}
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/datatransfer/PrimitiveTransferableTest.java b/test/unit/org/openstreetmap/josm/gui/datatransfer/PrimitiveTransferableTest.java
index 684632c70..ae8ab36d4 100644
--- a/test/unit/org/openstreetmap/josm/gui/datatransfer/PrimitiveTransferableTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/datatransfer/PrimitiveTransferableTest.java
@@ -3,8 +3,8 @@ package org.openstreetmap.josm.gui.datatransfer;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.awt.datatransfer.DataFlavor;
 import java.awt.datatransfer.UnsupportedFlavorException;
@@ -13,28 +13,21 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.NodeData;
 import org.openstreetmap.josm.data.osm.PrimitiveData;
 import org.openstreetmap.josm.gui.datatransfer.data.PrimitiveTransferData;
 import org.openstreetmap.josm.gui.datatransfer.data.TagTransferData;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link PrimitiveTransferable} class.
  */
+// Only needed for OSM primitives
+@BasicPreferences
 class PrimitiveTransferableTest {
-    /**
-     * Prefs to use OSM primitives
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Test of {@link PrimitiveTransferable#getTransferDataFlavors()} method response order
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/datatransfer/RelationMemberTransferableTest.java b/test/unit/org/openstreetmap/josm/gui/datatransfer/RelationMemberTransferableTest.java
index 71680311c..ad3d1a8da 100644
--- a/test/unit/org/openstreetmap/josm/gui/datatransfer/RelationMemberTransferableTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/datatransfer/RelationMemberTransferableTest.java
@@ -3,8 +3,9 @@ package org.openstreetmap.josm.gui.datatransfer;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
+
 import static org.openstreetmap.josm.gui.datatransfer.RelationMemberTransferable.RELATION_MEMBER_DATA;
 
 import java.awt.datatransfer.DataFlavor;
@@ -12,29 +13,19 @@ import java.awt.datatransfer.UnsupportedFlavorException;
 import java.util.Collection;
 import java.util.Collections;
 
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.PrimitiveData;
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.RelationMemberData;
 import org.openstreetmap.josm.gui.datatransfer.data.PrimitiveTransferData;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link RelationMemberTransferable} class.
  */
 class RelationMemberTransferableTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     /**
      * Test of {@link RelationMemberTransferable#getTransferDataFlavors()} method.
      */
@@ -63,6 +54,7 @@ class RelationMemberTransferableTest {
      * @throws UnsupportedFlavorException never
      */
     @Test
+    @BasicPreferences
     void testGetTransferDataNominal() throws UnsupportedFlavorException {
         RelationMemberTransferable rmt = new RelationMemberTransferable(Collections.singleton(new RelationMember("test", new Node(1))));
         assertEquals("node 1 test # incomplete\n", rmt.getTransferData(DataFlavor.stringFlavor));
diff --git a/test/unit/org/openstreetmap/josm/gui/datatransfer/TagTransferableTest.java b/test/unit/org/openstreetmap/josm/gui/datatransfer/TagTransferableTest.java
index f01391f80..6473bfd16 100644
--- a/test/unit/org/openstreetmap/josm/gui/datatransfer/TagTransferableTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/datatransfer/TagTransferableTest.java
@@ -3,33 +3,22 @@ package org.openstreetmap.josm.gui.datatransfer;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.awt.datatransfer.DataFlavor;
 import java.awt.datatransfer.UnsupportedFlavorException;
 import java.util.HashMap;
 import java.util.Map;
 
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.gui.datatransfer.data.TagTransferData;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link TagTransferable} class.
  */
 class TagTransferableTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     /**
      * Test of {@link TagTransferable#isDataFlavorSupported} method.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/datatransfer/data/PrimitiveTagTransferDataTest.java b/test/unit/org/openstreetmap/josm/gui/datatransfer/data/PrimitiveTagTransferDataTest.java
index d2ffe0d1f..5c0c44ed0 100644
--- a/test/unit/org/openstreetmap/josm/gui/datatransfer/data/PrimitiveTagTransferDataTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/datatransfer/data/PrimitiveTagTransferDataTest.java
@@ -8,8 +8,6 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 import java.util.Arrays;
 import java.util.Map;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.NodeData;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
@@ -17,22 +15,17 @@ import org.openstreetmap.josm.data.osm.PrimitiveData;
 import org.openstreetmap.josm.data.osm.RelationData;
 import org.openstreetmap.josm.data.osm.TagCollection;
 import org.openstreetmap.josm.data.osm.WayData;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Test {@link PrimitiveTagTransferData}
  * @author Michael Zangl
  */
+// Only required due to OSM primitive dependencies
+@BasicPreferences
 class PrimitiveTagTransferDataTest {
-    /**
-     * Prefs only required because of the dependencies of OSM primitives.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     private static boolean isHeterogeneousSource(PrimitiveData... t) {
         return new PrimitiveTagTransferData(Arrays.asList(t)).isHeterogeneousSource();
     }
diff --git a/test/unit/org/openstreetmap/josm/gui/datatransfer/importers/OsmLinkPasterTest.java b/test/unit/org/openstreetmap/josm/gui/datatransfer/importers/OsmLinkPasterTest.java
index 66f9bb5a0..07857dfd5 100644
--- a/test/unit/org/openstreetmap/josm/gui/datatransfer/importers/OsmLinkPasterTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/datatransfer/importers/OsmLinkPasterTest.java
@@ -4,25 +4,15 @@ package org.openstreetmap.josm.gui.datatransfer.importers;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertNull;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.coor.LatLon;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Test {@link OsmLinkPaster}
  * @author Michael Zangl
  */
 class OsmLinkPasterTest {
-    /**
-     * No dependencies
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     /**
      * Test of {@link OsmLinkPaster#parseLatLon(String)}
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/NotesDialogTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/NotesDialogTest.java
index 31ce40fb3..a8ec189fc 100644
--- a/test/unit/org/openstreetmap/josm/gui/dialogs/NotesDialogTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/NotesDialogTest.java
@@ -10,29 +10,20 @@ import java.time.Instant;
 import javax.swing.JLabel;
 import javax.swing.JList;
 
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.notes.Note;
 import org.openstreetmap.josm.data.notes.NoteComment;
 import org.openstreetmap.josm.data.osm.User;
 import org.openstreetmap.josm.gui.dialogs.NotesDialog.NoteRenderer;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link NotesDialog}
  */
+@BasicPreferences
 class NotesDialogTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules josmTestRules = new JOSMTestRules().preferences();
-
     private Note createMultiLineNote() {
         Note note = new Note(LatLon.ZERO);
         note.setCreatedAt(Instant.now());
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManagerTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManagerTest.java
index 6eb63f8fa..03cd82bcb 100644
--- a/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManagerTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManagerTest.java
@@ -7,14 +7,12 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.awt.GraphicsEnvironment;
 import java.awt.event.ActionEvent;
-import javax.swing.JButton;
-import javax.swing.JDialog;
-
 import java.util.Collections;
 import java.util.List;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
+import javax.swing.JButton;
+import javax.swing.JDialog;
+
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.data.osm.Changeset;
 import org.openstreetmap.josm.gui.dialogs.changeset.ChangesetCacheManager.CancelAction;
@@ -27,28 +25,20 @@ import org.openstreetmap.josm.gui.dialogs.changeset.ChangesetCacheManager.QueryA
 import org.openstreetmap.josm.gui.dialogs.changeset.ChangesetCacheManager.RemoveFromCacheAction;
 import org.openstreetmap.josm.gui.dialogs.changeset.ChangesetCacheManager.ShowDetailAction;
 import org.openstreetmap.josm.gui.dialogs.changeset.query.ChangesetQueryDialog;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 import org.openstreetmap.josm.testutils.mockers.HelpAwareOptionPaneMocker;
 import org.openstreetmap.josm.testutils.mockers.WindowMocker;
 
 import mockit.Invocation;
 import mockit.Mock;
 import mockit.MockUp;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link ChangesetCacheManager} class.
  */
+@BasicPreferences
 class ChangesetCacheManagerTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link ChangesetCacheManager#destroyInstance}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheTableColumnModelTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheTableColumnModelTest.java
index 46ce97a18..d7aab1c18 100644
--- a/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheTableColumnModelTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheTableColumnModelTest.java
@@ -3,24 +3,12 @@ package org.openstreetmap.josm.gui.dialogs.changeset;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
  * Unit tests of {@link ChangesetCacheTableColumnModel} class.
  */
 class ChangesetCacheTableColumnModelTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     /**
      * Unit test of {@link ChangesetCacheTableColumnModel}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentPanelTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentPanelTest.java
index ffbd64f9e..146c5a3ba 100644
--- a/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentPanelTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentPanelTest.java
@@ -3,11 +3,11 @@ package org.openstreetmap.josm.gui.dialogs.changeset;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.testutils.JOSMTestRules;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.extension.RegisterExtension;
 
 /**
  * Unit tests of {@link ChangesetContentPanel} class.
@@ -19,7 +19,7 @@ class ChangesetContentPanelTest {
      */
     @RegisterExtension
     @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
+    public JOSMTestRules test = new JOSMTestRules().preferences().main();
 
     /**
      * Unit test of {@link ChangesetContentPanel#ChangesetContentPanel}.
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDetailPanelTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDetailPanelTest.java
index 0c07d1cec..c9a8380b2 100644
--- a/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDetailPanelTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDetailPanelTest.java
@@ -3,24 +3,15 @@ package org.openstreetmap.josm.gui.dialogs.changeset;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link ChangesetDetailPanel} class.
  */
+@BasicPreferences
 class ChangesetDetailPanelTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link ChangesetDetailPanel#ChangesetDetailPanel}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionPanelTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionPanelTest.java
index 3f2326242..ccd4474a6 100644
--- a/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionPanelTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDiscussionPanelTest.java
@@ -3,24 +3,15 @@ package org.openstreetmap.josm.gui.dialogs.changeset;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link ChangesetDiscussionPanel} class.
  */
+@BasicPreferences
 class ChangesetDiscussionPanelTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link ChangesetDiscussionPanel#ChangesetDiscussionPanel}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetTagsPanelTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetTagsPanelTest.java
index e92e23c92..c5485ca2a 100644
--- a/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetTagsPanelTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetTagsPanelTest.java
@@ -3,24 +3,15 @@ package org.openstreetmap.josm.gui.dialogs.changeset;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link ChangesetTagsPanel} class.
  */
+@BasicPreferences
 class ChangesetTagsPanelTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link ChangesetTagsPanel#ChangesetTagsPanel}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/query/AdvancedChangesetQueryPanelTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/query/AdvancedChangesetQueryPanelTest.java
index 2b96ac461..9308accf6 100644
--- a/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/query/AdvancedChangesetQueryPanelTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/query/AdvancedChangesetQueryPanelTest.java
@@ -3,24 +3,15 @@ package org.openstreetmap.josm.gui.dialogs.changeset.query;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link AdvancedChangesetQueryPanel} class.
  */
+@BasicPreferences
 class AdvancedChangesetQueryPanelTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link AdvancedChangesetQueryPanel#AdvancedChangesetQueryPanel}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/query/BasicChangesetQueryPanelTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/query/BasicChangesetQueryPanelTest.java
index d0f076bf4..f4afca5ea 100644
--- a/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/query/BasicChangesetQueryPanelTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/query/BasicChangesetQueryPanelTest.java
@@ -3,24 +3,15 @@ package org.openstreetmap.josm.gui.dialogs.changeset.query;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link BasicChangesetQueryPanel} class.
  */
+@BasicPreferences
 class BasicChangesetQueryPanelTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link BasicChangesetQueryPanel#BasicChangesetQueryPanel}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/query/UrlBasedQueryPanelTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/query/UrlBasedQueryPanelTest.java
index 2f6c3012f..872ab9aa3 100644
--- a/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/query/UrlBasedQueryPanelTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/changeset/query/UrlBasedQueryPanelTest.java
@@ -4,24 +4,15 @@ package org.openstreetmap.josm.gui.dialogs.changeset.query;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link UrlBasedQueryPanel} class.
  */
+@BasicPreferences
 class UrlBasedQueryPanelTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link UrlBasedQueryPanel#UrlBasedQueryPanel}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/layer/DuplicateActionTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/layer/DuplicateActionTest.java
index 024c51660..0e95c8273 100644
--- a/test/unit/org/openstreetmap/josm/gui/dialogs/layer/DuplicateActionTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/layer/DuplicateActionTest.java
@@ -8,27 +8,20 @@ import static org.junit.jupiter.api.Assertions.assertNull;
 
 import java.io.InputStream;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.io.OsmReader;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link DuplicateAction} class.
  */
+// TMS layer needs prefs. Platform for LayerListDialog shortcuts.
+@BasicPreferences
 class DuplicateActionTest {
-    /**
-     * TMS layer needs prefs. Platform for LayerListDialog shortcuts.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Non-regression test for ticket <a href="https://josm.openstreetmap.de/ticket/4539">#4539</a>.
      * @throws Exception if an error occurs
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialogTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialogTest.java
index 1cbf48a53..ffaed4b79 100644
--- a/test/unit/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialogTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialogTest.java
@@ -6,28 +6,19 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import java.util.ArrayList;
 import java.util.List;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link PropertiesDialog} class.
  */
+@BasicPreferences
 class PropertiesDialogTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     private static String createSearchSetting(List<OsmPrimitive> sel, boolean sameType) {
         return PropertiesDialog.createSearchSetting("foo", sel, sameType).text;
     }
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/properties/RecentTagCollectionTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/properties/RecentTagCollectionTest.java
index 17e48c5e8..73c70306c 100644
--- a/test/unit/org/openstreetmap/josm/gui/dialogs/properties/RecentTagCollectionTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/properties/RecentTagCollectionTest.java
@@ -8,28 +8,19 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 import java.util.Arrays;
 import java.util.Collections;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.osm.Tag;
 import org.openstreetmap.josm.data.osm.search.SearchParseError;
 import org.openstreetmap.josm.data.osm.search.SearchSetting;
 import org.openstreetmap.josm.data.preferences.ListProperty;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link RecentTagCollection} class.
  */
+@BasicPreferences
 class RecentTagCollectionTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Performs various tests on a {@link RecentTagCollection}.
      *
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/relation/ChildRelationBrowserTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/relation/ChildRelationBrowserTest.java
index f5da29e72..adba38848 100644
--- a/test/unit/org/openstreetmap/josm/gui/dialogs/relation/ChildRelationBrowserTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/relation/ChildRelationBrowserTest.java
@@ -3,27 +3,18 @@ package org.openstreetmap.josm.gui.dialogs.relation;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link ChildRelationBrowser} class.
  */
+@BasicPreferences
 class ChildRelationBrowserTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link ChildRelationBrowser#ChildRelationBrowser}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/relation/MemberTableLinkedCellRendererTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/relation/MemberTableLinkedCellRendererTest.java
index a0c9593d4..33d31b87a 100644
--- a/test/unit/org/openstreetmap/josm/gui/dialogs/relation/MemberTableLinkedCellRendererTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/relation/MemberTableLinkedCellRendererTest.java
@@ -5,26 +5,17 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import javax.swing.JTable;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.gui.dialogs.relation.sort.WayConnectionType;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link MemberTableLinkedCellRenderer} class.
  */
+@BasicPreferences
 class MemberTableLinkedCellRendererTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link MemberTableLinkedCellRenderer#MemberTableLinkedCellRenderer}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/relation/MemberTableMemberCellRendererTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/relation/MemberTableMemberCellRendererTest.java
index 71e18b058..50c578c37 100644
--- a/test/unit/org/openstreetmap/josm/gui/dialogs/relation/MemberTableMemberCellRendererTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/relation/MemberTableMemberCellRendererTest.java
@@ -5,27 +5,18 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import javax.swing.JTable;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link MemberTableMemberCellRenderer} class.
  */
+@BasicPreferences
 class MemberTableMemberCellRendererTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link MemberTableMemberCellRenderer#MemberTableMemberCellRenderer}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModelTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModelTest.java
index 886ca9d04..38f350231 100644
--- a/test/unit/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModelTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/relation/MemberTableModelTest.java
@@ -7,28 +7,19 @@ import java.util.Collection;
 import java.util.Collections;
 import java.util.List;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Tag;
 import org.openstreetmap.josm.gui.tagging.presets.TaggingPresetHandler;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link MemberTableModel} class.
  */
+@BasicPreferences
 class MemberTableModelTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     /**
      * Non-regression test for ticket <a href="https://josm.openstreetmap.de/ticket/12443">#12443</a>.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/relation/MemberTableRoleCellRendererTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/relation/MemberTableRoleCellRendererTest.java
index 608438b91..48ab295a7 100644
--- a/test/unit/org/openstreetmap/josm/gui/dialogs/relation/MemberTableRoleCellRendererTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/relation/MemberTableRoleCellRendererTest.java
@@ -5,26 +5,17 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import javax.swing.JTable;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link MemberTableRoleCellRenderer} class.
  */
+@BasicPreferences
 class MemberTableRoleCellRendererTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     /**
      * Unit test of {@link MemberTableRoleCellRenderer#MemberTableRoleCellRenderer}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/relation/ReferringRelationsBrowserTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/relation/ReferringRelationsBrowserTest.java
index c89a44537..bf5ad2b4f 100644
--- a/test/unit/org/openstreetmap/josm/gui/dialogs/relation/ReferringRelationsBrowserTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/relation/ReferringRelationsBrowserTest.java
@@ -1,27 +1,18 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.gui.dialogs.relation;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link ReferringRelationsBrowser} class.
  */
+@BasicPreferences
 class ReferringRelationsBrowserTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link ReferringRelationsBrowser#ReferringRelationsBrowser}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/relation/RelationTreeCellRendererTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/relation/RelationTreeCellRendererTest.java
index 21bc646c7..f60041be2 100644
--- a/test/unit/org/openstreetmap/josm/gui/dialogs/relation/RelationTreeCellRendererTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/relation/RelationTreeCellRendererTest.java
@@ -5,25 +5,16 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import javax.swing.JTree;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.osm.Relation;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link RelationTreeCellRenderer} class.
  */
+@BasicPreferences
 class RelationTreeCellRendererTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link RelationTreeCellRenderer#RelationTreeCellRenderer}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableCellRendererTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableCellRendererTest.java
index 0df3c59a3..e71c0bdb1 100644
--- a/test/unit/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableCellRendererTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/relation/SelectionTableCellRendererTest.java
@@ -5,25 +5,16 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import javax.swing.JTable;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link SelectionTableCellRenderer} class.
  */
+@BasicPreferences
 class SelectionTableCellRendererTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link SelectionTableCellRenderer#SelectionTableCellRenderer}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanelTest.java b/test/unit/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanelTest.java
index 1778a7e25..5e9489b71 100644
--- a/test/unit/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanelTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/dialogs/validator/ValidatorTreePanelTest.java
@@ -12,28 +12,19 @@ import java.util.Enumeration;
 import java.util.HashSet;
 import java.util.Set;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.validation.Severity;
 import org.openstreetmap.josm.data.validation.TestError;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link ValidatorTreePanel} class.
  */
+@BasicPreferences
 class ValidatorTreePanelTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link ValidatorTreePanel#ValidatorTreePanel}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/download/BookmarkSelectionTest.java b/test/unit/org/openstreetmap/josm/gui/download/BookmarkSelectionTest.java
index 38da9fc24..ad494e506 100644
--- a/test/unit/org/openstreetmap/josm/gui/download/BookmarkSelectionTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/download/BookmarkSelectionTest.java
@@ -1,25 +1,16 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.gui.download;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.Bounds;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link BookmarkSelection} class.
  */
+@BasicPreferences
 class BookmarkSelectionTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Test for {@link BookmarkSelection#BookmarkSelection}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/download/BoundingBoxSelectionTest.java b/test/unit/org/openstreetmap/josm/gui/download/BoundingBoxSelectionTest.java
index bd1ab3a00..7ea92ad79 100644
--- a/test/unit/org/openstreetmap/josm/gui/download/BoundingBoxSelectionTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/download/BoundingBoxSelectionTest.java
@@ -1,25 +1,16 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.gui.download;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.Bounds;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link BoundingBoxSelection} class.
  */
+@BasicPreferences
 class BoundingBoxSelectionTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Test for {@link BoundingBoxSelection#BoundingBoxSelection}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/download/PlaceSelectionTest.java b/test/unit/org/openstreetmap/josm/gui/download/PlaceSelectionTest.java
index 2a4f56a37..eb6b0e884 100644
--- a/test/unit/org/openstreetmap/josm/gui/download/PlaceSelectionTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/download/PlaceSelectionTest.java
@@ -1,25 +1,16 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.gui.download;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.Bounds;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link PlaceSelection} class.
  */
+@BasicPreferences
 class PlaceSelectionTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Test for {@link PlaceSelection#PlaceSelection}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/download/TileSelectionTest.java b/test/unit/org/openstreetmap/josm/gui/download/TileSelectionTest.java
index 2b4a59b89..136ebfe02 100644
--- a/test/unit/org/openstreetmap/josm/gui/download/TileSelectionTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/download/TileSelectionTest.java
@@ -1,25 +1,16 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.gui.download;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.Bounds;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link TileSelection} class.
  */
+@BasicPreferences
 class TileSelectionTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Test for {@link TileSelection#TileSelection}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/help/HyperlinkHandlerTest.java b/test/unit/org/openstreetmap/josm/gui/help/HyperlinkHandlerTest.java
index 605463bde..38ac72fdc 100644
--- a/test/unit/org/openstreetmap/josm/gui/help/HyperlinkHandlerTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/help/HyperlinkHandlerTest.java
@@ -10,25 +10,16 @@ import javax.swing.text.Element;
 import javax.swing.text.html.HTMLDocument;
 import javax.swing.text.html.HTMLEditorKit;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.gui.widgets.JosmEditorPane;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link HyperlinkHandler} class.
  */
+@BasicPreferences
 class HyperlinkHandlerTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Non-regression test for ticket <a href="https://josm.openstreetmap.de/ticket/17338">#17338</a>.
      * @throws Exception if an error occurs
diff --git a/test/unit/org/openstreetmap/josm/gui/history/CoordinateInfoViewerTest.java b/test/unit/org/openstreetmap/josm/gui/history/CoordinateInfoViewerTest.java
index c59e9e4c2..6cbb5c401 100644
--- a/test/unit/org/openstreetmap/josm/gui/history/CoordinateInfoViewerTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/history/CoordinateInfoViewerTest.java
@@ -4,24 +4,15 @@ package org.openstreetmap.josm.gui.history;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link CoordinateInfoViewer} class.
  */
+@BasicPreferences
 class CoordinateInfoViewerTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Test for {@link CoordinateInfoViewer#CoordinateInfoViewer} - {@code null} handling.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/history/NodeListViewerTest.java b/test/unit/org/openstreetmap/josm/gui/history/NodeListViewerTest.java
index ae5a29987..59874f4a7 100644
--- a/test/unit/org/openstreetmap/josm/gui/history/NodeListViewerTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/history/NodeListViewerTest.java
@@ -4,24 +4,15 @@ package org.openstreetmap.josm.gui.history;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link NodeListViewer} class.
  */
+@BasicPreferences
 class NodeListViewerTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Test for {@link NodeListViewer#NodeListViewer} - {@code null} handling.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanelTest.java b/test/unit/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanelTest.java
index b9ccf9bc9..8ef31c96a 100644
--- a/test/unit/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanelTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/io/BasicUploadSettingsPanelTest.java
@@ -3,24 +3,15 @@ package org.openstreetmap.josm.gui.io;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link BasicUploadSettingsPanel} class.
  */
+@BasicPreferences
 class BasicUploadSettingsPanelTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Test of {@link BasicUploadSettingsPanel#BasicUploadSettingsPanel}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/io/ChangesetCellRendererTest.java b/test/unit/org/openstreetmap/josm/gui/io/ChangesetCellRendererTest.java
index ce41c374e..8469abfda 100644
--- a/test/unit/org/openstreetmap/josm/gui/io/ChangesetCellRendererTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/io/ChangesetCellRendererTest.java
@@ -5,26 +5,17 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import javax.swing.JList;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.osm.Changeset;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
 import java.time.Instant;
 
 /**
  * Unit tests of {@link ChangesetCellRenderer} class.
  */
+@BasicPreferences
 class ChangesetCellRendererTest {
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Test of {@link ChangesetCellRenderer} class.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/io/ChangesetManagementPanelTest.java b/test/unit/org/openstreetmap/josm/gui/io/ChangesetManagementPanelTest.java
index 2981f2de5..6782cec38 100644
--- a/test/unit/org/openstreetmap/josm/gui/io/ChangesetManagementPanelTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/io/ChangesetManagementPanelTest.java
@@ -3,24 +3,14 @@ package org.openstreetmap.josm.gui.io;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
 /**
  * Unit tests of {@link ChangesetManagementPanel} class.
  */
+@BasicPreferences
 class ChangesetManagementPanelTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Test of {@link ChangesetManagementPanel#ChangesetManagementPanel}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/io/CredentialDialogTest.java b/test/unit/org/openstreetmap/josm/gui/io/CredentialDialogTest.java
index 7a0803fc8..cb4526a49 100644
--- a/test/unit/org/openstreetmap/josm/gui/io/CredentialDialogTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/io/CredentialDialogTest.java
@@ -6,25 +6,15 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.gui.io.CredentialDialog.CredentialPanel;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
 /**
  * Unit tests of {@link CredentialDialog} class.
  */
+@BasicPreferences
 class CredentialDialogTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Test of {@link CredentialDialog.CredentialPanel} class.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/io/CustomConfiguratorTest.java b/test/unit/org/openstreetmap/josm/gui/io/CustomConfiguratorTest.java
index f2df27c60..bf9674f0a 100644
--- a/test/unit/org/openstreetmap/josm/gui/io/CustomConfiguratorTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/io/CustomConfiguratorTest.java
@@ -13,28 +13,18 @@ import java.util.Arrays;
 import java.util.Collections;
 
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.data.Preferences;
 import org.openstreetmap.josm.data.PreferencesUtils;
 import org.openstreetmap.josm.spi.preferences.Config;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 import org.openstreetmap.josm.tools.Utils;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-
 /**
  * Unit tests for class {@link CustomConfigurator}.
  */
+@BasicPreferences
 class CustomConfiguratorTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Test method for {@link CustomConfigurator#exportPreferencesKeysToFile}.
      * @throws IOException if any I/O error occurs
diff --git a/test/unit/org/openstreetmap/josm/gui/io/LayerNameAndFilePathTableCellTest.java b/test/unit/org/openstreetmap/josm/gui/io/LayerNameAndFilePathTableCellTest.java
index 1364dc96b..1b007c018 100644
--- a/test/unit/org/openstreetmap/josm/gui/io/LayerNameAndFilePathTableCellTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/io/LayerNameAndFilePathTableCellTest.java
@@ -9,26 +9,17 @@ import java.io.File;
 
 import javax.swing.JTable;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.gui.layer.AbstractModifiableLayer;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
 /**
  * Unit tests of {@link LayerNameAndFilePathTableCell} class.
  */
+@BasicPreferences
 class LayerNameAndFilePathTableCellTest {
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Test of {@link LayerNameAndFilePathTableCell} class.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/io/UploadDialogTest.java b/test/unit/org/openstreetmap/josm/gui/io/UploadDialogTest.java
index b8d6b8dc4..b0ac5aa32 100644
--- a/test/unit/org/openstreetmap/josm/gui/io/UploadDialogTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/io/UploadDialogTest.java
@@ -17,29 +17,19 @@ import java.util.function.Supplier;
 import javax.swing.JOptionPane;
 
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.gui.io.UploadDialog.UploadAction;
 import org.openstreetmap.josm.io.UploadStrategySpecification;
 import org.openstreetmap.josm.spi.preferences.Config;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 import org.openstreetmap.josm.testutils.mockers.WindowMocker;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-
 /**
  * Unit tests of {@link UploadDialog} class.
  */
+@BasicPreferences
 class UploadDialogTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     private static class MockUploadDialog extends JOptionPane implements IUploadDialog {
         private final String source;
         private final String comment;
diff --git a/test/unit/org/openstreetmap/josm/gui/io/UploadParameterSummaryPanelTest.java b/test/unit/org/openstreetmap/josm/gui/io/UploadParameterSummaryPanelTest.java
index 78206f4b3..c3ade6ebf 100644
--- a/test/unit/org/openstreetmap/josm/gui/io/UploadParameterSummaryPanelTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/io/UploadParameterSummaryPanelTest.java
@@ -3,24 +3,14 @@ package org.openstreetmap.josm.gui.io;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
 /**
  * Unit tests of {@link UploadParameterSummaryPanel} class.
  */
+@BasicPreferences
 class UploadParameterSummaryPanelTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Test of {@link UploadParameterSummaryPanel#UploadParameterSummaryPanel}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/io/UploadTextComponentValidatorTest.java b/test/unit/org/openstreetmap/josm/gui/io/UploadTextComponentValidatorTest.java
index 29ad6e03c..16b00c90e 100644
--- a/test/unit/org/openstreetmap/josm/gui/io/UploadTextComponentValidatorTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/io/UploadTextComponentValidatorTest.java
@@ -7,21 +7,11 @@ import static org.hamcrest.MatcherAssert.assertThat;
 import javax.swing.JLabel;
 import javax.swing.JTextField;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
+@BasicPreferences
 class UploadTextComponentValidatorTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link UploadTextComponentValidator.UploadCommentValidator}
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/ImageryLayerTest.java b/test/unit/org/openstreetmap/josm/gui/layer/ImageryLayerTest.java
index fafe82955..d2b9092a1 100644
--- a/test/unit/org/openstreetmap/josm/gui/layer/ImageryLayerTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/layer/ImageryLayerTest.java
@@ -4,25 +4,15 @@ package org.openstreetmap.josm.gui.layer;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 import static org.junit.jupiter.api.Assertions.assertSame;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.gui.layer.imagery.ImageryFilterSettings;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
 /**
  * Unit tests of {@link ImageryLayer} class.
  */
+@BasicPreferences
 class ImageryLayerTest {
-
-    /**
-     * For creating layers
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link ImageryLayer#getFilterSettings()}
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayerTest.java b/test/unit/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayerTest.java
index ec8ee5d7c..372446d4e 100644
--- a/test/unit/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayerTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/layer/geoimage/GeoImageLayerTest.java
@@ -3,24 +3,18 @@ package org.openstreetmap.josm.gui.layer.geoimage;
 
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link GeoImageLayer} class.
  */
+// Basic preferences are needed for OSM primitives
+@BasicPreferences
 class GeoImageLayerTest {
-    /**
-     * We need prefs for this.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
 
     /**
      * Test that {@link GeoImageLayer#mergeFrom} throws IAE for invalid arguments
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplayTest.java b/test/unit/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplayTest.java
index a66a6b80e..32f2c42e1 100644
--- a/test/unit/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplayTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/layer/geoimage/ImageDisplayTest.java
@@ -13,25 +13,16 @@ import java.nio.file.Path;
 import java.nio.file.Paths;
 
 import org.junit.jupiter.api.Disabled;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.gui.layer.geoimage.ImageDisplay.VisRect;
 import org.openstreetmap.josm.gui.layer.imagery.ImageryFilterSettings;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
 /**
  * Unit tests of {@link ImageDisplay} class.
  */
+@BasicPreferences
 class ImageDisplayTest {
-    /**
-     * We need prefs for this.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link ImageDisplay#calculateDrawImageRectangle}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/geoimage/ThumbsLoaderTest.java b/test/unit/org/openstreetmap/josm/gui/layer/geoimage/ThumbsLoaderTest.java
index 1576ae3c8..4a9620da4 100644
--- a/test/unit/org/openstreetmap/josm/gui/layer/geoimage/ThumbsLoaderTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/layer/geoimage/ThumbsLoaderTest.java
@@ -1,11 +1,9 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.gui.layer.geoimage;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.junit.jupiter.api.Disabled;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 import org.openstreetmap.josm.tools.StreamUtils;
 
 import java.nio.file.DirectoryStream;
@@ -21,14 +19,8 @@ import static org.junit.jupiter.api.Assertions.assertNotNull;
 /**
  * Unit tests of {@link ThumbsLoader} class.
  */
+@BasicPreferences
 class ThumbsLoaderTest {
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Performance test for {@link ThumbsLoader}
      * @throws Exception if any error occurs
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/geoimage/WikimediaCommonsLoaderTest.java b/test/unit/org/openstreetmap/josm/gui/layer/geoimage/WikimediaCommonsLoaderTest.java
index 97486a5a1..3d07991f5 100644
--- a/test/unit/org/openstreetmap/josm/gui/layer/geoimage/WikimediaCommonsLoaderTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/layer/geoimage/WikimediaCommonsLoaderTest.java
@@ -10,27 +10,17 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import java.net.URL;
 import java.util.List;
 
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.data.Bounds;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
 import com.github.tomakehurst.wiremock.WireMockServer;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit test of {@link WikimediaCommonsLoader}
  */
+@BasicPreferences
 class WikimediaCommonsLoaderTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link WikimediaCommonsLoader}
      *
diff --git a/test/unit/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongTrackActionTest.java b/test/unit/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongTrackActionTest.java
index 4c5126031..9e81d26af 100644
--- a/test/unit/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongTrackActionTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/layer/gpx/DownloadAlongTrackActionTest.java
@@ -7,7 +7,6 @@ import static org.junit.jupiter.api.Assertions.assertNull;
 
 import java.util.Collections;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.data.gpx.GpxData;
@@ -16,23 +15,14 @@ import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.PleaseWaitRunnable;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.io.GpxReaderTest;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 import org.openstreetmap.josm.testutils.mockers.HelpAwareOptionPaneMocker;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-
 /**
  * Unit tests of {@link DownloadAlongTrackAction} class.
  */
+@BasicPreferences
 class DownloadAlongTrackActionTest {
-
-    /**
-     * The test rules for this test
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     private static PleaseWaitRunnable createTask(String file) throws Exception {
         // click "Download" when presented with the appropriate HelpAwareOptionPane
         final HelpAwareOptionPaneMocker haMocker = new HelpAwareOptionPaneMocker(Collections.singletonMap(
diff --git a/test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/ConditionFactoryTest.java b/test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/ConditionFactoryTest.java
index 31f0bcf68..e87f16ac5 100644
--- a/test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/ConditionFactoryTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/ConditionFactoryTest.java
@@ -4,13 +4,11 @@ package org.openstreetmap.josm.gui.mappaint.mapcss;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.gui.mappaint.mapcss.Condition.Context;
 import org.openstreetmap.josm.gui.mappaint.mapcss.ConditionFactory.Op;
 import org.openstreetmap.josm.gui.mappaint.mapcss.ConditionFactory.PseudoClasses;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import net.trajano.commons.testing.UtilityClassTestUtil;
 
 import java.lang.reflect.Method;
@@ -19,15 +17,8 @@ import java.lang.reflect.Modifier;
 /**
  * Unit tests of {@link ConditionFactory}.
  */
+@BasicPreferences
 class ConditionFactoryTest {
-
-    /**
-     * Setup rule
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Non-regression test for ticket <a href="https://josm.openstreetmap.de/ticket/14368">#14368</a>.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/ConditionTest.java b/test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/ConditionTest.java
index ddcb220f7..08fa59996 100644
--- a/test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/ConditionTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/mappaint/mapcss/ConditionTest.java
@@ -7,7 +7,6 @@ import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmUtils;
 import org.openstreetmap.josm.gui.mappaint.Environment;
@@ -15,21 +14,15 @@ import org.openstreetmap.josm.gui.mappaint.mapcss.Condition.Context;
 import org.openstreetmap.josm.gui.mappaint.mapcss.Condition.TagCondition;
 import org.openstreetmap.josm.gui.mappaint.mapcss.ConditionFactory.Op;
 import org.openstreetmap.josm.gui.mappaint.mapcss.ConditionFactory.SimpleKeyValueCondition;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
 /**
  * This test universally tests all {@link Condition}s.
  * @author Michael Zangl
  */
+// We need prefs for nodes
+@BasicPreferences
 class ConditionTest {
-    /**
-     * We need prefs for nodes.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
     private OsmPrimitive node0;
     private OsmPrimitive node1;
     private OsmPrimitive node2;
diff --git a/test/unit/org/openstreetmap/josm/gui/oauth/FullyAutomaticAuthorizationUITest.java b/test/unit/org/openstreetmap/josm/gui/oauth/FullyAutomaticAuthorizationUITest.java
index 12171fb63..da21cc936 100644
--- a/test/unit/org/openstreetmap/josm/gui/oauth/FullyAutomaticAuthorizationUITest.java
+++ b/test/unit/org/openstreetmap/josm/gui/oauth/FullyAutomaticAuthorizationUITest.java
@@ -3,25 +3,16 @@ package org.openstreetmap.josm.gui.oauth;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.gui.MainApplication;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link FullyAutomaticAuthorizationUI} class.
  */
+@BasicPreferences
 class FullyAutomaticAuthorizationUITest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link FullyAutomaticAuthorizationUI#FullyAutomaticAuthorizationUI}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/oauth/FullyAutomaticPropertiesPanelTest.java b/test/unit/org/openstreetmap/josm/gui/oauth/FullyAutomaticPropertiesPanelTest.java
index bd2417596..28f348930 100644
--- a/test/unit/org/openstreetmap/josm/gui/oauth/FullyAutomaticPropertiesPanelTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/oauth/FullyAutomaticPropertiesPanelTest.java
@@ -3,24 +3,14 @@ package org.openstreetmap.josm.gui.oauth;
 
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
 /**
  * Unit tests of {@link FullyAutomaticPropertiesPanel} class.
  */
+@BasicPreferences
 class FullyAutomaticPropertiesPanelTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link FullyAutomaticPropertiesPanel#FullyAutomaticPropertiesPanel}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/oauth/ManualAuthorizationUITest.java b/test/unit/org/openstreetmap/josm/gui/oauth/ManualAuthorizationUITest.java
index 32cd22c48..dc12267d7 100644
--- a/test/unit/org/openstreetmap/josm/gui/oauth/ManualAuthorizationUITest.java
+++ b/test/unit/org/openstreetmap/josm/gui/oauth/ManualAuthorizationUITest.java
@@ -3,25 +3,15 @@ package org.openstreetmap.josm.gui.oauth;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.gui.MainApplication;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
 /**
  * Unit tests of {@link ManualAuthorizationUI} class.
  */
+@BasicPreferences
 class ManualAuthorizationUITest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link ManualAuthorizationUI#ManualAuthorizationUI}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/oauth/SemiAutomaticAuthorizationUITest.java b/test/unit/org/openstreetmap/josm/gui/oauth/SemiAutomaticAuthorizationUITest.java
index ef0cf8e2e..b72d8cd48 100644
--- a/test/unit/org/openstreetmap/josm/gui/oauth/SemiAutomaticAuthorizationUITest.java
+++ b/test/unit/org/openstreetmap/josm/gui/oauth/SemiAutomaticAuthorizationUITest.java
@@ -3,25 +3,15 @@ package org.openstreetmap.josm.gui.oauth;
 
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.gui.MainApplication;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
 /**
  * Unit tests of {@link SemiAutomaticAuthorizationUI} class.
  */
+@BasicPreferences
 class SemiAutomaticAuthorizationUITest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link SemiAutomaticAuthorizationUI#SemiAutomaticAuthorizationUI}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/imagery/AddTMSLayerPanelTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/imagery/AddTMSLayerPanelTest.java
index 3a4890986..65bf80c11 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/imagery/AddTMSLayerPanelTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/imagery/AddTMSLayerPanelTest.java
@@ -4,24 +4,16 @@ package org.openstreetmap.josm.gui.preferences.imagery;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
+
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link AddTMSLayerPanel} class.
  */
+@BasicPreferences
 class AddTMSLayerPanelTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link AddTMSLayerPanel}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/imagery/AddWMSLayerPanelTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/imagery/AddWMSLayerPanelTest.java
index 465d3d5eb..4f97f4f67 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/imagery/AddWMSLayerPanelTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/imagery/AddWMSLayerPanelTest.java
@@ -3,24 +3,16 @@ package org.openstreetmap.josm.gui.preferences.imagery;
 
 import static org.junit.jupiter.api.Assertions.assertFalse;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
+
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link AddWMSLayerPanel} class.
  */
+@BasicPreferences
 class AddWMSLayerPanelTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link AddWMSLayerPanel}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/imagery/AddWMTSLayerPanelTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/imagery/AddWMTSLayerPanelTest.java
index 4beaa26ee..b97153f9f 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/imagery/AddWMTSLayerPanelTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/imagery/AddWMTSLayerPanelTest.java
@@ -4,24 +4,15 @@ package org.openstreetmap.josm.gui.preferences.imagery;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link AddWMTSLayerPanel} class.
  */
+@BasicPreferences
 class AddWMTSLayerPanelTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link AddWMTSLayerPanel}.
      */
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/server/ProxyPreferenceTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/server/ProxyPreferenceTest.java
index 41ce88a64..ed4d370e1 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/server/ProxyPreferenceTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/server/ProxyPreferenceTest.java
@@ -1,27 +1,18 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.gui.preferences.server;
 
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.gui.preferences.PreferencesTestUtils;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
 /**
  * Unit tests of {@link ProxyPreference} class.
  */
+@BasicPreferences
 class ProxyPreferenceTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link ProxyPreference#ProxyPreference}.
      */
@@ -35,6 +26,6 @@ class ProxyPreferenceTest {
      */
     @Test
     void testAddGui() {
-        PreferencesTestUtils.doTestPreferenceSettingAddGui(new ProxyPreference.Factory(), null);
+        assertDoesNotThrow(() -> PreferencesTestUtils.doTestPreferenceSettingAddGui(new ProxyPreference.Factory(), null));
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/gui/preferences/server/ServerAccessPreferenceTest.java b/test/unit/org/openstreetmap/josm/gui/preferences/server/ServerAccessPreferenceTest.java
index ad6a9c9b1..d4b84fdde 100644
--- a/test/unit/org/openstreetmap/josm/gui/preferences/server/ServerAccessPreferenceTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/preferences/server/ServerAccessPreferenceTest.java
@@ -1,27 +1,20 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.gui.preferences.server;
 
+import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertNotNull;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
+
 import org.openstreetmap.josm.gui.preferences.PreferencesTestUtils;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link ServerAccessPreference} class.
  */
+@BasicPreferences
 class ServerAccessPreferenceTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link ServerAccessPreference#ServerAccessPreference}.
      */
@@ -35,6 +28,6 @@ class ServerAccessPreferenceTest {
      */
     @Test
     void testAddGui() {
-        PreferencesTestUtils.doTestPreferenceSettingAddGui(new ServerAccessPreference.Factory(), null);
+        assertDoesNotThrow(() -> PreferencesTestUtils.doTestPreferenceSettingAddGui(new ServerAccessPreference.Factory(), null));
     }
 }
diff --git a/test/unit/org/openstreetmap/josm/gui/util/WindowGeometryTest.java b/test/unit/org/openstreetmap/josm/gui/util/WindowGeometryTest.java
index e34f909dd..4845608e8 100644
--- a/test/unit/org/openstreetmap/josm/gui/util/WindowGeometryTest.java
+++ b/test/unit/org/openstreetmap/josm/gui/util/WindowGeometryTest.java
@@ -15,27 +15,22 @@ import javax.swing.JLabel;
 import javax.swing.JPanel;
 
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.gui.util.WindowGeometry.WindowGeometryException;
 import org.openstreetmap.josm.spi.preferences.Config;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import nl.jqno.equalsverifier.EqualsVerifier;
 import nl.jqno.equalsverifier.Warning;
+import org.junit.jupiter.params.ParameterizedTest;
+import org.junit.jupiter.params.provider.NullSource;
+import org.junit.jupiter.params.provider.ValueSource;
 
 /**
  * Unit tests of {@link WindowGeometry} class.
  */
+@BasicPreferences
 class WindowGeometryTest {
-    /**
-     * Some of this depends on preferences.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Test of {@link WindowGeometry#centerInWindow} method.
      */
@@ -61,36 +56,11 @@ class WindowGeometryTest {
     /**
      * Test of {@link WindowGeometry.WindowGeometryException} class.
      */
-    @Test
-    void testWindowGeometryException1() {
-        Config.getPref().put("test", null);
-        assertThrows(WindowGeometryException.class, () -> new WindowGeometry("test"));
-    }
-
-    /**
-     * Test of {@link WindowGeometry.WindowGeometryException} class.
-     */
-    @Test
-    void testWindowGeometryException2() {
-        Config.getPref().put("test", "");
-        assertThrows(WindowGeometryException.class, () -> new WindowGeometry("test"));
-    }
-
-    /**
-     * Test of {@link WindowGeometry.WindowGeometryException} class.
-     */
-    @Test
-    void testWindowGeometryException3() {
-        Config.getPref().put("test", "x=not_a_number");
-        assertThrows(WindowGeometryException.class, () -> new WindowGeometry("test"));
-    }
-
-    /**
-     * Test of {@link WindowGeometry.WindowGeometryException} class.
-     */
-    @Test
-    void testWindowGeometryException4() {
-        Config.getPref().put("test", "wrong_pattern");
+    @ParameterizedTest
+    @NullSource
+    @ValueSource(strings = {"", "x=not_a_number", "wrong_pattern"})
+    void testWindowGeometryException(String badValue) {
+        Config.getPref().put("test", badValue);
         assertThrows(WindowGeometryException.class, () -> new WindowGeometry("test"));
     }
 
@@ -99,7 +69,7 @@ class WindowGeometryTest {
      * @throws WindowGeometryException never
      */
     @Test
-    void testWindowGeometryException5() throws WindowGeometryException {
+    void testWindowGeometryExceptionNoThrow() throws WindowGeometryException {
         Config.getPref().put("test", "x=15,y=55,width=200,height=100");
         assertNotNull(new WindowGeometry("test"));
     }
diff --git a/test/unit/org/openstreetmap/josm/io/CertificateAmendmentTest.java b/test/unit/org/openstreetmap/josm/io/CertificateAmendmentTest.java
index 39643fc6d..0be0f1838 100644
--- a/test/unit/org/openstreetmap/josm/io/CertificateAmendmentTest.java
+++ b/test/unit/org/openstreetmap/josm/io/CertificateAmendmentTest.java
@@ -1,25 +1,16 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.io;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import net.trajano.commons.testing.UtilityClassTestUtil;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link CertificateAmendment} class.
  */
+@BasicPreferences
 class CertificateAmendmentTest {
-
-    /**
-     * Setup rule
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     /**
      * Tests that {@code CertificateAmendment} satisfies utility class criteria.
      * @throws ReflectiveOperationException if an error occurs
diff --git a/test/unit/org/openstreetmap/josm/io/ChangesetQueryTest.java b/test/unit/org/openstreetmap/josm/io/ChangesetQueryTest.java
index 661ae0b3f..a07959297 100644
--- a/test/unit/org/openstreetmap/josm/io/ChangesetQueryTest.java
+++ b/test/unit/org/openstreetmap/josm/io/ChangesetQueryTest.java
@@ -1,10 +1,8 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.io;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
 import java.time.Instant;
 import java.util.Arrays;
@@ -15,15 +13,8 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
 /**
  * Unit tests of {@link ChangesetQuery}
  */
+@BasicPreferences
 class ChangesetQueryTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit tests of {@link ChangesetQuery#getQueryString()}
      */
diff --git a/test/unit/org/openstreetmap/josm/io/DiffResultProcessorTest.java b/test/unit/org/openstreetmap/josm/io/DiffResultProcessorTest.java
index df8f52831..457c988ea 100644
--- a/test/unit/org/openstreetmap/josm/io/DiffResultProcessorTest.java
+++ b/test/unit/org/openstreetmap/josm/io/DiffResultProcessorTest.java
@@ -9,8 +9,6 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.Set;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.Changeset;
 import org.openstreetmap.josm.data.osm.Node;
@@ -21,24 +19,17 @@ import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
 import org.openstreetmap.josm.io.DiffResultProcessor.DiffResultEntry;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.XmlParsingException;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link DiffResultProcessor}
  */
+@BasicPreferences
 class DiffResultProcessorTest {
-
-    /**
-     * Setup rule
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     private static void shouldFail(String s) {
         try {
             new DiffResultProcessor(null).parse(s, NullProgressMonitor.INSTANCE);
diff --git a/test/unit/org/openstreetmap/josm/io/GeoJSONReaderTest.java b/test/unit/org/openstreetmap/josm/io/GeoJSONReaderTest.java
index 470a7954e..9317c2be0 100644
--- a/test/unit/org/openstreetmap/josm/io/GeoJSONReaderTest.java
+++ b/test/unit/org/openstreetmap/josm/io/GeoJSONReaderTest.java
@@ -18,27 +18,21 @@ import java.util.List;
 import java.util.Optional;
 import java.util.stream.IntStream;
 
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
+
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link GeoJSONReader}.
  */
+@BasicPreferences
 class GeoJSONReaderTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    public JOSMTestRules rules = new JOSMTestRules();
-
     /**
      * Test reading a GeoJSON file.
      * @throws Exception in case of error
diff --git a/test/unit/org/openstreetmap/josm/io/GpxReaderTest.java b/test/unit/org/openstreetmap/josm/io/GpxReaderTest.java
index b146039d1..6ef2eee23 100644
--- a/test/unit/org/openstreetmap/josm/io/GpxReaderTest.java
+++ b/test/unit/org/openstreetmap/josm/io/GpxReaderTest.java
@@ -2,8 +2,8 @@
 package org.openstreetmap.josm.io;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.io.ByteArrayInputStream;
 import java.io.File;
@@ -14,30 +14,21 @@ import java.util.ArrayList;
 import java.util.HashMap;
 import java.util.Map;
 
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.gpx.GpxData;
 import org.openstreetmap.josm.data.gpx.WayPoint;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-import org.xml.sax.SAXException;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
+import org.xml.sax.SAXException;
 
 /**
  * Tests the {@link GpxReader}.
  */
+@BasicPreferences
 public class GpxReaderTest {
-
-    /**
-     * Setup rule
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     /**
      * Parses a GPX file and returns the parsed data
      * @param filename the GPX file to parse
diff --git a/test/unit/org/openstreetmap/josm/io/GpxWriterTest.java b/test/unit/org/openstreetmap/josm/io/GpxWriterTest.java
index 78d703cd4..16a431d64 100644
--- a/test/unit/org/openstreetmap/josm/io/GpxWriterTest.java
+++ b/test/unit/org/openstreetmap/josm/io/GpxWriterTest.java
@@ -14,8 +14,6 @@ import java.util.Arrays;
 import java.util.HashMap;
 import java.util.function.Consumer;
 
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.gpx.GpxConstants;
 import org.openstreetmap.josm.data.gpx.GpxData;
@@ -24,22 +22,15 @@ import org.openstreetmap.josm.data.gpx.GpxExtensionCollection;
 import org.openstreetmap.josm.data.gpx.GpxTrack;
 import org.openstreetmap.josm.data.gpx.GpxTrackSegment;
 import org.openstreetmap.josm.data.gpx.WayPoint;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Tests the {@link GpxWriter}.
  */
+@BasicPreferences
 public class GpxWriterTest {
-
-    /**
-     * Setup rule
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     private static void testSingleWaypoint(Consumer<WayPoint> consumer, String atts) throws IOException {
         GpxData gpx = new GpxData();
         WayPoint waypoint = new WayPoint(LatLon.ZERO);
diff --git a/test/unit/org/openstreetmap/josm/io/MultiFetchOverpassObjectReaderTest.java b/test/unit/org/openstreetmap/josm/io/MultiFetchOverpassObjectReaderTest.java
index c97a61293..57cd6d6c8 100644
--- a/test/unit/org/openstreetmap/josm/io/MultiFetchOverpassObjectReaderTest.java
+++ b/test/unit/org/openstreetmap/josm/io/MultiFetchOverpassObjectReaderTest.java
@@ -6,28 +6,18 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 import java.util.Arrays;
 import java.util.List;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.Way;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
 /**
  * Unit tests of {@link MultiFetchOverpassObjectReader}.
  */
+@BasicPreferences
 class MultiFetchOverpassObjectReaderTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Test {@link MultiFetchOverpassObjectReader#buildRequestString}
      */
diff --git a/test/unit/org/openstreetmap/josm/io/OsmApiExceptionTest.java b/test/unit/org/openstreetmap/josm/io/OsmApiExceptionTest.java
index 38aca1ec6..5b34fd8c3 100644
--- a/test/unit/org/openstreetmap/josm/io/OsmApiExceptionTest.java
+++ b/test/unit/org/openstreetmap/josm/io/OsmApiExceptionTest.java
@@ -4,24 +4,14 @@ package org.openstreetmap.josm.io;
 import static org.junit.jupiter.api.Assertions.assertFalse;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
 /**
  * Unit tests of {@link OsmApiException} class.
  */
+@BasicPreferences
 class OsmApiExceptionTest {
-
-    /**
-     * Setup tests
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Non-regression test for <a href="https://josm.openstreetmap.de/ticket/17328">Bug #17328</a>.
      */
diff --git a/test/unit/org/openstreetmap/josm/io/OsmChangeBuilderTest.java b/test/unit/org/openstreetmap/josm/io/OsmChangeBuilderTest.java
index 759566ced..04a220246 100644
--- a/test/unit/org/openstreetmap/josm/io/OsmChangeBuilderTest.java
+++ b/test/unit/org/openstreetmap/josm/io/OsmChangeBuilderTest.java
@@ -6,28 +6,19 @@ import static org.junit.jupiter.api.Assertions.fail;
 
 import java.util.Arrays;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.Changeset;
 import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 import org.openstreetmap.josm.tools.Logging;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link OsmChangeBuilder}
  */
+@BasicPreferences
 class OsmChangeBuilderTest {
-
-    /**
-     * Setup rule
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     private static void shouldFail(Runnable r) {
         try {
             r.run();
diff --git a/test/unit/org/openstreetmap/josm/io/OsmChangeReaderTest.java b/test/unit/org/openstreetmap/josm/io/OsmChangeReaderTest.java
index 9430bc78d..7f67bdac9 100644
--- a/test/unit/org/openstreetmap/josm/io/OsmChangeReaderTest.java
+++ b/test/unit/org/openstreetmap/josm/io/OsmChangeReaderTest.java
@@ -9,30 +9,21 @@ import java.nio.charset.StandardCharsets;
 import java.util.Collection;
 import java.util.Iterator;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.notes.Note;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.NoteData;
 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 import org.openstreetmap.josm.tools.Pair;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link OsmChangeReader}.
  */
+@BasicPreferences
 class OsmChangeReaderTest {
-
-    /**
-     * Setup rule
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     /**
      * Parse osmChange.
      * @param osm OSM data in osmChange format, without header/footer
diff --git a/test/unit/org/openstreetmap/josm/io/OsmChangesetContentParserTest.java b/test/unit/org/openstreetmap/josm/io/OsmChangesetContentParserTest.java
index 8cc4da587..053d21bbf 100644
--- a/test/unit/org/openstreetmap/josm/io/OsmChangesetContentParserTest.java
+++ b/test/unit/org/openstreetmap/josm/io/OsmChangesetContentParserTest.java
@@ -11,8 +11,6 @@ import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 import java.util.Arrays;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.osm.ChangesetDataSet;
 import org.openstreetmap.josm.data.osm.ChangesetDataSet.ChangesetModificationType;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
@@ -21,24 +19,18 @@ import org.openstreetmap.josm.data.osm.history.HistoryOsmPrimitive;
 import org.openstreetmap.josm.data.osm.history.HistoryRelation;
 import org.openstreetmap.josm.data.osm.history.HistoryWay;
 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 import org.openstreetmap.josm.tools.Logging;
 import org.openstreetmap.josm.tools.XmlParsingException;
 
 import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link OsmChangesetContentParser}.
  */
+@BasicPreferences
 class OsmChangesetContentParserTest {
-
-    /**
-     * Setup rule
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     private static void shouldFail(Runnable r) {
         try {
             r.run();
diff --git a/test/unit/org/openstreetmap/josm/io/OsmChangesetParserTest.java b/test/unit/org/openstreetmap/josm/io/OsmChangesetParserTest.java
index 35e95d005..360eb5b60 100644
--- a/test/unit/org/openstreetmap/josm/io/OsmChangesetParserTest.java
+++ b/test/unit/org/openstreetmap/josm/io/OsmChangesetParserTest.java
@@ -8,17 +8,15 @@ import java.io.ByteArrayInputStream;
 import java.nio.charset.StandardCharsets;
 import java.util.List;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.osm.Changeset;
 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
 /**
  * Unit tests of {@link OsmChangesetParser} class.
  */
+@BasicPreferences
 class OsmChangesetParserTest {
 
     private static final String BEGIN =
@@ -54,13 +52,6 @@ class OsmChangesetParserTest {
         "</changeset>" +
         "</osm>";
 
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     private static List<Changeset> parse(String cs) throws IllegalDataException {
         return OsmChangesetParser.parse(new ByteArrayInputStream(cs.getBytes(StandardCharsets.UTF_8)), NullProgressMonitor.INSTANCE);
     }
diff --git a/test/unit/org/openstreetmap/josm/io/OsmJsonReaderTest.java b/test/unit/org/openstreetmap/josm/io/OsmJsonReaderTest.java
index 4ee432546..fe84f0a2c 100644
--- a/test/unit/org/openstreetmap/josm/io/OsmJsonReaderTest.java
+++ b/test/unit/org/openstreetmap/josm/io/OsmJsonReaderTest.java
@@ -11,8 +11,6 @@ import java.nio.charset.StandardCharsets;
 import java.time.Instant;
 import java.util.Iterator;
 
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
@@ -20,22 +18,15 @@ import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link OsmReader} class.
  */
+@BasicPreferences
 class OsmJsonReaderTest {
-
-    /**
-     * Setup rule
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     /**
      * Parse JSON.
      * @param osm OSM data in JSON format, without header/footer
diff --git a/test/unit/org/openstreetmap/josm/io/OsmReaderTest.java b/test/unit/org/openstreetmap/josm/io/OsmReaderTest.java
index 2be8c2217..5c52e2708 100644
--- a/test/unit/org/openstreetmap/josm/io/OsmReaderTest.java
+++ b/test/unit/org/openstreetmap/josm/io/OsmReaderTest.java
@@ -17,8 +17,6 @@ import java.nio.file.Files;
 import java.nio.file.Paths;
 import java.util.Arrays;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
@@ -26,22 +24,15 @@ import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
 import org.openstreetmap.josm.gui.progress.ProgressMonitor;
 import org.openstreetmap.josm.io.OsmReader.Options;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link OsmReader} class.
  */
+@BasicPreferences
 class OsmReaderTest {
-
-    /**
-     * Setup rule
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     private static Options[][] options() {
         return new Options[][]{
                 new Options[]{},
diff --git a/test/unit/org/openstreetmap/josm/io/OsmWriterTest.java b/test/unit/org/openstreetmap/josm/io/OsmWriterTest.java
index 3394722a1..6aeacad27 100644
--- a/test/unit/org/openstreetmap/josm/io/OsmWriterTest.java
+++ b/test/unit/org/openstreetmap/josm/io/OsmWriterTest.java
@@ -16,9 +16,6 @@ import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.Changeset;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -28,20 +25,15 @@ import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.NodeData;
 import org.openstreetmap.josm.data.osm.UploadPolicy;
 import org.openstreetmap.josm.data.osm.User;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
+
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link OsmWriter} class.
  */
+@BasicPreferences
 class OsmWriterTest {
-
-    /**
-     * Setup rule
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     /**
      * Unit test of {@link OsmWriter#byIdComparator}.
      */
diff --git a/test/unit/org/openstreetmap/josm/io/ParseWithChangesetReaderTest.java b/test/unit/org/openstreetmap/josm/io/ParseWithChangesetReaderTest.java
index 79080dca8..7d2f88671 100644
--- a/test/unit/org/openstreetmap/josm/io/ParseWithChangesetReaderTest.java
+++ b/test/unit/org/openstreetmap/josm/io/ParseWithChangesetReaderTest.java
@@ -10,29 +10,20 @@ import java.io.IOException;
 import java.io.InputStream;
 import java.nio.charset.StandardCharsets;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 import org.openstreetmap.josm.tools.Logging;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Additional unit tests for {@link OsmReader}.
  */
+@BasicPreferences
 class ParseWithChangesetReaderTest {
-
-    /**
-     * Setup rule
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     private static DataSet getDataSet(String doc) throws IOException, IllegalDataException {
         try (InputStream is = new ByteArrayInputStream(doc.getBytes(StandardCharsets.UTF_8))) {
             return OsmReader.parseDataSet(is, null);
diff --git a/test/unit/org/openstreetmap/josm/io/auth/CredentialsAgentExceptionTest.java b/test/unit/org/openstreetmap/josm/io/auth/CredentialsAgentExceptionTest.java
index 4f30e019b..c97176a91 100644
--- a/test/unit/org/openstreetmap/josm/io/auth/CredentialsAgentExceptionTest.java
+++ b/test/unit/org/openstreetmap/josm/io/auth/CredentialsAgentExceptionTest.java
@@ -3,24 +3,12 @@ package org.openstreetmap.josm.io.auth;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
  * Unit tests of {@link CredentialsAgentException} class.
  */
 class CredentialsAgentExceptionTest {
-
-    /**
-     * Setup test
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     /**
      * Unit test of {@code CredentialsAgentException#CredentialsAgentException}
      */
diff --git a/test/unit/org/openstreetmap/josm/io/remotecontrol/AddTagsDialogTest.java b/test/unit/org/openstreetmap/josm/io/remotecontrol/AddTagsDialogTest.java
index 2a0d76fe2..eada4d281 100644
--- a/test/unit/org/openstreetmap/josm/io/remotecontrol/AddTagsDialogTest.java
+++ b/test/unit/org/openstreetmap/josm/io/remotecontrol/AddTagsDialogTest.java
@@ -5,23 +5,14 @@ import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.util.Map;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
 /**
  * Unit tests for class {@link AddTagsDialog}.
  */
+@BasicPreferences
 class AddTagsDialogTest {
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of {@link AddTagsDialog#parseUrlTagsToKeyValues}
      */
diff --git a/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandlerTest.java b/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandlerTest.java
index 23fbc0d63..3175efbb6 100644
--- a/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandlerTest.java
+++ b/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/AddWayHandlerTest.java
@@ -5,27 +5,19 @@ import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.layer.OsmDataLayer;
 import org.openstreetmap.josm.io.remotecontrol.handler.RequestHandler.RequestHandlerBadRequestException;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link AddWayHandler} class.
  */
+@BasicPreferences
 class AddWayHandlerTest {
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     private static AddWayHandler newHandler(String url) throws RequestHandlerBadRequestException {
         AddWayHandler req = new AddWayHandler();
         if (url != null)
diff --git a/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/ImageryHandlerTest.java b/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/ImageryHandlerTest.java
index 3d13b0940..8b34f2130 100644
--- a/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/ImageryHandlerTest.java
+++ b/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/ImageryHandlerTest.java
@@ -3,32 +3,24 @@ package org.openstreetmap.josm.io.remotecontrol.handler;
 
 import static org.hamcrest.CoreMatchers.hasItem;
 import static org.hamcrest.MatcherAssert.assertThat;
-import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
+import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.util.Arrays;
 import java.util.List;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.imagery.ImageryInfo;
 import org.openstreetmap.josm.io.remotecontrol.handler.RequestHandler.RequestHandlerBadRequestException;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link ImageryHandler} class.
  */
+@BasicPreferences
 class ImageryHandlerTest {
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     private static ImageryHandler newHandler(String url) throws RequestHandlerBadRequestException {
         ImageryHandler req = new ImageryHandler();
         if (url != null)
diff --git a/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandlerTest.java b/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandlerTest.java
index ed31a8ba6..aa5a98772 100644
--- a/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandlerTest.java
+++ b/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandlerTest.java
@@ -5,24 +5,15 @@ import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.io.remotecontrol.handler.RequestHandler.RequestHandlerBadRequestException;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link LoadAndZoomHandler} class.
  */
 class LoadAndZoomHandlerTest {
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     private static LoadAndZoomHandler newHandler(String url) throws RequestHandlerBadRequestException {
         LoadAndZoomHandler req = new LoadAndZoomHandler();
         if (url != null)
@@ -65,6 +56,7 @@ class LoadAndZoomHandlerTest {
      * @throws Exception if any error occurs
      */
     @Test
+    @BasicPreferences
     void testNominalRequest() throws Exception {
         assertDoesNotThrow(() -> newHandler("https://localhost?bottom=0&top=0&left=1&right=1").handle());
     }
diff --git a/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandlerTest.java b/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandlerTest.java
index 9bd6dd06d..1beeeaaca 100644
--- a/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandlerTest.java
+++ b/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/LoadObjectHandlerTest.java
@@ -8,28 +8,18 @@ import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertThrows;
 
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.io.remotecontrol.handler.RequestHandler.RequestHandlerBadRequestException;
 import org.openstreetmap.josm.spi.preferences.Config;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
 import com.github.tomakehurst.wiremock.WireMockServer;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link LoadObjectHandler} class.
  */
 class LoadObjectHandlerTest {
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     private static LoadObjectHandler newHandler(String url) throws RequestHandlerBadRequestException {
         LoadObjectHandler req = new LoadObjectHandler();
         if (url != null)
@@ -68,6 +58,7 @@ class LoadObjectHandlerTest {
      * Unit test for nominal request - local data file.
      */
     @Test
+    @BasicPreferences
     void testNominalRequest() {
         WireMockServer wiremock = TestUtils.getWireMockServer();
         wiremock.addStubMapping(get(urlEqualTo("/capabilities")).willReturn(aResponse().withStatusMessage("OK")
diff --git a/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandlerTest.java b/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandlerTest.java
index 798fb5458..b61c974d2 100644
--- a/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandlerTest.java
+++ b/test/unit/org/openstreetmap/josm/io/remotecontrol/handler/RequestHandlerTest.java
@@ -8,26 +8,15 @@ import java.util.Collections;
 import java.util.HashMap;
 import java.util.Map;
 
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.io.remotecontrol.PermissionPrefWithDefault;
 import org.openstreetmap.josm.io.remotecontrol.handler.RequestHandler.RequestHandlerBadRequestException;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link RequestHandler} class.
  */
 class RequestHandlerTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     Map<String, String> getRequestParameter(String url) throws RequestHandlerBadRequestException {
         final RequestHandler req = new RequestHandler() {
             @Override
diff --git a/test/unit/org/openstreetmap/josm/plugins/PluginDownloadExceptionTest.java b/test/unit/org/openstreetmap/josm/plugins/PluginDownloadExceptionTest.java
index 31e9f74ef..1077bd919 100644
--- a/test/unit/org/openstreetmap/josm/plugins/PluginDownloadExceptionTest.java
+++ b/test/unit/org/openstreetmap/josm/plugins/PluginDownloadExceptionTest.java
@@ -3,24 +3,12 @@ package org.openstreetmap.josm.plugins;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
  * Unit tests of {@link PluginDownloadException} class.
  */
 class PluginDownloadExceptionTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     /**
      * Unit test of {@link PluginDownloadException#PluginDownloadException}.
      */
diff --git a/test/unit/org/openstreetmap/josm/plugins/PluginExceptionTest.java b/test/unit/org/openstreetmap/josm/plugins/PluginExceptionTest.java
index ee401b377..586215cd1 100644
--- a/test/unit/org/openstreetmap/josm/plugins/PluginExceptionTest.java
+++ b/test/unit/org/openstreetmap/josm/plugins/PluginExceptionTest.java
@@ -3,24 +3,12 @@ package org.openstreetmap.josm.plugins;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
  * Unit tests of {@link PluginException} class.
  */
 class PluginExceptionTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     /**
      * Unit test of {@link PluginException#PluginException}.
      */
diff --git a/test/unit/org/openstreetmap/josm/plugins/PluginHandlerTest.java b/test/unit/org/openstreetmap/josm/plugins/PluginHandlerTest.java
index 3af77231d..aeefa9180 100644
--- a/test/unit/org/openstreetmap/josm/plugins/PluginHandlerTest.java
+++ b/test/unit/org/openstreetmap/josm/plugins/PluginHandlerTest.java
@@ -16,33 +16,24 @@ import java.util.stream.Stream;
 import javax.swing.JOptionPane;
 import javax.swing.JScrollPane;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.gui.MainApplication;
 import org.openstreetmap.josm.gui.preferences.plugin.PluginPreferenceTest;
 import org.openstreetmap.josm.gui.widgets.JosmTextArea;
 import org.openstreetmap.josm.plugins.PluginHandler.DeprecatedPlugin;
 import org.openstreetmap.josm.plugins.PluginHandler.PluginInformationAction;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 import org.openstreetmap.josm.testutils.mockers.HelpAwareOptionPaneMocker;
 import org.openstreetmap.josm.testutils.mockers.JOptionPaneSimpleMocker;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import nl.jqno.equalsverifier.EqualsVerifier;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link PluginHandler} class.
  */
+@BasicPreferences
 class PluginHandlerTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     /**
      * Unit test of methods {@link DeprecatedPlugin#equals} and {@link DeprecatedPlugin#hashCode}.
      */
diff --git a/test/unit/org/openstreetmap/josm/plugins/PluginListParseExceptionTest.java b/test/unit/org/openstreetmap/josm/plugins/PluginListParseExceptionTest.java
index f462626e0..dfa02a960 100644
--- a/test/unit/org/openstreetmap/josm/plugins/PluginListParseExceptionTest.java
+++ b/test/unit/org/openstreetmap/josm/plugins/PluginListParseExceptionTest.java
@@ -3,24 +3,12 @@ package org.openstreetmap.josm.plugins;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
  * Unit tests of {@link PluginListParseException} class.
  */
 class PluginListParseExceptionTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     /**
      * Unit test of {@link PluginListParseException#PluginListParseException}.
      */
diff --git a/test/unit/org/openstreetmap/josm/spi/preferences/ListListSettingTest.java b/test/unit/org/openstreetmap/josm/spi/preferences/ListListSettingTest.java
index 4932f6086..9c962033b 100644
--- a/test/unit/org/openstreetmap/josm/spi/preferences/ListListSettingTest.java
+++ b/test/unit/org/openstreetmap/josm/spi/preferences/ListListSettingTest.java
@@ -1,25 +1,18 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.spi.preferences;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.TestUtils;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import nl.jqno.equalsverifier.EqualsVerifier;
 
 /**
  * Test {@link ListListSetting}.
  */
+// This is a preference test
+@BasicPreferences
 class ListListSettingTest {
-    /**
-     * This is a preference test
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of methods {@link ListListSetting#equals} and {@link ListListSetting#hashCode}.
      */
diff --git a/test/unit/org/openstreetmap/josm/spi/preferences/ListSettingTest.java b/test/unit/org/openstreetmap/josm/spi/preferences/ListSettingTest.java
index f3f831116..3bb276ee4 100644
--- a/test/unit/org/openstreetmap/josm/spi/preferences/ListSettingTest.java
+++ b/test/unit/org/openstreetmap/josm/spi/preferences/ListSettingTest.java
@@ -1,25 +1,18 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.spi.preferences;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.TestUtils;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import nl.jqno.equalsverifier.EqualsVerifier;
 
 /**
  * Test {@link ListSetting}.
  */
+// This is a preference test
+@BasicPreferences
 class ListSettingTest {
-    /**
-     * This is a preference test
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of methods {@link ListSetting#equals} and {@link ListSetting#hashCode}.
      */
diff --git a/test/unit/org/openstreetmap/josm/spi/preferences/MapListSettingTest.java b/test/unit/org/openstreetmap/josm/spi/preferences/MapListSettingTest.java
index 9e1d6ce0f..1949b84b8 100644
--- a/test/unit/org/openstreetmap/josm/spi/preferences/MapListSettingTest.java
+++ b/test/unit/org/openstreetmap/josm/spi/preferences/MapListSettingTest.java
@@ -1,25 +1,18 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.spi.preferences;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.TestUtils;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import nl.jqno.equalsverifier.EqualsVerifier;
 
 /**
  * Test {@link MapListSetting}.
  */
+// This is a preference test
+@BasicPreferences
 class MapListSettingTest {
-    /**
-     * This is a preference test
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of methods {@link MapListSetting#equals} and {@link MapListSetting#hashCode}.
      */
diff --git a/test/unit/org/openstreetmap/josm/spi/preferences/StringSettingTest.java b/test/unit/org/openstreetmap/josm/spi/preferences/StringSettingTest.java
index a4a6f6af4..92fce1ea8 100644
--- a/test/unit/org/openstreetmap/josm/spi/preferences/StringSettingTest.java
+++ b/test/unit/org/openstreetmap/josm/spi/preferences/StringSettingTest.java
@@ -1,25 +1,18 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.spi.preferences;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.TestUtils;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import nl.jqno.equalsverifier.EqualsVerifier;
 
 /**
  * Test {@link StringSetting}.
  */
+// This is a preference test
+@BasicPreferences
 class StringSettingTest {
-    /**
-     * This is a preference test
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of methods {@link StringSetting#equals} and {@link StringSetting#hashCode}.
      */
diff --git a/test/unit/org/openstreetmap/josm/testutils/annotations/AnnotationUtils.java b/test/unit/org/openstreetmap/josm/testutils/annotations/AnnotationUtils.java
new file mode 100644
index 000000000..b96e6c2f8
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/testutils/annotations/AnnotationUtils.java
@@ -0,0 +1,82 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.testutils.annotations;
+
+import java.lang.annotation.Annotation;
+import java.lang.reflect.AnnotatedElement;
+import java.lang.reflect.Field;
+import java.lang.reflect.Modifier;
+import java.util.Collection;
+import java.util.Optional;
+
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.junit.platform.commons.support.AnnotationSupport;
+
+/**
+ * Useful methods for annotation extensions
+ * @author Taylor Smock
+ * @since xxx
+ */
+final class AnnotationUtils {
+    private AnnotationUtils() {
+        // Utils class
+    }
+
+    /**
+     * Find the first parent annotation
+     * @param <T> The annotation to find
+     * @param context The context to search
+     * @param annotation The annotation to find
+     * @return See {@link AnnotationSupport#findAnnotation}
+     */
+    public static <T extends Annotation> Optional<T> findFirstParentAnnotation(ExtensionContext context, Class<T> annotation) {
+        ExtensionContext current = context;
+        do {
+            Optional<T> foundAnnotation = AnnotationSupport.findAnnotation(current.getElement(), annotation);
+            if (foundAnnotation.isPresent()) {
+                return foundAnnotation;
+            }
+            current = current.getParent().orElse(null);
+        } while (current != null);
+        return Optional.empty();
+    }
+
+    /**
+     * Reset a static class (all static fields are unset). If they are initialized as part of a static block, please be aware of NPEs.
+     * @param clazz The class to reset
+     * @throws ReflectiveOperationException If reflection doesn't work, for whatever reason.
+     */
+    public static void resetStaticClass(Class<?> clazz) throws ReflectiveOperationException {
+        for (Field field : clazz.getDeclaredFields()) {
+            if (!field.isAccessible()) {
+                field.setAccessible(true);
+            }
+            // Don't reset fields that are not static
+            if ((field.getModifiers() & Modifier.STATIC) == 0) {
+                continue;
+            }
+            final boolean isFinal = (field.getModifiers() & Modifier.FINAL) != 0;
+            if (field.get(null) instanceof Collection && isFinal) {
+                // Clear all collections (assume they start empty)
+                try {
+                    ((Collection<?>) field.get(null)).clear();
+                } catch (UnsupportedOperationException e) {
+                    // Probably an unmodifiable collection
+                }
+            } else if (!isFinal) {
+                // Only reset static fields, but not final static fields
+                field.set(null, null);
+            }
+        }
+    }
+
+    /**
+     * Check if the element is annotated with the
+     * @param annotatedElement The annotated element wrapped in an optional.
+     * @param annotationClass The annotation class
+     * @param <T> Annotation class type
+     * @return {@code true} if the element is present and is annotated with the specified class
+     */
+    public static <T extends Annotation> boolean elementIsAnnotated(Optional<AnnotatedElement> annotatedElement, Class<T> annotationClass) {
+        return annotatedElement.isPresent() && annotatedElement.get().isAnnotationPresent(annotationClass);
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/testutils/annotations/BasicPreferences.java b/test/unit/org/openstreetmap/josm/testutils/annotations/BasicPreferences.java
new file mode 100644
index 000000000..3753a3634
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/testutils/annotations/BasicPreferences.java
@@ -0,0 +1,77 @@
+// 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 org.openstreetmap.josm.data.Preferences;
+import org.openstreetmap.josm.data.preferences.JosmBaseDirectories;
+import org.openstreetmap.josm.data.preferences.JosmUrls;
+import org.openstreetmap.josm.spi.preferences.Config;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
+
+import org.junit.jupiter.api.extension.AfterAllCallback;
+import org.junit.jupiter.api.extension.AfterEachCallback;
+import org.junit.jupiter.api.extension.BeforeAllCallback;
+import org.junit.jupiter.api.extension.BeforeEachCallback;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.junit.jupiter.api.extension.ExtensionContext.Namespace;
+
+/**
+ * Allow tests to use JOSM preferences (see {@link JOSMTestRules#preferences()}).
+ * This is often enough for basic tests.
+ *
+ * @author Taylor Smock
+ * @see FullPreferences
+ * @since xxx
+ */
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.TYPE, ElementType.METHOD})
+@ExtendWith(BasicPreferences.BasicPreferencesExtension.class)
+public @interface BasicPreferences {
+
+    /**
+     * Initialize basic preferences. This is often more than enough for basic tests.
+     * @author Taylor Smock
+     */
+    class BasicPreferencesExtension implements AfterAllCallback, AfterEachCallback, BeforeAllCallback, BeforeEachCallback {
+        @Override
+        public void afterAll(ExtensionContext context) throws Exception {
+            AnnotationUtils.resetStaticClass(Config.class);
+        }
+
+        @Override
+        public void afterEach(ExtensionContext context) throws Exception {
+            if (context.getElement().isPresent() && context.getElement().get().isAnnotationPresent(BasicPreferences.class)) {
+                this.afterAll(context);
+            }
+        }
+
+        @Override
+        public void beforeAll(ExtensionContext context) throws Exception {
+            Preferences pref = Preferences.main();
+            // Disable saving on put, just to avoid overwriting pref files
+            pref.enableSaveOnPut(false);
+            Config.setPreferencesInstance(pref);
+            Config.setBaseDirectoriesProvider(JosmBaseDirectories.getInstance());
+            Config.setUrlsProvider(JosmUrls.getInstance());
+            // Force an invalid URL just to avoid accidents
+            Config.getPref().put("osm-server.url", "http://invalid");
+
+            // Store the pref for other extensions
+            context.getStore(Namespace.create(BasicPreferencesExtension.class)).put("preferences", pref);
+        }
+
+        @Override
+        public void beforeEach(ExtensionContext context) throws Exception {
+            if (AnnotationUtils.elementIsAnnotated(context.getElement(), BasicPreferences.class) || Config.getPref() == null) {
+                this.beforeAll(context);
+            }
+        }
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/testutils/annotations/FullPreferences.java b/test/unit/org/openstreetmap/josm/testutils/annotations/FullPreferences.java
new file mode 100644
index 000000000..a692c118b
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/testutils/annotations/FullPreferences.java
@@ -0,0 +1,61 @@
+// 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.Map;
+
+import org.openstreetmap.josm.TestUtils;
+import org.openstreetmap.josm.data.Preferences;
+import org.openstreetmap.josm.spi.preferences.Config;
+import org.openstreetmap.josm.spi.preferences.Setting;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences.BasicPreferencesExtension;
+
+import org.junit.jupiter.api.extension.BeforeAllCallback;
+import org.junit.jupiter.api.extension.BeforeEachCallback;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.junit.jupiter.api.extension.ExtensionContext.Namespace;
+
+/**
+ * Allow tests to use JOSM preferences with default values (see {@link JOSMTestRules#preferences()})
+ * @author Taylor Smock
+ * @see BasicPreferences (often enough for simple tests).
+ * @since xxx
+ */
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target({ElementType.TYPE, ElementType.METHOD})
+@JosmHome
+@BasicPreferences
+@ExtendWith(FullPreferences.UsePreferencesExtension.class)
+public @interface FullPreferences {
+    /**
+     * Initialize preferences.
+     */
+    class UsePreferencesExtension implements BeforeAllCallback, BeforeEachCallback {
+        @Override
+        public void beforeAll(ExtensionContext context) throws Exception {
+            Preferences pref = context.getStore(Namespace.create(BasicPreferencesExtension.class)).get("preferences", Preferences.class);
+            @SuppressWarnings("unchecked")
+            final Map<String, Setting<?>> defaultsMap = (Map<String, Setting<?>>) TestUtils.getPrivateField(pref, "defaultsMap");
+            defaultsMap.clear();
+            pref.resetToInitialState();
+            pref.enableSaveOnPut(false);
+            // No pref init -> that would only create the preferences file.
+            // We force the use of a wrong API server, just in case anyone attempts an upload
+            Config.getPref().put("osm-server.url", "http://invalid");
+        }
+
+        @Override
+        public void beforeEach(ExtensionContext context) throws Exception {
+            if (AnnotationUtils.elementIsAnnotated(context.getElement(), FullPreferences.class)) {
+                this.beforeAll(context);
+            }
+        }
+    }
+}
diff --git a/test/unit/org/openstreetmap/josm/tools/CheckParameterUtilTest.java b/test/unit/org/openstreetmap/josm/tools/CheckParameterUtilTest.java
index 66e0ff435..0c274bd70 100644
--- a/test/unit/org/openstreetmap/josm/tools/CheckParameterUtilTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/CheckParameterUtilTest.java
@@ -1,25 +1,13 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.tools;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import net.trajano.commons.testing.UtilityClassTestUtil;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link CheckParameterUtil} class.
  */
 class CheckParameterUtilTest {
-
-    /**
-     * Setup rule.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     /**
      * Tests that {@code CheckParameterUtil} satisfies utility class criteria.
      * @throws ReflectiveOperationException if an error occurs
diff --git a/test/unit/org/openstreetmap/josm/tools/FontsManagerTest.java b/test/unit/org/openstreetmap/josm/tools/FontsManagerTest.java
index f236899f9..f0a5ce6f3 100644
--- a/test/unit/org/openstreetmap/josm/tools/FontsManagerTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/FontsManagerTest.java
@@ -6,25 +6,13 @@ import static org.junit.jupiter.api.Assertions.fail;
 import java.awt.Font;
 import java.awt.GraphicsEnvironment;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import net.trajano.commons.testing.UtilityClassTestUtil;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link FontsManager} class.
  */
 class FontsManagerTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     /**
      * Test method for {@code FontsManager#initialize}
      */
diff --git a/test/unit/org/openstreetmap/josm/tools/ImageResizeModeTest.java b/test/unit/org/openstreetmap/josm/tools/ImageResizeModeTest.java
index 204b34527..d67c04033 100644
--- a/test/unit/org/openstreetmap/josm/tools/ImageResizeModeTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/ImageResizeModeTest.java
@@ -7,24 +7,14 @@ import static org.junit.jupiter.api.Assertions.assertThrows;
 
 import java.awt.Dimension;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
 /**
  * Unit tests of {@link ImageResizeMode} class.
  */
+@BasicPreferences
 class ImageResizeModeTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     final Dimension image = new Dimension(64, 48);
     final Dimension smallImage = new Dimension(14, 10);
 
diff --git a/test/unit/org/openstreetmap/josm/tools/KeyboardUtilsTest.java b/test/unit/org/openstreetmap/josm/tools/KeyboardUtilsTest.java
index d43f3eb52..fad3010c3 100644
--- a/test/unit/org/openstreetmap/josm/tools/KeyboardUtilsTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/KeyboardUtilsTest.java
@@ -13,22 +13,11 @@ import java.util.Map;
 import java.util.Map.Entry;
 
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
  * Unit tests of {@link KeyboardUtils} class.
  */
 class KeyboardUtilsTest {
-    /**
-     * Initializes test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules rules = new JOSMTestRules();
-
     /**
      * Checks that definition of extended characters is correct
      */
diff --git a/test/unit/org/openstreetmap/josm/tools/ListenableWeakReferenceTest.java b/test/unit/org/openstreetmap/josm/tools/ListenableWeakReferenceTest.java
index d144ab266..8e8580713 100644
--- a/test/unit/org/openstreetmap/josm/tools/ListenableWeakReferenceTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/ListenableWeakReferenceTest.java
@@ -7,11 +7,7 @@ import static org.junit.jupiter.api.Assertions.assertNull;
 import static org.junit.jupiter.api.Assertions.assertSame;
 import static org.junit.jupiter.api.Assertions.assertTrue;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
  * Tests for {@link ListenableWeakReference}
@@ -19,12 +15,6 @@ import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
  * @since 12181
  */
 class ListenableWeakReferenceTest {
-    /**
-     * Default test rules.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
     private Object object;
     private boolean called;
 
diff --git a/test/unit/org/openstreetmap/josm/tools/OptionParserTest.java b/test/unit/org/openstreetmap/josm/tools/OptionParserTest.java
index f027d64df..26101cc67 100644
--- a/test/unit/org/openstreetmap/josm/tools/OptionParserTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/OptionParserTest.java
@@ -3,8 +3,8 @@ package org.openstreetmap.josm.tools;
 
 import static org.junit.jupiter.api.Assertions.assertEquals;
 import static org.junit.jupiter.api.Assertions.assertFalse;
-import static org.junit.jupiter.api.Assertions.assertTrue;
 import static org.junit.jupiter.api.Assertions.assertThrows;
+import static org.junit.jupiter.api.Assertions.assertTrue;
 
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -12,26 +12,18 @@ import java.util.List;
 import java.util.concurrent.atomic.AtomicBoolean;
 import java.util.concurrent.atomic.AtomicReference;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.I18n;
 import org.openstreetmap.josm.tools.OptionParser.OptionCount;
 import org.openstreetmap.josm.tools.OptionParser.OptionParseException;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.jupiter.api.Test;
 
 /**
  * Test for {@link OptionParser}
  * @author Michael Zangl
  */
+@I18n
 class OptionParserTest {
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().i18n();
-
     // A reason for moving to jupiter...
     @Test
     void testEmptyParserRejectsLongopt() {
diff --git a/test/unit/org/openstreetmap/josm/tools/OsmUrlToBoundsTest.java b/test/unit/org/openstreetmap/josm/tools/OsmUrlToBoundsTest.java
index b10f15c5f..d5814771a 100644
--- a/test/unit/org/openstreetmap/josm/tools/OsmUrlToBoundsTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/OsmUrlToBoundsTest.java
@@ -1,26 +1,15 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.tools;
 
-import org.junit.Assert;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.data.Bounds;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.junit.Assert;
+import org.junit.jupiter.api.Test;
 
 /**
   * Unit tests of {@link OsmUrlToBounds} class.
 */
 class OsmUrlToBoundsTest {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     /**
      * Test for {@link OsmUrlToBounds#positionToBounds}.
      */
diff --git a/test/unit/org/openstreetmap/josm/tools/StreamUtilsTest.java b/test/unit/org/openstreetmap/josm/tools/StreamUtilsTest.java
index 671282b96..3451f16c9 100644
--- a/test/unit/org/openstreetmap/josm/tools/StreamUtilsTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/StreamUtilsTest.java
@@ -1,30 +1,18 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.tools;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
 import static org.junit.jupiter.api.Assertions.assertEquals;
 
 import java.util.Arrays;
 import java.util.stream.Collectors;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import net.trajano.commons.testing.UtilityClassTestUtil;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link StreamUtils} class.
  */
 class StreamUtilsTest {
-
-    /**
-     * Setup rule.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     /**
      * Tests that {@code StreamUtils} satisfies utility class criteria.
      * @throws ReflectiveOperationException if an error occurs
diff --git a/test/unit/org/openstreetmap/josm/tools/Tag2LinkTest.java b/test/unit/org/openstreetmap/josm/tools/Tag2LinkTest.java
index 125a0908f..6a30f0961 100644
--- a/test/unit/org/openstreetmap/josm/tools/Tag2LinkTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/Tag2LinkTest.java
@@ -6,15 +6,13 @@ import java.util.Arrays;
 import java.util.List;
 
 import org.junit.Assert;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
 /**
  * Test {@link Tag2Link}
  */
+@BasicPreferences
 class Tag2LinkTest {
 
     List<String> links = new ArrayList<>();
@@ -27,13 +25,6 @@ class Tag2LinkTest {
         Assert.assertEquals(Arrays.asList(expected), links);
     }
 
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Unit test of function {@link Tag2Link#initialize()}.
      */
diff --git a/test/unit/org/openstreetmap/josm/tools/TextTagParserTest.java b/test/unit/org/openstreetmap/josm/tools/TextTagParserTest.java
index 631f9a8cf..69dec1c47 100644
--- a/test/unit/org/openstreetmap/josm/tools/TextTagParserTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/TextTagParserTest.java
@@ -10,23 +10,15 @@ import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
 /**
  * Unit tests of {@link TextTagParser} class.
  */
+// Some of this depends on preferences
+@BasicPreferences
 class TextTagParserTest {
-    /**
-     * Some of this depends on preferences.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Test of {@link TextTagParser#unescape} method.
      */
diff --git a/test/unit/org/openstreetmap/josm/tools/UtilsTest.java b/test/unit/org/openstreetmap/josm/tools/UtilsTest.java
index 195aa2506..4260bdbc3 100644
--- a/test/unit/org/openstreetmap/josm/tools/UtilsTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/UtilsTest.java
@@ -21,24 +21,13 @@ import java.util.Map;
 import java.util.TreeMap;
 import java.util.regex.Pattern;
 
-import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 import net.trajano.commons.testing.UtilityClassTestUtil;
+import org.junit.jupiter.api.Test;
 
 /**
  * Unit tests of {@link Utils} class.
  */
 class UtilsTest {
-    /**
-     * Use default, basic test rules.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules rules = new JOSMTestRules();
-
     /**
      * Tests that {@code Utils} satisfies utility class criteria.
      * @throws ReflectiveOperationException if an error occurs
diff --git a/test/unit/org/openstreetmap/josm/tools/XmlUtilsTest.java b/test/unit/org/openstreetmap/josm/tools/XmlUtilsTest.java
index c126bb511..734072f0a 100644
--- a/test/unit/org/openstreetmap/josm/tools/XmlUtilsTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/XmlUtilsTest.java
@@ -1,40 +1,31 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.tools;
 
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-import org.junit.jupiter.api.extension.RegisterExtension;
-import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.TestUtils;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-import org.xml.sax.InputSource;
-import org.xml.sax.SAXException;
-import org.xml.sax.helpers.DefaultHandler;
+import static org.junit.jupiter.api.Assertions.assertEquals;
+import static org.junit.jupiter.api.Assertions.assertNotNull;
+import static org.junit.jupiter.api.Assertions.fail;
+
+import java.io.FileInputStream;
+import java.io.IOException;
+import java.io.StringWriter;
 
 import javax.xml.parsers.ParserConfigurationException;
 import javax.xml.transform.Transformer;
 import javax.xml.transform.TransformerException;
 import javax.xml.transform.stream.StreamResult;
 import javax.xml.transform.stream.StreamSource;
-import java.io.FileInputStream;
-import java.io.IOException;
-import java.io.StringWriter;
 
-import static org.junit.jupiter.api.Assertions.assertEquals;
-import static org.junit.jupiter.api.Assertions.assertNotNull;
-import static org.junit.jupiter.api.Assertions.fail;
+import org.openstreetmap.josm.TestUtils;
+
+import org.junit.jupiter.api.Test;
+import org.xml.sax.InputSource;
+import org.xml.sax.SAXException;
+import org.xml.sax.helpers.DefaultHandler;
 
 /**
  * Unit tests of {@link XmlUtils} class.
  */
 class XmlUtilsTest {
-
-    /**
-     * Use default, basic test rules.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules rules = new JOSMTestRules();
-
     private static final String EXPECTED = "External Entity: Failed to read external document 'passwd', " +
             "because 'file' access is not allowed due to restriction set by the accessExternalDTD property.";
 
diff --git a/test/unit/org/openstreetmap/josm/tools/bugreport/BugReportExceptionHandlerTest.java b/test/unit/org/openstreetmap/josm/tools/bugreport/BugReportExceptionHandlerTest.java
index 11fdc6443..ecc5c4069 100644
--- a/test/unit/org/openstreetmap/josm/tools/bugreport/BugReportExceptionHandlerTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/bugreport/BugReportExceptionHandlerTest.java
@@ -3,23 +3,12 @@ package org.openstreetmap.josm.tools.bugreport;
 
 import java.util.concurrent.CountDownLatch;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
  * Unit tests of {@link BugReportExceptionHandler} class.
  */
 class BugReportExceptionHandlerTest {
-    /**
-     * No dependencies
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules();
-
     /**
      * Unit test for {@link BugReportExceptionHandler#handleException} method.
      * @throws InterruptedException if the current thread is interrupted while waiting
diff --git a/test/unit/org/openstreetmap/josm/tools/bugreport/BugReportTest.java b/test/unit/org/openstreetmap/josm/tools/bugreport/BugReportTest.java
index adb3fecf9..fa183ba88 100644
--- a/test/unit/org/openstreetmap/josm/tools/bugreport/BugReportTest.java
+++ b/test/unit/org/openstreetmap/josm/tools/bugreport/BugReportTest.java
@@ -9,25 +9,17 @@ import java.io.IOException;
 import java.io.PrintWriter;
 import java.io.StringWriter;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.api.Test;
 import org.openstreetmap.josm.actions.ShowStatusReportAction;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
 /**
  * Tests the bug report class.
  * @author Michael Zangl
  */
+// Preferences for the report text
+@BasicPreferences
 class BugReportTest {
-    /**
-     * Preferences for the report text
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
-
     /**
      * Test {@link BugReport#getReportText}
      */
-- 
GitLab


From b73872f09993a675f56d388d8f3a15d8424eb090 Mon Sep 17 00:00:00 2001
From: Taylor Smock <tsmock@fb.com>
Date: Thu, 1 Jul 2021 17:04:43 -0600
Subject: [PATCH 2/2] JUnit5: Add missing JosmHome annotation

Signed-off-by: Taylor Smock <tsmock@fb.com>
---
 .../josm/testutils/annotations/JosmHome.java  | 70 +++++++++++++++++++
 1 file changed, 70 insertions(+)
 create mode 100644 test/unit/org/openstreetmap/josm/testutils/annotations/JosmHome.java

diff --git a/test/unit/org/openstreetmap/josm/testutils/annotations/JosmHome.java b/test/unit/org/openstreetmap/josm/testutils/annotations/JosmHome.java
new file mode 100644
index 000000000..1ac8f77a4
--- /dev/null
+++ b/test/unit/org/openstreetmap/josm/testutils/annotations/JosmHome.java
@@ -0,0 +1,70 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.testutils.annotations;
+
+import java.io.File;
+import java.io.IOException;
+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.nio.file.FileVisitResult;
+import java.nio.file.Files;
+import java.nio.file.Path;
+import java.nio.file.SimpleFileVisitor;
+import java.nio.file.attribute.BasicFileAttributes;
+import java.util.UUID;
+
+import org.junit.jupiter.api.extension.AfterAllCallback;
+import org.junit.jupiter.api.extension.BeforeAllCallback;
+import org.junit.jupiter.api.extension.ExtendWith;
+import org.junit.jupiter.api.extension.ExtensionContext;
+import org.junit.jupiter.api.extension.ExtensionContext.Namespace;
+import org.openstreetmap.josm.data.preferences.JosmBaseDirectories;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
+
+/**
+ * Use the JOSM home directory. See {@link JOSMTestRules}.
+ * Typically only used by {@link FullPreferences}.
+ *
+ * @author Taylor Smock
+ *
+ */
+@Documented
+@Retention(RetentionPolicy.RUNTIME)
+@Target(ElementType.TYPE)
+@ExtendWith(JosmHome.JosmHomeExtension.class)
+public @interface JosmHome {
+    /**
+     * Create a JOSM home directory. Prefer using {@link JosmHome}.
+     * @author Taylor Smock
+     */
+    class JosmHomeExtension implements BeforeAllCallback, AfterAllCallback {
+        @Override
+        public void afterAll(ExtensionContext context) throws Exception {
+            Path tempDir = context.getStore(Namespace.create(JosmHome.class)).get("home", Path.class);
+            Files.walkFileTree(tempDir, new SimpleFileVisitor<Path>() {
+                @Override
+                public FileVisitResult postVisitDirectory(Path dir, IOException exc) throws IOException {
+                    Files.delete(dir);
+                    return FileVisitResult.CONTINUE;
+                }
+
+                @Override
+                public FileVisitResult visitFile(Path file, BasicFileAttributes attrs) throws IOException {
+                    Files.delete(file);
+                    return FileVisitResult.CONTINUE;
+                }
+            });
+        }
+
+        @Override
+        public void beforeAll(ExtensionContext context) throws Exception {
+            Path tempDir = Files.createTempDirectory(UUID.randomUUID().toString());
+            context.getStore(Namespace.create(JosmHome.class)).put("home", tempDir);
+            File home = tempDir.toFile();
+            System.setProperty("josm.home", home.getAbsolutePath());
+            JosmBaseDirectories.getInstance().clearMemos();
+        }
+    }
+}
-- 
GitLab

