Index: trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.java	(revision 6808)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.java	(revision 6809)
@@ -27,4 +27,5 @@
 import org.openstreetmap.josm.gui.mappaint.Cascade;
 import org.openstreetmap.josm.gui.mappaint.Environment;
+import org.openstreetmap.josm.io.XmlWriter;
 import org.openstreetmap.josm.tools.ColorHelper;
 import org.openstreetmap.josm.tools.Utils;
@@ -541,4 +542,16 @@
             }
         }
+
+        /**
+         * XML-encode a string.
+         *
+         * Escapes special characters in xml. Alternative to using <![CDATA[ ... ]]>
+         * blocks.
+         * @param s arbitrary string
+         * @return the encoded string
+         */
+        public static String XML_encode(String s) {
+            return s == null ? null : XmlWriter.encode(s);
+        }
     }
 
Index: trunk/src/org/openstreetmap/josm/tools/ImageProvider.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/ImageProvider.java	(revision 6808)
+++ trunk/src/org/openstreetmap/josm/tools/ImageProvider.java	(revision 6809)
@@ -26,4 +26,5 @@
 import java.net.URL;
 import java.net.URLDecoder;
+import java.net.URLEncoder;
 import java.util.ArrayList;
 import java.util.Arrays;
@@ -530,10 +531,24 @@
                 String base64 = m.group(2);
                 String data = m.group(3);
-                byte[] bytes = ";base64".equals(base64)
-                        ? Base64.decodeBase64(data)
-                                : URLDecoder.decode(data, "utf-8").getBytes();
+                byte[] bytes;
+                if (";base64".equals(base64)) {
+                    bytes = Base64.decodeBase64(data);
+                } else {
+                    try {
+                        bytes = URLDecoder.decode(data, "utf-8").getBytes();
+                    } catch (IllegalArgumentException ex) {
+                        Main.warn("Unable to decode URL data part: "+ex.getMessage() + " (" + data + ")");
+                        return null;
+                    }
+                }
                 if (mediatype != null && mediatype.contains("image/svg+xml")) {
-                    URI uri = getSvgUniverse().loadSVG(new StringReader(new String(bytes)), url);
-                    return new ImageResource(getSvgUniverse().getDiagram(uri));
+                    String s = new String(bytes);
+                    URI uri = getSvgUniverse().loadSVG(new StringReader(s), URLEncoder.encode(s, "UTF-8"));
+                    SVGDiagram svg = getSvgUniverse().getDiagram(uri);
+                    if (svg == null) {
+                        Main.warn("Unable to process svg: "+s);
+                        return null;
+                    }
+                    return new ImageResource(svg);
                 } else {
                     try {
