Index: trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeTask.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeTask.java	(revision 11877)
+++ trunk/src/org/openstreetmap/josm/actions/downloadtasks/DownloadOsmChangeTask.java	(revision 11878)
@@ -7,5 +7,4 @@
 import java.util.HashMap;
 import java.util.Iterator;
-import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
@@ -25,5 +24,4 @@
 import org.openstreetmap.josm.data.osm.PrimitiveId;
 import org.openstreetmap.josm.data.osm.RelationData;
-import org.openstreetmap.josm.data.osm.RelationMemberData;
 import org.openstreetmap.josm.data.osm.WayData;
 import org.openstreetmap.josm.data.osm.history.History;
@@ -80,8 +78,16 @@
     }
 
+    /**
+     * OsmChange download task.
+     */
     protected class DownloadTask extends DownloadOsmTask.DownloadTask {
 
-        public DownloadTask(boolean newLayer, OsmServerReader reader,
-                ProgressMonitor progressMonitor) {
+        /**
+         * Constructs a new {@code DownloadTask}.
+         * @param newLayer if {@code true}, force download to a new layer
+         * @param reader OSM data reader
+         * @param progressMonitor progress monitor
+         */
+        public DownloadTask(boolean newLayer, OsmServerReader reader, ProgressMonitor progressMonitor) {
             super(newLayer, reader, progressMonitor);
         }
@@ -154,13 +160,10 @@
                         switch (p.getType()) {
                         case NODE:
-                            data = new NodeData();
-                            ((NodeData) data).setCoor(((HistoryNode) hp).getCoords());
+                            data = ((HistoryNode) hp).fillPrimitiveData(new NodeData());
                             break;
                         case WAY:
-                            data = new WayData();
-                            List<Long> nodeIds = ((HistoryWay) hp).getNodes();
-                            ((WayData) data).setNodes(nodeIds);
+                            data = ((HistoryWay) hp).fillPrimitiveData(new WayData());
                             // Find incomplete nodes to load at next run
-                            for (Long nodeId : nodeIds) {
+                            for (Long nodeId : ((HistoryWay) hp).getNodes()) {
                                 if (p.getDataSet().getPrimitiveById(nodeId, OsmPrimitiveType.NODE) == null) {
                                     Node n = new Node(nodeId);
@@ -171,20 +174,8 @@
                             break;
                         case RELATION:
-                            data = new RelationData();
-                            List<RelationMemberData> members = ((HistoryRelation) hp).getMembers();
-                            ((RelationData) data).setMembers(members);
+                            data = ((HistoryRelation) hp).fillPrimitiveData(new RelationData());
                             break;
                         default: throw new AssertionError("Unknown primitive type");
                         }
-
-                        data.setUser(hp.getUser());
-                        try {
-                            data.setVisible(hp.isVisible());
-                        } catch (IllegalStateException e) {
-                            Main.error(e, "Cannot change visibility for "+p+':');
-                        }
-                        data.setTimestamp(hp.getTimestamp());
-                        data.setKeys(hp.getTags());
-                        data.setOsmId(hp.getId(), (int) hp.getVersion());
 
                         // Load the history data
Index: trunk/src/org/openstreetmap/josm/data/notes/Note.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/notes/Note.java	(revision 11877)
+++ trunk/src/org/openstreetmap/josm/data/notes/Note.java	(revision 11878)
@@ -11,4 +11,5 @@
 
 import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.tools.date.DateUtils;
 
 /**
@@ -98,5 +99,5 @@
     /** @return Date that this note was submitted */
     public Date getCreatedAt() {
-        return cloneDate(createdAt);
+        return DateUtils.cloneDate(createdAt);
     }
 
@@ -106,10 +107,10 @@
      */
     public void setCreatedAt(Date createdAt) {
-        this.createdAt = cloneDate(createdAt);
+        this.createdAt = DateUtils.cloneDate(createdAt);
     }
 
     /** @return Date that this note was closed. Null if it is still open. */
     public Date getClosedAt() {
-        return cloneDate(closedAt);
+        return DateUtils.cloneDate(closedAt);
     }
 
@@ -119,5 +120,5 @@
      */
     public void setClosedAt(Date closedAt) {
-        this.closedAt = cloneDate(closedAt);
+        this.closedAt = DateUtils.cloneDate(closedAt);
     }
 
@@ -172,5 +173,5 @@
     public void updateWith(Note note) {
         this.comments = note.comments;
-        this.createdAt = cloneDate(note.createdAt);
+        this.createdAt = DateUtils.cloneDate(note.createdAt);
         this.id = note.id;
         this.state = note.state;
@@ -197,12 +198,3 @@
         return tr("Note") + ' ' + id + ": " + getFirstComment();
     }
-
-    /**
-     * Null-safe date cloning method.
-     * @param d date to clone, or null
-     * @return cloned date, or null
-     */
-    static Date cloneDate(Date d) {
-        return d != null ? (Date) d.clone() : null;
-    }
 }
Index: trunk/src/org/openstreetmap/josm/data/notes/NoteComment.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/notes/NoteComment.java	(revision 11877)
+++ trunk/src/org/openstreetmap/josm/data/notes/NoteComment.java	(revision 11878)
@@ -6,4 +6,5 @@
 
 import org.openstreetmap.josm.data.osm.User;
+import org.openstreetmap.josm.tools.date.DateUtils;
 
 /**
@@ -52,5 +53,5 @@
         this.text = commentText;
         this.user = user;
-        this.commentTimestamp = Note.cloneDate(createDate);
+        this.commentTimestamp = DateUtils.cloneDate(createDate);
         this.action = action;
         this.isNew = isNew;
@@ -69,5 +70,5 @@
     /** @return The time at which this comment was created */
     public Date getCommentTimestamp() {
-        return Note.cloneDate(commentTimestamp);
+        return DateUtils.cloneDate(commentTimestamp);
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/Changeset.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Changeset.java	(revision 11877)
+++ trunk/src/org/openstreetmap/josm/data/osm/Changeset.java	(revision 11878)
@@ -15,4 +15,5 @@
 import org.openstreetmap.josm.data.osm.visitor.Visitor;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
+import org.openstreetmap.josm.tools.date.DateUtils;
 
 /**
@@ -177,5 +178,5 @@
      */
     public Date getCreatedAt() {
-        return createdAt;
+        return DateUtils.cloneDate(createdAt);
     }
 
@@ -185,5 +186,5 @@
      */
     public void setCreatedAt(Date createdAt) {
-        this.createdAt = createdAt;
+        this.createdAt = DateUtils.cloneDate(createdAt);
     }
 
@@ -193,5 +194,5 @@
      */
     public Date getClosedAt() {
-        return closedAt;
+        return DateUtils.cloneDate(closedAt);
     }
 
@@ -201,5 +202,5 @@
      */
     public void setClosedAt(Date closedAt) {
-        this.closedAt = closedAt;
+        this.closedAt = DateUtils.cloneDate(closedAt);
     }
 
@@ -426,6 +427,6 @@
             return;
         this.user = other.user;
-        this.createdAt = other.createdAt;
-        this.closedAt = other.closedAt;
+        this.createdAt = DateUtils.cloneDate(other.createdAt);
+        this.closedAt = DateUtils.cloneDate(other.closedAt);
         this.open = other.open;
         this.min = other.min;
Index: trunk/src/org/openstreetmap/josm/data/osm/ChangesetDataSet.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/ChangesetDataSet.java	(revision 11877)
+++ trunk/src/org/openstreetmap/josm/data/osm/ChangesetDataSet.java	(revision 11878)
@@ -17,13 +17,31 @@
 public class ChangesetDataSet {
 
+    /**
+     * Type of primitive modification.
+     */
     public enum ChangesetModificationType {
+        /** The primitive has been created */
         CREATED,
+        /** The primitive has been updated */
         UPDATED,
+        /** The primitive has been deleted */
         DELETED
     }
 
+    /**
+     * An entry in the changeset dataset.
+     */
     public interface ChangesetDataSetEntry {
+
+        /**
+         * Returns the type of modification.
+         * @return the type of modification
+         */
         ChangesetModificationType getModificationType();
 
+        /**
+         * Returns the affected history primitive.
+         * @return the affected history primitive
+         */
         HistoryOsmPrimitive getPrimitive();
     }
@@ -133,10 +151,9 @@
 
     /**
-     * Replies the {@link HistoryOsmPrimitive} with id <code>id</code> from this
-     * dataset. null, if there is no such primitive in the data set.
-     *
-     * @param id the id
-     * @return  the {@link HistoryOsmPrimitive} with id <code>id</code> from this
-     * dataset
+     * Replies the {@link HistoryOsmPrimitive} with id <code>id</code> from this dataset.
+     * null, if there is no such primitive in the data set.
+     *
+     * @param id the id
+     * @return the {@link HistoryOsmPrimitive} with id <code>id</code> from this dataset
      */
     public HistoryOsmPrimitive getPrimitive(PrimitiveId id) {
@@ -145,4 +162,8 @@
     }
 
+    /**
+     * Returns an iterator over dataset entries.
+     * @return an iterator over dataset entries
+     */
     public Iterator<ChangesetDataSetEntry> iterator() {
         return new DefaultIterator();
@@ -184,7 +205,5 @@
         public ChangesetDataSetEntry next() {
             Entry<PrimitiveId, ChangesetModificationType> next = typeIterator.next();
-            ChangesetModificationType type = next.getValue();
-            HistoryOsmPrimitive primitive = primitives.get(next.getKey());
-            return new DefaultChangesetDataSetEntry(type, primitive);
+            return new DefaultChangesetDataSetEntry(next.getValue(), primitives.get(next.getKey()));
         }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/ChangesetDiscussionComment.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/ChangesetDiscussionComment.java	(revision 11877)
+++ trunk/src/org/openstreetmap/josm/data/osm/ChangesetDiscussionComment.java	(revision 11878)
@@ -3,4 +3,6 @@
 
 import java.util.Date;
+
+import org.openstreetmap.josm.tools.date.DateUtils;
 
 /**
@@ -23,5 +25,5 @@
      */
     public ChangesetDiscussionComment(Date date, User user) {
-        this.date = date;
+        this.date = DateUtils.cloneDate(date);
         this.user = user;
     }
@@ -48,5 +50,5 @@
      */
     public final Date getDate() {
-        return date;
+        return DateUtils.cloneDate(date);
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/PrimitiveData.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/PrimitiveData.java	(revision 11877)
+++ trunk/src/org/openstreetmap/josm/data/osm/PrimitiveData.java	(revision 11878)
@@ -75,4 +75,11 @@
     }
 
+    /**
+     * Returns a filtered list for a given primitive type.
+     * @param <T> primitive type
+     * @param list list to filter
+     * @param type primitive type
+     * @return a filtered list for given primitive type
+     */
     @SuppressWarnings("unchecked")
     public static <T extends PrimitiveData> List<T> getFilteredList(Collection<T> list, OsmPrimitiveType type) {
Index: trunk/src/org/openstreetmap/josm/data/osm/RelationData.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/RelationData.java	(revision 11877)
+++ trunk/src/org/openstreetmap/josm/data/osm/RelationData.java	(revision 11878)
@@ -7,4 +7,8 @@
 import org.openstreetmap.josm.data.osm.visitor.PrimitiveVisitor;
 
+/**
+ * Relation data.
+ * @since 2284
+ */
 public class RelationData extends PrimitiveData implements IRelation {
 
@@ -28,8 +32,16 @@
     }
 
+    /**
+     * Returns relation members.
+     * @return relation members
+     */
     public List<RelationMemberData> getMembers() {
         return members;
     }
 
+    /**
+     * Sets relation members.
+     * @param memberData relation members
+     */
     public void setMembers(List<RelationMemberData> memberData) {
         members = new ArrayList<>(memberData);
Index: trunk/src/org/openstreetmap/josm/data/osm/UserInfo.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/UserInfo.java	(revision 11877)
+++ trunk/src/org/openstreetmap/josm/data/osm/UserInfo.java	(revision 11878)
@@ -6,4 +6,5 @@
 
 import org.openstreetmap.josm.data.coor.LatLon;
+import org.openstreetmap.josm.tools.date.DateUtils;
 
 /**
@@ -73,5 +74,5 @@
      */
     public Date getAccountCreated() {
-        return accountCreated;
+        return DateUtils.cloneDate(accountCreated);
     }
 
@@ -81,5 +82,5 @@
      */
     public void setAccountCreated(Date accountCreated) {
-        this.accountCreated = accountCreated;
+        this.accountCreated = DateUtils.cloneDate(accountCreated);
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/history/HistoryNode.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/history/HistoryNode.java	(revision 11877)
+++ trunk/src/org/openstreetmap/josm/data/osm/history/HistoryNode.java	(revision 11878)
@@ -6,4 +6,5 @@
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.osm.Node;
+import org.openstreetmap.josm.data.osm.NodeData;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.data.osm.User;
@@ -89,3 +90,15 @@
         return formatter.format(this);
     }
+
+    /**
+     * Fills the node attributes with values from this history.
+     * @param data node data to fill
+     * @return filled node data
+     * @since 11878
+     */
+    public NodeData fillPrimitiveData(NodeData data) {
+        super.fillPrimitiveCommonData(data);
+        data.setCoor(coords);
+        return data;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/data/osm/history/HistoryOsmPrimitive.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/history/HistoryOsmPrimitive.java	(revision 11877)
+++ trunk/src/org/openstreetmap/josm/data/osm/history/HistoryOsmPrimitive.java	(revision 11878)
@@ -13,8 +13,10 @@
 import java.util.Objects;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.Changeset;
 import org.openstreetmap.josm.data.osm.Node;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
+import org.openstreetmap.josm.data.osm.PrimitiveData;
 import org.openstreetmap.josm.data.osm.PrimitiveId;
 import org.openstreetmap.josm.data.osm.Relation;
@@ -24,4 +26,5 @@
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
+import org.openstreetmap.josm.tools.date.DateUtils;
 
 /**
@@ -85,6 +88,6 @@
         this.user = user;
         this.changesetId = changesetId;
-        this.timestamp = timestamp;
-        tags = new HashMap<>();
+        this.timestamp = DateUtils.cloneDate(timestamp);
+        this.tags = new HashMap<>();
     }
 
@@ -159,5 +162,5 @@
      */
     public Date getTimestamp() {
-        return timestamp;
+        return DateUtils.cloneDate(timestamp);
     }
 
@@ -170,4 +173,10 @@
     }
 
+    /**
+     * Checks that value is positive.
+     * @param value value to check
+     * @param name parameter name for error message
+     * @throws IllegalArgumentException if {@code value <= 0}
+     */
     protected final void ensurePositiveLong(long value, String name) {
         if (value <= 0) {
@@ -176,8 +185,19 @@
     }
 
+    /**
+     * Determines if this history matches given id and version.
+     * @param id Primitive identifier
+     * @param version Primitive version
+     * @return {@code true} if this history matches given id and version
+     */
     public boolean matches(long id, long version) {
         return this.id == id && this.version == version;
     }
 
+    /**
+     * Determines if this history matches given id.
+     * @param id Primitive identifier
+     * @return {@code true} if this history matches given id
+     */
     public boolean matches(long id) {
         return this.id == id;
@@ -325,4 +345,20 @@
     }
 
+    /**
+     * Fills the attributes common to all primitives with values from this history.
+     * @param data primitive data to fill
+     */
+    protected void fillPrimitiveCommonData(PrimitiveData data) {
+        data.setUser(user);
+        try {
+            data.setVisible(visible);
+        } catch (IllegalStateException e) {
+            Main.error(e, "Cannot change visibility for "+data+':');
+        }
+        data.setTimestamp(timestamp);
+        data.setKeys(tags);
+        data.setOsmId(id, (int) version);
+    }
+
     @Override
     public int hashCode() {
@@ -335,6 +371,5 @@
         if (obj == null || getClass() != obj.getClass()) return false;
         HistoryOsmPrimitive that = (HistoryOsmPrimitive) obj;
-        return id == that.id &&
-                version == that.version;
+        return id == that.id && version == that.version;
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/history/HistoryRelation.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/history/HistoryRelation.java	(revision 11877)
+++ trunk/src/org/openstreetmap/josm/data/osm/history/HistoryRelation.java	(revision 11878)
@@ -10,4 +10,5 @@
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.data.osm.Relation;
+import org.openstreetmap.josm.data.osm.RelationData;
 import org.openstreetmap.josm.data.osm.RelationMemberData;
 import org.openstreetmap.josm.data.osm.User;
@@ -141,3 +142,15 @@
         return formatter.format(this);
     }
+
+    /**
+     * Fills the relation attributes with values from this history.
+     * @param data relation data to fill
+     * @return filled relation data
+     * @since 11878
+     */
+    public RelationData fillPrimitiveData(RelationData data) {
+        super.fillPrimitiveCommonData(data);
+        data.setMembers(members);
+        return data;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/data/osm/history/HistoryWay.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/history/HistoryWay.java	(revision 11877)
+++ trunk/src/org/openstreetmap/josm/data/osm/history/HistoryWay.java	(revision 11878)
@@ -12,4 +12,5 @@
 import org.openstreetmap.josm.data.osm.User;
 import org.openstreetmap.josm.data.osm.Way;
+import org.openstreetmap.josm.data.osm.WayData;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 
@@ -143,3 +144,15 @@
         return formatter.format(this);
     }
+
+    /**
+     * Fills the way attributes with values from this history.
+     * @param data way data to fill
+     * @return filled way data
+     * @since 11878
+     */
+    public WayData fillPrimitiveData(WayData data) {
+        super.fillPrimitiveCommonData(data);
+        data.setNodes(nodeIds);
+        return data;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentTableCellRenderer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentTableCellRenderer.java	(revision 11877)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentTableCellRenderer.java	(revision 11878)
@@ -17,4 +17,8 @@
 public class ChangesetContentTableCellRenderer extends AbstractCellRenderer {
 
+    /**
+     * Renders primitive modification type.
+     * @param type modification type
+     */
     protected void renderModificationType(ChangesetModificationType type) {
         switch(type) {
@@ -35,10 +39,8 @@
         switch(column) {
         case 0:
-            ChangesetModificationType type = (ChangesetModificationType) value;
-            renderModificationType(type);
+            renderModificationType((ChangesetModificationType) value);
             break;
         case 1:
-            HistoryOsmPrimitive primitive = (HistoryOsmPrimitive) value;
-            renderId(primitive.getId());
+            renderId(((HistoryOsmPrimitive) value).getId());
             break;
         default:
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentTableModel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentTableModel.java	(revision 11877)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetContentTableModel.java	(revision 11878)
@@ -18,5 +18,5 @@
 /**
  * This is the table model for the content of a changeset.
- *
+ * @since 2689
  */
 public class ChangesetContentTableModel extends AbstractTableModel {
@@ -25,4 +25,8 @@
     private final DefaultListSelectionModel selectionModel;
 
+    /**
+     * Constructs a new {@code ChangesetContentTableModel}.
+     * @param selectionModel selection model
+     */
     public ChangesetContentTableModel(DefaultListSelectionModel selectionModel) {
         this.selectionModel = selectionModel;
@@ -38,4 +42,8 @@
     }
 
+    /**
+     * Selects a single item by its index.
+     * @param row index
+     */
     public void setSelectedByIdx(int row) {
         selectionModel.setSelectionInterval(row, row);
@@ -50,4 +58,8 @@
     }
 
+    /**
+     * Returns the selected history primitives.
+     * @return the selected history primitives
+     */
     public Set<HistoryOsmPrimitive> getSelectedPrimitives() {
         Set<HistoryOsmPrimitive> ret = new HashSet<>();
@@ -78,4 +90,7 @@
     }
 
+    /**
+     * Sort data.
+     */
     protected void sort() {
         data.sort((c1, c2) -> {
@@ -130,5 +145,4 @@
      * The type used internally to keep information about {@link HistoryOsmPrimitive}
      * with their {@link ChangesetModificationType}.
-     *
      */
     private static class ChangesetContentEntry implements ChangesetDataSetEntry {
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDetailPanel.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDetailPanel.java	(revision 11877)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/changeset/ChangesetDetailPanel.java	(revision 11878)
@@ -17,4 +17,5 @@
 import java.text.DateFormat;
 import java.util.Collections;
+import java.util.Date;
 import java.util.HashSet;
 import java.util.Set;
@@ -238,6 +239,8 @@
         DateFormat sdf = DateUtils.getDateTimeFormat(DateFormat.SHORT, DateFormat.SHORT);
 
-        tfCreatedOn.setText(cs.getCreatedAt() == null ? "" : sdf.format(cs.getCreatedAt()));
-        tfClosedOn.setText(cs.getClosedAt() == null ? "" : sdf.format(cs.getClosedAt()));
+        Date createdDate = cs.getCreatedAt();
+        Date closedDate = cs.getClosedAt();
+        tfCreatedOn.setText(createdDate == null ? "" : sdf.format(createdDate));
+        tfClosedOn.setText(closedDate == null ? "" : sdf.format(closedDate));
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/history/CoordinateInfoViewer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/history/CoordinateInfoViewer.java	(revision 11877)
+++ trunk/src/org/openstreetmap/josm/gui/history/CoordinateInfoViewer.java	(revision 11878)
@@ -231,6 +231,6 @@
         protected final Pair<LatLon, LatLon> getCoordinates() {
             HistoryOsmPrimitive p = getPrimitive();
+            if (!(p instanceof HistoryNode)) return null;
             HistoryOsmPrimitive opposite = getOppositePrimitive();
-            if (!(p instanceof HistoryNode)) return null;
             if (!(opposite instanceof HistoryNode)) return null;
             HistoryNode node = (HistoryNode) p;
Index: trunk/src/org/openstreetmap/josm/gui/io/ChangesetCellRenderer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/io/ChangesetCellRenderer.java	(revision 11877)
+++ trunk/src/org/openstreetmap/josm/gui/io/ChangesetCellRenderer.java	(revision 11878)
@@ -6,4 +6,5 @@
 import java.awt.Component;
 import java.text.DateFormat;
+import java.util.Date;
 
 import javax.swing.ImageIcon;
@@ -37,7 +38,8 @@
         StringBuilder sb = new StringBuilder(64);
         sb.append("<html><strong>").append(tr("Changeset id:")).append("</strong>").append(cs.getId()).append("<br>");
-        if (cs.getCreatedAt() != null) {
+        Date createdDate = cs.getCreatedAt();
+        if (createdDate != null) {
             sb.append("<strong>").append(tr("Created at:")).append("</strong>").append(
-                    DateUtils.formatDateTime(cs.getCreatedAt(), DateFormat.SHORT, DateFormat.SHORT)).append("<br>");
+                    DateUtils.formatDateTime(createdDate, DateFormat.SHORT, DateFormat.SHORT)).append("<br>");
         }
         String comment = cs.get("comment");
Index: trunk/src/org/openstreetmap/josm/gui/widgets/DateEditorWithSlider.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/widgets/DateEditorWithSlider.java	(revision 11877)
+++ trunk/src/org/openstreetmap/josm/gui/widgets/DateEditorWithSlider.java	(revision 11878)
@@ -91,14 +91,14 @@
 
     public void setRange(Date dateMin, Date dateMax) {
-        this.dateMin = dateMin;
-        this.dateMax = dateMax;
+        this.dateMin = DateUtils.cloneDate(dateMin);
+        this.dateMax = DateUtils.cloneDate(dateMax);
     }
 
     public void setDate(Date date) {
-        spinner.setValue(date);
+        spinner.setValue(DateUtils.cloneDate(date));
     }
 
     public Date getDate() {
-        return (Date) spinner.getValue();
+        return DateUtils.cloneDate((Date) spinner.getValue());
     }
 
Index: trunk/src/org/openstreetmap/josm/io/ChangesetClosedException.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/ChangesetClosedException.java	(revision 11877)
+++ trunk/src/org/openstreetmap/josm/io/ChangesetClosedException.java	(revision 11878)
@@ -121,5 +121,5 @@
         this.source = source == null ? Source.UNSPECIFIED : source;
         this.changesetId = changesetId;
-        this.closedOn = closedOn;
+        this.closedOn = DateUtils.cloneDate(closedOn);
     }
 
@@ -139,5 +139,5 @@
      */
     public Date getClosedOn() {
-        return closedOn;
+        return DateUtils.cloneDate(closedOn);
     }
 
Index: trunk/src/org/openstreetmap/josm/io/ChangesetQuery.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/ChangesetQuery.java	(revision 11877)
+++ trunk/src/org/openstreetmap/josm/io/ChangesetQuery.java	(revision 11878)
@@ -184,5 +184,5 @@
     public ChangesetQuery closedAfter(Date d) {
         CheckParameterUtil.ensureParameterNotNull(d, "d");
-        this.closedAfter = d;
+        this.closedAfter = DateUtils.cloneDate(d);
         return this;
     }
@@ -202,6 +202,6 @@
         CheckParameterUtil.ensureParameterNotNull(closedAfter, "closedAfter");
         CheckParameterUtil.ensureParameterNotNull(createdBefore, "createdBefore");
-        this.closedAfter = closedAfter;
-        this.createdBefore = createdBefore;
+        this.closedAfter = DateUtils.cloneDate(closedAfter);
+        this.createdBefore = DateUtils.cloneDate(createdBefore);
         return this;
     }
Index: trunk/src/org/openstreetmap/josm/io/OsmWriter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmWriter.java	(revision 11877)
+++ trunk/src/org/openstreetmap/josm/io/OsmWriter.java	(revision 11878)
@@ -8,4 +8,5 @@
 import java.util.Collection;
 import java.util.Comparator;
+import java.util.Date;
 import java.util.List;
 import java.util.Map.Entry;
@@ -242,9 +243,11 @@
             out.print(" uid='"+cs.getUser().getId() +'\'');
         }
-        if (cs.getCreatedAt() != null) {
-            out.print(" created_at='"+DateUtils.fromDate(cs.getCreatedAt()) +'\'');
-        }
-        if (cs.getClosedAt() != null) {
-            out.print(" closed_at='"+DateUtils.fromDate(cs.getClosedAt()) +'\'');
+        Date createdDate = cs.getCreatedAt();
+        if (createdDate != null) {
+            out.print(" created_at='"+DateUtils.fromDate(createdDate) +'\'');
+        }
+        Date closedDate = cs.getClosedAt();
+        if (closedDate != null) {
+            out.print(" closed_at='"+DateUtils.fromDate(closedDate) +'\'');
         }
         out.print(" open='"+ (cs.isOpen() ? "true" : "false") +'\'');
Index: trunk/src/org/openstreetmap/josm/tools/HttpClient.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/HttpClient.java	(revision 11877)
+++ trunk/src/org/openstreetmap/josm/tools/HttpClient.java	(revision 11878)
@@ -14,4 +14,5 @@
 import java.net.HttpURLConnection;
 import java.net.URL;
+import java.util.Arrays;
 import java.util.Collections;
 import java.util.List;
@@ -558,5 +559,5 @@
      */
     public HttpClient setRequestBody(byte[] requestBody) {
-        this.requestBody = requestBody;
+        this.requestBody = Arrays.copyOf(requestBody, requestBody.length);
         return this;
     }
Index: trunk/src/org/openstreetmap/josm/tools/date/DateUtils.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/date/DateUtils.java	(revision 11877)
+++ trunk/src/org/openstreetmap/josm/tools/date/DateUtils.java	(revision 11878)
@@ -163,4 +163,14 @@
     }
 
+    /**
+     * Null-safe date cloning method.
+     * @param d date to clone, or null
+     * @return cloned date, or null
+     * @since 11878
+     */
+    public static Date cloneDate(Date d) {
+        return d != null ? (Date) d.clone() : null;
+    }
+
     private static boolean checkLayout(String text, String pattern) {
         if (text.length() != pattern.length())
Index: trunk/test/unit/org/openstreetmap/josm/data/osm/ChangesetDataSetTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/data/osm/ChangesetDataSetTest.java	(revision 11877)
+++ trunk/test/unit/org/openstreetmap/josm/data/osm/ChangesetDataSetTest.java	(revision 11878)
@@ -53,7 +53,7 @@
         // object with various items and modification types, fetch for CREATED
         // => list containing only the CREATED item
-        HistoryOsmPrimitive prim1 = new HistoryNode(1, 1, true, User.getAnonymous(), 1, new Date(), LatLon.ZERO);
-        HistoryOsmPrimitive prim2 = new HistoryNode(2, 1, true, User.createLocalUser("test"), 1, new Date(), LatLon.NORTH_POLE);
-        HistoryOsmPrimitive prim3 = new HistoryNode(3, 1, true, User.getAnonymous(), 1, new Date(), LatLon.SOUTH_POLE);
+        HistoryNode prim1 = new HistoryNode(1, 1, true, User.getAnonymous(), 1, new Date(), LatLon.ZERO);
+        HistoryNode prim2 = new HistoryNode(2, 1, true, User.createLocalUser("test"), 1, new Date(), LatLon.NORTH_POLE);
+        HistoryNode prim3 = new HistoryNode(3, 1, true, User.getAnonymous(), 1, new Date(), LatLon.SOUTH_POLE);
         cds.put(prim1, ChangesetModificationType.CREATED);
         cds.put(prim2, ChangesetModificationType.DELETED);
