Index: trunk/src/org/openstreetmap/josm/data/osm/ChangesetCache.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/ChangesetCache.java	(revision 12746)
+++ trunk/src/org/openstreetmap/josm/data/osm/ChangesetCache.java	(revision 12747)
@@ -42,5 +42,5 @@
     private final Map<Integer, Changeset> cache = new HashMap<>();
 
-    private final CopyOnWriteArrayList<ChangesetCacheListener> listeners = new CopyOnWriteArrayList<>();
+    final CopyOnWriteArrayList<ChangesetCacheListener> listeners = new CopyOnWriteArrayList<>();
 
     /**
Index: trunk/test/unit/org/openstreetmap/josm/data/UserIdentityManagerTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/UserIdentityManagerTest.java	(revision 12746)
+++ trunk/test/unit/org/openstreetmap/josm/data/UserIdentityManagerTest.java	(revision 12747)
@@ -9,10 +9,12 @@
 import static org.junit.Assert.assertTrue;
 
-import org.junit.BeforeClass;
+import org.junit.Rule;
 import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.User;
 import org.openstreetmap.josm.data.osm.UserInfo;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
@@ -24,8 +26,7 @@
      * Setup test.
      */
-    @BeforeClass
-    public static void initTestCase() {
-        JOSMFixture.createUnitTestFixture().init();
-    }
+    @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
+    public JOSMTestRules test = new JOSMTestRules().preferences();
 
     private static UserInfo newUserInfo() {
Index: trunk/test/unit/org/openstreetmap/josm/data/osm/ChangesetCacheTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/osm/ChangesetCacheTest.java	(revision 12746)
+++ trunk/test/unit/org/openstreetmap/josm/data/osm/ChangesetCacheTest.java	(revision 12747)
@@ -10,10 +10,16 @@
 import java.util.Collection;
 import java.util.Collections;
-import java.util.List;
+import java.util.concurrent.CountDownLatch;
+import java.util.concurrent.TimeUnit;
 
 import org.junit.After;
+import org.junit.Before;
+import org.junit.Rule;
 import org.junit.Test;
-import org.openstreetmap.josm.TestUtils;
 import org.openstreetmap.josm.data.UserIdentityManager;
+import org.openstreetmap.josm.testutils.JOSMTestRules;
+import org.openstreetmap.josm.tools.Logging;
+
+import edu.umd.cs.findbugs.annotations.SuppressFBWarnings;
 
 /**
@@ -23,9 +29,42 @@
 
     /**
-     * Clears cache after each unit test.
+     * Setup test.
+     */
+    @Rule
+    @SuppressFBWarnings(value = "URF_UNREAD_PUBLIC_OR_PROTECTED_FIELD")
+    public JOSMTestRules test = new JOSMTestRules();
+
+    private static final ChangesetCache cache = ChangesetCache.getInstance();
+
+    /**
+     * Clears cache before/after each unit test.
      */
     @After
-    public void after() {
-        ChangesetCache.getInstance().clear();
+    @Before
+    public void clearCache() {
+        cache.listeners.clear();
+        cache.clear();
+    }
+
+    abstract class TestListener implements ChangesetCacheListener {
+
+        protected final CountDownLatch latch = new CountDownLatch(1);
+        protected ChangesetCacheEvent event;
+
+        @Override
+        public void changesetCacheUpdated(ChangesetCacheEvent event) {
+            this.event = event;
+            latch.countDown();
+        }
+
+        protected final void await() {
+            try {
+                latch.await(2, TimeUnit.SECONDS);
+            } catch (InterruptedException e) {
+                Logging.error(e);
+            }
+        }
+
+        abstract void test();
     }
 
@@ -38,14 +77,6 @@
     }
 
-    @SuppressWarnings("unchecked")
-    private static List<ChangesetCacheListener> getListeners(ChangesetCache cache) throws ReflectiveOperationException {
-        return (List<ChangesetCacheListener>) TestUtils.getPrivateField(cache, "listeners");
-    }
-
-    @Test
-    public void testAddAndRemoveListeners() throws ReflectiveOperationException {
-        ChangesetCache cache = ChangesetCache.getInstance();
-        cache.clear();
-
+    @Test
+    public void testAddAndRemoveListeners() {
         // should work
         cache.addChangesetCacheListener(null);
@@ -59,17 +90,14 @@
         // adding a second time - should work too
         cache.addChangesetCacheListener(listener);
-        assertEquals(1, getListeners(cache).size()); // ... but only added once
+        assertEquals(1, cache.listeners.size()); // ... but only added once
 
         cache.removeChangesetCacheListener(null);
 
         cache.removeChangesetCacheListener(listener);
-        assertTrue(getListeners(cache).isEmpty());
+        assertTrue(cache.listeners.isEmpty());
     }
 
     @Test
     public void testUpdateGetRemoveCycle() {
-        ChangesetCache cache = ChangesetCache.getInstance();
-        cache.clear();
-
         cache.update(new Changeset(1));
         assertEquals(1, cache.size());
@@ -82,7 +110,4 @@
     @Test
     public void testUpdateTwice() {
-        ChangesetCache cache = ChangesetCache.getInstance();
-        cache.clear();
-
         Changeset cs = new Changeset(1);
         cs.setIncomplete(false);
@@ -107,9 +132,5 @@
 
     @Test
-    public void testContains() throws ReflectiveOperationException {
-        ChangesetCache cache = ChangesetCache.getInstance();
-        getListeners(cache).clear();
-        cache.clear();
-
+    public void testContains() {
         Changeset cs = new Changeset(1);
         cache.update(cs);
@@ -125,13 +146,9 @@
 
     @Test
-    public void testFireingEventsAddAChangeset() throws ReflectiveOperationException {
-        ChangesetCache cache = ChangesetCache.getInstance();
-        cache.clear();
-        getListeners(cache).clear();
-
-        // should work
-        ChangesetCacheListener listener = new ChangesetCacheListener() {
-            @Override
-            public void changesetCacheUpdated(ChangesetCacheEvent event) {
+    public void testFireingEventsAddAChangeset() {
+        TestListener listener = new TestListener() {
+            @Override
+            public void test() {
+                await();
                 assertNotNull(event);
                 assertEquals(1, event.getAddedChangesets().size());
@@ -143,17 +160,14 @@
         cache.addChangesetCacheListener(listener);
         cache.update(new Changeset(1));
+        listener.test();
         cache.removeChangesetCacheListener(listener);
     }
 
     @Test
-    public void testFireingEventsUpdateChangeset() throws ReflectiveOperationException {
-        ChangesetCache cache = ChangesetCache.getInstance();
-        cache.clear();
-        getListeners(cache).clear();
-
-        // should work
-        ChangesetCacheListener listener = new ChangesetCacheListener() {
-            @Override
-            public void changesetCacheUpdated(ChangesetCacheEvent event) {
+    public void testFireingEventsUpdateChangeset() {
+        TestListener listener = new TestListener() {
+            @Override
+            void test() {
+                await();
                 assertNotNull(event);
                 assertTrue(event.getAddedChangesets().isEmpty());
@@ -163,21 +177,31 @@
             }
         };
+        Changeset cs = new Changeset(1);
+        cache.update(cs);
+
+        cache.addChangesetCacheListener(listener);
+        cache.update(cs);
+        listener.test();
+        cache.removeChangesetCacheListener(listener);
+    }
+
+    @Test
+    public void testFireingEventsRemoveChangeset() {
+        // Waiter listener to ensure the second listener does not receive the first event
+        TestListener waiter = new TestListener() {
+            @Override
+            void test() {
+                await();
+            }
+        };
+        cache.addChangesetCacheListener(waiter);
         cache.update(new Changeset(1));
-
-        cache.addChangesetCacheListener(listener);
-        cache.update(new Changeset(1));
-        cache.removeChangesetCacheListener(listener);
-    }
-
-    @Test
-    public void testFireingEventsRemoveChangeset() throws ReflectiveOperationException {
-        ChangesetCache cache = ChangesetCache.getInstance();
-        cache.clear();
-        getListeners(cache).clear();
-
-        // should work
-        ChangesetCacheListener listener = new ChangesetCacheListener() {
-            @Override
-            public void changesetCacheUpdated(ChangesetCacheEvent event) {
+        waiter.test();
+        cache.removeChangesetCacheListener(waiter);
+
+        TestListener listener = new TestListener() {
+            @Override
+            void test() {
+                await();
                 assertNotNull(event);
                 assertTrue(event.getAddedChangesets().isEmpty());
@@ -187,8 +211,7 @@
             }
         };
-        cache.update(new Changeset(1));
-
         cache.addChangesetCacheListener(listener);
         cache.remove(1);
+        listener.test();
         cache.removeChangesetCacheListener(listener);
     }
@@ -199,5 +222,4 @@
     @Test
     public void testGetOpenChangesets() {
-        final ChangesetCache cache = ChangesetCache.getInstance();
         // empty cache => empty list
         assertTrue(
@@ -236,5 +258,4 @@
     @Test
     public void testGetOpenChangesetsForCurrentUser() {
-        final ChangesetCache cache = ChangesetCache.getInstance();
         // empty cache => empty list
         assertTrue(
@@ -271,5 +292,4 @@
     @Test
     public void testRemove() {
-        final ChangesetCache cache = ChangesetCache.getInstance();
         Changeset cs1 = new Changeset(1);
         cache.update(cs1);
Index: trunk/test/unit/org/openstreetmap/josm/testutils/JOSMTestRules.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/testutils/JOSMTestRules.java	(revision 12746)
+++ trunk/test/unit/org/openstreetmap/josm/testutils/JOSMTestRules.java	(revision 12747)
@@ -15,4 +15,5 @@
 import org.openstreetmap.josm.JOSMFixture;
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.UserIdentityManager;
 import org.openstreetmap.josm.data.osm.event.SelectionEventManager;
 import org.openstreetmap.josm.data.projection.Projections;
@@ -264,4 +265,6 @@
         // Set log level to info
         Logging.setLogLevel(Logging.LEVEL_INFO);
+        // Assume anonymous user
+        UserIdentityManager.getInstance().setAnonymous();
 
         // Set up i18n
