API change before 1.0 release: Reverse the argument order in DataStore.addListener/removeListener. The intent is to be consistent with similar methods elsewhere in SIS, which put the Class<T> argument first.
diff --git a/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/earthobservation/LandsatStore.java b/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/earthobservation/LandsatStore.java
index 37b8672..02bcaf6 100644
--- a/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/earthobservation/LandsatStore.java
+++ b/storage/sis-earth-observation/src/main/java/org/apache/sis/storage/earthobservation/LandsatStore.java
@@ -177,10 +177,10 @@
      * any listener specified for another kind of events will be ignored.
      */
     @Override
-    public <T extends StoreEvent> void addListener(StoreListener<? super T> listener, Class<T> eventType) {
+    public <T extends StoreEvent> void addListener(Class<T> eventType, StoreListener<? super T> listener) {
         // If an argument is null, we let the parent class throws (indirectly) NullArgumentException.
         if (listener == null || eventType == null || eventType.isAssignableFrom(WarningEvent.class)) {
-            super.addListener(listener, eventType);
+            super.addListener(eventType, listener);
         }
     }
 
diff --git a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTiffStore.java b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTiffStore.java
index ecbc331..d6e1b25 100644
--- a/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTiffStore.java
+++ b/storage/sis-geotiff/src/main/java/org/apache/sis/storage/geotiff/GeoTiffStore.java
@@ -347,10 +347,10 @@
      * any listener specified for another kind of events will be ignored.
      */
     @Override
-    public <T extends StoreEvent> void addListener(StoreListener<? super T> listener, Class<T> eventType) {
+    public <T extends StoreEvent> void addListener(Class<T> eventType, StoreListener<? super T> listener) {
         // If an argument is null, we let the parent class throws (indirectly) NullArgumentException.
         if (listener == null || eventType == null || eventType.isAssignableFrom(WarningEvent.class)) {
-            super.addListener(listener, eventType);
+            super.addListener(eventType, listener);
         }
     }
 
diff --git a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStore.java b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStore.java
index 9eed48a..6094911 100644
--- a/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStore.java
+++ b/storage/sis-netcdf/src/main/java/org/apache/sis/storage/netcdf/NetcdfStore.java
@@ -221,10 +221,10 @@
      * any listener specified for another kind of events will be ignored.
      */
     @Override
-    public <T extends StoreEvent> void addListener(StoreListener<? super T> listener, Class<T> eventType) {
+    public <T extends StoreEvent> void addListener(Class<T> eventType, StoreListener<? super T> listener) {
         // If an argument is null, we let the parent class throws (indirectly) NullArgumentException.
         if (listener == null || eventType == null || eventType.isAssignableFrom(WarningEvent.class)) {
-            super.addListener(listener, eventType);
+            super.addListener(eventType, listener);
         }
     }
 
diff --git a/storage/sis-sqlstore/src/main/java/org/apache/sis/storage/sql/SQLStore.java b/storage/sis-sqlstore/src/main/java/org/apache/sis/storage/sql/SQLStore.java
index 6ef63cf..83acbd3 100644
--- a/storage/sis-sqlstore/src/main/java/org/apache/sis/storage/sql/SQLStore.java
+++ b/storage/sis-sqlstore/src/main/java/org/apache/sis/storage/sql/SQLStore.java
@@ -262,10 +262,10 @@
      * any listener specified for another kind of events will be ignored.
      */
     @Override
-    public <T extends StoreEvent> void addListener(StoreListener<? super T> listener, Class<T> eventType) {
+    public <T extends StoreEvent> void addListener(Class<T> eventType, StoreListener<? super T> listener) {
         // If an argument is null, we let the parent class throws (indirectly) NullArgumentException.
         if (listener == null || eventType == null || eventType.isAssignableFrom(WarningEvent.class)) {
-            super.addListener(listener, eventType);
+            super.addListener(eventType, listener);
         }
     }
 
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AbstractResource.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AbstractResource.java
index e4fbc2d..40f2f50 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AbstractResource.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/AbstractResource.java
@@ -139,10 +139,10 @@
      * (at least the read-only ones) produce no change events.
      */
     @Override
-    public <T extends StoreEvent> void addListener(StoreListener<? super T> listener, Class<T> eventType) {
+    public <T extends StoreEvent> void addListener(Class<T> eventType, StoreListener<? super T> listener) {
         // If an argument is null, we let the parent class throws (indirectly) NullArgumentException.
         if (listener == null || eventType == null || eventType.isAssignableFrom(WarningEvent.class)) {
-            super.addListener(listener, eventType);
+            super.addListener(eventType, listener);
         }
     }
 }
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/URIDataStore.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/URIDataStore.java
index 7db0fbb..26525c3 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/URIDataStore.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/URIDataStore.java
@@ -273,10 +273,10 @@
      * (at least the read-only ones) produce no change events.
      */
     @Override
-    public <T extends StoreEvent> void addListener(StoreListener<? super T> listener, Class<T> eventType) {
+    public <T extends StoreEvent> void addListener(Class<T> eventType, StoreListener<? super T> listener) {
         // If an argument is null, we let the parent class throws (indirectly) NullArgumentException.
         if (listener == null || eventType == null || eventType.isAssignableFrom(WarningEvent.class)) {
-            super.addListener(listener, eventType);
+            super.addListener(eventType, listener);
         }
     }
 }
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/folder/Store.java b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/folder/Store.java
index 86582c1..eb9a6c0 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/folder/Store.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/internal/storage/folder/Store.java
@@ -409,10 +409,10 @@
      * any listener specified for another kind of events will be ignored.
      */
     @Override
-    public <T extends StoreEvent> void addListener(StoreListener<? super T> listener, Class<T> eventType) {
+    public <T extends StoreEvent> void addListener(Class<T> eventType, StoreListener<? super T> listener) {
         // If an argument is null, we let the parent class throws (indirectly) NullArgumentException.
         if (listener == null || eventType == null || eventType.isAssignableFrom(WarningEvent.class)) {
-            super.addListener(listener, eventType);
+            super.addListener(eventType, listener);
         }
     }
 
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStore.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStore.java
index d8bdffd..ab48a4d 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStore.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/DataStore.java
@@ -435,7 +435,7 @@
      * on individual resources of this data store.</p>
      *
      * <p>If this data store may produce events of the given type, then the given listener is kept by strong reference;
-     * it will not be garbage collected unless {@linkplain #removeListener(StoreListener, Class) explicitly removed}
+     * it will not be garbage collected unless {@linkplain #removeListener(Class, StoreListener) explicitly removed}
      * or unless this {@code DataStore} is itself garbage collected. However if the given type of events can never
      * happen with this data store, then this method is not required to keep a reference to the given listener.</p>
      *
@@ -446,14 +446,14 @@
      * warnings in its own way, for example by showing warnings in a widget.
      *
      * @param  <T>        compile-time value of the {@code eventType} argument.
-     * @param  listener   listener to notify about events.
      * @param  eventType  type of {@link StoreEvent} to listen (can not be {@code null}).
+     * @param  listener   listener to notify about events.
      *
      * @since 1.0
      */
     @Override
-    public <T extends StoreEvent> void addListener(StoreListener<? super T> listener, Class<T> eventType) {
-        listeners.addListener(listener, eventType);
+    public <T extends StoreEvent> void addListener(Class<T> eventType, StoreListener<? super T> listener) {
+        listeners.addListener(eventType, listener);
     }
 
     /**
@@ -463,8 +463,8 @@
      * children resources.
      *
      * <p>If the same listener has been registered many times for the same even type, then this method removes only
-     * the most recent registration. In other words if {@code addListener(ls, type)} has been invoked twice, then
-     * {@code removeListener(ls, type)} needs to be invoked twice in order to remove all instances of that listener.
+     * the most recent registration. In other words if {@code addListener(type, ls)} has been invoked twice, then
+     * {@code removeListener(type, ls)} needs to be invoked twice in order to remove all instances of that listener.
      * If the given listener is not found, then this method does nothing (no exception is thrown).</p>
      *
      * <div class="section">Warning events</div>
@@ -473,14 +473,14 @@
      * then this {@code DataStore} will send future warnings to the loggers.
      *
      * @param  <T>        compile-time value of the {@code eventType} argument.
-     * @param  listener   listener to stop notifying about events.
      * @param  eventType  type of {@link StoreEvent} which were listened (can not be {@code null}).
+     * @param  listener   listener to stop notifying about events.
      *
      * @since 1.0
      */
     @Override
-    public <T extends StoreEvent> void removeListener(StoreListener<? super T> listener, Class<T> eventType) {
-        listeners.removeListener(listener, eventType);
+    public <T extends StoreEvent> void removeListener(Class<T> eventType, StoreListener<? super T> listener) {
+        listeners.removeListener(eventType, listener);
     }
 
     /**
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/Resource.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/Resource.java
index 85a80f5..d5afc4a 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/Resource.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/Resource.java
@@ -145,7 +145,7 @@
      * on different resources in the same tree, for example a parent and its children.</p>
      *
      * <p>If this resource may produce events of the given type, then the given listener is kept by strong reference;
-     * it will not be garbage collected unless {@linkplain #removeListener(StoreListener, Class) explicitly removed}
+     * it will not be garbage collected unless {@linkplain #removeListener(Class, StoreListener) explicitly removed}
      * or unless this {@code Resource} is itself garbage collected. However if the given type of events can never
      * happen with this resource, then this method is not required to keep a reference to the given listener.</p>
      *
@@ -159,7 +159,7 @@
      * @param  listener   listener to notify about events.
      * @param  eventType  type of {@link StoreEvent} to listen (can not be {@code null}).
      */
-    <T extends StoreEvent> void addListener(StoreListener<? super T> listener, Class<T> eventType);
+    <T extends StoreEvent> void addListener(Class<T> eventType, StoreListener<? super T> listener);
 
     /**
      * Unregisters a listener previously added to this resource for the given type of events.
@@ -168,8 +168,8 @@
      * parent resources.
      *
      * <p>If the same listener has been registered many times for the same even type, then this method removes only
-     * the most recent registration. In other words if {@code addListener(ls, type)} has been invoked twice, then
-     * {@code removeListener(ls, type)} needs to be invoked twice in order to remove all instances of that listener.
+     * the most recent registration. In other words if {@code addListener(type, ls)} has been invoked twice, then
+     * {@code removeListener(type, ls)} needs to be invoked twice in order to remove all instances of that listener.
      * If the given listener is not found, then this method does nothing (no exception is thrown).</p>
      *
      * <div class="section">Warning events</div>
@@ -181,5 +181,5 @@
      * @param  listener   listener to stop notifying about events.
      * @param  eventType  type of {@link StoreEvent} which were listened (can not be {@code null}).
      */
-    <T extends StoreEvent> void removeListener(StoreListener<? super T> listener, Class<T> eventType);
+    <T extends StoreEvent> void removeListener(Class<T> eventType, StoreListener<? super T> listener);
 }
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/event/StoreListener.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/event/StoreListener.java
index 7d49d22..9be960b 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/event/StoreListener.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/event/StoreListener.java
@@ -28,7 +28,7 @@
  *
  * <p>{@link Resource} implementations are responsible for instantiating the most specific
  * {@code StoreEvent} subclass for the type of events. Then, all {@code StoreListener}s that
- * {@linkplain Resource#addListener(StoreListener, Class) declared an interest} for
+ * {@linkplain Resource#addListener(Class, StoreListener) declared an interest} for
  * {@code StoreEvent}s of that kind are notified, including listeners in parent resources.
  * Each listener is notified only once per event even if the listener is registered twice.</p>
  *
@@ -38,7 +38,7 @@
  * @param  <T>  the type of events of interest to this listener.
  *
  * @see StoreEvent
- * @see Resource#addListener(StoreListener, Class)
+ * @see Resource#addListener(Class, StoreListener)
  *
  * @since 1.0
  * @module
diff --git a/storage/sis-storage/src/main/java/org/apache/sis/storage/event/StoreListeners.java b/storage/sis-storage/src/main/java/org/apache/sis/storage/event/StoreListeners.java
index 2e18ac1..2eb6f12 100644
--- a/storage/sis-storage/src/main/java/org/apache/sis/storage/event/StoreListeners.java
+++ b/storage/sis-storage/src/main/java/org/apache/sis/storage/event/StoreListeners.java
@@ -531,13 +531,13 @@
      * warnings in its own way, for example by showing warnings in a widget.
      *
      * @param  <T>        compile-time value of the {@code eventType} argument.
-     * @param  listener   listener to notify about events.
      * @param  eventType  type of {@link StoreEvent} to listen (can not be {@code null}).
+     * @param  listener   listener to notify about events.
      *
-     * @see Resource#addListener(StoreListener, Class)
+     * @see Resource#addListener(Class, StoreListener)
      */
     @SuppressWarnings("unchecked")
-    public synchronized <T extends StoreEvent> void addListener(final StoreListener<? super T> listener, final Class<T> eventType) {
+    public synchronized <T extends StoreEvent> void addListener(final Class<T> eventType, final StoreListener<? super T> listener) {
         ArgumentChecks.ensureNonNull("listener",  listener);
         ArgumentChecks.ensureNonNull("eventType", eventType);
         ForType<T> ce = null;
@@ -561,8 +561,8 @@
      * parent manager.
      *
      * <p>If the same listener has been registered many times for the same even type, then this method removes only
-     * the most recent registration. In other words if {@code addListener(ls, type)} has been invoked twice, then
-     * {@code removeListener(ls, type)} needs to be invoked twice in order to remove all instances of that listener.
+     * the most recent registration. In other words if {@code addListener(type, ls)} has been invoked twice, then
+     * {@code removeListener(type, ls)} needs to be invoked twice in order to remove all instances of that listener.
      * If the given listener is not found, then this method does nothing (no exception is thrown).</p>
      *
      * <div class="section">Warning events</div>
@@ -571,13 +571,13 @@
      * to the loggers.
      *
      * @param  <T>        compile-time value of the {@code eventType} argument.
-     * @param  listener   listener to stop notifying about events.
      * @param  eventType  type of {@link StoreEvent} which were listened (can not be {@code null}).
+     * @param  listener   listener to stop notifying about events.
      *
-     * @see Resource#removeListener(StoreListener, Class)
+     * @see Resource#removeListener(Class, StoreListener)
      */
     @SuppressWarnings("unchecked")
-    public synchronized <T extends StoreEvent> void removeListener(StoreListener<? super T> listener, Class<T> eventType) {
+    public synchronized <T extends StoreEvent> void removeListener(Class<T> eventType, StoreListener<? super T> listener) {
         ArgumentChecks.ensureNonNull("listener",  listener);
         ArgumentChecks.ensureNonNull("eventType", eventType);
         for (ForType<?> e = listeners; e != null; e = e.next) {
diff --git a/storage/sis-storage/src/test/java/org/apache/sis/storage/event/StoreListenersTest.java b/storage/sis-storage/src/test/java/org/apache/sis/storage/event/StoreListenersTest.java
index 9185879..7d1fc6d 100644
--- a/storage/sis-storage/src/test/java/org/apache/sis/storage/event/StoreListenersTest.java
+++ b/storage/sis-storage/src/test/java/org/apache/sis/storage/event/StoreListenersTest.java
@@ -66,18 +66,18 @@
     }
 
     /**
-     * Tests {@link StoreListeners#addListener(StoreListener, Class)} followed by
-     * {@link StoreListeners#removeListener(StoreListener, Class)}.
+     * Tests {@link StoreListeners#addListener(Class, StoreListener)} followed by
+     * {@link StoreListeners#removeListener(Class, StoreListener)}.
      */
     @Test
     public void testAddAndRemoveStoreListener() {
         final StoreListeners listeners = store.listeners();
         assertFalse("hasListeners()", listeners.hasListeners(WarningEvent.class));
-        listeners.addListener(this, WarningEvent.class);
+        listeners.addListener(WarningEvent.class, this);
         assertTrue("hasListeners()", listeners.hasListeners(WarningEvent.class));
-        listeners.removeListener(this, WarningEvent.class);
+        listeners.removeListener(WarningEvent.class, this);
         assertFalse("hasListeners()", listeners.hasListeners(WarningEvent.class));
-        listeners.removeListener(this, WarningEvent.class);         // Should be no-op.
+        listeners.removeListener(WarningEvent.class, this);         // Should be no-op.
     }
 
     /**
@@ -87,7 +87,7 @@
     @DependsOnMethod("testAddAndRemoveStoreListener")
     public void testWarning() {
         final LogRecord record = new LogRecord(Level.WARNING, "The message");
-        store.addListener(this, WarningEvent.class);
+        store.addListener(WarningEvent.class, this);
         store.listeners().warning(record);
         assertSame(record, warning);
     }
@@ -99,7 +99,7 @@
     @Test
     @DependsOnMethod("testWarning")
     public void testWarningWithAutoSource() {
-        store.addListener(this, WarningEvent.class);
+        store.addListener(WarningEvent.class, this);
         store.simulateWarning("The message");
         assertNotNull("Listener has not been notified.", warning);
         assertEquals(DataStoreMock.class.getName(), warning.getSourceClassName());