Index: /trunk/src/org/openstreetmap/josm/command/DeletedStateConflictResolveCommand.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/command/DeletedStateConflictResolveCommand.java	(revision 2944)
+++ /trunk/src/org/openstreetmap/josm/command/DeletedStateConflictResolveCommand.java	(revision 2945)
@@ -72,5 +72,5 @@
                 conflict.getMy().setDeleted(true);
             } else {
-                conflict.getMy().setDeleted(conflict.getTheir().isDeleted());
+                conflict.getMy().setDeleted(false);
             }
         } else
Index: /trunk/src/org/openstreetmap/josm/gui/conflict/pair/ConflictResolver.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/conflict/pair/ConflictResolver.java	(revision 2944)
+++ /trunk/src/org/openstreetmap/josm/gui/conflict/pair/ConflictResolver.java	(revision 2945)
@@ -231,5 +231,5 @@
         setMy(my);
         setTheir(their);
-        propertiesMerger.getModel().populate(my, their);
+        propertiesMerger.populate(my, their);
         if (propertiesMerger.getModel().hasVisibleStateConflict()) {
             tabbedPane.setEnabledAt(1, false);
@@ -239,5 +239,5 @@
         }
         tabbedPane.setEnabledAt(0, true);
-        tagMerger.getModel().populate(my, their);
+        tagMerger.populate(my, their);
         tabbedPane.setEnabledAt(1, true);
 
@@ -246,5 +246,5 @@
             tabbedPane.setEnabledAt(3,false);
         } else if (my instanceof Way) {
-            nodeListMerger.populate((Way)my, (Way)their);
+            nodeListMerger.populate(my, their);
             tabbedPane.setEnabledAt(2, true);
             tabbedPane.setEnabledAt(3, false);
@@ -252,5 +252,5 @@
             tabbedPane.setIconAt(3, null);
         } else if (my instanceof Relation) {
-            relationMemberMerger.populate((Relation)my, (Relation)their);
+            relationMemberMerger.populate(my, their);
             tabbedPane.setEnabledAt(2, false);
             tabbedPane.setTitleAt(2,tr("Nodes"));
Index: /trunk/src/org/openstreetmap/josm/gui/conflict/pair/IConflictResolver.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/conflict/pair/IConflictResolver.java	(revision 2944)
+++ /trunk/src/org/openstreetmap/josm/gui/conflict/pair/IConflictResolver.java	(revision 2945)
@@ -1,8 +1,11 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.gui.conflict.pair;
+
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
 
 public interface IConflictResolver {
 
     void deletePrimitive(boolean deleted);
+    void populate(OsmPrimitive my, OsmPrimitive their);
 
 }
Index: /trunk/src/org/openstreetmap/josm/gui/conflict/pair/ListMergeModel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/conflict/pair/ListMergeModel.java	(revision 2944)
+++ /trunk/src/org/openstreetmap/josm/gui/conflict/pair/ListMergeModel.java	(revision 2945)
@@ -310,4 +310,10 @@
     }
 
