Index: trunk/src/org/openstreetmap/josm/data/osm/history/History.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/history/History.java	(revision 2935)
+++ trunk/src/org/openstreetmap/josm/data/osm/history/History.java	(revision 2936)
@@ -1,6 +1,4 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.data.osm.history;
-
-import static org.openstreetmap.josm.tools.I18n.tr;
 
 import java.text.MessageFormat;
@@ -39,6 +37,6 @@
     private ArrayList<HistoryOsmPrimitive> versions;
     /** the object id */
-    private long id;
-    private OsmPrimitiveType type;
+    private final long id;
+    private final OsmPrimitiveType type;
 
     /**
Index: trunk/src/org/openstreetmap/josm/data/osm/history/HistoryDataSet.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/history/HistoryDataSet.java	(revision 2935)
+++ trunk/src/org/openstreetmap/josm/data/osm/history/HistoryDataSet.java	(revision 2936)
@@ -54,5 +54,5 @@
     }
 
-    protected void fireHistoryUpdated(SimplePrimitiveId id) {
+    protected void fireHistoryUpdated(PrimitiveId id) {
         for (HistoryDataSetListener l : listeners) {
             l.historyUpdated(this, id);
@@ -94,5 +94,5 @@
      */
     public void put(HistoryOsmPrimitive primitive) {
-        SimplePrimitiveId id = new SimplePrimitiveId(primitive.getId(), primitive.getType());
+        PrimitiveId id = new SimplePrimitiveId(primitive.getId(), primitive.getType());
         if (data.get(id) == null) {
             data.put(id, new ArrayList<HistoryOsmPrimitive>());
Index: trunk/src/org/openstreetmap/josm/gui/conflict/pair/ConflictResolver.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/conflict/pair/ConflictResolver.java	(revision 2935)
+++ trunk/src/org/openstreetmap/josm/gui/conflict/pair/ConflictResolver.java	(revision 2936)
@@ -9,5 +9,5 @@
 import java.beans.PropertyChangeListener;
 import java.util.ArrayList;
-import java.util.logging.Logger;
+import java.util.List;
 
 import javax.swing.ImageIcon;
@@ -67,5 +67,5 @@
     static public final String THEIR_PRIMITIVE_PROP = ConflictResolver.class.getName() + ".theirPrimitive";
 
-    private static final Logger logger = Logger.getLogger(ConflictResolver.class.getName());
+    //private static final Logger logger = Logger.getLogger(ConflictResolver.class.getName());
 
     private JTabbedPane tabbedPane = null;
@@ -74,4 +74,5 @@
     private RelationMemberMerger relationMemberMerger;
     private PropertiesMerger propertiesMerger;
+    private final List<IConflictResolver> conflictResolvers = new ArrayList<IConflictResolver>();
     private OsmPrimitive my;
     private OsmPrimitive their;
@@ -119,4 +120,9 @@
         setLayout(new BorderLayout());
         add(tabbedPane, BorderLayout.CENTER);
+
+        conflictResolvers.add(propertiesMerger);
+        conflictResolvers.add(tagMerger);
+        conflictResolvers.add(nodeListMerger);
+        conflictResolvers.add(relationMemberMerger);
     }
 
@@ -174,21 +180,24 @@
         } else if (evt.getPropertyName().equals(ListMergeModel.FROZEN_PROP)) {
             boolean frozen = (Boolean)evt.getNewValue();
-            if (frozen && evt.getSource() == nodeListMerger.getModel()) {
-                tabbedPane.setTitleAt(2, tr("Nodes(resolved)"));
-                tabbedPane.setToolTipTextAt(2, tr("Merged node list frozen. No pending conflicts in the node list of this way"));
-                tabbedPane.setIconAt(2, mergeComplete);
-            } else {
-                tabbedPane.setTitleAt(2, tr("Nodes(with conflicts)"));
-                tabbedPane.setToolTipTextAt(2,tr("Pending conflicts in the node list of this way"));
-                tabbedPane.setIconAt(2, mergeIncomplete);
-            }
-            if (frozen && evt.getSource() == relationMemberMerger.getModel()) {
-                tabbedPane.setTitleAt(3, tr("Members(resolved)"));
-                tabbedPane.setToolTipTextAt(3, tr("Merged member list frozen. No pending conflicts in the member list of this relation"));
-                tabbedPane.setIconAt(3, mergeComplete);
-            } else {
-                tabbedPane.setTitleAt(3, tr("Members(with conflicts)"));
-                tabbedPane.setToolTipTextAt(3, tr("Pending conflicts in the member list of this relation"));
-                tabbedPane.setIconAt(3, mergeIncomplete);
+            if (evt.getSource() == nodeListMerger.getModel() && my instanceof Way) {
+                if (frozen) {
+                    tabbedPane.setTitleAt(2, tr("Nodes(resolved)"));
+                    tabbedPane.setToolTipTextAt(2, tr("Merged node list frozen. No pending conflicts in the node list of this way"));
+                    tabbedPane.setIconAt(2, mergeComplete);
+                } else {
+                    tabbedPane.setTitleAt(2, tr("Nodes(with conflicts)"));
+                    tabbedPane.setToolTipTextAt(2,tr("Pending conflicts in the node list of this way"));
+                    tabbedPane.setIconAt(2, mergeIncomplete);
+                }
+            } else if (evt.getSource() == relationMemberMerger.getModel() && my instanceof Relation) {
+                if (frozen) {
+                    tabbedPane.setTitleAt(3, tr("Members(resolved)"));
+                    tabbedPane.setToolTipTextAt(3, tr("Merged member list frozen. No pending conflicts in the member list of this relation"));
+                    tabbedPane.setIconAt(3, mergeComplete);
+                } else {
+                    tabbedPane.setTitleAt(3, tr("Members(with conflicts)"));
+                    tabbedPane.setToolTipTextAt(3, tr("Pending conflicts in the member list of this relation"));
+                    tabbedPane.setIconAt(3, mergeIncomplete);
+                }
             }
             updateResolvedCompletely();
@@ -205,4 +214,8 @@
             }
             updateResolvedCompletely();
+        } else if (PropertiesMergeModel.DELETE_PRIMITIVE_PROP.equals(evt.getPropertyName())) {
+            for (IConflictResolver resolver: conflictResolvers) {
+                resolver.deletePrimitive((Boolean) evt.getNewValue());
+            }
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/conflict/pair/IConflictResolver.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/conflict/pair/IConflictResolver.java	(revision 2936)
+++ trunk/src/org/openstreetmap/josm/gui/conflict/pair/IConflictResolver.java	(revision 2936)
@@ -0,0 +1,8 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.gui.conflict.pair;
+
+public interface IConflictResolver {
+
+    void deletePrimitive(boolean deleted);
+
+}
Index: trunk/src/org/openstreetmap/josm/gui/conflict/pair/ListMergeModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/conflict/pair/ListMergeModel.java	(revision 2935)
+++ trunk/src/org/openstreetmap/josm/gui/conflict/pair/ListMergeModel.java	(revision 2936)
@@ -117,13 +117,13 @@
     }
 
