Index: src/org/openstreetmap/josm/data/gpx/GpxData.java
===================================================================
--- src/org/openstreetmap/josm/data/gpx/GpxData.java	(revision 18392)
+++ src/org/openstreetmap/josm/data/gpx/GpxData.java	(working copy)
@@ -1094,8 +1094,20 @@
 
     @Override
     public void put(String key, Object value) {
+        put(key, value, true);
+    }
+
+    /**
+     * Put a key / value pair as a new attribute. Overrides key / value pair with the same key (if present).
+     * Only sets the modified state when setModified is true.
+     *
+     * @param key the key
+     * @param value the value
+     * @param setModified whether to change the modified state
+     */
+    public void put(String key, Object value, boolean setModified) {
         super.put(key, value);
-        invalidate();
+        fireInvalidate(setModified);
     }
 
     /**
@@ -1132,12 +1144,12 @@
     }
 
     private void fireInvalidate(boolean setModified) {
+        if (setModified) {
+            setModified(true);
+        }
         if (updating || initializing) {
             suppressedInvalidate = true;
         } else {
-            if (setModified) {
-                setModified(true);
-            }
             if (listeners.hasListeners()) {
                 GpxDataChangeEvent e = new GpxDataChangeEvent(this);
                 listeners.fireEvent(l -> l.gpxDataChanged(e));
@@ -1158,10 +1170,9 @@
      * @since 15496
      */
     public void endUpdate() {
-        boolean setModified = updating;
         updating = initializing = false;
         if (suppressedInvalidate) {
-            fireInvalidate(setModified);
+            fireInvalidate(false);
             suppressedInvalidate = false;
         }
     }
Index: src/org/openstreetmap/josm/data/gpx/GpxTrack.java
===================================================================
--- src/org/openstreetmap/josm/data/gpx/GpxTrack.java	(revision 18392)
+++ src/org/openstreetmap/josm/data/gpx/GpxTrack.java	(working copy)
@@ -82,18 +82,21 @@
 
     @Override
     public void setColor(Color color) {
-        setColorExtension(color);
+        setColorExtensionGPXD(color, true);
         colorCache = color;
     }
 
-    private void setColorExtension(Color color) {
+    private void setColorExtensionGPXD(Color color, boolean invalidate) {
         getExtensions().findAndRemove("gpxx", "DisplayColor");
         if (color == null) {
             getExtensions().findAndRemove("gpxd", "color");
         } else {
             getExtensions().addOrUpdate("gpxd", "color", String.format("#%02X%02X%02X", color.getRed(), color.getGreen(), color.getBlue()));
         }
-        fireInvalidate();
+        colorFormat = ColorFormat.GPXD;
+        if (invalidate) {
+            fireInvalidate();
+        }
     }
 
     @Override
@@ -167,7 +170,7 @@
                 closestGarminColorCache.put(c, colorString);
                 getExtensions().addIfNotPresent("gpxx", "TrackExtension").getExtensions().addOrUpdate("gpxx", "DisplayColor", colorString);
             } else if (cFormat == ColorFormat.GPXD) {
-                setColor(c);
+                setColorExtensionGPXD(c, false);
             }
             colorFormat = cFormat;
         }
Index: src/org/openstreetmap/josm/io/GpxWriter.java
===================================================================
--- src/org/openstreetmap/josm/io/GpxWriter.java	(revision 18392)
+++ src/org/openstreetmap/josm/io/GpxWriter.java	(working copy)
@@ -123,7 +123,7 @@
                 e.put("value", entry.getValue());
             });
         }
-        data.put(META_TIME, (metaTime != null ? metaTime : Instant.now()).toString());
+        data.put(META_TIME, (metaTime != null ? metaTime : Instant.now()).toString(), false);
         data.endUpdate();
 
         Collection<IWithAttributes> all = new ArrayList<>();
