Index: trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 3397)
+++ trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 3398)
@@ -1511,9 +1511,10 @@
             builder.append("D");
         }
-        if (isFiltered()) {
-            builder.append("f");
-        }
         if (isDisabled()) {
-            builder.append("d");
+            if (isDisabledAndHidden()) {
+                builder.append("h");
+            } else {
+                builder.append("d");
+            }
         }
         if (isTagged()) {
Index: trunk/src/org/openstreetmap/josm/data/osm/Storage.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Storage.java	(revision 3397)
+++ trunk/src/org/openstreetmap/josm/data/osm/Storage.java	(revision 3398)
@@ -88,5 +88,5 @@
 public class Storage<T> extends AbstractSet<T> {
     private final Hash<? super T,? super T> hash;
-    private Object[] data;
+    private T[] data;
     private int mask;
     private int size;
@@ -111,5 +111,5 @@
         this.hash = ha;
         int cap = 1 << (int)(Math.ceil(Math.log(capacity/loadFactor) / Math.log(2)));
-        data = new Object[cap];
+        data = (T[]) new Object[cap];
         mask = data.length - 1;
         this.safeIterator = safeIterator;
@@ -118,5 +118,5 @@
     private void copyArray() {
         if (arrayCopyNecessary) {
-            Object[] newData = new Object[data.length];
+            T[] newData = (T[]) new Object[data.length];
             System.arraycopy(data, 0, newData, 0, data.length);
             data = newData;
@@ -141,20 +141,24 @@
     }
 
-    public synchronized @Override boolean contains(Object o) {
+    @Override
+    public synchronized boolean contains(Object o) {
         int bucket = getBucket(hash, (T)o);
         return bucket >= 0;
     }
 
-    public synchronized @Override boolean add(T t) {
+    @Override 
+    public synchronized boolean add(T t) {
         T orig = putUnique(t);
         return orig == t;
     }
 
-    public synchronized @Override boolean remove(Object o) {
+    @Override
+    public synchronized boolean remove(Object o) {
         T orig = removeElem((T)o);
         return orig != null;
     }
-
-    public synchronized @Override void clear() {
+    
+    @Override
+    public synchronized void clear() {
         copyArray();
         modCount++;
@@ -165,5 +169,6 @@
     }
 
-    public synchronized @Override int hashCode() {
+    @Override
+    public synchronized int hashCode() {
         int h = 0;
         for (T t : this) {
@@ -187,5 +192,5 @@
         }
 
-        T old = (T)data[bucket];
+        T old = data[bucket];
         data[bucket] = t;
 
@@ -195,5 +200,5 @@
     public synchronized T get(T t) {
         int bucket = getBucket(hash, t);
-        return bucket < 0 ? null : (T)data[bucket];
+        return bucket < 0 ? null : data[bucket];
     }
 
@@ -211,5 +216,5 @@
         }
 
-        return (T)data[bucket];
+        return data[bucket];
     }
 
@@ -222,5 +227,5 @@
 
     public <K> Map<K,T> foreignKey(Hash<K,? super T> h) {
-        return new FMap(h);
+        return new FMap<K>(h);
     }
 
@@ -246,5 +251,5 @@
         int hcode = rehash(ha.getHashCode(key));
         int bucket = hcode & mask;
-        while ((entry = (T)data[bucket]) != null) {
+        while ((entry = data[bucket]) != null) {
             if (ha.equals(key, entry))
                 return bucket;
@@ -255,5 +260,5 @@
 
     private T doRemove(int slot) {
-        T t = (T)data[slot];
+        T t = data[slot];
         assert t != null;
 
@@ -267,5 +272,5 @@
         T entry;
 
-        while ((entry = (T)data[bucket]) != null) {
+        while ((entry = data[bucket]) != null) {
             int right = rehash(hash.getHashCode(entry)) & mask;
             // if the entry should be in <hole+1,bucket-1> (circular-wise)
@@ -287,12 +292,12 @@
     private void ensureSpace() {
         if (size > data.length*loadFactor) { // rehash
-            Object[] big = new Object[data.length * 2];
+            T[] big = (T[]) new Object[data.length * 2];
             int nMask = big.length - 1;
 
-            for (Object o : data) {
+            for (T o : data) {
                 if (o == null) {
                     continue;
                 }
-                int bucket = rehash(hash.getHashCode((T)o)) & nMask;
+                int bucket = rehash(hash.getHashCode(o)) & nMask;
                 while (big[bucket] != null) {
                     bucket = (bucket+1) & nMask;
@@ -361,5 +366,5 @@
         public T get(Object key) {
             int bucket = getBucket(fHash, (K)key);
-            return bucket < 0 ? null : (T)data[bucket];
+            return bucket < 0 ? null : data[bucket];
         }
 
@@ -404,8 +409,8 @@
 
     private final class SafeReadonlyIter implements Iterator<T> {
-        final Object[] data;
+        final T[] data;
         int slot = 0;
 
-        SafeReadonlyIter(Object[] data) {
+        SafeReadonlyIter(T[] data) {
             this.data = data;
         }
@@ -418,5 +423,5 @@
         public T next() {
             if (!hasNext()) throw new NoSuchElementException();
-            return (T)data[slot++];
+            return data[slot++];
         }
 
@@ -450,5 +455,5 @@
             if (!hasNext()) throw new NoSuchElementException();
             removeSlot = slot;
-            return (T)data[slot++];
+            return data[slot++];
         }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapPainter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapPainter.java	(revision 3397)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapPainter.java	(revision 3398)
@@ -310,5 +310,5 @@
             GeneralPath path = new GeneralPath();
             for (Way osm: ways){
-                if (osm.isUsable() && !osm.isFiltered() && !osm.isDisabled()) {
+                if (osm.isUsable() && !osm.isDisabled()) {
                     visitVirtual(path, osm);
                 }
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/SimplePaintVisitor.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/SimplePaintVisitor.java	(revision 3397)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/SimplePaintVisitor.java	(revision 3398)
@@ -155,5 +155,5 @@
         //profilerN = 0;
         for (final OsmPrimitive osm: data.searchRelations(bbox)) {
-            if (!osm.isDeleted() && !ds.isSelected(osm) && !osm.isFiltered()) {
+            if (!osm.isDeleted() && !ds.isSelected(osm) && !osm.isDisabledAndHidden()) {
                 osm.visit(this);
                 //        profilerN++;
@@ -169,5 +169,5 @@
         //profilerN = 0;
         for (final OsmPrimitive osm:data.searchWays(bbox)){
-            if (!osm.isDeleted() && !ds.isSelected(osm) && !osm.isFiltered() && osm.isTagged()) {
+            if (!osm.isDeleted() && !ds.isSelected(osm) && !osm.isDisabledAndHidden() && osm.isTagged()) {
                 osm.visit(this);
                 //        profilerN++;
@@ -177,5 +177,5 @@
 
         for (final OsmPrimitive osm:data.searchWays(bbox)){
-            if (!osm.isDeleted() && !ds.isSelected(osm) && !osm.isFiltered() && !osm.isTagged()) {
+            if (!osm.isDeleted() && !ds.isSelected(osm) && !osm.isDisabledAndHidden() && !osm.isTagged()) {
                 osm.visit(this);
                 //        profilerN++;
@@ -207,5 +207,5 @@
         //profilerN = 0;
         for (final OsmPrimitive osm: data.searchNodes(bbox)) {
-            if (!osm.isDeleted() && !ds.isSelected(osm) && !osm.isFiltered())
+            if (!osm.isDeleted() && !ds.isSelected(osm) && !osm.isDisabledAndHidden())
             {
                 osm.visit(this);
@@ -295,5 +295,5 @@
             GeneralPath path = new GeneralPath();
             for (Way osm: ways){
-                if (osm.isUsable() && !osm.isFiltered() && !osm.isDisabled()) {
+                if (osm.isUsable() && !osm.isDisabledAndHidden() && !osm.isDisabled()) {
                     visitVirtual(path, osm);
                 }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java	(revision 3397)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java	(revision 3398)
@@ -149,5 +149,5 @@
             s.append("; modified");
         }
-        if (o.isFiltered()) {
+        if (o.isDisabledAndHidden()) {
             s.append("; filtered/hidden");
         }
