Index: trunk/src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 14205)
+++ trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 14206)
@@ -42,4 +42,5 @@
 import org.openstreetmap.josm.data.osm.event.DataChangedEvent;
 import org.openstreetmap.josm.data.osm.event.DataSetListener;
+import org.openstreetmap.josm.data.osm.event.FilterChangedEvent;
 import org.openstreetmap.josm.data.osm.event.NodeMovedEvent;
 import org.openstreetmap.josm.data.osm.event.PrimitiveFlagsChangedEvent;
@@ -1030,5 +1031,5 @@
 
     void fireFilterChanged() {
-        fireEvent(new DataChangedEvent(this));
+        fireEvent(new FilterChangedEvent(this));
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/FilterMatcher.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/FilterMatcher.java	(revision 14205)
+++ trunk/src/org/openstreetmap/josm/data/osm/FilterMatcher.java	(revision 14206)
@@ -114,4 +114,13 @@
 
     /**
+     * Determines if at least one filter is enabled.
+     * @return {@code true} if at least one filter is enabled
+     * @since 14206
+     */
+    public boolean hasFilters() {
+        return !hiddenFilters.isEmpty() || !disabledFilters.isEmpty();
+    }
+
+    /**
      * Adds a filter to the currently used filters
      * @param filter the filter to add
Index: trunk/src/org/openstreetmap/josm/data/osm/FilterModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/FilterModel.java	(revision 14205)
+++ trunk/src/org/openstreetmap/josm/data/osm/FilterModel.java	(revision 14206)
@@ -373,4 +373,13 @@
 
     /**
+     * Determines if at least one filter is enabled.
+     * @return {@code true} if at least one filter is enabled
+     * @since 14206
+     */
+    public boolean hasFilters() {
+        return filterMatcher.hasFilters();
+    }
+
+    /**
      * Returns the list of primitives whose filtering can be affected by change in primitive
      * @param primitives list of primitives to check
Index: trunk/src/org/openstreetmap/josm/data/osm/event/AbstractDatasetChangedEvent.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/event/AbstractDatasetChangedEvent.java	(revision 14205)
+++ trunk/src/org/openstreetmap/josm/data/osm/event/AbstractDatasetChangedEvent.java	(revision 14206)
@@ -49,4 +49,8 @@
          */
         CHANGESET_ID_CHANGED,
+        /**
+         * The filtered state changed for a list of primitives
+         */
+        FILTERS_CHANGED,
         /**
          * The flags changed for a primitive and have not been covered in an other event
Index: trunk/src/org/openstreetmap/josm/data/osm/event/FilterChangedEvent.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/event/FilterChangedEvent.java	(revision 14206)
+++ trunk/src/org/openstreetmap/josm/data/osm/event/FilterChangedEvent.java	(revision 14206)
@@ -0,0 +1,38 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm.event;
+
+import java.util.Collection;
+import java.util.Collections;
+
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+
+/**
+ * Represents a change of primitive filter flags.
+ * @since 14206
+ */
+public class FilterChangedEvent extends AbstractDatasetChangedEvent {
+
+    /**
+     * Constructs a new {@code FilterChangedEvent}.
+     * @param dataSet the dataset from which the event comes from
+     */
+    public FilterChangedEvent(DataSet dataSet) {
+        super(dataSet);
+    }
+
+    @Override
+    public void fire(DataSetListener listener) {
+        listener.otherDatasetChange(this);
+    }
+
+    @Override
+    public Collection<? extends OsmPrimitive> getPrimitives() {
+        return Collections.emptyList();
+    }
+
+    @Override
+    public DatasetEventType getType() {
+        return DatasetEventType.FILTERS_CHANGED;
+    }
+}
Index: trunk/src/org/openstreetmap/josm/gui/autofilter/AutoFilterButton.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/autofilter/AutoFilterButton.java	(revision 14205)
+++ trunk/src/org/openstreetmap/josm/gui/autofilter/AutoFilterButton.java	(revision 14206)
@@ -36,5 +36,5 @@
                 if (filter.equals(afm.getCurrentAutoFilter())) {
                     afm.setCurrentAutoFilter(null);
-                    MainApplication.getMap().filterDialog.getFilterModel().executeFilters();
+                    MainApplication.getMap().filterDialog.getFilterModel().executeFilters(true);
                 } else {
                     afm.setCurrentAutoFilter(filter);
Index: trunk/src/org/openstreetmap/josm/gui/autofilter/AutoFilterManager.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/autofilter/AutoFilterManager.java	(revision 14205)
+++ trunk/src/org/openstreetmap/josm/gui/autofilter/AutoFilterManager.java	(revision 14206)
@@ -394,5 +394,5 @@
         MapFrame map = MainApplication.getMap();
         if (map != null) {
-            map.filterDialog.getFilterModel().executeFilters();
+            map.filterDialog.getFilterModel().executeFilters(true);
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java	(revision 14205)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/FilterDialog.java	(revision 14206)
@@ -30,4 +30,5 @@
 import org.openstreetmap.josm.data.osm.FilterModel;
 import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
+import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent.DatasetEventType;
 import org.openstreetmap.josm.data.osm.event.DataChangedEvent;
 import org.openstreetmap.josm.data.osm.event.DataSetListener;
@@ -83,5 +84,5 @@
         DatasetEventManager.getInstance().addDatasetListener(this, FireMode.IN_EDT_CONSOLIDATED);
         MapFrame.addMapModeChangeListener(this);
-        filterModel.executeFilters();
+        filterModel.executeFilters(true);
     }
 
@@ -326,5 +327,7 @@
     @Override
     public void otherDatasetChange(AbstractDatasetChangedEvent event) {
-        filterModel.executeFilters();
+        if (!DatasetEventType.FILTERS_CHANGED.equals(event.getType())) {
+            filterModel.executeFilters();
+        }
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java	(revision 14205)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java	(revision 14206)
@@ -63,12 +63,29 @@
     private void updateFilters() {
         AutoFilterManager.getInstance().setCurrentAutoFilter(null);
-        executeFilters();
-    }
-
-    /**
-     * Runs the filters on the current edit data set.
+        executeFilters(true);
+    }
+
+    /**
+     * Runs the filters on the current edit data set, if any. Does nothing if no filter is enabled.
      */
     public void executeFilters() {
-        if (AutoFilterManager.getInstance().getCurrentAutoFilter() == null) {
+        executeFilters(false);
+    }
+
+    /**
+     * Runs the filter on a list of primitives that are part of the edit data set, if any. Does nothing if no filter is enabled.
+     * @param primitives The primitives
+     */
+    public void executeFilters(Collection<? extends OsmPrimitive> primitives) {
+        executeFilters(primitives, false);
+    }
+
+    /**
+     * Runs the filters on the current edit data set, if any.
+     * @param force force execution of filters even if no filter is enabled. Useful to reset state after change of filters
+     * @since 14206
+     */
+    public void executeFilters(boolean force) {
+        if (AutoFilterManager.getInstance().getCurrentAutoFilter() == null && (force || model.hasFilters())) {
             model.executeFilters();
             updateMap();
@@ -77,9 +94,11 @@
 
     /**
-     * Runs the filter on a list of primitives that are part of the edit data set.
+     * Runs the filter on a list of primitives that are part of the edit data set, if any.
+     * @param force force execution of filters even if no filter is enabled. Useful to reset state after change of filters
      * @param primitives The primitives
-     */
-    public void executeFilters(Collection<? extends OsmPrimitive> primitives) {
-        if (AutoFilterManager.getInstance().getCurrentAutoFilter() == null) {
+     * @since 14206
+     */
+    public void executeFilters(Collection<? extends OsmPrimitive> primitives, boolean force) {
+        if (AutoFilterManager.getInstance().getCurrentAutoFilter() == null && (force || model.hasFilters())) {
             model.executeFilters(primitives);
             updateMap();
