diff --git a/data/validator/numeric.mapcss b/data/validator/numeric.mapcss
index 5d3abbb..24b3978 100644
--- a/data/validator/numeric.mapcss
+++ b/data/validator/numeric.mapcss
@@ -2,6 +2,7 @@
 
 *[layer =~ /\+.*/] {
   throwWarning: tr("layer tag with + sign");
+  fixAdd: concat("layer=", substring(tag("layer"), 1));
   assertMatch: "node layer=+1";
   assertNoMatch: "node layer=1";
   assertNoMatch: "node layer=-1";
diff --git a/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java b/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java
index 853ae9e..488d779 100644
--- a/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java
+++ b/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java
@@ -28,7 +28,7 @@ import org.openstreetmap.josm.data.validation.Severity;
 import org.openstreetmap.josm.data.validation.Test;
 import org.openstreetmap.josm.data.validation.TestError;
 import org.openstreetmap.josm.gui.mappaint.Environment;
-import org.openstreetmap.josm.gui.mappaint.mapcss.ExpressionFactory;
+import org.openstreetmap.josm.gui.mappaint.mapcss.Expression;
 import org.openstreetmap.josm.gui.mappaint.mapcss.Instruction;
 import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSRule;
 import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSStyleSource;
@@ -56,7 +56,7 @@ public class MapCSSTagChecker extends Test {
 
     static class TagCheck implements Predicate<OsmPrimitive> {
         protected final List<Selector> selector;
-        protected final List<Tag> change = new ArrayList<Tag>();
+        protected final List<PrimitiveToTag> change = new ArrayList<PrimitiveToTag>();
         protected final Map<String, String> keyChange = new LinkedHashMap<String, String>();
         protected final List<Tag> alternatives = new ArrayList<Tag>();
         protected final Map<String, Severity> errors = new HashMap<String, Severity>();
@@ -66,24 +66,51 @@ public class MapCSSTagChecker extends Test {
             this.selector = selector;
         }
 
+        static abstract class PrimitiveToTag implements Utils.Function<OsmPrimitive, Tag> {
+
+            static PrimitiveToTag ofMapCSSObject(final Object obj, final boolean keyOnly) {
+                if (obj instanceof Expression) {
+                    return new PrimitiveToTag() {
+                        @Override
+                        public Tag apply(OsmPrimitive p) {
+                            final String s = (String) ((Expression) obj).evaluate(new Environment().withPrimitive(p));
+                            return keyOnly? new Tag(s) : Tag.ofString(s);
+                        }
+                    };
+                } else if (obj instanceof String) {
+                    final Tag tag = keyOnly ? new Tag((String) obj) : Tag.ofString((String) obj);
+                    return new PrimitiveToTag() {
+                        @Override
+                        public Tag apply(OsmPrimitive ignore) {
+                            return tag;
+                        }
+                    };
+                } else {
+                    return null;
+                }
+            }
+        }
+
         static TagCheck ofMapCSSRule(final MapCSSRule rule) {
             final TagCheck check = new TagCheck(rule.selectors);
             for (Instruction i : rule.declaration) {
                 if (i instanceof Instruction.AssignmentInstruction) {
                     final Instruction.AssignmentInstruction ai = (Instruction.AssignmentInstruction) i;
-                    final String val = ai.val instanceof ExpressionFactory.ArrayFunction
-                            ? (String) ((ExpressionFactory.ArrayFunction) ai.val).evaluate(new Environment())
+                    final String val = ai.val instanceof Expression
+                            ? (String) ((Expression) ai.val).evaluate(new Environment())
                             : ai.val instanceof String
                             ? (String) ai.val
                             : null;
                     if (ai.key.startsWith("throw")) {
                         final Severity severity = Severity.valueOf(ai.key.substring("throw".length()).toUpperCase());
                         check.errors.put(val, severity);
-                    } else if ("fixAdd".equals(ai.key) && val != null) {
-                        check.change.add(Tag.ofString(val));
-                    } else if ("fixRemove".equals(ai.key) && val != null) {
-                        CheckParameterUtil.ensureThat(!val.contains("="), "Unexpected '='. Please only specify the key to remove!");
-                        check.change.add(new Tag(val));
+                    } else if ("fixAdd".equals(ai.key)) {
+                        final PrimitiveToTag toTag = PrimitiveToTag.ofMapCSSObject(ai.val, false);
+                        check.change.add(toTag);
+                    } else if ("fixRemove".equals(ai.key)) {
+                        CheckParameterUtil.ensureThat(!(ai.val instanceof String) || !val.contains("="), "Unexpected '='. Please only specify the key to remove!");
+                        final PrimitiveToTag toTag = PrimitiveToTag.ofMapCSSObject(ai.val, true);
+                        check.change.add(toTag);
                     } else if ("fixChangeKey".equals(ai.key) && val != null) {
                         CheckParameterUtil.ensureThat(val.contains("=>"), "Separate old from new key by '=>'!");
                         final String[] x = val.split("=>", 2);
@@ -158,7 +185,8 @@ public class MapCSSTagChecker extends Test {
                 return null;
             }
             Collection<Command> cmds = new LinkedList<Command>();
-            for (Tag tag : change) {
+            for (PrimitiveToTag toTag : change) {
+                final Tag tag = toTag.apply(p);
                 cmds.add(new ChangePropertyCommand(p, tag.getKey(), tag.getValue()));
             }
             for (Map.Entry<String, String> i : keyChange.entrySet()) {
diff --git a/src/org/openstreetmap/josm/gui/mappaint/Cascade.java b/src/org/openstreetmap/josm/gui/mappaint/Cascade.java
index 0a9107a..26c2eb2 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/Cascade.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/Cascade.java
@@ -114,12 +114,8 @@ public final class Cascade implements Cloneable {
     }
 
     private static Float toFloat(Object o) {
-        if (o instanceof Float)
-            return (Float) o;
-        if (o instanceof Double)
-            return new Float((Double) o);
-        if (o instanceof Integer)
-            return new Float((Integer) o);
+        if (o instanceof Number)
+            return ((Number) o).floatValue();
         if (o instanceof String && !((String) o).isEmpty()) {
             try {
                 return Float.parseFloat((String) o);
diff --git a/src/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.java b/src/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.java
index a3fdb3f..a1a994c 100644
--- a/src/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.java
+++ b/src/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.java
@@ -364,6 +364,18 @@ public final class ExpressionFactory {
             System.arraycopy(args, 1, args, 0, args.length - 1);
             return org.openstreetmap.josm.tools.I18n.tr(text, args);
         }
+
+        public static String substring(String s, /* due to missing Cascade.convertTo for int*/ float begin) {
+            return s == null ? null : s.substring((int) begin);
+        }
+
+        public static String substring(String s, float begin, float end) {
+            return s == null ? null : s.substring((int) begin, (int) end);
+        }
+
+        public static int length(String s) {
+            return s == null ? 0 : s.length();
+        }
     }
 
     /**
diff --git a/test/unit/org/openstreetmap/josm/data/validation/tests/MapCSSTagCheckerTest.java b/test/unit/org/openstreetmap/josm/data/validation/tests/MapCSSTagCheckerTest.java
index 567bb0b..43eb475 100644
--- a/test/unit/org/openstreetmap/josm/data/validation/tests/MapCSSTagCheckerTest.java
+++ b/test/unit/org/openstreetmap/josm/data/validation/tests/MapCSSTagCheckerTest.java
@@ -42,9 +42,9 @@ public class MapCSSTagCheckerTest {
         assertThat(checks.size(), is(1));
         final MapCSSTagChecker.TagCheck check = checks.get(0);
         assertThat(check, notNullValue());
-        assertThat(check.change.get(0), is(new Tag("natural")));
-        assertThat(check.change.get(1), is(new Tag("natural", "wetland")));
-        assertThat(check.change.get(2), is(new Tag("wetland", "marsh")));
+        assertThat(check.change.get(0).apply(null), is(new Tag("natural")));
+        assertThat(check.change.get(1).apply(null), is(new Tag("natural", "wetland")));
+        assertThat(check.change.get(2).apply(null), is(new Tag("wetland", "marsh")));
         assertThat(check.errors.keySet().iterator().next(), is("natural=marsh is deprecated"));
         final Node n1 = new Node();
         n1.put("natural", "marsh");
