Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapPainter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapPainter.java	(revision 3967)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapPainter.java	(revision 3968)
@@ -361,4 +361,19 @@
     }
 
+    private Polygon buildPolygon(Point center, int radius, int sides, double rotation) {
+        Polygon polygon = new Polygon();
+        for (int i = 0; i < sides; i++) {
+            double angle = ((2 * Math.PI / sides) * i) - rotation;
+            int x = (int) Math.round(center.x + radius * Math.cos(angle));
+            int y = (int) Math.round(center.y + radius * Math.sin(angle));
+            polygon.addPoint(x, y);
+        }
+        return polygon;
+    }
+
+    private Polygon buildPolygon(Point center, int radius, int sides) {
+        return buildPolygon(center, radius, sides, 0.0);
+    }
+
     public void drawNodeSymbol(Node n, Symbol s, Color fillColor, Color strokeColor, NodeTextElement text) {
         Point p = nc.getPoint(n);
@@ -369,12 +384,33 @@
             g.setColor(fillColor);
             switch (s.symbol) {
-                case SQUARE:
-                    g.fillRect(p.x - radius, p.y - radius, s.size, s.size);
-                    break;
-                case CIRCLE:
-                    g.fillOval(p.x - radius, p.y - radius, s.size, s.size);
-                    break;
-                default:
-                    throw new AssertionError();
+            case SQUARE:
+                g.fillRect(p.x - radius, p.y - radius, s.size, s.size);
+                break;
+            case CIRCLE:
+                g.fillOval(p.x - radius, p.y - radius, s.size, s.size);
+                break;
+            case TRIANGLE:
+                g.fillPolygon(buildPolygon(p, radius, 3, Math.PI / 2));
+                break;
+            case PENTAGON:
+                g.fillPolygon(buildPolygon(p, radius, 5, Math.PI / 2));
+                break;
+            case HEXAGON:
+                g.fillPolygon(buildPolygon(p, radius, 6));
+                break;
+            case HEPTAGON:
+                g.fillPolygon(buildPolygon(p, radius, 7, Math.PI / 2));
+                break;
+            case OCTAGON:
+                g.fillPolygon(buildPolygon(p, radius, 8, Math.PI / 8));
+                break;
+            case NONAGON:
+                g.fillPolygon(buildPolygon(p, radius, 9, Math.PI / 2));
+                break;
+            case DECAGON:
+                g.fillPolygon(buildPolygon(p, radius, 10));
+                break;
+            default:
+                throw new AssertionError();
             }
         }
@@ -383,12 +419,33 @@
             g.setColor(strokeColor);
             switch (s.symbol) {
-                case SQUARE:
-                    g.drawRect(p.x - radius, p.y - radius, s.size - 1, s.size - 1);
-                    break;
-                case CIRCLE:
-                    g.drawOval(p.x - radius, p.y - radius, s.size - 1, s.size - 1);
-                    break;
-                default:
-                    throw new AssertionError();
+            case SQUARE:
+                g.drawRect(p.x - radius, p.y - radius, s.size - 1, s.size - 1);
+                break;
+            case CIRCLE:
+                g.drawOval(p.x - radius, p.y - radius, s.size - 1, s.size - 1);
+                break;
+            case TRIANGLE:
+                g.drawPolygon(buildPolygon(p, radius, 3, Math.PI / 2));
+                break;
+            case PENTAGON:
+                g.drawPolygon(buildPolygon(p, radius, 5, Math.PI / 2));
+                break;
+            case HEXAGON:
+                g.drawPolygon(buildPolygon(p, radius, 6));
+                break;
+            case HEPTAGON:
+                g.drawPolygon(buildPolygon(p, radius, 7, Math.PI / 2));
+                break;
+            case OCTAGON:
+                g.drawPolygon(buildPolygon(p, radius, 8, Math.PI / 8));
+                break;
+            case NONAGON:
+                g.drawPolygon(buildPolygon(p, radius, 9, Math.PI / 2));
+                break;
+            case DECAGON:
+                g.drawPolygon(buildPolygon(p, radius, 10));
+                break;
+            default:
+                throw new AssertionError();
             }
             g.setStroke(new BasicStroke());
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/NodeElemStyle.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/NodeElemStyle.java	(revision 3967)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/NodeElemStyle.java	(revision 3968)
@@ -35,5 +35,5 @@
     private ImageIcon disabledIcon;
 
-    public enum SymbolShape { SQUARE, CIRCLE }
+    public enum SymbolShape { SQUARE, CIRCLE, TRIANGLE, PENTAGON, HEXAGON, HEPTAGON, OCTAGON, NONAGON, DECAGON }
     public enum HorizontalTextAlignment { LEFT, CENTER, RIGHT }
     public enum VerticalTextAlignment { ABOVE, TOP, CENTER, BOTTOM, BELOW }
@@ -206,8 +206,22 @@
         if (shapeKW == null)
             return null;
-        if (equal(shapeKW, "square")) {
+        if (equal(shapeKW.val, "square")) {
             shape = SymbolShape.SQUARE;
-        } else if (equal(shapeKW, "circle")) {
+        } else if (equal(shapeKW.val, "circle")) {
             shape = SymbolShape.CIRCLE;
+        } else if (equal(shapeKW.val, "triangle")) {
+            shape = SymbolShape.TRIANGLE;
+        } else if (equal(shapeKW.val, "pentagon")) {
+            shape = SymbolShape.PENTAGON;
+        } else if (equal(shapeKW.val, "hexagon")) {
+            shape = SymbolShape.HEXAGON;
+        } else if (equal(shapeKW.val, "heptagon")) {
+            shape = SymbolShape.HEPTAGON;
+        } else if (equal(shapeKW.val, "octagon")) {
+            shape = SymbolShape.OCTAGON;
+        } else if (equal(shapeKW.val, "nonagon")) {
+            shape = SymbolShape.NONAGON;
+        } else if (equal(shapeKW.val, "decagon")) {
+            shape = SymbolShape.DECAGON;
         } else
             return null;
