Index: src/org/openstreetmap/josm/data/imagery/ImageryInfo.java
===================================================================
--- src/org/openstreetmap/josm/data/imagery/ImageryInfo.java	(revision 15644)
+++ src/org/openstreetmap/josm/data/imagery/ImageryInfo.java	(working copy)
@@ -235,6 +235,8 @@
     private String origName;
     /** (original) language of the translated name entry */
     private String langName;
+    /** preferred source tag value (for changeset source) */
+    private String source;
     /** whether this is a entry activated by default or not */
     private boolean defaultEntry;
     /** Whether this service requires a explicit EULA acceptance before it can be activated */
@@ -357,6 +359,8 @@
         @StructEntry boolean transparent;
         @StructEntry int minimumTileExpire;
         @StructEntry String category;
+        @StructEntry
+        String source;
 
         /**
          * Constructs a new empty WMS {@code ImageryPreferenceEntry}.
@@ -393,6 +397,7 @@
             icon = i.icon;
             description = i.description;
             category = i.category != null ? i.category.getCategoryString() : null;
+            source = i.source;
             if (i.bounds != null) {
                 bounds = i.bounds.encodeAsString(",");
                 StringBuilder shapesString = new StringBuilder();
@@ -585,6 +590,7 @@
         transparent = e.transparent;
         minimumTileExpire = e.minimumTileExpire;
         category = ImageryCategory.fromString(e.category);
+        source = e.source;
     }
 
     /**
@@ -633,6 +639,7 @@
         this.transparent = i.transparent;
         this.minimumTileExpire = i.minimumTileExpire;
         this.category = i.category;
+        this.source = i.source;
     }
 
     @Override
@@ -688,7 +695,7 @@
                 Objects.equals(this.customHttpHeaders, other.customHttpHeaders) &&
                 Objects.equals(this.transparent, other.transparent) &&
                 Objects.equals(this.minimumTileExpire, other.minimumTileExpire) &&
-                Objects.equals(this.category, other.category);
+                Objects.equals(this.category, other.category) && Objects.equals(this.source, other.source);
         // CHECKSTYLE.ON: BooleanExpressionComplexity
     }
 
@@ -984,6 +991,26 @@
     }
 
     /**
+     * Returns the entry preferred source tag
+     *
+     * @return The preferred source tag. May be null or an empty string.
+     * @since xxx
+     */
+    public String getSource() {
+        return source;
+    }
+
+    /**
+     * Returns the entry preferred source tag
+     *
+     * @param source The preferred source tag for the source
+     * @since xxx
+     */
+    public void setSource(String source) {
+        this.source = source;
+    }
+
+    /**
      * Store the id of this info to the preferences and clear it afterwards.
      */
     public void clearId() {
@@ -1631,7 +1658,9 @@
                 // Retrieve english name, unfortunately not saved in preferences
                 Optional<ImageryInfo> infoEn = ImageryLayerInfo.allDefaultLayers.stream().filter(x -> id.equals(x.getId())).findAny();
                 if (infoEn.isPresent()) {
-                    return infoEn.get().getOriginalName();
+                    ImageryInfo info = infoEn.get();
+                    String sourceTag = info.getSource();
+                    return sourceTag == null || sourceTag.trim().isEmpty() ? info.getOriginalName() : sourceTag;
                 }
             }
             return getOriginalName();
Index: src/org/openstreetmap/josm/gui/layer/ImageryLayer.java
===================================================================
--- src/org/openstreetmap/josm/gui/layer/ImageryLayer.java	(revision 15644)
+++ src/org/openstreetmap/josm/gui/layer/ImageryLayer.java	(working copy)
@@ -357,6 +357,8 @@
 
     @Override
     public String getChangesetSourceTag() {
-        return getInfo().getSourceName();
+        String potentialSource = getInfo().getSourceName();
+        return potentialSource != null && !potentialSource.trim().isEmpty() ? potentialSource
+                : getInfo().getSourceName();
     }
 }
Index: src/org/openstreetmap/josm/io/imagery/ImageryReader.java
===================================================================
--- src/org/openstreetmap/josm/io/imagery/ImageryReader.java	(revision 15644)
+++ src/org/openstreetmap/josm/io/imagery/ImageryReader.java	(working copy)
@@ -222,6 +222,7 @@
                         "permission-ref",
                         "country-code",
                         "category",
+                        "source",
                         "icon",
                         "date",
                         TILE_SIZE,
@@ -528,6 +529,9 @@
                         entry.setImageryCategory(category);
                     entry.setImageryCategoryOriginalString(cat);
                     break;
+                case "source":
+                    entry.setSource(accumulator.toString());
+                    break;
                 default: // Do nothing
                 }
                 break;
