Index: trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTaskList.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTaskList.java	(revision 3024)
+++ trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmTaskList.java	(revision 3025)
@@ -87,5 +87,5 @@
         progressMonitor.beginTask(tr("Updating data"));
         try {
-            List<Rectangle2D> rects = new LinkedList<Rectangle2D>();
+            List<Rectangle2D> rects = new ArrayList<Rectangle2D>(areas.size());
             for (Area a : areas) {
                 rects.add(a.getBounds2D());
Index: trunk/src/org/openstreetmap/josm/data/osm/DatasetConsistencyTest.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/DatasetConsistencyTest.java	(revision 3024)
+++ trunk/src/org/openstreetmap/josm/data/osm/DatasetConsistencyTest.java	(revision 3025)
@@ -124,5 +124,5 @@
     public void checkZeroNodesWays() {
         for (Way way:dataSet.getWays()) {
-            if (way.isUsable() && way.getNodesCount() == 0) {
+            if (way.isUsable() && way.isVisible() && way.getNodesCount() == 0) {
                 printError("WARN - ZERO NODES", "Way %s has zero nodes", way);
             } else if (way.isUsable() && way.getNodesCount() == 1) {
Index: trunk/src/org/openstreetmap/josm/data/osm/DatasetFactory.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/DatasetFactory.java	(revision 3025)
+++ trunk/src/org/openstreetmap/josm/data/osm/DatasetFactory.java	(revision 3025)
@@ -0,0 +1,62 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.data.osm;
+
+/**
+ * Convenience class allowing to manage primitives in the dataset. Useful especially for tests
+ *
+ */
+public class DatasetFactory {
+
+    private final DataSet ds;
+
+    public DatasetFactory() {
+        ds = new DataSet();
+    }
+
+    public DatasetFactory(DataSet ds) {
+        this.ds = ds;
+    }
+
+    public Node getNode(long id) {
+        return (Node) ds.getPrimitiveById(id, OsmPrimitiveType.NODE);
+    }
+
+    public Way getWay(long id) {
+        return (Way) ds.getPrimitiveById(id, OsmPrimitiveType.WAY);
+    }
+
+    public Relation getRelation(long id) {
+        return (Relation) ds.getPrimitiveById(id, OsmPrimitiveType.RELATION);
+    }
+
+    public Node addNode(long id) {
+        return addNode(id, 0);
+    }
+
+    public Way addWay(long id) {
+        return addWay(id, 0);
+    }
+
+    public Relation addRelation(long id) {
+        return addRelation(id, 0);
+    }
+
+    public Node addNode(long id, int version) {
+        Node n = new Node(id, version);
+        ds.addPrimitive(n);
+        return n;
+    }
+
+    public Way addWay(long id, int version) {
+        Way w = new Way(id, version);
+        ds.addPrimitive(w);
+        return w;
+    }
+
+    public Relation addRelation(long id, int version) {
+        Relation e = new Relation(id, version);
+        ds.addPrimitive(e);
+        return e;
+    }
+
+}
Index: trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 3024)
+++ trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 3025)
@@ -873,5 +873,5 @@
      */
     public boolean hasSameTags(OsmPrimitive other) {
-        return keySet().equals(other.keySet());
+        return getKeys().equals(other.getKeys());
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/Relation.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 3024)
+++ trunk/src/org/openstreetmap/josm/data/osm/Relation.java	(revision 3025)
@@ -17,9 +17,4 @@
 public final class Relation extends OsmPrimitive {
 
-    /**
-     * All members of this relation. Note that after changing this,
-     * makeBackReferences and/or removeBackReferences should be called.
-     *
-     */
     private final List<RelationMember> members = new ArrayList<RelationMember>();
 
Index: trunk/src/org/openstreetmap/josm/gui/conflict/pair/ListMergeModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/conflict/pair/ListMergeModel.java	(revision 3024)
+++ trunk/src/org/openstreetmap/josm/gui/conflict/pair/ListMergeModel.java	(revision 3025)
@@ -79,5 +79,5 @@
     protected EntriesSelectionModel mergedEntriesSelectionModel;
 
-    private final ArrayList<PropertyChangeListener> listeners;
+    private final List<PropertyChangeListener> listeners;
     private boolean isFrozen = false;
     private final ComparePairListModel comparePairListModel;
@@ -340,4 +340,6 @@
 
     private void copy(ListRole sourceRole, int[] rows, int position) {
+        if (position < 0 || position > getMergedEntriesSize())
+            throw new IllegalArgumentException();
         List<T> newItems = new ArrayList<T>(rows.length);
         List<T> source = entries.get(sourceRole);
