Index: trunk/src/org/openstreetmap/josm/tools/date/DateUtils.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/date/DateUtils.java	(revision 9738)
+++ trunk/src/org/openstreetmap/josm/tools/date/DateUtils.java	(revision 9739)
@@ -95,4 +95,5 @@
                 parsePart2(str, 14),
                 parsePart2(str, 17));
+            c.set(Calendar.MILLISECOND, 0);
 
             if (str.length() == 25) {
@@ -116,4 +117,5 @@
                 parsePart2(str, 14),
                 parsePart2(str, 17));
+            c.set(Calendar.MILLISECOND, 0);
             long millis = parsePart3(str, 20);
             if (str.length() == 29) {
Index: trunk/test/unit/org/openstreetmap/josm/tools/date/DateUtilsTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/tools/date/DateUtilsTest.java	(revision 9738)
+++ trunk/test/unit/org/openstreetmap/josm/tools/date/DateUtilsTest.java	(revision 9739)
@@ -4,4 +4,5 @@
 import static org.junit.Assert.assertEquals;
 
+import java.util.Date;
 import java.util.TimeZone;
 
@@ -74,3 +75,14 @@
         DateUtils.fromString("2014-");
     }
+
+    /**
+     * Tests that formatting a date w/ milliseconds does not cause incorrect parsing afterwards
+     */
+    @Test
+    public void testFormattingMillisecondsDoesNotCauseIncorrectParsing() {
+        DateUtils.fromDate(new Date(123));
+        assertEquals(1453694709000L, DateUtils.fromString("2016-01-25T04:05:09.000Z").getTime());
+        assertEquals(1453694709200L, DateUtils.fromString("2016-01-25T04:05:09.200Z").getTime());
+        assertEquals(1453694709400L, DateUtils.fromString("2016-01-25T04:05:09.400Z").getTime());
+    }
 }
