Index: /trunk/data/maps.xsd
===================================================================
--- /trunk/data/maps.xsd	(revision 4712)
+++ /trunk/data/maps.xsd	(revision 4713)
@@ -624,4 +624,6 @@
 						<!-- The ISO 3166 country code -->
 						<xs:element name="country-code" minOccurs="0" maxOccurs="1" type="tns:iso3166" />
+						<!-- A base64-encoded image that is displayed as menu/toolbar icon -->
+						<xs:element name="icon" minOccurs="0" maxOccurs="1" type="xs:string" />
 					</xs:all>
 				</xs:complexType>
Index: /trunk/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java	(revision 4712)
+++ /trunk/src/org/openstreetmap/josm/actions/AddImageryLayerAction.java	(revision 4713)
@@ -5,14 +5,16 @@
 
 import java.awt.event.ActionEvent;
-
+import javax.swing.Action;
+import javax.swing.ImageIcon;
 import javax.swing.JOptionPane;
-
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.imagery.ImageryInfo;
 import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryType;
 import org.openstreetmap.josm.gui.layer.ImageryLayer;
+import org.openstreetmap.josm.tools.ImageRequest;
 
 public class AddImageryLayerAction extends JosmAction implements AdaptableAction {
 
+    private static final int MAX_ICON_SIZE = 24;
     private final ImageryInfo info;
 
@@ -22,4 +24,14 @@
         this.info = info;
         installAdapters();
+
+        // change toolbar icon from if specified
+        try {
+            if (info.getIcon() != null) {
+                ImageIcon i = new ImageRequest().setName(info.getIcon()).setMaxHeight(MAX_ICON_SIZE).setMaxWidth(MAX_ICON_SIZE).get();
+                putValue(Action.SMALL_ICON, i);
+            }
+        } catch (Exception ex) {
+            throw new RuntimeException(ex.getMessage(), ex);
+        }
     }
 
Index: /trunk/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java	(revision 4712)
+++ /trunk/src/org/openstreetmap/josm/data/imagery/ImageryInfo.java	(revision 4713)
@@ -85,4 +85,5 @@
     private String termsOfUseURL;
     private String countryCode = "";
+    private String icon;
 
     /** auxiliary class to save an ImageryInfo object in the preferences */
@@ -106,4 +107,5 @@
         @pref String shapes;
         @pref String projections;
+        @pref String icon;
 
         public ImageryPreferenceEntry() {
@@ -126,4 +128,5 @@
             min_zoom = i.defaultMinZoom;
             cookies = i.cookies;
+            icon = i.icon;
             if (i.bounds != null) {
                 bounds = i.bounds.encodeAsString(",");
@@ -219,4 +222,5 @@
         termsOfUseURL = e.terms_of_use_url;
         countryCode = e.country_code;
+        icon = e.icon;
     }
 
@@ -285,4 +289,5 @@
         this.termsOfUseURL = i.termsOfUseURL;
         this.serverProjections = i.serverProjections;
+        this.icon = i.icon;
     }
 
@@ -515,4 +520,12 @@
     }
 
