Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapPaintSettings.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapPaintSettings.java	(revision 3857)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapPaintSettings.java	(revision 3858)
@@ -108,8 +108,16 @@
     }
 
+    public Color getSelectedColor(int alpha) {
+        return new Color(selectedColor.getRGB() & 0x00ffffff | (alpha << 24), true);
+    }
+
     public Color getRelationSelectedColor() {
         return relationSelectedColor;
     }
 
+    public Color getRelationSelectedColor(int alpha) {
+        return new Color(relationSelectedColor.getRGB() & 0x00ffffff | (alpha << 24), true);
+    }
+
     public Color getHighlightColor() {
         return highlightColor;
Index: trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapPainter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapPainter.java	(revision 3857)
+++ trunk/src/org/openstreetmap/josm/data/osm/visitor/paint/MapPainter.java	(revision 3858)
@@ -277,6 +277,5 @@
     protected void drawArea(Polygon polygon, Color color, String name) {
 
-        /* set the opacity (alpha) level of the filled polygon */
-        g.setColor(new Color(color.getRed(), color.getGreen(), color.getBlue(), fillAlpha));
+        g.setColor(color);
 
         if (outlineOnly) {
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/AreaElemStyle.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/AreaElemStyle.java	(revision 3857)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/AreaElemStyle.java	(revision 3858)
@@ -4,4 +4,5 @@
 import java.awt.Color;
 
+import org.openstreetmap.josm.Main;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
 import org.openstreetmap.josm.data.osm.Relation;
@@ -24,15 +25,25 @@
         if (color == null)
             return null;
+        int alpha = Math.min(255, Math.max(0, Integer.valueOf(Main.pref.getInteger("mappaint.fillalpha", 50))));
+        Integer pAlpha = color_float2int(c.get("fill-opacity", null, float.class));
+        if (pAlpha != null) {
+            alpha = pAlpha;
+        }
+        color = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha);
         return new AreaElemStyle(c, color);
     }
 
     @Override
-    public void paintPrimitive(OsmPrimitive primitive, MapPaintSettings paintSettings, MapPainter painter, boolean selected, boolean member) {
-        if (primitive instanceof Way) {
-            Way w = (Way) primitive;
-            String name = painter.isShowNames() ? painter.getAreaName(w) : null;
-            painter.drawArea(w, w.isSelected() ? paintSettings.getSelectedColor() : color, name);
-        } else if (primitive instanceof Relation) {
-            painter.drawArea((Relation) primitive, selected ? paintSettings.getRelationSelectedColor() : color, painter.getAreaName(primitive));
+    public void paintPrimitive(OsmPrimitive osm, MapPaintSettings paintSettings, MapPainter painter, boolean selected, boolean member) {
+        if (osm instanceof Way)
+        {
+            painter.drawArea((Way) osm,
+                    osm.isSelected() ? paintSettings.getSelectedColor(color.getAlpha()) : color,
+                    painter.isShowNames() ? painter.getAreaName(osm) : null);
+        } else if (osm instanceof Relation)
+        {
+            painter.drawArea((Relation) osm,
+                    selected ? paintSettings.getRelationSelectedColor(color.getAlpha()) : color,
+                    painter.getAreaName(osm));
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/Cascade.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/Cascade.java	(revision 3857)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/Cascade.java	(revision 3858)
@@ -160,4 +160,6 @@
             if (val instanceof float[]) {
                 res.append(Arrays.toString((float[]) val));
+            } else if (val instanceof Color) {
+                res.append(String.format("#%x", ((Color) val).getRGB()));
             } else {
                 res.append(val+"");
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/ElemStyle.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/ElemStyle.java	(revision 3857)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/ElemStyle.java	(revision 3858)
@@ -45,3 +45,15 @@
         return "";
     }
+
+    public static Integer color_float2int(Float val) {
+        if (val == null || val < 0 || val > 1)
+            return null;
+        return (int) (255f * val + 0.5f);
+    }
+    
+    public static Float color_int2float(Integer val) {
+        if (val == null || val < 0 || val > 255)
+            return null;
+        return ((float) val) / 255f;
+    }
 }
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/LineElemStyle.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/LineElemStyle.java	(revision 3857)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/LineElemStyle.java	(revision 3858)
@@ -60,4 +60,12 @@
             color = PaintColors.UNTAGGED.get();
         }
+
+        int alpha = 255;
+        Integer pAlpha = color_float2int(c.get("opacity", null, float.class));
+        if (pAlpha != null) {
+            alpha = pAlpha;
+        }
+        color = new Color(color.getRed(), color.getGreen(), color.getBlue(), alpha);
+
         float[] dashes = c.get(prefix + "dashes", null, float[].class);
         if (dashes != null) {
@@ -124,7 +132,7 @@
             markColor = paintSettings.getHighlightColor();
         } else if (selected) {
-            markColor = paintSettings.getSelectedColor();
+            markColor = paintSettings.getSelectedColor(color.getAlpha());
         } else if (member) {
-            markColor = paintSettings.getRelationSelectedColor();
+            markColor = paintSettings.getRelationSelectedColor(color.getAlpha());
         } else if(w.isDisabled()) {
             markColor = paintSettings.getInactiveColor();
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/MapPaintStyles.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/MapPaintStyles.java	(revision 3857)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/MapPaintStyles.java	(revision 3858)
@@ -47,9 +47,14 @@
 
         public String iconName;
-        public XmlStyleSource source;
-
-        public IconReference(String iconName, XmlStyleSource source) {
+        public StyleSource source;
+
+        public IconReference(String iconName, StyleSource source) {
             this.iconName = iconName;
             this.source = source;
+        }
+
+        @Override
+        public String toString() {
+            return "IconReference{" + "iconName=" + iconName + " source=" + source.getDisplayString() + '}';
         }
     }
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Environment.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Environment.java	(revision 3857)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Environment.java	(revision 3858)
@@ -5,4 +5,5 @@
 import org.openstreetmap.josm.gui.mappaint.Cascade;
 import org.openstreetmap.josm.gui.mappaint.MultiCascade;
+import org.openstreetmap.josm.gui.mappaint.StyleSource;
 
 public class Environment {
@@ -11,9 +12,11 @@
     MultiCascade mc;
     String layer;
+    StyleSource source;
 
-    public Environment(OsmPrimitive osm, MultiCascade mc, String layer) {
+    public Environment(OsmPrimitive osm, MultiCascade mc, String layer, StyleSource source) {
         this.osm = osm;
         this.mc = mc;
         this.layer = layer;
+        this.source = source;
     }
 
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Instruction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Instruction.java	(revision 3857)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Instruction.java	(revision 3858)
@@ -3,4 +3,6 @@
 
 import java.util.Arrays;
+
+import org.openstreetmap.josm.gui.mappaint.MapPaintStyles.IconReference;
 
 abstract public class Instruction {
@@ -32,9 +34,11 @@
         @Override
         public void execute(Environment env) {
-            if (val instanceof Expression) {
-                env.getCascade().putOrClear(key, ((Expression) val).evaluate(env));
-            } else {
-                env.getCascade().putOrClear(key, val);
+            Object value = (val instanceof Expression) ? ((Expression) val).evaluate(env) : val;
+            if (key.equals("icon-image")) {
+                if (value instanceof String) {
+                    value = new IconReference((String) value, env.source);
+                }
             }
+            env.getCascade().putOrClear(key, value);
         }
 
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java	(revision 3857)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java	(revision 3858)
@@ -80,5 +80,5 @@
         n.put("lang", code);
         // create a fake environment to read the meta data block
-        Environment env = new Environment(n, mc, "default");
+        Environment env = new Environment(n, mc, "default", this);
 
         NEXT_RULE:
@@ -105,5 +105,5 @@
     @Override
     public void apply(MultiCascade mc, OsmPrimitive osm, double scale, OsmPrimitive multipolyOuterWay, boolean pretendWayIsClosed) {
-        Environment env = new Environment(osm, mc, null);
+        Environment env = new Environment(osm, mc, null, this);
         for (MapCSSRule r : rules) {
             for (Selector s : r.selectors) {
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/xml/XmlStyleSource.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/xml/XmlStyleSource.java	(revision 3857)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/xml/XmlStyleSource.java	(revision 3858)
@@ -20,4 +20,5 @@
 import org.openstreetmap.josm.data.osm.Way;
 import org.openstreetmap.josm.gui.mappaint.Cascade;
+import org.openstreetmap.josm.gui.mappaint.ElemStyle;
 import org.openstreetmap.josm.gui.mappaint.MultiCascade;
 import org.openstreetmap.josm.gui.mappaint.Range;
@@ -300,4 +301,10 @@
                 def.putOrClear("real-width", p.line.realWidth != null ? new Float(p.line.realWidth) : null);
                 def.putOrClear("color", p.line.color);
+                if (p.line.color != null) {
+                    int alpha = p.line.color.getAlpha();
+                    if (alpha != 255) {
+                        def.put("opacity", ElemStyle.color_int2float(alpha));
+                    }
+                }
                 def.putOrClear("dashes", p.line.getDashed());
                 def.putOrClear("dashes-background-color", p.line.dashedColor);
@@ -323,4 +330,10 @@
                     c.put("width", new Float(mod.getWidth(refWidth)));
                     c.putOrClear("color", mod.color);
+                    if (mod.color != null) {
+                        int alpha = mod.color.getAlpha();
+                        if (alpha != 255) {
+                            c.put("opacity", ElemStyle.color_int2float(alpha));
+                        }
+                    }
                     c.putOrClear("dashes", mod.getDashed());
                     c.putOrClear("dashes-background-color", mod.dashedColor);
