Index: trunk/test/functional/org/openstreetmap/josm/data/BoundariesTestIT.java
===================================================================
--- trunk/test/functional/org/openstreetmap/josm/data/BoundariesTestIT.java	(revision 18856)
+++ trunk/test/functional/org/openstreetmap/josm/data/BoundariesTestIT.java	(revision 18870)
@@ -12,16 +12,14 @@
 
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.openstreetmap.josm.data.osm.DataSet;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.search.SearchCompiler;
 import org.openstreetmap.josm.io.OsmReader;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
 
 /**
  * Test of boundaries OSM file.
  */
+@BasicPreferences
 class BoundariesTestIT {
 
@@ -46,11 +44,4 @@
             "US-PR", "US-RI", "US-SC", "US-SD", "US-TN", "US-TX", "US-UM", "US-UT", "US-VT", "US-VA", "US-VI", "US-WA", "US-WV", "US-WI",
             "US-WY");
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences();
 
     /**
Index: trunk/test/functional/org/openstreetmap/josm/data/imagery/ImageryCompareTestIT.java
===================================================================
--- trunk/test/functional/org/openstreetmap/josm/data/imagery/ImageryCompareTestIT.java	(revision 18856)
+++ trunk/test/functional/org/openstreetmap/josm/data/imagery/ImageryCompareTestIT.java	(revision 18870)
@@ -7,10 +7,8 @@
 
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
+import org.junit.jupiter.api.Timeout;
 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.HttpClient;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
@@ -18,15 +16,10 @@
  * See <a href="https://josm.openstreetmap.de/wiki/ImageryCompare">JOSM wiki</a>
  */
