Index: /trunk/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java	(revision 11569)
+++ /trunk/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java	(revision 11570)
@@ -188,4 +188,10 @@
     /** country code of the imagery (for country specific imagery) */
     private String countryCode = "";
+    /** 
+      * creation date of the imagery (in the form YYYY-MM-DD;YYYY-MM-DD, where
+      * DD and MM as well as a second date are optional)
+      * @since 11570
+      */
+    private String date;
     /** mirrors of different type for this entry */
     private List<ImageryInfo> mirrors;
@@ -204,4 +210,5 @@
     public static class ImageryPreferenceEntry {
         @pref String name;
+        @pref String d;
         @pref String id;
         @pref String type;
@@ -216,4 +223,5 @@
         @pref String terms_of_use_url;
         @pref String country_code = "";
+        @pref String date;
         @pref int max_zoom;
         @pref int min_zoom;
@@ -253,4 +261,5 @@
             attribution_text = i.attributionText;
             attribution_url = i.attributionLinkURL;
+            date = i.date;
             logo_image = i.attributionImage;
             logo_url = i.attributionImageURL;
@@ -408,4 +417,5 @@
         attributionImage = e.logo_image;
         attributionImageURL = e.logo_url;
+        date = e.date;
         termsOfUseText = e.terms_of_use_text;
         termsOfUseURL = e.terms_of_use_url;
@@ -448,4 +458,5 @@
         this.termsOfUseURL = i.termsOfUseURL;
         this.countryCode = i.countryCode;
+        this.date = i.date;
         this.icon = i.icon;
         this.description = i.description;
@@ -495,4 +506,5 @@
                 Objects.equals(this.termsOfUseURL, other.termsOfUseURL) &&
                 Objects.equals(this.countryCode, other.countryCode) &&
+                Objects.equals(this.date, other.date) &&
                 Objects.equals(this.icon, other.icon) &&
                 Objects.equals(this.description, other.description) &&
@@ -831,9 +843,20 @@
      */
     public String getToolTipText() {
+        String res = getName();
+        boolean html = false;
+        String date = getDate();
+        if (date != null && !date.isEmpty()) {
+            res += "<br>" + tr("Date of imagery: {0}", date);
+            html = true;
+        }
         String desc = getDescription();
         if (desc != null && !desc.isEmpty()) {
-            return "<html>" + getName() + "<br>" + desc + "</html>";
-        }
-        return getName();
+            res += "<br>" + desc;
+            html = true;
+        }
+        if (html) {
+            res = "<html>" + res + "</html>";
+        }
+        return res;
     }
 
@@ -868,4 +891,23 @@
     public void setCountryCode(String countryCode) {
         this.countryCode = countryCode;
+    }
+
+    /**
+     * Returns the date information.
+     * @return The date (in the form YYYY-MM-DD;YYYY-MM-DD, where
+     * DD and MM as well as a second date are optional)
+     * @since 11570
+     */
+    public String getDate() {
+        return date;
+    }
+
+    /**
+     * Sets the date information.
+     * @param date The date information
+     * @since 11570
+     */
+    public void setDate(String date) {
+        this.date = date;
     }
 
@@ -1135,4 +1177,5 @@
        List<ImageryInfo> l = new ArrayList<>();
        if (mirrors != null) {
+           int num = 1;
            for (ImageryInfo i : mirrors) {
                ImageryInfo n = new ImageryInfo(this);
@@ -1149,5 +1192,16 @@
                    n.setTileSize(i.getTileSize());
                }
+               if(n.id != null) {
+                   n.id = n.id + "_mirror"+num;
+               }
+               if(num > 1) {
+                   n.name = tr("{0} mirror server {1}", n.name, num);
+                   n.origName += " mirror server " + num;
+               } else {
+                   n.name = tr("{0} mirror server", n.name);
+                   n.origName += " mirror server";
+               }
                l.add(n);
+               ++num;
            }
        }
Index: /trunk/src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java	(revision 11569)
+++ /trunk/src/org/openstreetmap/josm/data/imagery/ImageryLayerInfo.java	(revision 11570)
@@ -33,7 +33,13 @@
 
     public static final ImageryLayerInfo instance = new ImageryLayerInfo();
