Index: trunk/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java	(revision 13791)
+++ trunk/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java	(revision 13792)
@@ -73,6 +73,6 @@
         private final String typeString;
 
-        ImageryType(String urlString) {
-            this.typeString = urlString;
+        ImageryType(String typeString) {
+            this.typeString = typeString;
         }
 
@@ -95,4 +95,61 @@
                 if (type.getTypeString().equals(s)) {
                     return type;
+                }
+            }
+            return null;
+        }
+    }
+
+    /**
+     * Category of imagery entry.
+     * @since 13792
+     */
+    public enum ImageryCategory {
+        /** A aerial or satellite photo. **/
+        PHOTO("photo", tr("Aerial or satellite photo")),
+        /** A map. **/
+        MAP("map", tr("Map")),
+        /** A historic or otherwise outdated map. */
+        HISTORICMAP("historicmap", tr("Historic or otherwise outdated map")),
+        /** A map based on OSM data. **/
+        OSMBASEDMAP("osmbasedmap", tr("Map based on OSM data")),
+        /** A historic or otherwise outdated aerial or satellite photo. **/
+        HISTORICPHOTO("historicphoto", tr("Historic or otherwise outdated aerial or satellite photo")),
+        /** Any other type of imagery **/
+        OTHER("other", tr("Imagery not matching any other category"));
+
+        private final String category;
+        private final String description;
+
+        ImageryCategory(String category, String description) {
+            this.category = category;
+            this.description = description;
+        }
+
+        /**
+         * Returns the unique string identifying this category.
+         * @return the unique string identifying this category
+         */
+        public final String getCategoryString() {
+            return category;
+        }
+
+        /**
+         * Returns the description of this category.
+         * @return the description of this category
+         */
+        public final String getDescription() {
+            return description;
+        }
+
+        /**
+         * Returns the imagery category from the given category string.
+         * @param s The category string
+         * @return the imagery category matching the given category string
+         */
+        public static ImageryCategory fromString(String s) {
+            for (ImageryCategory category : ImageryCategory.values()) {
+                if (category.getCategoryString().equals(s)) {
+                    return category;
                 }
             }
@@ -230,4 +287,8 @@
     private boolean transparent = true;
     private int minimumTileExpire = (int) TimeUnit.MILLISECONDS.toSeconds(TMSCachedTileLoaderJob.MINIMUM_EXPIRES.get());
+    /** category of the imagery */
+    private ImageryCategory category;
+    /** category of the imagery (input string, not saved, copied or used otherwise except for error checks) */
+    private String categoryOriginalString;
     /** when adding a field, also adapt the:
      * {@link #ImageryPreferenceEntry ImageryPreferenceEntry object}
@@ -278,4 +339,5 @@
         @StructEntry boolean transparent;
         @StructEntry int minimumTileExpire;
+        @StructEntry String category;
 
         /**
@@ -313,4 +375,5 @@
             icon = i.icon;
             description = i.description;
+            category = i.category != null ? i.category.getCategoryString() : null;
             if (i.bounds != null) {
                 bounds = i.bounds.encodeAsString(",");
@@ -502,4 +565,5 @@
         transparent = e.transparent;
         minimumTileExpire = e.minimumTileExpire;
+        category = ImageryCategory.fromString(e.category);
     }
 
@@ -549,4 +613,5 @@
         this.transparent = i.transparent;
         this.minimumTileExpire = i.minimumTileExpire;
+        this.category = i.category;
     }
 
@@ -603,5 +668,6 @@
                 Objects.equals(this.customHttpHeaders, other.customHttpHeaders) &&
                 Objects.equals(this.transparent, other.transparent) &&
-                Objects.equals(this.minimumTileExpire, other.minimumTileExpire);
+                Objects.equals(this.minimumTileExpire, other.minimumTileExpire) &&
+                Objects.equals(this.category, other.category);
         // CHECKSTYLE.ON: BooleanExpressionComplexity
     }
@@ -990,4 +1056,8 @@
             html = true;
         }
+        if (category != null && category.getDescription() != null) {
+            res.append("<br>").append(tr("Imagery category: {0}", category.getDescription()));
+            html = true;
+        }
         if (bestMarked) {
             res.append("<br>").append(tr("This imagery is marked as best in this region in other editors."));
@@ -1203,4 +1273,40 @@
     public void setImageryType(ImageryType imageryType) {
         this.imageryType = imageryType;
+    }
+
+    /**
+     * Returns the imagery category.
+     * @return The imagery category
+     * @since 13792
+     */
+    public ImageryCategory getImageryCategory() {
+        return category;
+    }
+
+    /**
+     * Sets the imagery category.
+     * @param category The imagery category
+     * @since 13792
+     */
+    public void setImageryCategory(ImageryCategory category) {
+        this.category = category;
+    }
+
+    /**
+     * Returns the imagery category original string (don't use except for error checks).
+     * @return The imagery category original string
+     * @since 13792
+     */
+    public String getImageryCategoryOriginalString() {
+        return categoryOriginalString;
+    }
+
+    /**
+     * Sets the imagery category original string (don't use except for error checks).
+     * @param categoryOriginalString The imagery category original string
+     * @since 13792
+     */
+    public void setImageryCategoryOriginalString(String categoryOriginalString) {
+        this.categoryOriginalString = categoryOriginalString;
     }
 
Index: trunk/src/org/openstreetmap/josm/io/imagery/ImageryReader.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/imagery/ImageryReader.java	(revision 13791)
+++ trunk/src/org/openstreetmap/josm/io/imagery/ImageryReader.java	(revision 13792)
@@ -18,4 +18,5 @@
 import org.openstreetmap.josm.data.imagery.ImageryInfo;
 import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryBounds;
+import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryCategory;
 import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryType;
 import org.openstreetmap.josm.data.imagery.Shape;
@@ -220,4 +221,5 @@
                         "permission-ref",
                         "country-code",
+                        "category",
                         "icon",
                         "date",
@@ -425,15 +427,9 @@
                     break;
                 case "type":
-                    boolean found = false;
-                    for (ImageryType type : ImageryType.values()) {
-                        if (Objects.equals(accumulator.toString(), type.getTypeString())) {
-                            entry.setImageryType(type);
-                            found = true;
-                            break;
-                        }
-                    }
-                    if (!found) {
+                    ImageryType type = ImageryType.fromString(accumulator.toString());
+                    if(type != null)
+                        entry.setImageryType(type);
+                    else
                         skipEntry = true;
-                    }
                     break;
                 case "default":
@@ -524,4 +520,11 @@
                 case "minimum-tile-expire":
                     entry.setMinimumTileExpire(Integer.parseInt(accumulator.toString()));
+                    break;
+                case "category":
+                    String cat = accumulator.toString();
+                    ImageryCategory category = ImageryCategory.fromString(cat);
+                    if(category != null)
+                        entry.setImageryCategory(category);
+                    entry.setImageryCategoryOriginalString(cat);
                     break;
                 default: // Do nothing