+@BasicPreferences
+@Timeout(60)
 class ImageryCompareTestIT {
 
     private static final String BLACK_PREFIX = "<pre style=\"margin:3px;color:black\">";
     private static final String RED_PREFIX = "<pre style=\"margin:3px;color:red\">";
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences().timeout(60000);
 
     /**
Index: trunk/test/functional/org/openstreetmap/josm/data/osm/TaginfoTestIT.java
===================================================================
--- trunk/test/functional/org/openstreetmap/josm/data/osm/TaginfoTestIT.java	(revision 18856)
+++ trunk/test/functional/org/openstreetmap/josm/data/osm/TaginfoTestIT.java	(revision 18870)
@@ -10,4 +10,14 @@
 import java.util.List;
 
+import org.junit.jupiter.api.Test;
+import org.junit.jupiter.api.Timeout;
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.validation.tests.MapCSSTagChecker;
+import org.openstreetmap.josm.data.validation.tests.TagChecker;
+import org.openstreetmap.josm.gui.mappaint.mapcss.parsergen.ParseException;
+import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
+import org.openstreetmap.josm.tools.HttpClient;
+
 import jakarta.json.Json;
 import jakarta.json.JsonObject;
@@ -15,37 +25,17 @@
 import jakarta.json.JsonValue;
 
-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.validation.tests.MapCSSTagChecker;
-import org.openstreetmap.josm.data.validation.tests.TagChecker;
-import org.openstreetmap.josm.gui.mappaint.mapcss.parsergen.ParseException;
-import org.openstreetmap.josm.gui.tagging.presets.TaggingPresets;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
-import org.openstreetmap.josm.tools.HttpClient;
-import org.xml.sax.SAXException;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
-
 /**
  * Various integration tests with Taginfo.
  */
+@BasicPreferences
+@Timeout(20)
 class TaginfoTestIT {
-
-    /**
-     * Setup test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences().timeout(20000);
-
     /**
      * Checks that popular tags are known (i.e included in internal presets, or deprecated, or explicitely ignored)
-     * @throws SAXException if any XML parsing error occurs
      * @throws IOException if any I/O error occurs
      * @throws ParseException if any MapCSS parsing error occurs
      */
     @Test
-    void testCheckPopularTags() throws SAXException, IOException, ParseException {
+    void testCheckPopularTags() throws IOException, ParseException {
         TaggingPresets.readFromPreferences();
         new TagChecker().initialize();
Index: trunk/test/functional/org/openstreetmap/josm/gui/mappaint/MapCSSRendererTest.java
===================================================================
--- trunk/test/functional/org/openstreetmap/josm/gui/mappaint/MapCSSRendererTest.java	(revision 18856)
+++ trunk/test/functional/org/openstreetmap/josm/gui/mappaint/MapCSSRendererTest.java	(revision 18870)
@@ -28,5 +28,4 @@
 import javax.imageio.ImageIO;
 
-import org.junit.jupiter.api.extension.RegisterExtension;
 import org.junit.jupiter.params.ParameterizedTest;
 import org.junit.jupiter.params.provider.MethodSource;
@@ -40,9 +39,8 @@
 import org.openstreetmap.josm.io.IllegalDataException;
 import org.openstreetmap.josm.io.OsmReader;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
+import org.openstreetmap.josm.testutils.annotations.Projection;
 import org.openstreetmap.josm.tools.ColorHelper;
 import org.openstreetmap.josm.tools.Utils;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
@@ -52,4 +50,6 @@
  * @author Michael Zangl
  */
+@BasicPreferences
+@Projection
 public class MapCSSRendererTest {
     private static final String TEST_DATA_BASE = "/renderer/";
@@ -59,11 +59,4 @@
     private static final Bounds AREA_DEFAULT = new Bounds(0, 0, 1, 1);
     private static final int IMAGE_SIZE = 256;
-
-    /**
-     * Minimal test rules required
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().preferences().projection();
 
     // development flag - set to true in order to update all reference images
Index: trunk/test/functional/org/openstreetmap/josm/gui/mappaint/StyleCacheTest.java
===================================================================
--- trunk/test/functional/org/openstreetmap/josm/gui/mappaint/StyleCacheTest.java	(revision 18856)
+++ trunk/test/functional/org/openstreetmap/josm/gui/mappaint/StyleCacheTest.java	(revision 18870)
@@ -10,11 +10,13 @@
 import java.awt.image.BufferedImage;
 import java.io.File;
+import java.io.IOException;
 import java.io.InputStream;
 import java.util.IdentityHashMap;
 
 import org.junit.jupiter.api.AfterAll;
+import org.junit.jupiter.api.BeforeAll;
 import org.junit.jupiter.api.BeforeEach;
 import org.junit.jupiter.api.Test;
-import org.junit.jupiter.api.extension.RegisterExtension;
+import org.junit.jupiter.api.Timeout;
 import org.openstreetmap.josm.data.Bounds;
 import org.openstreetmap.josm.data.osm.DataSet;
@@ -27,13 +29,19 @@
 import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
 import org.openstreetmap.josm.io.Compression;
+import org.openstreetmap.josm.io.IllegalDataException;
 import org.openstreetmap.josm.io.OsmReader;
-import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.testutils.annotations.BasicPreferences;
+import org.openstreetmap.josm.testutils.annotations.Main;
+import org.openstreetmap.josm.testutils.annotations.Projection;
 import org.openstreetmap.josm.tools.Pair;
-
-import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
  * Test {@link StyleCache}.
  */
+@BasicPreferences
+@Main
+@org.openstreetmap.josm.testutils.annotations.MapPaintStyles
+@Projection
+@Timeout(60)
 class StyleCacheTest {
 
@@ -47,10 +55,11 @@
     private static DataSet dsCity2;
 
-    /**
-     * The test rules used for this test.
-     */
-    @RegisterExtension
-    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
-    public JOSMTestRules test = new JOSMTestRules().main().preferences().projection().mapStyles().timeout(60000);
+    @BeforeAll
+    static void beforeAll() throws IllegalDataException, IOException {
+        try (InputStream in = Compression.getUncompressedFileInputStream(new File("nodist/data/neubrandenburg.osm.bz2"))) {
+            dsCity = OsmReader.parseDataSet(in, NullProgressMonitor.INSTANCE);
+        }
+        dsCity2 = new DataSet(dsCity);
+    }
 
     /**
@@ -61,8 +70,4 @@
     public void load() throws Exception {
         img = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, BufferedImage.TYPE_INT_ARGB);
-        try (InputStream in = Compression.getUncompressedFileInputStream(new File("nodist/data/neubrandenburg.osm.bz2"))) {
-            dsCity = OsmReader.parseDataSet(in, NullProgressMonitor.INSTANCE);
-        }
-        dsCity2 = new DataSet(dsCity);
     }
 
@@ -97,9 +102,9 @@
      * Verifies, that the intern pool is not growing when repeatedly rendering the
      * same set of primitives (and clearing the calculated styles each time).
-     *
+     * <p>
      * If it grows, this is an indication that the {@code equals} and {@code hashCode}
      * implementation is broken and two identical objects are not recognized as equal
      * or produce different hash codes.
-     *
+     * <p>
      * The opposite problem (different objects are mistaken as equal) has more visible
      * consequences for the user (wrong rendering on the map) and is not recognized by
@@ -135,5 +140,5 @@
      * Verifies, that the number of {@code StyleElementList} instances stored
      * for all the rendered primitives is actually low (as intended).
-     *
+     * <p>
      * Two primitives with the same style should share one {@code StyleElementList}
      * instance for the cached style elements. This is verified by counting all
