Index: src/uk/me/parabola/mkgmap/osmstyle/StyledConverter.java
===================================================================
--- src/uk/me/parabola/mkgmap/osmstyle/StyledConverter.java	(revision 3804)
+++ src/uk/me/parabola/mkgmap/osmstyle/StyledConverter.java	(working copy)
@@ -16,9 +16,7 @@
  */
 package uk.me.parabola.mkgmap.osmstyle;
 
-import it.unimi.dsi.fastutil.shorts.ShortArrayList;
 import java.util.ArrayList;
-
 import java.util.Arrays;
 import java.util.BitSet;
 import java.util.Collections;
@@ -29,8 +27,12 @@
 import java.util.LinkedHashMap;
 import java.util.List;
 import java.util.Map;
+import java.util.Map.Entry;
+import java.util.Set;
+import java.util.TreeSet;
 import java.util.logging.Level;
 
+import it.unimi.dsi.fastutil.shorts.ShortArrayList;
 import uk.me.parabola.imgfmt.ExitException;
 import uk.me.parabola.imgfmt.app.Area;
 import uk.me.parabola.imgfmt.app.Coord;
@@ -69,6 +71,7 @@
 import uk.me.parabola.mkgmap.reader.osm.Rule;
 import uk.me.parabola.mkgmap.reader.osm.Style;
 import uk.me.parabola.mkgmap.reader.osm.TagDict;
+import uk.me.parabola.mkgmap.reader.osm.Tags;
 import uk.me.parabola.mkgmap.reader.osm.TypeResult;
 import uk.me.parabola.mkgmap.reader.osm.Way;
 import uk.me.parabola.util.EnhancedProperties;
@@ -141,13 +144,14 @@
 
 	private final boolean checkRoundabouts;
 	private int reportDeadEnds; 
-	private final boolean linkPOIsToWays;
-	private final boolean mergeRoads;
-	private final boolean routable;
-	
-
-	private LineAdder lineAdder = new LineAdder() {
-		public void add(MapLine element) {
+	private final boolean linkPOIsToWays;
+	private final boolean mergeRoads;
+	private final boolean routable;
+	private final Tags styleOptionTags;
+	private final static String STYLE_OPTION_PREF = "mkgmap:option:";
+
+	private LineAdder lineAdder = new LineAdder() {
+		public void add(MapLine element) {
 			if (element instanceof MapRoad){
 				collector.addRoad((MapRoad) element);
 			}
@@ -208,15 +212,54 @@
 			lineAdder = overlayAdder;
 		linkPOIsToWays = props.getProperty("link-pois-to-ways", false);
 		
-		// undocumented option - usually used for debugging only
-		mergeRoads = props.getProperty("no-mergeroads", false) == false;
-		routable = props.containsKey("route");
-		
-	}
+		// undocumented option - usually used for debugging only
+		mergeRoads = props.getProperty("no-mergeroads", false) == false;
+		routable = props.containsKey("route");
+		String styleOption= props.getProperty("style-option",null);
+		styleOptionTags = parseStyleOption(styleOption);
+	}
 
-	/** One type result for ways to avoid recreating one for each way. */ 
-	private final WayTypeResult wayTypeResult = new WayTypeResult();
-	private class WayTypeResult implements TypeResult 
+	/**
+	 * Handle style option parameter. Create tags which are added to each element
+	 * before style processing starts. Cross-check usage of the options with the style.
+	 * @param styleOption the user option 
+	 * @return Tags instance created from the option.
+	 */
+	private Tags parseStyleOption(String styleOption) {
+		Tags styleTags = new Tags();
+		if (styleOption != null) {
+			// expected: --style-option=car;farms=more;admin5=10
+			String[] tags = styleOption.split(";");
+			for (String t : tags) {
+				String[] pair = t.split("=");
+				String optionKey = pair[0];
+				String tagKey = STYLE_OPTION_PREF + optionKey;
+				if (!style.getUsedTags().contains(tagKey)) {
+					System.err.println("Warning: Option style-options sets tag not used in style: '" 
+							+ optionKey + "' (gives " + tagKey + ")");
+				} else {
+					String val = (pair.length == 1) ? "true" : pair[1];
+					String old = styleTags.put(tagKey, val);
+					if (old != null)
+						log.error("duplicate tag key", optionKey, "in style option", styleOption);
+				}
+			}
+		}
+		// flag options used in style but not specified in --style-option
+		Set<String> unset = new TreeSet<>(style.getUsedTags());
+		unset.removeIf(s -> !s.startsWith(STYLE_OPTION_PREF));
+		unset.removeAll(styleTags.getTagsWithPrefix(STYLE_OPTION_PREF, false).keySet());
+		if (!unset.isEmpty()) {
+			for (String s : unset)
+				System.err.println("Warning: Option style-options doesn't specify '" 
+						+ s.replaceFirst(STYLE_OPTION_PREF, "") + "' (for " + s + ")");
+		}
+		return styleTags;
+	}	
+
+	/** One type result for ways to avoid recreating one for each way. */ 
+	private final WayTypeResult wayTypeResult = new WayTypeResult();
+	private class WayTypeResult implements TypeResult 
 	{
 		private Way way;
 		/** flag if the rule was fired */
@@ -444,18 +487,27 @@
 		if (nodeTypeResult.isMatched() == false) {
 			// no match found but we have to keep it for house number processing
 			housenumberGenerator.addNode(node);
-		}
-	}
-	
+		}
+	}
+	
 