+    public void copyAll(ListRole source) {
+        getMergedEntries().clear();
+        getMergedEntries().addAll(entries.get(source));
+        fireModelDataChanged();
+    }
+
     /**
      * Copies the nodes given by indices in rows from the list of  nodes <code>source</code> to the
Index: /trunk/src/org/openstreetmap/josm/gui/conflict/pair/ListMerger.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/conflict/pair/ListMerger.java	(revision 2944)
+++ /trunk/src/org/openstreetmap/josm/gui/conflict/pair/ListMerger.java	(revision 2945)
@@ -57,4 +57,5 @@
     private CopyAfterCurrentLeftAction copyAfterCurrentLeftAction;
     private CopyEndLeftAction copyEndLeftAction;
+    private CopyAllLeft copyAllLeft;
 
     private CopyStartRightAction copyStartRightAction;
@@ -62,4 +63,5 @@
     private CopyAfterCurrentRightAction copyAfterCurrentRightAction;
     private CopyEndRightAction copyEndRightAction;
+    private CopyAllRight copyAllRight;
 
     private MoveUpMergedAction moveUpMergedAction;
@@ -118,4 +120,9 @@
         mergedEntriesTable.getSelectionModel().addListSelectionListener(moveDownMergedAction);
         mergedEntriesTable.getSelectionModel().addListSelectionListener(removeMergedAction);
+
+        model.addObserver(copyAllLeft);
+        model.addObserver(copyAllRight);
+        model.addPropertyChangeListener(copyAllLeft);
+        model.addPropertyChangeListener(copyAllRight);
     }
 
@@ -153,4 +160,11 @@
         pnl.add(btn, gc);
 
+        gc.gridx = 0;
+        gc.gridy = 4;
+        copyAllLeft = new CopyAllLeft();
+        btn = new JButton(copyAllLeft);
+        btn.setName("button.copyallleft");
+        pnl.add(btn, gc);
+
         return pnl;
     }
@@ -180,4 +194,9 @@
         copyEndRightAction = new CopyEndRightAction();
         pnl.add(new JButton(copyEndRightAction), gc);
+
+        gc.gridx = 0;
+        gc.gridy = 4;
+        copyAllRight = new CopyAllRight();
+        pnl.add(new JButton(copyAllRight), gc);
 
         return pnl;
@@ -614,4 +633,56 @@
                     && ! mergedEntriesTable.getSelectionModel().isSelectionEmpty()
             );
+        }
+    }
+
+    class CopyAllLeft extends AbstractAction implements Observer, PropertyChangeListener {
+
+        public CopyAllLeft() {
+            ImageIcon icon = ImageProvider.get("dialogs/conflict", "useallleft.png");
+            putValue(Action.SMALL_ICON, icon);
+            putValue(Action.SHORT_DESCRIPTION, tr("Use all mine elements"));
+        }
+
+        public void actionPerformed(ActionEvent arg0) {
+            model.copyAll(ListRole.MY_ENTRIES);
+            model.setFrozen(true);
+        }
+
+        private void updateEnabledState() {
+            setEnabled(model.getMergedEntries().isEmpty() && !model.isFrozen());
+        }
+
+        public void update(Observable o, Object arg) {
+            updateEnabledState();
+        }
+
+        public void propertyChange(PropertyChangeEvent evt) {
+            updateEnabledState();
+        }
+    }
+
+    class CopyAllRight extends AbstractAction implements Observer, PropertyChangeListener {
+
+        public CopyAllRight() {
+            ImageIcon icon = ImageProvider.get("dialogs/conflict", "useallright.png");
+            putValue(Action.SMALL_ICON, icon);
+            putValue(Action.SHORT_DESCRIPTION, tr("Use all their elements"));
+        }
+
+        public void actionPerformed(ActionEvent arg0) {
+            model.copyAll(ListRole.THEIR_ENTRIES);
+            model.setFrozen(true);
+        }
+
+        private void updateEnabledState() {
+            setEnabled(model.getMergedEntries().isEmpty() && !model.isFrozen());
+        }
+
+        public void update(Observable o, Object arg) {
+            updateEnabledState();
+        }
+
+        public void propertyChange(PropertyChangeEvent evt) {
+            updateEnabledState();
         }
     }
Index: /trunk/src/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMerger.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMerger.java	(revision 2944)
+++ /trunk/src/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMerger.java	(revision 2945)
@@ -5,4 +5,5 @@
 
 import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.conflict.pair.IConflictResolver;
@@ -62,6 +63,6 @@
     }
 
-    public void populate(Way my, Way their) {
-        ((NodeListMergeModel)model).populate(my, their);
+    public void populate(OsmPrimitive my, OsmPrimitive their) {
+        ((NodeListMergeModel)model).populate((Way)my, (Way)their);
     }
 
Index: /trunk/src/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMerger.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMerger.java	(revision 2944)
+++ /trunk/src/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMerger.java	(revision 2945)
@@ -717,3 +717,7 @@
         }
     }
+
+    public void populate(OsmPrimitive my, OsmPrimitive their) {
+        model.populate(my, their);
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberMerger.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberMerger.java	(revision 2944)
+++ /trunk/src/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberMerger.java	(revision 2945)
@@ -5,4 +5,5 @@
 import javax.swing.JTable;
 
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
@@ -53,7 +54,7 @@
     }
 
-    public void populate(Relation my, Relation their) {
+    public void populate(OsmPrimitive my, OsmPrimitive their) {
         RelationMemberListMergeModel model = (RelationMemberListMergeModel)getModel();
-        model.populate(my,their);
+        model.populate((Relation)my, (Relation)their);
     }
 
Index: /trunk/src/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergeModel.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergeModel.java	(revision 2944)
+++ /trunk/src/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergeModel.java	(revision 2945)
@@ -6,4 +6,5 @@
 import java.util.ArrayList;
 import java.util.HashSet;
+import java.util.List;
 import java.util.Set;
 
@@ -33,8 +34,8 @@
 
     /** the list of tag merge items */
