Index: trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java	(revision 15986)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagChecker.java	(revision 15987)
@@ -54,5 +54,5 @@
 import org.openstreetmap.josm.gui.mappaint.mapcss.MapCSSStyleSource.MapCSSRuleIndex;
 import org.openstreetmap.josm.gui.mappaint.mapcss.Selector;
-import org.openstreetmap.josm.gui.mappaint.mapcss.Selector.OptimizedGeneralSelector;
+import org.openstreetmap.josm.gui.mappaint.mapcss.Selector.GeneralSelector;
 import org.openstreetmap.josm.gui.mappaint.mapcss.parsergen.MapCSSParser;
 import org.openstreetmap.josm.gui.mappaint.mapcss.parsergen.ParseException;
@@ -453,5 +453,5 @@
         /**
          * Determines the {@code index}-th key/value/tag (depending on {@code type}) of the
-         * {@link org.openstreetmap.josm.gui.mappaint.mapcss.Selector.GeneralSelector}.
+         * {@link GeneralSelector}.
          * @param matchingSelector matching selector
          * @param index index
@@ -460,5 +460,5 @@
          * @return argument value, can be {@code null}
          */
-        static String determineArgument(OptimizedGeneralSelector matchingSelector, int index, String type, OsmPrimitive p) {
+        static String determineArgument(GeneralSelector matchingSelector, int index, String type, OsmPrimitive p) {
             try {
                 final Condition c = matchingSelector.getConditions().get(index);
@@ -492,5 +492,5 @@
             if (s != null && matchingSelector instanceof Selector.ChildOrParentSelector) {
                 return insertArguments(((Selector.ChildOrParentSelector) matchingSelector).right, s, p);
-            } else if (s == null || !(matchingSelector instanceof Selector.OptimizedGeneralSelector)) {
+            } else if (s == null || !(matchingSelector instanceof GeneralSelector)) {
                 return s;
             }
@@ -498,5 +498,5 @@
             final StringBuffer sb = new StringBuffer();
             while (m.find()) {
-                final String argument = determineArgument((Selector.OptimizedGeneralSelector) matchingSelector,
+                final String argument = determineArgument((GeneralSelector) matchingSelector,
                         Integer.parseInt(m.group(1)), m.group(2), p);
                 try {
Index: trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagCheckerIndex.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagCheckerIndex.java	(revision 15986)
+++ trunk/src/org/openstreetmap/josm/data/validation/tests/MapCSSTagCheckerIndex.java	(revision 15987)
@@ -89,5 +89,5 @@
                 }
 
-                MapCSSRule optRule = new MapCSSRule(s.optimizedBaseCheck(), c.rule.declaration);
+                MapCSSRule optRule = new MapCSSRule(s, c.rule.declaration);
 
                 ruleToCheckMap.put(optRule, c);
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java	(revision 15986)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/MapCSSStyleSource.java	(revision 15987)
@@ -461,7 +461,6 @@
             }
             // optimization: filter rules for different primitive types
-            for (MapCSSRule r: rules) {
-                MapCSSRule optRule = new MapCSSRule(r.selector.optimizedBaseCheck(), r.declaration);
-                final String base = r.selector.getBase();
+            for (MapCSSRule optRule: rules) {
+                final String base = optRule.selector.getBase();
                 switch (base) {
                     case Selector.BASE_NODE:
@@ -488,5 +487,5 @@
                         break;
                     case Selector.BASE_CANVAS:
-                        canvasRules.add(r);
+                        canvasRules.add(optRule);
                         break;
                     case Selector.BASE_META:
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java	(revision 15986)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java	(revision 15987)
@@ -113,18 +113,4 @@
 
     String getBase();
-
-    /**
-     * Create an "optimized" copy of this selector that omits the base check.
-     *
-     * For the style source, the list of rules is preprocessed, such that
-     * there is a separate list of rules for nodes, ways, ...
-     *
-     * This means that the base check does not have to be performed
-     * for each rule, but only once for each primitive.
-     *
-     * @return a selector that is identical to this object, except the base of the
-     * "rightmost" selector is not checked
-     */
-    Selector optimizedBaseCheck();
 
     /**
@@ -484,12 +470,12 @@
             if (e.osm.getDataSet() == null) {
                 // do nothing
-            } else if (left instanceof OptimizedGeneralSelector) {
-                if (withNodes && ((OptimizedGeneralSelector) left).matchesBase(OsmPrimitiveType.NODE)) {
+            } else if (left instanceof GeneralSelector) {
+                if (withNodes && ((GeneralSelector) left).matchesBase(OsmPrimitiveType.NODE)) {
                     finder.visit(e.osm.getDataSet().searchNodes(e.osm.getBBox()));
                 }
-                if (((OptimizedGeneralSelector) left).matchesBase(OsmPrimitiveType.WAY)) {
+                if (((GeneralSelector) left).matchesBase(OsmPrimitiveType.WAY)) {
                     finder.visit(e.osm.getDataSet().searchWays(e.osm.getBBox()));
                 }
-                if (((OptimizedGeneralSelector) left).matchesBase(OsmPrimitiveType.RELATION)) {
+                if (((GeneralSelector) left).matchesBase(OsmPrimitiveType.RELATION)) {
                     finder.visit(e.osm.getDataSet().searchRelations(e.osm.getBBox()));
                 }
@@ -621,9 +607,4 @@
 
         @Override
-        public Selector optimizedBaseCheck() {
-            return new ChildOrParentSelector(left, link, right.optimizedBaseCheck(), type);
-        }
-
-        @Override
         public String toString() {
             return left.toString() + ' ' + (ChildOrParentSelectorType.PARENT == type ? '<' : '>') + link + ' ' + right;
@@ -701,9 +682,4 @@
 
         @Override
-        public Selector optimizedBaseCheck() {
-            throw new UnsupportedOperationException();
-        }
-
-        @Override
         public String toString() {
             return "LinkSelector{conditions=" + conds + '}';
@@ -714,35 +690,11 @@
      * General selector. See <a href="https://josm.openstreetmap.de/wiki/Help/Styles/MapCSSImplementation#Selectors">wiki</a>
      */
-    class GeneralSelector extends OptimizedGeneralSelector {
-
-        public GeneralSelector(String base, Range zoom, List<Condition> conds, Subpart subpart) {
-            super(base, zoom, conds, subpart);
-        }
-
-        public boolean matchesConditions(Environment e) {
-            return super.matches(e);
-        }
-
-        @Override
-        public Selector optimizedBaseCheck() {
-            return new OptimizedGeneralSelector(this);
-        }
-
-        @Override
-        public boolean matches(Environment e) {
-            return matchesBase(e) && super.matches(e);
-        }
-    }
-
-    /**
-     * Superclass of {@link GeneralSelector}. Used to create an "optimized" copy of this selector that omits the base check.
-     * @see Selector#optimizedBaseCheck
-     */
-    class OptimizedGeneralSelector extends AbstractSelector {
+    class GeneralSelector extends AbstractSelector {
+
         public final String base;
         public final Range range;
         public final Subpart subpart;
 
-        public OptimizedGeneralSelector(String base, Range range, List<Condition> conds, Subpart subpart) {
+        public GeneralSelector(String base, Range range, List<Condition> conds, Subpart subpart) {
             super(conds);
             this.base = checkBase(base);
@@ -751,8 +703,4 @@
         }
 
-        public OptimizedGeneralSelector(GeneralSelector s) {
-            this(s.base, s.range, s.conds, s.subpart);
-        }
-
         @Override
         public Subpart getSubpart() {
@@ -763,4 +711,13 @@
         public Range getRange() {
             return range;
+        }
+
+        public boolean matchesConditions(Environment e) {
+            return super.matches(e);
+        }
+
+        @Override
+        public boolean matches(Environment e) {
+            return matchesBase(e) && super.matches(e);
         }
 
@@ -824,9 +781,4 @@
         }
 
-        @Override
-        public Selector optimizedBaseCheck() {
-            throw new UnsupportedOperationException();
-        }
-
         public static Range fromLevel(int a, int b) {
             // for input validation in Range constructor below
Index: trunk/test/performance/org/openstreetmap/josm/gui/mappaint/MapRendererPerformanceTest.java
===================================================================
--- trunk/test/performance/org/openstreetmap/josm/gui/mappaint/MapRendererPerformanceTest.java	(revision 15986)
+++ trunk/test/performance/org/openstreetmap/josm/gui/mappaint/MapRendererPerformanceTest.java	(revision 15987)
@@ -198,5 +198,5 @@
             nc.zoomTo(ProjectionRegistry.getProjection().latlon2eastNorth(center), scale);
             if (checkScale) {
-                int lvl = Selector.OptimizedGeneralSelector.scale2level(nc.getDist100Pixel());
+                int lvl = Selector.GeneralSelector.scale2level(nc.getDist100Pixel());
                 Assert.assertEquals(17, lvl);
             }
