Index: trunk/src/org/openstreetmap/josm/command/AddCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/AddCommand.java	(revision 8447)
+++ trunk/src/org/openstreetmap/josm/command/AddCommand.java	(revision 8456)
@@ -96,3 +96,28 @@
         return Collections.singleton(osm);
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + ((osm == null) ? 0 : osm.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (!super.equals(obj))
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        AddCommand other = (AddCommand) obj;
+        if (osm == null) {
+            if (other.osm != null)
+                return false;
+        } else if (!osm.equals(other.osm))
+            return false;
+        return true;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/command/AddPrimitivesCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/AddPrimitivesCommand.java	(revision 8447)
+++ trunk/src/org/openstreetmap/josm/command/AddPrimitivesCommand.java	(revision 8456)
@@ -8,4 +8,5 @@
 import java.util.HashSet;
 import java.util.List;
+
 import javax.swing.Icon;
 
@@ -171,3 +172,46 @@
         return prims;
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + ((createdPrimitives == null) ? 0 : createdPrimitives.hashCode());
+        result = prime * result + ((createdPrimitivesToSelect == null) ? 0 : createdPrimitivesToSelect.hashCode());
+        result = prime * result + ((data == null) ? 0 : data.hashCode());
+        result = prime * result + ((toSelect == null) ? 0 : toSelect.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (!super.equals(obj))
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        AddPrimitivesCommand other = (AddPrimitivesCommand) obj;
+        if (createdPrimitives == null) {
+            if (other.createdPrimitives != null)
+                return false;
+        } else if (!createdPrimitives.equals(other.createdPrimitives))
+            return false;
+        if (createdPrimitivesToSelect == null) {
+            if (other.createdPrimitivesToSelect != null)
+                return false;
+        } else if (!createdPrimitivesToSelect.equals(other.createdPrimitivesToSelect))
+            return false;
+        if (data == null) {
+            if (other.data != null)
+                return false;
+        } else if (!data.equals(other.data))
+            return false;
+        if (toSelect == null) {
+            if (other.toSelect != null)
+                return false;
+        } else if (!toSelect.equals(other.toSelect))
+            return false;
+        return true;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/command/ChangeCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/ChangeCommand.java	(revision 8447)
+++ trunk/src/org/openstreetmap/josm/command/ChangeCommand.java	(revision 8456)
@@ -88,3 +88,34 @@
         return ImageProvider.get(osm.getDisplayType());
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + ((newOsm == null) ? 0 : newOsm.hashCode());
+        result = prime * result + ((osm == null) ? 0 : osm.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (!super.equals(obj))
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        ChangeCommand other = (ChangeCommand) obj;
+        if (newOsm == null) {
+            if (other.newOsm != null)
+                return false;
+        } else if (!newOsm.equals(other.newOsm))
+            return false;
+        if (osm == null) {
+            if (other.osm != null)
+                return false;
+        } else if (!osm.equals(other.osm))
+            return false;
+        return true;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/command/ChangeNodesCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/ChangeNodesCommand.java	(revision 8447)
+++ trunk/src/org/openstreetmap/josm/command/ChangeNodesCommand.java	(revision 8456)
@@ -61,3 +61,34 @@
         return ImageProvider.get(OsmPrimitiveType.WAY);
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + ((newNodes == null) ? 0 : newNodes.hashCode());
+        result = prime * result + ((way == null) ? 0 : way.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (!super.equals(obj))
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        ChangeNodesCommand other = (ChangeNodesCommand) obj;
+        if (newNodes == null) {
+            if (other.newNodes != null)
+                return false;
+        } else if (!newNodes.equals(other.newNodes))
+            return false;
+        if (way == null) {
+            if (other.way != null)
+                return false;
+        } else if (!way.equals(other.way))
+            return false;
+        return true;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/command/ChangePropertyCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/ChangePropertyCommand.java	(revision 8447)
+++ trunk/src/org/openstreetmap/josm/command/ChangePropertyCommand.java	(revision 8456)
@@ -223,3 +223,34 @@
         return Collections.unmodifiableMap(tags);
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + ((objects == null) ? 0 : objects.hashCode());
+        result = prime * result + ((tags == null) ? 0 : tags.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (!super.equals(obj))
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        ChangePropertyCommand other = (ChangePropertyCommand) obj;
+        if (objects == null) {
+            if (other.objects != null)
+                return false;
+        } else if (!objects.equals(other.objects))
+            return false;
+        if (tags == null) {
+            if (other.tags != null)
+                return false;
+        } else if (!tags.equals(other.tags))
+            return false;
+        return true;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/command/ChangePropertyKeyCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/ChangePropertyKeyCommand.java	(revision 8447)
+++ trunk/src/org/openstreetmap/josm/command/ChangePropertyKeyCommand.java	(revision 8456)
@@ -124,3 +124,40 @@
         return children;
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + ((key == null) ? 0 : key.hashCode());
+        result = prime * result + ((newKey == null) ? 0 : newKey.hashCode());
+        result = prime * result + ((objects == null) ? 0 : objects.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (!super.equals(obj))
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        ChangePropertyKeyCommand other = (ChangePropertyKeyCommand) obj;
+        if (key == null) {
+            if (other.key != null)
+                return false;
+        } else if (!key.equals(other.key))
+            return false;
+        if (newKey == null) {
+            if (other.newKey != null)
+                return false;
+        } else if (!newKey.equals(other.newKey))
+            return false;
+        if (objects == null) {
+            if (other.objects != null)
+                return false;
+        } else if (!objects.equals(other.objects))
+            return false;
+        return true;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/command/ChangeRelationMemberRoleCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/ChangeRelationMemberRoleCommand.java	(revision 8447)
+++ trunk/src/org/openstreetmap/josm/command/ChangeRelationMemberRoleCommand.java	(revision 8456)
@@ -81,3 +81,49 @@
         return ImageProvider.get(relation.getDisplayType());
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + ((newRole == null) ? 0 : newRole.hashCode());
+        result = prime * result + ((oldModified == null) ? 0 : oldModified.hashCode());
+        result = prime * result + ((oldRole == null) ? 0 : oldRole.hashCode());
+        result = prime * result + position;
+        result = prime * result + ((relation == null) ? 0 : relation.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (!super.equals(obj))
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        ChangeRelationMemberRoleCommand other = (ChangeRelationMemberRoleCommand) obj;
+        if (newRole == null) {
+            if (other.newRole != null)
+                return false;
+        } else if (!newRole.equals(other.newRole))
+            return false;
+        if (oldModified == null) {
+            if (other.oldModified != null)
+                return false;
+        } else if (!oldModified.equals(other.oldModified))
+            return false;
+        if (oldRole == null) {
+            if (other.oldRole != null)
+                return false;
+        } else if (!oldRole.equals(other.oldRole))
+            return false;
+        if (position != other.position)
+            return false;
+        if (relation == null) {
+            if (other.relation != null)
+                return false;
+        } else if (!relation.equals(other.relation))
+            return false;
+        return true;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/command/DeleteCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/DeleteCommand.java	(revision 8447)
+++ trunk/src/org/openstreetmap/josm/command/DeleteCommand.java	(revision 8456)
@@ -516,3 +516,34 @@
                 JOptionPane.YES_OPTION);
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + ((clonedPrimitives == null) ? 0 : clonedPrimitives.hashCode());
+        result = prime * result + ((toDelete == null) ? 0 : toDelete.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (!super.equals(obj))
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        DeleteCommand other = (DeleteCommand) obj;
+        if (clonedPrimitives == null) {
+            if (other.clonedPrimitives != null)
+                return false;
+        } else if (!clonedPrimitives.equals(other.clonedPrimitives))
+            return false;
+        if (toDelete == null) {
+            if (other.toDelete != null)
+                return false;
+        } else if (!toDelete.equals(other.toDelete))
+            return false;
+        return true;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/command/PurgeCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/PurgeCommand.java	(revision 8447)
+++ trunk/src/org/openstreetmap/josm/command/PurgeCommand.java	(revision 8456)
@@ -270,3 +270,52 @@
     public void fillModifiedData(Collection<OsmPrimitive> modified, Collection<OsmPrimitive> deleted, Collection<OsmPrimitive> added) {
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + ((ds == null) ? 0 : ds.hashCode());
+        result = prime * result + ((makeIncompleteData == null) ? 0 : makeIncompleteData.hashCode());
+        result = prime * result + ((makeIncompleteDataByPrimId == null) ? 0 : makeIncompleteDataByPrimId.hashCode());
+        result = prime * result + ((purgedConflicts == null) ? 0 : purgedConflicts.hashCode());
+        result = prime * result + ((toPurge == null) ? 0 : toPurge.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (!super.equals(obj))
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        PurgeCommand other = (PurgeCommand) obj;
+        if (ds == null) {
+            if (other.ds != null)
+                return false;
+        } else if (!ds.equals(other.ds))
+            return false;
+        if (makeIncompleteData == null) {
+            if (other.makeIncompleteData != null)
+                return false;
+        } else if (!makeIncompleteData.equals(other.makeIncompleteData))
+            return false;
+        if (makeIncompleteDataByPrimId == null) {
+            if (other.makeIncompleteDataByPrimId != null)
+                return false;
+        } else if (!makeIncompleteDataByPrimId.equals(other.makeIncompleteDataByPrimId))
+            return false;
+        if (purgedConflicts == null) {
+            if (other.purgedConflicts != null)
+                return false;
+        } else if (!purgedConflicts.equals(other.purgedConflicts))
+            return false;
+        if (toPurge == null) {
+            if (other.toPurge != null)
+                return false;
+        } else if (!toPurge.equals(other.toPurge))
+            return false;
+        return true;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/command/RemoveNodesCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/RemoveNodesCommand.java	(revision 8447)
+++ trunk/src/org/openstreetmap/josm/command/RemoveNodesCommand.java	(revision 8456)
@@ -62,3 +62,34 @@
         return ImageProvider.get(OsmPrimitiveType.WAY);
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + ((rmNodes == null) ? 0 : rmNodes.hashCode());
+        result = prime * result + ((way == null) ? 0 : way.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (!super.equals(obj))
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        RemoveNodesCommand other = (RemoveNodesCommand) obj;
+        if (rmNodes == null) {
+            if (other.rmNodes != null)
+                return false;
+        } else if (!rmNodes.equals(other.rmNodes))
+            return false;
+        if (way == null) {
+            if (other.way != null)
+                return false;
+        } else if (!way.equals(other.way))
+            return false;
+        return true;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/command/RotateCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/RotateCommand.java	(revision 8447)
+++ trunk/src/org/openstreetmap/josm/command/RotateCommand.java	(revision 8456)
@@ -86,3 +86,37 @@
         return trn("Rotate {0} node", "Rotate {0} nodes", nodes.size(), nodes.size());
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + ((pivot == null) ? 0 : pivot.hashCode());
+        long temp;
+        temp = Double.doubleToLongBits(rotationAngle);
+        result = prime * result + (int) (temp ^ (temp >>> 32));
+        temp = Double.doubleToLongBits(startAngle);
+        result = prime * result + (int) (temp ^ (temp >>> 32));
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (!super.equals(obj))
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        RotateCommand other = (RotateCommand) obj;
+        if (pivot == null) {
+            if (other.pivot != null)
+                return false;
+        } else if (!pivot.equals(other.pivot))
+            return false;
+        if (Double.doubleToLongBits(rotationAngle) != Double.doubleToLongBits(other.rotationAngle))
+            return false;
+        if (Double.doubleToLongBits(startAngle) != Double.doubleToLongBits(other.startAngle))
+            return false;
+        return true;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/command/ScaleCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/ScaleCommand.java	(revision 8447)
+++ trunk/src/org/openstreetmap/josm/command/ScaleCommand.java	(revision 8456)
@@ -78,3 +78,39 @@
         return trn("Scale {0} node", "Scale {0} nodes", nodes.size(), nodes.size());
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + ((pivot == null) ? 0 : pivot.hashCode());
+        long temp;
+        temp = Double.doubleToLongBits(scalingFactor);
+        result = prime * result + (int) (temp ^ (temp >>> 32));
+        result = prime * result + ((startEN == null) ? 0 : startEN.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (!super.equals(obj))
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        ScaleCommand other = (ScaleCommand) obj;
+        if (pivot == null) {
+            if (other.pivot != null)
+                return false;
+        } else if (!pivot.equals(other.pivot))
+            return false;
+        if (Double.doubleToLongBits(scalingFactor) != Double.doubleToLongBits(other.scalingFactor))
+            return false;
+        if (startEN == null) {
+            if (other.startEN != null)
+                return false;
+        } else if (!startEN.equals(other.startEN))
+            return false;
+        return true;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/command/SelectCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/SelectCommand.java	(revision 8447)
+++ trunk/src/org/openstreetmap/josm/command/SelectCommand.java	(revision 8456)
@@ -51,3 +51,34 @@
         return trn("Selected {0} object", "Selected {0} objects", size, size);
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + ((newSelection == null) ? 0 : newSelection.hashCode());
+        result = prime * result + ((oldSelection == null) ? 0 : oldSelection.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (!super.equals(obj))
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        SelectCommand other = (SelectCommand) obj;
+        if (newSelection == null) {
+            if (other.newSelection != null)
+                return false;
+        } else if (!newSelection.equals(other.newSelection))
+            return false;
+        if (oldSelection == null) {
+            if (other.oldSelection != null)
+                return false;
+        } else if (!oldSelection.equals(other.oldSelection))
+            return false;
+        return true;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/command/SequenceCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/SequenceCommand.java	(revision 8447)
+++ trunk/src/org/openstreetmap/josm/command/SequenceCommand.java	(revision 8456)
@@ -123,3 +123,37 @@
         this.sequenceComplete = sequenceComplete;
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + (continueOnError ? 1231 : 1237);
+        result = prime * result + ((name == null) ? 0 : name.hashCode());
+        result = prime * result + Arrays.hashCode(sequence);
+        result = prime * result + (sequenceComplete ? 1231 : 1237);
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (!super.equals(obj))
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        SequenceCommand other = (SequenceCommand) obj;
+        if (continueOnError != other.continueOnError)
+            return false;
+        if (name == null) {
+            if (other.name != null)
+                return false;
+        } else if (!name.equals(other.name))
+            return false;
+        if (!Arrays.equals(sequence, other.sequence))
+            return false;
+        if (sequenceComplete != other.sequenceComplete)
+            return false;
+        return true;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/command/TransformNodesCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/TransformNodesCommand.java	(revision 8447)
+++ trunk/src/org/openstreetmap/josm/command/TransformNodesCommand.java	(revision 8456)
@@ -28,5 +28,4 @@
      */
     protected Collection<Node> nodes = new LinkedList<>();
-
 
     /**
@@ -140,3 +139,34 @@
 
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + ((nodes == null) ? 0 : nodes.hashCode());
+        result = prime * result + ((oldStates == null) ? 0 : oldStates.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (!super.equals(obj))
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        TransformNodesCommand other = (TransformNodesCommand) obj;
+        if (nodes == null) {
+            if (other.nodes != null)
+                return false;
+        } else if (!nodes.equals(other.nodes))
+            return false;
+        if (oldStates == null) {
+            if (other.oldStates != null)
+                return false;
+        } else if (!oldStates.equals(other.oldStates))
+            return false;
+        return true;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/command/conflict/ConflictAddCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/conflict/ConflictAddCommand.java	(revision 8447)
+++ trunk/src/org/openstreetmap/josm/command/conflict/ConflictAddCommand.java	(revision 8456)
@@ -86,3 +86,28 @@
         return ImageProvider.get(conflict.getMy().getDisplayType());
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + ((conflict == null) ? 0 : conflict.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (!super.equals(obj))
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        ConflictAddCommand other = (ConflictAddCommand) obj;
+        if (conflict == null) {
+            if (other.conflict != null)
+                return false;
+        } else if (!conflict.equals(other.conflict))
+            return false;
+        return true;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/command/conflict/ConflictResolveCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/conflict/ConflictResolveCommand.java	(revision 8447)
+++ trunk/src/org/openstreetmap/josm/command/conflict/ConflictResolveCommand.java	(revision 8456)
@@ -79,3 +79,28 @@
         reconstituteConflicts();
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + ((resolvedConflicts == null) ? 0 : resolvedConflicts.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (!super.equals(obj))
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        ConflictResolveCommand other = (ConflictResolveCommand) obj;
+        if (resolvedConflicts == null) {
+            if (other.resolvedConflicts != null)
+                return false;
+        } else if (!resolvedConflicts.equals(other.resolvedConflicts))
+            return false;
+        return true;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/command/conflict/CoordinateConflictResolveCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/conflict/CoordinateConflictResolveCommand.java	(revision 8447)
+++ trunk/src/org/openstreetmap/josm/command/conflict/CoordinateConflictResolveCommand.java	(revision 8456)
@@ -76,3 +76,31 @@
         modified.add(conflict.getMy());
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + ((conflict == null) ? 0 : conflict.hashCode());
+        result = prime * result + ((decision == null) ? 0 : decision.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (!super.equals(obj))
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        CoordinateConflictResolveCommand other = (CoordinateConflictResolveCommand) obj;
+        if (conflict == null) {
+            if (other.conflict != null)
+                return false;
+        } else if (!conflict.equals(other.conflict))
+            return false;
+        if (decision != other.decision)
+            return false;
+        return true;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/command/conflict/DeletedStateConflictResolveCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/conflict/DeletedStateConflictResolveCommand.java	(revision 8447)
+++ trunk/src/org/openstreetmap/josm/command/conflict/DeletedStateConflictResolveCommand.java	(revision 8456)
@@ -88,3 +88,31 @@
         modified.addAll(conflict.getMy().getReferrers());
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + ((conflict == null) ? 0 : conflict.hashCode());
+        result = prime * result + ((decision == null) ? 0 : decision.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (!super.equals(obj))
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        DeletedStateConflictResolveCommand other = (DeletedStateConflictResolveCommand) obj;
+        if (conflict == null) {
+            if (other.conflict != null)
+                return false;
+        } else if (!conflict.equals(other.conflict))
+            return false;
+        if (decision != other.decision)
+            return false;
+        return true;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/command/conflict/ModifiedConflictResolveCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/conflict/ModifiedConflictResolveCommand.java	(revision 8447)
+++ trunk/src/org/openstreetmap/josm/command/conflict/ModifiedConflictResolveCommand.java	(revision 8456)
@@ -64,3 +64,28 @@
         modified.add(conflict.getMy());
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + ((conflict == null) ? 0 : conflict.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (!super.equals(obj))
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        ModifiedConflictResolveCommand other = (ModifiedConflictResolveCommand) obj;
+        if (conflict == null) {
+            if (other.conflict != null)
+                return false;
+        } else if (!conflict.equals(other.conflict))
+            return false;
+        return true;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/command/conflict/RelationMemberConflictResolverCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/conflict/RelationMemberConflictResolverCommand.java	(revision 8447)
+++ trunk/src/org/openstreetmap/josm/command/conflict/RelationMemberConflictResolverCommand.java	(revision 8456)
@@ -95,3 +95,40 @@
         }
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + ((mergedMembers == null) ? 0 : mergedMembers.hashCode());
+        result = prime * result + ((my == null) ? 0 : my.hashCode());
+        result = prime * result + ((their == null) ? 0 : their.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (!super.equals(obj))
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        RelationMemberConflictResolverCommand other = (RelationMemberConflictResolverCommand) obj;
+        if (mergedMembers == null) {
+            if (other.mergedMembers != null)
+                return false;
+        } else if (!mergedMembers.equals(other.mergedMembers))
+            return false;
+        if (my == null) {
+            if (other.my != null)
+                return false;
+        } else if (!my.equals(other.my))
+            return false;
+        if (their == null) {
+            if (other.their != null)
+                return false;
+        } else if (!their.equals(other.their))
+            return false;
+        return true;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/command/conflict/TagConflictResolveCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/conflict/TagConflictResolveCommand.java	(revision 8447)
+++ trunk/src/org/openstreetmap/josm/command/conflict/TagConflictResolveCommand.java	(revision 8456)
@@ -97,3 +97,34 @@
         modified.add(conflict.getMy());
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + ((conflict == null) ? 0 : conflict.hashCode());
+        result = prime * result + ((mergeItems == null) ? 0 : mergeItems.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (!super.equals(obj))
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        TagConflictResolveCommand other = (TagConflictResolveCommand) obj;
+        if (conflict == null) {
+            if (other.conflict != null)
+                return false;
+        } else if (!conflict.equals(other.conflict))
+            return false;
+        if (mergeItems == null) {
+            if (other.mergeItems != null)
+                return false;
+        } else if (!mergeItems.equals(other.mergeItems))
+            return false;
+        return true;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/command/conflict/VersionConflictResolveCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/conflict/VersionConflictResolveCommand.java	(revision 8447)
+++ trunk/src/org/openstreetmap/josm/command/conflict/VersionConflictResolveCommand.java	(revision 8456)
@@ -73,3 +73,28 @@
         modified.add(conflict.getMy());
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + ((conflict == null) ? 0 : conflict.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (!super.equals(obj))
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        VersionConflictResolveCommand other = (VersionConflictResolveCommand) obj;
+        if (conflict == null) {
+            if (other.conflict != null)
+                return false;
+        } else if (!conflict.equals(other.conflict))
+            return false;
+        return true;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/command/conflict/WayNodesConflictResolverCommand.java
===================================================================
--- trunk/src/org/openstreetmap/josm/command/conflict/WayNodesConflictResolverCommand.java	(revision 8447)
+++ trunk/src/org/openstreetmap/josm/command/conflict/WayNodesConflictResolverCommand.java	(revision 8456)
@@ -72,3 +72,34 @@
         modified.add(conflict.getMy());
     }
+
+    @Override
+    public int hashCode() {
+        final int prime = 31;
+        int result = super.hashCode();
+        result = prime * result + ((conflict == null) ? 0 : conflict.hashCode());
+        result = prime * result + ((mergedNodeList == null) ? 0 : mergedNodeList.hashCode());
+        return result;
+    }
+
+    @Override
+    public boolean equals(Object obj) {
+        if (this == obj)
+            return true;
+        if (!super.equals(obj))
+            return false;
+        if (getClass() != obj.getClass())
+            return false;
+        WayNodesConflictResolverCommand other = (WayNodesConflictResolverCommand) obj;
+        if (conflict == null) {
+            if (other.conflict != null)
+                return false;
+        } else if (!conflict.equals(other.conflict))
+            return false;
+        if (mergedNodeList == null) {
+            if (other.mergedNodeList != null)
+                return false;
+        } else if (!mergedNodeList.equals(other.mergedNodeList))
+            return false;
+        return true;
+    }
 }
