Index: /trunk/src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 3800)
+++ /trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 3801)
@@ -34,5 +34,7 @@
 import org.openstreetmap.josm.data.osm.event.WayNodesChangedEvent;
 import org.openstreetmap.josm.gui.tagging.ac.AutoCompletionManager;
+import org.openstreetmap.josm.tools.FilteredCollection;
 import org.openstreetmap.josm.tools.Predicate;
+import org.openstreetmap.josm.tools.SubclassFilteredCollection;
 
 /**
@@ -174,5 +176,5 @@
 
     private <T extends OsmPrimitive> Collection<T> getPrimitives(Predicate<OsmPrimitive> predicate) {
-        return new DatasetCollection<T>(allPrimitives, predicate);
+        return new SubclassFilteredCollection<OsmPrimitive, T>(allPrimitives, predicate);
     }
 
@@ -386,5 +388,5 @@
 
     public Collection<OsmPrimitive> getSelectedNodesAndWays() {
-        return new DatasetCollection<OsmPrimitive>(getSelected(), new Predicate<OsmPrimitive>() {
+        return new FilteredCollection<OsmPrimitive>(getSelected(), new Predicate<OsmPrimitive>() {
             @Override
             public boolean evaluate(OsmPrimitive primitive) {
@@ -415,5 +417,5 @@
      */
     public Collection<Node> getSelectedNodes() {
-        return new DatasetCollection<Node>(getSelected(), OsmPrimitive.nodePredicate);
+        return new SubclassFilteredCollection<OsmPrimitive, Node>(getSelected(), OsmPrimitive.nodePredicate);
     }
 
@@ -422,5 +424,5 @@
      */
     public Collection<Way> getSelectedWays() {
-        return new DatasetCollection<Way>(getSelected(), OsmPrimitive.wayPredicate);
+        return new SubclassFilteredCollection<OsmPrimitive, Way>(getSelected(), OsmPrimitive.wayPredicate);
     }
 
@@ -429,5 +431,5 @@
      */
     public Collection<Relation> getSelectedRelations() {
-        return new DatasetCollection<Relation>(getSelected(), OsmPrimitive.relationPredicate);
+        return new SubclassFilteredCollection<OsmPrimitive, Relation>(getSelected(), OsmPrimitive.relationPredicate);
     }
 
Index: unk/src/org/openstreetmap/josm/data/osm/DatasetCollection.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/DatasetCollection.java	(revision 3800)
+++ 	(revision )
@@ -1,82 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.data.osm;
-
-import java.util.AbstractCollection;
-import java.util.Collection;
-import java.util.Iterator;
-
-import org.openstreetmap.josm.tools.Predicate;
-
-public class DatasetCollection<T extends OsmPrimitive> extends AbstractCollection<T> {
-
-    private class FilterIterator implements Iterator<T> {
-
-        private final Iterator<? extends OsmPrimitive> iterator;
-        private OsmPrimitive current;
-
-        public FilterIterator(Iterator<? extends OsmPrimitive> iterator) {
-            this.iterator = iterator;
-        }
-
-        private void findNext() {
-            if (current == null) {
-                while (iterator.hasNext()) {
-                    current = iterator.next();
-                    if (predicate.evaluate(current))
-                        return;
-                }
-                current = null;
-            }
-        }
-
-        public boolean hasNext() {
-            findNext();
-            return current != null;
-        }
-
-        @SuppressWarnings("unchecked")
-        public T next() {
-            findNext();
-            OsmPrimitive old = current;
-            current = null;
-            return (T)old;
-        }
-
-        public void remove() {
-            throw new UnsupportedOperationException();
-        }
-    }
-
-    private final Collection<? extends OsmPrimitive> primitives;
-    private final Predicate<OsmPrimitive> predicate;
-    int size = -1;
-
-    public DatasetCollection(Collection<? extends OsmPrimitive> primitives, Predicate<OsmPrimitive> predicate) {
-        this.primitives = primitives;
-        this.predicate = predicate;
-    }
-
-    @Override
-    public Iterator<T> iterator() {
-        return new FilterIterator(primitives.iterator());
-    }
-
-    @Override
-    public int size() {
-        if (size == -1) {
-            size = 0;
-            Iterator<T> it = iterator();
-            while (it.hasNext()) {
-                size++;
-                it.next();
-            }
-        }
-        return size;
-    }
-
-    @Override
-    public boolean isEmpty() {
-        return !iterator().hasNext();
-    }
-
-}
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java	(revision 3800)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/CommandStackDialog.java	(revision 3801)
@@ -38,5 +38,4 @@
 import org.openstreetmap.josm.command.Command;
 import org.openstreetmap.josm.command.PseudoCommand;
