Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(revision 11664)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/StyledMapRenderer.java	(revision 11670)
@@ -39,4 +39,5 @@
 import java.util.concurrent.ForkJoinTask;
 import java.util.concurrent.RecursiveTask;
+import java.util.function.BiConsumer;
 import java.util.function.Supplier;
 import java.util.stream.Collectors;
@@ -932,4 +933,47 @@
         }
 
+        drawIcon(p, img, disabled, selected, member, theta, (g, r) -> {
+            Color color = getSelectionHintColor(disabled, selected);
+            g.setColor(color);
+            g.draw(r);
+        });
+    }
+
+
+    /**
+     * Draw the icon for a given area. The icon is drawn around the lat/lon center of the area.
+     * @param primitive The node
+     * @param img The icon to draw at the node position
+     * @param disabled {@code} true to render disabled version, {@code false} for the standard version
+     * @param selected {@code} true to render it as selected, {@code false} otherwise
+     * @param member {@code} true to render it as a relation member, {@code false} otherwise
+     * @param theta the angle of rotation in radians
+     */
+    public void drawAreaIcon(OsmPrimitive primitive, MapImage img, boolean disabled, boolean selected, boolean member, double theta) {
+        BBox bbox = null;
+        if (primitive instanceof Way) {
+            bbox = primitive.getBBox();
+        } else if (primitive instanceof Relation) {
+            Multipolygon multipolygon = MultipolygonCache.getInstance().get(nc, (Relation) primitive);
+            if (multipolygon != null) {
+                BBox collect = new BBox();
+                multipolygon.getOuterPolygons().forEach(p -> p.getNodes().forEach(n -> collect.add(n.getCoor())));
+                bbox = collect;
+            }
+        }
+
+        if (bbox != null && bbox.isValid()) {
+            MapViewPoint p = mapState.getPointFor(bbox.getCenter());
+            drawIcon(p, img, disabled, selected, member, theta, (g, r) -> {
+                // only draw a minor highlighting, so that users do not confuse this for a point.
+                Color color = getSelectionHintColor(disabled, selected);
+                g.setColor(color);
+                g.draw(r);
+            });
+        }
+    }
+
+    private void drawIcon(MapViewPoint p, MapImage img, boolean disabled, boolean selected, boolean member, double theta,
+            BiConsumer<Graphics2D, Rectangle2D> selectionDrawer) {
         float alpha = img.getAlphaFloat();
 
@@ -943,19 +987,22 @@
         temporaryGraphics.translate(x, y);
         temporaryGraphics.rotate(theta);
-        int drawX = -w/2 + img.offsetX;
-        int drawY = -h/2 + img.offsetY;
+        int drawX = -img.getWidth() / 2 + img.offsetX;
+        int drawY = -img.getHeight() / 2 + img.offsetY;
         temporaryGraphics.drawImage(img.getImage(disabled), drawX, drawY, nc);
         if (selected || member) {
-            Color color;
-            if (disabled) {
-                color = inactiveColor;
-            } else if (selected) {
-                color = selectedColor;
-            } else {
-                color = relationSelectedColor;
-            }
-            temporaryGraphics.setColor(color);
-            temporaryGraphics.draw(new Rectangle2D.Double(drawX - 2, drawY - 2, w + 4, h + 4));
-        }
+            selectionDrawer.accept(temporaryGraphics, new Rectangle2D.Double(drawX - 2, drawY - 2, img.getWidth() + 4, img.getHeight() + 4));
+        }
+    }
+
+    private Color getSelectionHintColor(boolean disabled, boolean selected) {
+        Color color;
+        if (disabled) {
+            color = inactiveColor;
+        } else if (selected) {
+            color = selectedColor;
+        } else {
+            color = relationSelectedColor;
+        }
+        return color;
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/AreaElement.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/AreaElement.java	(revision 11664)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/AreaElement.java	(revision 11670)
@@ -16,4 +16,5 @@
 import org.openstreetmap.josm.gui.mappaint.Keyword;
 import org.openstreetmap.josm.gui.mappaint.MapPaintStyles.IconReference;
+import org.openstreetmap.josm.gui.util.RotationAngle;
 import org.openstreetmap.josm.tools.CheckParameterUtil;
 import org.openstreetmap.josm.tools.Utils;
@@ -56,5 +57,12 @@
     public Float extentThreshold;
 
-    protected AreaElement(Cascade c, Color color, MapImage fillImage, Float extent, Float extentThreshold, TextLabel text) {
+    /**
+     * The icon that is displayed on the center of the area.
+     */
+    private final MapImage iconImage;
+
+    private final RotationAngle iconImageAngle;
+
+    protected AreaElement(Cascade c, Color color, MapImage fillImage, Float extent, Float extentThreshold, TextLabel text, MapImage iconImage, RotationAngle iconImageAngle) {
         super(c, 1f);
         CheckParameterUtil.ensureParameterNotNull(color);
@@ -64,4 +72,6 @@
         this.extentThreshold = extentThreshold;
         this.text = text;
+        this.iconImage = iconImage;
+        this.iconImageAngle = iconImageAngle;
     }
 
@@ -109,17 +119,22 @@
         }
 
-        TextLabel text = null;
-        Keyword textPos = c.get(TEXT_POSITION, null, Keyword.class);
-        if (textPos == null || "center".equals(textPos.val)) {
-            text = TextLabel.create(env, PaintColors.AREA_TEXT.get(), true);
+        if (color != null) {
+
+            TextLabel text = null;
+            Keyword textPos = c.get(TEXT_POSITION, null, Keyword.class);
+            if (textPos == null || "center".equals(textPos.val)) {
+                text = TextLabel.create(env, PaintColors.AREA_TEXT.get(), true);
+            }
+
+            Float extent = c.get(FILL_EXTENT, null, float.class);
+            Float extentThreshold = c.get(FILL_EXTENT_THRESHOLD, null, float.class);
+
+            MapImage iconImage = NodeElement.createIcon(env);
+            RotationAngle rotationAngle = NodeElement.createRotationAngle(env);
+
+            return new AreaElement(c, color, fillImage, extent, extentThreshold, text, iconImage, rotationAngle);
+        } else {
+            return null;
         }
-
-        Float extent = c.get(FILL_EXTENT, null, float.class);
-        Float extentThreshold = c.get(FILL_EXTENT_THRESHOLD, null, float.class);
-
-        if (color != null)
-            return new AreaElement(c, color, fillImage, extent, extentThreshold, text);
-        else
-            return null;
     }
 
@@ -142,4 +157,9 @@
             }
             painter.drawArea((Relation) osm, myColor, fillImage, extent, extentThreshold, painter.isInactiveMode() || osm.isDisabled(), text);