-	private static final short nameTagKey = TagDict.getInstance().xlate("name");  
-	/**
-	 * Rules to run before converting the element.
-	 */
+	private static final short nameTagKey = TagDict.getInstance().xlate("name");  
+	/**
+	 * Rules to run before converting the element.
+	 */
 	private void preConvertRules(Element el) {
-		if (nameTagList == null)
-			return;
-
+		// add tags given with --style-option
+		if (styleOptionTags != null && styleOptionTags.size() > 0) {
+			Iterator<Entry<Short, String>> iter = styleOptionTags.entryShortIterator();
+			while (iter.hasNext()) {
+				Entry<Short, String> tag = iter.next();
+				el.addTag(tag.getKey(), tag.getValue());
+			}
+		}
+		
+		if (nameTagList == null)
+			return;
+
 		for (short tagKey : nameTagList) {
 			String val = el.getTag(tagKey);
 			if (val != null) {
@@ -718,14 +770,13 @@
 			// warn if user given flag is obviously wrong
 			if ("left".equals(driveOn) && numDriveOnLeftRoads == 0 && numDriveOnRightRoads > 0)
 				log.warn("The drive-on-left flag is set but tile contains only drive-on-right roads");
-			if ("right".equals(driveOn) && numDriveOnRightRoads == 0 && numDriveOnLeftRoads > 0)
-				log.warn("The drive-on-left flag is NOT set used but tile contains only drive-on-left roads");
-		}		
-		if (dol == null)
-			dol = false; // should not happen
-		return dol;
-	}
-
+			if ("right".equals(driveOn) && numDriveOnRightRoads == 0 && numDriveOnLeftRoads > 0)
+				log.warn("The drive-on-left flag is NOT set used but tile contains only drive-on-left roads");
+		}		
+		assert dol != null;
+		return dol;
+	}
+
 	/**
 	 * Try to make sure that closed ways start with a point that is 
 	 * also part of another road. This reduces the number of nodes
Index: doc/options.txt
===================================================================
--- doc/options.txt	(revision 3804)
+++ doc/options.txt	(working copy)
@@ -248,13 +248,25 @@
 <p>
 ;--style=name
 : 	Specify a style name. Must be used if --style-file points to a 
-directory or zip file containing multiple styles. If --style-file 
-is not used, it selects one of the built-in styles. 
+directory or zip file containing multiple styles. If --style-file 
+is not used, it selects one of the built-in styles. 
+<p>
+;--style-option
+: 	Provide a semicolon separated list of tags which can be used in the style.
+The intended use is to make a single style more flexible, e.g.
+you may want to use a slightly different set of rules for a map of
+a whole continent. The tags given will be prefixed with "mkgmap:option:".
+If no value is provided the default "true" is used.  
+This option allows to use rules like
+mkgmap:option:light=true & landuse=farmland {remove landuse}
+Example: -- style-option=light;routing=car
+will add the tags mkgmap:option:light=true and mkgmap:option:routing=car
+to each element before style processing happens. 
+<p>                                                            
+;--list-styles
+: 	List the available styles. If this option is preceded by a style-file
+option then it lists the styles available within that file.
 <p>
-;--list-styles
-: 	List the available styles. If this option is preceded by a style-file
-option then it lists the styles available within that file.
-<p>
 ;--check-styles
 : 	Perform some checks on the available styles. If this option is 
 preceded by a style-file option then it checks the styles 
@@ -268,13 +280,13 @@
 its own default. Up to 8 levels may be specified.
 <p>
 ;--name-tag-list
-: 	Get the tag that will be used to supply the name.  Useful for
-language variations.  You can supply a list and the first one
-will be used.  e.g. --name-tag-list=name:en,int_name,name
-<p>
-;--map-features=file
-: 	This option is ignored; use the --style-file option instead.
-<p>
+: 	Get the tag that will be used to supply the name.  Useful for
+language variations.  You can supply a list and the first one
+will be used.  e.g. --name-tag-list=name:en,int_name,name
+<p>                                                            
+;--map-features=file
+: 	This option is ignored; use the --style-file option instead.
+<p>
 ===Product description options===
 
 ;--family-id
Index: doc/styles/internal-tags.txt
===================================================================
--- doc/styles/internal-tags.txt	(revision 3804)
+++ doc/styles/internal-tags.txt	(working copy)
@@ -131,7 +131,8 @@
 | Tag | Description     
 | +mkgmap:skipSizeFilter+  | If set to +true+ the line or polygon will pass the size filter, no matter what size it has    
 | +mkgmap:highest-resolution-only+  | If set to +true+ the object will only be added for the highest resolution configured in the element type definition.
-| +mkgmap:execute_finalize_rules+  | If set to +true+ mkgmap will execute the finalize rules even if no object is created fot the element.
-| +mkgmap:numbers+  | If set to +false+ for a node or way mkgmap will ignore the object in the calculations for the --housenumber option   
-| +mkgmap:drawLevel+  | Set to a number from 1 to 100. Overrides the polygon area that is used by --order-by-decreasing-area. 1..50 are larger than typical polygons and be overwritten by them, 51..100 are smaller and will show. Higher drawLevels will show over lower values.
-|=========================================================
+| +mkgmap:execute_finalize_rules+  | If set to +true+ mkgmap will execute the finalize rules even if no object is created fot the element.
+| +mkgmap:numbers+  | If set to +false+ for a node or way mkgmap will ignore the object in the calculations for the --housenumber option   
+| +mkgmap:drawLevel+  | Set to a number from 1 to 100. Overrides the polygon area that is used by --order-by-decreasing-area. 1..50 are larger than typical polygons and be overwritten by them, 51..100 are smaller and will show. Higher drawLevels will show over lower values.
+| +mkgmap:option:<key>+  | Tag generated by the --style-option option. 
+|=========================================================
Index: resources/help/en/options
===================================================================
--- resources/help/en/options	(revision 3804)
+++ resources/help/en/options	(working copy)
@@ -246,13 +246,25 @@
 
 --style=name
 	Specify a style name. Must be used if --style-file points to a 
-	directory or zip file containing multiple styles. If --style-file 
-	is not used, it selects one of the built-in styles. 
+	directory or zip file containing multiple styles. If --style-file 
+	is not used, it selects one of the built-in styles. 
+
+--style-option
+	Provide a semicolon separated list of tags which can be used in the style.
+	The intended use is to make a single style more flexible, e.g.
+	you may want to use a slightly different set of rules for a map of
+	a whole continent. The tags given will be prefixed with "mkgmap:option:".
+	If no value is provided the default "true" is used.  
+	This option allows to use rules like
+	mkgmap:option:light=true & landuse=farmland {remove landuse}
+	Example: -- style-option=light;routing=car
+	will add the tags mkgmap:option:light=true and mkgmap:option:routing=car
+	to each element before style processing happens. 
+
+--list-styles
+	List the available styles. If this option is preceded by a style-file
+	option then it lists the styles available within that file.
 
---list-styles
-	List the available styles. If this option is preceded by a style-file
-	option then it lists the styles available within that file.
-
 --check-styles
 	Perform some checks on the available styles. If this option is 
 	preceded by a style-file option then it checks the styles 