-    private final ArrayList<TagMergeItem> tagMergeItems;
+    private final List<TagMergeItem> tagMergeItems;
 
     /** the property change listeners */
-    private final ArrayList<PropertyChangeListener> listeners;
+    private final List<PropertyChangeListener> listeners;
 
     private int numUndecidedTags = 0;
@@ -210,3 +211,11 @@
 
     }
+
+    public int getFirstUndecided(int startIndex) {
+        for (int i=startIndex; i<tagMergeItems.size(); i++) {
+            if (tagMergeItems.get(i).getMergeDecision() == MergeDecisionType.UNDECIDED)
+                return i;
+        }
+        return -1;
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/gui/conflict/pair/tags/TagMerger.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/conflict/pair/tags/TagMerger.java	(revision 2944)
+++ /trunk/src/org/openstreetmap/josm/gui/conflict/pair/tags/TagMerger.java	(revision 2945)
@@ -26,4 +26,5 @@
 import javax.swing.event.ListSelectionListener;
 
+import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.gui.conflict.pair.IConflictResolver;
 import org.openstreetmap.josm.gui.conflict.pair.MergeDecisionType;
@@ -241,4 +242,19 @@
     public TagMergeModel getModel() {
         return model;
+    }
+
+    private void selectNextConflict(int[] rows) {
+        int max = rows[0];
+        for (int row: rows) {
+            if (row > max) {
+                max = row;
+            }
+        }
+        int index = model.getFirstUndecided(max+1);
+        if (index == -1) {
+            index = model.getFirstUndecided(0);
+        }
+        mineTable.getSelectionModel().setSelectionInterval(index, index);
+        theirTable.getSelectionModel().setSelectionInterval(index, index);
     }
 
@@ -265,4 +281,5 @@
                 return;
             model.decide(rows, MergeDecisionType.KEEP_MINE);
+            selectNextConflict(rows);
         }
 
@@ -294,4 +311,5 @@
                 return;
             model.decide(rows, MergeDecisionType.KEEP_THEIR);
+            selectNextConflict(rows);
         }
 
@@ -402,3 +420,9 @@
         }
     }
+
+    public void populate(OsmPrimitive my, OsmPrimitive their) {
+        model.populate(my, their);
+        mineTable.getSelectionModel().setSelectionInterval(0, 0);
+        theirTable.getSelectionModel().setSelectionInterval(0, 0);
+    }
 }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java	(revision 2944)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/ConflictDialog.java	(revision 2945)
@@ -137,17 +137,12 @@
      */
     private final void resolve() {
-        if (conflicts == null) return;
-        if (conflicts.size() == 1) {
-            lstConflicts.setSelectedIndex(0);
-        }
-
-        if (lstConflicts.getSelectedIndex() == -1)
-            return;
-
-        int [] selectedRows = lstConflicts.getSelectedIndices();
-        if (selectedRows == null || selectedRows.length == 0)
-            return;
-        int row = selectedRows[0];
-        Conflict<?> c = conflicts.get(row);
+        if (conflicts == null || model.getSize() == 0) return;
+
+        int index = lstConflicts.getSelectedIndex();
+        if (index < 0) {
+            index = 0;
+        }
+
+        Conflict<?> c = conflicts.get(index);
         OsmPrimitive my = c.getMy();
         OsmPrimitive their = c.getTheir();
@@ -155,4 +150,7 @@
         dialog.getConflictResolver().populate(my, their);
         dialog.setVisible(true);
+
+        lstConflicts.setSelectedIndex(index);
+
         Main.map.mapView.repaint();
     }