-    protected ArrayList<T> getMergedEntries() {
+    protected List<T> getMergedEntries() {
         return entries.get(MERGED_ENTRIES);
     }
 
-    protected ArrayList<T> getMyEntries() {
+    protected List<T> getMyEntries() {
         return entries.get(MY_ENTRIES);
     }
 
-    protected ArrayList<T> getTheirEntries() {
+    protected List<T> getTheirEntries() {
         return entries.get(THEIR_ENTRIES);
     }
@@ -230,5 +230,4 @@
     protected void copyToTop(ListRole role, int []rows) {
         copy(role, rows, 0);
-        fireModelDataChanged();
         mergedEntriesSelectionModel.setSelectionInterval(0, rows.length -1);
     }
@@ -267,5 +266,4 @@
     public void copyToEnd(ListRole source, int [] rows) {
         copy(source, rows, getMergedEntriesSize());
-        fireModelDataChanged();
         mergedEntriesSelectionModel.setSelectionInterval(getMergedEntriesSize()-rows.length, getMergedEntriesSize() -1);
 
@@ -292,4 +290,9 @@
     public void copyTheirToEnd(int [] rows) {
         copyToEnd(THEIR_ENTRIES, rows);
+    }
+
+    public void clearMerged() {
+        getMergedEntries().clear();
+        fireModelDataChanged();
     }
 
@@ -304,4 +307,5 @@
         }
         getMergedEntries().addAll(position, newItems);
+        fireModelDataChanged();
     }
 
@@ -318,5 +322,4 @@
     protected void copyBeforeCurrent(ListRole source, int [] rows, int current) {
         copy(source, rows, current);
-        fireModelDataChanged();
         mergedEntriesSelectionModel.setSelectionInterval(current, current + rows.length-1);
     }
@@ -360,5 +363,4 @@
     protected void copyAfterCurrent(ListRole source, int [] rows, int current) {
         copy(source, rows, current + 1);
-        fireModelDataChanged();
         mergedEntriesSelectionModel.setSelectionInterval(current+1, current + rows.length-1);
         notifyObservers();
@@ -404,5 +406,5 @@
             // can't move up
             return;
-        ArrayList<T> mergedEntries = getMergedEntries();
+        List<T> mergedEntries = getMergedEntries();
         for (int row: rows) {
             T n = mergedEntries.get(row);
@@ -427,5 +429,5 @@
         if (rows == null || rows.length == 0)
             return;
-        ArrayList<T> mergedEntries = getMergedEntries();
+        List<T> mergedEntries = getMergedEntries();
         if (rows[rows.length -1] == mergedEntries.size() -1)
             // can't move down
@@ -455,5 +457,5 @@
             return;
 
-        ArrayList<T> mergedEntries = getMergedEntries();
+        List<T> mergedEntries = getMergedEntries();
 
         for (int i = rows.length-1; i>=0;i--) {
Index: trunk/src/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMerger.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMerger.java	(revision 2935)
+++ trunk/src/org/openstreetmap/josm/gui/conflict/pair/nodes/NodeListMerger.java	(revision 2936)
@@ -1,5 +1,3 @@
 package org.openstreetmap.josm.gui.conflict.pair.nodes;
-
-import java.util.logging.Logger;
 
 import javax.swing.JScrollPane;
@@ -8,4 +6,5 @@
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.gui.conflict.pair.IConflictResolver;
 import org.openstreetmap.josm.gui.conflict.pair.ListMerger;
 
@@ -14,6 +13,6 @@
  *
  */
-public class NodeListMerger extends ListMerger<Node> {
-    private static final Logger logger = Logger.getLogger(NodeListMerger.class.getName());
+public class NodeListMerger extends ListMerger<Node> implements IConflictResolver {
+    //private static final Logger logger = Logger.getLogger(NodeListMerger.class.getName());
 
     public NodeListMerger() {
@@ -66,3 +65,12 @@
         ((NodeListMergeModel)model).populate(my, their);
     }
+
+    public void deletePrimitive(boolean deleted) {
+        if (deleted) {
+            model.setFrozen(true);
+            model.clearMerged();
+        } else {
+            model.setFrozen(false);
+        }
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergeModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergeModel.java	(revision 2935)
+++ trunk/src/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMergeModel.java	(revision 2936)
@@ -53,4 +53,5 @@
 
     static public final String RESOLVED_COMPLETELY_PROP = PropertiesMergeModel.class.getName() + ".resolvedCompletely";
+    static public final String DELETE_PRIMITIVE_PROP = PropertiesMergeModel.class.getName() + ".deletePrimitive";
 
     private OsmPrimitive my;
@@ -287,4 +288,15 @@
     }
 
+    private boolean getMergedDeletedState(MergeDecisionType decision) {
+        switch (decision) {
+        case KEEP_MINE:
+            return myDeletedState;
+        case KEEP_THEIR:
+            return theirDeletedState;
+        default:
+            return false;
+        }
+    }
+
     /**
      * decides the conflict between two deleted states
@@ -295,8 +307,16 @@
     public void decideDeletedStateConflict(MergeDecisionType decision) throws IllegalArgumentException{
         CheckParameterUtil.ensureParameterNotNull(decision, "decision");
+
+        boolean oldMergedDeletedState = getMergedDeletedState(this.deletedMergeDecision);
+        boolean newMergedDeletedState = getMergedDeletedState(decision);
+
         this.deletedMergeDecision = decision;
         setChanged();
         notifyObservers();
         fireCompletelyResolved();
+
+        if (oldMergedDeletedState != newMergedDeletedState) {
+            support.firePropertyChange(DELETE_PRIMITIVE_PROP, oldMergedDeletedState, newMergedDeletedState);
+        }
     }
 
@@ -478,10 +498,10 @@
                         dependent.size(), dependent.size(), way.getId())
                         + "</html>",
-                tr("Undelete additional nodes?"),
-                JOptionPane.YES_NO_OPTION,
-                JOptionPane.QUESTION_MESSAGE,
-                null,
-                options,
-                options[0]
+                        tr("Undelete additional nodes?"),
+                        JOptionPane.YES_NO_OPTION,
+                        JOptionPane.QUESTION_MESSAGE,
+                        null,
+                        options,
+                        options[0]
         );
 
@@ -512,10 +532,10 @@
                         dependent.size(), dependent.size(), r.getId())
                         + "</html>",
-                tr("Undelete dependent primitives?"),
-                JOptionPane.YES_NO_OPTION,
-                JOptionPane.QUESTION_MESSAGE,
-                null,
-                options,
-                options[0]
+                        tr("Undelete dependent primitives?"),
+                        JOptionPane.YES_NO_OPTION,
+                        JOptionPane.QUESTION_MESSAGE,
+                        null,
+                        options,
+                        options[0]
         );
 
Index: trunk/src/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMerger.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMerger.java	(revision 2935)
+++ trunk/src/org/openstreetmap/josm/gui/conflict/pair/properties/PropertiesMerger.java	(revision 2936)
@@ -22,4 +22,5 @@
 
 import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.gui.conflict.pair.IConflictResolver;
 import org.openstreetmap.josm.gui.conflict.pair.MergeDecisionType;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -30,5 +31,5 @@
  *
  */
-public class PropertiesMerger extends JPanel implements Observer {
+public class PropertiesMerger extends JPanel implements Observer, IConflictResolver {
     private static DecimalFormat COORD_FORMATTER = new DecimalFormat("###0.0000000");
 
@@ -650,3 +651,7 @@
         }
     }
+
+    public void deletePrimitive(boolean deleted) {
+        // Do nothing
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberMerger.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberMerger.java	(revision 2935)
+++ trunk/src/org/openstreetmap/josm/gui/conflict/pair/relation/RelationMemberMerger.java	(revision 2936)
@@ -1,6 +1,4 @@
 // License: GPL. For details, see LICENSE file.
 package org.openstreetmap.josm.gui.conflict.pair.relation;
-
-import java.util.logging.Logger;
 
 import javax.swing.JScrollPane;
@@ -9,4 +7,5 @@
 import org.openstreetmap.josm.data.osm.Relation;
 import org.openstreetmap.josm.data.osm.RelationMember;
+import org.openstreetmap.josm.gui.conflict.pair.IConflictResolver;
 import org.openstreetmap.josm.gui.conflict.pair.ListMerger;
 
@@ -14,6 +13,6 @@
  * A UI component for resolving conflicts in the member lists of two {@see Relation}
  */
-public class RelationMemberMerger extends ListMerger<RelationMember> {
-    private static final Logger logger = Logger.getLogger(RelationMemberMerger.class.getName());
+public class RelationMemberMerger extends ListMerger<RelationMember> implements IConflictResolver {
+    //private static final Logger logger = Logger.getLogger(RelationMemberMerger.class.getName());
 
     @Override
@@ -62,3 +61,12 @@
         super(new RelationMemberListMergeModel());
     }
+
+    public void deletePrimitive(boolean deleted) {
+        if (deleted) {
+            model.clearMerged();
+            model.setFrozen(true);
+        } else {
+            model.setFrozen(false);
+        }
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergeModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergeModel.java	(revision 2935)
+++ trunk/src/org/openstreetmap/josm/gui/conflict/pair/tags/TagMergeModel.java	(revision 2936)
@@ -7,5 +7,4 @@
 import java.util.HashSet;
 import java.util.Set;
-import java.util.logging.Logger;
 
 import javax.swing.table.DefaultTableModel;
@@ -29,5 +28,5 @@
  */
 public class TagMergeModel extends DefaultTableModel {
-    private static final Logger logger = Logger.getLogger(TagMergeModel.class.getName());
+    //private static final Logger logger = Logger.getLogger(TagMergeModel.class.getName());
 
     static public final String PROP_NUM_UNDECIDED_TAGS = TagMergeModel.class.getName() + ".numUndecidedTags";
Index: trunk/src/org/openstreetmap/josm/gui/conflict/pair/tags/TagMerger.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/conflict/pair/tags/TagMerger.java	(revision 2935)
+++ trunk/src/org/openstreetmap/josm/gui/conflict/pair/tags/TagMerger.java	(revision 2936)
@@ -26,4 +26,5 @@
 import javax.swing.event.ListSelectionListener;
 
+import org.openstreetmap.josm.gui.conflict.pair.IConflictResolver;
 import org.openstreetmap.josm.gui.conflict.pair.MergeDecisionType;
 import org.openstreetmap.josm.tools.ImageProvider;
@@ -32,5 +33,5 @@
  *
  */
-public class TagMerger extends JPanel {
+public class TagMerger extends JPanel implements IConflictResolver {
 
     private JTable mineTable;
@@ -393,3 +394,11 @@
         }
     }
+
+    public void deletePrimitive(boolean deleted) {
+        // Use my entries, as it doesn't really matter
+        MergeDecisionType decision = deleted?MergeDecisionType.KEEP_MINE:MergeDecisionType.UNDECIDED;
+        for (int i=0; i<model.getRowCount(); i++) {
+            model.decide(i, decision);
+        }
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialog.java	(revision 2935)
+++ trunk/src/org/openstreetmap/josm/gui/history/HistoryBrowserDialog.java	(revision 2936)
@@ -109,8 +109,6 @@
 
     public void historyUpdated(HistoryDataSet source, PrimitiveId primitiveId) {
-        if (primitiveId == null) {
+        if (primitiveId == null || primitiveId.equals(browser.getHistory().getPrimitmiveId())) {
             browser.populate(source.getHistory(browser.getHistory().getPrimitmiveId()));
-        } else if (primitiveId.equals(browser.getHistory().getPrimitmiveId())) {
-            browser.populate(source.getHistory(primitiveId));
         }
     }
Index: trunk/src/org/openstreetmap/josm/io/OsmHistoryReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmHistoryReader.java	(revision 2935)
+++ trunk/src/org/openstreetmap/josm/io/OsmHistoryReader.java	(revision 2936)
@@ -37,6 +37,6 @@
 public class OsmHistoryReader {
 
-    private InputStream in;
-    private HistoryDataSet data;
+    private final InputStream in;
+    private final HistoryDataSet data;
 
     private class Parser extends DefaultHandler {
@@ -131,6 +131,6 @@
                 throwException(tr("Missing mandatory attribute ''{0}''.", name));
             }
-            if (v.equals("true")) return true;
-            if (v.equals("false")) return false;
+            if ("true".equals(v)) return true;
+            if ("false".equals(v)) return false;
             throwException(tr("Illegal value for mandatory attribute ''{0}'' of type boolean. Got ''{1}''.", name, v));
             // not reached
@@ -231,5 +231,5 @@
     public OsmHistoryReader(InputStream source) {
         this.in = source;
-        data = new HistoryDataSet();
+        this.data = new HistoryDataSet();
     }
 