+    public String getIcon() {
+        return icon;
+    }
+
+    public void setIcon(String icon) {
+        this.icon = icon;
+    }
+
     /**
      * Get the projections supported by the server. Only relevant for
Index: /trunk/src/org/openstreetmap/josm/io/imagery/ImageryReader.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/io/imagery/ImageryReader.java	(revision 4712)
+++ /trunk/src/org/openstreetmap/josm/io/imagery/ImageryReader.java	(revision 4713)
@@ -5,9 +5,6 @@
 import static org.openstreetmap.josm.tools.Utils.equal;
 
-import java.io.BufferedReader;
 import java.io.IOException;
 import java.io.InputStream;
-import java.io.InputStreamReader;
-import java.io.UnsupportedEncodingException;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -18,5 +15,4 @@
 import javax.xml.parsers.SAXParserFactory;
 
-import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.imagery.ImageryInfo;
 import org.openstreetmap.josm.data.imagery.ImageryInfo.ImageryBounds;
@@ -25,5 +21,4 @@
 import org.openstreetmap.josm.io.MirroredInputStream;
 import org.openstreetmap.josm.io.UTFInputStreamReader;
-import org.openstreetmap.josm.tools.Utils;
 import org.xml.sax.Attributes;
 import org.xml.sax.InputSource;
@@ -130,4 +125,5 @@
                         "terms-of-use-url",
                         "country-code",
+                        "icon",
                     }).contains(qName)) {
                         newState = State.ENTRY_ATTRIBUTE;
@@ -260,4 +256,6 @@
                     } else if (qName.equals("country-code")) {
                         entry.setCountryCode(accumulator.toString());
+                    } else if (qName.equals("icon")) {
+                        entry.setIcon(accumulator.toString());
                     } else {
                     }
Index: /trunk/src/org/openstreetmap/josm/tools/ImageProvider.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/tools/ImageProvider.java	(revision 4712)
+++ /trunk/src/org/openstreetmap/josm/tools/ImageProvider.java	(revision 4713)
@@ -21,21 +21,25 @@
 import java.io.IOException;
 import java.io.InputStream;
+import java.io.StringReader;
+import java.io.UnsupportedEncodingException;
 import java.net.MalformedURLException;
 import java.net.URI;
 import java.net.URL;
+import java.net.URLDecoder;
 import java.util.Arrays;
 import java.util.Collection;
 import java.util.HashMap;
 import java.util.Map;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.zip.ZipEntry;
 import java.util.zip.ZipFile;
 import javax.swing.Icon;
 import javax.swing.ImageIcon;
-
+import org.apache.commons.codec.binary.Base64;
 import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
 import org.openstreetmap.josm.io.MirroredInputStream;
 import org.openstreetmap.josm.plugins.PluginHandler;
-import org.openstreetmap.josm.tools.Utils;
 import org.xml.sax.Attributes;
 import org.xml.sax.EntityResolver;
@@ -45,5 +49,4 @@
 import org.xml.sax.helpers.DefaultHandler;
 import org.xml.sax.helpers.XMLReaderFactory;
-
 import com.kitfox.svg.SVGDiagram;
 import com.kitfox.svg.SVGException;
@@ -167,7 +170,40 @@
     }
 
+    /**
+     * {@code data:[<mediatype>][;base64],<data>}
+     * @see RFC2397
+     */
+    private static final Pattern dataUrlPattern = Pattern.compile(
+            "^data:([a-zA-Z]+/[a-zA-Z+]+)?(;base64)?,(.+)$");
+
     static ImageResource getIfAvailableImpl(Collection<String> dirs, String id, String subdir, String name, File archive) {
         if (name == null)
             return null;
+
+        try {
+            if (name.startsWith("data:")) {
+                Matcher m = dataUrlPattern.matcher(name);
+                if (m.matches()) {
+                    String mediatype = m.group(1);
+                    String base64 = m.group(2);
+                    String data = m.group(3);
+                    byte[] bytes = ";base64".equals(base64)
+                            ? Base64.decodeBase64(data)
+                            : URLDecoder.decode(data, "utf-8").getBytes();
+                    if (mediatype != null && mediatype.contains("image/svg+xml")) {
+                        URI uri = getSvgUniverse().loadSVG(new StringReader(new String(bytes)), name);
+                        SVGDiagram svg = getSvgUniverse().getDiagram(uri);
+                        return new ImageResource(svg);
+                    } else {
+                        return new ImageResource(new ImageIcon(bytes).getImage(), true);
+                    }
+                }
+            }
+        } catch (UnsupportedEncodingException ex) {
+            throw new RuntimeException(ex.getMessage(), ex);
+        } catch (IOException ex) {
+            throw new RuntimeException(ex.getMessage(), ex);
+        }
+
         ImageType type = name.toLowerCase().endsWith(".svg") ? ImageType.SVG : ImageType.OTHER;
 