-import org.openstreetmap.josm.data.osm.DatasetCollection;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.MapFrame;
@@ -45,4 +44,5 @@
 import org.openstreetmap.josm.gui.layer.OsmDataLayer.CommandQueueListener;
 import org.openstreetmap.josm.gui.widgets.PopupMenuLauncher;
+import org.openstreetmap.josm.tools.FilteredCollection;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -331,5 +331,5 @@
             final OsmDataLayer currentLayer = Main.map.mapView.getEditLayer();
 
-            DatasetCollection<OsmPrimitive> prims = new DatasetCollection<OsmPrimitive>(
+            FilteredCollection<OsmPrimitive> prims = new FilteredCollection<OsmPrimitive>(
                     c.getParticipatingPrimitives(),
                     new Predicate<OsmPrimitive>(){
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java	(revision 3800)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java	(revision 3801)
@@ -17,5 +17,5 @@
 import org.openstreetmap.josm.gui.ExtendedDialog;
 import org.openstreetmap.josm.data.osm.DataSet;
-import org.openstreetmap.josm.data.osm.DatasetCollection;
+import org.openstreetmap.josm.tools.SubclassFilteredCollection;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -65,5 +65,5 @@
     protected String buildText() {
         StringBuilder s = new StringBuilder();
-        for (Node n : new DatasetCollection<Node>(primitives, OsmPrimitive.nodePredicate)) {
+        for (Node n : new SubclassFilteredCollection<OsmPrimitive, Node>(primitives, OsmPrimitive.nodePredicate)) {
             s.append("Node id="+n.getUniqueId());
             if (!checkDataSet(n)) {
@@ -87,5 +87,5 @@
         }
 
-        for (Way w : new DatasetCollection<Way>(primitives, OsmPrimitive.wayPredicate)) {
+        for (Way w : new SubclassFilteredCollection<OsmPrimitive, Way>(primitives, OsmPrimitive.wayPredicate)) {
             s.append("Way id="+ w.getUniqueId());
             if (!checkDataSet(w)) {
@@ -110,5 +110,5 @@
         }
 
-        for (Relation r : new DatasetCollection<Relation>(primitives, OsmPrimitive.relationPredicate)) {
+        for (Relation r : new SubclassFilteredCollection<OsmPrimitive, Relation>(primitives, OsmPrimitive.relationPredicate)) {
             s.append("Relation id="+r.getUniqueId());
             if (!checkDataSet(r)) {
@@ -181,5 +181,5 @@
         // add way referrer
         List<OsmPrimitive> refs = n.getReferrers();
-        DatasetCollection<Way> wayRefs = new DatasetCollection<Way>(refs, OsmPrimitive.wayPredicate);
+        Collection<Way> wayRefs = new SubclassFilteredCollection<OsmPrimitive, Way>(refs, OsmPrimitive.wayPredicate);
         if (wayRefs.size() > 0) {
             s.append("  way referrer:\n");
@@ -192,5 +192,5 @@
     protected void addRelationReferrer(StringBuilder s, OsmPrimitive o) {
         List<OsmPrimitive> refs = o.getReferrers();
-        DatasetCollection<Relation> relRefs = new DatasetCollection<Relation>(refs, OsmPrimitive.relationPredicate);
+        Collection<Relation> relRefs = new SubclassFilteredCollection<OsmPrimitive, Relation>(refs, OsmPrimitive.relationPredicate);
         if (relRefs.size() > 0) {
             s.append("  relation referrer:\n");
Index: /trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 3800)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 3801)
@@ -50,5 +50,4 @@
 import org.openstreetmap.josm.data.osm.DataSetMerger;
 import org.openstreetmap.josm.data.osm.DataSource;
-import org.openstreetmap.josm.data.osm.DatasetCollection;
 import org.openstreetmap.josm.data.osm.DatasetConsistencyTest;
 import org.openstreetmap.josm.data.osm.Node;
@@ -71,4 +70,5 @@
 import org.openstreetmap.josm.gui.dialogs.LayerListPopup;
 import org.openstreetmap.josm.tools.DateUtils;
+import org.openstreetmap.josm.tools.FilteredCollection;
 import org.openstreetmap.josm.tools.GBC;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -271,6 +271,6 @@
 
     @Override public String getToolTipText() {
-        int nodes = new DatasetCollection<OsmPrimitive>(data.getNodes(), OsmPrimitive.nonDeletedPredicate).size();
-        int ways = new DatasetCollection<OsmPrimitive>(data.getWays(), OsmPrimitive.nonDeletedPredicate).size();
+        int nodes = new FilteredCollection<Node>(data.getNodes(), OsmPrimitive.nonDeletedPredicate).size();
+        int ways = new FilteredCollection<Way>(data.getWays(), OsmPrimitive.nonDeletedPredicate).size();
 
         String tool = trn("{0} node", "{0} nodes", nodes, nodes)+", ";
Index: /trunk/src/org/openstreetmap/josm/tools/SubclassFilteredCollection.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/SubclassFilteredCollection.java	(revision 3801)
+++ /trunk/src/org/openstreetmap/josm/tools/SubclassFilteredCollection.java	(revision 3801)
@@ -0,0 +1,88 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.tools;
+
+import java.util.AbstractCollection;
+import java.util.Collection;
+import java.util.Iterator;
+
+/**
+ * Filtered view of a collection.
+ * (read-only collection, but elements can be changed, of course)
+ * Lets you iterate through those elements of a given collection that satisfy a
+ * certain condition (imposed by a predicate).
+ * @param <S> element type of the underlying collection
+ * @param <T> element type of filtered collection (and subclass of S). The predicate
+ *      must except only objects of type T.
+ */
+public class SubclassFilteredCollection<S, T extends S> extends AbstractCollection<T> {
+
+    private final Collection<? extends S> collection;
+    private final Predicate<? super S> predicate;
+    int size = -1;
+
+    private class FilterIterator implements Iterator<T> {
+
+        private final Iterator<? extends S> iterator;
+        private S current;
+
+        public FilterIterator(Iterator<? extends S> iterator) {
+            this.iterator = iterator;
+        }
+
+        private void findNext() {
+            if (current == null) {
+                while (iterator.hasNext()) {
+                    current = iterator.next();
+                    if (predicate.evaluate(current))
+                        return;
+                }
+                current = null;
+            }
+        }
+
+        public boolean hasNext() {
+            findNext();
+            return current != null;
+        }
+
+        public T next() {
+            findNext();
+            S old = current;
+            current = null;
+            return (T) old;
+        }
+
+        public void remove() {
+            throw new UnsupportedOperationException();
+        }
+    }
+
+    public SubclassFilteredCollection(Collection<? extends S> collection, Predicate<? super S> predicate) {
+        this.collection = collection;
+        this.predicate = predicate;
+    }
+
+    @Override
+    public Iterator<T> iterator() {
+        return new FilterIterator(collection.iterator());
+    }
+
+    @Override
+    public int size() {
+        if (size == -1) {
+            size = 0;
+            Iterator<T> it = iterator();
+            while (it.hasNext()) {
+                size++;
+                it.next();
+            }
+        }
+        return size;
+    }
+
+    @Override
+    public boolean isEmpty() {
+        return !iterator().hasNext();
+    }
+
+}
