Index: trunk/src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 3470)
+++ trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 3471)
@@ -279,9 +279,9 @@
             boolean success = false;
             if (primitive instanceof Node) {
-                success = nodes.remove((Node) primitive);
+                success = nodes.remove(primitive);
             } else if (primitive instanceof Way) {
-                success = ways.remove((Way) primitive);
+                success = ways.remove(primitive);
             } else if (primitive instanceof Relation) {
-                success = relations.remove((Relation) primitive);
+                success = relations.remove(primitive);
             }
             if (!success)
@@ -436,5 +436,5 @@
             selectedPrimitives = new LinkedHashSet<OsmPrimitive>();
             changed = addSelected(selection, false)
-                            || (!wasEmpty && selectedPrimitives.isEmpty());
+            || (!wasEmpty && selectedPrimitives.isEmpty());
             if (changed) {
                 selectionSnapshot = null;
Index: trunk/src/org/openstreetmap/josm/data/osm/FilterWorker.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/FilterWorker.java	(revision 3470)
+++ trunk/src/org/openstreetmap/josm/data/osm/FilterWorker.java	(revision 3471)
@@ -32,5 +32,7 @@
      * (but hides them only if they are not used by any unfiltered way).
      */
-    public static void executeFilters(Collection<OsmPrimitive> all, FilterMatcher filterMatcher) {
+    public static boolean executeFilters(Collection<OsmPrimitive> all, FilterMatcher filterMatcher) {
+
+        boolean changed = false;
 
         // First relation and ways
@@ -38,9 +40,9 @@
             if (!(primitive instanceof Node)) {
                 if (filterMatcher.isHidden(primitive)) {
-                    primitive.setDisabledState(true);
+                    changed = changed | primitive.setDisabledState(true);
                 } else if (filterMatcher.isDisabled(primitive)) {
-                    primitive.setDisabledState(false);
+                    changed = changed | primitive.setDisabledState(false);
                 } else {
-                    primitive.unsetDisabledState();
+                    changed = changed | primitive.unsetDisabledState();
                 }
             }
@@ -51,25 +53,26 @@
             if (primitive instanceof Node) {
                 if (filterMatcher.isHidden(primitive)) {
-                    primitive.setDisabledState(true);
+                    changed = changed | primitive.setDisabledState(true);
                 } else if (filterMatcher.isDisabled(primitive)) {
-                    primitive.setDisabledState(false);
+                    changed = changed | primitive.setDisabledState(false);
                 } else {
-                    primitive.unsetDisabledState();
+                    changed = changed | primitive.unsetDisabledState();
                 }
             }
         }
+
+        return changed;
     }
 
     public static boolean executeFilters(OsmPrimitive primitive, FilterMatcher filterMatcher) {
-        boolean hidden = primitive.isDisabledAndHidden();
-        boolean disabled = primitive.isDisabled();
+        boolean changed = false;
         if (filterMatcher.isHidden(primitive)) {
-            primitive.setDisabledState(true);
+            changed = changed | primitive.setDisabledState(true);
         } else if (filterMatcher.isDisabled(primitive)) {
-            primitive.setDisabledState(false);
+            changed = changed | primitive.setDisabledState(false);
         } else {
-            primitive.unsetDisabledState();
+            changed = changed | primitive.unsetDisabledState();
         }
-        return hidden != primitive.isDisabledAndHidden() || disabled != primitive.isDisabled();
+        return changed;
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 3470)
+++ trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 3471)
@@ -617,9 +617,11 @@
      *             just shown in gray color.
      */
-    public void setDisabledState(boolean hide) {
+    public boolean setDisabledState(boolean hide) {
         boolean locked = writeLock();
         try {
+            int oldFlags = flags;
             updateFlagsNoLock(FLAG_DISABLED, true);
             updateFlagsNoLock(FLAG_HIDE_IF_DISABLED, hide);
+            return oldFlags != flags;
         } finally {
             writeUnlock(locked);
@@ -632,6 +634,13 @@
      * again.
      */
-    public void unsetDisabledState() {
-        updateFlags(FLAG_DISABLED + FLAG_HIDE_IF_DISABLED, false);
+    public boolean unsetDisabledState() {
+        boolean locked = writeLock();
+        try {
+            int oldFlags = flags;
+            updateFlagsNoLock(FLAG_DISABLED + FLAG_HIDE_IF_DISABLED, false);
+            return oldFlags != flags;
+        } finally {
+            writeUnlock(locked);
+        }
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java	(revision 3470)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/FilterTableModel.java	(revision 3471)
@@ -64,7 +64,9 @@
     public void executeFilters() {
         DataSet ds = Main.main.getCurrentDataSet();
+        boolean changed = false;
         if (ds == null) {
             disabledAndHiddenCount = 0;
             disabledCount = 0;
+            changed = true;
         } else {
             final Collection<OsmPrimitive> deselect = new HashSet<OsmPrimitive>();
@@ -75,5 +77,5 @@
                 final Collection<OsmPrimitive> all = ds.allNonDeletedCompletePrimitives();
 
-                FilterWorker.executeFilters(all, filterMatcher);
+                changed = FilterWorker.executeFilters(all, filterMatcher);
 
                 disabledCount = 0;
@@ -101,5 +103,5 @@
         }
 
-        if (Main.isDisplayingMapView()) {
+        if (Main.isDisplayingMapView() && changed) {
             Main.map.mapView.repaint();
             Main.map.filterDialog.updateDialogHeader();
