Index: trunk/src/org/openstreetmap/josm/actions/UploadSelectionAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/UploadSelectionAction.java	(revision 3205)
+++ trunk/src/org/openstreetmap/josm/actions/UploadSelectionAction.java	(revision 3206)
@@ -67,15 +67,5 @@
     protected Set<OsmPrimitive> getDeletedPrimitives(DataSet ds) {
         HashSet<OsmPrimitive> ret = new HashSet<OsmPrimitive>();
-        for (OsmPrimitive p : ds.getNodes()) {
-            if (p.isDeleted() && !p.isNew() && p.isVisible() && p.isModified()) {
-                ret.add(p);
-            }
-        }
-        for (OsmPrimitive p : ds.getWays()) {
-            if (p.isDeleted() && !p.isNew() && p.isVisible() && p.isModified()) {
-                ret.add(p);
-            }
-        }
-        for (OsmPrimitive p : ds.getRelations()) {
+        for (OsmPrimitive p: ds.allPrimitives()) {
             if (p.isDeleted() && !p.isNew() && p.isVisible() && p.isModified()) {
                 ret.add(p);
@@ -136,5 +126,5 @@
      * Replies true if there is at least one non-new, deleted primitive in
      * <code>primitives</code>
-     * 
+     *
      * @param primitives the primitives to scan
      * @return true if there is at least one non-new, deleted primitive in
Index: trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTaskList.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTaskList.java	(revision 3205)
+++ trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTaskList.java	(revision 3206)
@@ -106,15 +106,5 @@
     protected Set<OsmPrimitive> getCompletePrimitives(DataSet ds) {
         HashSet<OsmPrimitive> ret = new HashSet<OsmPrimitive>();
-        for (OsmPrimitive primitive : ds.getNodes()) {
-            if (!primitive.isIncomplete() && !primitive.isNew()) {
-                ret.add(primitive);
-            }
-        }
-        for (OsmPrimitive primitive : ds.getWays()) {
-            if (!primitive.isIncomplete() && !primitive.isNew()) {
-                ret.add(primitive);
-            }
-        }
-        for (OsmPrimitive primitive : ds.getRelations()) {
+        for (OsmPrimitive primitive : ds.allPrimitives()) {
             if (!primitive.isIncomplete() && !primitive.isNew()) {
                 ret.add(primitive);
@@ -205,7 +195,5 @@
                 DataSet ds = ((DownloadOsmTask) task).getDownloadedData();
                 if (ds != null) {
-                    ret.addAll(ds.getNodes());
-                    ret.addAll(ds.getWays());
-                    ret.addAll(ds.getRelations());
+                    ret.addAll(ds.allPrimitives());
                 }
             }
@@ -272,7 +260,5 @@
                         DataSet ds = ((DownloadOsmTask) task).getDownloadedData();
                         if (ds != null) {
-                            myPrimitives.removeAll(ds.getNodes());
-                            myPrimitives.removeAll(ds.getWays());
-                            myPrimitives.removeAll(ds.getRelations());
+                            myPrimitives.removeAll(ds.allPrimitives());
                         }
                     }
Index: trunk/src/org/openstreetmap/josm/data/osm/DataSet.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 3205)
+++ trunk/src/org/openstreetmap/josm/data/osm/DataSet.java	(revision 3206)
@@ -10,5 +10,4 @@
 import java.util.Collections;
 import java.util.HashMap;
-import java.util.HashSet;
 import java.util.Iterator;
 import java.util.LinkedHashSet;
@@ -16,9 +15,7 @@
 import java.util.List;
 import java.util.Map;
-import java.util.Set;
 
 import org.openstreetmap.josm.data.SelectionChangedListener;
 import org.openstreetmap.josm.data.coor.LatLon;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.event.AbstractDatasetChangedEvent;
 import org.openstreetmap.josm.data.osm.event.ChangesetIdChangedEvent;
@@ -209,5 +206,5 @@
         }
         allPrimitives.add(primitive);
-        primitive.setDataset(this);        
+        primitive.setDataset(this);
         firePrimitivesAdded(Collections.singletonList(primitive), false);
     }
@@ -642,18 +639,4 @@
     }
 
-    public Set<Long> getPrimitiveIds() {
-        HashSet<Long> ret = new HashSet<Long>();
-        for (OsmPrimitive primitive : nodes) {
-            ret.add(primitive.getId());
-        }
-        for (OsmPrimitive primitive : ways) {
-            ret.add(primitive.getId());
-        }
-        for (OsmPrimitive primitive : relations) {
-            ret.add(primitive.getId());
-        }
-        return ret;
-    }
-
     protected void deleteWay(Way way) {
         way.setNodes(null);
@@ -717,30 +700,4 @@
             unlinkPrimitiveFromRelations(referencedPrimitive);
         }
-    }
-
-    /**
-     * Replies a list of parent relations which refer to the relation
-     * <code>child</code>. Replies an empty list if child is null.
-     *
-     * @param child the child relation
-     * @return a list of parent relations which refer to the relation
-     * <code>child</code>
-     */
-    public List<Relation> getParentRelations(Relation child) {
-        ArrayList<Relation> parents = new ArrayList<Relation>();
-        if (child == null)
-            return parents;
-        for (Relation parent : relations) {
-            if (parent == child) {
-                continue;
-            }
-            for (RelationMember member: parent.getMembers()) {
-                if (member.refersTo(child)) {
-                    parents.add(parent);
-                    break;
-                }
-            }
-        }
-        return parents;
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/DatasetCollection.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/DatasetCollection.java	(revision 3205)
+++ trunk/src/org/openstreetmap/josm/data/osm/DatasetCollection.java	(revision 3206)
@@ -8,12 +8,12 @@
 import org.openstreetmap.josm.tools.Predicate;
 
-class DatasetCollection extends AbstractCollection<OsmPrimitive> {
+public class DatasetCollection extends AbstractCollection<OsmPrimitive> {
 
     private class FilterIterator implements Iterator<OsmPrimitive> {
 
-        private final Iterator<OsmPrimitive> iterator;
+        private final Iterator<? extends OsmPrimitive> iterator;
         private OsmPrimitive current;
 
-        public FilterIterator(Iterator<OsmPrimitive> iterator) {
+        public FilterIterator(Iterator<? extends OsmPrimitive> iterator) {
             this.iterator = iterator;
         }
@@ -47,8 +47,8 @@
     }
 
-    private final Collection<OsmPrimitive> primitives;
+    private final Collection<? extends OsmPrimitive> primitives;
     private final Predicate<OsmPrimitive> predicate;
 
-    public DatasetCollection(Collection<OsmPrimitive> primitives, Predicate<OsmPrimitive> predicate) {
+    public DatasetCollection(Collection<? extends OsmPrimitive> primitives, Predicate<OsmPrimitive> predicate) {
         this.primitives = primitives;
         this.predicate = predicate;
@@ -75,3 +75,4 @@
         return !iterator().hasNext();
     }
+
 }
Index: trunk/src/org/openstreetmap/josm/data/osm/Storage.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Storage.java	(revision 3205)
+++ trunk/src/org/openstreetmap/josm/data/osm/Storage.java	(revision 3206)
@@ -23,5 +23,4 @@
 import java.util.AbstractSet;
 import java.util.Collection;
-import java.util.ConcurrentModificationException;
 import java.util.Iterator;
 import java.util.Map;
Index: trunk/src/org/openstreetmap/josm/data/osm/TagCollection.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/TagCollection.java	(revision 3205)
+++ trunk/src/org/openstreetmap/josm/data/osm/TagCollection.java	(revision 3206)
@@ -57,5 +57,5 @@
      * Creates a tag collection from a map of key/value-pairs. Replies
      * an empty tag collection if {@code tags} is null.
-     * 
+     *
      * @param tags  the key/value-pairs
      * @return the tag collection
@@ -130,7 +130,5 @@
         TagCollection tags = new TagCollection();
         if (ds == null) return tags;
-        tags.add(TagCollection.unionOfAllPrimitives(ds.getNodes()));
-        tags.add(TagCollection.unionOfAllPrimitives(ds.getWays()));
-        tags.add(TagCollection.unionOfAllPrimitives(ds.getRelations()));
+        tags.add(TagCollection.unionOfAllPrimitives(ds.allPrimitives()));
         return tags;
     }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java	(revision 3205)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/ChangesetDialog.java	(revision 3206)
@@ -307,15 +307,5 @@
                 return;
             Set<OsmPrimitive> sel = new HashSet<OsmPrimitive>();
-            for (OsmPrimitive p: ds.getNodes()) {
-                if (ids.contains(p.getChangesetId())) {
-                    sel.add(p);
-                }
-            }
-            for (OsmPrimitive p: ds.getWays()) {
-                if (ids.contains(p.getChangesetId())) {
-                    sel.add(p);
-                }
-            }
-            for (OsmPrimitive p: ds.getRelations()) {
+            for (OsmPrimitive p: ds.allPrimitives()) {
                 if (ids.contains(p.getChangesetId())) {
                     sel.add(p);
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDetailPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDetailPanel.java	(revision 3205)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDetailPanel.java	(revision 3206)
@@ -380,15 +380,5 @@
             OsmDataLayer layer = Main.main.getEditLayer();
             Set<OsmPrimitive> target = new HashSet<OsmPrimitive>();
-            for (OsmPrimitive p: layer.data.getNodes()) {
-                if (p.isUsable() && p.getChangesetId() == current.getId()) {
-                    target.add(p);
-                }
-            }
-            for (OsmPrimitive p: layer.data.getWays()) {
-                if (p.isUsable() && p.getChangesetId() == current.getId()) {
-                    target.add(p);
-                }
-            }
-            for (OsmPrimitive p: layer.data.getRelations()) {
+            for (OsmPrimitive p: layer.data.allPrimitives()) {
                 if (p.isUsable() && p.getChangesetId() == current.getId()) {
                     target.add(p);
@@ -449,19 +439,9 @@
             OsmDataLayer layer = Main.main.getEditLayer();
             Set<OsmPrimitive> target = new HashSet<OsmPrimitive>();
-            for (OsmPrimitive p: layer.data.getNodes()) {
+            for (OsmPrimitive p: layer.data.allPrimitives()) {
                 if (p.isUsable() && p.getChangesetId() == current.getId()) {
                     target.add(p);
                 }
             }
-            for (OsmPrimitive p: layer.data.getWays()) {
-                if (p.isUsable() && p.getChangesetId() == current.getId()) {
-                    target.add(p);
-                }
-            }
-            for (OsmPrimitive p: layer.data.getRelations()) {
-                if (p.isUsable() && p.getChangesetId() == current.getId()) {
-                    target.add(p);
-                }
-            }
             if (target.isEmpty()) {
                 alertNoPrimitivesToZoomTo();
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetListModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetListModel.java	(revision 3205)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetListModel.java	(revision 3206)
@@ -137,17 +137,5 @@
         }
         Set<Changeset> changesets = new HashSet<Changeset>();
-        for (OsmPrimitive p: ds.getNodes()) {
-            if (p.getChangesetId() <=0 ) {
-                continue;
-            }
-            changesets.add(new Changeset(p.getChangesetId()));
-        }
-        for (OsmPrimitive p: ds.getWays()) {
-            if (p.getChangesetId() <=0 ) {
-                continue;
-            }
-            changesets.add(new Changeset(p.getChangesetId()));
-        }
-        for (OsmPrimitive p: ds.getRelations()) {
+        for (OsmPrimitive p: ds.allPrimitives()) {
             if (p.getChangesetId() <=0 ) {
                 continue;
Index: trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 3205)
+++ trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 3206)
@@ -25,8 +25,6 @@
 import java.util.HashMap;
 import java.util.HashSet;
-import java.util.Iterator;
 import java.util.LinkedList;
 import java.util.Map;
-import java.util.Set;
 
 import javax.swing.AbstractAction;
@@ -55,4 +53,5 @@
 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;
@@ -271,6 +270,6 @@
 
     @Override public String getToolTipText() {
-        int nodes = undeletedSize(data.getNodes());
-        int ways = undeletedSize(data.getWays());
+        int nodes = new DatasetCollection(data.getNodes(), OsmPrimitive.nonDeletedPredicate).size();
+        int ways = new DatasetCollection(data.getWays(), OsmPrimitive.nonDeletedPredicate).size();
 
         String tool = trn("{0} node", "{0} nodes", nodes, nodes)+", ";
@@ -477,43 +476,12 @@
 
         // if uploaded, clean the modified flags as well
-        final Set<OsmPrimitive> processedSet = new HashSet<OsmPrimitive>(processed);
         data.clenupDeletedPrimitives();
-        for (final Iterator<Node> it = data.getNodes().iterator(); it.hasNext();) {
-            cleanIterator(it, processedSet);
-        }
-        for (final Iterator<Way> it = data.getWays().iterator(); it.hasNext();) {
-            cleanIterator(it, processedSet);
-        }
-        for (final Iterator<Relation> it = data.getRelations().iterator(); it.hasNext();) {
-            cleanIterator(it, processedSet);
-        }
-    }
-
-    /**
-     * Clean the modified flag for the given iterator over a collection if it is in the
-     * list of processed entries.
-     *
-     * @param it The iterator to change the modified and remove the items if deleted.
-     * @param processed A list of all objects that have been successfully progressed.
-     *         If the object in the iterator is not in the list, nothing will be changed on it.
-     */
-    private void cleanIterator(final Iterator<? extends OsmPrimitive> it, final Collection<OsmPrimitive> processed) {
-        final OsmPrimitive osm = it.next();
-        if (!processed.remove(osm))
-            return;
-        osm.setModified(false);
-    }
-
-    /**
-     * @return The number of not-deleted and visible primitives in the list.
-     */
-    private int undeletedSize(final Collection<? extends OsmPrimitive> list) {
-        int size = 0;
-        for (final OsmPrimitive osm : list)
-            if (!osm.isDeleted() && osm.isVisible()) {
-                size++;
-            }
-        return size;
-    }
+        for (OsmPrimitive p: data.allPrimitives()) {
+            if (processed.contains(p)) {
+                p.setModified(false);
+            }
+        }
+    }
+
 
     @Override public Object getInfoComponent() {