+    /** List of all usable layers */
     private final List<ImageryInfo> layers = new ArrayList<>();
+    /** List of layer ids of all usable layers */
     private final Map<String, ImageryInfo> layerIds = new HashMap<>();
+    /** List of all available default layers */
     private static final List<ImageryInfo> defaultLayers = new ArrayList<>();
+    /** List of all available default layers (including mirrors) */
+    private static final List<ImageryInfo> allDefaultLayers = new ArrayList<>();
+    /** List of all layer ids of available default layers (including mirrors) */
     private static final Map<String, ImageryInfo> defaultLayerIds = new HashMap<>();
 
@@ -164,8 +170,16 @@
         protected void finish() {
             defaultLayers.clear();
+            allDefaultLayers.clear();
             defaultLayers.addAll(newLayers);
+            for (ImageryInfo layer : newLayers) {
+                allDefaultLayers.add(layer);
+                for (ImageryInfo sublayer : layer.getMirrors()) {
+                    allDefaultLayers.add(sublayer);
+                }
+            }
             defaultLayerIds.clear();
             Collections.sort(defaultLayers);
-            buildIdMap(defaultLayers, defaultLayerIds);
+            Collections.sort(allDefaultLayers);
+            buildIdMap(allDefaultLayers, defaultLayerIds);
             updateEntriesFromDefaults();
             buildIdMap(layers, layerIds);
@@ -305,10 +319,27 @@
     }
 
+    /**
+     * List of usable layers
+     * @return unmodifiable list containing usable layers
+     */
     public List<ImageryInfo> getLayers() {
         return Collections.unmodifiableList(layers);
     }
 
+    /**
+     * List of available default layers
+     * @return unmodifiable list containing available default layers
+     */
     public List<ImageryInfo> getDefaultLayers() {
         return Collections.unmodifiableList(defaultLayers);
+    }
+
+    /**
+     * List of all available default layers (including mirrors)
+     * @return unmodifiable list containing available default layers
+     * @since 11570
+     */
+    public List<ImageryInfo> getAllDefaultLayers() {
+        return Collections.unmodifiableList(allDefaultLayers);
     }
 
Index: /trunk/src/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreference.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreference.java	(revision 11569)
+++ /trunk/src/org/openstreetmap/josm/gui/preferences/imagery/ImageryPreference.java	(revision 11570)
@@ -326,5 +326,5 @@
             mod = activeTable.getColumnModel();
             mod.getColumn(1).setPreferredWidth(800);
-            mod.getColumn(1).setCellRenderer(new ImageryURLTableCellRenderer(layerInfo.getDefaultLayers()));
+            mod.getColumn(1).setCellRenderer(new ImageryURLTableCellRenderer(layerInfo.getAllDefaultLayers()));
             mod.getColumn(0).setPreferredWidth(200);
 
@@ -742,15 +742,15 @@
              */
             public ImageryInfo getRow(int row) {
-                return layerInfo.getDefaultLayers().get(row);
+                return layerInfo.getAllDefaultLayers().get(row);
             }
 
             @Override
             public int getRowCount() {
-                return layerInfo.getDefaultLayers().size();
+                return layerInfo.getAllDefaultLayers().size();
             }
 
             @Override
             public Object getValueAt(int row, int column) {
-                ImageryInfo info = layerInfo.getDefaultLayers().get(row);
+                ImageryInfo info = layerInfo.getAllDefaultLayers().get(row);
                 switch (column) {
                 case 0:
Index: /trunk/src/org/openstreetmap/josm/io/imagery/ImageryReader.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/imagery/ImageryReader.java	(revision 11569)
+++ /trunk/src/org/openstreetmap/josm/io/imagery/ImageryReader.java	(revision 11570)
@@ -190,4 +190,5 @@
                         "country-code",
                         "icon",
+                        "date",
                         "tile-size",
                         "valid-georeference",
@@ -358,4 +359,7 @@
                     entry.setDescription(lang, accumulator.toString());
                     break;
+                case "date":
+                    entry.setDate(accumulator.toString());
+                    break;
                 case "id":
                     entry.setId(accumulator.toString());
