Index: src/org/openstreetmap/josm/data/osm/ChangesetDataSet.java
===================================================================
--- src/org/openstreetmap/josm/data/osm/ChangesetDataSet.java	(revision 14882)
+++ src/org/openstreetmap/josm/data/osm/ChangesetDataSet.java	(working copy)
@@ -15,8 +15,25 @@
  * A ChangesetDataSet holds the content of a changeset.
  */
 public class ChangesetDataSet {
+    private final boolean useEarliestVersion;
 
     /**
+     * Constructs a new {@code ChangesetDataSet}
+     * For primitives which appear with different versions the last version is kept.
+     */
+    public ChangesetDataSet() {
+        this.useEarliestVersion = false;
+    }
+
+    /**
+     * Constructs a new {@code ChangesetDataSet}
+     * @param useEarliestVersion if true, keep the first version of a primitive, else the last version is kept.
+     */
+    public ChangesetDataSet(boolean useEarliestVersion) {
+        this.useEarliestVersion = useEarliestVersion;
+    }
+
+    /**
      * Type of primitive modification.
      */
     public enum ChangesetModificationType {
@@ -60,8 +77,10 @@
     public void put(HistoryOsmPrimitive primitive, ChangesetModificationType cmt) {
         CheckParameterUtil.ensureParameterNotNull(primitive, "primitive");
         CheckParameterUtil.ensureParameterNotNull(cmt, "cmt");
-        primitives.put(primitive.getPrimitiveId(), primitive);
-        modificationTypes.put(primitive.getPrimitiveId(), cmt);
+        if (!useEarliestVersion || !primitives.containsKey(primitive)) {
+            primitives.put(primitive.getPrimitiveId(), primitive);
+            modificationTypes.put(primitive.getPrimitiveId(), cmt);
+        }
     }
 
     /**
Index: src/org/openstreetmap/josm/io/AbstractParser.java
===================================================================
--- src/org/openstreetmap/josm/io/AbstractParser.java	(revision 14882)
+++ src/org/openstreetmap/josm/io/AbstractParser.java	(working copy)
@@ -28,6 +28,8 @@
     /** the current primitive to be read */
     protected HistoryOsmPrimitive currentPrimitive;
     protected Locator locator;
+    /** if true, replace user information in input by anonymous user */
+    protected boolean useAnonymousUser;
 
     @Override
     public void setDocumentLocator(Locator locator) {
@@ -111,17 +113,20 @@
         long changesetId = changeset != null ? changeset : 0L;
         boolean visible = getMandatoryAttributeBoolean(atts, "visible");
 
-        Long uid = getAttributeLong(atts, "uid");
-        String userStr = atts.getValue("user");
-        User user;
-        if (userStr != null) {
-            if (uid != null) {
-                user = User.createOsmUser(uid, userStr);
-                user.setPreferredName(userStr);
-            } else {
-                user = User.createLocalUser(userStr);
+        User user = null;
+        if (!useAnonymousUser) {
+            Long uid = getAttributeLong(atts, "uid");
+            String userStr = atts.getValue("user");
+            if (userStr != null) {
+                if (uid != null) {
+                    user = User.createOsmUser(uid, userStr);
+                    user.setPreferredName(userStr);
+                } else {
+                    user = User.createLocalUser(userStr);
+                }
             }
-        } else {
+        }
+        if (user == null) {
             user = User.getAnonymous();
         }
 
Index: src/org/openstreetmap/josm/io/OsmChangesetContentParser.java
===================================================================
--- src/org/openstreetmap/josm/io/OsmChangesetContentParser.java	(revision 14882)
+++ src/org/openstreetmap/josm/io/OsmChangesetContentParser.java	(working copy)
@@ -31,9 +31,12 @@
 public class OsmChangesetContentParser {
 
     private final InputSource source;
-    private final ChangesetDataSet data = new ChangesetDataSet();
+    private final ChangesetDataSet data;
 
     private class Parser extends AbstractParser {
+        Parser(boolean useAnonymousUser) {
+            this.useAnonymousUser = useAnonymousUser;
+        }
 
         /** the current change modification type */
         private ChangesetDataSet.ChangesetModificationType currentModificationType;
@@ -115,15 +118,28 @@
     }
 
     /**
+     * Constructs a new {@code OsmChangesetContentParser} which keeps the oldest version if
+     * multiple versions of a primitive appear in one changeset.
+     *
+     * @param source the input stream with the changeset content as XML document. Must not be null.
+     * @throws IllegalArgumentException if source is {@code null}.
+     */
+    public OsmChangesetContentParser(InputStream source) {
+        this(source, false);
+    }
+
+    /**
      * Constructs a new {@code OsmChangesetContentParser}.
      *
      * @param source the input stream with the changeset content as XML document. Must not be null.
+     * @param useEarliestVersion if true, keep the first version of a primitive, else the last version is kept.
      * @throws IllegalArgumentException if source is {@code null}.
+     * @since xxx
      */
-    @SuppressWarnings("resource")
-    public OsmChangesetContentParser(InputStream source) {
+    public OsmChangesetContentParser(InputStream source, boolean useEarliestVersion) {
         CheckParameterUtil.ensureParameterNotNull(source, "source");
         this.source = new InputSource(new InputStreamReader(source, StandardCharsets.UTF_8));
+        data = new ChangesetDataSet(useEarliestVersion);
     }
 
     /**
@@ -135,6 +151,7 @@
     public OsmChangesetContentParser(String source) {
         CheckParameterUtil.ensureParameterNotNull(source, "source");
         this.source = new InputSource(new StringReader(source));
+        data = new ChangesetDataSet();
     }
 
     /**
@@ -146,6 +163,19 @@
      * exceptions.
      */
     public ChangesetDataSet parse(ProgressMonitor progressMonitor) throws XmlParsingException {
+        return parse(progressMonitor, false);
+    }
+
+    /**
+     * Parses the content.
+     *
+     * @param progressMonitor the progress monitor. Set to {@link NullProgressMonitor#INSTANCE} if null
+     * @param useAnonymousUser if true, replace all user information with the anonymous user
+     * @return the parsed data
+     * @throws XmlParsingException if something went wrong. Check for chained
+     * exceptions.
+     */
+    public ChangesetDataSet parse(ProgressMonitor progressMonitor, boolean useAnonymousUser) throws XmlParsingException {
         if (progressMonitor == null) {
             progressMonitor = NullProgressMonitor.INSTANCE;
         }
@@ -152,7 +182,7 @@
         try {
             progressMonitor.beginTask("");
             progressMonitor.indeterminateSubTask(tr("Parsing changeset content ..."));
-            XmlUtils.parseSafeSAX(source, new Parser());
+            XmlUtils.parseSafeSAX(source, new Parser(useAnonymousUser));
         } catch (XmlParsingException e) {
             throw e;
         } catch (ParserConfigurationException | SAXException | IOException e) {
@@ -171,6 +201,6 @@
      * exceptions.
      */
     public ChangesetDataSet parse() throws XmlParsingException {
-        return parse(null);
+        return parse(null, false);
     }
 }
Index: src/org/openstreetmap/josm/io/OsmServerChangesetReader.java
===================================================================
--- src/org/openstreetmap/josm/io/OsmServerChangesetReader.java	(revision 14882)
+++ src/org/openstreetmap/josm/io/OsmServerChangesetReader.java	(working copy)
@@ -26,8 +26,30 @@
  *
  */
 public class OsmServerChangesetReader extends OsmServerReader {
+    final boolean useAnonymousUser;
+    final boolean useEarliestVersion;
 
+
     /**
+     * Constructs a new {@code OsmServerChangesetReader} with default settings.
+     */
+    public OsmServerChangesetReader() {
+        this(false, false);
+    }
+
+    /**
+     * Constructs a new {@code OsmServerChangesetReader}
+     * @param useAnonymousUser if true, replace all user information with the anonymous user
+     * @param useEarliestVersion if true, keep the first version of a primitive, else the last version is kept.
+     * @since xxx
+     */
+    public OsmServerChangesetReader(boolean useAnonymousUser, boolean useEarliestVersion) {
+        super();
+        this.useAnonymousUser = useAnonymousUser;
+        this.useEarliestVersion = useEarliestVersion;
+    }
+
+    /**
      * don't use - not implemented!
      */
     @Override
@@ -197,8 +219,8 @@
                 if (in == null)
                     return null;
                 monitor.setCustomText(tr("Downloading content for changeset {0} ...", id));
-                OsmChangesetContentParser parser = new OsmChangesetContentParser(in);
-                result = parser.parse(monitor.createSubTaskMonitor(1, true));
+                OsmChangesetContentParser parser = new OsmChangesetContentParser(in, useEarliestVersion);
+                result = parser.parse(monitor.createSubTaskMonitor(1, true), useAnonymousUser);
             } catch (IOException e) {
                 Logging.warn(e);
             }