+        }
+
+        if (iconImage != null && painter.isShowIcons()) {
+            painter.drawAreaIcon(osm, iconImage, painter.isInactiveMode() || osm.isDisabled(), selected, member,
+                    iconImageAngle == null ? 0.0 : iconImageAngle.getRotationAngle(osm));
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/NodeElement.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/NodeElement.java	(revision 11664)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/NodeElement.java	(revision 11670)
@@ -70,9 +70,28 @@
         Cascade c = env.mc.getCascade(env.layer);
 
-        MapImage mapImage = createIcon(env, ICON_KEYS);
+        MapImage mapImage = createIcon(env);
         Symbol symbol = null;
         if (mapImage == null) {
             symbol = createSymbol(env);
         }
+
+        RotationAngle rotationAngle = createRotationAngle(env);
+
+        // optimization: if we neither have a symbol, nor a mapImage
+        // we don't have to check for the remaining style properties and we don't
+        // have to allocate a node element style.
+        if (!allowDefault && symbol == null && mapImage == null) return null;
+
+        return new NodeElement(c, mapImage, symbol, defaultMajorZindex, rotationAngle);
+    }
+
+    /**
+     * Reads the icon-rotation property and creates a rotation angle from it.
+     * @param env The environment
+     * @return The angle
+     */
+    public static RotationAngle createRotationAngle(Environment env) {
+        Cascade c = env.mc.getCascade(env.layer);
+
         RotationAngle rotationAngle = null;
         final Float angle = c.get(ICON_ROTATION, null, Float.class, true);
@@ -93,11 +112,9 @@
             }
         }
-
-        // optimization: if we neither have a symbol, nor a mapImage
-        // we don't have to check for the remaining style properties and we don't
-        // have to allocate a node element style.
-        if (!allowDefault && symbol == null && mapImage == null) return null;
-
-        return new NodeElement(c, mapImage, symbol, defaultMajorZindex, rotationAngle);
+        return rotationAngle;
+    }
+
+    public static MapImage createIcon(final Environment env) {
+        return createIcon(env, ICON_KEYS);
     }
 
