Index: trunk/build.xml
===================================================================
--- trunk/build.xml	(revision 16017)
+++ trunk/build.xml	(revision 16018)
@@ -1045,5 +1045,5 @@
             <sysproperty key="java.awt.headless" value="true"/>
             <classpath>
-                <pathelement path="${base.dir}"/>
+                <pathelement path="${base.dir}/resources"/>
                 <pathelement path="${proj-classpath}"/>
                 <pathelement path="${proj-build.dir}"/>
Index: trunk/scripts/TagInfoExtract.java
===================================================================
--- trunk/scripts/TagInfoExtract.java	(revision 16017)
+++ trunk/scripts/TagInfoExtract.java	(revision 16018)
@@ -24,4 +24,6 @@
 import java.util.Optional;
 import java.util.Set;
+import java.util.regex.Matcher;
+import java.util.regex.Pattern;
 import java.util.stream.Collectors;
 
@@ -206,5 +208,5 @@
          */
         private String findImageUrl(String path) {
-            final Path f = baseDir.resolve("images").resolve(path);
+            final Path f = baseDir.resolve("resources").resolve("images").resolve(path);
             if (Files.exists(f)) {
                 return "https://josm.openstreetmap.de/export/" + josmSvnRevision + "/josm/trunk/resources/images/" + path;
@@ -379,4 +381,6 @@
          */
         private abstract class Checker {
+            private final Pattern reservedChars = Pattern.compile("[<>:\"|\\?\\*]");
+
             Checker(Tag tag) {
                 this.tag = tag;
@@ -417,5 +421,5 @@
                 renderer.getSettings(false);
                 element.paintPrimitive(osm, MapPaintSettings.INSTANCE, renderer, false, false, false);
-                final String imageName = type + "_" + tag + ".png";
+                final String imageName = type + "_" + normalize(tag.toString()) + ".png";
                 try (OutputStream out = Files.newOutputStream(options.imageDir.resolve(imageName))) {
                     ImageIO.write(img, "png", out);
@@ -425,4 +429,14 @@
                 final String baseUrl = options.imageUrlPrefix != null ? options.imageUrlPrefix : options.imageDir.toString();
                 return baseUrl + "/" + imageName;
+            }
+
+            /**
+             * Normalizes tag so that it can used as a filename on all platforms, including Windows.
+             * @param tag OSM tag, that can contain illegal path characters
+             * @return OSM tag with all illegal path characters replaced by underscore ('_')
+             */
+            String normalize(String tag) {
+                Matcher m = reservedChars.matcher(tag);
+                return m.find() ? m.replaceAll("_") : tag;
             }
 
