Index: trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java	(revision 8809)
+++ trunk/src/org/openstreetmap/josm/actions/search/SearchAction.java	(revision 8811)
@@ -286,5 +286,9 @@
                 if (buttonIndex == 0) {
                     try {
-                        SearchCompiler.compile(hcbSearchString.getText(), caseSensitive.isSelected(), regexSearch.isSelected());
+                        SearchSetting ss = new SearchSetting();
+                        ss.text = hcbSearchString.getText();
+                        ss.caseSensitive = caseSensitive.isSelected();
+                        ss.regexSearch = regexSearch.isSelected();
+                        SearchCompiler.compile(ss);
                         super.buttonAction(buttonIndex, evt);
                     } catch (ParseError e) {
@@ -454,6 +458,5 @@
         int foundMatches = 0;
         try {
-            String searchText = s.text;
-            SearchCompiler.Match matcher = SearchCompiler.compile(searchText, s.caseSensitive, s.regexSearch);
+            SearchCompiler.Match matcher = SearchCompiler.compile(s);
 
             if (s.mode == SearchMode.replace) {
@@ -508,9 +511,9 @@
     public static void getSelection(SearchSetting s, Collection<OsmPrimitive> all, Property<OsmPrimitive, Boolean> p) {
         try {
-            String searchText = s.text;
             if (s instanceof Filter && ((Filter) s).inverted) {
-                searchText = String.format("-(%s)", searchText);
-            }
-            SearchCompiler.Match matcher = SearchCompiler.compile(searchText, s.caseSensitive, s.regexSearch);
+                s = new SearchSetting(s);
+                s.text = String.format("-(%s)", s.text);
+            }
+            SearchCompiler.Match matcher = SearchCompiler.compile(s);
 
             for (OsmPrimitive osm : all) {
@@ -540,5 +543,8 @@
 
     public static void search(String search, SearchMode mode) {
-        search(new SearchSetting(search, mode, false, false, false));
+        final SearchSetting searchSetting = new SearchSetting();
+        searchSetting.text = search;
+        searchSetting.mode = mode;
+        search(searchSetting);
     }
 
@@ -579,6 +585,6 @@
 
     public static class SearchSetting {
-        public String text;
-        public SearchMode mode;
+        public String text = "";
+        public SearchMode mode = SearchMode.replace;
         public boolean caseSensitive;
         public boolean regexSearch;
@@ -589,20 +595,12 @@
          */
         public SearchSetting() {
-            this("", SearchMode.replace, false /* case insensitive */,
-                    false /* no regexp */, false /* only useful primitives */);
-        }
-
-        public SearchSetting(String text, SearchMode mode, boolean caseSensitive,
-                boolean regexSearch, boolean allElements) {
-            this.caseSensitive = caseSensitive;
-            this.regexSearch = regexSearch;
-            this.allElements = allElements;
-            this.mode = mode;
-            this.text = text;
         }
 
         public SearchSetting(SearchSetting original) {
-            this(original.text, original.mode, original.caseSensitive,
-                    original.regexSearch, original.allElements);
+            text = original.text;
+            mode = original.mode;
+            caseSensitive = original.caseSensitive;
+            regexSearch = original.regexSearch;
+            allElements = original.allElements;
         }
 
@@ -612,9 +610,9 @@
                     /*case sensitive*/  trc("search", "CS") :
                         /*case insensitive*/  trc("search", "CI");
-                    String rx = regexSearch ? ", " +
+            String rx = regexSearch ? ", " +
                             /*regex search*/ trc("search", "RX") : "";
-                    String all = allElements ? ", " +
+            String all = allElements ? ", " +
                             /*all elements*/ trc("search", "A") : "";
-                    return "\"" + text + "\" (" + cs + rx + all + ", " + mode + ")";
+            return "\"" + text + "\" (" + cs + rx + all + ", " + mode + ")";
         }
 
Index: trunk/src/org/openstreetmap/josm/actions/search/SearchCompiler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/actions/search/SearchCompiler.java	(revision 8809)
+++ trunk/src/org/openstreetmap/josm/actions/search/SearchCompiler.java	(revision 8811)
@@ -1402,9 +1402,30 @@
     }
 
-    public static Match compile(String searchStr, boolean caseSensitive, boolean regexSearch) throws ParseError {
-        return new SearchCompiler(caseSensitive, regexSearch,
+    /**
+     * Compiles the search expression.
+     * @param searchStr the search expression
+     * @return a {@link Match} object for the expression
+     * @throws ParseError if an error has been encountered while compiling
+     * @see #compile(org.openstreetmap.josm.actions.search.SearchAction.SearchSetting)
+     */
+    public static Match compile(String searchStr) throws ParseError {
+        return new SearchCompiler(false, false,
                 new PushbackTokenizer(
                         new PushbackReader(new StringReader(searchStr))))
-        .parse();
+                .parse();
+    }
+
+    /**
+     * Compiles the search expression.
+     * @param setting the settings to use
+     * @return a {@link Match} object for the expression
+     * @throws ParseError if an error has been encountered while compiling
+     * @see #compile(String)
+     */
+    public static Match compile(SearchAction.SearchSetting setting) throws ParseError {
+        return new SearchCompiler(setting.caseSensitive, setting.regexSearch,
+                new PushbackTokenizer(
+                        new PushbackReader(new StringReader(setting.text))))
+                .parse();
     }
 
Index: trunk/src/org/openstreetmap/josm/data/osm/Filter.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/Filter.java	(revision 8809)
+++ trunk/src/org/openstreetmap/josm/data/osm/Filter.java	(revision 8811)
@@ -22,14 +22,11 @@
      */
     public Filter() {
-        super("", SearchMode.add, false, false, false);
-    }
-
-    public Filter(String text, SearchMode mode, boolean caseSensitive,
-            boolean regexSearch, boolean allElements) {
-        super(text, mode, caseSensitive, regexSearch, allElements);
+        super();
+        mode = SearchMode.add;
     }
 
     public Filter(FilterPreferenceEntry e) {
-        super(e.text, SearchMode.add, false, false, false);
+        this();
+        text = e.text;
         if ("replace".equals(e.mode)) {
             mode = SearchMode.replace;
Index: trunk/src/org/openstreetmap/josm/data/osm/FilterMatcher.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/FilterMatcher.java	(revision 8809)
+++ trunk/src/org/openstreetmap/josm/data/osm/FilterMatcher.java	(revision 8811)
@@ -84,5 +84,5 @@
             }
 
-            Match compiled = SearchCompiler.compile(filter.text, filter.caseSensitive, filter.regexSearch);
+            Match compiled = SearchCompiler.compile(filter);
             this.match = filter.inverted ? new Not(compiled) : compiled;
             this.isInverted = filter.inverted;
Index: trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java
===================================================================
--- trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 8809)
+++ trunk/src/org/openstreetmap/josm/data/osm/OsmPrimitive.java	(revision 8811)
@@ -795,10 +795,10 @@
 
         try {
-            reversedDirectionKeys = SearchCompiler.compile(Main.pref.get("tags.reversed_direction", reversedDirectionDefault), false, false);
+            reversedDirectionKeys = SearchCompiler.compile(Main.pref.get("tags.reversed_direction", reversedDirectionDefault));
         } catch (ParseError e) {
             Main.error("Unable to compile pattern for tags.reversed_direction, trying default pattern: " + e.getMessage());
 
             try {
-                reversedDirectionKeys = SearchCompiler.compile(reversedDirectionDefault, false, false);
+                reversedDirectionKeys = SearchCompiler.compile(reversedDirectionDefault);
             } catch (ParseError e2) {
                 throw new AssertionError("Unable to compile default pattern for direction keys: " + e2.getMessage(), e2);
@@ -806,10 +806,10 @@
         }
         try {
-            directionKeys = SearchCompiler.compile(Main.pref.get("tags.direction", directionDefault), false, false);
+            directionKeys = SearchCompiler.compile(Main.pref.get("tags.direction", directionDefault));
         } catch (ParseError e) {
             Main.error("Unable to compile pattern for tags.direction, trying default pattern: " + e.getMessage());
 
             try {
-                directionKeys = SearchCompiler.compile(directionDefault, false, false);
+                directionKeys = SearchCompiler.compile(directionDefault);
             } catch (ParseError e2) {
                 throw new AssertionError("Unable to compile default pattern for direction keys: " + e2.getMessage(), e2);
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 8809)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/RelationListDialog.java	(revision 8811)
@@ -289,5 +289,5 @@
                     f.setBackground(UIManager.getColor("TextField.background"));
                     f.setToolTipText(tr("Relation list filter"));
-                    model.setFilter(SearchCompiler.compile(filter.getText(), false, false));
+                    model.setFilter(SearchCompiler.compile(filter.getText()));
                 } catch (SearchCompiler.ParseError ex) {
                     f.setBackground(new Color(255, 224, 224));
Index: trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 8809)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/properties/PropertiesDialog.java	(revision 8811)
@@ -1323,5 +1323,7 @@
             }
 
-            SearchSetting ss = new SearchSetting(s.toString(), SearchMode.replace, true, false, false);
+            final SearchSetting ss = new SearchSetting();
+            ss.text = s.toString();
+            ss.caseSensitive = true;
             org.openstreetmap.josm.actions.search.SearchAction.searchWithoutHistory(ss);
         }
Index: trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.java	(revision 8809)
+++ trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/ExpressionFactory.java	(revision 8811)
@@ -664,5 +664,5 @@
             Match m;
             try {
-                m = SearchCompiler.compile(searchStr, false, false);
+                m = SearchCompiler.compile(searchStr);
             } catch (ParseError ex) {
                 return null;
Index: trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java	(revision 8809)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPreset.java	(revision 8811)
@@ -202,5 +202,5 @@
     public void setName_template_filter(String filter) throws SAXException {
         try {
-            this.nameTemplateFilter = SearchCompiler.compile(filter, false, false);
+            this.nameTemplateFilter = SearchCompiler.compile(filter);
         } catch (org.openstreetmap.josm.actions.search.SearchCompiler.ParseError e) {
             Main.error("Error while parsing" + filter + ": " + e.getMessage());
Index: trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java	(revision 8809)
+++ trunk/src/org/openstreetmap/josm/gui/tagging/TaggingPresetItems.java	(revision 8811)
@@ -52,4 +52,5 @@
 
 import org.openstreetmap.josm.Main;
+import org.openstreetmap.josm.actions.search.SearchAction;
 import org.openstreetmap.josm.actions.search.SearchCompiler;
 import org.openstreetmap.josm.data.osm.OsmPrimitive;
@@ -204,5 +205,9 @@
         public void setMember_expression(String member_expression) throws SAXException {
             try {
-                this.memberExpression = SearchCompiler.compile(member_expression, true, true);
+                final SearchAction.SearchSetting searchSetting = new SearchAction.SearchSetting();
+                searchSetting.text = member_expression;
+                searchSetting.caseSensitive = true;
+                searchSetting.regexSearch = true;
+                this.memberExpression = SearchCompiler.compile(searchSetting);
             } catch (SearchCompiler.ParseError ex) {
                 throw new SAXException(tr("Illegal member expression: {0}", ex.getMessage()), ex);
Index: trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java
===================================================================
--- trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java	(revision 8809)
+++ trunk/src/org/openstreetmap/josm/io/remotecontrol/handler/LoadAndZoomHandler.java	(revision 8811)
@@ -196,5 +196,5 @@
         } else if (args.containsKey("search") && PermissionPrefWithDefault.CHANGE_SELECTION.isAllowed()) {
             try {
-                final SearchCompiler.Match search = SearchCompiler.compile(args.get("search"), false, false);
+                final SearchCompiler.Match search = SearchCompiler.compile(args.get("search"));
                 Main.worker.submit(new Runnable() {
                     @Override
Index: trunk/src/org/openstreetmap/josm/tools/template_engine/TemplateParser.java
===================================================================
--- trunk/src/org/openstreetmap/josm/tools/template_engine/TemplateParser.java	(revision 8809)
+++ trunk/src/org/openstreetmap/josm/tools/template_engine/TemplateParser.java	(revision 8811)
@@ -90,5 +90,5 @@
                 try {
                     result.getEntries().add(new SearchExpressionCondition(
-                            SearchCompiler.compile(searchExpression.getText(), false, false), condition));
+                            SearchCompiler.compile(searchExpression.getText()), condition));
                 } catch (org.openstreetmap.josm.actions.search.SearchCompiler.ParseError e) {
                     throw new ParseError(searchExpression.getPosition(), e);
@@ -119,5 +119,5 @@
         else {
             try {
-                Match match = SearchCompiler.compile(searchExpression.getText(), false, false);
+                Match match = SearchCompiler.compile(searchExpression.getText());
                 result = new ContextSwitchTemplate(match, template, searchExpression.getPosition());
             } catch (org.openstreetmap.josm.actions.search.SearchCompiler.ParseError e) {
