Index: trunk/src/org/openstreetmap/josm/io/OsmApi.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmApi.java	(revision 10050)
+++ trunk/src/org/openstreetmap/josm/io/OsmApi.java	(revision 10051)
@@ -281,5 +281,5 @@
      * @return XML string
      */
-    private String toXml(IPrimitive o, boolean addBody) {
+    protected final String toXml(IPrimitive o, boolean addBody) {
         StringWriter swriter = new StringWriter();
         try (OsmWriter osmWriter = OsmWriterFactory.createOsmWriter(new PrintWriter(swriter), true, version)) {
@@ -302,5 +302,5 @@
      * @return XML string
      */
-    private String toXml(Changeset s) {
+    protected final String toXml(Changeset s) {
         StringWriter swriter = new StringWriter();
         try (OsmWriter osmWriter = OsmWriterFactory.createOsmWriter(new PrintWriter(swriter), true, version)) {
Index: trunk/src/org/openstreetmap/josm/io/OsmWriter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/OsmWriter.java	(revision 10050)
+++ trunk/src/org/openstreetmap/josm/io/OsmWriter.java	(revision 10051)
@@ -239,8 +239,7 @@
 
     public void visit(Changeset cs) {
-        out.print("  <changeset ");
-        out.print(" id='"+cs.getId()+'\'');
+        out.print("  <changeset id='"+cs.getId()+'\'');
         if (cs.getUser() != null) {
-            out.print(" user='"+cs.getUser().getName() +'\'');
+            out.print(" user='"+ XmlWriter.encode(cs.getUser().getName()) +'\'');
             out.print(" uid='"+cs.getUser().getId() +'\'');
         }
Index: trunk/test/unit/org/openstreetmap/josm/io/CertificateAmendmentTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/io/CertificateAmendmentTest.java	(revision 10050)
+++ trunk/test/unit/org/openstreetmap/josm/io/CertificateAmendmentTest.java	(revision 10051)
@@ -20,8 +20,7 @@
     /**
      * Setup test.
-     * @throws IOException in case of I/O error
      */
     @BeforeClass
-    public static void setUp() throws IOException {
+    public static void setUp() {
         JOSMFixture.createUnitTestFixture().init();
     }
Index: trunk/test/unit/org/openstreetmap/josm/io/NoteImporterTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/io/NoteImporterTest.java	(revision 10050)
+++ trunk/test/unit/org/openstreetmap/josm/io/NoteImporterTest.java	(revision 10051)
@@ -18,8 +18,7 @@
     /**
      * Non-regression test for <a href="https://josm.openstreetmap.de/ticket/12531">Bug #12531</a>.
-     * @throws Exception if any error occurs
      */
     @Test
-    public void testTicket12531() throws Exception {
+    public void testTicket12531() {
         assertNull(Main.map);
         assertTrue(new NoteImporter().importDataHandleExceptions(
Index: trunk/test/unit/org/openstreetmap/josm/io/OsmApiTest.java
===================================================================
--- trunk/test/unit/org/openstreetmap/josm/io/OsmApiTest.java	(revision 10051)
+++ trunk/test/unit/org/openstreetmap/josm/io/OsmApiTest.java	(revision 10051)
@@ -0,0 +1,50 @@
+// License: GPL. For details, see LICENSE file.
+package org.openstreetmap.josm.io;
+
+import static org.junit.Assert.assertEquals;
+
+import java.io.ByteArrayInputStream;
+import java.nio.charset.StandardCharsets;
+
+import org.junit.BeforeClass;
+import org.junit.Test;
+import org.openstreetmap.josm.JOSMFixture;
+import org.openstreetmap.josm.data.osm.Changeset;
+import org.openstreetmap.josm.data.osm.User;
+import org.openstreetmap.josm.gui.progress.NullProgressMonitor;
+
+/**
+ * Unit tests of {@link OsmApi} class.
+ */
+public class OsmApiTest {
+
+    /**
+     * Setup test.
+     */
+    @BeforeClass
+    public static void setUp() {
+        JOSMFixture.createUnitTestFixture().init();
+    }
+
+    /**
+     * Non-regression test for <a href="https://josm.openstreetmap.de/ticket/12675">Bug #12675</a>.
+     * @throws IllegalDataException if an error occurs
+     */
+    @Test
+    public void testTicket12675() throws IllegalDataException {
+        OsmApi api = OsmApi.getOsmApi();
+        Changeset cs = new Changeset();
+        cs.setUser(User.getAnonymous());
+        cs.setId(38038262);
+        String xml = api.toXml(cs);
+        assertEquals("<?xml version='1.0' encoding='UTF-8'?>\n"+
+                     "<osm version='0.6' generator='JOSM'>\n"+
+                     "  <changeset id='38038262' user='&lt;anonymous&gt;' uid='-1' open='false'>\n"+
+                     "  </changeset>\n"+
+                     "</osm>\n", xml.replace("\r", ""));
+        Changeset cs2 = OsmChangesetParser.parse(
+                new ByteArrayInputStream(xml.getBytes(StandardCharsets.UTF_8)),
+                NullProgressMonitor.INSTANCE).iterator().next();
+        assertEquals(User.getAnonymous(), cs2.getUser());
+    }
+}
