Index: /trunk/src/org/openstreetmap/josm/gui/widgets/JosmComboBox.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/widgets/JosmComboBox.java	(revision 9545)
+++ /trunk/src/org/openstreetmap/josm/gui/widgets/JosmComboBox.java	(revision 9546)
@@ -4,4 +4,5 @@
 import java.awt.Component;
 import java.awt.Dimension;
+import java.awt.GraphicsEnvironment;
 import java.awt.Toolkit;
 import java.awt.event.MouseAdapter;
@@ -166,5 +167,5 @@
         if (prototype != null) {
             setPrototypeDisplayValue(prototype);
-            int screenHeight = Toolkit.getDefaultToolkit().getScreenSize().height;
+            int screenHeight = GraphicsEnvironment.isHeadless() ? 600 : Toolkit.getDefaultToolkit().getScreenSize().height;
             // Compute maximum number of visible items based on the preferred size of the combo box.
             // This assumes that items have the same height as the combo box, which is not granted by the look and feel
Index: unk/test/functional/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMergerTest.java
===================================================================
--- /trunk/test/functional/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMergerTest.java	(revision 9545)
+++ 	(revision )
@@ -1,77 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.conflict.pair.nodes;
-
-import java.awt.BorderLayout;
-
-import javax.swing.JFrame;
-
-import org.junit.Ignore;
-import org.openstreetmap.josm.data.conflict.Conflict;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.Way;
-
-@Ignore
-public class NodeListMergerTest extends JFrame {
-
-
-    private NodeListMerger nodeListMerger;
-
-    protected void populate() {
-        Way w1 = new Way();
-        Node n1;
-        w1.addNode(n1 = new Node(1));
-        for (int i = 0; i < 20; i++) {
-            n1.put("key" + i, "value" + i);
-        }
-        StringBuilder note = new StringBuilder();
-        for (int i = 0; i < 50; i++) {
-            note.append(" A very long text ");
-        }
-        n1.put("note", note.toString());
-        w1.addNode(new Node(2));
-        w1.addNode(new Node(3));
-
-        Way w2 = new Way();
-        w2.addNode(new Node(4));
-        w2.addNode(new Node(5));
-        w2.addNode(new Node(6));
-
-        nodeListMerger.populate(new Conflict<OsmPrimitive>(w1, w2));
-
-    }
-
-    protected void populateLong() {
-        Way w1 = new Way();
-        for (int i = 0; i < 100; i++) {
-            w1.addNode(new Node(i));
-        }
-
-        Way w2 = new Way();
-        for (int i = 1; i < 200; i += 2) {
-            w2.addNode(new Node(i));
-        }
-        nodeListMerger.populate(new Conflict<OsmPrimitive>(w1, w2));
-
-    }
-
-    protected void build() {
-        nodeListMerger = new NodeListMerger();
-        getContentPane().setLayout(new BorderLayout());
-        getContentPane().add(nodeListMerger, BorderLayout.CENTER);
-    }
-
-    /**
-     * Constructs a new {@code NodeListMergerTest}.
-     */
-    public NodeListMergerTest() {
-        build();
-        populate();
-    }
-
-    public static void main(String[] args) {
-        NodeListMergerTest test = new NodeListMergerTest();
-        test.setSize(600, 600);
-        test.setVisible(true);
-    }
-}
Index: /trunk/test/functional/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMergerTestFT.java
===================================================================
--- /trunk/test/functional/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMergerTestFT.java	(revision 9546)
+++ /trunk/test/functional/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMergerTestFT.java	(revision 9546)
@@ -0,0 +1,74 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.conflict.pair.nodes;
+
+import java.awt.BorderLayout;
+
+import javax.swing.JFrame;
+
+import org.openstreetmap.josm.data.conflict.Conflict;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Way;
+
+public class NodeListMergerTestFT extends JFrame {
+
+    private NodeListMerger nodeListMerger;
+
+    protected void populate() {
+        Way w1 = new Way();
+        Node n1;
+        w1.addNode(n1 = new Node(1));
+        for (int i = 0; i < 20; i++) {
+            n1.put("key" + i, "value" + i);
+        }
+        StringBuilder note = new StringBuilder();
+        for (int i = 0; i < 50; i++) {
+            note.append(" A very long text ");
+        }
+        n1.put("note", note.toString());
+        w1.addNode(new Node(2));
+        w1.addNode(new Node(3));
+
+        Way w2 = new Way();
+        w2.addNode(new Node(4));
+        w2.addNode(new Node(5));
+        w2.addNode(new Node(6));
+
+        nodeListMerger.populate(new Conflict<OsmPrimitive>(w1, w2));
+
+    }
+
+    protected void populateLong() {
+        Way w1 = new Way();
+        for (int i = 0; i < 100; i++) {
+            w1.addNode(new Node(i));
+        }
+
+        Way w2 = new Way();
+        for (int i = 1; i < 200; i += 2) {
+            w2.addNode(new Node(i));
+        }
+        nodeListMerger.populate(new Conflict<OsmPrimitive>(w1, w2));
+
+    }
+
+    protected void build() {
+        nodeListMerger = new NodeListMerger();
+        getContentPane().setLayout(new BorderLayout());
+        getContentPane().add(nodeListMerger, BorderLayout.CENTER);
+    }
+
+    /**
+     * Constructs a new {@code NodeListMergerTest}.
+     */
+    public NodeListMergerTestFT() {
+        build();
+        populate();
+    }
+
+    public static void main(String[] args) {
+        NodeListMergerTestFT test = new NodeListMergerTestFT();
+        test.setSize(600, 600);
+        test.setVisible(true);
+    }
+}
Index: unk/test/functional/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergerTest.java
===================================================================
--- /trunk/test/functional/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergerTest.java	(revision 9545)
+++ 	(revision )
@@ -1,52 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.conflict.pair.properties;
-
-import java.awt.BorderLayout;
-
-import javax.swing.JFrame;
-
-import org.junit.Ignore;
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.conflict.Conflict;
-import org.openstreetmap.josm.data.coor.LatLon;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.projection.Projections;
-
-@Ignore
-public class PropertiesMergerTest extends JFrame {
-
-    private PropertiesMerger merger;
-
-    protected void build() {
-        Main.setProjection(Projections.getProjectionByCode("EPSG:4326")); // WGS 84
-
-        setLayout(new BorderLayout());
-        add(merger = new PropertiesMerger(), BorderLayout.CENTER);
-    }
-
-    protected void populate() {
-        Node my = new Node(1);
-        my.setCoor(new LatLon(1, 1));
-        my.setDeleted(true);
-
-        Node their = new Node(2);
-        their.setCoor(new LatLon(10, 10));
-
-        merger.getModel().populate(new Conflict<OsmPrimitive>(my, their));
-    }
-
-    /**
-     * Constructs a new {@code PropertiesMergerTest}.
-     */
-    public PropertiesMergerTest() {
-        build();
-        populate();
-    }
-
-    public static void main(String[] args) {
-        PropertiesMergerTest app = new PropertiesMergerTest();
-        app.setSize(600, 400);
-        app.setVisible(true);
-    }
-}
Index: /trunk/test/functional/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergerTestFT.java
===================================================================
--- /trunk/test/functional/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergerTestFT.java	(revision 9546)
+++ /trunk/test/functional/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergerTestFT.java	(revision 9546)
@@ -0,0 +1,50 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.conflict.pair.properties;
+
+import java.awt.BorderLayout;
+
+import javax.swing.JFrame;
+
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.conflict.Conflict;
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.projection.Projections;
+
+public class PropertiesMergerTestFT extends JFrame {
+
+    private PropertiesMerger merger;
+
+    protected void build() {
+        Main.setProjection(Projections.getProjectionByCode("EPSG:4326")); // WGS 84
+
+        setLayout(new BorderLayout());
+        add(merger = new PropertiesMerger(), BorderLayout.CENTER);
+    }
+
+    protected void populate() {
+        Node my = new Node(1);
+        my.setCoor(new LatLon(1, 1));
+        my.setDeleted(true);
+
+        Node their = new Node(2);
+        their.setCoor(new LatLon(10, 10));
+
+        merger.getModel().populate(new Conflict<OsmPrimitive>(my, their));
+    }
+
+    /**
+     * Constructs a new {@code PropertiesMergerTest}.
+     */
+    public PropertiesMergerTestFT() {
+        build();
+        populate();
+    }
+
+    public static void main(String[] args) {
+        PropertiesMergerTestFT app = new PropertiesMergerTestFT();
+        app.setSize(600, 400);
+        app.setVisible(true);
+    }
+}
Index: unk/test/functional/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberMergerTest.java
===================================================================
--- /trunk/test/functional/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberMergerTest.java	(revision 9545)
+++ 	(revision )
@@ -1,56 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.conflict.pair.relation;
-
-import java.awt.BorderLayout;
-
-import javax.swing.JFrame;
-
-import org.junit.Ignore;
-import org.openstreetmap.josm.data.conflict.Conflict;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.Relation;
-import org.openstreetmap.josm.data.osm.RelationMember;
-import org.openstreetmap.josm.data.osm.Way;
-
-@Ignore
-public class RelationMemberMergerTest extends JFrame {
-
-    private RelationMemberMerger merger;
-
-    protected void populate() {
-        Relation r1 = new Relation();
-        r1.addMember(new RelationMember("role1", new Node(1)));
-        r1.addMember(new RelationMember("role2", new Way(2)));
-        r1.addMember(new RelationMember("role3", new Relation(3)));
-
-
-        Relation r2 = new Relation();
-        r2.addMember(new RelationMember("role1", new Node(1)));
-        r2.addMember(new RelationMember("role2", new Way(2)));
-        r2.addMember(new RelationMember("role3", new Relation(3)));
-
-        merger.populate(new Conflict<OsmPrimitive>(r1, r2));
-
-    }
-
-    protected void build() {
-        merger = new RelationMemberMerger();
-        getContentPane().setLayout(new BorderLayout());
-        getContentPane().add(merger, BorderLayout.CENTER);
-    }
-
-    /**
-     * Constructs a new {@code RelationMemberMergerTest}.
-     */
-    public RelationMemberMergerTest() {
-        build();
-        populate();
-    }
-
-    public static void main(String[] args) {
-        RelationMemberMergerTest test = new RelationMemberMergerTest();
-        test.setSize(600, 600);
-        test.setVisible(true);
-    }
-}
Index: /trunk/test/functional/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberMergerTestFT.java
===================================================================
--- /trunk/test/functional/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberMergerTestFT.java	(revision 9546)
+++ /trunk/test/functional/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberMergerTestFT.java	(revision 9546)
@@ -0,0 +1,54 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.conflict.pair.relation;
+
+import java.awt.BorderLayout;
+
+import javax.swing.JFrame;
+
+import org.openstreetmap.josm.data.conflict.Conflict;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.RelationMember;
+import org.openstreetmap.josm.data.osm.Way;
+
+public class RelationMemberMergerTestFT extends JFrame {
+
+    private RelationMemberMerger merger;
+
+    protected void populate() {
+        Relation r1 = new Relation();
+        r1.addMember(new RelationMember("role1", new Node(1)));
+        r1.addMember(new RelationMember("role2", new Way(2)));
+        r1.addMember(new RelationMember("role3", new Relation(3)));
+
+
+        Relation r2 = new Relation();
+        r2.addMember(new RelationMember("role1", new Node(1)));
+        r2.addMember(new RelationMember("role2", new Way(2)));
+        r2.addMember(new RelationMember("role3", new Relation(3)));
+
+        merger.populate(new Conflict<OsmPrimitive>(r1, r2));
+
+    }
+
+    protected void build() {
+        merger = new RelationMemberMerger();
+        getContentPane().setLayout(new BorderLayout());
+        getContentPane().add(merger, BorderLayout.CENTER);
+    }
+
+    /**
+     * Constructs a new {@code RelationMemberMergerTest}.
+     */
+    public RelationMemberMergerTestFT() {
+        build();
+        populate();
+    }
+
+    public static void main(String[] args) {
+        RelationMemberMergerTestFT test = new RelationMemberMergerTestFT();
+        test.setSize(600, 600);
+        test.setVisible(true);
+    }
+}
Index: unk/test/functional/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergerTest.java
===================================================================
--- /trunk/test/functional/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergerTest.java	(revision 9545)
+++ 	(revision )
@@ -1,41 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.conflict.pair.tags;
-
-import java.awt.BorderLayout;
-
-import javax.swing.JFrame;
-
-import org.junit.Ignore;
-
-@Ignore
-public class TagMergerTest extends JFrame {
-
-    private TagMerger tagMerger;
-
-    protected void build() {
-        tagMerger = new TagMerger();
-        getContentPane().setLayout(new BorderLayout());
-        getContentPane().add(tagMerger, BorderLayout.CENTER);
-    }
-
-    /**
-     * Constructs a new {@code TagMergerTest}.
-     */
-    public TagMergerTest() {
-        build();
-        tagMerger.getModel().addItem(new TagMergeItem("key", "myvalue", "theirvalue"));
-        tagMerger.getModel().addItem(new TagMergeItem("key", "myvalue", null));
-        tagMerger.getModel().addItem(new TagMergeItem("key", null, "theirvalue"));
-        tagMerger.getModel().addItem(new TagMergeItem("a very long key asdfasdf asdfasdf", "a very long value asdfasdf",
-                "a very long value asdfasdf"));
-        for (int i = 0; i < 50; i++) {
-          tagMerger.getModel().addItem(new TagMergeItem("key", "myvalue", "theirvalue"));
-        }
-    }
-
-    public static void main(String[] args) {
-        TagMergerTest test  = new TagMergerTest();
-        test.setSize(600, 600);
-        test.setVisible(true);
-    }
-}
Index: /trunk/test/functional/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergerTestFT.java
===================================================================
--- /trunk/test/functional/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergerTestFT.java	(revision 9546)
+++ /trunk/test/functional/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergerTestFT.java	(revision 9546)
@@ -0,0 +1,38 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.conflict.pair.tags;
+
+import java.awt.BorderLayout;
+
+import javax.swing.JFrame;
+
+public class TagMergerTestFT extends JFrame {
+
+    private TagMerger tagMerger;
+
+    protected void build() {
+        tagMerger = new TagMerger();
+        getContentPane().setLayout(new BorderLayout());
+        getContentPane().add(tagMerger, BorderLayout.CENTER);
+    }
+
+    /**
+     * Constructs a new {@code TagMergerTest}.
+     */
+    public TagMergerTestFT() {
+        build();
+        tagMerger.getModel().addItem(new TagMergeItem("key", "myvalue", "theirvalue"));
+        tagMerger.getModel().addItem(new TagMergeItem("key", "myvalue", null));
+        tagMerger.getModel().addItem(new TagMergeItem("key", null, "theirvalue"));
+        tagMerger.getModel().addItem(new TagMergeItem("a very long key asdfasdf asdfasdf", "a very long value asdfasdf",
+                "a very long value asdfasdf"));
+        for (int i = 0; i < 50; i++) {
+          tagMerger.getModel().addItem(new TagMergeItem("key", "myvalue", "theirvalue"));
+        }
+    }
+
+    public static void main(String[] args) {
+        TagMergerTestFT test  = new TagMergerTestFT();
+        test.setSize(600, 600);
+        test.setVisible(true);
+    }
+}
Index: unk/test/functional/org/openstreetmap/josm/gui/dialogs/ConflictResolutionDialogTest.java
===================================================================
--- /trunk/test/functional/org/openstreetmap/josm/gui/dialogs/ConflictResolutionDialogTest.java	(revision 9545)
+++ 	(revision )
@@ -1,52 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.dialogs;
-
-import javax.swing.JFrame;
-
-import org.junit.Ignore;
-import org.openstreetmap.josm.data.conflict.Conflict;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.data.osm.OsmPrimitive;
-import org.openstreetmap.josm.data.osm.Way;
-
-@Ignore
-public class ConflictResolutionDialogTest extends JFrame {
-
-    private ConflictResolutionDialog dialog;
-
-    protected void build() {
-        setSize(100, 100);
-        dialog = new ConflictResolutionDialog(this);
-        dialog.setSize(600, 600);
-    }
-
-    protected void populate() {
-        Way w1 = new Way(1);
-        w1.addNode(new Node(10));
-        w1.addNode(new Node(11));
-
-        Way w2 = new Way(1);
-        w2.addNode(new Node(10));
-        w2.addNode(new Node(11));
-
-        dialog.getConflictResolver().populate(new Conflict<OsmPrimitive>(w1, w2));
-    }
-
-    public void showDialog() {
-        dialog.setVisible(true);
-    }
-
-    /**
-     * Constructs a new {@code ConflictResolutionDialogTest}.
-     */
-    public ConflictResolutionDialogTest() {
-        build();
-    }
-
-    public static void main(String[] args) {
-        ConflictResolutionDialogTest test = new ConflictResolutionDialogTest();
-        test.setVisible(true);
-        test.populate();
-        test.showDialog();
-    }
-}
Index: /trunk/test/functional/org/openstreetmap/josm/gui/dialogs/ConflictResolutionDialogTestFT.java
===================================================================
--- /trunk/test/functional/org/openstreetmap/josm/gui/dialogs/ConflictResolutionDialogTestFT.java	(revision 9546)
+++ /trunk/test/functional/org/openstreetmap/josm/gui/dialogs/ConflictResolutionDialogTestFT.java	(revision 9546)
@@ -0,0 +1,50 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs;
+
+import javax.swing.JFrame;
+
+import org.openstreetmap.josm.data.conflict.Conflict;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Way;
+
+public class ConflictResolutionDialogTestFT extends JFrame {
+
+    private ConflictResolutionDialog dialog;
+
+    protected void build() {
+        setSize(100, 100);
+        dialog = new ConflictResolutionDialog(this);
+        dialog.setSize(600, 600);
+    }
+
+    protected void populate() {
+        Way w1 = new Way(1);
+        w1.addNode(new Node(10));
+        w1.addNode(new Node(11));
+
+        Way w2 = new Way(1);
+        w2.addNode(new Node(10));
+        w2.addNode(new Node(11));
+
+        dialog.getConflictResolver().populate(new Conflict<OsmPrimitive>(w1, w2));
+    }
+
+    public void showDialog() {
+        dialog.setVisible(true);
+    }
+
+    /**
+     * Constructs a new {@code ConflictResolutionDialogTest}.
+     */
+    public ConflictResolutionDialogTestFT() {
+        build();
+    }
+
+    public static void main(String[] args) {
+        ConflictResolutionDialogTestFT test = new ConflictResolutionDialogTestFT();
+        test.setVisible(true);
+        test.populate();
+        test.showDialog();
+    }
+}
Index: unk/test/functional/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManagerTest.java
===================================================================
--- /trunk/test/functional/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManagerTest.java	(revision 9545)
+++ 	(revision )
@@ -1,21 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.dialogs.changeset;
-
-import javax.swing.JFrame;
-
-import org.junit.Ignore;
-
-@Ignore
-public class ChangesetCacheManagerTest extends JFrame {
-
-    private ChangesetCacheManager manager;
-
-    public void start() {
-        manager = new ChangesetCacheManager();
-        manager.setVisible(true);
-    }
-
-    public static void main(String[] args) {
-        new ChangesetCacheManagerTest().start();
-    }
-}
Index: /trunk/test/functional/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManagerTestFT.java
===================================================================
--- /trunk/test/functional/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManagerTestFT.java	(revision 9546)
+++ /trunk/test/functional/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetCacheManagerTestFT.java	(revision 9546)
@@ -0,0 +1,18 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs.changeset;
+
+import javax.swing.JFrame;
+
+public class ChangesetCacheManagerTestFT extends JFrame {
+
+    private ChangesetCacheManager manager;
+
+    public void start() {
+        manager = new ChangesetCacheManager();
+        manager.setVisible(true);
+    }
+
+    public static void main(String[] args) {
+        new ChangesetCacheManagerTestFT().start();
+    }
+}
Index: unk/test/functional/org/openstreetmap/josm/gui/dialogs/changeset/query/ChangesetQueryDialogTest.java
===================================================================
--- /trunk/test/functional/org/openstreetmap/josm/gui/dialogs/changeset/query/ChangesetQueryDialogTest.java	(revision 9545)
+++ 	(revision )
@@ -1,22 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.dialogs.changeset.query;
-
-import javax.swing.JFrame;
-
-import org.junit.Ignore;
-
-@Ignore
-public class ChangesetQueryDialogTest extends JFrame {
-
-    private ChangesetQueryDialog dialog;
-
-    public void start() {
-        dialog = new ChangesetQueryDialog(this);
-        dialog.initForUserInput();
-        dialog.setVisible(true);
-    }
-
-    public static void main(String[] args) {
-        new ChangesetQueryDialogTest().start();
-    }
-}
Index: /trunk/test/functional/org/openstreetmap/josm/gui/dialogs/changeset/query/ChangesetQueryDialogTestFT.java
===================================================================
--- /trunk/test/functional/org/openstreetmap/josm/gui/dialogs/changeset/query/ChangesetQueryDialogTestFT.java	(revision 9546)
+++ /trunk/test/functional/org/openstreetmap/josm/gui/dialogs/changeset/query/ChangesetQueryDialogTestFT.java	(revision 9546)
@@ -0,0 +1,19 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.dialogs.changeset.query;
+
+import javax.swing.JFrame;
+
+public class ChangesetQueryDialogTestFT extends JFrame {
+
+    private ChangesetQueryDialog dialog;
+
+    public void start() {
+        dialog = new ChangesetQueryDialog(this);
+        dialog.initForUserInput();
+        dialog.setVisible(true);
+    }
+
+    public static void main(String[] args) {
+        new ChangesetQueryDialogTestFT().start();
+    }
+}
Index: unk/test/functional/org/openstreetmap/josm/gui/history/HistoryBrowserTest.java
===================================================================
--- /trunk/test/functional/org/openstreetmap/josm/gui/history/HistoryBrowserTest.java	(revision 9545)
+++ 	(revision )
@@ -1,65 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.history;
-
-import java.awt.BorderLayout;
-
-import javax.swing.JFrame;
-
-import org.junit.BeforeClass;
-import org.junit.Ignore;
-import org.openstreetmap.josm.JOSMFixture;
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
-import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
-import org.openstreetmap.josm.data.osm.history.History;
-import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
-import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
-import org.openstreetmap.josm.io.OsmServerHistoryReader;
-import org.openstreetmap.josm.io.OsmTransferException;
-
-@Ignore
-public class HistoryBrowserTest extends JFrame {
-
-    @BeforeClass
-    public static void init() {
-        JOSMFixture.createFunctionalTestFixture().init();
-    }
-
-    private HistoryBrowser browser;
-
-    protected void build() {
-        setSize(500, 500);
-        getContentPane().setLayout(new BorderLayout());
-        browser = new HistoryBrowser();
-        getContentPane().add(browser, BorderLayout.CENTER);
-    }
-
-    protected void populate(OsmPrimitiveType type, long id) {
-        OsmServerHistoryReader reader = new OsmServerHistoryReader(type, id);
-        HistoryDataSet ds = null;
-        try {
-            ds = reader.parseHistory(NullProgressMonitor.INSTANCE);
-        } catch (OsmTransferException e) {
-            Main.error(e);
-            return;
-        }
-        History h = ds.getHistory(new SimplePrimitiveId(id, type));
-        browser.populate(h);
-    }
-
-    /**
-     * Constructs a new {@code HistoryBrowserTest}.
-     */
-    public HistoryBrowserTest() {
-        build();
-        //populate(OsmPrimitiveType.NODE,354117);
-        //populate(OsmPrimitiveType.WAY,37951);
-        populate(OsmPrimitiveType.RELATION, 5055);
-
-    }
-
-    public static void main(String[] args) {
-        HistoryBrowserTest.init();
-        new HistoryBrowserTest().setVisible(true);
-    }
-}
Index: /trunk/test/functional/org/openstreetmap/josm/gui/history/HistoryBrowserTestFT.java
===================================================================
--- /trunk/test/functional/org/openstreetmap/josm/gui/history/HistoryBrowserTestFT.java	(revision 9546)
+++ /trunk/test/functional/org/openstreetmap/josm/gui/history/HistoryBrowserTestFT.java	(revision 9546)
@@ -0,0 +1,64 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.history;
+
+import java.awt.BorderLayout;
+
+import javax.swing.JFrame;
+
+import org.junit.BeforeClass;
+import org.junit.Ignore;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.data.osm.SimplePrimitiveId;
+import org.openstreetmap.josm.data.osm.history.History;
+import org.openstreetmap.josm.data.osm.history.HistoryDataSet;
+import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
+import org.openstreetmap.josm.io.OsmServerHistoryReader;
+import org.openstreetmap.josm.io.OsmTransferException;
+
+public class HistoryBrowserTestFT extends JFrame {
+
+    @BeforeClass
+    public static void init() {
+        JOSMFixture.createFunctionalTestFixture().init();
+    }
+
+    private HistoryBrowser browser;
+
+    protected void build() {
+        setSize(500, 500);
+        getContentPane().setLayout(new BorderLayout());
+        browser = new HistoryBrowser();
+        getContentPane().add(browser, BorderLayout.CENTER);
+    }
+
+    protected void populate(OsmPrimitiveType type, long id) {
+        OsmServerHistoryReader reader = new OsmServerHistoryReader(type, id);
+        HistoryDataSet ds = null;
+        try {
+            ds = reader.parseHistory(NullProgressMonitor.INSTANCE);
+        } catch (OsmTransferException e) {
+            Main.error(e);
+            return;
+        }
+        History h = ds.getHistory(new SimplePrimitiveId(id, type));
+        browser.populate(h);
+    }
+
+    /**
+     * Constructs a new {@code HistoryBrowserTest}.
+     */
+    public HistoryBrowserTestFT() {
+        build();
+        //populate(OsmPrimitiveType.NODE,354117);
+        //populate(OsmPrimitiveType.WAY,37951);
+        populate(OsmPrimitiveType.RELATION, 5055);
+
+    }
+
+    public static void main(String[] args) {
+        HistoryBrowserTestFT.init();
+        new HistoryBrowserTestFT().setVisible(true);
+    }
+}
Index: /trunk/test/unit/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMergeModelTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMergeModelTest.java	(revision 9546)
+++ /trunk/test/unit/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMergeModelTest.java	(revision 9546)
@@ -0,0 +1,728 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.conflict.pair.nodes;
+
+import static org.fest.reflect.core.Reflection.field;
+import static org.fest.reflect.core.Reflection.method;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+import static org.junit.Assert.fail;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.ArrayList;
+import java.util.Arrays;
+import java.util.List;
+import java.util.Set;
+
+import javax.swing.DefaultListSelectionModel;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.DatasetFactory;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.gui.conflict.pair.nodes.NodeListMergeModel;
+
+public class NodeListMergeModelTest {
+
+    private DatasetFactory my = new DatasetFactory();
+    private DatasetFactory their = new DatasetFactory();
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void init() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    @SuppressWarnings("unchecked")
+    protected List<Node> inspectNodeList(NodeListMergeModel model, String name) {
+        return method("get" + name + "Entries")
+        .withReturnType(List.class)
+        .in(model)
+        .invoke();
+    }
+
+    protected DefaultListSelectionModel inspectListSelectionModel(NodeListMergeModel model, String name) {
+        return field(name).ofType(DefaultListSelectionModel.class)
+        .in(model)
+        .get();
+    }
+
+    protected void ensureSelected(DefaultListSelectionModel model, Object... idx) {
+        if (idx == null) return;
+        for (int i = 0; i < idx.length; i++) {
+            if (idx[i] instanceof Integer) {
+                int j = (Integer) idx[i];
+                assertTrue("expected row " + j + " to be selected", model.isSelectedIndex(j));
+                break;
+            }
+            try {
+                int[] rows = (int[]) idx[i];
+                if (rows.length != 2) {
+                    fail("illegal selection range. Either null or not length 2: " + Arrays.toString(rows));
+                }
+                if (rows[0] > rows[1]) {
+                    fail("illegal selection range. lower bound > upper bound ");
+                }
+                for (int j = rows[0]; j <= rows[1]; j++) {
+                    assertTrue("expected row " + j + " to be selected", model.isSelectedIndex(j));
+                }
+            } catch (ClassCastException e) {
+                fail("illegal selection range:" + idx[i]);
+            }
+        }
+    }
+
+    @Test
+    public void test_copyMyNodesToTop_1() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = my.addWay(1, 1);
+        myWay.addNode(my.addNode(2));
+        myWay.addNode(my.addNode(3));
+
+        Way theirWay = their.addWay(1);
+
+        model.populate(myWay, theirWay, null);
+        model.copyMyToTop(new int[]{0});
+
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+
+        assertEquals(1, mergedNodes.size());
+        assertEquals(2, mergedNodes.get(0).getId());
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 0);
+    }
+
+    @Test
+    public void test_copyMyNodesToTop_2() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = my.addWay(1, 1);
+        myWay.addNode(my.addNode(2));
+        myWay.addNode(my.addNode(3));
+
+        Way theirWay = their.addWay(1);
+
+        model.populate(myWay, theirWay, null);
+
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(1));
+
+        model.copyMyToTop(new int[]{0});
+
+        mergedNodes = inspectNodeList(model, "Merged");
+        assertEquals(2, mergedNodes.size());
+        assertEquals(2, mergedNodes.get(0).getId());
+        assertEquals(1, mergedNodes.get(1).getId());
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 0);
+    }
+
+    @Test
+    public void test_copyMyNodesToTop_3() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = my.addWay(1, 1);
+        myWay.addNode(my.addNode(2));
+        myWay.addNode(my.addNode(3));
+        Way theirWay = their.addWay(1);
+
+
+        model.populate(myWay, theirWay, null);
+
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(1));
+
+        model.copyMyToTop(new int[]{1}); // copy node 3
+
+        mergedNodes = inspectNodeList(model, "Merged");
+        assertEquals(2, mergedNodes.size());
+        assertEquals(3, mergedNodes.get(0).getId()); // my node 3 at position 0
+        assertEquals(1, mergedNodes.get(1).getId()); // already merged node 1 at position 1
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 0);
+    }
+
+    @Test
+    public void test_copyMyNodesToTop_4() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = my.addWay(1, 1);
+        myWay.addNode(my.addNode(2));
+        myWay.addNode(my.addNode(3));
+        myWay.addNode(my.addNode(4));
+        Way theirWay = their.addWay(1);
+
+        model.populate(myWay, theirWay, null);
+
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(1));
+
+        model.copyMyToTop(new int[]{1, 2}); // copy node 3 and 4
+
+        mergedNodes = inspectNodeList(model, "Merged");
+        assertEquals(3, mergedNodes.size());
+        assertEquals(3, mergedNodes.get(0).getId()); // my node 3 at position 0
+        assertEquals(4, mergedNodes.get(1).getId()); // my node 4 at position 1
+        assertEquals(1, mergedNodes.get(2).getId()); // already merged node 1 at position 2
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 0, 1); // first two rows selected
+    }
+
+    @Test
+    public void test_copyMyNodesToEnd_1() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = my.addWay(1, 1);
+        myWay.addNode(my.addNode(2));
+        myWay.addNode(my.addNode(3));
+        Way theirWay = their.addWay(1);
+
+        model.populate(myWay, theirWay, null);
+        model.copyMyToEnd(new int[]{0});
+
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+
+        assertEquals(1, mergedNodes.size());
+        assertEquals(2, mergedNodes.get(0).getId());
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 0);
+    }
+
+    @Test
+    public void test_copyMyNodesToEnd_2() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = my.addWay(1, 1);
+        myWay.addNode(my.addNode(2));
+        myWay.addNode(my.addNode(3));
+        Way theirWay = their.addWay(1);
+
+        model.populate(myWay, theirWay, null);
+
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(1));
+
+        model.copyMyToEnd(new int[]{0});
+
+        mergedNodes = inspectNodeList(model, "Merged");
+        assertEquals(2, mergedNodes.size());
+        assertEquals(1, mergedNodes.get(0).getId()); // already merged node 1 at position 0
+        assertEquals(2, mergedNodes.get(1).getId()); // copied node 2 at position 1
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 1);
+    }
+
+    @Test
+    public void test_copyMyNodesToEnd_3() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+
+        Way myWay = my.addWay(1, 1);
+        myWay.addNode(my.addNode(2));
+        myWay.addNode(my.addNode(3));
+        Way theirWay = their.addWay(1);
+
+        model.populate(myWay, theirWay, null);
+
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(1));
+
+        model.copyMyToEnd(new int[]{1}); // copy node 3
+
+        mergedNodes = inspectNodeList(model, "Merged");
+        assertEquals(2, mergedNodes.size());
+        assertEquals(1, mergedNodes.get(0).getId()); // already merged node 1 at position 0
+        assertEquals(3, mergedNodes.get(1).getId()); // my node 3 at position 1
+
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 1);
+    }
+
+    @Test
+    public void test_copyMyNodesToEnd_4() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+
+        Way myWay = my.addWay(1, 1);
+        myWay.addNode(my.addNode(2));
+        myWay.addNode(my.addNode(3));
+        myWay.addNode(my.addNode(4));
+        Way theirWay = their.addWay(1);
+
+        model.populate(myWay, theirWay, null);
+
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(1));
+
+        model.copyMyToEnd(new int[]{1, 2}); // copy node 3 and 4
+
+        mergedNodes = inspectNodeList(model, "Merged");
+        assertEquals(3, mergedNodes.size());
+        assertEquals(1, mergedNodes.get(0).getId()); // already merged node 1 at position 0
+        assertEquals(3, mergedNodes.get(1).getId()); // my node 3 at position 1
+        assertEquals(4, mergedNodes.get(2).getId()); // my node 4 at position 2
+
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 1, 2); // last two rows selected
+    }
+
+    /* ----------------------------------------------------------------------------- */
+    /* copyMyNodesBeforeCurrent                                                      */
+    /* ----------------------------------------------------------------------------- */
+
+    @Test
+    public void test_copyMyNodesBeforeCurrent_1() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = my.addWay(1, 1);
+        myWay.addNode(my.addNode(1));
+        myWay.addNode(my.addNode(2));
+        Way theirWay = their.addWay(1);
+
+        model.populate(myWay, theirWay, null);
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(10));
+        mergedNodes.add(new Node(11));
+        mergedNodes.add(new Node(12));
+
+        model.copyMyBeforeCurrent(new int[]{0}, 1);
+
+        assertEquals(4, mergedNodes.size());
+        assertEquals(10, mergedNodes.get(0).getId()); // already merged node
+        assertEquals(1, mergedNodes.get(1).getId());  // copied node 1 at position 1
+        assertEquals(11, mergedNodes.get(2).getId()); // already merged node
+        assertEquals(12, mergedNodes.get(3).getId()); // already merged node
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 1); // position 1 selected
+    }
+
+    @Test
+    public void test_copyMyNodesBeforeCurrent_2() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = my.addWay(1, 1);
+        myWay.addNode(my.addNode(1));
+        myWay.addNode(my.addNode(2));
+        Way theirWay = their.addWay(1);
+
+        model.populate(myWay, theirWay, null);
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(10));
+        mergedNodes.add(new Node(11));
+        mergedNodes.add(new Node(12));
+
+        model.copyMyBeforeCurrent(new int[]{0, 1}, 0);
+
+        assertEquals(5, mergedNodes.size());
+        assertEquals(1, mergedNodes.get(0).getId());  // copied node 1 at position 0
+        assertEquals(2, mergedNodes.get(1).getId());  // copied node 2 at position 1
+        assertEquals(10, mergedNodes.get(2).getId()); // already merged node
+        assertEquals(11, mergedNodes.get(3).getId()); // already merged node
+        assertEquals(12, mergedNodes.get(4).getId()); // already merged node
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 0, 1); // position 0 and 1 selected
+    }
+
+    @Test
+    public void test_copyMyNodesBeforeCurrent_3() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = my.addWay(1, 1);
+        myWay.addNode(my.addNode(1));
+        myWay.addNode(my.addNode(2));
+        Way theirWay = their.addWay(1);
+
+        model.populate(myWay, theirWay, null);
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(10));
+        mergedNodes.add(new Node(11));
+        mergedNodes.add(new Node(12));
+
+        try {
+            model.copyMyBeforeCurrent(new int[]{0, 1}, -1);
+            fail("expected IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            // OK
+            if (Main.isTraceEnabled()) {
+                Main.trace(e.getMessage());
+            }
+        }
+
+        try {
+            model.copyMyBeforeCurrent(new int[]{0, 1}, 4);
+            fail("expected IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            // OK
+            if (Main.isTraceEnabled()) {
+                Main.trace(e.getMessage());
+            }
+        }
+    }
+
+    /* ----------------------------------------------------------------------------- */
+    /* copyMyNodesAfterCurrent                                                       */
+    /* ----------------------------------------------------------------------------- */
+    @Test
+    public void test_copyMyNodesAfterCurrent_1() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = my.addWay(1, 1);
+        myWay.addNode(my.addNode(1));
+        myWay.addNode(my.addNode(2));
+        Way theirWay = their.addWay(1);
+
+        model.populate(myWay, theirWay, null);
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(10));
+        mergedNodes.add(new Node(11));
+        mergedNodes.add(new Node(12));
+
+        model.copyMyAfterCurrent(new int[]{0}, 1);
+
+        assertEquals(4, mergedNodes.size());
+        assertEquals(10, mergedNodes.get(0).getId()); // already merged node
+        assertEquals(11, mergedNodes.get(1).getId()); // already merged node
+        assertEquals(1, mergedNodes.get(2).getId());  // copied node 1 at position 2
+        assertEquals(12, mergedNodes.get(3).getId()); // already merged node
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 2); // position 1 selected
+    }
+
+    @Test
+    public void test_copyMyNodesAfterCurrent_2() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = my.addWay(1, 1);
+        myWay.addNode(my.addNode(1));
+        myWay.addNode(my.addNode(2));
+        myWay.addNode(my.addNode(3));
+        Way theirWay = their.addWay(1);
+
+        model.populate(myWay, theirWay, null);
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(10));
+        mergedNodes.add(new Node(11));
+        mergedNodes.add(new Node(12));
+
+        model.copyMyAfterCurrent(new int[]{0, 1}, 2);
+
+        assertEquals(5, mergedNodes.size());
+        assertEquals(10, mergedNodes.get(0).getId()); // already merged node
+        assertEquals(11, mergedNodes.get(1).getId()); // already merged node
+        assertEquals(12, mergedNodes.get(2).getId()); // already merged node
+        assertEquals(1, mergedNodes.get(3).getId());  // copied node 1 at position 3
+        assertEquals(2, mergedNodes.get(4).getId());  // copied node 2 at position 4
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 3, 4); // position 3,4 selected
+    }
+
+    @Test
+    public void test_copyMyNodesAfterCurrent_3() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = my.addWay(1, 1);
+        myWay.addNode(my.addNode(1));
+        myWay.addNode(my.addNode(2));
+        myWay.addNode(my.addNode(3));
+        Way theirWay = their.addWay(1);
+
+        model.populate(myWay, theirWay, null);
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(10));
+        mergedNodes.add(new Node(11));
+        mergedNodes.add(new Node(12));
+
+        model.copyMyAfterCurrent(new int[]{0, 2}, 0);
+
+        assertEquals(5, mergedNodes.size());
+        assertEquals(10, mergedNodes.get(0).getId()); // already merged node
+        assertEquals(1, mergedNodes.get(1).getId());  // copied node 1 at position 1
+        assertEquals(3, mergedNodes.get(2).getId());  // copied node 3 at position 2
+        assertEquals(11, mergedNodes.get(3).getId()); // already merged node
+        assertEquals(12, mergedNodes.get(4).getId()); // already merged node
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 1, 2); // position 1,2 selected
+    }
+
+
+    /* ----------------------------------------------------------------------------- */
+    /* moveUpMergedNodes                                                       */
+    /* ----------------------------------------------------------------------------- */
+    @Test
+    public void test_moveUpMergedNodes_1() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = new Way(1, 1);
+        myWay.addNode(new Node(1));
+        myWay.addNode(new Node(2));
+        Way theirWay = new Way(1);
+
+        model.populate(myWay, theirWay, null);
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(10));
+        mergedNodes.add(new Node(11));
+        mergedNodes.add(new Node(12));
+
+        model.moveUpMerged(new int[]{1});
+
+        assertEquals(3, mergedNodes.size());
+        assertEquals(11, mergedNodes.get(0).getId());
+        assertEquals(10, mergedNodes.get(1).getId());
+        assertEquals(12, mergedNodes.get(2).getId());
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 0); // position 1 selecte0
+    }
+
+    @Test
+    public void test_moveUpMergedNodes_2() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = new Way(1, 1);
+        myWay.addNode(new Node(1));
+        myWay.addNode(new Node(2));
+        Way theirWay = new Way(1);
+
+        model.populate(myWay, theirWay, null);
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(10));
+        mergedNodes.add(new Node(11));
+        mergedNodes.add(new Node(12));
+        mergedNodes.add(new Node(13));
+        mergedNodes.add(new Node(14));
+
+        model.moveUpMerged(new int[]{1, 4});
+
+        assertEquals(5, mergedNodes.size());
+        assertEquals(11, mergedNodes.get(0).getId());
+        assertEquals(10, mergedNodes.get(1).getId());
+        assertEquals(12, mergedNodes.get(2).getId());
+        assertEquals(14, mergedNodes.get(3).getId());
+        assertEquals(13, mergedNodes.get(4).getId());
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 0, 3); // position 0 and 3 selecte0
+    }
+
+    @Test
+    public void test_moveUpMergedNodes_3() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = new Way(1, 1);
+        myWay.addNode(new Node(1));
+        myWay.addNode(new Node(2));
+        Way theirWay = new Way(1);
+
+        model.populate(myWay, theirWay, null);
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(10));
+        mergedNodes.add(new Node(11));
+        mergedNodes.add(new Node(12));
+        mergedNodes.add(new Node(13));
+        mergedNodes.add(new Node(14));
+
+        model.moveUpMerged(new int[]{1, 2, 3, 4});
+
+        assertEquals(5, mergedNodes.size());
+        assertEquals(11, mergedNodes.get(0).getId());
+        assertEquals(12, mergedNodes.get(1).getId());
+        assertEquals(13, mergedNodes.get(2).getId());
+        assertEquals(14, mergedNodes.get(3).getId());
+        assertEquals(10, mergedNodes.get(4).getId());
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 0, 1, 2, 3);
+    }
+
+    /* ----------------------------------------------------------------------------- */
+    /* moveDownMergedNodes                                                       */
+    /* ----------------------------------------------------------------------------- */
+    @Test
+    public void test_moveDownMergedNodes_1() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = new Way(1, 1);
+        myWay.addNode(new Node(1));
+        myWay.addNode(new Node(2));
+        Way theirWay = new Way(1);
+
+        model.populate(myWay, theirWay, null);
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(10));
+        mergedNodes.add(new Node(11));
+        mergedNodes.add(new Node(12));
+
+        model.moveDownMerged(new int[]{1});
+
+        assertEquals(3, mergedNodes.size());
+        assertEquals(10, mergedNodes.get(0).getId());
+        assertEquals(12, mergedNodes.get(1).getId());
+        assertEquals(11, mergedNodes.get(2).getId());
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 2);
+    }
+
+    @Test
+    public void test_moveDownMergedNodes_2() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = new Way(1, 1);
+        myWay.addNode(new Node(1));
+        myWay.addNode(new Node(2));
+        Way theirWay = new Way(1);
+
+        model.populate(myWay, theirWay, null);
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(10));
+        mergedNodes.add(new Node(11));
+        mergedNodes.add(new Node(12));
+        mergedNodes.add(new Node(13));
+        mergedNodes.add(new Node(14));
+
+        model.moveDownMerged(new int[]{1, 3});
+
+        assertEquals(5, mergedNodes.size());
+        assertEquals(10, mergedNodes.get(0).getId());
+        assertEquals(12, mergedNodes.get(1).getId());
+        assertEquals(11, mergedNodes.get(2).getId());
+        assertEquals(14, mergedNodes.get(3).getId());
+        assertEquals(13, mergedNodes.get(4).getId());
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 2, 4);
+    }
+
+    @Test
+    public void test_moveDownMergedNodes_3() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        Way myWay = new Way(1, 1);
+        myWay.addNode(new Node(1));
+        myWay.addNode(new Node(2));
+        Way theirWay = new Way(1);
+
+        model.populate(myWay, theirWay, null);
+        List<Node> mergedNodes = inspectNodeList(model, "Merged");
+        mergedNodes.add(new Node(10));
+        mergedNodes.add(new Node(11));
+        mergedNodes.add(new Node(12));
+        mergedNodes.add(new Node(13));
+        mergedNodes.add(new Node(14));
+
+        model.moveDownMerged(new int[]{1, 2, 3});
+
+        assertEquals(5, mergedNodes.size());
+        assertEquals(10, mergedNodes.get(0).getId());
+        assertEquals(14, mergedNodes.get(1).getId());
+        assertEquals(11, mergedNodes.get(2).getId());
+        assertEquals(12, mergedNodes.get(3).getId());
+        assertEquals(13, mergedNodes.get(4).getId());
+
+        DefaultListSelectionModel mergedSelection = inspectListSelectionModel(model, "mergedEntriesSelectionModel");
+        ensureSelected(mergedSelection, 2, 3, 4);
+    }
+
+    /* ----------------------------------------------------------------------------- */
+    /* PropertyChangeListener                                                        */
+    /* ----------------------------------------------------------------------------- */
+    @SuppressWarnings("unchecked")
+    @Test
+    public void addPropertyChangeListener() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        PropertyChangeListener listener = new PropertyChangeListener() {
+
+            public void propertyChange(PropertyChangeEvent evt) {
+            }
+        };
+
+        model.addPropertyChangeListener(listener);
+
+        Set<PropertyChangeListener> listeners = field("listeners")
+        .ofType(Set.class)
+        .in(model)
+        .get();
+
+        assertEquals(1, listeners.size());
+        assertEquals(listener, listeners.iterator().next());
+    }
+
+    @SuppressWarnings("unchecked")
+    @Test
+    public void removePropertyChangeListener() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        PropertyChangeListener listener = new PropertyChangeListener() {
+
+            public void propertyChange(PropertyChangeEvent evt) {
+            }
+        };
+
+        model.addPropertyChangeListener(listener);
+        model.removePropertyChangeListener(listener);
+
+        Set<PropertyChangeListener> listeners = field("listeners")
+        .ofType(Set.class)
+        .in(model)
+        .get();
+
+        assertEquals(0, listeners.size());
+    }
+
+    /* ----------------------------------------------------------------------------- */
+    /* property frozen                                                               */
+    /* ----------------------------------------------------------------------------- */
+    @Test
+    public void setFrozen() {
+        NodeListMergeModel model = new NodeListMergeModel();
+        model.setFrozen(true);
+        assertTrue(model.isFrozen());
+
+        model.setFrozen(false);
+        assertFalse(model.isFrozen());
+    }
+
+    @Test
+    public void setFrozenWithPropertyChangeNotification() {
+        NodeListMergeModel model = new NodeListMergeModel();
+
+        class MyListener implements PropertyChangeListener {
+            public ArrayList<PropertyChangeEvent> events = new ArrayList<>();
+
+            public void propertyChange(PropertyChangeEvent evt) {
+                events.add(evt);
+            }
+        }
+
+        MyListener listener = new MyListener();
+        model.addPropertyChangeListener(listener);
+        boolean oldValue = model.isFrozen();
+        model.setFrozen(!oldValue);
+        assertEquals(!oldValue, model.isFrozen());
+
+        assertEquals(1, listener.events.size());
+        assertEquals(oldValue, listener.events.get(0).getOldValue());
+        assertEquals(!oldValue, listener.events.get(0).getNewValue());
+    }
+}
Index: /trunk/test/unit/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMergerTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMergerTest.java	(revision 9546)
+++ /trunk/test/unit/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMergerTest.java	(revision 9546)
@@ -0,0 +1,30 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.conflict.pair.nodes;
+
+import static org.junit.Assert.assertNotNull;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+
+/**
+ * Unit tests of {@link NodeListMerger} class.
+ */
+public class NodeListMergerTest {
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    /**
+     * Unit test of {@link NodeListMerger#NodeListMerger}.
+     */
+    @Test
+    public void testNodeListMerger() {
+        assertNotNull(new NodeListMerger());
+    }
+}
Index: /trunk/test/unit/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergeModelTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergeModelTest.java	(revision 9546)
+++ /trunk/test/unit/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergeModelTest.java	(revision 9546)
@@ -0,0 +1,145 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.conflict.pair.properties;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertFalse;
+import static org.junit.Assert.assertTrue;
+
+import java.util.Observable;
+import java.util.Observer;
+
+import org.junit.Before;
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.data.conflict.Conflict;
+import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.data.osm.DataSet;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
+import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.gui.conflict.pair.MergeDecisionType;
+import org.openstreetmap.josm.gui.conflict.pair.properties.PropertiesMergeModel;
+
+public class PropertiesMergeModelTest {
+
+    public abstract static class TestObserver implements Observer {
+        public int numInvocations;
+
+        public void update(Observable o, Object arg) {
+            numInvocations++;
+            test();
+        }
+
+        public abstract void test();
+
+        public void assertNumInvocations(int count) {
+            assertEquals(count, numInvocations);
+        }
+    }
+
+    PropertiesMergeModel model;
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void init() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    /**
+     * Setup test.
+     */
+    @Before
+    public void setUp() {
+        model = new PropertiesMergeModel();
+    }
+
+    private void populate(OsmPrimitive my, OsmPrimitive their) {
+        model.populate(new Conflict<>(my, their));
+    }
+
+    @Test
+    public void populate() {
+        DataSet d1 = new DataSet();
+        DataSet d2 = new DataSet();
+        Node n1 = new Node(1);
+        Node n2 = new Node(1);
+        d1.addPrimitive(n1);
+        d2.addPrimitive(n2);
+        populate(n1, n2);
+
+        Way w1 = new Way(1);
+        Way w2 = new Way(1);
+        d1.addPrimitive(w1);
+        d2.addPrimitive(w2);
+        populate(w2, w2);
+
+        Relation r1 = new Relation(1);
+        Relation r2 = new Relation(1);
+        d1.addPrimitive(r1);
+        d2.addPrimitive(r2);
+        populate(r1, r2);
+    }
+
+    @Test
+    public void decidingAboutCoords() {
+        DataSet d1 = new DataSet();
+        DataSet d2 = new DataSet();
+
+        Node n1 = new Node(1);
+        Node n2 = new Node(1);
+        d1.addPrimitive(n1);
+        d2.addPrimitive(n2);
+        populate(n1, n2);
+        assertFalse(model.hasCoordConflict());
+
+        n1.setCoor(new LatLon(1, 1));
+        populate(n1, n2);
+        assertTrue(model.hasCoordConflict());
+
+
+        n1.cloneFrom(new Node(1));
+        n2.setCoor(new LatLon(2, 2));
+        populate(n1, n2);
+        assertTrue(model.hasCoordConflict());
+
+        n1.setCoor(new LatLon(1, 1));
+        n2.setCoor(new LatLon(2, 2));
+        populate(n1, n2);
+        assertTrue(model.hasCoordConflict());
+
+        // decide KEEP_MINE  and ensure notification via Observable
+        //
+        TestObserver observerTest;
+        model.addObserver(
+                observerTest = new TestObserver() {
+                    @Override
+                    public void test() {
+                        assertTrue(model.isCoordMergeDecision(MergeDecisionType.KEEP_MINE));
+                    }
+                }
+        );
+        model.decideCoordsConflict(MergeDecisionType.KEEP_MINE);
+        assertTrue(model.isCoordMergeDecision(MergeDecisionType.KEEP_MINE));
+        observerTest.assertNumInvocations(1);
+
+        // decide KEEP_THEIR and  ensure notification via Observable
+        //
+        model.deleteObserver(observerTest);
+        model.addObserver(
+                observerTest = new TestObserver() {
+                    @Override
+                    public void test() {
+                        assertTrue(model.isCoordMergeDecision(MergeDecisionType.KEEP_THEIR));
+                    }
+                }
+        );
+        model.decideCoordsConflict(MergeDecisionType.KEEP_THEIR);
+        assertTrue(model.isCoordMergeDecision(MergeDecisionType.KEEP_THEIR));
+        observerTest.assertNumInvocations(1);
+        model.deleteObserver(observerTest);
+    }
+}
Index: /trunk/test/unit/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergerTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergerTest.java	(revision 9546)
+++ /trunk/test/unit/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergerTest.java	(revision 9546)
@@ -0,0 +1,30 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.conflict.pair.properties;
+
+import static org.junit.Assert.assertNotNull;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+
+/**
+ * Unit tests of {@link PropertiesMerger} class.
+ */
+public class PropertiesMergerTest {
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    /**
+     * Unit test of {@link PropertiesMerger#PropertiesMerger}.
+     */
+    @Test
+    public void testPropertiesMerger() {
+        assertNotNull(new PropertiesMerger());
+    }
+}
Index: /trunk/test/unit/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberMergerTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberMergerTest.java	(revision 9546)
+++ /trunk/test/unit/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberMergerTest.java	(revision 9546)
@@ -0,0 +1,30 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.conflict.pair.relation;
+
+import static org.junit.Assert.assertNotNull;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+
+/**
+ * Unit tests of {@link RelationMemberMerger} class.
+ */
+public class RelationMemberMergerTest {
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    /**
+     * Unit test of {@link RelationMemberMerger#RelationMemberMerger}.
+     */
+    @Test
+    public void testRelationMemberMerger() {
+        assertNotNull(new RelationMemberMerger());
+    }
+}
Index: /trunk/test/unit/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergeItemTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergeItemTest.java	(revision 9546)
+++ /trunk/test/unit/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergeItemTest.java	(revision 9546)
@@ -0,0 +1,165 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.conflict.pair.tags;
+
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+import static org.junit.Assert.fail;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.gui.conflict.pair.MergeDecisionType;
+import org.openstreetmap.josm.gui.conflict.pair.tags.TagMergeItem;
+
+/**
+ * Unit tests of {@link TagMergeItem} class.
+ */
+public class TagMergeItemTest {
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void init() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    @Test
+    public void test_TagMergeItem() {
+        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
+        assertEquals("key", item.getKey());
+        assertEquals("myvalue", item.getMyTagValue());
+        assertEquals("theirvalue", item.getTheirTagValue());
+        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
+    }
+
+    @Test
+    public void test_TagMergeItem_2() {
+        Node n1 = new Node(1);
+        Node n2 = new Node(1);
+        n1.put("key", "myvalue");
+        n2.put("key", "theirvalue");
+
+        TagMergeItem item = new TagMergeItem("key", n1, n2);
+        assertEquals("key", item.getKey());
+        assertEquals("myvalue", item.getMyTagValue());
+        assertEquals("theirvalue", item.getTheirTagValue());
+        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
+    }
+
+    @Test
+    public void test_TagMergeItem_3() {
+        Node n1 = new Node(1);
+        Node n2 = new Node(1);
+        n1.put("key", "myvalue");
+        // n2 does not have this key
+
+        TagMergeItem item = new TagMergeItem("key", n1, n2);
+        assertEquals("key", item.getKey());
+        assertEquals("myvalue", item.getMyTagValue());
+        assertNull(item.getTheirTagValue());
+        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
+    }
+
+    @Test
+    public void test_TagMergeItem_4() {
+        Node n1 = new Node(1);
+        Node n2 = new Node(1);
+        // n1 does not have this key
+        // n1.put("key", "myvalue");
+        n2.put("key", "theirvalue");
+
+        TagMergeItem item = new TagMergeItem("key", n1, n2);
+        assertEquals("key", item.getKey());
+        assertNull(item.getMyTagValue());
+        assertEquals("theirvalue", item.getTheirTagValue());
+        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
+    }
+
+    @Test
+    public void test_decide() {
+        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
+        item.decide(MergeDecisionType.KEEP_MINE);
+        assertEquals(MergeDecisionType.KEEP_MINE, item.getMergeDecision());
+    }
+
+    @Test
+    public void test_decide_1() {
+        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
+        try {
+            item.decide(null);
+            fail("expected IllegalArgumentException not thrown");
+        } catch (IllegalArgumentException e) {
+            // OK
+            if (Main.isTraceEnabled()) {
+                Main.trace(e.getMessage());
+            }
+        }
+    }
+
+    @Test
+    public void test_applyToMyPrimitive() {
+        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
+        item.decide(MergeDecisionType.KEEP_MINE);
+
+        Node n1 = new Node(1);
+        n1.put("key", "oldvalue");
+        item.applyToMyPrimitive(n1);
+        assertEquals("myvalue", n1.get("key"));
+
+        n1 = new Node(1);
+        item.applyToMyPrimitive(n1);
+        assertEquals("myvalue", n1.get("key"));
+    }
+
+    @Test
+    public void test_applyToMyPrimitive_2() {
+        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
+        item.decide(MergeDecisionType.KEEP_THEIR);
+
+        Node n1 = new Node(1);
+        n1.put("key", "oldvalue");
+        item.applyToMyPrimitive(n1);
+        assertEquals("theirvalue", n1.get("key"));
+
+        n1 = new Node(1);
+        item.applyToMyPrimitive(n1);
+        assertEquals("theirvalue", n1.get("key"));
+    }
+
+    @Test
+    public void test_applyToMyPrimitive_3() {
+        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
+        // item is undecided
+        // item.decide(MergeDecisionType.KEEP_THEIR);
+
+        Node n1 = new Node(1);
+        n1.put("key", "oldvalue");
+        try {
+            item.applyToMyPrimitive(n1);
+            fail("expected IllegalStateException");
+        } catch (IllegalStateException e) {
+            // OK
+            if (Main.isTraceEnabled()) {
+                Main.trace(e.getMessage());
+            }
+        }
+    }
+
+    @Test
+    public void test_applyToMyPrimitive_4() {
+        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
+
+        try {
+            item.applyToMyPrimitive(null);
+            fail("expected IllegalArgumentException");
+        } catch (IllegalArgumentException e) {
+            // OK
+            if (Main.isTraceEnabled()) {
+                Main.trace(e.getMessage());
+            }
+        }
+    }
+}
Index: /trunk/test/unit/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergeModelTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergeModelTest.java	(revision 9546)
+++ /trunk/test/unit/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergeModelTest.java	(revision 9546)
@@ -0,0 +1,239 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.conflict.pair.tags;
+
+import static org.fest.reflect.core.Reflection.field;
+import static org.junit.Assert.assertEquals;
+import static org.junit.Assert.assertNull;
+
+import java.beans.PropertyChangeEvent;
+import java.beans.PropertyChangeListener;
+import java.util.List;
+import java.util.Set;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.gui.conflict.pair.MergeDecisionType;
+import org.openstreetmap.josm.gui.conflict.pair.tags.TagMergeItem;
+import org.openstreetmap.josm.gui.conflict.pair.tags.TagMergeModel;
+
+/**
+ * Unit tests of {@link TagMergeModel} class.
+ */
+@SuppressWarnings("unchecked")
+public class TagMergeModelTest {
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void init() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    @Test
+    public void addPropertyChangeListener() {
+        TagMergeModel model = new TagMergeModel();
+        PropertyChangeListener listener = new PropertyChangeListener() {
+
+            public void propertyChange(PropertyChangeEvent evt) {
+            }
+        };
+        model.addPropertyChangeListener(listener);
+
+        Set<?> list = field("listeners").ofType(Set.class)
+        .in(model)
+        .get();
+
+        assertEquals(1, list.size());
+        assertEquals(listener, list.iterator().next());
+    }
+
+    @Test
+    public void removePropertyChangeListener() {
+        TagMergeModel model = new TagMergeModel();
+        PropertyChangeListener listener = new PropertyChangeListener() {
+
+            public void propertyChange(PropertyChangeEvent evt) {
+            }
+        };
+        model.addPropertyChangeListener(listener);
+        model.removePropertyChangeListener(listener);
+
+        Set<?> list = field("listeners")
+        .ofType(Set.class)
+        .in(model)
+        .get();
+
+        assertEquals(0, list.size());
+    }
+
+    @Test
+    public void populateNoConflichts() {
+        Node my = new Node(1);
+        Node their = new Node(1);
+        TagMergeModel model = new TagMergeModel();
+        model.populate(my, their);
+
+        List<TagMergeItem> list = field("tagMergeItems")
+        .ofType(List.class)
+        .in(model)
+        .get();
+
+        assertEquals(0, list.size());
+    }
+
+    @Test
+    public void populateNoConflicts1() {
+        Node my = new Node(1);
+        my.put("key", "value");
+        Node their = new Node(1);
+        their.put("key", "value");
+        TagMergeModel model = new TagMergeModel();
+        model.populate(my, their);
+
+        List<TagMergeItem> list = field("tagMergeItems")
+        .ofType(List.class)
+        .in(model)
+        .get();
+
+        assertEquals(0, list.size());
+    }
+
+    @Test
+    public void populateMissingKeyMine() {
+        Node my = new Node(1);
+        Node their = new Node(1);
+        their.put("key", "value");
+        TagMergeModel model = new TagMergeModel();
+        model.populate(my, their);
+
+        List<TagMergeItem> list = field("tagMergeItems")
+        .ofType(List.class)
+        .in(model)
+        .get();
+
+        assertEquals(1, list.size());
+        TagMergeItem item = list.get(0);
+        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
+        assertEquals("key", item.getKey());
+        assertNull(item.getMyTagValue());
+        assertEquals("value", item.getTheirTagValue());
+    }
+
+    @Test
+    public void populateMissingKeyTheir() {
+        Node my = new Node(1);
+        my.put("key", "value");
+        Node their = new Node(1);
+        TagMergeModel model = new TagMergeModel();
+        model.populate(my, their);
+
+        List<TagMergeItem> list = field("tagMergeItems")
+        .ofType(List.class)
+        .in(model)
+        .get();
+
+        assertEquals(1, list.size());
+        TagMergeItem item = list.get(0);
+        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
+        assertEquals("key", item.getKey());
+        assertNull(item.getTheirTagValue());
+        assertEquals("value", item.getMyTagValue());
+    }
+
+    @Test
+    public void populateConflictingValues() {
+        Node my = new Node(1);
+        my.put("key", "myvalue");
+        Node their = new Node(1);
+        their.put("key", "theirvalue");
+        TagMergeModel model = new TagMergeModel();
+        model.populate(my, their);
+
+        List<TagMergeItem> list = field("tagMergeItems")
+        .ofType(List.class)
+        .in(model)
+        .get();
+
+        assertEquals(1, list.size());
+        TagMergeItem item = list.get(0);
+        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
+        assertEquals("key", item.getKey());
+        assertEquals("myvalue", item.getMyTagValue());
+        assertEquals("theirvalue", item.getTheirTagValue());
+    }
+
+    @Test
+    public void addItem() {
+        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
+        TagMergeModel model = new TagMergeModel();
+        model.addItem(item);
+
+        List<TagMergeItem> list = field("tagMergeItems")
+        .ofType(List.class)
+        .in(model)
+        .get();
+
+        assertEquals(1, list.size());
+        item = list.get(0);
+        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
+        assertEquals("key", item.getKey());
+        assertEquals("myvalue", item.getMyTagValue());
+        assertEquals("theirvalue", item.getTheirTagValue());
+    }
+
+    @Test
+    public void decide() {
+        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
+        TagMergeModel model = new TagMergeModel();
+        model.addItem(item);
+
+        List<TagMergeItem> list = field("tagMergeItems")
+        .ofType(List.class)
+        .in(model)
+        .get();
+
+        model.decide(0, MergeDecisionType.KEEP_MINE);
+        assertEquals(1, list.size());
+        item = list.get(0);
+        assertEquals(MergeDecisionType.KEEP_MINE, item.getMergeDecision());
+
+        model.decide(0, MergeDecisionType.KEEP_THEIR);
+        assertEquals(1, list.size());
+        item = list.get(0);
+        assertEquals(MergeDecisionType.KEEP_THEIR, item.getMergeDecision());
+
+        model.decide(0, MergeDecisionType.UNDECIDED);
+        assertEquals(1, list.size());
+        item = list.get(0);
+        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
+    }
+
+    @Test
+    public void decideMultiple() {
+
+        TagMergeModel model = new TagMergeModel();
+        for (int i = 0; i < 10; i++) {
+            model.addItem(new TagMergeItem("key-" + i, "myvalue-" + i, "theirvalue-" +i));
+        }
+
+        List<TagMergeItem> list = field("tagMergeItems")
+        .ofType(List.class)
+        .in(model)
+        .get();
+
+        assertEquals(10, list.size());
+
+        model.decide(new int[] {0, 3, 5}, MergeDecisionType.KEEP_MINE);
+        for (int i = 0; i < 10; i++) {
+            TagMergeItem item = list.get(i);
+            if (i == 0 || i == 3 || i == 5) {
+                assertEquals(MergeDecisionType.KEEP_MINE, item.getMergeDecision());
+            } else {
+                assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
+            }
+        }
+    }
+}
Index: /trunk/test/unit/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergerTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergerTest.java	(revision 9546)
+++ /trunk/test/unit/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergerTest.java	(revision 9546)
@@ -0,0 +1,30 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.conflict.pair.tags;
+
+import static org.junit.Assert.assertNotNull;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+
+/**
+ * Unit tests of {@link TagMerger} class.
+ */
+public class TagMergerTest {
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void setUpBeforeClass() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    /**
+     * Unit test of {@link TagMerger#TagMerger}.
+     */
+    @Test
+    public void testTagMerger() {
+        assertNotNull(new TagMerger());
+    }
+}
Index: unk/test/unit/org/openstreetmap/josm/gui/conflict/tags/TagMergeItemTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/gui/conflict/tags/TagMergeItemTest.java	(revision 9545)
+++ 	(revision )
@@ -1,165 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.conflict.tags;
-
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-import static org.junit.Assert.fail;
-
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
-import org.openstreetmap.josm.Main;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.gui.conflict.pair.MergeDecisionType;
-import org.openstreetmap.josm.gui.conflict.pair.tags.TagMergeItem;
-
-/**
- * Unit tests of {@link TagMergeItem} class.
- */
-public class TagMergeItemTest {
-
-    /**
-     * Setup test.
-     */
-    @BeforeClass
-    public static void init() {
-        JOSMFixture.createUnitTestFixture().init();
-    }
-
-    @Test
-    public void test_TagMergeItem() {
-        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
-        assertEquals("key", item.getKey());
-        assertEquals("myvalue", item.getMyTagValue());
-        assertEquals("theirvalue", item.getTheirTagValue());
-        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
-    }
-
-    @Test
-    public void test_TagMergeItem_2() {
-        Node n1 = new Node(1);
-        Node n2 = new Node(1);
-        n1.put("key", "myvalue");
-        n2.put("key", "theirvalue");
-
-        TagMergeItem item = new TagMergeItem("key", n1, n2);
-        assertEquals("key", item.getKey());
-        assertEquals("myvalue", item.getMyTagValue());
-        assertEquals("theirvalue", item.getTheirTagValue());
-        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
-    }
-
-    @Test
-    public void test_TagMergeItem_3() {
-        Node n1 = new Node(1);
-        Node n2 = new Node(1);
-        n1.put("key", "myvalue");
-        // n2 does not have this key
-
-        TagMergeItem item = new TagMergeItem("key", n1, n2);
-        assertEquals("key", item.getKey());
-        assertEquals("myvalue", item.getMyTagValue());
-        assertNull(item.getTheirTagValue());
-        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
-    }
-
-    @Test
-    public void test_TagMergeItem_4() {
-        Node n1 = new Node(1);
-        Node n2 = new Node(1);
-        // n1 does not have this key
-        // n1.put("key", "myvalue");
-        n2.put("key", "theirvalue");
-
-        TagMergeItem item = new TagMergeItem("key", n1, n2);
-        assertEquals("key", item.getKey());
-        assertNull(item.getMyTagValue());
-        assertEquals("theirvalue", item.getTheirTagValue());
-        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
-    }
-
-    @Test
-    public void test_decide() {
-        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
-        item.decide(MergeDecisionType.KEEP_MINE);
-        assertEquals(MergeDecisionType.KEEP_MINE, item.getMergeDecision());
-    }
-
-    @Test
-    public void test_decide_1() {
-        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
-        try {
-            item.decide(null);
-            fail("expected IllegalArgumentException not thrown");
-        } catch (IllegalArgumentException e) {
-            // OK
-            if (Main.isTraceEnabled()) {
-                Main.trace(e.getMessage());
-            }
-        }
-    }
-
-    @Test
-    public void test_applyToMyPrimitive() {
-        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
-        item.decide(MergeDecisionType.KEEP_MINE);
-
-        Node n1 = new Node(1);
-        n1.put("key", "oldvalue");
-        item.applyToMyPrimitive(n1);
-        assertEquals("myvalue", n1.get("key"));
-
-        n1 = new Node(1);
-        item.applyToMyPrimitive(n1);
-        assertEquals("myvalue", n1.get("key"));
-    }
-
-    @Test
-    public void test_applyToMyPrimitive_2() {
-        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
-        item.decide(MergeDecisionType.KEEP_THEIR);
-
-        Node n1 = new Node(1);
-        n1.put("key", "oldvalue");
-        item.applyToMyPrimitive(n1);
-        assertEquals("theirvalue", n1.get("key"));
-
-        n1 = new Node(1);
-        item.applyToMyPrimitive(n1);
-        assertEquals("theirvalue", n1.get("key"));
-    }
-
-    @Test
-    public void test_applyToMyPrimitive_3() {
-        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
-        // item is undecided
-        // item.decide(MergeDecisionType.KEEP_THEIR);
-
-        Node n1 = new Node(1);
-        n1.put("key", "oldvalue");
-        try {
-            item.applyToMyPrimitive(n1);
-            fail("expected IllegalStateException");
-        } catch (IllegalStateException e) {
-            // OK
-            if (Main.isTraceEnabled()) {
-                Main.trace(e.getMessage());
-            }
-        }
-    }
-
-    @Test
-    public void test_applyToMyPrimitive_4() {
-        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
-
-        try {
-            item.applyToMyPrimitive(null);
-            fail("expected IllegalArgumentException");
-        } catch (IllegalArgumentException e) {
-            // OK
-            if (Main.isTraceEnabled()) {
-                Main.trace(e.getMessage());
-            }
-        }
-    }
-}
Index: unk/test/unit/org/openstreetmap/josm/gui/conflict/tags/TagMergeModelTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/gui/conflict/tags/TagMergeModelTest.java	(revision 9545)
+++ 	(revision )
@@ -1,239 +1,0 @@
-// License: GPL. For details, see LICENSE file.
-package org.openstreetmap.josm.gui.conflict.tags;
-
-import static org.fest.reflect.core.Reflection.field;
-import static org.junit.Assert.assertEquals;
-import static org.junit.Assert.assertNull;
-
-import java.beans.PropertyChangeEvent;
-import java.beans.PropertyChangeListener;
-import java.util.List;
-import java.util.Set;
-
-import org.junit.BeforeClass;
-import org.junit.Test;
-import org.openstreetmap.josm.JOSMFixture;
-import org.openstreetmap.josm.data.osm.Node;
-import org.openstreetmap.josm.gui.conflict.pair.MergeDecisionType;
-import org.openstreetmap.josm.gui.conflict.pair.tags.TagMergeItem;
-import org.openstreetmap.josm.gui.conflict.pair.tags.TagMergeModel;
-
-/**
- * Unit tests of {@link TagMergeModel} class.
- */
-@SuppressWarnings("unchecked")
-public class TagMergeModelTest {
-
-    /**
-     * Setup test.
-     */
-    @BeforeClass
-    public static void init() {
-        JOSMFixture.createUnitTestFixture().init();
-    }
-
-    @Test
-    public void addPropertyChangeListener() {
-        TagMergeModel model = new TagMergeModel();
-        PropertyChangeListener listener = new PropertyChangeListener() {
-
-            public void propertyChange(PropertyChangeEvent evt) {
-            }
-        };
-        model.addPropertyChangeListener(listener);
-
-        Set<?> list = field("listeners").ofType(Set.class)
-        .in(model)
-        .get();
-
-        assertEquals(1, list.size());
-        assertEquals(listener, list.iterator().next());
-    }
-
-    @Test
-    public void removePropertyChangeListener() {
-        TagMergeModel model = new TagMergeModel();
-        PropertyChangeListener listener = new PropertyChangeListener() {
-
-            public void propertyChange(PropertyChangeEvent evt) {
-            }
-        };
-        model.addPropertyChangeListener(listener);
-        model.removePropertyChangeListener(listener);
-
-        Set<?> list = field("listeners")
-        .ofType(Set.class)
-        .in(model)
-        .get();
-
-        assertEquals(0, list.size());
-    }
-
-    @Test
-    public void populateNoConflichts() {
-        Node my = new Node(1);
-        Node their = new Node(1);
-        TagMergeModel model = new TagMergeModel();
-        model.populate(my, their);
-
-        List<TagMergeItem> list = field("tagMergeItems")
-        .ofType(List.class)
-        .in(model)
-        .get();
-
-        assertEquals(0, list.size());
-    }
-
-    @Test
-    public void populateNoConflicts1() {
-        Node my = new Node(1);
-        my.put("key", "value");
-        Node their = new Node(1);
-        their.put("key", "value");
-        TagMergeModel model = new TagMergeModel();
-        model.populate(my, their);
-
-        List<TagMergeItem> list = field("tagMergeItems")
-        .ofType(List.class)
-        .in(model)
-        .get();
-
-        assertEquals(0, list.size());
-    }
-
-    @Test
-    public void populateMissingKeyMine() {
-        Node my = new Node(1);
-        Node their = new Node(1);
-        their.put("key", "value");
-        TagMergeModel model = new TagMergeModel();
-        model.populate(my, their);
-
-        List<TagMergeItem> list = field("tagMergeItems")
-        .ofType(List.class)
-        .in(model)
-        .get();
-
-        assertEquals(1, list.size());
-        TagMergeItem item = list.get(0);
-        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
-        assertEquals("key", item.getKey());
-        assertNull(item.getMyTagValue());
-        assertEquals("value", item.getTheirTagValue());
-    }
-
-    @Test
-    public void populateMissingKeyTheir() {
-        Node my = new Node(1);
-        my.put("key", "value");
-        Node their = new Node(1);
-        TagMergeModel model = new TagMergeModel();
-        model.populate(my, their);
-
-        List<TagMergeItem> list = field("tagMergeItems")
-        .ofType(List.class)
-        .in(model)
-        .get();
-
-        assertEquals(1, list.size());
-        TagMergeItem item = list.get(0);
-        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
-        assertEquals("key", item.getKey());
-        assertNull(item.getTheirTagValue());
-        assertEquals("value", item.getMyTagValue());
-    }
-
-    @Test
-    public void populateConflictingValues() {
-        Node my = new Node(1);
-        my.put("key", "myvalue");
-        Node their = new Node(1);
-        their.put("key", "theirvalue");
-        TagMergeModel model = new TagMergeModel();
-        model.populate(my, their);
-
-        List<TagMergeItem> list = field("tagMergeItems")
-        .ofType(List.class)
-        .in(model)
-        .get();
-
-        assertEquals(1, list.size());
-        TagMergeItem item = list.get(0);
-        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
-        assertEquals("key", item.getKey());
-        assertEquals("myvalue", item.getMyTagValue());
-        assertEquals("theirvalue", item.getTheirTagValue());
-    }
-
-    @Test
-    public void addItem() {
-        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
-        TagMergeModel model = new TagMergeModel();
-        model.addItem(item);
-
-        List<TagMergeItem> list = field("tagMergeItems")
-        .ofType(List.class)
-        .in(model)
-        .get();
-
-        assertEquals(1, list.size());
-        item = list.get(0);
-        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
-        assertEquals("key", item.getKey());
-        assertEquals("myvalue", item.getMyTagValue());
-        assertEquals("theirvalue", item.getTheirTagValue());
-    }
-
-    @Test
-    public void decide() {
-        TagMergeItem item = new TagMergeItem("key", "myvalue", "theirvalue");
-        TagMergeModel model = new TagMergeModel();
-        model.addItem(item);
-
-        List<TagMergeItem> list = field("tagMergeItems")
-        .ofType(List.class)
-        .in(model)
-        .get();
-
-        model.decide(0, MergeDecisionType.KEEP_MINE);
-        assertEquals(1, list.size());
-        item = list.get(0);
-        assertEquals(MergeDecisionType.KEEP_MINE, item.getMergeDecision());
-
-        model.decide(0, MergeDecisionType.KEEP_THEIR);
-        assertEquals(1, list.size());
-        item = list.get(0);
-        assertEquals(MergeDecisionType.KEEP_THEIR, item.getMergeDecision());
-
-        model.decide(0, MergeDecisionType.UNDECIDED);
-        assertEquals(1, list.size());
-        item = list.get(0);
-        assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
-    }
-
-    @Test
-    public void decideMultiple() {
-
-        TagMergeModel model = new TagMergeModel();
-        for (int i = 0; i < 10; i++) {
-            model.addItem(new TagMergeItem("key-" + i, "myvalue-" + i, "theirvalue-" +i));
-        }
-
-        List<TagMergeItem> list = field("tagMergeItems")
-        .ofType(List.class)
-        .in(model)
-        .get();
-
-        assertEquals(10, list.size());
-
-        model.decide(new int[] {0, 3, 5}, MergeDecisionType.KEEP_MINE);
-        for (int i = 0; i < 10; i++) {
-            TagMergeItem item = list.get(i);
-            if (i == 0 || i == 3 || i == 5) {
-                assertEquals(MergeDecisionType.KEEP_MINE, item.getMergeDecision());
-            } else {
-                assertEquals(MergeDecisionType.UNDECIDED, item.getMergeDecision());
-            }
-        }
-    }
-}
Index: /trunk/test/unit/org/openstreetmap/josm/tools/PairTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/tools/PairTest.java	(revision 9546)
+++ /trunk/test/unit/org/openstreetmap/josm/tools/PairTest.java	(revision 9546)
@@ -0,0 +1,21 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.tools;
+
+import org.junit.Test;
+
+import nl.jqno.equalsverifier.EqualsVerifier;
+import nl.jqno.equalsverifier.Warning;
+
+/**
+ * Unit tests of {@link Pair} class.
+ */
+public class PairTest {
+
+    /**
+     * Unit test of methods {@link Pair#equals} and {@link Pair#hashCode}.
+     */
+    @Test
+    public void equalsContract() {
+        EqualsVerifier.forClass(Pair.class).suppress(Warning.NONFINAL_FIELDS).verify();
+    }
+}
