Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 3881)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/LayerListDialog.java	(revision 3882)
@@ -868,5 +868,5 @@
             Layer layer = model.getLayer(index);
             LayerListPopup menu = new LayerListPopup(getModel().getSelectedLayers(), layer);
-            menu.show(LayerListDialog.this, p.x, p.y-3);
+            menu.show(layerList, p.x, p.y-3);
         }
     }
Index: /trunk/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java	(revision 3881)
+++ /trunk/src/org/openstreetmap/josm/gui/dialogs/MapPaintDialog.java	(revision 3882)
@@ -608,5 +608,5 @@
             }
             MapPaintPopup menu = new MapPaintPopup();
-            menu.show(MapPaintDialog.this, p.x, p.y);
+            menu.show(tblStyles, p.x, p.y);
         }
     }
Index: /trunk/src/org/openstreetmap/josm/gui/mappaint/Cascade.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/mappaint/Cascade.java	(revision 3881)
+++ /trunk/src/org/openstreetmap/josm/gui/mappaint/Cascade.java	(revision 3882)
@@ -139,4 +139,7 @@
             return a;
         }
+        Float f = toFloat(o);
+        if (f != null)
+            return new float[] { f };
         return null;
     }
Index: /trunk/src/org/openstreetmap/josm/gui/mappaint/MultiCascade.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/mappaint/MultiCascade.java	(revision 3881)
+++ /trunk/src/org/openstreetmap/josm/gui/mappaint/MultiCascade.java	(revision 3882)
@@ -17,11 +17,14 @@
     }
 
-    public Cascade getCascade(String key) {
-        if (key == null)
+    /**
+     * Return the cascade for the given layer key. If it does not exist,
+     * return a new cascade, but do not keep it.
+     */
+    public Cascade getCascade(String layer) {
+        if (layer == null)
             throw new IllegalArgumentException();
-        Cascade c = get(key);
+        Cascade c = get(layer);
         if (c == null) {
-            c = new Cascade(!key.equals("default"));
-            put(key, c);
+            c = new Cascade(!layer.equals("default"));
         }
         return c;
Index: /trunk/src/org/openstreetmap/josm/gui/mappaint/TextElement.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/mappaint/TextElement.java	(revision 3881)
+++ /trunk/src/org/openstreetmap/josm/gui/mappaint/TextElement.java	(revision 3882)
@@ -38,8 +38,22 @@
 
         Font font = ElemStyle.getFont(c);
-        int xOffset = c.get("text-offset-x", 0f, Float.class).intValue();
-        int yOffset = -c.get("text-offset-y", 0f, Float.class).intValue();
+
+        float xOffset = 0;
+        float yOffset = 0;
+        float[] offset = c.get("text-offset", null, float[].class);
+        if (offset != null) {
+            if (offset.length == 1) {
+                yOffset = offset[0];
+            } else if (offset.length >= 2) {
+                xOffset = offset[0];
+                yOffset = offset[1];
+            }
+        }
+        xOffset = c.get("text-offset-x", xOffset, Float.class);
+        yOffset = c.get("text-offset-y", yOffset, Float.class);
+        
         Color color = c.get("text-color", PaintColors.TEXT.get(), Color.class);
-        return new TextElement(textKey, font, xOffset, yOffset, color);
+        
+        return new TextElement(textKey, font, (int) xOffset, (int) yOffset, color);
     }
 
Index: /trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java	(revision 3881)
+++ /trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java	(revision 3882)
@@ -134,5 +134,5 @@
                     }
 
-                    if (sub.equals("*")) { // fixme: proper subparts handling
+                    if (sub.equals("*")) {
                         for (Entry<String, Cascade> entry : mc.entrySet()) {
                             env.layer = entry.getKey();
Index: /trunk/src/org/openstreetmap/josm/gui/mappaint/xml/XmlStyleSource.java
===================================================================
--- /trunk/src/org/openstreetmap/josm/gui/mappaint/xml/XmlStyleSource.java	(revision 3881)
+++ /trunk/src/org/openstreetmap/josm/gui/mappaint/xml/XmlStyleSource.java	(revision 3882)
@@ -278,5 +278,9 @@
     @Override
     public void apply(MultiCascade mc, OsmPrimitive osm, double scale, OsmPrimitive multipolyOuterWay, boolean pretendWayIsClosed) {
-        Cascade def = mc.getCascade("default");
+        Cascade def = mc.get("default");
+        if (def == null) {
+            def = new Cascade(false);
+            mc.put("default", def);
+        }
         boolean useMinMaxScale = Main.pref.getBoolean("mappaint.zoomLevelDisplay", false);
 
@@ -321,9 +325,19 @@
                     Cascade c;
                     if (mod.over) {
-                        c = mc.getCascade(String.format("over_%d", numOver));
+                        String layer = String.format("over_%d", numOver);
+                        c = mc.get(layer);
+                        if (c == null) {
+                            c = new Cascade(true);
+                            mc.put(layer, c);
+                        }
                         c.put("object-z-index", new Float(numOver));
                         ++numOver;
                     } else {
-                        c = mc.getCascade(String.format("under_%d", numUnder));
+                        String layer = String.format("under_%d", numUnder);
+                        c = mc.get(layer);
+                        if (c == null) {
+                            c = new Cascade(true);
+                            mc.put(layer, c);
+                        }
                         c.put("object-z-index", new Float(-numUnder));
                         ++numUnder;
