Index: /trunk/src/org/openstreetmap/josm/actions/search/SearchCompiler.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/search/SearchCompiler.java	(revision 8564)
+++ /trunk/src/org/openstreetmap/josm/actions/search/SearchCompiler.java	(revision 8565)
@@ -567,5 +567,5 @@
 
                 if ("timestamp".equals(key)) {
-                    mv = DateUtils.fromDate(osm.getTimestamp());
+                    mv = DateUtils.fromTimestamp(osm.getRawTimestamp());
                 } else {
                     mv = osm.get(key);
@@ -1087,5 +1087,5 @@
         @Override
         protected Long getNumber(OsmPrimitive osm) {
-            return osm.getTimestamp().getTime();
+            return osm.getRawTimestamp() * 1000L;
         }
 
Index: /trunk/src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java	(revision 8564)
+++ /trunk/src/org/openstreetmap/josm/data/osm/AbstractPrimitive.java	(revision 8565)
@@ -292,4 +292,9 @@
     }
 
+    @Override
+    public void setRawTimestamp(int timestamp) {
+        this.timestamp = timestamp;
+    }
+
     /**
      * Time of last modification to this object. This is not set by JOSM but
@@ -302,4 +307,9 @@
     public Date getTimestamp() {
         return new Date(timestamp * 1000L);
+    }
+
+    @Override
+    public int getRawTimestamp() {
+        return timestamp;
     }
 
Index: /trunk/src/org/openstreetmap/josm/data/osm/DataSetMerger.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/DataSetMerger.java	(revision 8564)
+++ /trunk/src/org/openstreetmap/josm/data/osm/DataSetMerger.java	(revision 8565)
@@ -100,5 +100,5 @@
                     target.setVisible(source.isVisible());
                     target.setUser(source.getUser());
-                    target.setTimestamp(source.getTimestamp());
+                    target.setRawTimestamp(source.getRawTimestamp());
                     target.setModified(source.isModified());
                     objectsWithChildrenToMerge.add(source.getPrimitiveId());
Index: /trunk/src/org/openstreetmap/josm/data/osm/IPrimitive.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/IPrimitive.java	(revision 8564)
+++ /trunk/src/org/openstreetmap/josm/data/osm/IPrimitive.java	(revision 8565)
@@ -41,5 +41,9 @@
     Date getTimestamp();
 
+    int getRawTimestamp();
+
     void setTimestamp(Date timestamp);
+
+    void setRawTimestamp(int timestamp);
 
     boolean isTimestampEmpty();
Index: /trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 8564)
+++ /trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 8565)
@@ -1228,5 +1228,5 @@
         // Write lock is provided by subclasses
         setKeys(data.getKeys());
-        setTimestamp(data.getTimestamp());
+        setRawTimestamp(data.getRawTimestamp());
         user = data.getUser();
         setChangesetId(data.getChangesetId());
@@ -1250,5 +1250,5 @@
         data.setId(id);
         data.setKeys(getKeys());
-        data.setTimestamp(getTimestamp());
+        data.setRawTimestamp(getRawTimestamp());
         data.setUser(user);
         data.setDeleted(isDeleted());
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java	(revision 8564)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/InspectPrimitiveDialog.java	(revision 8565)
@@ -233,5 +233,5 @@
             add(tr("Data Set: "), Integer.toHexString(o.getDataSet().hashCode()));
             add(tr("Edited at: "), o.isTimestampEmpty() ? tr("<new object>")
-                    : DateUtils.fromDate(o.getTimestamp()));
+                    : DateUtils.fromTimestamp(o.getRawTimestamp()));
             add(tr("Edited by: "), o.getUser() == null ? tr("<new object>")
                     : getNameAndId(o.getUser().getName(), o.getUser().getId()));
Index: /trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 8564)
+++ /trunk/src/org/openstreetmap/josm/gui/layer/OsmDataLayer.java	(revision 8565)
@@ -597,5 +597,5 @@
 
         if (!n.isTimestampEmpty()) {
-            wpt.put("time", DateUtils.fromDate(n.getTimestamp()));
+            wpt.put("time", DateUtils.fromTimestamp(n.getRawTimestamp()));
             wpt.setTime();
         }
Index: /trunk/src/org/openstreetmap/josm/io/OsmWriter.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/OsmWriter.java	(revision 8564)
+++ /trunk/src/org/openstreetmap/josm/io/OsmWriter.java	(revision 8565)
@@ -299,5 +299,5 @@
             }
             if (!osm.isTimestampEmpty()) {
-                out.print(" timestamp='"+DateUtils.fromDate(osm.getTimestamp())+"'");
+                out.print(" timestamp='"+DateUtils.fromTimestamp(osm.getRawTimestamp())+"'");
             }
             // user and visible added with 0.4 API
Index: /trunk/src/org/openstreetmap/josm/tools/date/DateUtils.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/date/DateUtils.java	(revision 8564)
+++ /trunk/src/org/openstreetmap/josm/tools/date/DateUtils.java	(revision 8565)
@@ -119,4 +119,22 @@
     }
 
+    private static String toXmlFormat(GregorianCalendar cal) {
+        XMLGregorianCalendar xgc = XML_DATE.newXMLGregorianCalendar(cal);
+        if (cal.get(Calendar.MILLISECOND) == 0) {
+            xgc.setFractionalSecond(null);
+        }
+        return xgc.toXMLFormat();
+    }
+
+    /**
+     * Formats a date to the XML UTC format regardless of current locale.
+     * @param timestamp number of seconds since the epoch
+     * @return The formatted date
+     */
+    public static synchronized String fromTimestamp(int timestamp) {
+        calendar.setTimeInMillis(timestamp * 1000L);
+        return toXmlFormat(calendar);
+    }
+
     /**
      * Formats a date to the XML UTC format regardless of current locale.
@@ -126,7 +144,5 @@
     public static synchronized String fromDate(Date date) {
         calendar.setTime(date);
-        XMLGregorianCalendar xgc = XML_DATE.newXMLGregorianCalendar(calendar);
-        if (calendar.get(Calendar.MILLISECOND) == 0) xgc.setFractionalSecond(null);
-        return xgc.toXMLFormat();
+        return toXmlFormat(calendar);
     }
 
Index: /trunk/test/unit/org/openstreetmap/josm/data/osm/DataSetMergerTest.java
===================================================================
--- /trunk/test/unit/org/openstreetmap/josm/data/osm/DataSetMergerTest.java	(revision 8564)
+++ /trunk/test/unit/org/openstreetmap/josm/data/osm/DataSetMergerTest.java	(revision 8565)
@@ -317,5 +317,4 @@
         their.addPrimitive(n1);
 
-
         DataSetMerger visitor = new DataSetMerger(my, their);
         visitor.merge();
@@ -324,5 +323,5 @@
         assertEquals(0, visitor.getConflicts().size());
         assertEquals("value1", n2.get("key1"));
-        assertTrue(n1.getTimestamp().equals(n2.getTimestamp()));
+        assertEquals(n1.getRawTimestamp(), n2.getRawTimestamp());
         assertEquals(theirUser, n2.getUser());
         assertSame(n2, n);
@@ -351,5 +350,4 @@
         their.addPrimitive(n1);
 
-
         DataSetMerger visitor = new DataSetMerger(my, their);
         visitor.merge();
@@ -358,5 +356,5 @@
         assertEquals(0, visitor.getConflicts().size());
         assertEquals("value1", n2.get("key1"));
-        assertTrue(n1.getTimestamp().equals(n2.getTimestamp()));
+        assertEquals(n1.getRawTimestamp(), n2.getRawTimestamp());
         assertFalse(n2.isIncomplete());
         assertSame(n2, n);
@@ -665,5 +663,5 @@
         assertEquals("their", merged.getUser().getName());
         assertEquals(1111, merged.getUser().getId());
-        assertEquals(theirWay.getTimestamp(), merged.getTimestamp());
+        assertEquals(theirWay.getRawTimestamp(), merged.getRawTimestamp());
         assertSame(merged, myWay);
         assertSame(merged.getNode(0), n1);
@@ -719,5 +717,5 @@
         assertEquals("their", merged.getUser().getName());
         assertEquals(1111, merged.getUser().getId());
-        assertEquals(theirWay.getTimestamp(), merged.getTimestamp());
+        assertEquals(theirWay.getRawTimestamp(), merged.getRawTimestamp());
         assertSame(merged, myWay);
         assertSame(merged.getNode(0), n1);
